ANOVA 의 통계적 가정과 진단 (Levene)

정규성·등분산성·독립성 — 위반 시 영향과 진단 도구

Maxwell Ch.3 의 통계적 가정 (정규성, 등분산성, 독립성) 을 정리한다. 각 가정이 F 검정에 미치는 영향, 위반 시 결과 해석의 변화, 그리고 시각적 진단 (Q-Q plot) 과 형식 검정 (Shapiro-Wilk, Levene, Brown-Forsythe) 의 실무 사용법을 다룬다.

Experimentation
Fundamentals
저자

Kwangmin Kim

공개

2026년 05월 08일

1 도입 — 가정이 있는 검정

표준 F 검정이 정확히 작동하려면 다음 3 가정이 필요하다.

  1. 정규성 (Normality) — 각 그룹 내 종속 변수가 정규 분포
  2. 등분산성 (Homogeneity of variance) — 모든 그룹의 분산이 동일
  3. 독립성 (Independence) — 관측값이 서로 독립

이 글은 각 가정의 의미, 위반의 영향, 진단 도구 를 정리한다.

2 가정 1 — 정규성

2.1 가정의 정확한 형태

각 그룹 \(j\) 내에서 종속 변수가 정규 분포를 따른다.

\[ Y_{ij} \mid \text{group } j \sim N(\mu_j, \sigma^2) \]

이는 원자료 의 정규성을 요구하는 가정이다. 그러나 A-MAX2-3 에서 보았듯이 CLT 덕분에 표본 평균 의 정규 근사가 일어나므로 F 검정 자체 는 정규성 위반에 어느 정도 강건하다.

2.2 위반 시 영향

위반 정도 표본 크기 F 검정에 대한 영향
약한 비대칭 \(n > 30\) 거의 무시할 수준
강한 비대칭 \(n > 30\) 약간의 \(\alpha\) 인플레이션
강한 비대칭 \(n < 20\) 명확한 \(\alpha\) 인플레이션
두꺼운 꼬리 모든 \(n\) 검정력 감소
이상치 다수 모든 \(n\) 분산 추정 부정확

요약: 작은 표본강한 비정규 의 조합이 가장 위험하다. 큰 표본에서는 CLT 가 대부분 흡수한다.

2.3 진단 — 시각적 도구

Q-Q plot (Quantile-Quantile Plot): 자료의 분위수와 정규 분포의 분위수를 산점도로 그린다. 직선에 가까우면 정규에 가깝다.

Q-Q plot 패턴 분포 형태
직선 정규
S 자 곡선 (양 끝이 직선보다 멂) 두꺼운 꼬리
역 S 자 (양 끝이 직선보다 안쪽) 짧은 꼬리
한쪽으로 휨 비대칭

히스토그램 + 정규 곡선 overlay: 자료 분포 위에 동일 평균과 분산을 가진 정규 곡선 을 겹쳐 그린다. 시각적으로 비교한다.

박스 플롯: 이상치, 비대칭을 한눈에 본다.

2.4 진단 — 형식 검정

정의: Shapiro-Wilk 검정

자료의 정규성을 검정하는 절차. 통계량 \(W\) 는 자료의 순서 통계량기대 정규 순서 통계량 의 상관 관계에 기반한다.

\[ W = \frac{\left(\sum_{i=1}^{n} a_i Y_{(i)}\right)^2}{\sum_{i=1}^{n} (Y_i - \bar{Y})^2} \]

여기서 \(Y_{(i)}\)\(i\) 번째 순서 통계량, \(a_i\) 는 정규 분포에 의해 결정되는 가중치다.

  • \(H_0\): 자료가 정규
  • \(W\) 가 1 에 가까우면 정규
  • p 값 작으면 (예: \(p < 0.05\)) 정규 가설 기각

다른 형식 검정:

  • Anderson-Darling — 꼬리 부분에 더 민감
  • Kolmogorov-Smirnov — 일반적 분포 검정 (정규성에 특화 X)
  • Lilliefors — KS 의 정규성 변형
직관 — 형식 검정의 함정

큰 표본에서 정규성 검정은 지나치게 민감 하다. 자료가 실용적으로 정규에 가까워도 (CLT 가 작동할 만큼), 형식 검정은 작은 비정규성 을 감지하여 \(H_0\) 을 기각한다.

예: \(n = 1000\) 의 자료에서 약간의 비대칭만 있어도 Shapiro-Wilk 의 \(p < 0.05\) 가 나오기 쉽다. 그러나 ANOVA F 검정은 이 정도 비정규성에 강건하다.

