Python 데이터 분석

Python 데이터분석 기초 31 - 가설검정 - 이원카이제곱, 교차분할표 이용(stats.chi2_contingency()) 예제

코딩탕탕 2022. 11. 4. 17:36

 

# 이원카이제곱 - 교차분할표 이용
# : 두 개 이상의 변인(집단 또는 범주)을 대상으로 검정을 수행한다.
# 분석대상의 집단 수에 의해서 독립성 검정과 동질성 검정으로 나뉜다.
# 독립성(관련성) 검정
# - 동일 집단의 두 변인(학력수준과 대학진학 여부)을 대상으로 관련성이 있는가 없는가?
# - 독립성 검정은 두 변수 사이의 연관성을 검정한다.

# 실습 : 교육수준과 흡연율 간의 관련성 분석 : smoke.csv
# 귀무 : 교육수준과 흡연율 간의 관련성이 없다. 서로 독립이다.
# 대립 : 교육수준과 흡연율 간의 관련성이 있다. 서로 독립이 아니다.

import pandas as pd
import scipy.stats as stats

data = pd.read_csv('../testdata/smoke.csv')
print(data.head(2))
print(data['education'].unique())  # education의 값이 뭐가 있는지 호출
print(data['smoking'].unique())    # smoking의 값이 뭐가 있는지 호출

# 교차표
ctab = pd.crosstab(index = data['education'], columns = data['smoking'])
ctab.index = ['대학원졸', '대졸', '고졸']
ctab.columns = ['과흡연', '보통', '노담']

print(ctab)

chi_result = [ctab.loc['대학원졸'], ctab.loc['대졸'], ctab.loc['고졸']]
# chi2, p, ddof, _ = stats.chi2_contingency(chi_result)

chi2, p, ddof, _ = stats.chi2_contingency(ctab)  # 교차표의 결과를 직접 적용해도 된다.
print('chi2:{}, p:{}, ddof:{}'.format(chi2, p, ddof))
# chi2:18.910915, p:0.0008182, ddof:4
# 해석 : p:0.0008182 <0.05 이므로 귀무가설 기각
# 교육수준과 흡연율 간의 관련성이 있다. 서로 독립이 아니다. 이런 결과에 상응하는 어떤 조치를 보고서에 담아주면 된다.

# 야트보정
# 분할표의 자유도가 1인 경우는 x^2 값이 약간 높게 계산된다.
# 그래서 절대값 |O-E|에서 0.5를 뺀 다음 제곱하며, 이 방법을 야트보정이라고 한다. 검정도구는 이를 자동으로 해 준다.


<console>
   education  smoking
0          1        1
1          1        1
[1 2 3]
[1 2 3]
      과흡연  보통  노담
대학원졸   51  92  68
대졸     22  21   9
고졸     43  28  21
chi2:18.910915739853955, p:0.0008182572832162924, ddof:4

가설검정을 할 경우에는 p-value가 0.05보다 작으면 귀무가설 기각, 대립가설 채택이다.

전에 배웠던 데이터의 신뢰도를 확인하기 위한 p-value와는 다르게 생각해야 된다.

 

 

야트보정

분할표의 자유도가 1인 경우는 x^2 값이 약간 높게 계산된다.
그래서 절대값 |O-E|에서 0.5를 뺀 다음 제곱하며, 이 방법을 야트보정이라고 한다. 검정도구는 이를 자동으로 해 준다.