지지플랏의 DataScience

(9) Khan Academy 카이제곱분포와 검정과 F분포와 분산분석 본문

Data Science/Khan Academy

(9) Khan Academy 카이제곱분포와 검정과 F분포와 분산분석

지지플랏 2024. 8. 19. 18:16
반응형

이번 글은 Khan Acadmey 마지막 단원인 14 ~ 16단원에 해당하는 카이제곱 분포와 검정방법 3가지(적합도, 독립성, 동질성), 분산분석에 대해서 다룬다. 예시로 쉽게 알아보고 Python 코드를 이용해서 적용해보자.


1. 글목차

  • 카이제곱 분포
  • 카이제곱 검정: 적합도, 독립성, 동질성 검정
  • F 분포
  • 분산분석

2. 본문

2.1. 카이제곱 분포

카이제곱분포이란 무엇인가?  표준정규분포를 따르는 $Z \sim N(0,1^{2})$변수의 그림을 떠올려 보자. 

이를 제곱한 분포를 그려보자.  새로운 분포인 $\chi^{2}  = Z^{2}$라고 표현할 수 있다. 표준정규분포는 평균이 0 이고 표준편차가 1인 분포를 따르기 때문에 이를 제곱한 결과는 0에 대부분 쏠려 있을 것이다. 반면  평균이 0 이지만 0을 벗어난 즉, 1,2와 같은 값들이 극히 희박한 확률로 존재할 수있다.  확률변수가 $X$ 1개 이니 자유도는 1로 표현한다. 

확률변수가 1개 이상을 제곱하여 더한 분포도 존재할 수도 있다. $\chi^{2} = Z^{2}_{1} + Z^{2}_{2}... + Z^{2}_{n}$ 단 여러개의 확률변수를 더하기 때문에 그 수가 많아질 수록 $\chi$값의 분포는 좌측으로 이동하게 될 것이다 

변수가 많아질수록 즉, 자유도가 커지는 변화에 따른 분포에 대한 그림을 그릴 수 있고, 분포 별로 확률 그래프도 도출 가능할 것 이다.

 

표는 다음 링크을 참고: https://www.scribbr.com/statistics/chi-square-distribution-table/

 

2.2. 카이제곱 검정  - 적합도 검정

위에서 카이제곱 분포를 설명한 대로 확률 변수의 제곱을 분포에 표현한 것으로 이해할 수 있다. 이를 적용하기 위한 방법이 카이제곱 검정이다. 이때 카이제곱 검정 통계량은 다음 식으로 정의한다. 

$\chi^{2} = \sum^{n}_{i}\frac{(O_{i} - E_{i})^{2}}{E_{i}}$

  • $O_{i}$: 관찰 빈도
  • $E_{i}$: 기대빈도
  • 자유도: $ n - 1$

Q1) 왜 기대 값을 분모로 나누어 정규화할까?

카이제곱 검정에서 확인하고자 하는 바는 관측 값이 기대 값보다 얼마나 차이나는가이다. 만약 기대빈도가 크다면 조금의 오차가 있더라도 이해할 수준으로 관리하는 것이고, 기대 값이 작다면 작은 숫자의 차이에도 민감하게 적용하도록 설정한 것이라고 이해할 수 있다.

Q2) 왜 관측 값과 기대 값를 차에 대한 제곱을 관리할까?

관측 값와 기대 값은 양수가 될 수도 음수가 될 수 도 있다. 단순히 이차이를 더한다면 상쇄될 수 있기 때문에 제곱을 통해서 양수로 변환하는게 첫 번째 목적이다. 다음으로는 제곱은 큰 차이를 더 부풀리는 효과를 가지고 있다. 1의 제곱과 10의 제곱은 변화에 대한 차이가 후자가 더 크다. 이를 이용해서 차이의 크기를 강조하기 위함이 두 번째이다. 세 번째는 제곱하는 방법은 평균에서 이탈을 측정하는 분산(Variance)와 같이 제곱 형태는 통계학에서 자주 사용되는 개념이기 때문이다.