따라서 정규성 진단은 형식 검정만 으로 결정하지 않는다.

표본 크기 권장 진단
\(n < 30\) 시각적 (Q-Q plot, 히스토그램) + 형식 검정
\(30 \leq n \leq 1000\) 시각적 + 형식 검정 (보조)
\(n > 1000\) 시각적 우선, 형식 검정 무시

큰 표본에서 실질적 비정규성 의 신호는 Q-Q plot 의 휨이지, p 값 < 0.05 가 아니다.

3 가정 2 — 등분산성

3.1 가정의 정확한 형태

모든 그룹의 분산이 동일하다.

\[ \sigma_1^2 = \sigma_2^2 = \cdots = \sigma_J^2 = \sigma^2 \]

이 가정이 성립할 때 풀링된 분산 추정 \(s_p^2\) 가 가장 효율적이다.

3.2 위반 시 영향

위반 패턴 표본 크기 F 검정 영향
분산이 그룹 간 약간 다름 (\(\sigma_{\max}/\sigma_{\min} < 2\)) 균형 (\(n_j\) 동일) 거의 무시
분산 차이 큼 + 균형 균형 약간의 영향
분산 차이 큼 + 불균형 (작은 \(n\) + 큰 \(\sigma\)) 불균형 \(\alpha\) 인플레이션
분산 차이 큼 + 불균형 (작은 \(n\) + 작은 \(\sigma\)) 불균형 \(\alpha\) 보수적

핵심: 불균형 설계 + 등분산 위반 의 조합이 가장 위험하다.

3.3 진단 — 시각적 도구

그룹별 박스 플롯: 박스 (IQR) 의 폭이 비슷한지 본다.

잔차 vs 적합값 산점도: 적합값에 따라 잔차의 분산이 변하면 (깔때기 모양) 등분산 위반.

Spread-level plot: 그룹별 분포의 흩어짐 (예: log 표준편차)위치 (예: log 중앙값) 를 산점도로 그린다. 기울기가 0 이 아니면 위반.

3.4 진단 — 형식 검정

정의: Levene’s Test

각 자료의 그룹 평균으로부터의 절대 편차 를 새로운 종속 변수로 보고, 이 변수에 대해 ANOVA F 검정을 수행한다.

\[ Z_{ij} = |Y_{ij} - \bar{Y}_j| \]

\(Z_{ij}\) 에 대한 ANOVA F 통계량이 Levene 통계량.

  • \(H_0\): 분산이 모두 같음
  • p 값 작으면 등분산 가설 기각
정의: Brown-Forsythe Test

Levene 의 변형. 평균 대신 중앙값 을 사용:

\[ Z_{ij} = |Y_{ij} - \text{median}(Y_j)| \]

자료가 비대칭일 때 Levene 보다 강건하다.

정의: Bartlett’s Test

대수적으로 다음 통계량 사용:

\[ B = \frac{(n - J) \ln s_p^2 - \sum (n_j - 1) \ln s_j^2}{1 + \frac{1}{3(J-1)} \left(\sum \frac{1}{n_j-1} - \frac{1}{n-J}\right)} \]

\(\chi^2_{J-1}\) 분포에 근사. 그러나 정규성 위반에 매우 민감 하므로 비정규 자료에서는 권장하지 않는다.

3.5 검정 비교

검정 정규성에 민감 추천도
Bartlett 매우 민감 정규 자료에서만
Levene 약간 민감 일반 사용
Brown-Forsythe 강건 비대칭 자료에서 권장
Fligner-Killeen 매우 강건 강한 비정규에서 권장
직관 — 등분산 위반이 왜 위험한가

ANOVA F 통계량은 풀링된 분산 추정 \(s_p^2\) 을 사용한다. 모든 그룹이 같은 분산이라 가정해 자료를 합쳐 추정한다.

만약 한 그룹의 분산이 다른 그룹보다 훨씬 크다면, 풀링이 부정확해진다. 큰 분산 그룹의 자료 점이 모든 그룹의 분산 추정에 과한 영향 을 준다.

특히 불균형 설계 에서 위험이 증폭된다. 큰 분산 그룹이 작은 표본 이면 풀링이 평균 분산을 과소 추정 → F 통계량 과대\(\alpha\) 인플레이션. 큰 분산 그룹이 큰 표본 이면 풀링이 평균 분산을 과대 추정 → F 과소 → 보수적 (검정력 손실).

해법: Welch 의 F 검정. 그룹별 분산을 따로 추정해 풀링하지 않는다. A-MAX3-5 에서 다룬다.

4 가정 3 — 독립성

4.1 가정의 정확한 형태

