[통계학 기초] 카이제곱 검정

Hyunjun Kim·2024년 12월 10일

통계학기초

목록 보기
14/24

카이제곱 검정이란?

카이제곱 검정은 두 범주형 변수에 대한 분석 방법이다.
다음의 세가지 검증 방법이 있다.

  1. 적합도 검정 : 한 범주형 변수의 각 그룹 별 비율과 특정 상수비가 같은지 검증하는 것
  2. 독립성 검정 : 두 범주형 변수가 서로 독립인지 검정하는 것
  3. 동질성 검정 : 각 집단이 서로 유사한 성향을 갖는지 분석하는 것

검정 방식

1. 적합도 검정 (Goodness-of-Fit Test)

사용 상황: 한 범주형 변수의 관측된 분포가 예상되는 분포(기대치)와 일치하는지 검증할 때 사용한다.

예시:
주사위를 100번 던졌을 때 각 면(1~6)이 나오는 비율이 공정한 주사위의 기대 비율(1/6)과 일치하는지 검증.

가설:

  • 귀무가설(H0H_0): 주사위는 공정하며, 각 면이 나올 확률은 동일하다.
  • 대립가설(H1H_1): 주사위는 공정하지 않다.

2. 독립성 검정 (Test of Independence)

사용 상황:
두 범주형 변수가 서로 독립인지(관련이 없는지) 확인할 때 사용한다.
예시:

  • 성별(남성/여성)과 구매 여부(구매/미구매) 간의 관계가 있는지 확인.
    - 가설:
    - 귀무가설 (H0H_0) 성별과 구매 여부는 독립이다.
    - 대립가설 (H1H_1) 성별과 구매 여부는 독립이 아니다.

3. 동질성 검정 (Test of Homogeneity)

  • 사용 상황:
    여러 집단의 특정 범주형 변수 분포가 동일한지 비교할 때 사용한다.

  • 예시:
    세 개의 다른 마케팅 채널(A, B, C)을 통해 접촉한 고객들이 구매를 했는지(구매/미구매) 여부가 채널 간에 동일한 분포를 보이는지 확인.

  • 가설:

    • 귀무가설 (H0H_0) 마케팅 채널 A, B, C의 구매율 분포는 동일하다.
    • 대립가설 (H1H_1) 마케팅 채널 A, B, C의 구매율 분포는 동일하지 않다.
  • 요약:
    적합도 검정 : 단일 변수의 분포가 기대값과 일치하는지 확인할 때 사용
    독립성 검정 : 두 변수 간의 관계를 검증할 때 사용
    동질성 검정 : 여러 집단이 동일한 분포를 보이는지 비교할 때 사용



예제 코드

1. 적합도 검정 (Goodness-of-Fit Test)

주사위를 100번 던졌을 때, 각 면의 빈도가 공정한 주사위의 기대값과 같은지 검증하는 예제.

import numpy as np
from scipy.stats import chisquare

# 관측값 (주사위를 던져 나온 결과)
observed = np.array([18, 20, 17, 15, 16, 14])  # 각 면의 빈도

# 기대값 (공정한 주사위라면 100번 중 각 면이 나올 확률은 1/6)
expected = np.full(6, 100 / 6) # 1차원 배열 (길이 6) , 모든 값 100/6
# [16.66666667 16.66666667 16.66666667 16.66666667 16.66666667 16.66666667]

# 카이제곱 적합도 검정
chi2, p_value = chisquare(observed, expected)

print(f"Chi-squared Statistic: {chi2}")
print(f"P-value: {p_value}")

if p_value < 0.05:
    print("귀무가설 기각: 주사위는 공정하지 않는다.")
else:
    print("귀무가설 채택: 주사위는 공정한다.")

np.full은 NumPy에서 특정 크기와 모양(shape)의 배열을 생성하고, 모든 요소를 동일한 값으로 채우는 함수.

