콘텐츠로 이동

분산분석 등분산성 사전검정

일원분산분석은 \(k\)개 집단이 공통 분산을 갖는다고 가정한다. 곧 \(\sigma_1^2 = \sigma_2^2 = \cdots = \sigma_k^2\)이다. 이 가정이 위배되면 표준 분산분석 F 검정이 오도하는 \(p\)값을 낼 수 있다. 자연스러운 전략은 분산분석을 수행하기 전에 이 장의 분산 검정 가운데 하나로 등분산 가정을 검정하는 것이다. 이 절은 사전검정 흐름, 사전검정의 선택, 그리고 두 단계 접근을 둘러싼 논쟁을 다룬다.

두 단계 흐름

전통적인 접근은 두 단계로 진행된다.

1단계 (사전검정). 어떤 유의수준 \(\alpha_{\text{pre}}\)에서 분산 동질성 검정을 적용한다.

  • 사전검정이 \(H_0\colon \sigma_1^2 = \cdots = \sigma_k^2\)을 기각하지 못하면 표준 분산분석 F 검정으로 진행한다.
  • 사전검정이 \(H_0\)을 기각하면 등분산을 요구하지 않는 대안 절차(Welch 분산분석 등)를 쓴다.

2단계 (본 검정). 분산분석 또는 그 대안을 수행한다.

  • 표준 분산분석은 F 통계량의 분모에 합동분산 \(\text{MSE} = S_p^2\)을 쓰며 \(F_{k-1, N-k}\) 분포를 따른다.
  • Welch 분산분석은 분산을 합동하지 않는다. 대신 집단평균의 가중평균과 조정된 자유도 근사(Welch-Satterthwaite)를 쓴다.

사전검정 고르기

사전검정은 분산분석에 들어갈 바로 그 자료에서 신뢰할 만한 결과를 낼 만큼 로버스트해야 한다. 분산분석 자료가 완벽히 정규인 경우는 드물므로, Bartlett 검정처럼 정규성에 의존하는 사전검정은 실제 분산 차이가 아니라 비정규성 때문에 등분산 가설을 기각할 수 있다.

권장 사전검정:

사전검정 사용 상황
Brown-Forsythe 대부분의 상황에서 기본 선택
Levene (평균) 자료가 근사적으로 대칭일 때
Fligner-Killeen 자료가 심하게 비정규일 때

Bartlett 검정을 사전검정으로 쓰지 말라

Bartlett 검정은 비정규성에 지나치게 민감하여 신뢰할 만한 분산분석 사전검정이 되지 못한다. 자료가 비정규이면 분산이 같아도 \(H_0\)을 기각할 수 있고, 그러면 불필요하게 Welch 분산분석을 쓰게 된다.

15.4절 표에서 보았듯 지수분포 자료에서 Bartlett의 실제 크기는 0.390이다. 등분산인 자료의 39%에서 "분산이 다르다"고 잘못 판정한다. Brown-Forsythe 검정이 표준적 권고이다.

사전검정 논쟁

두 단계 접근은 여러 근거에서 비판받아 왔다.

1. 전체 제1종 오류의 왜곡. 결합된 절차(사전검정 후 조건부 분산분석)는 본 검정의 명목 유의수준 \(\alpha\)를 유지하지 못한다. 전체 제1종 오류율은 사전검정의 검정력, 사전검정의 유의수준, 분산 이질성의 정도에 의존한다.

2. 사전검정의 낮은 검정력. 분산 검정은 중간 정도의 분산 차이를 탐지할 검정력이 제한적이며 표본이 작을수록 심하다. 사전검정이 유의하지 않다고 분산이 같은 것이 아니라, 단지 표본이 작아 차이를 탐지하지 못한 것일 수 있다.

3. 조건부 편향. 표준 분산분석과 Welch 분산분석 중 어느 것을 쓸지가 자료에 의존한다. 이 조건화가 본 검정의 작동 특성에 미묘한 편향을 들여온다.

수치로 본 논쟁

집단 4개, 각 \(n = 15\), 평균이 모두 같은(\(H_0\) 참) 상황에서 세 전략의 실제 제1종 오류율을 비교했다(반복 5,000회, 명목 \(\alpha = 0.05\)).

표준편차 항상 표준 분산분석 항상 Welch 두 단계 (BF 사전검정)
\((5,5,5,5)\) 등분산 0.045 0.045 0.046
\((5,5,5,10)\) 0.063 0.044 0.057
\((2,4,6,10)\) 0.074 0.046 0.047