관측값 \(Y_{ij}\) 가 서로 독립이다. 즉

\[ \text{Cov}(Y_{ij}, Y_{i'j'}) = 0 \text{ for } (i, j) \neq (i', j') \]

4.2 위반의 흔한 사례

위반 패턴 자료 구조
클러스터링 학생이 학급에 속하고, 학급은 교사에 속함
시계열 한 사람을 여러 시점에 측정
공간적 자기상관 인접 지역의 측정이 비슷함
처치 spillover 한 사용자의 처치가 다른 사용자에 영향

4.3 위반 시 영향

독립성 위반은 정규성·등분산성보다 훨씬 위험 하다. 이유:

  1. 분산 추정의 편향 — 자기상관이 양수이면 그룹 내 분산이 과소 추정됨 → F 통계량이 과대 → false positive 폭증.
  2. 자유도의 모호성 — 사실상 표본 크기가 유효 표본 크기 (effective sample size) 보다 작다. 50 명의 동일 학급 학생은 50 개의 독립 관측이 아니다.
  3. CLT 의 약화 — CLT 는 독립성을 가정한다. 독립성이 깨지면 정규 근사도 약해진다.

4.4 진단

시각적: 잔차 vs 시간 또는 측정 순서 산점도. 패턴이 보이면 위반.

Durbin-Watson 검정: 시계열 자기상관 검정. 통계량 \(d \approx 2\) 이면 독립, \(d \to 0\) 이면 양 자기상관, \(d \to 4\) 면 음 자기상관.

ICC (Intraclass Correlation): 클러스터 자료에서 그룹 내 상관. ICC 가 0 보다 크면 클러스터링 영향이 있음.

4.5 위반 시 대안

위반 유형 대안
클러스터링 혼합 모형 (Mixed model), Cluster-robust SE
시계열 AR(1) 등 시계열 모형, GLS
반복 측정 Repeated measures ANOVA, GEE
Spillover Cluster-randomized design
직관 — 독립성 위반의 위험성

A/B 테스트에서 한 사용자가 여러 번 노출되어 매번 클릭률을 기록한다고 하자. 한 사용자의 10 회 노출은 10 개의 독립 관측이 아니다. 같은 사용자의 행동에는 강한 상관이 있다.

이 자료를 단순히 t 검정으로 분석하면 표본 크기가 부풀려져 보여 false positive 가 폭증한다. 진정한 독립 단위는 사용자 이지 노출 사건 이 아니다.

이 함정은 IT 실무에서 흔하다. 해법은 사용자 단위 집계 (사용자별 평균 클릭률) 후 검정 또는 cluster-robust SE 를 쓰는 것이다. 자세한 내용은 후속 시리즈 (Phase F-* 의 변동 추정) 에서 다룬다.

5 가정의 상대적 중요성

3 가정의 위험도를 정리하면:

독립성 >> 등분산성 > 정규성
  • 정규성: CLT 가 대부분 흡수, 큰 표본에서 거의 무시 가능
  • 등분산성: Welch 의 F 로 쉽게 보완
  • 독립성: 위반 시 근본적으로 다른 모형 이 필요 (혼합 모형 등)

따라서 분석 시 우선 독립성 을 가장 신중하게 점검한다. 그 다음 등분산성, 마지막으로 정규성.

6 진단 흐름 — 권장 순서

  1. 시각화 — 박스 플롯, 산점도, 히스토그램, Q-Q plot 으로 자료를 본다.
  2. 이상치 확인 — 박스 플롯의 outlier 가 입력 오류인지 검토한다.
  3. 독립성 평가 — 자료 구조 (클러스터, 시계열) 를 검토한다. 위반이면 적절한 모형으로 변경.
  4. 등분산성 진단 — Levene 또는 Brown-Forsythe 검정. 위반이면 Welch’s F.
  5. 정규성 진단 — Q-Q plot 시각적, 작은 표본에서는 Shapiro-Wilk. 위반이면 robust 또는 변환.

7 자료 변환 — 가정 위반의 한 해법

가정이 위반되면 자료 변환 으로 보완할 수 있다.

변환 사용 시점
Log (\(\log Y\)) 우편향 자료, 등분산 위반 (분산이 평균에 비례)
Square root (\(\sqrt{Y}\)) 카운트 자료 (Poisson 분포)
Arcsin (\(\arcsin\sqrt{Y}\)) 비율 자료 (이항 분포)
Box-Cox 일반적, 최적 변환 자동 추정

변환의 장단점:

  • 장점: 가정 위반을 한 단계에서 해결할 수 있음
  • 단점: 변환된 자료의 해석이 어려움 (“log 매출의 평균 차이” 가 비즈니스 의미 모호)

