콘텐츠로 이동

기대 칸 도수와 타당성 조건

개요

카이제곱 검정통계량은 다항분포의 점근적 성질에 기반한 근사이다. 이 근사가 믿을 만하려면 몇 가지 조건이 충족되어야 한다. 조건이 어긋나면 카이제곱 검정이 주는 p-값이 부정확해지고 잘못된 결론으로 이어질 수 있다.

경험 법칙: 기대도수 문턱

가장 널리 인용되는 타당성 조건은 다음과 같다:

모든 기대 칸 도수가 적어도 5 이상이어야 한다.

이 경험 법칙은 참 다항분포에 대한 카이제곱 근사가 충분히 정확하도록 보장한다. 이 조건은 관측도수가 아니라 기대도수에 적용된다.

왜 관측도수가 아니라 기대도수인가?

기대도수는 \(H_0\) 아래 표본분포의 모양을 결정한다. 기대도수가 작으면 이산인 다항분포를 연속인 카이제곱 분포로 근사하기 어려워지고, 제1종 오류율이 명목값에서 벗어난다. 방향이 한쪽으로 정해져 있지 않다는 점이 중요하다. 부풀려질 때가 많지만 표본크기에 따라 오히려 낮아지기도 하며, 아래 그림이 그 요동을 정확한 열거로 보인다.

각 검정의 조건

적합도 검정

  1. 무작위 표집: 관측값을 모집단에서 무작위로 추출해야 한다.
  2. 독립성: 각 관측값이 다른 관측값과 독립이어야 한다.
  3. 기대도수: 각 범주의 기대도수가 적어도 5 이상이어야 한다.
  4. 상호배타적 범주: 각 관측값이 정확히 한 범주에 속해야 한다.

독립성 검정과 동질성 검정

  1. 무작위 표집: 관측값을 무작위로 추출한다(독립성은 표본 하나, 동질성은 집단별 별도 표본).
  2. 독립성: 표본 안에서도, 표본 사이에서도 관측값이 독립이어야 한다.
  3. 기대도수: 분할표의 각 칸의 기대도수가 적어도 5 이상이어야 한다.
  4. 상호배타적 범주: 각 관측값이 정확히 한 칸으로 분류되어야 한다.

조건이 어긋날 때의 대처

작은 기대도수

일부 기대 칸 도수가 5 아래로 떨어질 때:

  1. 범주 병합: 인접하거나 관련된 범주를 합쳐 기대도수를 키운다. 예를 들어 "매우 그렇다"와 "그렇다"를 한 범주로 합친다.

  2. Fisher의 정확검정: 표본이 작은 \(2 \times 2\) 분할표에서는 카이제곱 근사에 의존하지 않고 정확한 p-값을 계산한다.

  3. 모의실험 기반 검정: Monte Carlo 모의실험이나 순열검정으로 카이제곱 근사에 의존하지 않는 p-값을 얻는다.

  4. Yates 연속성 보정: \(2 \times 2\) 표에는 다음 보정을 적용한다:

\[ \chi^2_{\text{Yates}} = \sum \frac{(|O_{ij} - E_{ij}| - 0.5)^2}{E_{ij}} \]

이 보정은 카이제곱 통계량을 조금 줄여 더 보수적인(더 큰) p-값을 준다.

보정의 값을 직접 재어 보자

기대도수가 작을 때 세 검정의 실제 제1종 오류율과, 통계량이 실제로 갖는 값이 몇 개뿐임을 보이는 그림

두 집단에서 각각 \(m\)명을 뽑고 성공확률이 두 집단 모두 0.3으로 같은 상황, 즉 \(H_0\)가 참인 상황을 잡았다. 가능한 표를 하나도 빠짐없이 열거해 정확한 제1종 오류율을 계산한 것이 왼쪽 (가)이다. 모의실험이 아니라 정확한 값이다.