읽을 점이 세 가지이다.

  1. 표준 분산분석은 분산이 다르면 크기가 부풀려진다. \((2,4,6,10)\)에서 0.074로 명목값의 1.5배이다.
  2. Welch 분산분석은 모든 경우에 0.044~0.046으로 안정적이다.
  3. 두 단계 절차는 중간이다. \((5,5,5,10)\)에서 0.057로 여전히 부풀려져 있다. 분산 차이가 작아 Brown-Forsythe가 자주 놓치고, 그때마다 부적절한 표준 분산분석으로 넘어가기 때문이다. 분산 차이가 큰 \((2,4,6,10)\)에서는 사전검정이 잘 탐지하므로 0.047로 회복된다.

곧 사전검정이 가장 필요한 상황(작고 애매한 분산 차이)에서 가장 도움이 되지 않는다.

세 전략의 실제 제1종 오류율

왼쪽 묶음은 분산이 정말로 같은 경우다. 세 전략이 \(0.045,\ 0.046,\ 0.045\)로 구별되지 않는다. 등분산일 때는 무엇을 쓰든 상관없다는 뜻이고, 웰치를 기본값으로 써도 잃는 것이 없다는 근거의 절반이 여기 있다.

가운데 묶음이 이 그림의 핵심이다. 네 집단 중 하나만 표준편차가 두 배인, 실무에서 가장 흔한 형태의 위배다. 표준 분산분석은 \(0.063\)으로 부풀고 웰치는 \(0.044\)로 멀쩡한데, 두 단계 절차는 \(0.057\)로 둘 사이에 어정쩡하게 놓인다. 브라운–포사이드가 이 정도 차이를 자주 놓치기 때문이다. 사전검정이 기각하지 못하면 그대로 부적절한 표준 분산분석으로 넘어가므로, 두 단계 절차는 표준 분산분석의 잘못을 상당 부분 물려받는다.

오른쪽 묶음에서는 사전검정이 제 몫을 한다. 표준편차가 \(2, 4, 6, 10\)으로 크게 다르니 브라운–포사이드가 대부분 탐지하고, 두 단계 절차의 크기가 \(0.047\)로 회복된다. 그런데 바로 이 경우가 사전검정 없이도 문제를 알아차릴 수 있는 경우다. 집단별 표준편차를 표로만 보아도 5배 차이는 눈에 띈다.

정리하면 이렇다. 사전검정은 차이가 작을 때 놓치고, 차이가 클 때만 잡아낸다. 그런데 차이가 작을 때야말로 판정이 필요한 순간이고, 클 때는 이미 눈으로 보인다. 진단 도구가 쉬운 문제만 풀고 어려운 문제를 넘긴다면 그 도구를 쓸 이유가 없다. 초록 막대가 세 경우 모두 \(0.044\sim0.046\)인 것을 보라. 사전검정이라는 단계를 아예 없애는 것이 가장 단순하면서 가장 잘 작동하는 선택이다.

현대의 권고

많은 통계학자가 사전검정을 아예 건너뛰고 Welch 분산분석을 기본값으로 쓰기를 권한다.

  • 등분산일 때의 Welch 분산분석. 실제로 분산이 같을 때 Welch 분산분석의 검정력은 표준 분산분석보다 조금 낮을 뿐이다.
  • 이분산일 때의 Welch 분산분석. 분산이 다를 때 Welch 분산분석은 올바른 제1종 오류율을 유지하지만 표준 분산분석은 그러지 못한다.

검정력 손실의 크기를 확인해 보자. 네 집단, 각 \(n = 15\), 모든 표준편차가 5인 등분산 상황에서

참 평균 표준 분산분석 검정력 Welch 검정력 손실
\((0,0,0,3)\) 0.337 0.319 \(-1.8\)%p
\((0,0,0,5)\) 0.780 0.754 \(-2.7\)%p

등분산 아래에서 잃는 검정력이 2~3퍼센트포인트에 불과하다. 이분산에서 얻는 크기 보호(0.074 → 0.046)와 견주면 매우 작은 대가이다.

언제 사전검정을 하고 언제 Welch를 기본값으로 하는가

  • 모든 검정력을 짜내는 것보다 로버스트성이 중요한 일상적 분석에서는 Welch 분산분석을 기본값으로 하라.
  • 표본이 커서 사전검정의 검정력이 좋고, 정규성이 확인되었으며, 정당화될 때 분산을 합동하여 검정력을 최대화하고 싶을 때만 사전검정을 쓰라.

보기 1. 흐름. 어떤 연구자가 \(k = 4\)개 처치집단의 평균 점수를 비교한다. 각 집단은 \(n_i = 15\)개 관측값을 갖는다.

풀이

1단계. 각 집단의 정규성을 확인한다(Shapiro-Wilk 검정 또는 Q-Q 그림). 네 집단이 모두 정규성 확인을 통과했다고 하자.

2단계. \(\alpha_{\text{pre}} = 0.05\)에서 등분산에 대한 Brown-Forsythe 검정을 수행한다.

3단계. Brown-Forsythe 검정이 기각하지 못하면(\(p > 0.05\)) 표준 일원분산분석을, 기각하면(\(p \le 0.05\)) Welch 분산분석을 수행한다.

