콘텐츠로 이동

모분산에 대한 카이제곱 검정

개요

제조 현장에서 공정의 변동성을 통제하는 일은 공정 평균을 통제하는 일만큼 중요할 때가 많다. 볼트의 평균 지름은 목표에 맞지만 분산이 지나치게 큰 기계는 공차를 벗어난 부품을, 따라서 불량품을 너무 많이 만든다. 마찬가지로 금융에서 투자자는 포트폴리오 수익률의 변동성이 특정 문턱을 넘는지 검정하고 싶을 수 있다. 분산에 대한 카이제곱 검정은 모분산 \(\sigma^2\)이 가설의 값 \(\sigma_0^2\)과 같은지, 크거나 작은지를 검정하는 형식적 절차이다. 약한 비정규성에 비교적 로버스트한 평균 검정과 달리 이 검정은 정규분포에서 벗어나는 데 매우 민감하다.

가설

\(X_1, X_2, \ldots, X_n\)을 \(N(\mu, \sigma^2)\) 모집단에서 뽑은 확률표본이라 하자. 귀무가설은 분산의 특정 값을 지정한다:

\[ H_0\colon \sigma^2 = \sigma_0^2 \]

대립가설은 연구 질문에 따라 다음 세 형태 중 하나이다:

대립가설 해석
\(H_1\colon \sigma^2 \neq \sigma_0^2\) 양측: 분산이 \(\sigma_0^2\)과 다르다
\(H_1\colon \sigma^2 > \sigma_0^2\) 우측: 분산이 \(\sigma_0^2\)보다 크다
\(H_1\colon \sigma^2 < \sigma_0^2\) 좌측: 분산이 \(\sigma_0^2\)보다 작다

검정통계량

검정통계량은 표본분산 \(S^2\)이 가설의 값 \(\sigma_0^2\)에서 얼마나 떨어져 있는지를 자유도로 축척하여 잰다. 직관적으로 \(\sigma^2 = \sigma_0^2\)이면 \(S^2\)이 \(\sigma_0^2\)에 가까워야 하고, 비 \((n-1)S^2 / \sigma_0^2\)은 (\(\chi^2_{n-1}\) 분포의 평균인) \(n-1\)에 가까워야 한다.

\[ \chi^2 = \frac{(n-1)S^2}{\sigma_0^2} \]

\(H_0\)과 정규성 가정 아래에서 이 통계량은 자유도 \(n - 1\)인 카이제곱분포를 따른다:

\[ \chi^2 = \frac{(n-1)S^2}{\sigma_0^2} \sim \chi^2_{n-1} \]

이 결과는 \((n-1)S^2/\sigma^2 = \sum_{i=1}^n (X_i - \bar{X})^2/\sigma^2\)이 선형 제약 하나(편차의 합이 0)를 받는 표준정규 제곱들의 합이어서 자유도가 \(n-1\)이 된다는 사실에서 나온다.

기각역

유의수준 \(\alpha\)에서 기각역은 대립가설에 따라 달라진다.

양측 (\(H_1\colon \sigma^2 \neq \sigma_0^2\)): 다음이면 \(H_0\)을 기각한다.

\[ \chi^2 < \chi^2_{1-\alpha/2,\, n-1} \quad \text{or} \quad \chi^2 > \chi^2_{\alpha/2,\, n-1} \]

우측 (\(H_1\colon \sigma^2 > \sigma_0^2\)): 다음이면 \(H_0\)을 기각한다.

\[ \chi^2 > \chi^2_{\alpha,\, n-1} \]

좌측 (\(H_1\colon \sigma^2 < \sigma_0^2\)): 다음이면 \(H_0\)을 기각한다.

\[ \chi^2 < \chi^2_{1-\alpha,\, n-1} \]

여기서 \(\chi^2_{p,\, n-1}\)은 \(P(\chi^2_{n-1} \leq \chi^2_{p,\, n-1}) = p\)를 만족하는 값, 즉 카이제곱분포의 \(p\) 분위수이다.

카이제곱분포의 비대칭성

정규분포나 \(t\)-분포와 달리 카이제곱분포는 대칭이 아니다. 따라서 양측 기각역은 아래쪽 꼬리와 위쪽 꼬리에 서로 다른 임계값을 쓰며, 양측검정을 단순한 절댓값 조건으로 나타낼 수 없다.

풀이 보기