파란 선이 보정 없는 카이제곱 검정이다. 기대도수가 5에 한참 못 미치는 구간에서 톱니처럼 요동친다. \(m=6\)(기대도수 1.8)에서는 0.0675까지 치솟고 \(m=10\)(기대도수 3.0)에서는 0.0371까지 떨어진다. 그런데 기대도수가 5를 넘은 뒤에도 요동은 멈추지 않는다. \(m=25\)(기대도수 7.5)에서 0.0537, \(m=50\)(기대도수 15.0)에서 0.0498이다. 이것이 "5의 법칙은 지침이지 엄격한 절단값이 아니다"라는 말의 실제 모습이다. 5를 경계로 무언가가 켜지고 꺼지는 것이 아니라, 진폭이 서서히 줄어들 뿐이다.

놀라운 것은 주황과 보라 선이다. Yates 보정과 Fisher 정확검정은 그림의 어느 지점에서도 0.05에 닿지 못한다. \(m=5\)에서 Yates는 0.0008, Fisher는 0.0121이고, 기대도수가 15인 \(m=50\)에서도 둘 다 0.0307에 머문다. 5%라고 선언하고 3%짜리 검정을 돌리는 것이다. 두 방법은 안전하지만 공짜가 아니며, 그만큼 검정력을 잃는다. "작으니까 일단 Fisher"라는 습관이 항상 옳은 선택은 아니라는 뜻이다.

오른쪽 (나)가 그 이유를 보여 준다. \(m=8\)일 때 카이제곱 통계량이 가질 수 있는 값은 몇 개뿐이고, 꼬리확률은 매끄러운 곡선이 아니라 계단이다. 기각 경계 3.841에서 계단은 0.0527에 놓여 있다. 0.05라는 값을 정확히 짚을 수가 없는 것이다. 이산인 분포를 연속인 곡선으로 덮으려 할 때 생기는 오차이며, 보정이란 결국 이 계단을 어느 쪽으로 밀 것인지를 고르는 일이다.

독립성이 성립하지 않을 때

관측값이 독립이 아니면(예: 같은 대상을 반복 측정하면) 카이제곱 검정이 적절하지 않다. 대응된 범주형 자료에는 McNemar 검정 같은 대안을 고려한다.

실무 지침

  • 검정을 수행하기 전에 기대도수를 확인하라.
  • 5의 법칙은 지침이지 엄격한 절단값이 아니다. 어떤 교과서는 기대도수가 5 미만인 칸이 20% 이하이고 1 미만인 칸이 없으면 검정이 받아들일 만하다고 본다.
  • 표본이 아주 크면 카이제곱 검정은 귀무가설로부터의 사소한 이탈까지 탐지한다. 이런 경우에는 효과크기 측도(Cramér의 V 참조)를 함께 보고하라.
  • 표본이 아주 작으면 점근적 카이제곱 검정보다 정확검정을 택하라.

연습문제

연습문제 1. 조건 A에서 식물의 키: \([15, 20, 25]\), 조건 B: \([10, 15, 35]\). 카이제곱 검정에 적합한가?

풀이

아니다. 카이제곱은 범주형/도수 자료를 요구하는데 키는 연속형 측정값이다.

연속형 분포를 비교하려면 (근사적으로 정규이면) \(t\)-검정을, 아니면 비모수적인 Mann-Whitney U 검정을 쓴다. 카이제곱을 쓰려면 키를 먼저 범주로 구간화해야 하는데 그 과정에서 정보를 잃는다.

카이제곱의 흔한 용도: 분할표의 독립성, 이산분포에 대한 적합도, 모집단 사이의 동질성.

연습문제 2. 기대 칸 도수 규칙. 표준 규칙을 진술하고 어긋나면 어떻게 되는지 설명하라.

풀이

Cochran의 규칙: 모든 기대 칸 도수가 \(\ge 5\)이어야 한다.