보기 2. 사전검정을 거치는 절차의 문제. 사전검정이 기각하지 못하면 표준 분산분석을, 기각하면 Welch 분산분석을 쓰는 두 단계 절차를 생각한다. 집단 \(k = 4\)개, 집단당 \(n = 15\), 평균은 모두 같아 \(H_0\)이 참이다.

(1) 사전검정이 본 검정과 독립이라면 두 단계 절차의 실제 크기가 두 전략의 크기의 볼록결합임을 보이고 그 가중치가 무엇인지 밝히시오. 이로부터 두 단계 절차가 "항상 Welch"만큼 좋아지는 조건은 무엇인가.

(2) 모의실험으로 그 예측을 확인하시오. 예측이 어긋나는 곳에서 사전검정을 통과한 표본이 무엇에 대해 치우쳐 있는지 찾고, 그 치우침이 표준 분산분석의 \(F\)를 어느 방향으로 미는지 밝히시오.

풀이

(1) 두 단계 절차의 크기는 정확히 적을 수 있다. 사전검정이 기각하는 사건을 \(A\), 표준 분산분석이 기각하는 사건을 \(S\), Welch가 기각하는 사건을 \(W\)라 하자. 두 단계 절차는 \(A^c\)에서 표준을 쓰고 \(A\)에서 Welch를 쓰므로, 그 기각사건은

\[ (A^c \cap S) \;\cup\; (A \cap W) \]

이고 두 덩어리가 서로 배반이므로

\[ \alpha_2 = P(A^c \cap S) + P(A \cap W) \]

이다. 여기까지는 가정 없이 정확하다. 이제 사전검정이 본 검정과 독립이라고 가정하면 두 교집합이 쪼개져

\[ \alpha_2 = P(A^c)P(S) + P(A)P(W) = (1-\pi)\,\alpha_{\text{std}} + \pi\,\alpha_W, \qquad \pi = P(A) \]

가 된다. 곧 두 크기의 볼록결합이고 가중치는 사전검정의 기각률 \(\pi\)다. 분산이 정말 같으면 \(\pi\)는 사전검정의 크기(\(\approx \alpha_{\text{pre}} = 0.05\))이고, 분산이 다르면 \(\pi\)는 사전검정의 검정력이다.

볼록결합은 늘 두 끝점 사이에 놓이므로 결론이 둘 나온다.

\[ \min(\alpha_{\text{std}},\, \alpha_W) \;\le\; \alpha_2 \;\le\; \max(\alpha_{\text{std}},\, \alpha_W) \]

첫째, 두 단계 절차는 결코 두 전략 바깥으로 나가지 않는다. 어느 쪽에 가까운지는 \(\pi\) 하나가 정한다. 둘째, \(\alpha_2 = \alpha_W\)가 되려면 \(\pi = 1\), 곧 사전검정이 이분산을 빠짐없이 탐지해야 한다. 그런데 분산 검정의 검정력은 차이가 작을 때 낮다. 그러므로 차이가 작아 표준 분산분석이 조금 부푸는 상황에서는 \(\pi\)가 작아 두 단계 절차가 표준 분산분석 쪽으로 끌려가고, 차이가 커서 \(\pi \approx 1\)이 되는 상황에서만 Welch를 따라간다. 본문이 "사전검정이 가장 필요한 상황에서 가장 도움이 되지 않는다"고 적은 것이 이 식 한 줄에 들어 있다.

사전검정의 선택이 왜 중요한지도 여기서 보인다. 가중치가 \(\pi\) 하나이므로 사전검정이 엉뚱한 것에 반응하면 가중치가 통째로 엉뚱해진다. Bartlett처럼 정규성에 기대는 사전검정은 분산이 같아도 모집단 모양만으로 기각하므로 \(\pi\)가 올라가고, 그 극한값이 첨도만의 함수라 표본을 키워도 낫지 않는다. 5.3절이 그 계산을 해 두었다.

(2) 먼저 한 벌로 손풀기. 등분산이 참인 자료 한 벌에 두 분산분석을 모두 돌려 본다.

import numpy as np
from scipy import stats

def welch_anova(groups):
    """Welch 의 일원배치 분산분석. (F, df1, df2, p) 를 돌려준다.

    등분산을 가정하지 않는다. 집단마다 분산의 역수로 가중해 평균을 내고,
    분모 자유도를 실수로 조정한다.
    """
    k = len(groups)
    n = np.array([len(g) for g in groups])
    m = np.array([g.mean() for g in groups])
    v = np.array([g.var(ddof=1) for g in groups])
    w = n / v
    m_w = np.sum(w * m) / np.sum(w)
    A = np.sum(w * (m - m_w) ** 2) / (k - 1)
    lam = np.sum((1 - w / np.sum(w)) ** 2 / (n - 1)) / (k ** 2 - 1)
    F = A / (1 + 2 * (k - 2) * lam)
    df2 = 1 / (3 * lam)
    return F, k - 1, df2, stats.f.sf(F, k - 1, df2)

