콘텐츠로 이동

두 분산에 대한 F-검정

개요

합동 이표본 \(t\)-검정을 비롯한 여러 통계 절차가 두 모집단의 분산이 같다고 가정한다. 그런 방법을 적용하기 전에 이 가정이 합당한지 형식적으로 검정할 방법이 필요하다. 두 분산에 대한 F-검정이 바로 그것으로, 정규분포를 따르는 두 모집단의 변동성을 비교하는 가설검정이다. 가정 확인 말고도 분산의 비교는 품질관리(한 제조 공정이 다른 공정보다 변동이 큰가?)와 실험 설계(처리가 평균만이 아니라 변동성에도 영향을 주는가?)에서 자연스럽게 등장한다.

가정

F-검정에는 다음 조건이 필요하다:

  1. 정규성: 두 모집단이 모두 정규분포를 따른다. \(X_1 \sim N(\mu_1, \sigma_1^2)\), \(X_2 \sim N(\mu_2, \sigma_2^2)\).
  2. 독립성: 두 표본이 서로 독립이고, 각 표본 안의 관측값도 독립이다.
  3. 확률표본추출: 두 표본 모두 각 모집단에서 단순확률표본추출로 얻었다.

\(X_{1,1}, \ldots, X_{1,n_1}\)을 첫 모집단에서 뽑은 크기 \(n_1\)의 확률표본, \(X_{2,1}, \ldots, X_{2,n_2}\)를 둘째 모집단에서 뽑은 크기 \(n_2\)의 확률표본이라 하자. 표본분산을 다음과 같이 정의한다.

\[ S_1^2 = \frac{1}{n_1 - 1}\sum_{j=1}^{n_1}(X_{1,j} - \bar{X}_1)^2, \qquad S_2^2 = \frac{1}{n_2 - 1}\sum_{j=1}^{n_2}(X_{2,j} - \bar{X}_2)^2 \]

가설

귀무가설은 두 모분산이 같다는 것이다:

\[ H_0: \sigma_1^2 = \sigma_2^2 \]

대립가설은 다음 세 형태 중 하나이다:

  • 양측: \(H_1: \sigma_1^2 \neq \sigma_2^2\)
  • 우측: \(H_1: \sigma_1^2 > \sigma_2^2\)
  • 좌측: \(H_1: \sigma_1^2 < \sigma_2^2\)

검정통계량

F-검정의 직관은 단순하다: 두 모집단의 분산이 같다면 표본분산의 비가 1에 가까워야 한다. 1에서 크게 벗어나면 \(H_0\)에 반하는 증거가 된다.

\(H_0: \sigma_1^2 = \sigma_2^2\)과 정규성 가정 아래에서 검정통계량

\[ F = \frac{S_1^2}{S_2^2} \]

은 분자 자유도 \(n_1 - 1\), 분모 자유도 \(n_2 - 1\)인 \(F\)-분포를 따른다:

\[ F \sim F_{n_1 - 1,\; n_2 - 1} \]

이 결과는 정규모집단에서 \((n_i - 1)S_i^2 / \sigma_i^2 \sim \chi^2_{n_i - 1}\)이고, 각각을 자유도로 나눈 독립인 두 카이제곱 확률변수의 비가 F-분포를 정의한다는 사실에서 나온다.

기각역

\(d_1 = n_1 - 1\), \(d_2 = n_2 - 1\)일 때 \(F_{\alpha, d_1, d_2}\)를 \(F_{d_1, d_2}\) 분포의 상위 \(\alpha\) 임계값이라 하자.

  • 양측 (\(H_1: \sigma_1^2 \neq \sigma_2^2\)): \(F > F_{\alpha/2, d_1, d_2}\) 또는 \(F < F_{1 - \alpha/2, d_1, d_2}\)이면 \(H_0\)을 기각한다.
  • 우측 (\(H_1: \sigma_1^2 > \sigma_2^2\)): \(F > F_{\alpha, d_1, d_2}\)이면 \(H_0\)을 기각한다.
  • 좌측 (\(H_1: \sigma_1^2 < \sigma_2^2\)): \(F < F_{1 - \alpha, d_1, d_2}\)이면 \(H_0\)을 기각한다.

F 분포의 비대칭성과 양측 기각역

양측 기각역을 쓸 때 가장 먼저 눈에 띄는 것은 두 임계값이 1에서 같은 거리에 있지 않다는 점이다. (a)에서 \(d_1 = 9\), \(d_2 = 11\)일 때 아래쪽 임계값은 \(0.256\), 위쪽 임계값은 \(3.588\)이다. 1에서 아래쪽까지는 \(0.744\), 위쪽까지는 \(2.588\)로 위쪽이 3.5배 멀다. 정규분포나 \(t\)-분포에서는 임계값을 \(\pm c\) 한 쌍으로 적을 수 있었지만 \(F\)-분포에서는 그럴 수 없다. 대칭인 것은 꼬리에 둔 확률(각각 2.5%)이지 1로부터의 거리가 아니다.