한 제조사가 시리얼 상자 충전 중량의 분산이 \(\sigma_0^2 = 4\) 그램\(^2\)(즉 \(\sigma_0 = 2\) 그램)이라고 주장한다. 품질검사자가 상자 \(n = 25\)개를 표본으로 뽑아 표본분산 \(S^2 = 6.1\) 그램\(^2\)을 얻었다. \(\alpha = 0.05\)에서 분산이 주장된 값을 넘는지 검정하라.

1단계. 가설을 세운다:

\[ H_0\colon \sigma^2 = 4 \qquad H_1\colon \sigma^2 > 4 \]

2단계. 검정통계량을 계산한다:

\[ \chi^2 = \frac{(25 - 1)(6.1)}{4} = \frac{24 \times 6.1}{4} = \frac{146.4}{4} = 36.6 \]

3단계. 임계값을 구한다. 자유도 24, \(\alpha = 0.05\)의 우측검정에서:

\[ \chi^2_{0.05,\, 24} = 36.415 \]

4단계. 판정한다. \(\chi^2 = 36.6 > 36.415\)이므로 \(H_0\)을 기각한다. 5% 수준에서 모분산이 4 그램\(^2\)을 넘는다고 결론지을 충분한 증거가 있다.

\(p\)-값은 \(P(\chi^2_{24} > 36.6) \approx 0.048\)이다.

가정과 민감성

카이제곱 분산 검정에는 다음이 필요하다:

  • 정규성: 모집단이 정규분포를 따라야 한다. 가장 결정적인 가정이다.
  • 확률표본추출: 관측값이 독립이고 동일한 분포를 따라야 한다.
  • \(\sigma_0^2\)이 주어짐: 가설의 분산 \(\sigma_0^2\)은 자료에서 추정한 값이 아니라 지정된 값이다.

정규성이 깨지면 오류율이 어떻게 되는가

모집단만 바꿔 가며 같은 검정을 되풀이한 결과다. 참 분산을 그대로 \(\sigma_0^2\)에 넣었으므로 네 곡선 모두 \(0.05\)에 있어야 한다. 실제로는 정규모집단에서만 그렇다.

지수모집단에서 명목 5% 검정이 실제로는 32%를, 로그정규에서는 69%를 기각한다. 대칭이지만 꼬리가 얇은 균등모집단에서는 반대로 거의 기각하지 않아(\(0.00\)) 검정력을 잃는다. 어느 쪽이든 약속한 수준이 지켜지지 않는다.

가장 중요한 것은 곡선들이 \(n\)이 커져도 \(0.05\)로 돌아오지 않는다는 점이다. 오히려 지수모집단에서는 \(0.23 \to 0.32\)로 올라간다. 중심극한정리가 구해 주는 것은 표본평균이지 표본분산이 아니며, \((n-1)S^2/\sigma^2 \sim \chi^2\)이라는 명제 자체가 정규성에서 나온 것이라 표본을 늘려도 되살아나지 않는다. 5.9절에서 분산비에 대한 \(F\) 검정을 두고 같은 이야기를 했다.

비정규성에 대한 극도의 민감성

분산에 대한 카이제곱 검정은 정규성에서 벗어나는 데 로버스트하지 않다. 약한 치우침이나 두꺼운 꼬리만으로도 실제 제1종 오류율이 명목 \(\alpha\)와 크게 달라질 수 있다. 모집단의 첨도가 \(S^2\)의 분산에 직접 영향을 준다: 초과첨도가 \(\gamma_2\)인 분포에서 \(\text{Var}(S^2) \approx 2\sigma^4(1 + \gamma_2/2)/(n-1)\)이며, 이는 (정규에서 \(\gamma_2 = 0\)인) 카이제곱 이론이 예측하는 것보다 훨씬 클 수 있다. 정규성이 의심스러우면 Levene 검정이나 붓스트랩 기반 방법 같은 대안을 고려하라.

연습문제

연습문제 1. 어떤 제조사가 볼트 지름의 분산이 최대 \(\sigma_0^2 = 0.04\) mm\(^2\)이라고 주장한다. 볼트 \(n = 20\)개의 표본에서 \(s^2 = 0.06\)을 얻었다. \(\alpha = 0.05\)에서 우측 카이제곱 검정을 수행하라.

풀이

\(H_0: \sigma^2 \leq 0.04\) 대 \(H_1: \sigma^2 > 0.04\).

검정통계량은:

\[ \chi^2 = \frac{(n-1)s^2}{\sigma_0^2} = \frac{19 \times 0.06}{0.04} = \frac{1.14}{0.04} = 28.5 \]