# 네 집단 모두 표준편차가 5 로 같다. 곧 등분산이 참인 자료다.
rng = np.random.default_rng(42)
g1 = rng.normal(50, 5, size=15)
g2 = rng.normal(55, 5, size=15)
g3 = rng.normal(52, 5, size=15)
g4 = rng.normal(48, 5, size=15)
groups = [g1, g2, g3, g4]

# 1단계: 등분산 사전검정. 그런데 이 절차 자체가 문제를 안고 있다.
# 자료를 보고 다음 검정을 고르면, 최종 결과의 제1종 오류율이 명목수준을
# 넘어선다. 사전검정 없이 처음부터 Welch 를 쓰라는 권고가 나오는 까닭이다.
bf_stat, bf_p = stats.levene(*groups, center='median')
print(f"Brown-Forsythe: W = {bf_stat:.4f}, p = {bf_p:.4f}")

# 2단계: 두 분산분석을 모두 돌려 견준다. 등분산이 참인 자료에서는
# Welch 가 잃는 것이 거의 없다. 그래서 그냥 Welch 를 쓰면 된다.
f_std, p_std = stats.f_oneway(*groups)
f_w, df1, df2, p_w = welch_anova(groups)
print(f"Standard ANOVA: F = {f_std:.4f}, p = {p_std:.6f}")
print(f"Welch ANOVA:    F = {f_w:.4f}, df = ({df1}, {df2:.2f}), "
      f"p = {p_w:.6f}")

출력:

Brown-Forsythe: W = 0.4728, p = 0.7025
Standard ANOVA: F = 8.1365, p = 0.000138
Welch ANOVA:    F = 9.7514, df = (3, 30.81), p = 0.000112

자료를 등분산으로 생성했으므로 Brown-Forsythe가 기각하지 않고(\(p = 0.70\)) 두 분산분석의 결과도 사실상 같다(\(p = 0.000138\) 대 \(0.000112\)). Welch의 분모 자유도가 \(44\)에서 \(30.81\)로 줄었는데도 결론이 바뀌지 않는다. 한 벌로는 아무 문제도 보이지 않는다. 문제는 같은 절차를 되풀이할 때 비로소 드러난다.

(1)의 예측을 20만 번으로 확인한다. 반복 횟수를 늘리려면 scipy 함수를 한 벌씩 부르는 대신 세 검정을 모두 벡터화해야 한다. 아래 세 함수는 한 벌 자료에서 stats.levene(..., center='median'), stats.f_oneway, 위의 welch_anova와 같은 값을 준다.

import numpy as np
from scipy import stats


def anova_p(Y):
    """균형자료 (R, k, n) 에 대한 표준 일원분산분석 p-값을 한꺼번에."""
    R, k, n = Y.shape
    m = Y.mean(axis=2)
    gm = Y.reshape(R, -1).mean(axis=1)
    msb = n * ((m - gm[:, None]) ** 2).sum(axis=1) / (k - 1)
    mse = Y.var(axis=2, ddof=1).mean(axis=1)   # 균형자료에서는 합동분산 = 평균
    return stats.f.sf(msb / mse, k - 1, k * (n - 1)), msb, mse


def bf_p(Y):
    """Brown-Forsythe = 중앙값 중심 Levene. |y - median| 에 분산분석을 돌린다.
    scipy.stats.levene 의 center 기본값이 'median' 이므로 그것과 같은 검정이다."""
    return anova_p(np.abs(Y - np.median(Y, axis=2, keepdims=True)))[0]


def welch_p(Y):
    R, k, n = Y.shape
    m, v = Y.mean(axis=2), Y.var(axis=2, ddof=1)
    w = n / v
    sw = w.sum(axis=1)
    m_w = (w * m).sum(axis=1) / sw
    A = (w * (m - m_w[:, None]) ** 2).sum(axis=1) / (k - 1)
    lam = ((1 - w / sw[:, None]) ** 2 / (n - 1)).sum(axis=1) / (k ** 2 - 1)
    return stats.f.sf(A / (1 + 2 * (k - 2) * lam), k - 1, 1 / (3 * lam))


rng = np.random.default_rng(1)
R, n, alpha = 200_000, 15, 0.05

