[TIL] 21.05.15 groupby, reindex, 카이제곱 검정

Seung Joo·2021년 5월 15일
0

TIL

목록 보기
6/31
post-thumbnail

1. group by()의 활용

index60이하60~8585초과
0서울000
1서울5420
2부산000
3부산577735142
4대구000
5대구143143744
6대전000
7대전78210

위의 데이터 프레임 group by() 활용해서 '시' 컬럼을 기준으로 합친 데이터 프레임을 만들어보자. 나머지 컬럼의 값은 합산으로 적용

df_cp = df.copy()
# loc함수 사용으로 [인덱스열은 전부, 60이하 ~ 85 초과]의 위치에서 
# '시' 컬럼을 기준으로 그룹
grouped = df.loc[:, '60이하' : '85초과'].groupby(df['시'])
# 그룹 지어진 데이터 에서 '시' 기준 [60이하 ~ 85 초과] 합산
df_grouped = grouped.sum()
df_grouped.head()

out :

60이하60~8585초과
대구143143744
대전78210
부산577735142
서울5420

시가 인덱스 컬럼으로 자리잡고 있는 다음과 같은 형태로 출력할 수 있다.
[참고]https://rfriend.tistory.com/383

2. 인덱스를 원하는 순서대로 변경 reindex()

60이하60~8585초과
대구143143744
대전78210
부산577735142
서울5420

다음과 같은 데이터를 나는 서울 -> 대전 -> 대구 -> 부산 순서로 바꾸려고 한다.

# 바꾸고 싶은 순서대로 row list 작성
row = ['서울', '대전', '대구', '부산']
# row list의 순서대로 인덱스 순서 변경
df.reindex(index=row)
df.head()

out :

60이하60~8585초과
서울5420
대전78210
대구143143744
부산577735142

위와 같은 형태로 인덱스가 내가 정한 순서대로 변경된 것을 볼 수 있다.
그 이외의 방법
[참고]https://k-glory.tistory.com/21

3. chi-square test

# 지역별 미분양수 추출
# 샘플 뽑을 리스트 만들기
sample = []
for i in range(len(df)): 		# 데이터 길이만큼 반복
    sample.append(df.iloc[i].sum())	# 컬럼 구별없이 합산한 데이터 가져오기
sample
#
# out
# [56, 783, 1624, 1454]

일원 카이제곱 검정 실시

from scipy import stats
import numpy as np
# sample의 관측값을 numpy array로 만들어주기
obs = np.array(sample)
# sample의 기댓값 = 모든 샘플의 합 / 샘플의 갯수 -> 즉 평균값
exp = obs.mean()
# sample의 chi-square test
stats.chisquare(obs, exp)
#
# out
# Power_divergenceResult(statistic=x.xxxxxxxx..., pvalue=0.xxxxxxxx..)

카이제곱 검정 numpy로 식 구현

# chi-square 값 계산
chi = 0
for x in obs:
    chi += (x - exp)**2 / exp # 카이제곱 식
# chi-square의 Pvalue 값
1 - stats.chi2.cdf(chi, len(obs - 1))

이원 카이제곱

# 다음의 함수는 샘플에 대해 카이제곱을 실시하고
# 카이제곱값, P값, 자유도, 기대값을 리턴해준다.
chi, pvalue, df, exp = stats.chi2_contingency(sample)
profile
조금씩 천천히

0개의 댓글