임계값은 \(\chi^2_{19, 0.05} = 30.14\)이다. \(28.5 < 30.14\)이므로 \(H_0\)을 기각하지 못한다. 5% 수준에서 분산이 0.04 mm\(^2\)을 넘는다고 결론지을 증거가 부족하다.

연습문제 2. 연습문제 1의 검정에 대해 p-값을 계산하고 해석하라.

풀이

p-값은 \(P(\chi^2_{19} > 28.5)\)이다. 카이제곱 표나 소프트웨어로 구하면 \(P(\chi^2_{19} > 28.5) \approx 0.075\)이다.

p-값 0.075는 \(\alpha = 0.05\)보다 크므로 기각하지 못한다는 판정이 확인된다. 분산이 높아졌을 수 있다는 어느 정도의 증거는 있지만(p-값이 아주 크지는 않다) 5% 수준에서 기각할 만큼 강하지는 않다.

연습문제 3. 분산에 대한 카이제곱 검정이 평균에 대한 \(t\)-검정보다 정규성 가정을 훨씬 엄격하게 요구하는 이유를 설명하라.

풀이

평균에 대한 \(t\)-검정은 중심극한정리의 혜택을 받는다: 모집단 분포와 무관하게 \(n\)이 적당하면 \(\bar{X}\)가 근사적으로 정규이다. 따라서 표본이 크면 \(t\)-검정은 비정규성에 로버스트하다.

분산에 대한 카이제곱 검정에는 그런 보호막이 없다. \(S^2\)의 분포는 \(\sigma^2\)뿐 아니라 모집단의 첨도에도 의존한다. 정규가 아닌 모집단에서는 \((n-1)S^2/\sigma^2\)이 근사적으로도 카이제곱분포를 따르지 않으며, \(S^2\)에 대한 중심극한정리의 수렴은 훨씬 느리다. 첨도가 \(\text{Var}(S^2)\)을 부풀려, 꼬리가 두꺼운 자료에서 카이제곱 임계값이 지나치게 관대해진다(너무 자주 기각한다).

연습문제 4. 어떤 품질관리 공정이 충전기의 분산을 감시한다. 과거 자료에 따르면 충전량이 약간 오른쪽으로 치우쳐 있다. 분산이 달라졌는지 검정하는 데 카이제곱 검정을 써야 하는가? 아니라면 대안을 제안하라.

풀이

자료가 오른쪽으로 치우쳐 정규성 가정을 위반하므로 카이제곱 검정을 쓰지 말아야 한다. 약한 치우침만으로도 카이제곱 검정의 제1종 오류율이 명목 \(\alpha\)와 크게 달라질 수 있다.

대안은 다음과 같다:

  • 붓스트랩 검정: 자료를 재표본추출하여 \(\sigma^2\)의 붓스트랩 신뢰구간을 만든다. 분포 가정이 필요 없다.
  • Levene 검정: 기간별로 중앙값으로부터의 절대편차를 비교하여 분산이 달라졌는지 검정한다.
  • 변환 후 Bartlett 검정: 로그나 Box-Cox 변환으로 치우침을 줄인 뒤 변환된 자료에 카이제곱 검정을 쓴다.

연습문제 5. 분산 검정 대신 공정능력지수를 쓰는 방법을 보이고, 그 불확실성을 정량화하라.

풀이

정의. 규격 하한 LSL, 상한 USL에 대해

\[ C_p=\frac{\text{USL}-\text{LSL}}{6\sigma}, \qquad C_{pk}=\min\left\{\frac{\text{USL}-\mu}{3\sigma},\ \frac{\mu-\text{LSL}}{3\sigma}\right\} \]

\(C_p\)는 산포만, \(C_{pk}\)는 중심 이탈까지 반영한다.

import numpy as np
from scipy import stats

LSL, USL = 9.5, 10.5
n, xbar, s = 30, 10.05, 0.12

Cp = (USL - LSL) / (6 * s)
Cpk = min((USL - xbar) / (3 * s), (xbar - LSL) / (3 * s))
print(f"Ĉp = {Cp:.4f},  Ĉpk = {Cpk:.4f}")

# Cp 의 신뢰구간: σ 의 카이제곱 구간을 뒤집는다
nu = n - 1
lo = Cp * np.sqrt(stats.chi2.ppf(0.025, nu) / nu)
hi = Cp * np.sqrt(stats.chi2.ppf(0.975, nu) / nu)
print(f"Cp 의 95% 구간 ({lo:.4f}, {hi:.4f})")