for sds in [(5, 5, 5, 5), (5, 5, 5, 10), (2, 4, 6, 10)]:
    sd = np.array(sds, float)
    k = len(sd)
    # 평균이 모두 0 이므로 H0 이 참이다. 기각하면 모두 1종오류다.
    Y = rng.normal(0, 1, size=(R, k, n)) * sd[None, :, None]

    pre = bf_p(Y)
    p_std, msb, mse = anova_p(Y)
    p_w = welch_p(Y)

    A = pre <= alpha                      # 사전검정이 기각한 표본
    pi = A.mean()
    a_std, a_w = (p_std < alpha).mean(), (p_w < alpha).mean()
    a_two = np.where(A, p_w < alpha, p_std < alpha).mean()
    pred = (1 - pi) * a_std + pi * a_w     # (1) 의 볼록결합

    v = Y.var(axis=2, ddof=1)
    ratio = v.max(axis=1) / v.min(axis=1)

    print(f"sd = {sds}")
    print(f"   사전검정 기각률 pi      = {pi:.4f}")
    print(f"   항상 표준 분산분석      = {a_std:.4f}")
    print(f"   항상 Welch              = {a_w:.4f}")
    print(f"   두 단계 (실제)          = {a_two:.4f}")
    print(f"   두 단계 (독립가정 예측) = {pred:.4f}      차 = {a_two - pred:+.4f}")
    print(f"   P(표준이 기각 | 사전검정 통과) = {(p_std < alpha)[~A].mean():.4f}"
          f"   (무조건 {a_std:.4f})")
    print(f"   E[MSB]  전체 {msb.mean():7.2f}  ->  통과 {msb[~A].mean():7.2f}"
          f"   ({msb[~A].mean() / msb.mean():.3f} 배)")
    print(f"   E[MSE]  전체 {mse.mean():7.2f}  ->  통과 {mse[~A].mean():7.2f}"
          f"   ({mse[~A].mean() / mse.mean():.3f} 배)")
    print(f"   E[s^2_max/s^2_min] 전체 {ratio.mean():6.2f}  ->  통과 {ratio[~A].mean():6.2f}")

출력:

sd = (5, 5, 5, 5)
   사전검정 기각률 pi      = 0.0276
   항상 표준 분산분석      = 0.0488
   항상 Welch              = 0.0493
   두 단계 (실제)          = 0.0498
   두 단계 (독립가정 예측) = 0.0488      차 = +0.0010
   P(표준이 기각 | 사전검정 통과) = 0.0487   (무조건 0.0488)
   E[MSB]  전체   24.90  ->  통과   24.89   (1.000 배)
   E[MSE]  전체   25.00  ->  통과   25.00   (1.000 배)
   E[s^2_max/s^2_min] 전체   2.39  ->  통과   2.32
sd = (5, 5, 5, 10)
   사전검정 기각률 pi      = 0.6108
   항상 표준 분산분석      = 0.0663
   항상 Welch              = 0.0492
   두 단계 (실제)          = 0.0617
   두 단계 (독립가정 예측) = 0.0559      차 = +0.0059
   P(표준이 기각 | 사전검정 통과) = 0.0861   (무조건 0.0663)
   E[MSB]  전체   43.55  ->  통과   43.58   (1.001 배)
   E[MSE]  전체   43.72  ->  통과   38.84   (0.888 배)
   E[s^2_max/s^2_min] 전체   6.38  ->  통과   4.01
sd = (2, 4, 6, 10)
   사전검정 기각률 pi      = 0.9798
   항상 표준 분산분석      = 0.0777
   항상 Welch              = 0.0512
   두 단계 (실제)          = 0.0524
   두 단계 (독립가정 예측) = 0.0518      차 = +0.0007
   P(표준이 기각 | 사전검정 통과) = 0.1477   (무조건 0.0777)
   E[MSB]  전체   39.04  ->  통과   39.29   (1.006 배)
   E[MSE]  전체   39.01  ->  통과   28.47   (0.730 배)
   E[s^2_max/s^2_min] 전체  29.29  ->  통과  11.93

볼록결합이 두 경우에는 맞고 한 경우에는 틀린다. 등분산 \((5,5,5,5)\)에서 예측 \(0.0488\) 대 실제 \(0.0498\), 차 \(+0.0010\)이다. 20만 번에서 기각률의 표준오차가 \(\sqrt{0.05 \times 0.95/200000} = 0.0005\)이니 두 표준오차 안이다. \((2,4,6,10)\)에서도 예측 \(0.0518\) 대 실제 \(0.0524\)로 맞는다. 여기서는 \(\pi = 0.9798\)이라 가중치가 거의 전부 Welch로 가므로 조건부 치우침이 들어갈 틈이 없다.

어긋나는 것은 가운데 경우다. \((5,5,5,10)\)에서 예측 \(0.0559\)인데 실제가 \(0.0617\)로 \(+0.0059\), 곧 열두 표준오차만큼 크다. 몬테카를로 오차가 아니다. (1)에서 쓴 독립 가정이 틀렸다는 뜻이다.