좀 더 관대한 형태: 기대도수가 5 미만인 칸이 전체의 \(20\%\) 이하이고 1 미만인 칸이 없으면 된다.

어긋나면: 카이제곱 분포가 좋은 근사가 되지 못한다. 제1종 오류율이 명목값에서 벗어나며, 그 방향은 표본크기에 따라 갈린다.

대처:

  • 칸 병합: 도수가 낮은 범주를 합친다.
  • Fisher의 정확검정: \(2 \times 2\) 표에서 정확한 p-값을 준다.
  • Monte Carlo 모의실험: 귀무분포를 모의생성한다.
  • 더 큰 표에 대한 정확검정(계산 비용이 크다).

연습문제 3. \(2 \times 2\) 표. \(\{\{10, 15\}, \{20, 25\}\}\). 기대도수를 계산하고 \(\alpha = 0.05\)에서 독립성을 검정하라.

풀이

행 합계: 25, 45. 열 합계: 30, 40. 총합: 70.

기대도수: \(E_{ij} = (\text{row}_i \cdot \text{col}_j)/N\).

\(E_{11} = 25 \cdot 30/70 = 10.71\). \(E_{12} = 25 \cdot 40/70 = 14.29\). \(E_{21} = 45 \cdot 30/70 = 19.29\). \(E_{22} = 45 \cdot 40/70 = 25.71\).

카이제곱: \(\sum (O - E)^2/E = 0.048 + 0.036 + 0.026 + 0.020 = 0.130\).

df \(= (2-1)(2-1) = 1\). 임계값 \(\chi^2_{1, 0.05} = 3.841\). 기각하지 못한다. 종속의 증거가 없다.

연습문제 4. \(2 \times 2\) 표에 대한 Yates 연속성 보정. 언제 적용하는가?

풀이

수정된 통계량: \(\chi^2_Y = \sum (|O - E| - 0.5)^2/E\). 제곱하기 전에 절대편차에서 0.5를 뺀다.

목적: 이산인 도수를 연속인 카이제곱으로 근사하기 때문이다. 이 보정은 각 |O − E|를 0 쪽으로 밀어 정수 도수 사이의 간격을 반영한다.

적용 시점: \(2 \times 2\) 표에만. 보수적이어서 제1종 오류를 줄이지만 검정력도 함께 줄인다.

현대적 관점: Yates 보정은 지나치게 보수적이라고 보는 경우가 많다. 작은 \(2 \times 2\) 표에는 Fisher의 정확검정이 선호된다. Yates는 유산과 같은 보정이며 많은 통계학자가 생략한다.

연습문제 5. 카이제곱 독립성 검정의 표본크기 결정.

풀이

카이제곱의 검정력은 효과크기 \(w\)(Cohen의 \(w\))에 달려 있다: 칸에 걸쳐 합한 \(w = \sqrt{\sum (p_o - p_e)^2/p_e}\).

표본크기 공식(근사): \(n = \lambda_{\alpha, \beta, df}/w^2\).

비중심 카이제곱 표에서 자주 쓰이는 값:

  • df = 1, 검정력 80%, \(\alpha = 0.05\): \(\lambda \approx 7.85\).
  • df = 4: \(\lambda \approx 11.94\).

작은 효과(\(w = 0.1\)): df = 1에서 \(n \approx 785\). 중간(\(w = 0.3\)): \(n \approx 87\). 큼(\(w = 0.5\)): \(n \approx 32\).

정밀한 계산에는 statsmodels.stats.power.GofChisquarePower 등을 쓴다.

연습문제 6. 카이제곱 검정의 흔한 오용.