그렇다고 대칭이 아예 없는 것은 아니다. (b)처럼 가로축을 배수 척도(로그 눈금)로 바꾸면 \(F_{4,20}\)과 \(F_{20,4}\)가 1을 기준으로 정확히 서로의 거울상이 된다. \(F\)는 두 분산의 비이므로 자연스러운 척도가 덧셈이 아니라 곱셈이기 때문이다. 분자와 분모를 맞바꾸는 일이 이 척도에서는 좌우 뒤집기에 지나지 않고, 그 결과가 바로 역수 관계 \(F_{1-\alpha/2,\,d_1,d_2} = 1/F_{\alpha/2,\,d_2,d_1}\)이다. 그림의 값으로 확인하면 \(F_{4,20}\)의 아래쪽 2.5% 점 \(0.1168\)이 \(F_{20,4}\)의 위쪽 2.5% 점 \(8.5599\)의 역수와 정확히 같다.

이 관계를 쓸 때 자유도를 함께 맞바꾸는 것이 핵심이다. (c)는 자유도를 그대로 둔 채 역수만 취해 아래쪽 임계값을 \(1/F_{\alpha/2,\,d_1,d_2}\)로 잡았을 때 실제로 어느 정도를 기각하게 되는지 계산한 것이다. \((d_1,d_2)=(4,20)\)에서는 명목 5%가 실제로 14.05%가 되고 \((9,40)\)에서는 10.16%가 되며, 반대로 \((20,4)\)에서는 2.53%, \((40,9)\)에서는 2.78%로 지나치게 보수적이 된다. 위험한 대목은 \(d_1 = d_2\)일 때다. 이때는 두 자유도가 같아 맞바꿀 것이 없으므로 잘못 계산해도 수준이 정확히 0.0500으로 나온다. 표본크기가 같은 보기에서만 연습하면 이 실수가 드러나지 않은 채 남아 있다가, 표본크기가 다른 실제 자료에서 처음으로 대가를 치른다.

양측검정의 관례

흔한 단순화는 더 큰 표본분산을 분자에 두어 \(F \geq 1\)이 되게 하는 것이다. 그러면 오른쪽 꼬리만 확인하면 되고, \(F > F_{\alpha/2, d_1, d_2}\)이면 \(H_0\)을 기각한다.

수치 보기

한 제조사가 두 기계의 일관성을 비교한다. 기계 A는 \(n_1 = 10\)개를 생산했고 표본분산이 \(S_1^2 = 4.2\), 기계 B는 \(n_2 = 12\)개를 생산했고 표본분산이 \(S_2^2 = 1.8\)이다. \(\alpha = 0.05\)에서 \(H_0: \sigma_1^2 = \sigma_2^2\) 대 \(H_1: \sigma_1^2 \neq \sigma_2^2\)을 검정하라.

검정통계량은

\[ F = \frac{S_1^2}{S_2^2} = \frac{4.2}{1.8} = 2.333 \]

자유도는 \(d_1 = 9\), \(d_2 = 11\)이다. 임계값은 \(F_{0.025, 9, 11} \approx 3.59\)이다. \(2.333 < 3.59\)이므로 5% 유의수준에서 \(H_0\)을 기각하지 못한다. 두 기계의 변동성이 다르다고 결론지을 증거가 부족하다.

주의: 비정규성에 대한 민감성

F-검정은 정규성에서 벗어나는 데 극도로 민감하다. 바탕 모집단에 약한 치우침이나 두꺼운 꼬리만 있어도 실제 제1종 오류율이 명목 수준 \(\alpha\)를 훨씬 넘을 수 있다. 모의실험 연구들은 적당히 치우친 분포에서 \(H_0\) 아래의 참 기각률이 명목값의 두세 배가 될 수 있음을 보였다.

이런 취약함 때문에 실무에서는 더 로버스트한 대안을 선호한다:

  • Levene 검정은 각 관측값을 집단 평균(또는 중앙값)으로부터의 절대편차로 바꾼 뒤 그 편차에 표준적인 분산분석 F-검정을 적용한다. 비정규성에 로버스트하다.
  • Brown-Forsythe 검정은 평균 대신 집단 중앙값으로부터의 편차를 쓰는 Levene 검정의 변형으로, 치우친 분포에서 한층 더 로버스트하다.

F-검정을 언제 쓸 것인가

(Shapiro-Wilk 검정이나 Q-Q 그림 등으로) 두 모집단이 모두 정규라는 강한 증거가 있을 때만 고전적인 F-검정을 쓰라. 그렇지 않으면 Levene이나 Brown-Forsythe 검정을 택하라.

연습문제

연습문제 1. 정규모집단에서 뽑은 독립인 두 표본에서 \(s_1^2 = 25\) (\(n_1 = 16\)), \(s_2^2 = 10\) (\(n_2 = 21\))을 얻었다. \(\alpha = 0.05\)에서 \(H_0: \sigma_1^2 = \sigma_2^2\) 대 \(H_a: \sigma_1^2 \neq \sigma_2^2\)을 검정하라.