다음은 상점을 매수하려는 상황에서 상점 주인이 주장하는 방문객 비율과 실제 관측한 방문 수로 적합도 검정을 수행하는 예시이다.

  합계
주장하는 방문 비율(%) 10 10 15 20 30 16 100
관측한 방문 수(명) 30 14 34 45 57 20 200
  • 귀무가설($H_{0}$): 관찰된 요일별 방문객 수는 주장된 비율과 차이가 없다.
  • 대립가설 ($H_{1}$) : 차이가 있다.
  • 풀이방법
    • $\chi^{2} = \frac{(30-20)^{2}}{20} + \frac{(14-20)^{2}}{20} + \frac{(34-30)^{2}}{30} + \frac{(45-40)^{2}}{40} + \frac{(57-60)^{2}}{60} + \frac{(20-30)^{2}}{30}$    = 11.442 
      • (월요일부터 토요일까지의 검정통계량 값)
    • 자유도: 6 - 1 = 5
    • $p-value$: 0.043
    • 따라서 주장된 비율과 차이가 있음. 귀무가설 기각. 대립 가설 채택

위 처럼 주어진 기대비율과 실제 관찰된 비율이 얼마나 차이가 나는지 평가하는 것을 적합도 검정(Goodness of fit) 이라 한다. 후술할 독립성 검정은 2가지 변수가 존재해야하는데 반하여 적합도 검정은 1차원 데이터에도 적용할 수 있는 특징을 가지고 있다.

 

import numpy as np
from scipy.stats import chisquare

# 주장하는 방문 비율(%)을 기반으로 기대값을 계산
expected_ratios = np.array([10, 10, 15, 20, 30, 15])
total_visits = 200
expected_counts = (expected_ratios / 100) * total_visits

# 관찰된 방문 수
observed_counts = np.array([30, 14, 34, 45, 57, 20])

# 카이제곱 적합도 검정을 수행
chi2_stat, p_val = chisquare(f_obs=observed_counts, f_exp=expected_counts)

# 결과 출력
print(f"Chi-squared Statistic: {chi2_stat:.3f}") # 11.442
print(f"P-value: {p_val:.3f}") # 0.043

# 결론 도출
alpha = 0.05  # 유의수준
if p_val < alpha:
    print("귀무가설 기각: 관찰된 방문 비율은 주장하는 비율과 다르다.")
else:
    print("귀무가설 채택: 관찰된 방문 비율은 주장하는 비율과 같다.")

 

적합도 검정의 좋은 예시가 있어서 링크달기: 광고 채널별 고객 유입 분석

https://m.blog.naver.com/gksshdk8003/222020037634

 

[SAS] 적합도 검정(goodness of fit test)

