카이제곱 검정(chi-squared test)

카이제곱 검정이 뭐지?

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

카이제곱 검정은 주어진 데이터의 분포가 예상한 분포와 동일한지 알아보는 방법이다.
예를 들어 주사위를 60번 굴려서 1부터 6까지의 값이 각각 10번 나온다고 예상했고 실제로는 각각 5, 10, 15, 12, 8, 10번 나왔다고 했을 때 두 분포가 동일한지를 알아보는 식이다.

주사위 1 2 3 4 5 6
예상 10 10 10 10 10 10
실제 5 10 15 12 8 10

카이제곱 검정은 범주형 데이터(값이 연속적이지 않은 데이터)에 대해서만 사용 가능하다.

수치형(numerical) $\rightarrow$ 범주형(categorical)

형변환(Type casting)
numerical 이지만 연속적(continuous)이지 않아 바로 category로 사용할 수 있는 경우
ex) 1, 2, 3 -> 1, 2, 3

  • 구간화(Binning)
    numerical 이지만, continuous 해서 구간별로 나누어 사용할 수 있는 경우
    ex) 1.4, 2, 3.1, 2.8, 1.1, 2.5 -> A : 1 ~ 2, B : 2 ~ 3, C : 3 ~ 4

카이제곱 검정은 주어진 변수의 갯수에 따라 One Sample 카이제곱 검정과 Two Sample 카이제곱 검정으로 나눌 수 있다.

  • One Sample Chi-squared test
    • 적합도 검정 : 주어진 한 변수의 분포가 예상한 분포와 같은지 알아보기
  • Two Sample Chi-squared test
    • 동질성 검정 : 주어진 두 변수의 분포가 같은지 알아보기
    • 독립성 검정 : 주어진 두 변수가 관련이 있는지 알아보기

카이제곱 검정은 어떻게 하는거지?

계산식

$$X^2 = \sum_{i=1}^{k} \frac{(observed_i - expected_i)^2}{expected_i}$$

Scipy를 이용한 카이제곱 검정

One Sample Chi-squared test - 적합도 검정

  • 귀무가설($H_0$) : 주어진 한 변수의 분포가 기대와 동일할 것이다
  • 대안가설($H_a$) : 주어진 한 변수의 분포가 기대와 동일하지 않을 것이다

<예시>

from scipy.stats import chisquare

dice_obs = [5, 10, 15, 12, 8, 10]

# chisquare 함수의 파라미터 1) 관측값, 2) 예상값, 3) 자유도 4) 축 방향(행/열)
chisquare(dice_obs)
# 관측값만 넣어줄 경우 관측값의 평균을 예상값으로 하여 결과를 보여준다

Power_divergenceResult(statistic=7.111111111111111, pvalue=0.2125071271925751)

# 아래와 같이 별도로 예상값을 넣어줄 수도 있다
chisquare(dice_obs, 14)

Power_divergenceResult(statistic=11.0, pvalue=0.05137998348306955)


Two Sample Chi-squared test - 동질성 검정

  • 귀무가설($H_0$) : 두 변수의 분포가 동일할 것이다
  • 대안가설($H_a$) : 두 변수의 분포가 동일하지 않을 것이다
from scipy.stats import chisquare

obs1 = [5, 4, 10, 12, 8, 6]
obs2 = [9, 9, 9, 9, 9, 9]

chisquare(obs1, obs2)

Power_divergenceResult(statistic=6.777777777777777, pvalue=0.23769876659731384)


Two Sample Chi-squared test - 독립성 검정

  • 귀무가설($H_0$) : 두 변수는 서로 독립이다 (= 관련이 없을 것이다)
  • 대안가설($H_a$) : 두 변수는 서로 독립이 아니다 (= 관련이 있을 것이다)
import numpy as np

from scipy.stats import chi2_contingency

obs3 = np.array([[10, 10, 20], [20, 20, 20]])
chi2_contingency(obs3)

(2.7777777777777777, 0.24935220877729622, 2, array([[12., 12., 16.], [18., 18., 24.]]))
$\rightarrow$ 결과 해석 : ($x^2$ 통계치, p-value, 자유도(degree of freedom), Expected value for Observed)


※ One Sample $x^2$ test(적합도 검정)의 자유도와 Two Sample $x^2$ test(독립성 검정)의 자유도 차이

  • 1-sample(적합도 검정) 자유도 = #categories-1
  • 2-sample(독립성 검정) 자유도 = (#행 - 1) * (#열 - 1)
    위 예시에서 obs3의 자유도는 (3-1) * (2-1) = 2 이다

※ Two Sample $x^2$ test(독립성 검정)의 예측값 계산 과정
A, B, C, D라는 2x2 table을 예로 들면

       
  A B A+B
  C D C+D
  A+C B+D A+B+C+D==T

위 테이블의 Expected value는

       
  (A+B)*(A+C) / T (A+B)*(B+D) / T A+B
  (A+C)*(C+D) / T (B+D)*(C+D) / T C+D
  A+C B+D T

∴ Expected = (rowsum * colsum) / totalsum

※ $x^2$ 통계치를 P-value로 바꾸는 방법

import numpy as np
from scipy.stats import chi2_contingency, chi2

obs3 = np.array([[10, 10, 20], [20, 20, 20]])
x2, p, dof, _ = chi2_contingency(obs3)
print(x2, p, dof)

1 - chi2.cdf(x2, df = dof)

2.7777777777777777 0.24935220877729622 2
0.24935220877729625

*cdf = cumulative distribution function(누적 분포 함수)

 


<참고 자료>
카이제곱 검정 - 위키백과
Chi-squared test - Wikipedia
scipy.stats.chisquare - One Sample Chi-squared test
scipy.stats.chi2_contingency - Two Sample Chi-squared test
# scipy.stats.chi2
카이제곱 검정 - jmp.com
카이제곱 검정을 위한 카이제곱분포 가정과 공식 : 범주형 자료
데이터 분석 초보자를 위한 T-test & Chi-squared test
카이제곱 검정이 세 종류나 있었어?(적합도, 독립성, 동질성)
누적 분포 함수 - 위키백과

+ Recent posts