풀이

F-통계량은:

\[ F = \frac{s_1^2}{s_2^2} = \frac{25}{10} = 2.5 \]

\(H_0\) 아래에서 \(F \sim F_{n_1 - 1, n_2 - 1} = F_{15, 20}\)이다.

\(\alpha = 0.05\)의 양측검정에서 임계값은 \(F_{0.025, 15, 20} \approx 2.57\)과 \(F_{0.975, 15, 20} \approx 1/F_{0.025, 20, 15} \approx 1/2.76 \approx 0.362\)이다.

\(0.362 < 2.5 < 2.57\)이므로 검정통계량이 채택역 안에 있다. 5% 수준에서 \(H_0\)을 기각하지 못한다. 분산이 다르다고 결론지을 증거가 부족하다.

연습문제 2. 두 분산을 비교하는 F-검정이 정규성에서 벗어나는 데 민감한 이유를 설명하라. 어떤 대안 검정이 더 로버스트한가?

풀이

F-검정은 \(H_0\) 아래에서 비 \(s_1^2/s_2^2\)가 F-분포를 따른다는 데 기대며, 이는 두 모집단이 정확히 정규일 것을 요구한다. 표본분산은 (편차의 제곱을 쓰므로) 두꺼운 꼬리와 이상점에 민감하고, 그 비의 F-분포는 특히 취약하다: 정규성에서 조금만 벗어나도 제1종 오류율이 크게 부풀 수 있다.

모의실험 연구에 따르면 꼬리가 두꺼운 분포(예: 자유도가 작은 \(t\)-분포)에서는 명목 \(\alpha = 0.05\)인 F-검정의 실제 기각률이 15–20%를 넘을 수 있다.

로버스트한 대안:

  • Levene 검정: 집단 평균으로부터의 절대편차에 기반한다.
  • Brown-Forsythe 검정: 집단 중앙값으로부터의 절대편차에 기반한다(더 로버스트하다).
  • Bartlett 검정: 정규성 아래에서 검정력이 더 크지만 비정규성에는 역시 민감하다.

연습문제 3. 표본분산의 카이제곱분포에서 F-검정통계량을 유도하라. 즉 정규성 아래에서 \((s_1^2/\sigma_1^2)/(s_2^2/\sigma_2^2) \sim F_{n_1-1, n_2-1}\)임을 보여라.

풀이

정규성 아래에서:

\[ \frac{(n_1-1)s_1^2}{\sigma_1^2} \sim \chi^2_{n_1-1}, \quad \frac{(n_2-1)s_2^2}{\sigma_2^2} \sim \chi^2_{n_2-1} \]

이고 (표본이 독립이므로) 둘은 독립이다. 정의에 의해 각각을 자유도로 나눈 독립인 두 카이제곱 확률변수의 비는 F-분포를 따른다:

\[ F = \frac{\chi^2_{n_1-1}/(n_1-1)}{\chi^2_{n_2-1}/(n_2-1)} = \frac{s_1^2/\sigma_1^2}{s_2^2/\sigma_2^2} \]

\(H_0: \sigma_1^2 = \sigma_2^2\) 아래에서 이는 \(F = s_1^2/s_2^2 \sim F_{n_1-1, n_2-1}\)로 간단해진다. \(\square\)

연습문제 4. \(F = s_1^2/s_2^2 \sim F_{d_1, d_2}\)이면 \(1/F = s_2^2/s_1^2 \sim F_{d_2, d_1}\)임을 보여라. 이 성질이 양측검정에서 왜 중요한가?

풀이

독립인 \(U \sim \chi^2_{d_1}\), \(V \sim \chi^2_{d_2}\)에 대해 \(F = (U/d_1)/(V/d_2)\)이면,

\[ \frac{1}{F} = \frac{V/d_2}{U/d_1} \sim F_{d_2, d_1} \]

이다. 분자와 분모의 역할을 바꾼 F-분포의 정의에서 곧바로 나온다.

F-분포가 대칭이 아니므로 이 성질이 양측검정에서 중요하다. 아래쪽 임계값 \(F_{1-\alpha/2, d_1, d_2}\)은 \(1/F_{\alpha/2, d_2, d_1}\)로 계산할 수 있는데, 많은 표가 위쪽 꼬리 임계값만 제공하므로 유용하다. 또한 이 때문에 관례적으로 더 큰 분산을 분자에 두어(\(F \geq 1\)) 양측검정을 위쪽 꼬리만 보는 형태로 바꾼다.

연습문제 5. 연습문제 2의 "실제 기각률이 15~20%를 넘을 수 있다"는 주장을 모의실험으로 확인하라. 여러 분포에서 F 검정과 로버스트 대안들의 제1종 오류율을 비교하라.

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(2024)
M, n1, n2 = 20_000, 20, 20