안녕하세요. 데이터 과학자를 꿈꾸는 꿈쟁이입니다. 오늘은 카이제곱 검정의 한 유형인 적합도 검정(goodne...

blog.naver.com

 

 

2.2. 카이제곱 검정  - 독립성 검정

적합도 검정이 1개 변수의 기대 값과 관찰 값의 차이를 검증하는 과정이라고 한다면, 독립성 검정은 2가지 변수가 존재할 떄 사용한다. 예컨데 성별과 흡연 여부의 독립성 검정을 위해서 관측된 자료가 다음과 같다고 하자. 

  흡연자 비흡연자 합계
남성 40 60 100
여성 30 70 100
합계 70 130 200

위 합계를 가지고 기대 빈도를 도출 할 수 있다. 전체 인원 200명 중 남여의 비율은 50%으로  남성이면서 흡연하는 사람과 여성이면서 흡연하는 사람은 전체 70명 중 50%인 35명씩 기대값을 가져야한다. 같은 맥락으로 비흡연자로 65명씩 기대값을

    • $\chi^{2}= \frac{(40-35)^{2}}{35} + \frac{(30-35)^{2}}{35} + \frac{(60-65)^{2}}{65} + \frac{(70-65)^{2}}{65}  = 2.1978 $
      • 각각 남성/흡연 + 여성/흡연 + 남성/비흡연 + 여성/비흡연에 대한 카이제곱 통계량
    • 자유도: (행의수 - 1) x (열의수 -1)  = (2-1)*(2-1) = 1
    • $p-value$: 0.138
    • 결론: 유의수준 0.05 하에서 귀무가설을 기각하지 못하므로  남녀간 흡연엔 차이가 없다.
import numpy as np
from scipy.stats import chi2_contingency

# 관찰된 데이터: 성별과 흡연 여부에 따른 빈도수
data = np.array([
    [40, 60],  # 남성: 흡연자, 비흡연자
    [30, 70]   # 여성: 흡연자, 비흡연자
])

# 카이제곱 통계량, p-value, 자유도, 기대값을 계산
chi2_stat, p_val, dof, expected = chi2_contingency(data, correction=True)

# 결과 출력
print(f"Chi-squared Statistic: {chi2_stat:.3f}") #1.780
print(f"P-value: {p_val:.3f}") #0.182
print(f"Degrees of Freedom: {dof:.3f}") #1.000
print("Expected frequencies:")
print(expected)
'''
[[35. 65.]
 [35. 65.]]
 '''

# 결론
alpha = 0.05  # 유의수준
if p_val < alpha:
    print("귀무가설 기각: 성별과 흡연 여부는 독립적이지 않다.")
else:
    print("귀무가설 채택: 성별과 흡연 여부는 독립적이다.")

Q) 왜 검정통계량이 손 계산과 다른가?

실제로 scipy를 이용해서 검정을 해보면 correction =True 기본 옵션으로 인하여 검정통계량과 p-value가 손 계산과 다르게 나온다. 이는 연속성 수정방식을 사용하기 때문이다. 이는 카이제곱 분포가 연속형 확률변수에 기인하였지만 실제 데이터는 이산형인 경우가 많기 때문에  검정통계량을 줄임으로써 실제로 귀무가설을 기각할 가능성을 줄이는 방식으로 작동한다. 2x2 교차표에서는 연속성 수정하는 것이 권장되고 카이제곱 통계량을 계산할때 각 항에 0.5를 뺌으로써 적용한다. 이는 n > 30이면 정규분포를 따른다는 가정처럼 경험적인 수치다. 

다음은 scipy의 chi2_contigency 함수 문서이다.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html

 

chi2_contingency — SciPy v1.14.0 Manual

In [4], the use of aspirin to prevent cardiovascular events in women and men was investigated. The study notably concluded: …aspirin therapy reduced the risk of a composite of cardiovascular events due to its effect on reducing the risk of ischemic strok

docs.scipy.org

 

 

2.3. 카이제곱 검정  - 동질성 검정

동질성 검정(Test of Homogenetiy)는 서로 다른 두 개 이상 집단에서 동일한 범주형 변수의 분포가 동일한지를 검정하는 방법이다. 귀무가설은 모든 집단에서 특정 변수의 분포가 동일하다는 점으로 설정한다. 기본적으로 독립성 검정과 동일한 방식으로 작동하며 검정의 목적데이터 해석방식에만 차이가 있다.

  독립성 검정
(Test of Independence)
동질성 검정
(Test of Homogeneity)
공통점 카이제곰 검정 사용  
차이점: 목적 두 범주형 변수 간 독립유무를 검정 여러 집단에서 동일한 범주형 분포가 동일한지 검정
차이점: 가설 $H_{0}$: 두 변수는 독립적
$H_{1}$: 두 변수는 독립적이지 않음
$H_{0}$: 모든 집단에서 분포가 동일
$H_{1}$: 적어도 하나의 집단에서 분포가 다름

 

다음은 학교별로 과목에 대한 선호도 조사표이다. 

