1 도입 — 가정이 있는 검정
표준 F 검정이 정확히 작동하려면 다음 3 가정이 필요하다.
- 정규성 (Normality) — 각 그룹 내 종속 변수가 정규 분포
- 등분산성 (Homogeneity of variance) — 모든 그룹의 분산이 동일
- 독립성 (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 진단 — 형식 검정
자료의 정규성을 검정하는 절차. 통계량 \(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 진단 — 형식 검정
각 자료의 그룹 평균으로부터의 절대 편차 를 새로운 종속 변수로 보고, 이 변수에 대해 ANOVA F 검정을 수행한다.
\[ Z_{ij} = |Y_{ij} - \bar{Y}_j| \]
\(Z_{ij}\) 에 대한 ANOVA F 통계량이 Levene 통계량.
- \(H_0\): 분산이 모두 같음
- p 값 작으면 등분산 가설 기각
Levene 의 변형. 평균 대신 중앙값 을 사용:
\[ Z_{ij} = |Y_{ij} - \text{median}(Y_j)| \]
자료가 비대칭일 때 Levene 보다 강건하다.
대수적으로 다음 통계량 사용:
\[ 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 위반 시 영향
독립성 위반은 정규성·등분산성보다 훨씬 위험 하다. 이유:
- 분산 추정의 편향 — 자기상관이 양수이면 그룹 내 분산이 과소 추정됨 → F 통계량이 과대 → false positive 폭증.
- 자유도의 모호성 — 사실상 표본 크기가 유효 표본 크기 (effective sample size) 보다 작다. 50 명의 동일 학급 학생은 50 개의 독립 관측이 아니다.
- 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 진단 흐름 — 권장 순서
- 시각화 — 박스 플롯, 산점도, 히스토그램, Q-Q plot 으로 자료를 본다.
- 이상치 확인 — 박스 플롯의 outlier 가 입력 오류인지 검토한다.
- 독립성 평가 — 자료 구조 (클러스터, 시계열) 를 검토한다. 위반이면 적절한 모형으로 변경.
- 등분산성 진단 — Levene 또는 Brown-Forsythe 검정. 위반이면 Welch’s F.
- 정규성 진단 — 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\).
11.2 Box-Cox
자동 최적 변환:
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)
다른 카테고리 연결