본문 바로가기
Dev/데이터 분석

[통계] 카이제곱 검정(두 변수간 관계파악)

by bodi 2023. 5. 1.

지난 포스팅에서는 연속형 변수를 대상으로 독립표본 t-test를 진행해보았습니다.

 

[통계] 독립표본 t검정(t-test)

독립표본 t 검정 : 서로 독립인 두 모집단의 모평균이 동일한지의 여부를 검정하기 위한 검정통계량 각 모집단으로부터 추출된 독립표본을 이용할 수 있습니다. 가설의 채택 및 기각은 P-value를

bodi.tistory.com

 

만약 범주형 변수인 경우 어떤식으로 관계를 확인할 수 있을까요? 
범주형 자료를 분석하기 위한 방법으로는 카이제곱 검정이 있습니다. 카이제곱 검정은 샘플에서 관찰된 빈도가 예상한 빈도와 크게 다른지 여부를 확인합니다.

 

출처

 

카이제곱 검정이란?

: 두 범주형 변수사이에 어떠한 관계가 있는지 검정하는 방법 (교차분석 후 집단간 차이가 유의한지 검증)

출처

 

귀무가설 : 두 범주형 변수는 서로 독립이다 (= 두 범주형 변수는 관계가 없다)
대립가설 : 두 범주형 변수는 서로 독립이 아니다 (= 두 범주형 변수는 관계가 있다)

카이제곱 검정을 하기 위해서는 두 범주형 변수끼리 이원분할표를 만들어준 뒤 기대빈도를 계산해야 합니다. 이원분할표는 pandas에서 crosstab()으로 구현할 수 있습니다. 

 

카이제곱 검정(chi-squared test) 또는 χ2 검정 카이제곱 분포에 기초한 통계적 방법으로, 관찰된 빈도가 기대되는 빈도와 의미있게 다른지의 여부를 검정하기 위해 사용되는 검정방법이다. 자료가 빈도로 주어졌을 때, 특히 명목척도 자료의 분석에 이용된다.
>> 카이제곱 값은 χ2 = Σ (관측값 - 기댓값)2 / 기댓값으로 계산한다.

(위키피디아 글 인용)

 

범주형 변수간의 관계 확인

seaborn 모듈에 penguins 데이터셋을 불러와서 각 펭귄의 종(species)과 섬(island) 변수의 관계를 확인해보겠습니다.

 

0) 가설 설정

귀무가설 : 펭귄의 종(species)과 섬(island) 두 변수는 관계가 없다.

대립가설 : 펭귄의 종(species)과 섬(island) 두 변수는 관계가 있다.

 

1) 모듈 및 데이터 import 

import seaborn as sns
import pandas as pd
from scipy.stats import chi2_contingency

df = sns.load_dataset('penguins')
df.head()

 

2) 컬럼 정보 확인

우리가 확인할 컬럼의 타입과 Null값이 있는지 먼저 확인해줍니다. 우리가 확인하고자 하는 펭귄의 종(species)과 섬(island)은 Null값이 없는것을 확인할 수 있습니다. 

df.info()

 

3) 이원분할표 생성 - crosstab() 사용

padas를 사용하여 crosstab() 함수에 행으로 표현할 변수, 열로 표현할 변수 순서대로 입력해줍니다. 

cross_df = pd.crosstab(df['species'], df['island'])
cross_df

 

3) 카이제곱 검정 진행

chi2_contingency() 함수에 이원분할표를 대입하여 카이제곱검정을 실시하면 아래의 순서대로 4가지의 값이 나타나는 것을 확인할 수 있습니다. 
1) 카이제곱 검정통계량(chi2)
2) p-value
3) 자유도(dof)
4) 기대도수(expected)

chi2, pvalue, dof, expected = chi2_contingency(cross_df)
print(f"chi2 검정통계량 : {chi2} , p-value : {pvalue}, dof : {dof}")

 

p-value가 0.05보다 작은 값으로 펭귄의 종(species)과 섬(island) 두 변수는 관계가 있다는 것을 알 수 있습니다.

 

기대도수(expected)는 무엇인가요?

기대도수는 두 변수가 독립일때 기대되는 빈도를 의미합니다. 
(기대빈도의 크기: 각 범주에 포함할 수 있도록 기대되는 빈도를 기대빈도라고 하는데, 이 기대빈도가 5 이상이어야 한다. 5보다 적으면 사례 수를 증가시켜야 한다. - 위키피디아 인용 )
위에서 다룬 데이터로 기대빈도를 확인해보면, 아래와 같습니다.

exp = pd.DataFrame(expected)
exp.index = cross_df.index
exp.columns = cross_df.columns
exp

 

 


 

 

 

여기까지 카이제곱검정에 대해서 알아봤습니다.

두 범주형 변수사이에 어떠한 관계가 있는지 확인하는 카이제곱검정 조금 감이 잡히시나요?
조금 더 알차고 자세한 컨텐츠로 돌아올게요! 읽어주셔서 감사합니다 😄

(잘못된 개념이나 피드백은 언제든 환영입니다)