통계
[3-4]카이제곱 검정
codingmemory
2022. 2. 7. 21:59

[ ]:
#카이 제곱 검정은, 관찰된 빈도가 기대되는 빈도와 유의미하게 다른지를 검증하는 통계 검정 방법이다.
#주로 범주형 자료로 구성된 데이터 분석에 이용된다.
#핵심은 두 범주형 변수가 서로 상관이 있는 지 혹은 독립 관계인지 이다
In [3]:
import pandas as pd
import numpy as np
from scipy import stats
In [4]:
df= pd.read_csv('./data/ch11_ad.csv')
n=len(df)
print(n)
df.head()
1000
Out[4]:
광고 | 구입 | |
---|---|---|
0 | B | 하지 않았다 |
1 | B | 하지 않았다 |
2 | A | 했다 |
3 | A | 했다 |
4 | B | 하지 않았다 |
In [5]:
# 각각의 광고를 통해 어느 정도의 상품을 구매했는지 알 수 없음으로 교차집계표(분할표)를 작성
# 도수분포표의 2변수 버전과 같은 것
df_cross=pd.crosstab(df['광고'],df['구입'])
df_cross
Out[5]:
구입 | 하지 않았다 | 했다 |
---|---|---|
광고 | ||
A | 351 | 49 |
B | 549 | 51 |
In [7]:
# 광고 A와 광고 B 각각을 통해 상품을 구입한 비율 구하기- A광고를 보고 산 확률이 더 높음
df_cross['했다']/(df_cross['했다']+df_cross['하지 않았다'])
Out[7]:
광고
A 0.1225
B 0.0850
dtype: float64
In [8]:
n_not,n_yes=df_cross.sum()
n_not,n_yes
Out[8]:
(900, 100)
In [10]:
n_adA,n_adB =df_cross.sum(axis=1)
n_adA,n_adB
Out[10]:
(400, 600)
In [9]:
#광고를 보고 산 비율은 10%
# 그래서 A를 본 사람은 400명 ,B를 본 사람은 600명이란 사실 유추 가능
# 예를 들어 광고 A를 보고 상품을 구입할 경우 40명이 구입할 것이라 기대가능 => 기대도수
# 실제로 관측되는 값을 => 관측도수
In [11]:
ad =pd.DataFrame({'했다':[n_adA*n_yes/n,
n_adB*n_yes/n],
'하지 않았다':[n_adA*n_not/n,
n_adB*n_not/n]},
index=['A','B'])
ad
Out[11]:
했다 | 하지 않았다 | |
---|---|---|
A | 40.0 | 360.0 |
B | 60.0 | 540.0 |
In [12]:
y = ((df_cross-ad)**2/ad).sum().sum()
y
Out[12]:
3.75
In [14]:
# y는 자유도 1인 카이제곱분포를 근사적으로 따른다는 전제에 p값 구하기
rv=stats.chi2(1)
1-rv.cdf(y)
#귀무가설 채택
Out[14]:
0.052807511416113395
In [15]:
chi2,p,dof,ef =stats.chi2_contingency(df_cross,correction=False)
chi2,p,dof #검정통계량,p값, 자유도
Out[15]:
(3.75, 0.052807511416113395, 1)
In [17]:
ef #기대도수
Out[17]:
array([[360., 40.],
[540., 60.]])
반응형