np.full(shape, fill_value, dtype=None)
  • shape : 배열의 모양 (정수 또는 튜플)
  • fill_value : 배열을 채울 값
  • dtype : 배열 데이터 타입 (선택, 기본은 fill_value의 타입)

2. 독립성 검정 (Test of Independence)

성별과 구매 여부 간의 독립성을 검증하는 예제.

import pandas as pd
from scipy.stats import chi2_contingency

# 교차표 데이터 (성별과 구매 여부)
data = pd.DataFrame({
    "구매": [30, 50],  # 남성, 여성
    "미구매": [70, 50]
}, index=["남성", "여성"])

# 카이제곱 독립성 검정
chi2, p_value, dof, expected = chi2_contingency(data)

print(f"Chi-squared Statistic: {chi2}")
print(f"P-value: {p_value}")
print(f"Expected Frequencies:\n{expected}")

if p_value < 0.05:
    print("귀무가설 기각: 성별과 구매 여부는 독립이 아닙니다.")
else:
    print("귀무가설 채택: 성별과 구매 여부는 독립입니다.")

3. 동질성 검정 (Test of Homogeneity)

마케팅 채널(A, B, C) 간 구매 분포가 동일한지 검증하는 예제.

from scipy.stats import chi2_contingency

# 관측된 데이터 (각 채널 별 구매/미구매 수)
data = [
    [40, 60],  # 채널 A (구매, 미구매)
    [35, 65],  # 채널 B (구매, 미구매)
    [50, 50]   # 채널 C (구매, 미구매)
]

# 카이제곱 동질성 검정
chi2, p_value, dof, expected = chi2_contingency(data)

print(f"Chi-squared Statistic: {chi2}")
print(f"P-value: {p_value}")
print(f"Expected Frequencies:\n{expected}")

if p_value < 0.05:
    print("귀무가설 기각: 채널 간 구매 분포는 동일하지 않는다.")
else:
    print("귀무가설 채택: 채널 간 구매 분포는 동일한다.")

chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed=result)

scipy.stats.chi2_contingency 함수는 카이제곱 검정을 수행하며, 이 함수가 반환하는 값들(chi2_stat, p_value, dof, expected)은 다음과 같은 의미를 가진다:

  1. chi2_stat (Chi-squared Statistic)
    • 카이제곱 통계량 (X2X^2) 값이다.
    • 두 범주형 변수 간의 관계가 얼마나 강한지를 나타내며, 관측값과 기대값 간의 차이를 기반으로 계산된다.
    • 값이 클수록 두 변수 간의 관계가 강하다는 의미일 수 있다.

      χ^2 =∑ (O−E)^2/E

      O: 관측값 (observed values)
      𝐸: 기대값 (expected values)

  1. p_value (P-value)
    • 귀무가설을 기각할 수 있는지 결정하는 데 사용된다.
    • 귀무가설 ( 𝐻_0): 두 변수는 독립이다 (즉, 관련이 없다).
    • 𝑝-값이 0.05보다 작다면, 귀무가설을 기각하고 두 변수 간에 통계적으로 유의미한 관계가 있다고 결론 내릴 수 있다.
      • 𝑝 < 0.05 : 통계적으로 유의미함 (독립 아님).
      • 𝑝 ≥ 0.05 : 통계적으로 유의미하지 않음 (독립).
  1. dof (Degrees of Freedom)

    • 자유도(degrees of freedom)로, 데이터의 제약 조건에서 자유롭게 변할 수 있는 값의 수를 나타낸다.
    • 카이제곱 검정에서 자유도는 다음 공식으로 계산된다:
      dof=(행의개수−1)×(열의개수−1)
    • 자유도가 클수록 기대값과 관측값 간의 차이가 발생할 가능성이 커질 수 있다.

  1. expected (Expected Frequencies)

    • 두 변수가 독립이라고 가정했을 때 기대되는 빈도값(기대값)의 배열이다.

    • 각 셀의 기대값은 다음 공식으로 계산된다:
      E_ij = (행합계 i)×(열합계 j) / 전체합계

    • 기대값과 관측값 간의 차이가 클수록 두 변수 간의 관계가 강하다는 것을 나타낸다.