따라서 변환은 추론에 한정 하고, 보고는 원 척도로 하는 것이 권장된다.

8 코드 예시 — 가정 진단

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import statsmodels.api as sm

np.random.seed(42)
n_each = 30

# 시뮬레이션: 약한 비대칭 + 등분산 자료
group_A = np.random.normal(5.0, 1.0, n_each)
group_B = np.random.normal(5.5, 1.0, n_each)
group_C = np.random.normal(6.0, 1.0, n_each)

all_data = np.concatenate([group_A, group_B, group_C])
groups = ['A']*n_each + ['B']*n_each + ['C']*n_each
df = pd.DataFrame({'y': all_data, 'group': groups})

# 1. 정규성 — Shapiro-Wilk (그룹별)
print("Shapiro-Wilk 정규성 검정 (그룹별):")
for g in ['A', 'B', 'C']:
    stat, p = stats.shapiro(df[df['group']==g]['y'])
    print(f"  {g}: W = {stat:.3f}, p = {p:.4f}")

# 2. 등분산성 — Levene 과 Brown-Forsythe
stat_lev, p_lev = stats.levene(group_A, group_B, group_C, center='mean')
stat_bf, p_bf = stats.levene(group_A, group_B, group_C, center='median')
stat_bart, p_bart = stats.bartlett(group_A, group_B, group_C)
print(f"\n등분산 검정:")
print(f"  Levene (mean):       stat = {stat_lev:.3f}, p = {p_lev:.4f}")
print(f"  Brown-Forsythe:      stat = {stat_bf:.3f}, p = {p_bf:.4f}")
print(f"  Bartlett:            stat = {stat_bart:.3f}, p = {p_bart:.4f}")

# 3. 독립성 — 잔차 vs 측정 순서 (시계열성 점검)
from statsmodels.formula.api import ols
model = ols('y ~ C(group)', data=df).fit()
residuals = model.resid
order = np.arange(len(residuals))

# Durbin-Watson 통계량
from statsmodels.stats.stattools import durbin_watson
dw = durbin_watson(residuals)
print(f"\nDurbin-Watson 통계량: {dw:.3f} (2 근처면 독립)")

# 4. 시각적 진단 (출력은 생략)
# fig, axes = plt.subplots(1, 3, figsize=(15, 4))
# axes[0].hist(residuals, bins=20)  # 잔차 히스토그램
# stats.probplot(residuals, dist='norm', plot=axes[1])  # Q-Q plot
# axes[2].scatter(model.fittedvalues, residuals)  # 잔차 vs 적합값

# 5. 가정이 위반된 경우 — 시뮬레이션
print("\n시뮬레이션: 등분산 위반 자료")
group_X = np.random.normal(5.0, 0.5, n_each)
group_Y = np.random.normal(5.5, 1.0, n_each)
group_Z = np.random.normal(6.0, 2.0, n_each)
stat, p = stats.levene(group_X, group_Y, group_Z, center='median')
print(f"  Brown-Forsythe: stat = {stat:.3f}, p = {p:.4f}")
print("  → 등분산 가설 기각, Welch's F 권장")

이 코드는 정규성·등분산성·독립성 의 세 가정을 순서대로 진단 한다. 위반이 발견되면 다음 글 A-MAX3-5 의 robust 대안으로 이동한다.

9 가정 위반의 상호 영향

9.1 정규성 + 등분산성 동시 위반

두 가정 동시 위반은 최악 시나리오. CLT 도 작동 약화.

해법: - 큰 표본 (\(n > 100\)): 일반 t·F 도 어느 정도 robust - 작은 표본: Permutation 또는 Welch + 변환

9.2 독립성 + 정규성 동시 위반

클러스터 자료 + 정규 위반: 혼합 모형 또는 cluster-robust SE + bootstrap.

9.3 가정 위반의 검정 통계량 영향

직관 — 가정 위반의 정량적 영향

시뮬레이션으로 정량화:

import numpy as np
from scipy.stats import f_oneway

n_sim = 5000
n_per = 30
J = 3

# 시뮬레이션 1 — 등분산 + 정규 (이상)
type_I_normal = 0
for _ in range(n_sim):
    groups = [np.random.normal(0, 1, n_per) for _ in range(J)]
    _, p = f_oneway(*groups)
    if p < 0.05:
        type_I_normal += 1

# 시뮬레이션 2 — 강한 비대칭
type_I_skew = 0
for _ in range(n_sim):
    groups = [np.random.exponential(1, n_per) for _ in range(J)]
    _, p = f_oneway(*groups)
    if p < 0.05:
        type_I_skew += 1