풀이
  1. 범주화하지 않은 연속형 자료: 그대로 적용할 수 없다. 먼저 구간화하거나 다른 검정을 쓴다.
  2. 독립이 아닌 관측값: 카이제곱은 칸들이 독립이라고 가정한다. 반복측정이나 대응 자료에는 McNemar 검정을 써야 한다.
  3. 작은 기대도수를 무시: Cochran의 규칙 위반 → 제1종 오류율이 명목값에서 벗어남.
  4. 사후에 여러 칸을 비교: 보정 없이 하면 거짓 발견이 늘어난다.
  5. 큰 p-값에서 "연관 없음"으로 결론: 기각하지 못한 것은 독립을 증명한 것이 아니다. 검정력이 부족했을 수 있다.
  6. 효과크기 무시: \(n = 10^6\)에서 매우 유의한 \(\chi^2\)가 사소한 패턴을 반영할 수도 있다.

항상: 가정을 확인하고, 효과크기(Cramér의 V나 오즈비)를 보고하며, 작은 표에는 정확검정을 고려하라.

연습문제 7. 본문이 제시한 대처 중 모의실험 기반 검정을 직접 구현하고, 카이제곱 근사와 비교하라.

풀이

원리. 주변합을 고정한 채 무작위 표를 많이 만들어, 관측된 통계량보다 큰 비율을 \(p\) 값으로 삼는다. 자료를 "행 라벨과 열 라벨의 짝짓기"로 보고 한쪽을 섞으면 된다.

import numpy as np
from scipy import stats

rng = np.random.default_rng(606)

def mc_pvalue(obs, B, rng):
    """주변합을 고정한 몬테카를로 p 값."""
    chi2_obs = stats.chi2_contingency(obs, correction=False)[0]
    r = obs.sum(1).astype(int)
    c = obs.sum(0).astype(int)
    exp = np.outer(r, c) / obs.sum()
    rows = np.repeat(np.arange(len(r)), r)
    cols = np.repeat(np.arange(len(c)), c)
    cnt = 1
    for _ in range(B):
        rng.shuffle(cols)                     # 짝짓기를 무작위로
        t = np.zeros_like(obs, dtype=float)
        np.add.at(t, (rows, cols), 1)
        cnt += ((t - exp)**2 / exp).sum() >= chi2_obs - 1e-9
    return cnt / (B + 1)

M = 2_000
print(f"{'상황':>18s} {'E_min':>6s} {'χ² 근사':>9s} {'몬테카를로':>11s}")
setups = [(np.array([[.25, .25], [.25, .25]]), 20, "2×2 균등 n=20"),
          (np.outer([.6, .4], [.85, .15]), 40, "2×2 치우침 n=40"),
          (np.outer([.5, .3, .2], [.7, .2, .1]), 40, "3×3 치우침 n=40")]
for P, n, label in setups:
    a = b = used = 0
    for _ in range(M):
        obs = rng.multinomial(n, P.ravel()).reshape(P.shape).astype(float)
        if (obs.sum(0) == 0).any() or (obs.sum(1) == 0).any():
            continue
        used += 1
        a += stats.chi2_contingency(obs, correction=False)[1] < 0.05
        b += mc_pvalue(obs, 499, rng) < 0.05
    print(f"{label:>18s} {n * P.min():6.2f} {a / used:9.4f} {b / used:11.4f}")
                상황  E_min     χ² 근사       몬테카를로
       2×2 균등 n=20   5.00    0.0605      0.0240
      2×2 치우침 n=40   2.40    0.0410      0.0190
      3×3 치우침 n=40   0.80    0.0527      0.0542

\(3\times3\)에서는 훌륭하다(0.0542). 기대도수가 0.8로 아주 작은데도 제대로 작동한다. 근사를 전혀 쓰지 않으므로 당연한 결과다.

\(2\times2\)에서는 보수적이다(0.024, 0.019). 이유는 앞 절의 피셔 검정과 같다 — 주변합을 모두 고정하면 가능한 표가 몇 개 안 되어 이산성이 심해진다. 실제로 주변합 고정 몬테카를로는 피셔 검정의 몬테카를로 판이다.

표가 클수록 유리해진다. \(3\times3\)만 되어도 가능한 표가 충분히 많아 이산성이 완화된다.