치우침의 정체는 한 줄에 드러난다. 표준 분산분석이 기각할 확률이 무조건으로는 \(0.0663\)인데, 사전검정을 통과한 표본만 보면 \(0.0861\)로 올라간다. \((2,4,6,10)\)에서는 \(0.0777\)에서 \(0.1477\)로 거의 두 배다. 사전검정의 "안심하라"는 신호가 도움이 되지 않는 정도가 아니라 거꾸로 간다. 사전검정이 통과시킨 표본에서 표준 분산분석이 더 많이 틀린다.

왜 그런가. 마지막 세 줄이 답이다. 사전검정을 통과한 표본에서

  • \(E[\text{MSB}]\)는 \(1.001\)배, \(1.006\)배로 꿈쩍하지 않는다.
  • \(E[\text{MSE}]\)는 \(0.888\)배, \(0.730\)배로 줄어든다.
  • \(E[s^2_{\max}/s^2_{\min}]\)이 \(6.38 \to 4.01\), \(29.29 \to 11.93\)으로 줄어든다.

셋째 줄이 선택의 흔적이다. 사전검정은 표본분산들이 비슷해 보이는 표본만 남기므로, 참 분산이 가장 큰 집단의 \(s_k^2\)이 우연히 작게 나온 표본을 골라낸다. 그러면 그 \(s_k^2\)을 섞어 만든 \(\text{MSE}\)가 작아진다. 그런데 집단평균이 흔들리는 폭은 표본분산이 아니라 참 분산 \(\sigma_i^2\)이 정한다. 그래서 분자 \(\text{MSB}\)는 그대로 남고 분모만 작아져

\[ F = \frac{\text{MSB}}{\text{MSE}} \]

가 위로 밀린다. 사전검정은 \(\text{MSE}\)가 참 분산들을 대표하는지 묻는 것이 아니라 표본분산들이 서로 닮았는지만 묻기 때문에, 바로 \(\text{MSE}\)가 작게 나온 표본을 통과시킨다.

조건부 표본은 더 이상 무작위 표본이 아니다. 위 논쟁 3번의 "조건부 편향"이 이것이고, (1)의 독립 가정이 깨지는 자리도 이것이다. 그리고 그 어긋남의 방향이 나쁜 쪽이다. 두 단계 절차의 실제 크기가 볼록결합 예측보다 높다.

마지막으로 수치를 맞춰 둔다. 아래 연습문제 1과 본문 표는 같은 설정을 5,000번 돌려 \((0.0634,\ 0.0440,\ 0.0568)\) 등을 얻었다. 5,000번에서 표준오차는 \(\sqrt{0.05\times0.95/5000} = 0.0031\)이고, 위 20만 번 값과의 차이는 세 설정 아홉 숫자 모두 두 표준오차 안이다. 20만 번은 같은 그림을 더 또렷하게 만들었을 뿐이며, 볼록결합과의 어긋남은 5,000번에서는 오차에 묻혀 보이지 않았던 것이다.

연습문제

연습문제 1. 집단 4개, 각 \(n = 15\), 표준편차 \((5, 5, 5, 10)\)이고 평균이 모두 같은 상황에서 세 전략(항상 표준 분산분석, 항상 Welch, 두 단계)의 제1종 오류율을 모의실험으로 비교하라.

풀이
import numpy as np
from scipy import stats

def welch_p(groups):
    k = len(groups)
    n = np.array([len(g) for g in groups])
    m = np.array([g.mean() for g in groups])
    v = np.array([g.var(ddof=1) for g in groups])
    w = n / v
    m_w = np.sum(w * m) / np.sum(w)
    A = np.sum(w * (m - m_w) ** 2) / (k - 1)
    lam = np.sum((1 - w / np.sum(w)) ** 2 / (n - 1)) / (k ** 2 - 1)
    F = A / (1 + 2 * (k - 2) * lam)
    return stats.f.sf(F, k - 1, 1 / (3 * lam))

def sim(sds, R=5000, n=15, seed=1):
    rng = np.random.default_rng(seed)
    a = b = c = 0
    for _ in range(R):
        gs = [rng.normal(0, s, n) for s in sds]
        p_bf = stats.levene(*gs, center='median')[1]
        p_std = stats.f_oneway(*gs)[1]
        p_w = welch_p(gs)
        a += p_std < 0.05
        b += p_w < 0.05
        c += (p_std < 0.05) if p_bf > 0.05 else (p_w < 0.05)
    return a / R, b / R, c / R

for sds in [(5, 5, 5, 5), (5, 5, 5, 10), (2, 4, 6, 10)]:
    std, welch, twostage = sim(sds)
    print(f"sd = {str(sds):>16}: standard {std:.4f}, "
          f"Welch {welch:.4f}, two-stage {twostage:.4f}")

출력:

