[내가 이해한 통계학] #1 카이제곱 검정

jaehyukchoi·2021년 1월 6일
1

카이제곱 검정

카이제곱 분포에 기초한 통계적 방법으로 관찰된 빈도(obs)가 기대되는 빈도(exp)와 의미있게 다른지의 여부를 검증하기 위해 사용되는 검증방법

교차분석이라고도 한다.

적합도(goodness of fit)라고도 함. => 우리가 가진 데이터가 우리가 예상하는 값과 fit이 잘 맞냐 아니냐

우리가 가진 변수가 명목척도일 때 카이제곱 검정을 실시한다.

또한 데이터의 값은 개수여야 한다.

cf. t-test의 경우 두 개(혹은 세 개 이상)의 집단이 같은지 다른지 평균값을 가지고 비교.

카이제곱 검정의 경우,

  • 변수가 한 개인 경우: 변수 내 그룹간의 비율이 같은지 다른지
    • 그룹이 두 개: Binomial test
    • 그룹이 여러 개: 카이제곱 검정
  • 변수가 두 개인 경우: 변수 사이의 연관성이 있는지 없는지
    • ex) 휴대폰 사용과 뇌암, 바이러스 감염률과 혈액형

카이제곱 값은 어떻게 계산할까?

(이 카이제곱 통계량은 표준화시켜서 비교를 하기가 어려워서 pvalue로 바꿔줘야 한다.)

χ2=(observediexpectedi)2(expectedi)\chi^2 = \sum \frac{(observed_i-expected_i)^2}{(expected_i)}

observed는 우리가 가진, 관측한 데이터이고 expected는 기대값이다.

예를 들어 주사위를 60번 던졌을 때, 각각의 숫자는 10번씩 나온다고 기대할 수 있다.

obs와 exp의 차를 제곱하는 것을 통해 음수가 나오는 경우를 방지할 수 있고 obs와 exp의 차이를 강조하는 효과가 있다.

일원 카이제곱 검정(one sample 카이제곱 검정)

주어진 데이터가 특정 예상되는 분포와 동일한 분포를 나타내는지에 대한 가설검정

(즉, 데이터의 분포가 예상과 같은지)

주사위를 총 120번 던진다고 해보자.

123456
예상202020202020
실제172319211327
실제32714262624

Fair한 주사위라면 1~6 각각이 모두 공정하게 20번씩 나온다고 예상할 수 있다.

하지만 현실은 그렇지 않다.

가설검정

H0 : 표본집단의 분포가 동일할 것이다 (1~6 각각의 범주가 일어날 확률이 동일할 것이다)

H1: 아니다 분포는 동일하지 않을 것이다.

in Python

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로 충분히 큰 값 => 귀무가설 채택. 분포가 동일할 것이다.
obs2 = np.array([2, 33, 6, 23, 8, 26])
chisquare(obs2, axis=None)

# Power_divergenceResult(statistic=48.816326530612244, pvalue=2.4195922231210123e-09)
# pvalue가 0.0000..으로 굉장히 작다. => 귀무가설 기각. 대립가설 채택. 분포가 동일하지 않을 것이다.

이원 카이제곱 검정(two sample 카이제곱 검정)

변수가 두 개라는 의미. 둘다 명목척도.

변수들 사이에 연관성이 있는지 없는지 확인하기 위한 검정

(두 표본집단의 분포가 동일한지)

이 명목척도는 두 개 이상의 범주(category)를 가진다.

변수가 두 개이므로 두 개의 컬럼에 작성.

가장 단순한 형태는 2x2로, 각각의 변수가 두 개의 범주를 가지고 있는 경우

예를 들어서, 바이러스 감염과 혈액형에 대한 분석을 한다고 할 때

가설검정

H0: 바이러스 감염과 혈액형 사이에는 연관성이 없다.(상호 독립이다)

H1: 바이러스 감영과 혈액형 사이에는 연관성이 있다.

주의! 절대 인과관계가 아니라 상관관계! 연관성!

in Python

from scipy.stats import chi2_contingency
# 예를 들어
obs = pd.crosstab(df['virus'], df['bloodtype'])
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”.

[출처] Youtube, Sapientia a Dei

profile
웹, AI 개발 공부.

1개의 댓글

comment-user-thumbnail
2021년 1월 9일

똑똑이

답글 달기