과목 학교A 학교B 학교C 합계
수학 50 60 55 165
과학 40 45 50 135
문학 30 35 40 105
합계 120 140 145 405
  • 귀무가설$H_{0}$: 각 학교에서 학생들이 선호하는 과목의 분포는 동일
  • 대립가설$H_{1}$: 각 학교에서 학생들의 선호하는 과목의 분포는 동일하지 않다. 

위 관측 값에서 학교A의 수학에 대한 기대 값은 다음과 같이 계산할 수 있다. 

 $E_{수학,A} = \frac{수학의 전체 학생 수 x  학교A의 총학생수 }{전체 학생수} = \frac{165x120}{405} = 48.89 명$

위 식에 따라 기대값 표는 다음과 같다.(소괄호로 작성)

과목 학교A 학교B 학교C 합계
수학 50(48.89) 60(57.04) 55(59.07) 165
과학 40(40.00) 45(46.67) 50(48.33) 135
문학 30(31.11) 35(36.30) 40(37.60) 105
합계 120 140 145 405
  • 자유도: (행 - 1 ) x (열 -1) = (3 - 1) x (3 - 1) = 4
  • 카이제곱 통계량: 0.817
  • $p-value$: 0.936
  • 귀무가설 채택, 각 학교에서 과목 선호도는 동일하다.

 

import numpy as np
from scipy.stats import chi2_contingency

# 관찰된 데이터: 각 학교에서 학생들이 선호하는 과목의 빈도수
data = np.array([
    [50, 60, 55],  # 수학 선호
    [40, 45, 50],  # 과학 선호
    [30, 35, 40]   # 문학 선호
])

# 카이제곱 통계량, p-value, 자유도, 기대값을 계산
chi2_stat, p_val, dof, expected = chi2_contingency(data)

# 결과 출력
print(f"Chi-squared Statistic: {chi2_stat:.3f}"): 0.817
print(f"P-value: {p_val:.3f}") : 0.936
print(f"Degrees of Freedom: {dof:.3f}") # 0.400
print("Expected frequencies:")
print(expected.round(3))

'''
[[48.889 57.037 59.074]
 [40.    46.667 48.333]
 [31.111 36.296 37.593]]
'''

# 결론
alpha = 0.05  # 유의수준
if p_val < alpha:
    print("귀무가설 기각: 각 학교에서 과목 선호도는 동일하지 않다.")
else:
    print("귀무가설 채택: 각 학교에서 과목 선호도는 동일하다.")

 

2.4. F분포

F분포는 두 개의 카이제곱 분포를 나눈 비율로 그룹 간 차이그룹 내 변동보다 얼마나 큰지를 나타내기 위해서 고안한 분포이다.  그룹 간의 차이가 단순이 우연에 의한 것인지 아니면 유의미한 차이가 있는지 판단하는데 사용된다. 다음은 2 그룹간 자유도에 따른 F분포이다. 

$F = \frac{MSB}{MSW}$

F 통계량은 1보다 크다면, 그룹 간 분산이 그룹 내 분산보다 크다는 것을 의미하며, 이는 그룹간의 평균 차이에 유의미한 차이가 있음을 시사한다. 또는 1에 가깝거나 작다면 그룹 간 평균의 차이가 크지 않으며 이는 유연히 발생한 차이일 가능성을 시사하는 것이다. F 통계량은 분산분석(ANOVA), 회귀분석, 분산의 동질성을 검정하는데 사용한다.

2.5. 분산분석(ANOVA)

분산분석(ANOVA)이란 그룹 간 차이를 평가하기 위한 방법으로 평균의 차이를 분석하는 모수적 통계방법이다. 반면 카이제곱 검정은 비모수적 방법이다.  ANOVA는 두 개 이상의 평균이 서로 다른지 확인하기 위해서 사용된다. 또한 t-검정은 두 그룹 간의 평균을 비교하지만 ANOVA는 세 개 이상의 그룹 간 평균의 차이를 동시에 분석할 수 있다. 

  카이제곱 분산분석