sd =     (5, 5, 5, 5): standard 0.0452, Welch 0.0452, two-stage 0.0458
sd =    (5, 5, 5, 10): standard 0.0634, Welch 0.0440, two-stage 0.0568
sd =    (2, 4, 6, 10): standard 0.0738, Welch 0.0464, two-stage 0.0468

핵심 관찰: 두 단계 절차가 중간 사례에서 가장 나쁘다.

\((5,5,5,10)\)에서 두 단계 절차의 크기가 \(0.057\)로, 항상 Welch를 쓰는 \(0.044\)보다 나쁘다. 분산 차이가 중간이라 Brown-Forsythe가 자주 놓치기 때문이다.

반면 \((2,4,6,10)\)처럼 차이가 크면 사전검정이 잘 탐지하여 두 단계 절차도 \(0.047\)로 회복된다.

이 패턴이 사전검정 논쟁의 핵심이다. 사전검정은 분산 차이가 명백할 때 잘 작동하지만, 그런 상황에서는 애초에 사전검정 없이도 Welch를 쓰면 된다. 사전검정이 필요한 애매한 상황에서는 검정력이 부족해 도움이 되지 않는다. \(\square\)

연습문제 2. 등분산일 때 Welch 분산분석이 잃는 검정력을 모의실험으로 수량화하라. 그 손실이 받아들일 만한지 논하라.

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(7)
R, n = 5000, 15

for mus in [(0, 0, 0, 3), (0, 0, 0, 5)]:
    a = b = 0
    for _ in range(R):
        gs = [rng.normal(m, 5, n) for m in mus]
        a += stats.f_oneway(*gs)[1] < 0.05
        b += welch_p(gs) < 0.05          # welch_p from Exercise 1
    print(f"mu = {str(mus):>14}: standard {a/R:.4f}, Welch {b/R:.4f}")

출력:

mu =   (0, 0, 0, 3): standard 0.3368, Welch 0.3190
mu =   (0, 0, 0, 5): standard 0.7804, Welch 0.7536
효과 크기 표준 Welch 절대 손실 상대 손실
평균차 3 (0.6 SD) 0.337 0.319 1.8%p 5.3%
평균차 5 (1.0 SD) 0.780 0.754 2.7%p 3.5%

손실이 받아들일 만한가. 세 관점에서 따져 보자.

  1. 크기와 검정력의 교환. 연습문제 1에서 표준 분산분석의 크기가 이분산 아래에서 0.074까지 부풀려졌다. 크기가 5%에서 7.4%로 뛰는 것은 검정력이 2%p 오르는 것과 비교할 수 없이 심각하다. 크기 왜곡은 잘못된 발견을 만들지만 검정력 손실은 단지 발견을 놓칠 뿐이다.

  2. 보험료로서의 관점. 등분산이 확실한 경우에만 2~3%p를 잃는다. 등분산이 확실하지 않은 대부분의 실무 상황에서는 오히려 이득이다.

  3. 손실이 왜 그렇게 작은가. Welch의 분모 자유도는 등분산일 때 \(N - k\)에 가깝다. 본문 보기에서 \(44\) 대 \(30.81\)로 줄었지만, F 분포는 분모 자유도가 30을 넘으면 거의 변하지 않는다. 자유도 손실의 실질적 대가가 작은 이유이다.

결론: 받아들일 만하다. 다만 집단 수가 많고(\(k \geq 6\)) 각 집단이 매우 작으면(\(n_i \leq 5\)) Welch의 자유도 근사 자체가 불안정해질 수 있으므로, 그때는 순열검정이나 붓스트랩을 고려하는 편이 낫다. \(\square\)

연습문제 3. Welch 분산분석의 검정통계량과 자유도 공식을 서술하고, 등분산일 때 표준 분산분석으로 환원되는지 확인하라.

풀이

Welch 통계량. 집단 \(i\)의 가중치를 \(w_i = n_i / s_i^2\)이라 하고 가중평균을 \(\bar{X}_w = \sum_i w_i \bar{X}_i / \sum_i w_i\)라 하자.

\[ A = \frac{1}{k-1}\sum_{i=1}^k w_i (\bar{X}_i - \bar{X}_w)^2, \]
\[ \Lambda = \frac{1}{k^2 - 1}\sum_{i=1}^k \frac{1}{n_i - 1}\left(1 - \frac{w_i}{\sum_j w_j}\right)^2, \]
\[ F_W = \frac{A}{1 + 2(k-2)\Lambda} \;\sim\; F_{k-1,\; \nu_2}, \qquad \nu_2 = \frac{1}{3\Lambda}. \]

핵심 아이디어. 가중치 \(w_i = n_i/s_i^2\)은 각 집단평균의 정밀도의 역수이다. 분산이 큰 집단은 평균 추정이 부정확하므로 가중치를 적게 받는다. 표준 분산분석이 모든 집단에 같은 가중치를 주는 것과 대조적이다.