def gen(name, size):
    if name == "정규":    return rng.standard_normal(size)
    if name == "균등":    return rng.uniform(-1, 1, size)
    if name == "t(5)":    return rng.standard_t(5, size)
    if name == "지수":    return rng.exponential(1, size)
    if name == "로그정규": return rng.lognormal(0, 1, size)

print(f"{'분포':>8s} {'F 검정':>8s} {'Levene':>8s} {'B-F':>8s} {'Bartlett':>9s}")
for name in ["정규", "균등", "t(5)", "지수", "로그정규"]:
    f = lev = bf = bar = 0
    for _ in range(M):
        x, y = gen(name, n1), gen(name, n2)     # 두 분산이 실제로 같다
        F = x.var(ddof=1) / y.var(ddof=1)
        p = 2 * min(stats.f.cdf(F, n1 - 1, n2 - 1),
                    stats.f.sf(F, n1 - 1, n2 - 1))
        f   += p < 0.05
        lev += stats.levene(x, y, center='mean').pvalue < 0.05
        bf  += stats.levene(x, y, center='median').pvalue < 0.05
        bar += stats.bartlett(x, y).pvalue < 0.05
    print(f"{name:>8s} {f / M:8.4f} {lev / M:8.4f} "
          f"{bf / M:8.4f} {bar / M:9.4f}")
      분포     F 검정   Levene      B-F  Bartlett
      정규   0.0491   0.0539   0.0386    0.0491
      균등   0.0046   0.0556   0.0344    0.0046
    t(5)   0.1590   0.0559   0.0395    0.1590
      지수   0.2677   0.1438   0.0465    0.2677
    로그정규   0.4813   0.1905   0.0391    0.4813

주장이 오히려 보수적이었다.

분포 F 검정 진단
정규 0.0491 정확
균등(첨도 \(<3\)) 0.0046 극단적으로 보수적
\(t(5)\)(첨도 \(>3\)) 0.1590 명목의 3배
지수 0.2677 명목의 5배
로그정규 0.4813 명목의 10배

로그정규에서는 두 분산이 정확히 같은데도 절반 가까이 기각한다. 이 검정은 쓸 수 없다.

첨도가 원인이다. \(S^2\)의 분산은 모집단 첨도 \(\beta_2\)에 의존한다.

\[ \operatorname{Var}(S^2)=\frac{\sigma^4}{n}\Bigl(\beta_2-\frac{n-3}{n-1}\Bigr) \]

F 분포는 정규의 \(\beta_2=3\)을 전제로 유도됐다. 첨도가 크면 \(S^2\)이 실제보다 훨씬 많이 흔들리는데 F 분포는 그 흔들림을 모르므로 과대기각한다. 첨도가 작으면(균등의 \(\beta_2=1.8\)) 반대로 과소기각한다.

따라서 "F 검정은 항상 과대기각한다"는 말은 틀렸다. 첨도의 방향에 따라 양쪽으로 어긋난다. 어느 쪽이든 믿을 수 없다는 것이 요점이다.

로버스트 대안의 성적.

  • 브라운·포사이드(중앙값 기준 Levene, center='median'): 모든 분포에서 0.034~0.047. 유일하게 안전하다. 다만 약간 보수적이다.
  • Levene(평균 기준): 대칭분포에서는 좋지만 치우친 분포에서 무너진다(로그정규 0.1905).
  • 바틀렛: F 검정과 완전히 같은 결과를 냈다. 두 집단이고 \(n_1=n_2\)이면 두 검정이 \(|\log(S_1^2/S_2^2)|\)의 단조함수로 동치이기 때문이다. 따라서 바틀렛은 로버스트한 대안이 아니다.

권고. 분산 비교가 필요하면 브라운·포사이드를 쓴다. F 검정은 정규성을 따로 확인했을 때만 쓴다.

연습문제 6. "큰 분산을 분자에 둔다"는 관례를 쓸 때 임계값을 어떻게 잡아야 하는가? 잘못 잡으면 어떻게 되는지 모의실험으로 보여라.

풀이

관례의 내용. \(F=\max(S_1^2,S_2^2)/\min(S_1^2,S_2^2)\ge1\)로 두면 위쪽 꼬리만 보면 된다. 표가 위쪽 임계값만 싣던 시절의 실용적 장치다.

함정. 이렇게 만든 \(F\)는 \(F_{d_1,d_2}\)를 따르지 않는다. 두 비 중 큰 쪽을 고른 최댓값이기 때문이다. 그런데도 상단 \(\alpha\) 임계값을 쓰면 수준이 두 배가 된다.

import numpy as np
from scipy import stats