# 시뮬레이션 3 — 등분산 위반
type_I_uneq = 0
for _ in range(n_sim):
    groups = [np.random.normal(0, sigma, n_per) for sigma in [1, 2, 3]]
    _, p = f_oneway(*groups)
    if p < 0.05:
        type_I_uneq += 1

print(f"이상 (정규 + 등분산): Type I = {type_I_normal/n_sim:.3f}")
print(f"비대칭만: Type I = {type_I_skew/n_sim:.3f}")
print(f"등분산 위반: Type I = {type_I_uneq/n_sim:.3f}")

결과: - 이상: ~ 0.05 (정확) - 비대칭만: ~ 0.05 (CLT 작동, robust) - 등분산 위반: ~ 0.05 또는 흩어짐 (균형이면 robust, 불균형이면 위험)

이 시뮬레이션이 어떤 위반이 위험한지 정량화. 등분산 위반 + 불균형 = 최대 위험.

10 가정 진단 자동화

import numpy as np
import pandas as pd
from scipy.stats import shapiro, levene, bartlett, kruskal
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.stattools import durbin_watson

def diagnose_anova_assumptions(df, value_col, group_col):
    """ANOVA 가정 자동 진단"""
    groups = df.groupby(group_col)[value_col].apply(list).tolist()
    print("=== ANOVA 가정 진단 ===\n")

    # 1. 정규성 (각 그룹별)
    print("1. 정규성 (Shapiro-Wilk):")
    for g_name, g_data in df.groupby(group_col):
        _, p = shapiro(g_data[value_col])
        verdict = "정규" if p > 0.05 else "비정규"
        print(f"   {g_name}: p = {p:.4f}{verdict}")

    # 2. 등분산성
    stat_lev, p_lev = levene(*groups, center='median')
    stat_bart, p_bart = bartlett(*groups)
    print(f"\n2. 등분산성:")
    print(f"   Brown-Forsythe: p = {p_lev:.4f}")
    print(f"   Bartlett:        p = {p_bart:.4f}")
    if p_lev < 0.05:
        print(f"   → 등분산 위반, Welch's F 권장")

    # 3. 독립성 (Durbin-Watson)
    model = ols(f'{value_col} ~ C({group_col})', data=df).fit()
    dw = durbin_watson(model.resid)
    print(f"\n3. 독립성 (DW): {dw:.3f}")
    if 1.5 < dw < 2.5:
        print(f"   → 독립성 OK (2 근처)")
    else:
        print(f"   → 자기 상관 의심")

    # 4. 권장
    print("\n=== 권장 분석 ===")
    if all(shapiro(g[value_col])[1] > 0.05 for _, g in df.groupby(group_col)) and p_lev > 0.05:
        print("표준 ANOVA 사용 가능")
    elif p_lev < 0.05:
        print("Welch's F 권장 (등분산 위반)")
    else:
        print("Kruskal-Wallis 권장 (정규성 위반)")

이 함수가 4 단계 자동 진단. 결과에 따라 분석 절차 결정.

11 가정 위반의 자료 변환 해법

11.1 Log Transformation

우편향 자료: \(Y \to \log Y\).

# 우편향 자료의 log 변환
data_skewed = np.random.lognormal(0, 1, 100)
print(f"원자료 정규성: p = {shapiro(data_skewed)[1]:.4f}")
print(f"Log 변환 정규성: p = {shapiro(np.log(data_skewed))[1]:.4f}")

11.2 Box-Cox

자동 최적 변환:

from scipy.stats import boxcox

data_skewed = np.random.lognormal(0, 1, 100)
data_bc, lambda_opt = boxcox(data_skewed)
print(f"Box-Cox λ = {lambda_opt:.3f}")
print(f"변환 후 정규성: p = {shapiro(data_bc)[1]:.4f}")

11.3 Variance Stabilizing Transformations

자료 변환
Poisson 카운트 \(\sqrt{Y}\)
비율 \(\arcsin\sqrt{Y}\)
Lognormal \(\log Y\)
일반 우편향 Box-Cox

이 변환이 가정 위반 회피 의 단순 해법.

12 후속 — Robust Methods

가정 위반에 대한 강건 대안 (Welch’s F, Brown-Forsythe, Kruskal-Wallis) 의 절차와 트레이드오프는 A-MAX3-5 에서 다룬다.

13 관련 주제

선행 지식

후속 주제 (Phase A)

다른 카테고리 연결

Subscribe

Enjoy this blog? Get notified of new posts by email: