카이제곱검정이란 카이제곱 분포에 기초한 통계적 방법으로 관찰된 빈도(obs)가 기대되는 빈도(exp)와 의미있게 다른지의 여부를 검증하기 위해 사용되는 검증방법이다. 카이제곱검정의 목적은 데이터의 비율, 분포, 빈도 등을 검정하는 것이다.
주어진 데이터가 예상되는 특정 분포와 동일한 분포를 나타내는지에 대한 가설검정이라고 할 수 있다.
교차분석이라고도 불리는 카이제곱검정은 적합도(goodness of fit)라고도 한다.
우리가 가진 변수가 명목척도(nominal)일 때 카이제곱 검정을 실시한다.
또한 데이터의 값은 개수여야 한다.
검정통계량이 카이제곱분포를 따른다면 카이제곱분포를 사용해서 가설검정을 할 수 있다.
귀무가설이 참이라는 가정 하에서 검정통계량이 카이제곱분포를 따를 때 검정통계치가 카이제곱분포 하에서 일어나기 어려운 일이면 귀무가설을 기각하고, 충분히 일어날 수 있는 일이면 귀무가설을 기각하지 않는다. 귀무가설을 기각할지 하지 않을 지 판단하는 기준은 유의수준과 p-값이다. 이전에 살펴봤던 t-test처럼 p-값이 유의수준보다 크면 귀무가설을 기각할 수 없고, p-값이 유의수준보다 작으면 귀무가설을 기각할 수 있다.
=
각 차이의 값을 제곱하는 것으로, 모든 값을 양수로 만들고 관측과 예측값의 차이를 더 강조한다.
observed = 우리가 가지고 있는, 관측된 데이터의 값
expected = 우리가 기대하고 있는, 기대하는 데이터의 값
통계치를 pvalue로 바꾸는 이유
데이터의 사이즈에 따라 통계치는 어마어마하게 바뀐다. 0.31~로 시작하는 통계치가 100을 곱해주면 31.~으로 바뀐다는 점에서 의미는 비슷하지만 통계치가 너무 달라져서 해석할 때 의미가 달라질 수 있으므로 표준화가 필요하다. 즉, 표준화된 값으로 봐야 의미가 달라지지 않을 수 있다.
통계치를 p-value로 바꾸는 과정
from scipy import stats
stats.chi2.cdf
카이제곱 검정은 변수가 몇 개이냐에 따라 두 가지로 나눌 수 있다.
변수가 한 개인 경우 : 변수 내 그룹간의 비율이 같은지 다른지
H0 : 표본 집단의 분포는 비슷할 것이다. (혹은 특정한 값(예상한 값)이다.)
H1 : 표본 집단의 분포는 비슷하지 않을 것이다. (혹은 특정한 값(예상한 값)이 아니다.)
주사위를 120번을 던졌다고 가정해보자. 이론적으로는 1~6까지 각각 20번이 나올 것이라고 할 수 있지만 현실은 오차가 있다. 만약 1이 다섯 번만 나온다면 주사위가 fair한가 의문이 들 수 있다. 이 때 하는 것이 일원 카이제곱 검정이다.
from scipy.stats import chisquare
import numpy as np
obs1 = np.array([19, 23, 20, 18, 22, 21])
chisquare(obs1, axis=None)
>>> Power_divergenceResult(statistic=0.8536585365853658, pvalue=0.9734853457112421)
# pvalue가 약 0.97로 유의수준 0.05보다 크다.
# 귀무가설을 기각하지 않는다. 표본집단의 분포는 비슷할 것이다.
귀무가설은 그것이 거짓임을 밝혀낸 사실이 없으면 참이라고 인식하기 때문에 귀무가설을 채택한다라는 표현은 엄밀한 의미에서 적절하지 않다. 따라서 귀무가설을 기각할 수 없다, 혹은 대립가설을 기각한다 정도의 표현이 적합할 것이다.
변수가 두 개인 경우 : 변수 사이의 연관성이 있는지 없는지
여기에서 변수는 두 개일뿐만 아니라 두 변수 모두 명목척도이다.
데이터끼리의 두 개의 그룹의 두 개의 샘플에 있는 데이터의 분포,빈도의 값이 비슷하다/비슷하지 않다를 확인한다. 즉, 두 카테고리의 데이터가 연관이 있다/없다를 볼 때 쓰인다.
코로나 감염은 마스크 착용과 연관이 있다없다?
두 변수 간의 연관성, 빈도의 유사성을 보는 것이 이원 카이제곱 검정.
귀무가설: 두 변수는 연관성이 없다.
대립가설: 두 변수는 연관성이 있다
from scipy.stats import chi2_contingency
obs = pd.crosstab(df['corona'], df['mask'])
print(chi2_contingency(obs, correction = False))
# scipy.stats.chi2_contingency(observed, correction=True, lambda_=None)
# observed: array_like
# The contingency table. The table contains the observed frequencies (i.e. number of occurrences) in each category.
##In the two-dimensional case, the table is often described as an “R x C table”.
해당 parameter를 결정짓기 위한 독립적으로 정해질 수 있는 값의 수.
1-sample (적합도 검정), DF = # categories-1
#일차원적 벡터 = n-1
2-sample (독립성 검정), DF = (#행 - 1)(#열 - 1)
이차원적 벡터 = (행의 수 -1)(열의 수-1)
예) 2 by 3 메트리스에서 카이스퀘어 값을 계산하기 위한 자유도
(2-1)*(3-1)=2