rng = np.random.default_rng(11)
M, n1, n2 = 50_000, 15, 15
a = b = c = 0
for _ in range(M):
    x, y = rng.standard_normal(n1), rng.standard_normal(n2)
    s1, s2 = x.var(ddof=1), y.var(ddof=1)

    if s1 >= s2:                        # 큰 쪽을 분자로
        F, d1, d2 = s1 / s2, n1 - 1, n2 - 1
    else:
        F, d1, d2 = s2 / s1, n2 - 1, n1 - 1

    a += F > stats.f.ppf(0.95, d1, d2)    # ① 상단 0.05  ← 흔한 실수
    b += F > stats.f.ppf(0.975, d1, d2)   # ② 상단 0.025 ← 올바름

    F_fixed = s1 / s2                     # ③ 분자를 고정한 정식 양측
    p = 2 * min(stats.f.cdf(F_fixed, n1 - 1, n2 - 1),
                stats.f.sf(F_fixed, n1 - 1, n2 - 1))
    c += p < 0.05

print(f"① 큰 쪽 분자 + 상단 0.05   기각률 {a / M:.4f}")
print(f"② 큰 쪽 분자 + 상단 0.025  기각률 {b / M:.4f}")
print(f"③ 분자 고정 + 정식 양측    기각률 {c / M:.4f}")
① 큰 쪽 분자 + 상단 0.05   기각률 0.1008
② 큰 쪽 분자 + 상단 0.025  기각률 0.0508
③ 분자 고정 + 정식 양측    기각률 0.0508

①은 수준이 정확히 두 배(0.101)다. ②와 ③은 일치한다.

왜 정확히 두 배인가. \(H_0\) 아래에서 \(S_1^2>S_2^2\)와 \(S_1^2<S_2^2\)가 각각 확률 \(1/2\)이고, 두 경우가 대칭이다. "큰 쪽/작은 쪽"의 비가 상단 \(\alpha\) 임계값을 넘을 확률은

\[ P\Bigl(\tfrac{S_1^2}{S_2^2}>c\Bigr)+P\Bigl(\tfrac{S_2^2}{S_1^2}>c\Bigr)=2\alpha \]

가 된다. 두 꼬리를 한 꼬리인 척 본 것이다.

실무 규칙.

  1. 관례를 쓸 거면 \(\alpha/2\) 임계값을 쓴다.
  2. 단측검정에는 관례를 쓰면 안 된다. "1군의 분산이 더 크다"를 검정하려면 분자를 가설이 정한 대로 고정해야 한다. 자료를 보고 큰 쪽을 분자로 올리면 그 순간 단측검정이 아니다.
  3. 소프트웨어를 쓰면 이 문제가 없다. scipy로 양측 \(p\)를 직접 계산하면 된다.

연습문제 7. 분산비 \(\sigma_1^2/\sigma_2^2\)의 신뢰구간을 유도하고, 연습문제 1의 자료에 적용하라. 구간의 포함률이 비정규성에서 어떻게 되는지도 확인하라.

풀이

유도. 연습문제 3에서

\[ \frac{S_1^2/\sigma_1^2}{S_2^2/\sigma_2^2}\sim F_{d_1,d_2}, \qquad d_1=n_1-1,\ d_2=n_2-1 \]

이므로

\[ P\Bigl(F_{\alpha/2,d_1,d_2}<\frac{S_1^2/S_2^2}{\sigma_1^2/\sigma_2^2}<F_{1-\alpha/2,d_1,d_2}\Bigr)=1-\alpha \]

이고, 가운데를 \(\sigma_1^2/\sigma_2^2\)에 대해 풀면

\[ \frac{S_1^2/S_2^2}{F_{1-\alpha/2,d_1,d_2}}<\frac{\sigma_1^2}{\sigma_2^2}<\frac{S_1^2/S_2^2}{F_{\alpha/2,d_1,d_2}} \]

나누는 임계값의 첨자가 뒤집힌다는 점에 주의한다.

import numpy as np
from scipy import stats

s1sq, n1 = 25.0, 16
s2sq, n2 = 10.0, 21
F = s1sq / s2sq
d1, d2 = n1 - 1, n2 - 1
lo = F / stats.f.ppf(0.975, d1, d2)
hi = F / stats.f.ppf(0.025, d1, d2)
print(f"F = {F}")
print(f"σ1²/σ2² 의 95% 구간  ({lo:.4f}, {hi:.4f})")
print(f"σ1/σ2   의 95% 구간  ({np.sqrt(lo):.4f}, {np.sqrt(hi):.4f})")
F = 2.5
σ1²/σ2² 의 95% 구간  (0.9716, 6.8898)
σ1/σ2   의 95% 구간  (0.9857, 2.6248)

구간이 1을 아슬아슬하게 포함한다(하한 0.972). 연습문제 1에서 기각하지 못한 것과 일치한다.

구간이 훨씬 많은 것을 말해 준다. \(p>0.05\)만 보면 "분산이 같을지도"로 끝나지만, 구간은 비가 0.97배에서 6.9배 사이라고 알려준다. 7배까지 가능한 상황에서 "분산이 같다"고 가정하는 것은 무모하다. 기각하지 못한 것을 등분산의 근거로 삼으면 안 된다는 점이 여기서 분명해진다.