# 규격 이탈 비율
below = stats.norm.cdf(LSL, xbar, s)
above = stats.norm.sf(USL, xbar, s)
print(f"추정 불량률 {1e6 * (below + above):.1f} ppm")
Ĉp = 1.3889,  Ĉpk = 1.2500
Cp 의 95% 구간 (1.0332, 1.7439)
추정 불량률 90.7 ppm

\(\hat C_p=1.39\)인데 구간이 1.03~1.74다. \(n=30\)에서 폭이 점추정값의 절반이다.

이것이 결정적인 실무 문제다. 흔히 "\(C_p\ge1.33\)이면 합격"이라는 기준을 쓰는데, 점추정값 1.39는 그 기준을 넘지만 구간의 하한 1.04는 넘지 못한다. 합격을 주장하기에는 근거가 약하다.

합격을 주장하려면 얼마나 필요한가.

for n in [30, 50, 100, 200, 500]:
    nu = n - 1
    # Ĉp 가 얼마여야 구간 하한이 1.33 을 넘는가
    need = 1.33 / np.sqrt(stats.chi2.ppf(0.025, nu) / nu)
    print(f"n={n:4d}: 구간 하한이 1.33 을 넘으려면 Ĉp ≥ {need:.3f}")
n=  30: 구간 하한이 1.33 을 넘으려면 Ĉp ≥ 1.788
n=  50: 구간 하한이 1.33 을 넘으려면 Ĉp ≥ 1.657
n= 100: 구간 하한이 1.33 을 넘으려면 Ĉp ≥ 1.545
n= 200: 구간 하한이 1.33 을 넘으려면 Ĉp ≥ 1.475
n= 500: 구간 하한이 1.33 을 넘으려면 Ĉp ≥ 1.418

\(n=30\)에서는 \(\hat C_p\)가 1.79는 되어야 "1.33 이상"을 주장할 수 있다. 표준 관행인 "\(n=30\)으로 능력 조사"가 얼마나 부실한지 보여 준다.

왜 분산 검정보다 나은가.

  1. 규격과 직접 연결된다. "분산이 목표를 넘는가"가 아니라 "불량이 얼마나 나오는가"를 답한다.
  2. 중심 이탈을 반영한다(\(C_{pk}\)).
  3. 구간이 직관적이다.

주의.

  • 정규성에 의존한다. 불량률 계산이 특히 그렇다. 치우친 자료에서는 비정규 공정능력지수를 쓴다.
  • 공정이 안정해야 한다. 관리 상태가 아니면 \(C_p\)가 무의미하다.
  • \(C_p\)와 \(C_{pk}\)를 함께 보고한다. \(C_p\)만 높고 \(C_{pk}\)가 낮으면 중심이 어긋난 것이다.

연습문제 6. 여러 집단의 분산 동질성을 검정하는 방법(바틀렛·레빈·브라운-포사이드)을 비교하라.

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(72)
M, k, n = 3_000, 4, 20          # 집단 4개, 각 20개

print(f"{'분포':>7s} {'바틀렛':>9s} {'레빈(평균)':>11s} "
      f"{'BF(중앙값)':>11s}")
for name, gen in [("정규", lambda s: rng.normal(0, 1, s)),
                  ("t(5)", lambda s: rng.standard_t(5, s)),
                  ("지수", lambda s: rng.exponential(1, s)),
                  ("균등", lambda s: rng.uniform(-1.7, 1.7, s))]:
    c = np.zeros(3)
    for _ in range(M):
        g = [gen(n) for _ in range(k)]
        c[0] += stats.bartlett(*g).pvalue < 0.05
        c[1] += stats.levene(*g, center="mean").pvalue < 0.05
        c[2] += stats.levene(*g, center="median").pvalue < 0.05
    print(f"{name:>7s} {c[0] / M:9.4f} {c[1] / M:11.4f} "
          f"{c[2] / M:11.4f}")
     분포       바틀렛      레빈(평균)     BF(중앙값)
     정규    0.0460      0.0553      0.0327
   t(5)    0.2440      0.0523      0.0340
     지수    0.4837      0.2233      0.0513
     균등    0.0000      0.0557      0.0227

바틀렛이 비정규에서 완전히 무너진다. 지수분포에서 0.484로 명목의 열 배다. 균등분포에서는 3,000회 중 한 번도 기각하지 않아 반대 방향으로 어긋난다.