분석 유형 범주형 데이터 연속형 데이터
목적 1. 관찰 값과 기대값의 일치여부(적합도 검정)
2. 두 변수간 독립성
3. 집단 간 동질성 검정
여러 그룹간 평균이 동일한지 검정
가정 분포 가정 필요 없음(비모수적)
관측빈도가 5개 이상 만족
정규 분포 및 등분산 가정 요구(모수적)
예시 성별과 흡연 여부에 대한 독립성 검정 각 교육방법 간 평균 시험 점수 비교, 신약에 따른 혈압 감소량 차이 비교

 

 

 고혈압 신약 A,B,C에 따른 환자들의 혈압감소량을 비교한다고 생각해보자.

신약A 신약B 신약C
5 8 7
7 9 6
8 7 5
6 10 8
7 9 7

F통계량에서 따지는 것은 그룹 내 분산(Within-Group Variance, SSW) 과 그룹 간 분산(Between-Group Variance, SSB) 이다.

그룹 내 분산(SSW)는 각 표본이 그룹의 평균과 얼마나 편차가 있는지가 관심 대상이며 다음과 같이 정의 된다.

$SSW = \sum^{k}_{i=1}\sum^{n_i}_{j=1}(X_{ij}-\bar{X_{i}})^{2}$

  • $X_{ij}$: $i$번째 그룹의 $j$번째 관찰 값
  • $\bar{X_{i}}$: $i$ 번째 그룹의 평균
  • $n_{i}$: $i$번째 그룹의 관찰 값 수

신약 A의 평균 $X_{1}$: 6.6, 신약 B의 평균 $X_{2}$: 8.6, 신약 C의 평균 $X_{3}$: 6.6  

그룹 간 분산(SSB)는 각 그룹이 전체 평균에 대해서 얼마나 벗어나 있는지가 관심 대상이며 다음과 같이 정의 된다.

$ SSB = \sum^{k}_{i=1}n_{i}(\bar{X_i} - \bar{X})^{2}$

전체 평균($\bar{X}$은 7.27이다.

F통계량은 위 SSW, SSB의 값의 비율이며 자유도로 나누어 주어야 한다. 

$F = \frac{MSB}{MSW}$

$MSB = \frac{SSB}{dfB}$

이때 그룹 간 자유도($dfB$)는  전체 표본 갯수 - 1 이된다. 전체 평균을 알고 데이터 14개를 알면 나머지 1개를 자연스럽게 알 수 있기 때문이다.

$MSW = \frac{SSW}{dfW}$

이때 그룹 내 자유도는($dfW$)는 전체 데이터에서 그룹 수를 뺀 값이다($N - k $) 그룹의 평균을 알고 나머지 데이터 4개를 알면 나머지 1개를 알게되며 이를 3 그룹 모두 적용할 수 있기 때문이다. 즉 위의 예시에서는 12가 된다. 

import numpy as np
import scipy.stats as stats

# 예시 데이터: 각 그룹에서 혈압 감소량 (mmHg)
group1 = [5, 7, 8, 6, 7]  # 신약 A
group2 = [8, 9, 7, 10, 9]  # 신약 B
group3 = [7, 6, 5, 8, 7]  # 신약 C

# 세 그룹의 데이터를 배열로 묶기
data = [group1, group2, group3]

# ANOVA 수행
f_statistic, p_value = stats.f_oneway(*data)

# 결과 출력
print(f"F-statistic: {f_statistic:.3f}") # 5.128
print(f"P-value: {p_value:.3f}") #0.025

# 결론 도출
alpha = 0.05  # 유의수준
if p_value < alpha:
    print("귀무가설 기각: 신약 간에 혈압 감소 효과에 차이가 있다.")
else:
    print("귀무가설 채택: 신약 간에 혈압 감소 효과에 차이가 없다.")

 

반응형