표준편차 척도로 보는 편이 해석하기 쉽다. 제곱근을 취해 \((0.99,\ 2.62)\)다.

비정규성에서의 포함률.

rng = np.random.default_rng(5)
M = 20_000
for name, gen in [("정규", lambda n: rng.standard_normal(n)),
                  ("t(5)", lambda n: rng.standard_t(5, n)),
                  ("균등", lambda n: rng.uniform(-1, 1, n))]:
    cov = 0
    for _ in range(M):
        x, y = gen(16), gen(21)          # 참 비 = 1
        f = x.var(ddof=1) / y.var(ddof=1)
        l = f / stats.f.ppf(0.975, 15, 20)
        h = f / stats.f.ppf(0.025, 15, 20)
        cov += (l <= 1 <= h)
    print(f"{name:>5s}  포함률 {cov / M:.4f}")
   정규  포함률 0.9497
 t(5)  포함률 0.8462
   균등  포함률 0.9940

검정과 같은 병을 앓는다. 이 구간도 \(F\) 분포에 의존하므로 \(t(5)\)에서 포함률이 0.846까지 떨어진다. 분산비의 구간 추정도 정규성 없이는 믿을 수 없다.

대안. 붓스트랩(특히 BCa)이나 보넷(2006)의 첨도 보정 구간을 쓴다.

연습문제 8. F 검정의 검정력을 계산하고, 주어진 분산비를 탐지하는 데 필요한 표본크기를 구하라. 결과가 시사하는 바를 논하라.

풀이

검정력 공식. 참 비를 \(r=\sigma_1^2/\sigma_2^2\)라 하면 \(\dfrac{S_1^2/S_2^2}{r}\sim F_{d_1,d_2}\)이므로

\[ \text{검정력}=P\Bigl(\frac{F_{d_1,d_2}\cdot r}{1}<F_{\alpha/2}\Bigr)+P\bigl(F_{d_1,d_2}\cdot r>F_{1-\alpha/2}\bigr) \]

비중심 분포가 필요 없다. 중심 \(F\) 분포를 \(r\)만큼 늘여 보면 된다.

from scipy import stats

def power_F(n1, n2, ratio, alpha=0.05):
    """참 분산비가 ratio 일 때 양측 F 검정의 검정력."""
    d1, d2 = n1 - 1, n2 - 1
    lo = stats.f.ppf(alpha / 2, d1, d2)
    hi = stats.f.ppf(1 - alpha / 2, d1, d2)
    return stats.f.cdf(lo / ratio, d1, d2) + stats.f.sf(hi / ratio, d1, d2)

print(f"{'군당 n':>7s} {'비=1.5':>8s} {'비=2':>8s} {'비=3':>8s} {'비=4':>8s}")
for n in [10, 20, 30, 50, 100, 200]:
    row = " ".join(f"{power_F(n, n, r):8.4f}" for r in [1.5, 2, 3, 4])
    print(f"{n:7d} {row}")

print()
for r in [1.5, 2, 3, 4]:
    for n in range(4, 5_000):
        if power_F(n, n, r) >= 0.80:
            print(f"분산비 {r} 탐지에 필요한 군당 표본 {n}개 (검정력 80%)")
            break
   군당 n    비=1.5      비=2      비=3      비=4
     10   0.0854   0.1584   0.3347   0.4964
     20   0.1352   0.3083   0.6441   0.8375
     30   0.1862   0.4478   0.8285   0.9559
     50   0.2880   0.6703   0.9673   0.9976
    100   0.5183   0.9293   0.9997   1.0000
    200   0.8140   0.9982   1.0000   1.0000

분산비 1.5 탐지에 필요한 군당 표본 193개 (검정력 80%)
분산비 2 탐지에 필요한 군당 표본 68개 (검정력 80%)
분산비 3 탐지에 필요한 군당 표본 28개 (검정력 80%)
분산비 4 탐지에 필요한 군당 표본 19개 (검정력 80%)

분산 검정은 평균 검정보다 훨씬 둔하다. 표준편차가 1.5배 차이나면(분산비 2.25) 군당 50개로도 검정력이 0.67에 못 미친다. 평균 비교에서는 같은 표본으로 중간 크기 효과를 충분히 잡는다.

왜 그런가. \(S^2\)의 상대표준오차가 대략 \(\sqrt{2/(n-1)}\)인데, 이는 \(\bar X\)의 상대표준오차보다 훨씬 느리게 줄어든다. 분산은 2차 모멘트라 정보가 적다.

이것이 등분산 사전검정의 치명적 약점이다. 군당 10개에서 분산비 2를 탐지할 확률이 0.158이다. 즉

  • 분산이 실제로 2배 달라도 84%의 확률로 "같다"고 넘어간다.
  • 그러고는 합동 \(t\) 검정을 쓴다.

"기각하지 못함"이 "같음"의 근거가 될 수 없다는 원칙이 여기서 가장 뼈아프게 적용된다.