브라운-포사이드(중앙값 기준 레빈)가 가장 강건하다. 네 분포 모두에서 0.023~0.051로, 명목을 넘지 않는다(꼬리가 얇은 분포에서 다소 보수적이다).

레빈(평균 기준)이 중간이다. 지수분포에서 0.223으로 명목의 네 배다.

왜 이런 차이가 나는가.

  • 바틀렛은 로그 분산을 직접 비교하므로 4차 적률에 그대로 노출된다.
  • 레빈·BF는 절대편차 \(|x_{ij}-c_i|\)를 만들어 평균 비교 문제로 바꾼다. 중심극한정리의 보호를 받는다.
  • 중앙값을 중심으로 쓰면 절대편차 자체의 치우침이 줄어 더 강건해진다.

검정력은 어떤가. 강건성의 대가로 검정력을 잃는다. 정규분포에서 분산이 실제로 다를 때, 바틀렛이 가장 강력하다.

실무 권고.

상황 권장
정규성이 확실 바틀렛
일반적인 경우 브라운-포사이드
두 집단의 평균 비교가 목적 검정하지 말고 웰치를 쓴다
분산 자체가 관심 BF + 분산비 구간

가장 중요한 권고. 앞서 여러 번 본 대로, 평균 비교를 위한 사전검정으로 쓰지 않는다. 웰치를 그냥 쓰면 된다.

연습문제 7. 허용구간을 소개하고 신뢰구간·예측구간과 구별하라. 분산 검정 대신 쓸 수 있는가?

풀이

세 구간의 대상이 다르다.

구간 담는 것
신뢰구간 모수 \(\mu\)
예측구간 다음 한 개의 관측값
허용구간 모집단의 일정 비율 \(P\)

허용구간의 정의. "신뢰도 \(1-\alpha\)로 모집단의 \(P\) 이상을 담는 구간"이다. 두 개의 확률이 들어간다.

\[ \bar x\pm k_2(n,P,1-\alpha)\,s \]
import numpy as np
from scipy import stats

def k2(n, P=0.95, conf=0.95):
    """양측 허용구간의 계수 (하워 근사)"""
    nu = n - 1
    z = stats.norm.ppf(0.5 + P / 2)
    chi = stats.chi2.ppf(1 - conf, nu)
    return z * np.sqrt(nu * (1 + 1 / n) / chi)

n, xbar, s = 30, 10.05, 0.12
t = stats.t.ppf(0.975, n - 1)
print(f"신뢰구간(μ)     ±{t * s / np.sqrt(n):.4f}  → "
      f"({xbar - t * s / np.sqrt(n):.4f}, {xbar + t * s / np.sqrt(n):.4f})")
hp = t * s * np.sqrt(1 + 1 / n)
print(f"예측구간(다음 1개) ±{hp:.4f}  → "
      f"({xbar - hp:.4f}, {xbar + hp:.4f})")
for P in [0.90, 0.95, 0.99]:
    k = k2(n, P)
    print(f"허용구간(P={P:.2f})  ±{k * s:.4f}  → "
          f"({xbar - k * s:.4f}, {xbar + k * s:.4f})")
신뢰구간(μ)     ±0.0448  → (10.0052, 10.0948)
예측구간(다음 1개) ±0.2495  → (9.8005, 10.2995)
허용구간(P=0.90)  ±0.2568  → (9.7932, 10.3068)
허용구간(P=0.95)  ±0.3060  → (9.7440, 10.3560)
허용구간(P=0.99)  ±0.4021  → (9.6479, 10.4521)

폭이 크게 다르다. 신뢰구간 0.09, 예측구간 0.50, 95% 허용구간 0.61이다.

규격과 직접 비교할 수 있다. 규격이 \((9.5,\ 10.5)\)일 때

  • 95% 허용구간 \((9.744,\ 10.356)\)이 규격 안에 들어간다 → "95% 신뢰도로 제품의 95% 이상이 규격을 만족한다"고 주장할 수 있다.
  • 99% 허용구간 \((9.648,\ 10.452)\)도 규격 안이다 → 99% 수준까지 주장할 수 있다. 다만 중심이 10.05로 규격 중앙(10.0)에서 약간 벗어나 있어, 상한 쪽 여유가 하한 쪽의 절반이다.

이것이 분산 검정보다 훨씬 유용하다. "\(\sigma^2\)이 \(\sigma_0^2\)를 넘는가"라는 간접적 질문 대신, "제품의 몇 %가 규격을 만족하는가"라는 직접적 질문에 답한다.

