Summary

범주형 변수의 빈도(frequency)를 분석하는 비모수 검정. 관측 빈도와 기대 빈도의 차이를 검정하며, 세 가지 유형이 있다: 적합도(goodness-of-fit), 독립성(independence), 동질성(homogeneity).

용어 설명

  • 교차표 (Contingency table, 분할표): 두 범주형 변수의 빈도를 행과 열로 정리한 표. 예: 성별(행) × 찬반(열)
  • 관측 빈도 (Observed frequency, O): 실제로 데이터에서 관찰된 각 셀의 빈도
  • 기대 빈도 (Expected frequency, E): 두 변수가 독립이라면 기대되는 이론적 빈도
  • 자유도 (df): 적합도에서는 (범주 수 − 1), 독립성/동질성에서는 (행 수 − 1) × (열 수 − 1)
  • 범주형 변수 (Categorical variable): 숫자가 아닌 범주로 나뉘는 변수 (예: 성별, 혈액형, 선호도)

Chi-square Test (카이제곱 검정)

기본 수식

수식 변수 풀이

  • : 카이제곱 통계량 — 관측값과 기대값의 괴리가 클수록 커짐
  • : 각 셀의 관측 빈도 — 실제 데이터에서 세어진 값
  • : 각 셀의 기대 빈도 — “차이가 없다(H₀)“고 가정했을 때 기대되는 값
  • : 차이를 제곱 → 방향 무관하게 괴리 크기 측정
  • 로 나눔: 상대적 괴리 측정 (기대값이 작은 셀에서의 차이를 더 크게 반영)
  • 직관: “관측 빈도가 기대 빈도에서 얼마나 벗어났는가?”
  • : 관측 빈도 (Observed)
  • : 기대 빈도 (Expected)
  • df: 유형에 따라 다름

유형별 비교

유형질문변수df
적합도 (Goodness-of-fit)관측 분포가 이론 분포와 일치하는가?범주형 1개k - 1
독립성 (Independence)두 범주형 변수가 독립인가?범주형 2개(r-1)(c-1)
동질성 (Homogeneity)여러 모집단의 분포가 같은가?범주형 2개(r-1)(c-1)

1. 적합도 검정

“주사위가 공정한가?” — 관측 빈도 vs 기대 빈도

Example

주사위 120회 → 각 눈의 기대 빈도 = 20

123456
관측251715232218
기대202020202020


2. 독립성 검정

“성별과 선호도가 관련이 있는가?” — 교차표(contingency table) 분석

기대 빈도:

수식 변수 풀이

  • : 행 i, 열 j 셀의 기대 빈도
  • : 행 i의 합계 (해당 행의 전체 빈도)
  • : 열 j의 합계 (해당 열의 전체 빈도)
  • : 전체 관측치 수
  • 직관: “행과 열이 독립이면, 각 셀의 빈도는 행 비율 × 열 비율 × 전체 수”

Example

찬성반대합계
4060100
5545100
합계95105200


3. 동질성 검정

독립성 검정과 수식은 동일하지만, 연구 설계가 다름:

  • 독립성: 하나의 모집단에서 표본 추출 → 두 변수 관계
  • 동질성: 여러 모집단에서 각각 표본 추출 → 분포 비교

가정 및 제약

가정설명
기대 빈도 ≥ 5모든 셀의 기대 빈도가 5 이상 (80% 이상의 셀)
독립 관측각 관측치는 독립적
범주형 변수연속형 변수는 범주화 필요

기대 빈도 < 5일 때

  • 2×2 표: Fisher’s exact test 사용
  • 더 큰 표: 범주 합치기 또는 시뮬레이션 기반 검정

Effect Size: Cramer’s V

수식 변수 풀이

  • : Cramer’s V — 0~1 범위의 연관성 강도 지표
  • : 전체 표본 크기
  • : 행 수와 열 수 중 작은 쪽 − 1. 표의 차원에 따라 보정
  • 직관: “교차표에서 두 변수의 관계가 얼마나 강한가?”
V 값 (df*=1)해석
0.1Small
0.3Medium
0.5Large

df = min(r-1, c-1). df가 클수록 같은 V에서 연관성이 더 강하게 해석됨.

Phi coefficient (φ) — 2×2 표 전용

2×2에서는 V = φ.


Fisher’s Exact Test

소표본/기대빈도 < 5일 때 카이제곱의 대안:

수식 변수 풀이

  • : 2×2 교차표의 네 셀 빈도
  • : 조합(combination) — n개 중 k개를 뽑는 경우의 수
  • Fisher’s exact test는 가능한 모든 표의 확률을 직접 계산하므로, 소표본에서도 정확한 p-value를 제공
  • 정확한 p-value (근사 아님)
  • 2×2에서 주로 사용, 더 큰 표에서도 가능 (계산 비용↑)

Implementation

from scipy import stats
import numpy as np
 
# === 적합도 검정 ===
observed = [25, 17, 15, 23, 22, 18]
expected = [20, 20, 20, 20, 20, 20]
chi2, p = stats.chisquare(observed, f_exp=expected)
print(f"χ²={chi2:.2f}, p={p:.4f}")
 
# === 독립성 검정 ===
contingency = np.array([[40, 60], [55, 45]])
chi2, p, dof, expected = stats.chi2_contingency(contingency)
print(f"χ²={chi2:.2f}, p={p:.4f}, df={dof}")
 
# Cramer's V
n = contingency.sum()
min_dim = min(contingency.shape) - 1
v = np.sqrt(chi2 / (n * min_dim))
print(f"Cramer's V = {v:.3f}")
 
# === Fisher's exact test (2×2) ===
odds_ratio, p = stats.fisher_exact(contingency)
print(f"Fisher's exact: OR={odds_ratio:.2f}, p={p:.4f}")
 
# === pingouin ===
import pingouin as pg
expected_arr, observed_arr, stats_result = pg.chi2_independence(
    data=df, x='gender', y='preference')
print(stats_result)

관련 문서