거꾸로, \(n\)이 아주 크면 실질적으로 무의미한 차이(비 1.05)도 유의해진다. 그러면 이번엔 불필요하게 합동 \(t\)를 버린다. 어느 쪽이든 사전검정은 제 역할을 못 한다.

연습문제 9. "먼저 F 검정으로 등분산을 확인하고, 통과하면 합동 \(t\) 검정, 아니면 웰치 검정"이라는 2단계 절차의 제1종 오류율을 모의실험으로 조사하라.

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(31)
M = 20_000

print(f"{'n1,n2':>9s} {'σ2/σ1':>7s} {'합동 t':>8s} {'Welch':>8s} {'2단계':>8s}")
for n1, n2 in [(10, 10), (10, 30), (30, 10)]:
    for r in [1.0, 2.0, 4.0]:
        a = b = c = 0
        for _ in range(M):
            x = rng.standard_normal(n1)          # 두 평균이 같다 (H0 참)
            y = rng.standard_normal(n2) * r
            p_pool = stats.ttest_ind(x, y, equal_var=True).pvalue
            p_welch = stats.ttest_ind(x, y, equal_var=False).pvalue
            s1, s2 = x.var(ddof=1), y.var(ddof=1)
            F = s1 / s2
            p_F = 2 * min(stats.f.cdf(F, n1 - 1, n2 - 1),
                          stats.f.sf(F, n1 - 1, n2 - 1))
            p_two = p_welch if p_F < 0.05 else p_pool   # 2단계 절차
            a += p_pool < 0.05
            b += p_welch < 0.05
            c += p_two < 0.05
        print(f"{n1:4d},{n2:<4d} {r:7.1f} {a / M:8.4f} "
              f"{b / M:8.4f} {c / M:8.4f}")
    n1,n2   σ2/σ1     합동 t    Welch      2단계
  10,10       1.0   0.0527   0.0517   0.0524
  10,10       2.0   0.0530   0.0490   0.0502
  10,10       4.0   0.0609   0.0503   0.0507
  10,30       1.0   0.0488   0.0495   0.0503
  10,30       2.0   0.0089   0.0491   0.0392
  10,30       4.0   0.0029   0.0476   0.0476
  30,10       1.0   0.0512   0.0525   0.0530
  30,10       2.0   0.1499   0.0529   0.0717
  30,10       4.0   0.2402   0.0476   0.0483

웰치는 아홉 칸 모두에서 0.048~0.053이다. 흠잡을 데가 없다.

합동 \(t\)는 표본크기가 다를 때 무너진다.

표에서 \(r = \sigma_2/\sigma_1\)이므로 분산이 큰 쪽은 언제나 둘째 표본, 곧 \(n_2\)인 쪽이다.

  • 큰 표본에 큰 분산(\(n_1{=}10\), \(n_2{=}30\) · \(r=2\)): 0.0089로 극단적으로 보수적.
  • 작은 표본에 큰 분산(\(n_1{=}30\), \(n_2{=}10\) · \(r=2\)): 0.1499로 명목의 3배. 위험하다.

방향이 이렇게 갈리는 이유는 합동분산 \(S_p^2\)이 자유도로 가중하기 때문이다. 큰 표본의 분산이 크면 \(S_p^2\)이 작은 집단의 참분산보다 과대평가되어 표준오차가 부풀고 검정이 보수적이 되며, 작은 표본의 분산이 크면 그 큰 분산이 가중에서 밀려나 표준오차가 과소평가되고 검정이 자유로워진다. - \(n_1=n_2\)이면 \(r=4\)에서도 0.0609로 견딜 만하다. 합동 \(t\)가 "동일 표본크기에서는 로버스트하다"는 말의 근거다.

2단계 절차는 절반만 고친다. 가장 나쁜 칸(\(n_1{=}30\), \(n_2{=}10\) · \(r=2\))에서 0.1499를 0.0717로 낮췄지만 여전히 명목의 1.4배다. (\(n_1{=}10\), \(n_2{=}30\) · \(r=2\))에서는 0.0392로 이번엔 지나치게 보수적이다.

왜 못 고치는가. 앞 문제의 검정력 공식을 \(n_1=30\), \(n_2=10\)에 적용하면 분산비 \(4\)(\(r=2\))를 탐지할 확률이 \(0.62\)다. 분산 차이를 놓친 나머지 38%가 그대로 합동 \(t\)로 넘어가 오류를 만든다. 게다가

  1. 선택 자체가 조건화를 만든다. "F가 유의하지 않았다"는 조건 아래에서는 \(S_1^2/S_2^2\)가 1 근처로 잘려 있고, 그 조건부 분포에서 합동 \(t\)가 명목 수준을 지키지 않는다.
  2. 두 단계가 같은 자료를 쓴다. 사전검정과 본검정이 독립이 아니다.

결론 — 사전검정하지 말고 그냥 웰치를 쓴다.