실무적 장점 셋.

  1. 표 크기에 제한이 없다. 피셔의 정확검정을 \(r\times c\)로 확장하면 계산이 폭발하는데, 몬테카를로는 \(B\)에만 비례한다.
  2. 어떤 통계량이든 쓸 수 있다. \(G^2\), 선형 추세 통계량, 순서형 자료의 \(\tau\) 등으로 바꿔 끼울 수 있다.
  3. 구현이 짧다. 위 함수가 열 줄이다.

주의 셋.

  1. \(p\) 값 자체에 몬테카를로 오차가 있다. \(B=499\)면 표준오차가 약 \(\sqrt{0.05\cdot0.95/500}\approx0.010\)이다. \(p\)가 경계 근처면 \(B\)를 키운다(\(B\ge9999\)).
  2. 분모를 \(B+1\)로 한다. 관측된 표 자체를 세지 않으면 \(p=0\)이 나올 수 있고, 그것은 수준을 어긋나게 한다.
  3. \(2\times2\)에서는 보수성을 감수하거나 바너드 검정을 쓴다.

R에서는 chisq.test(x, simulate.p.value=TRUE, B=10000)이 같은 일을 한다.

연습문제 8. 본문은 "관측값이 독립이 아니면 카이제곱 검정이 적절하지 않다"고 했다. 군집 자료에서 그 정도가 얼마나 심각한지 재고, 보정 방법을 적용하라.

풀이

상황. 학급 단위로 표집했는데 학생 개인을 독립 관측으로 세는 경우다. 같은 학급 학생끼리 닮아 있으면(급내상관 \(\rho\)) 유효 표본크기가 줄어든다.

\[ \text{DEFF}=1+(m-1)\rho \]

\(m\)은 군집 크기다.

import numpy as np
from scipy import stats

rng = np.random.default_rng(707)
M = 5_000

print(f"{'군집 수':>7s} {'크기':>5s} {'ICC':>5s} {'DEFF':>6s} "
      f"{'보정 없음':>10s} {'DEFF 로 나눔':>13s}")