\(n\)의 영향.

for n in [10, 30, 100, 1000]:
    print(f"n={n:5d}: k2(95%, 95%) = {k2(n):.3f}  "
          f"(n→∞ 이면 z = {stats.norm.ppf(0.975):.3f})")
n=   10: k2(95%, 95%) = 3.382  (n→∞ 이면 z = 1.960)
n=   30: k2(95%, 95%) = 2.550  (n→∞ 이면 z = 1.960)
n=  100: k2(95%, 95%) = 2.233  (n→∞ 이면 z = 1.960)
n= 1000: k2(95%, 95%) = 2.036  (n→∞ 이면 z = 1.960)

\(n\)이 작으면 계수가 크게 부풀려진다. \(n=10\)에서 3.38로 \(z=1.96\)의 1.73배다. 모수의 불확실성을 반영한 정직한 대가다.

주의. 허용구간은 정규성에 크게 의존한다. 꼬리의 비율을 다루므로 분포 형태가 결정적이다. 비모수 허용구간(순서통계량 기반)도 있으나 훨씬 큰 \(n\)이 필요하다.

연습문제 8. 분산 검정을 측정시스템 분석에 적용하는 법을 보여라. 반복성과 재현성을 어떻게 나누는가?

풀이

분산 성분 분해. 측정값의 총 변동을

\[ \sigma^2_{\text{총}}=\underbrace{\sigma^2_{\text{부품}}}_{\text{실제 차이}} +\underbrace{\sigma^2_{\text{반복성}}+\sigma^2_{\text{재현성}}}_{\text{측정오차 }\sigma^2_{\text{GRR}}} \]

로 나눈다.

  • 반복성: 같은 검사자가 같은 부품을 반복 측정할 때의 변동(기기 자체).
  • 재현성: 검사자가 바뀔 때의 변동.
import numpy as np

rng = np.random.default_rng(11)
n_part, n_op, n_rep = 10, 3, 3
sd_part, sd_op, sd_rep = 1.0, 0.25, 0.30

part = rng.normal(0, sd_part, n_part)
op = rng.normal(0, sd_op, n_op)
y = np.empty((n_part, n_op, n_rep))
for i in range(n_part):
    for j in range(n_op):
        y[i, j] = part[i] + op[j] + rng.normal(0, sd_rep, n_rep)

# 분산분석식 적률법
grand = y.mean()
ms_part = n_op * n_rep * ((y.mean((1, 2)) - grand)**2).sum() / (n_part - 1)
ms_op = n_part * n_rep * ((y.mean((0, 2)) - grand)**2).sum() / (n_op - 1)
cell = y.mean(2)
ms_int = (n_rep * ((cell - y.mean((1, 2))[:, None]
                    - y.mean((0, 2))[None, :] + grand)**2).sum()
          / ((n_part - 1) * (n_op - 1)))
ms_err = ((y - cell[:, :, None])**2).sum() / (n_part * n_op * (n_rep - 1))

v_rep = ms_err
v_op = max((ms_op - ms_int) / (n_part * n_rep), 0)
v_int = max((ms_int - ms_err) / n_rep, 0)
v_part = max((ms_part - ms_int) / (n_op * n_rep), 0)
v_grr = v_rep + v_op + v_int
v_tot = v_grr + v_part

print(f"{'성분':>10s} {'분산':>9s} {'표준편차':>9s} {'총 변동 비중':>12s}")
for name, v in [("반복성", v_rep), ("재현성(검사자)", v_op),
                ("상호작용", v_int), ("GRR 합계", v_grr),
                ("부품", v_part), ("총계", v_tot)]:
    print(f"{name:>10s} {v:9.4f} {np.sqrt(v):9.4f} "
          f"{100 * v / v_tot:11.1f}%")
print(f"\n%GRR (표준편차 기준) = "
      f"{100 * np.sqrt(v_grr / v_tot):.1f}%")
      성분        분산      표준편차       총 변동 비중
     반복성    0.0696    0.2638         7.2%
재현성(검사자)    0.0259    0.1610         2.7%
    상호작용    0.0066    0.0810         0.7%
  GRR 합계    0.1021    0.3195        10.5%
      부품    0.8676    0.9315        89.5%
      총계    0.9697    0.9847       100.0%

%GRR이 32.4%다(\(\sqrt{0.105}\)). 판정 기준은