합동 \(t\) 2단계 웰치
등분산일 때 검정력 최선 최선에 근접 거의 같음
이분산일 때 수준 무너짐 어긋남 정확
절차의 단순함 단순 복잡 단순

등분산일 때 웰치가 잃는 검정력은 미미하다. 잃을 것이 거의 없고 얻을 것이 많다. 오늘날 scipy, R 모두 웰치를 기본값으로 삼는 이유다.

연습문제 10. 지금까지의 결과를 모아, 분산 비교가 필요한 실제 상황과 그때의 절차를 정리하라.

풀이

먼저 물을 것 — 분산 차이가 정말 연구 질문인가, 아니면 다른 검정의 가정 확인인가?

분산을 비교하려는 목적은?
    │
    ├─ 평균 검정의 가정 확인 ──────→ 하지 마라. 웰치를 쓴다.
    │                                (연습문제 9)
    │
    ├─ 분산 자체가 연구 질문
    │      │
    │      ├─ 자료가 정규에 가까운가
    │      │      ├─ 예 ────────→ F 검정 + 분산비 신뢰구간
    │      │      └─ 아니오 ────→ 브라운·포사이드 + 붓스트랩 구간
    │      │
    │      └─ 표본이 충분한가 (분산비 2에 군당 68개)
    │             └─ 아니면 "결정 불가"로 보고
    │
    └─ 이상점·꼬리가 진짜 관심 ───→ 분위수 비교, 로버스트 산포 측도

분산 자체가 연구 질문인 예.

분야 질문
품질관리 새 공정이 기존보다 일관적인가
교육 새 교수법이 성취도 격차를 줄이는가
금융 두 자산의 변동성이 다른가
의학 약물 반응의 개인차가 큰가(맞춤의학의 근거)
측정 두 기기의 재현성이 같은가

이런 경우 분산은 부차적 가정이 아니라 주된 결과다.

절차 여섯 단계.

  1. 자료를 그린다. 상자그림과 정규분위수그림. 이상점 하나가 \(S^2\)을 지배하는지 본다.
  2. 정규성을 판단한다. 검정보다 그림이 낫다. 치우침과 꼬리를 본다.
  3. 검정을 고른다. 정규에 가까우면 F, 아니면 브라운·포사이드.
  4. 구간을 함께 보고한다. \(p\)만으로는 "얼마나 다른가"를 알 수 없다.
  5. 표준편차 척도로 해석한다. 분산비 4는 표준편차 2배다. 독자가 이해하기 쉽다.
  6. 표본이 작으면 한계를 명시한다. 군당 20개로는 분산비 2를 30%만 잡는다.

자주 하는 실수 다섯.

  1. "\(p>0.05\)이니 등분산" — 연습문제 7·8에서 본 가장 흔하고 가장 해로운 오해.
  2. 큰 쪽을 분자에 두고 상단 \(\alpha\) 임계값 사용 — 수준이 두 배(연습문제 6).
  3. 비정규 자료에 F 검정 — 로그정규에서 수준 0.48(연습문제 5).
  4. 이상점 제거 후 재검정 — 분산 비교에서 이상점은 제거 대상이 아니라 자료의 일부일 때가 많다.
  5. 분산비와 표준편차비를 혼동 — 분산비 4를 "4배 차이"로 읽으면 안 된다. 표준편차로는 2배다.

한 문장. 분산 비교는 평균 비교보다 훨씬 까다롭다. 정규성에 예민하고, 검정력이 낮으며, 해석도 덜 직관적이다. 그러므로 정말 필요한 때만 하고, 가정 확인용으로는 아예 하지 않는다.


정리하며

\(F\) 검정은 두 분산의 비를 검정한다.

\[ F=\frac{s_1^2}{s_2^2}\sim F_{n_1-1,\,n_2-1}\quad (H_0\text{ 아래}) \]
  • 정규성이 절대적으로 필요하다. 이 검정은 비정규성에 악명 높을 만큼 민감하며, 꼬리가 조금만 두꺼워도 제1종 오류율이 크게 부풀어 오른다.
  • 그래서 "합동 \(t\) 검정의 사전 확인용"으로 쓰면 안 된다. 사전 검정 자체가 신뢰할 수 없는 데다 2단계 절차가 오류율을 왜곡한다. 그냥 웰치를 쓰는 편이 낫다.
  • 큰 분산을 분자에 두는 관례가 있으며, 그러면 우측 꼬리만 보면 된다. 양측 \(p\) 값은 두 배 한다.
  • 정당한 용도는 분산 자체가 관심사일 때다. 두 공정의 변동 비교, 처리가 평균이 아니라 변동성에 영향을 주는지 확인하는 경우가 그렇다.
  • 로버스트 대안을 쓰라. 레빈 검정이나 브라운–포사이드 검정이 정규성에 훨씬 덜 민감하며, 15장에서 다룬다.

다음 절 이표본 검정 개관에서 지금까지의 검정을 정리한다.