예시를 통한 값의 이해

import numpy as np
from scipy.stats import chi2_contingency

# 관측 데이터
result = np.array([[30, 20, 50],  # 계절 A
                   [40, 30, 30],  # 계절 B
                   [50, 40, 10]]) # 계절 C

# 카이제곱 검정 수행
chi2_stat, p_value, dof, expected = chi2_contingency(result)

print("Chi-squared Statistic:", chi2_stat)
print("P-value:", p_value)
print("Degrees of Freedom:", dof)
print("Expected Frequencies:\n", expected)

출력:

Chi-squared Statistic: 16.25
P-value: 0.0125
Degrees of Freedom: 4
Expected Frequencies:
 [[40. 30. 30.]
  [40. 30. 30.]
  [40. 30. 30.]]

해석:

  • chi2_stat : 16.25 로, 관측값과 기대값 간의 차이를 나타낸다.
  • p_value : 0.0125로, 0.05보다 작기 때문에 두 변수(계절과 색상)는 독립적이지 않다고 결론지을 수 있다.
  • dof : 4로, (행의 개수 - 1) × (열의 개수 - 1)로 계산된다.
  • expected : 기대값 배열로, 독립을 가정했을 때 각 셀에서 기대되는 빈도를 보여준다.



카이제곱통계량이 클수록 두 변수 간의 관계가 강하다는 의미일 수 있다고 했지만 아닐 수도 있다?

카이제곱 통계량 (𝜒^2) 값이 클수록 두 변수 간의 관계가 강하다는 것은 일반적인 경향일 뿐, 항상 그런 것은 아니다.

아닐 수도 있는 이유

  1. 표본 크기의 영향:

    • 표본 크기가 매우 크면, 작은 차이도 유의미한 카이제곱 통계량을 만들어낼 수 있다.
      예를 들어, 실제로는 두 변수 간의 관계가 약하지만, 표본 크기가 커지면
      𝜒^2 값이 커질 수 있다. 이 경우, 𝜒^2 값이 크더라도 관계가 강하다고 단정하기 어렵다.
  2. 관측값과 기대값의 차이

    • 𝜒^2는 관측값과 기대값 간의 차이를 기반으로 계산된다. 하지만 차이가 클수록 반드시 변수 간의 강한 "관계"를 의미하지는 않는다. 차이는 단순히 변수 간의 독립성이 깨진 것을 나타낼 뿐이다.
      예를 들어, 차이가 클 때도 데이터의 실제 분포가 큰 의미를 가지지 않을 수 있다.
  1. 해석의 한계
    • 𝜒^2값은 단순히 "관계의 강도"를 정량적으로 평가하는 것이 아니라, 두 변수 간의 독립성을 검증하는 데 초점이 있다.
      따라서, 카이제곱 검정은 귀무가설을 기각할지 말지를 결정하는 도구로 이해해야 한다.
      𝜒^2값의 크기만으로 관계의 강도를 평가하려 하면 오해가 생길 수 있다.



해결 방법

𝜒^2 값이 크더라도 이를 단독으로 해석하지 않고, p-value와 함께 해석해야 한다.

예시:

  • 큰 𝜒^2 값, 작은 p-value:
    변수 간에 관계가 있고, 그 관계가 통계적으로 유의미하다고 결론 내릴 수 있다.

  • 큰 𝜒^2 값, 큰 p-value:
    표본 크기의 영향일 가능성이 크며, 관계가 유의미하지 않을 수 있다.

추가적으로:

변수 간의 관계 강도를 더 잘 이해하려면 Cramér's V와 같은 추가 통계량을 사용할 수 있다.
Cramér's V는 𝜒^2 값을 표본 크기와 자유도로 조정하여, 관계 강도를 0과 1 사이의 값으로 나타낸다.

  • 0: 독립, 1: 매우 강한 관계
profile
Data Analytics Engineer 가 되

0개의 댓글