%GRR 판정
\(<10\%\) 우수
10~30% 조건부 허용
\(>30\%\) 부적합

이 측정시스템은 간신히 부적합이다. 측정오차가 표준편차 기준으로 총 변동의 32%를 차지한다. 분산 기준으로는 10.5%인데, 표준편차 기준이 관행이라는 점에 주의한다 — 같은 자료가 10.5%로도 32.4%로도 보고될 수 있다.

분산 검정과의 연결. 각 성분이 0인지 검정하는 것이 분산 검정이다.

  • \(H_0:\sigma^2_{\text{검사자}}=0\) → 검사자 간 차이가 없는가.
  • \(H_0:\sigma^2_{\text{상호작용}}=0\) → 검사자와 부품의 상호작용이 있는가.

그런데 검정보다 크기가 중요하다. "\(\sigma^2_{\text{검사자}}>0\)"은 거의 언제나 참이며, 그것이 얼마나 큰가가 실무적 질문이다. 이것이 앞서 본 "점 귀무가설의 무의미함"의 또 다른 사례다.

주의 — 부품의 변동에 의존한다. %GRR은 분모에 부품 변동이 들어간다. 동질적인 부품만 골라 조사하면 %GRR이 나쁘게 나온다. 부품을 공정의 실제 범위를 대표하도록 골라야 한다.

연습문제 9. 분산 검정의 표본크기를 정확히 계산하고, 규격 검증에 필요한 규모를 제시하라.

풀이
import numpy as np
from scipy import stats

def power_upper(n, r, alpha=0.05):
    """상단 단측: H0: σ² ≤ σ0², 참 비율이 r 일 때의 검정력"""
    nu = n - 1
    return stats.chi2.sf(stats.chi2.ppf(1 - alpha, nu) / r, nu)

print(f"{'r = σ²/σ0²':>11s} {'검정력 80% 에 필요한 n':>22s} "
      f"{'검정력 90%':>12s}")
for r in [1.25, 1.5, 2.0, 2.5, 3.0]:
    n80 = next(m for m in range(5, 5000) if power_upper(m, r) >= 0.80)
    n90 = next(m for m in range(5, 5000) if power_upper(m, r) >= 0.90)
    print(f"{r:11.2f} {n80:22d} {n90:12d}")
 r = σ²/σ0²        검정력 80% 에 필요한 n      검정력 90%
       1.25                    245          343
       1.50                     74          105
       2.00                     26           37
       2.50                     16           22
       3.00                     11           16

분산이 25% 늘어난 것을 탐지하려면 245개가 필요하다. 표준편차로는 12% 증가에 불과한 변화다.

표준편차 척도로 환산하면 감각이 달라진다.

\(\sigma/\sigma_0\) \(r\) 필요한 \(n\)
1.12 1.25 245
1.22 1.50 74
1.41 2.00 26
1.73 3.00 11

표준편차가 12% 늘어난 것을 잡으려면 245개다. 공정 감시에서 이 정도 변화를 놓치고 싶지 않다면, 표본이 그만큼 필요하다.

규격 검증의 관점. 앞서 본 \(C_p\) 기준으로 다시 보면

for n in [30, 50, 100, 200, 500, 1000]:
    nu = n - 1
    need = 1.33 / np.sqrt(stats.chi2.ppf(0.025, nu) / nu)
    print(f"n={n:5d}: Ĉp ≥ {need:.3f} 이어야 'Cp ≥ 1.33' 을 주장 가능")
n=   30: Ĉp ≥ 1.788 이어야 'Cp ≥ 1.33' 을 주장 가능
n=   50: Ĉp ≥ 1.657 이어야 'Cp ≥ 1.33' 을 주장 가능
n=  100: Ĉp ≥ 1.545 이어야 'Cp ≥ 1.33' 을 주장 가능
n=  200: Ĉp ≥ 1.475 이어야 'Cp ≥ 1.33' 을 주장 가능
n=  500: Ĉp ≥ 1.418 이어야 'Cp ≥ 1.33' 을 주장 가능
n= 1000: Ĉp ≥ 1.391 이어야 'Cp ≥ 1.33' 을 주장 가능

\(n=1000\)이어도 \(\hat C_p\)가 1.39는 되어야 한다. 분산 추정의 어려움을 극명하게 보여 준다.