for n_cluster, m, icc in [(40, 5, 0.0), (40, 5, 0.1), (40, 5, 0.3),
                          (20, 10, 0.3), (10, 20, 0.3)]:
    deff = 1 + (m - 1) * icc
    # 베타·이항으로 군집 내 상관을 만든다: icc = 1/(1+a+b)
    a = b = 0.5 * (1 / icc - 1) if icc > 0 else None
    r_raw = r_adj = 0
    for _ in range(M):
        t = np.zeros((2, 2))
        for g in range(2):                       # 두 군
            for _ in range(n_cluster // 2):
                p_c = rng.beta(a, b) if icc > 0 else 0.5
                k = rng.binomial(m, p_c)
                t[g, 0] += k
                t[g, 1] += m - k
        if t.sum(0).min() > 0:
            chi2 = stats.chi2_contingency(t, correction=False)[0]
            r_raw += stats.chi2.sf(chi2, 1) < 0.05
            r_adj += stats.chi2.sf(chi2 / deff, 1) < 0.05
    print(f"{n_cluster:7d} {m:5d} {icc:5.1f} {deff:6.2f} "
          f"{r_raw / M:10.4f} {r_adj / M:13.4f}")
   군집 수    크기   ICC   DEFF      보정 없음     DEFF 로 나눔
     40     5   0.0   1.00     0.0606        0.0606
     40     5   0.1   1.40     0.1132        0.0530
     40     5   0.3   2.20     0.1984        0.0556
     20    10   0.3   3.70     0.3218        0.0534
     10    20   0.3   6.70     0.4744        0.0566

최악의 경우 수준이 0.47이다. 두 군에 아무 차이가 없는데도 절반 가까이 기각한다.

ICC 군집 크기 실제 수준
0 5 0.061
0.1 5 0.113
0.3 5 0.198
0.3 20 0.474

군집이 클수록 치명적이다. 급내상관이 같아도 \(m\)이 5에서 20으로 커지면 수준이 0.20에서 0.47로 뛴다. DEFF가 2.2에서 6.7로 커지기 때문이다.

DEFF로 나누면 정확히 고쳐진다(0.053~0.057). 이것이 라오·스콧 보정의 가장 단순한 형태다.

\[ \chi^2_{\text{보정}}=\frac{\chi^2}{\text{DEFF}} \]

실무에서의 어려움은 \(\rho\)를 모른다는 것이다. 대처는

  1. 자료에서 추정한다. 군집별 비율의 분산에서 역산하거나 분산분석 방식으로 구한다.
  2. 문헌값을 쓴다. 교육 연구에서 학급 ICC가 0.1~0.2, 진료소 단위가 0.01~0.05 정도로 알려져 있다.
  3. 군집을 분석단위로 삼는다. 각 군집의 비율을 관측 하나로 보고 \(t\) 검정한다. 가장 단순하고 확실하다.
  4. 일반화추정방정식이나 혼합모형을 쓴다. 공변량까지 다룰 수 있다.

독립성 위배를 알아채는 법. 자료 자체로는 검정하기 어렵다. 자료가 어떻게 수집되었는지를 묻는 것이 유일한 방법이다.

신호 예
같은 대상의 반복 측정 전후 비교 → McNemar
자연적 군집 학급, 가구, 병원, 지역
시간적 근접 연속된 날짜의 관측
공간적 근접 인접 구역

"\(n\)이 크니 괜찮다"는 위험한 생각이다. 군집 자료에서 \(n\)을 늘려도 군집 수가 늘지 않으면 정보가 거의 늘지 않는다.

연습문제 9. 표가 크고 희소할 때 무엇이 문제가 되는지 확인하라. 수준과 검정력 중 어느 쪽이 더 위험한가?

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(808)
M = 3_000

print("① 수준 (독립이 참, 주변이 균등)")
print(f"{'표 크기':>8s} {'n':>6s} {'칸당 기대':>10s} {'0인 칸 평균':>12s} "
      f"{'기각률':>8s}")
for (r, c), n in [((5, 5), 50), ((5, 5), 100), ((5, 5), 250),
                  ((10, 10), 100), ((10, 10), 500), ((20, 20), 400)]:
    P = np.ones(r * c) / (r * c)
    rej = used = 0
    zeros = []
    for _ in range(M):
        obs = rng.multinomial(n, P).reshape(r, c).astype(float)
        zeros.append((obs == 0).sum())
        if (obs.sum(0) == 0).any() or (obs.sum(1) == 0).any():
            continue
        used += 1
        rej += stats.chi2_contingency(obs, correction=False)[1] < 0.05
    print(f"{f'{r}×{c}':>8s} {n:6d} {n / (r * c):10.2f} "
          f"{np.mean(zeros):12.1f} {rej / used:8.4f}")
① 수준 (독립이 참, 주변이 균등)
    표 크기      n      칸당 기대      0인 칸 평균      기각률
     5×5     50       2.00          3.3   0.0437
     5×5    100       4.00          0.4   0.0507
     5×5    250      10.00          0.0   0.0483
   10×10    100       1.00         36.6   0.0353
   10×10    500       5.00          0.7   0.0510
   20×20    400       1.00        146.9   0.0460

수준은 놀랍도록 잘 지켜진다. \(20\times20\) 표에 \(n=400\)이면 칸당 기대가 1이고 0인 칸이 평균 147개인데도 기각률이 0.046이다. 오히려 약간 보수적이다.

"모든 기대도수가 5 이상"이라는 규칙이 여기서는 지나치게 엄격하다. 앞 절에서 본 대로, 문제는 기대도수의 최솟값이 아니라 불균형이다. 주변이 균등하면 희소해도 괜찮다.

print("\n② 검정력 (같은 연관을 잘게 쪼갠 표들, n=200)")
base = np.array([[.30, .20], [.20, .30]])       # 2×2, V=0.20
for k in [1, 2, 3, 5]:
    P = np.kron(base, np.ones((k, k)) / (k * k))  # 행·열을 k 개로 쪼갬
    r, c = P.shape
    p_row, p_col = P.sum(1), P.sum(0)
    v = np.sqrt((((P - np.outer(p_row, p_col))**2)
                 / np.outer(p_row, p_col)).sum() / (min(r, c) - 1))
    rej = used = 0
    for _ in range(M):
        obs = rng.multinomial(200, P.ravel()).reshape(r, c).astype(float)
        if (obs.sum(0) == 0).any() or (obs.sum(1) == 0).any():
            continue
        used += 1
        rej += stats.chi2_contingency(obs, correction=False)[1] < 0.05
    print(f"  {r}×{c} 표 (V={v:.4f}): 칸당 기대 {200 / (r * c):5.2f}, "
          f"검정력 {rej / used:.4f}")
② 검정력 (같은 연관을 잘게 쪼갠 표들, n=200)
  2×2 표 (V=0.2000): 칸당 기대 50.00, 검정력 0.8097
  4×4 표 (V=0.1155): 칸당 기대 12.50, 검정력 0.4413
  6×6 표 (V=0.0894): 칸당 기대  5.56, 검정력 0.2793
  10×10 표 (V=0.0667): 칸당 기대  2.00, 검정력 0.1393

검정력이 0.80에서 0.14로 무너진다. 똑같은 연관(원래의 \(2\times2\) 구조)을 잘게 쪼갠 것뿐인데도 그렇다.

따라서 희소성의 진짜 비용은 검정력이다. 수준은 대체로 지켜지므로 "거짓 발견"의 위험은 낮지만, 있는 것을 못 찾는다.

왜 검정력이 떨어지는가. 두 가지가 동시에 일어난다.

  1. 자유도가 늘어 임계값이 커진다(1 → 81).
  2. \(V\)가 작아진다(0.20 → 0.067). 쪼개진 범주 사이에는 연관이 없으므로 이탈이 희석된다.

실무 지침 넷.

  1. 범주를 필요 이상으로 잘게 나누지 않는다. 설문 문항을 7단계로 받았다면 분석에서 3단계로 합치는 것이 대개 낫다.
  2. 순서형이면 순서를 활용한다. 선형 추세 검정(코크런·아미티지)은 자유도 1이라 훨씬 강력하다.
  3. 희소한 큰 표에서 유의하지 않다고 "연관 없음"으로 결론짓지 않는다. 검정력이 0.14일 수 있다.
  4. 구조적 0을 구분한다. 아래 참조.

표본 0과 구조적 0.

종류 뜻 처리
표본 0 가능하지만 우연히 관측 안 됨 그대로 둔다
구조적 0 애초에 불가능한 조합 자유도를 줄이고 특수 모형을 쓴다

예컨대 "임신 여부 × 성별" 표에서 "남성 × 임신" 칸은 구조적 0이다. 이런 칸을 보통의 카이제곱에 넣으면 기대도수가 양수로 계산되어 없는 이탈을 만들어 낸다. 준독립 모형이나 로그선형모형으로 그 칸을 빼고 적합해야 한다.

연습문제 10. 카이제곱 검정을 쓰기 전 점검 목록을 만들어라.

풀이

점검 순서 — 중요한 것부터.

① 독립성 (가장 중요, 검정으로 확인 불가)
    자료가 어떻게 수집되었는가?
    ├─ 같은 대상의 반복 측정 → McNemar / 코크런 Q
    ├─ 군집 표집 → DEFF 보정 / 혼합모형 (연습문제 8)
    └─ 단순 확률표본 → 통과
          ↓
② 범주의 정의
    ├─ 상호배타적이고 빠짐없는가
    ├─ 자료를 보고 범주를 정하지 않았는가
    └─ 구조적 0 이 있는가 (연습문제 9)
          ↓
③ 기대도수
    ├─ 모두 5 이상 → 카이제곱
    ├─ 일부 작지만 주변이 고르다 → 카이제곱도 대체로 무방
    └─ 작고 주변이 심하게 치우침 → 정확검정 / 몬테카를로
          ↓
④ 표본크기
    희소한 큰 표에서 유의하지 않으면 검정력을 계산해 본다

①이 압도적으로 중요하다. ③의 위반은 수준을 1.3배로 만들지만, ①의 위반은 9배로 만든다(연습문제 8의 0.474).

그런데 실무에서는 순서가 거꾸로다. 기대도수는 소프트웨어가 자동으로 경고해 주니 누구나 확인하고, 독립성은 아무도 경고해 주지 않으니 자주 건너뛴다.

점검 목록.

  • [ ] 관측이 독립인가? 자료 수집 방식을 확인했는가?
  • [ ] 군집 구조가 있다면 반영했는가?
  • [ ] 각 관측이 정확히 한 칸에 들어가는가? (다중응답 문항이면 카이제곱을 쓸 수 없다)
  • [ ] 도수를 넣었는가? (백분율이나 평균을 넣으면 무의미하다)
  • [ ] 기대도수의 최솟값은?
  • [ ] 구조적 0이 있는가?
  • [ ] 범주를 자료를 보고 정하거나 합치지 않았는가?
  • [ ] 효과크기와 잔차를 함께 볼 준비가 되었는가?

가장 흔한 치명적 오용 넷.

오용 왜 치명적인가
백분율을 도수 자리에 넣기 사실상 \(n=100\)으로 고정하는 셈
다중응답 문항 한 사람이 여러 칸에 들어가 독립성 위배
군집 자료를 개인 단위로 수준이 최대 9배(연습문제 8)
대응 자료에 독립성 검정 McNemar를 써야 한다

첫째가 가장 흔하다. "A 집단 60%, B 집단 40%"를 \(\begin{pmatrix}60&40\\40&60\end{pmatrix}\)로 넣으면, 실제 \(n\)이 20이든 2000이든 같은 \(p\) 값이 나온다. 원 도수가 없으면 카이제곱 검정을 할 수 없다.

마지막으로 — 조건을 통과했다고 결론이 의미 있는 것은 아니다. 타당성 조건은 \(p\) 값이 믿을 만한가만 보장한다. 그 연관이 인과인지, 교란된 것은 아닌지, 실질적으로 중요한 크기인지는 전혀 다른 문제다.


정리하며

카이제곱 검정은 근사이며, 그 근사가 통하는 조건이 있다.

  • 널리 쓰이는 규칙은 "모든 기대도수 \(\ge5\)"다. 관측도수가 아니라 기대도수에 적용된다는 점이 자주 혼동된다.
  • 덜 엄격한 판본도 있다. 코크런의 권고는 기대도수가 \(5\) 미만인 칸이 전체의 \(20\%\) 를 넘지 않고 어느 칸도 \(1\) 미만이 아니면 된다는 것이다.
  • 위반하면 \(p\) 값이 틀린다. 대개 통계량이 과대해져 기각을 너무 자주 하게 된다. 3장에서 재어 보았듯 처음 두 적률은 소표본에서도 맞지만 꼬리가 어긋난다.
  • 처방은 세 가지다. 범주를 합치거나, 자료를 더 모으거나, 정확검정으로 간다. 범주를 합칠 때는 자료를 보기 전에 정한 기준으로 해야 새로운 자유도가 생기지 않는다.
  • \(2\times2\) 에서는 피셔의 정확검정이 표준 대안이며, 이 장 마지막 절에서 다룬다.

다음 절 효과크기와 Cramér의 V로 넘어간다. 유의성과 크기는 다른 물음이다.