등분산일 때의 환원. 모든 \(s_i^2 = s^2\)이고 모든 \(n_i = n\)이면 \(w_i = n/s^2\)으로 같아지고

  • \(\bar{X}_w = \bar{X}\) (단순 전체평균)
  • \(A = \frac{n}{s^2(k-1)}\sum_i(\bar{X}_i - \bar{X})^2 = \frac{\text{MSB}}{s^2}\)
  • \(w_i/\sum_j w_j = 1/k\)이므로 \(\Lambda = \frac{1}{k^2-1}\cdot\frac{k}{n-1}\left(1-\frac{1}{k}\right)^2 = \frac{(k-1)}{k(k+1)(n-1)}\)

표준 분산분석의 \(F = \text{MSB}/\text{MSE}\)와 비교하면 \(A\)가 \(\text{MSB}/s^2\)이고 여기서 \(s^2\)이 각 집단분산이므로, \(s_i^2\)이 모두 같으면 \(s^2 = \text{MSE}\)가 되어 \(A = F_{\text{std}}\)이다.

다만 정확히 같지는 않다. 보정항 \(1 + 2(k-2)\Lambda > 1\)이 통계량을 약간 줄이고, 자유도 \(\nu_2 = 1/(3\Lambda)\)이 \(N-k\)보다 작다. \(k = 4\), \(n = 15\)이면

\[ \Lambda = \frac{3}{4 \times 5 \times 14} = 0.01071, \quad \nu_2 = \frac{1}{0.03214} = 31.1 \]

로 \(N - k = 56\)보다 작다. 이 차이가 연습문제 2에서 관찰한 2~3%p의 검정력 손실을 만든다.

(본문 보기에서 \(\nu_2 = 30.81\)이 나온 것은 표본분산이 정확히 같지는 않기 때문이며, 위 이론값 31.1에 가깝다.) \(\square\)

연습문제 4. "사전검정이 기각하지 못했으므로 등분산성이 확인되었다"는 서술이 왜 부적절한지 설명하고, 대신 어떻게 보고해야 하는지 제시하라.

풀이

부적절한 이유 1: 기각 실패는 증거가 아니다. 가설검정에서 \(H_0\)을 기각하지 못한 것은 "\(H_0\)이 참"이 아니라 "\(H_0\)을 반박할 증거가 부족하다"는 뜻이다. 14장의 정규성 검정에서 반복한 논리가 그대로 적용된다.

부적절한 이유 2: 검정력이 낮다. 15.4절 연습문제 4에서 보았듯, 세 집단 총 30개 관측값으로는 분산이 네 배 달라야 탐지한다. 15.5절 보기에서는 \(n_i = 5\)일 때 분산비 3.9배도 놓쳤다.

구체적으로 \((5,5,5,10)\)인 연습문제 1의 설정, 곧 한 집단의 분산이 다른 집단의 네 배인 상황에서도 Brown-Forsythe의 검정력은 절반이 채 되지 않는다(두 단계 절차의 크기가 0.057로 표준 분산분석의 0.063에 가까웠다는 사실이 이를 보여준다).

부적절한 이유 3: 이분법이 정보를 버린다. 사전검정의 \(p\)값 하나로 등분산 여부를 판정하면 집단별 분산의 실제 크기와 그 불확실성이 사라진다.

어떻게 보고해야 하는가.

  1. 집단별 표준편차(또는 분산)와 표본크기를 표로 제시한다. 독자가 이질성의 정도를 직접 판단할 수 있게 한다.
  2. 상자그림을 함께 싣는다. 분산 차이뿐 아니라 모양의 차이도 드러난다.
  3. 사전검정 결과를 "확인"이 아니라 "관찰"로 서술한다. "등분산성이 확인되었다" 대신 "Brown-Forsythe 검정에서 분산 이질성의 증거를 찾지 못했다(\(W = 0.47\), \(p = 0.70\)). 다만 집단당 \(n = 15\)로 검정력이 제한적이다"라고 쓴다.
  4. 가능하면 판정 자체를 피한다. Welch 분산분석을 쓰면 등분산성이 확인되었는지 여부와 무관하게 타당한 추론이 되므로, 이 문장을 쓸 필요가 없어진다.

가장 좋은 해결책은 답하기 어려운 질문에 답하려 하지 말고 그 질문이 필요 없는 방법을 쓰는 것이다. \(\square\)


정리하며

분산분석 등분산성 사전검정은 여전히 흔한 관행이지만 그 한계를 이해해야 한다. 사전검정을 쓴다면 Brown-Forsythe 검정이 적절하다. 그러나 현대의 합의는 분산이 같든 다르든 잘 작동하는 Welch 분산분석을 기본값으로 삼는 쪽이다. 사전검정이 가장 가치 있는 때는 의미 있는 분산 차이를 탐지할 만큼 표본이 크고 정규성이 확인되었을 때이다.