실무 권고 넷.

  1. 분산 관련 조사에는 \(n\ge100\)을 기본으로 삼는다. 30은 너무 작다.
  2. 공정 감시에는 누적 방법(CUSUM, EWMA)을 쓴다. 여러 시점의 정보를 모아 작은 이동을 탐지한다.
  3. 한 번의 큰 조사보다 지속적인 감시가 낫다.
  4. 비정규성을 반드시 확인한다. \(n\)을 아무리 키워도 앞서 본 대로 카이제곱 검정은 회복되지 않는다.

연습문제 10. 분산 검정을 수행하기 전에 확인할 점검 목록을 만들어라.

풀이

1 — 정말 분산이 관심사인가.

  • [ ] 진짜 질문이 "산포가 큰가"인가, 아니면 "규격을 벗어나는 비율"인가.
  • [ ] 후자라면 공정능력지수나 허용구간이 낫다.
  • [ ] "평균 비교를 위한 사전검정"이라면 하지 않는다. 웰치를 쓴다.

2 — 자료의 구조.

  • [ ] 관측값이 독립인가. 같은 배치, 같은 시점, 같은 기기에서 나온 것들이 섞이지 않았는가.
  • [ ] 여러 변동원이 섞여 있지 않은가. 섞여 있다면 분산 성분 분석이 맞다.
  • [ ] 시간 추세가 있는가. 있으면 "분산"이 무엇을 뜻하는지 불분명해진다.

3 — 분포.

  • [ ] Q-Q 그림을 그렸는가. 이것이 가장 중요하다.
  • [ ] 왜도와 첨도를 계산했는가.
  • [ ] 이상치가 있는가. 하나만 있어도 \(S^2\)이 크게 흔들린다.
  • [ ] 비정규라면 변환, 부트스트랩, 강건 측도 중 무엇을 쓸지 정했는가.

4 — \(\sigma_0\).

  • [ ] 어디서 왔는가. 규격인가 과거 자료인가.
  • [ ] 과거 자료라면 그것도 추정값이다. 그 불확실성을 고려했는가.
  • [ ] 자료를 본 뒤에 정하지 않았는가.

5 — 표본크기.

  • [ ] 앞 문제의 표를 보고 검정력을 확인했는가.
  • [ ] \(n<50\)이면 어떤 결론도 매우 불확실하다는 점을 인정했는가.

6 — 방향.

  • [ ] 단측인가 양측인가. 사전에 정했는가.
  • [ ] 단측이면 어느 쪽인가. 공정관리라면 대개 상단.

7 — 보고.

  • [ ] \(\sigma\) 척도로 변환했는가.
  • [ ] 신뢰구간을 함께 적었는가.
  • [ ] 정규성 진단 결과를 적었는가.
  • [ ] 실무적 문턱(규격, 목표 \(C_p\))과 비교했는가.

가장 흔한 세 가지 실패.

  1. Q-Q 그림을 안 그린다. 그러고 나온 \(p\)-값은 앞서 본 대로 실제 수준이 0.29일 수 있다.
  2. \(n=20\)쯤으로 결론을 낸다. 구간이 점추정값의 두 배 폭이라는 사실을 무시한다.
  3. 평균 검정의 사전검정으로 쓴다. 앞서 여러 번 본 2단계 절차의 문제.

한 문장. 분산 검정은 정규성과 표본크기 양쪽에 까다로운 절차이며, 대부분의 실무 질문에는 더 나은 도구가 있다.


정리하며

분산 검정은 카이제곱 추축량을 쓴다.

\[ \chi^2=\frac{(n-1)S^2}{\sigma_0^2}\sim\chi^2_{n-1} \]
  • 분포가 비대칭이라 양측검정의 두 임계값이 대칭이 아니다. 평균 검정처럼 \(\pm\) 로 적을 수 없다.
  • 정규성에 매우 민감하다. 본문이 지적하듯 평균 검정과 결정적으로 다른 점이며, 약한 비정규성에도 제1종 오류율이 명목값을 크게 벗어난다. 4장과 8장에서 재어 본 대로 로그정규 자료에서는 사실상 쓸 수 없다.
  • 표본을 늘려도 나아지지 않는다. 중심극한정리가 도와주는 것은 평균이지 분산이 아니다.
  • 응용은 분명하다. 공정 변동 관리, 포트폴리오 변동성 검정처럼 평균이 아니라 흔들림 자체가 관심사인 상황이다.
  • 정규성이 의심스러우면 15장으로 간다. 레빈 검정이나 부트스트랩이 훨씬 안전하다.

다음 절 일표본 검정 개관에서 지금까지의 네 검정을 한자리에 모은다.