1 개요
이전 포스트(Oneway ANOVA: 고전적 가설과 F 검정)에서는 합집합-교집합 방법(UIT)으로부터 F 통계량을 대수적으로 유도했다. 그 전개는 엄밀하지만, “왜 F 가 큰 값을 가지면 처리 효과가 있는가?”라는 직관을 바로 주지는 않는다.
이 포스트는 동일한 F 검정을 선형대수의 투영(projection) 관점에서 다시 본다. 이어서 F 검정이 전제하는 세 가지 가정(정규성, 등분산성, 독립성)을 실무에서 어떻게 진단하고, 위배되었을 때 어떤 대안을 쓰는지, 효과크기와 검정력은 어떻게 계산하는지, 불균형 설계에서 Type I/II/III 제곱합의 차이는 무엇인지를 순서대로 다룬다.
Casella & Berger(2002, §11.2.4)의 이론을 뼈대로 하되, 현대 실무에서 요구되는 진단과 해석 도구를 agent의 사전지식으로 보완한다.
2 F 검정의 기하학적 해석
2.1 관측 벡터와 모델 공간
\(N = \sum_i n_i\) 개의 관측값을 하나의 벡터로 쌓는다:
\[ \mathbf{y} = (Y_{11}, \ldots, Y_{1 n_1}, Y_{21}, \ldots, Y_{k n_k})^\top \in \mathbb{R}^N \]
일원분류 ANOVA의 셀 평균 모형 \(Y_{ij} = \theta_i + \epsilon_{ij}\) 는 행렬 형태로 \(\mathbf{y} = \mathbf{X}\boldsymbol{\theta} + \boldsymbol{\epsilon}\) 로 쓸 수 있다. 여기서 \(\mathbf{X}\) 는 \(N \times k\) 의 집단 지시행렬(group indicator matrix)이며, 각 행은 해당 관측값이 속한 집단의 열에만 1, 나머지는 0 이다.
- \(V_{\text{model}} = \text{Col}(\mathbf{X})\) — 모델 공간, 차원 \(k\)
- \(V_0 = \text{span}(\mathbf{1}_N)\) — 전체 평균 공간, 차원 \(1\)
- \(V_{\text{model}} \ominus V_0\) — 처리 효과 공간, 차원 \(k-1\)
- \(V_{\text{model}}^\perp\) — 잔차 공간, 차원 \(N-k\)
\(V_0 \subset V_{\text{model}} \subset \mathbb{R}^N\) 의 포함 관계가 성립한다.
2.2 직교 분해
관측 벡터 \(\mathbf{y}\) 를 세 조각으로 직교 분해한다:
\[ \mathbf{y} = \underbrace{\bar{\bar{y}} \cdot \mathbf{1}_N}_{\text{전체 평균 성분}} + \underbrace{(\hat{\mathbf{y}} - \bar{\bar{y}} \cdot \mathbf{1}_N)}_{\text{집단 간 성분}} + \underbrace{(\mathbf{y} - \hat{\mathbf{y}})}_{\text{잔차 성분}} \]
여기서 \(\hat{\mathbf{y}}\) 는 \(\mathbf{y}\) 를 \(V_{\text{model}}\) 에 투영한 벡터이며, 각 성분은 해당 집단 평균 \(\bar{Y}_{i\cdot}\) 이다. 세 벡터는 서로 직교하므로 피타고라스 정리에 의해:
\[ \|\mathbf{y} - \bar{\bar{y}}\mathbf{1}\|^2 = \|\hat{\mathbf{y}} - \bar{\bar{y}}\mathbf{1}\|^2 + \|\mathbf{y} - \hat{\mathbf{y}}\|^2 \]
이 식을 성분으로 풀면 곧바로 \(\mathrm{SST} = \mathrm{SSB} + \mathrm{SSW}\) 가 된다. 즉, 제곱합 분해는 관측 벡터의 직교 투영이다.
대수적 유도는 “식을 전개하니 교차항이 소거된다”는 수동적 결과로 끝난다. 기하학적 유도는 처음부터 교차항이 0임을 보장한다 — 세 벡터가 서로 다른 직교 부분공간에 있기 때문이다.
이 관점은 곧바로 일반화된다: 이원 분산분석, 다중회귀, ANCOVA 모두 “관측 벡터를 여러 직교 부분공간으로 투영”하는 동일한 구조를 가진다. Casella의 대수적 유도는 특정 케이스의 계산이지만, 기하학적 유도는 전체 선형 모델 이론의 통합된 시각을 제공한다.
2.3 F 통계량의 기하학적 의미
\[ F = \frac{\|\hat{\mathbf{y}} - \bar{\bar{y}}\mathbf{1}\|^2 / (k-1)}{\|\mathbf{y} - \hat{\mathbf{y}}\|^2 / (N-k)} \]
분자는 “관측이 모델 공간의 처리 효과 방향으로 얼마나 멀리 있는가”를 자유도당 측정하고, 분모는 “모델이 설명하지 못하는 잔차가 얼마나 큰가”를 측정한다. F 가 크다는 것은 관측 벡터가 \(V_0\) 보다 \(V_{\text{model}}\) 에 훨씬 가깝다는 기하학적 주장이며, 이는 “집단 평균이 전체 평균과 유의하게 다르다”는 통계적 주장과 같다.
2.4 Cochran 정리와 독립성
왜 Cochran 정리가 필요한가? F 통계량이 정확히 F 분포를 따르려면 분자(SSB)와 분모(SSW)가 독립이어야 한다. 직교 분해에서 나온 성분들이 정규 가정 하에서 독립이라는 것이 Cochran 의 핵심이다.
정규성 가정 하에서, \(\mathbf{y}\) 의 직교 분해 성분들은 서로 독립이다 (Cochran의 정리, Casella & Berger 2002, Theorem 5.3.1의 확장). 이것이 \(\mathrm{SSB}/\sigma^2 \perp \mathrm{SSW}/\sigma^2\) 를 보장하고, F 통계량이 F 분포를 따르는 핵심 근거이다.
비정규 오차에서는 이 독립성이 깨진다 — 아래에서 다룰 “정규성 진단”이 왜 중요한지의 이유가 여기에 있다.
3 ANOVA 가정과 진단
F 검정은 세 가지 가정에 의존한다. 실무에서는 각 가정을 어떻게 검증하고, 위배되었을 때 어떻게 대응하는지를 알아야 한다.
3.1 가정 1: 정규성 (Normality)
오차 \(\epsilon_{ij} \sim N(0, \sigma^2)\) 를 가정한다. 관측값 \(Y_{ij}\) 자체의 정규성이 아니라 각 집단 내 잔차의 정규성을 본다는 점에 주의한다.
| 진단 방법 | 판단 기준 | 주의사항 |
|---|---|---|
| Shapiro-Wilk 검정 | \(p > 0.05\) 이면 정규성 기각 못 함 | \(n\) 이 크면 사소한 편차도 기각 → 보조 수단 |
| Q-Q plot | 45도 직선에서 벗어난 정도 관찰 | 시각적 판단, 주관 개입 |
| 표준화 잔차 히스토그램 | 종 모양 확인 | 집단별 또는 통합 잔차 사용 |
| Anderson-Darling | 꼬리 영역 민감 | 이상치 탐지에 유리 |
강건성(robustness): F 검정은 정규성 위배에 대해 상당히 강건하다. 특히 중심극한정리에 의해 \(n_i\) 가 크면(\(\geq 30\)) 표본 평균의 분포가 근사 정규가 되므로, 절대적 정규성보다 대칭성과 이상치 없음이 더 중요하다.
3.2 가정 2: 등분산성 (Homoscedasticity)
모든 집단에서 \(\sigma_i^2 = \sigma^2\) 여야 한다. 위배되면 F 통계량의 분포가 정확한 \(F_{k-1, N-k}\) 를 따르지 않는다.
| 검정 | 귀무가설 | 강건성 | 권장 |
|---|---|---|---|
| Bartlett | \(\sigma_1^2 = \cdots = \sigma_k^2\) | 정규성에 매우 민감 | 정규 오차가 확인될 때만 |
| Levene | 동일 | 비정규에 강건 | 대부분의 실무에서 권장 |
| Brown-Forsythe | 동일 (중앙값 기반 Levene) | 가장 강건 | 이상치 의심 시 |
| Fligner-Killeen | 동일 (순위 기반) | 가장 강건, 비모수 | 심한 비정규 |
“1:2 규칙”: 실무에서는 가장 큰 집단 표준편차와 가장 작은 것의 비가 2 이하이고 표본 크기가 유사하면(최대/최소 비 < 1.5), F 검정은 여전히 신뢰할 수 있다. 이 범위를 벗어나면 Welch ANOVA 로 전환하는 것이 안전하다.
3.3 가정 3: 독립성 (Independence)
오차들이 서로 독립이어야 한다. 위배되면 표준오차가 과소추정되어 Type I 오류율이 증가한다.
| 위배 상황 | 예시 | 대안 |
|---|---|---|
| 반복측정 | 같은 피험자를 여러 조건에서 측정 | Repeated measures ANOVA, Mixed Model |
| 군집화 | 학급 내 학생들 | 계층 모형(multilevel) |
| 시간적 자기상관 | 연속 시간 측정 | 시계열 모형 |
| 공간적 자기상관 | 인접 지역 | 공간 통계 모형 |
독립성은 주로 실험설계 단계에서 보장되어야 하며, 사후 검정으로 교정하기 어렵다. 잔차의 Durbin-Watson 통계량으로 시간적 자기상관만 부분적으로 점검 가능하다.
4 가정 위배 시 대안
4.1 Welch ANOVA — 등분산성 위배
등분산성 가정을 제거한 수정된 F 검정이다. Welch(1951)는 각 집단의 표본분산을 가중 평균하여 자유도를 보정한다:
\[ F_{\text{Welch}} = \frac{\sum_{i=1}^k w_i (\bar{Y}_{i\cdot} - \tilde{Y})^2 / (k-1)}{1 + \frac{2(k-2)}{k^2-1} \sum_{i=1}^k \frac{(1 - w_i/\sum w_i)^2}{n_i - 1}} \]
여기서 \(w_i = n_i / S_i^2\) (정밀도 가중치), \(\tilde{Y} = \sum w_i \bar{Y}_{i\cdot} / \sum w_i\) 이다.
직관: 분산이 큰 집단의 평균은 불확실하고, 분산이 작은 집단의 평균은 신뢰할 수 있다. Welch 의 가중치 \(w_i = n_i/S_i^2\) 는 정밀도(precision)에 비례한다 — 더 정밀한 추정에 더 큰 무게를 준다. 이것은 이분산 하에서 효율적 추정의 표준 전략이다.
분모 자유도는 Welch-Satterthwaite 근사로 계산되며, 등분산이면 고전 F 검정과 거의 같고, 분산이 크게 다르면 훨씬 보수적이 된다. 2024년 이후 R의 oneway.test() 기본값이 Welch 인 것처럼, 많은 통계 소프트웨어가 이를 기본으로 사용한다.
4.2 Kruskal-Wallis — 정규성 위배
순위(rank) 기반 비모수 검정이다. 각 집단의 평균 순위를 비교한다:
\[ H = \frac{12}{N(N+1)} \sum_{i=1}^{k} \frac{R_i^2}{n_i} - 3(N+1) \]
왜 순위인가? 원래 값 \([8, 9, 10, 100]\) 에서 100은 극단적이지만, 순위 \([1, 2, 3, 4]\) 로 바꾸면 극단성이 사라진다. 순위 변환은 이상치의 지렛대 효과를 제거하여 강건한 검정을 가능하게 한다. 대가는 정보 손실 — 값의 크기 차이가 무시된다.
\(H \approx \chi^2_{k-1}\) 이며, 정규성을 요구하지 않는 대신 집단 분포가 형태(shape)는 같다 는 약한 가정이 필요하다. 이 가정이 만족되면 \(H\) 는 “중앙값 차이”에 대한 검정으로 해석된다.
4.3 변수 변환
로그, 제곱근, Box-Cox 등의 변환으로 정규성과 등분산성을 동시에 개선할 수 있다. Box-Cox 변환:
\[ Y^{(\lambda)} = \begin{cases} \frac{Y^\lambda - 1}{\lambda} & \lambda \neq 0 \\ \ln Y & \lambda = 0 \end{cases} \]
최적 \(\lambda\) 는 잔차의 정규성 우도를 최대화하여 선택한다. 분산이 평균에 비례하면 (\(\sigma \propto \mu\)) 로그 변환, 분산이 평균의 제곱에 비례하면(\(\sigma \propto \sqrt{\mu}\)) 제곱근 변환이 효과적이다.
5 효과크기 (Effect Size)
F 검정의 p-value 는 “처리 효과가 존재하는가”에만 답한다. “얼마나 큰가”는 별도의 효과크기 지표로 정량화한다.
5.1 \(\eta^2\) (Eta-squared)
\[ \eta^2 = \frac{\mathrm{SSB}}{\mathrm{SST}} \]
전체 변동 중 처리에 의해 설명되는 비율이다. 회귀분석의 \(R^2\) 와 정확히 같은 개념이다. \(0 \leq \eta^2 \leq 1\) 이며, 값이 클수록 처리 효과가 강하다.
문제점: \(\eta^2\) 는 표본에서 편향적으로 과대추정된다. 특히 집단 수 \(k\) 가 많고 표본 크기가 작을 때 편향이 크다.
5.2 \(\omega^2\) (Omega-squared)
편향을 보정한 추정량이다:
\[ \omega^2 = \frac{\mathrm{SSB} - (k-1) \mathrm{MSW}}{\mathrm{SST} + \mathrm{MSW}} \]
왜 보정이 필요한가? \(\eta^2 = \text{SSB}/\text{SST}\) 는 표본에서 우연히 발생한 집단 차이까지 ’설명된 변동’으로 계산한다. \(\omega^2\) 는 분자에서 \((k-1)\text{MSW}\) 를 빼서 이 우연적 부분을 제거한다. 표본이 작을수록 \(\eta^2\) 와 \(\omega^2\) 의 차이가 크다.
실무에서는 \(\omega^2\) 를 보고하는 것이 권장된다. 음수가 나올 수 있으며, 이 경우 “추정된 효과크기가 0” 으로 해석한다.
5.3 Cohen’s \(f\)
다른 효과크기 분석(특히 검정력 분석)에서 표준 지표로 사용된다:
\[ f = \sqrt{\frac{\eta^2}{1 - \eta^2}} = \sqrt{\frac{\mathrm{SSB}}{\mathrm{SSW}}} \cdot \sqrt{\frac{1}{k-1}} \]
Cohen(1988)의 관례적 기준:
| \(f\) 값 | 해석 | \(\eta^2\) 대응 |
|---|---|---|
| 0.10 | 작은 효과 | 0.01 |
| 0.25 | 중간 효과 | 0.06 |
| 0.40 | 큰 효과 | 0.14 |
직관: \(f\) 는 신호 대 잡음비이다. \(\eta^2\) 가 설명된 비율이라면, \(1-\eta^2\) 는 설명되지 않은 비율이다. 둘의 비의 제곱근이 \(f\) 이다. Cohen 의 기준(0.10/0.25/0.40)은 잡음 대비 신호의 크기를 소/중/대로 분류한다.
이 기준은 사회과학에서 유래했고, 분야에 따라 재조정이 필요하다. 임상시험에서는 효과크기 0.1 이 임상적으로 매우 큰 의미를 가질 수 있고, 심리학 실험에서는 0.4 가 필요할 수도 있다.
6 검정력 분석
6.1 비중심 F 분포
\(H_1\) 이 참일 때 F 통계량은 비중심 F 분포(noncentral F)를 따른다:
\[ F = \frac{\mathrm{SSB}/(k-1)}{\mathrm{SSW}/(N-k)} \sim F_{k-1,\, N-k}(\lambda) \]
여기서 비중심 모수(noncentrality parameter)는:
\[ \lambda = \frac{\sum_{i=1}^{k} n_i (\theta_i - \bar{\theta})^2}{\sigma^2} = N \cdot f^2 \cdot (k-1) \cdot \frac{1}{k-1} \cdot \text{(균형설계 시 } N f^2 \text{)} \]
균형 설계(\(n_i = n\))에서는 \(\lambda = n \sum_i (\theta_i - \bar{\theta})^2 / \sigma^2 = n k f^2\) 로 단순해진다. 여기서 \(f\) 는 Cohen’s \(f\) 이다.
\(\lambda\) 가 커지면 비중심 \(F\) 분포가 오른쪽으로 이동한다. 이는 ’처리 효과가 크거나 표본이 클수록 큰 F 값을 관찰할 확률이 높아진다’는 직관과 일치한다. 검정력 분석은 원하는 검정력(보통 0.8)을 달성하는 \(\lambda\) 를 역산하고, 이로부터 필요한 \(n\) 을 구하는 과정이다.
6.2 검정력 계산
검정력은 \(H_1\) 하에서 \(H_0\) 를 기각할 확률이다:
\[ \text{Power} = P\!\left(F_{k-1, N-k}(\lambda) > F_{k-1, N-k, \alpha}\right) \]
실무에서는 다음 4개 중 3개를 알면 나머지 하나를 계산한다:
- 효과크기 \(f\)
- 표본 크기 \(n\) (또는 \(N\))
- 유의수준 \(\alpha\)
- 검정력 \(1 - \beta\)
표본 크기 계산 예시: \(k = 4\), \(f = 0.25\) (중간 효과), \(\alpha = 0.05\), 검정력 \(0.80\) 을 원하면, 집단당 \(n \approx 45\) (전체 \(N \approx 180\)) 가 필요하다.
- 사후 검정력 분석(post-hoc power): 이미 수행된 실험의 관측 효과크기로 계산한 검정력은 논리적 정보 가치가 없다. p-value 와 1:1 대응이기 때문이다. 검정력 분석은 실험 설계 시 수행해야 한다.
- 효과크기 과대 가정: 실무에서 \(f = 0.4\)(큰 효과) 를 가정하고 표본 크기를 줄이는 경향이 있는데, 실제 효과가 작으면 검정력이 크게 떨어진다. 보수적으로 \(f = 0.25\) 를 가정하는 것이 안전하다.
- 균형 설계 가정: 공식 대부분이 균형 설계를 가정한다. 불균형이면
G*Power,pwr패키지, 또는 시뮬레이션을 사용한다.
7 불균형 설계와 제곱합 유형
7.1 문제의 소재
일원 ANOVA 에서 \(n_i\) 가 다르면 “불균형(unbalanced)” 이지만, 단일 요인 분산분석의 F 검정은 여전히 정확하다. 문제는 이원 이상의 ANOVA 에서 주효과와 상호작용이 서로 직교하지 않을 때 발생한다.
이원 ANOVA 의 셀 크기가 다르면:
\[ \mathrm{SST} \neq \mathrm{SSA} + \mathrm{SSB} + \mathrm{SSAB} + \mathrm{SSE} \]
좌변과 우변의 차이는 “요인들 사이의 공분산”이다. 이를 어떻게 배분할 것인가에 따라 세 가지 제곱합이 정의된다.
7.2 Type I (Sequential)
모형에 변수를 추가하는 순서대로 “추가 설명력”을 배분한다:
\[ \mathrm{SS}(A) = \mathrm{SS}(A) \\ \mathrm{SS}(B|A) = \mathrm{SS}(A, B) - \mathrm{SS}(A) \\ \mathrm{SS}(AB|A, B) = \mathrm{SS}(A, B, AB) - \mathrm{SS}(A, B) \]
특징: 결과가 입력 순서에 의존한다. R 의 anova() 기본값.
7.3 Type II
각 효과를 “같은 차수까지의 다른 모든 효과를 조정한 후”의 증분으로 본다:
\[ \mathrm{SS}(A) = \mathrm{SS}(A, B) - \mathrm{SS}(B) \\ \mathrm{SS}(B) = \mathrm{SS}(A, B) - \mathrm{SS}(A) \]
상호작용이 유의하지 않다는 가정 하에서 주효과를 검정한다.
7.4 Type III (Marginal)
각 효과를 “다른 모든 효과(상호작용 포함)를 조정한 후”의 증분으로 본다. SAS 의 기본값이며, 상호작용이 유의할 때도 주효과를 해석하려는 관행에서 유래했다.
실무 논쟁이 많다. 요약하면:
- 균형 설계: 세 Type 이 모두 같은 결과를 준다
- 불균형 설계 + 상호작용 없음: Type II 가 검정력이 가장 높다 (권장)
- 불균형 설계 + 상호작용 있음: 상호작용이 유의하면 주효과 해석 자체가 의심스러우므로, 단순효과(simple effect) 분석으로 전환하는 것이 옳다. 억지로 Type III 를 쓰기보다.
- 관찰연구: 원인변수가 외생적이면 Type II, 내생적이면 인과추론 프레임워크 필요
“SAS 가 Type III 이니까 Type III” 는 충분한 근거가 아니다. 데이터 구조와 가설에 맞춰 선택한다.
8 코드 예시
8.1 Step 1: 순수 Python — Welch ANOVA, 효과크기, 검정력
import numpy as np
from scipy import stats
# 세 집단 데이터 (의도적 분산 이질성)
np.random.seed(20260406)
g1 = np.random.normal(10, 1.0, 20)
g2 = np.random.normal(12, 1.5, 20)
g3 = np.random.normal(11, 3.0, 20)
groups = [g1, g2, g3]
# ─── 1. 고전 F 검정 ───
N = sum(len(g) for g in groups)
k = len(groups)
grand = np.mean(np.concatenate(groups))
SSB = sum(len(g) * (np.mean(g) - grand) ** 2 for g in groups)
SSW = sum(np.sum((g - np.mean(g)) ** 2) for g in groups)
F_classic = (SSB / (k - 1)) / (SSW / (N - k))
p_classic = stats.f.sf(F_classic, k - 1, N - k)
print(f"고전 F = {F_classic:.4f}, p = {p_classic:.4f}")
# ─── 2. Welch ANOVA ───
ni = np.array([len(g) for g in groups])
mi = np.array([np.mean(g) for g in groups])
vi = np.array([np.var(g, ddof=1) for g in groups])
wi = ni / vi
W = wi.sum()
mw = (wi * mi).sum() / W
num = sum(wi * (mi - mw) ** 2) / (k - 1)
denom_adj = 1 + (2 * (k - 2) / (k ** 2 - 1)) * sum((1 - wi / W) ** 2 / (ni - 1))
F_welch = num / denom_adj
df2_welch = (k ** 2 - 1) / (3 * sum((1 - wi / W) ** 2 / (ni - 1)))
p_welch = stats.f.sf(F_welch, k - 1, df2_welch)
print(f"Welch F = {F_welch:.4f}, df2 = {df2_welch:.2f}, p = {p_welch:.4f}")
# ─── 3. 효과크기 ───
SST = SSB + SSW
eta2 = SSB / SST
omega2 = (SSB - (k - 1) * SSW / (N - k)) / (SST + SSW / (N - k))
cohen_f = np.sqrt(eta2 / (1 - eta2))
print(f"\neta^2 = {eta2:.4f}")
print(f"omega^2 = {omega2:.4f}")
print(f"Cohen f = {cohen_f:.4f}")
# ─── 4. 사전 검정력 분석 (비중심 F 분포) ───
# "만약 f = 0.25, n_i = 20, k = 3 이면 검정력은?"
f_target = 0.25
n_per = 20
lambda_ncp = n_per * k * f_target ** 2 # 균형 설계 근사
F_crit = stats.f.ppf(0.95, k - 1, n_per * k - k)
power = 1 - stats.ncf.cdf(F_crit, k - 1, n_per * k - k, lambda_ncp)
print(f"\n사전 검정력 (f=0.25, n=20, k=3): {power:.4f}")8.2 Step 2: scipy / statsmodels / pingouin
import pandas as pd
from scipy import stats
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
import pingouin as pg # pip install pingouin
# 데이터프레임 구성
df = pd.DataFrame({
"y": np.concatenate(groups),
"group": ["A"]*20 + ["B"]*20 + ["C"]*20
})
# ─── 가정 진단 ───
# Shapiro (각 집단)
for name, g in zip(["A", "B", "C"], groups):
w, p = stats.shapiro(g)
print(f"Shapiro {name}: W={w:.4f}, p={p:.4f}")
# Levene (중앙값 기반이 기본)
W, p = stats.levene(*groups, center="median")
print(f"Levene: W={W:.4f}, p={p:.4f}")
# Bartlett (정규 가정 민감)
T, p = stats.bartlett(*groups)
print(f"Bartlett: T={T:.4f}, p={p:.4f}")
# ─── 고전 ANOVA ───
model = ols("y ~ C(group)", data=df).fit()
print(anova_lm(model, typ=2))
# ─── Welch ANOVA ───
welch = pg.welch_anova(data=df, dv="y", between="group")
print(welch)
# ─── 효과크기 ───
aov = pg.anova(data=df, dv="y", between="group", detailed=True)
print(aov) # eta2, omega2 포함
# ─── 비모수 대안 ───
H, p = stats.kruskal(*groups)
print(f"Kruskal-Wallis: H={H:.4f}, p={p:.4f}")
# ─── 검정력 분석 ───
from statsmodels.stats.power import FTestAnovaPower
power_analysis = FTestAnovaPower()
n_required = power_analysis.solve_power(
effect_size=0.25, alpha=0.05, power=0.80, k_groups=3
)
print(f"f=0.25, power=0.80 에 필요한 전체 표본: {n_required:.1f}")9 핵심 정리
| 항목 | 요지 |
|---|---|
| 기하학적 유도 | 관측 벡터의 직교 투영 — \(\mathrm{SST} = \mathrm{SSB} + \mathrm{SSW}\) 는 피타고라스 정리 |
| 정규성 진단 | Shapiro, Q-Q plot, 표준화 잔차 — 대표본에서는 비교적 강건 |
| 등분산성 진단 | Levene 권장 (Bartlett 은 정규성 민감) |
| 등분산성 위배 | Welch ANOVA — 가중치와 자유도 보정 |
| 정규성 위배 | Kruskal-Wallis, 변수 변환(Box-Cox) |
| 효과크기 | \(\omega^2\) 보고 권장 (\(\eta^2\) 는 편향) |
| 검정력 | 비중심 F 분포 + Cohen’s \(f\) 로 사전 설계 |
| 제곱합 유형 | 불균형 + 상호작용 없음 → Type II 권장 |
- 설계 단계: 검정력 분석으로 표본 크기 결정 (사후 아님)
- 데이터 수집 후: Q-Q plot + Levene 로 가정 진단
- 가정 만족: 고전 F 검정
- 등분산 위배: Welch F 검정
- 정규성 심각 위배: Kruskal-Wallis 또는 변수 변환
- 결과 보고: F, p, df, 효과크기(\(\omega^2\)), 95% CI 를 모두 기재
- 사후 검정: F 가 유의하면 대비 추론으로 이동 (→ 다음 포스트)
10 관련 주제
선행 지식
- ANOVA와 회귀의 통합 관점 — 셀 평균 모형, 제곱합 분해
- Oneway ANOVA: 고전적 가설과 F 검정 — UIT 기반 F 통계량 유도
- 확률 수렴과 극한이론 — 대표본 강건성의 기반
후속 주제
- Simultaneous Estimation of Contrasts — Tukey HSD, Dunnett, FDR
- Multiple Linear Regression — ANOVA 의 일반화
관련 개념
- GLM — t-test부터 로지스틱 회귀까지 — 지수족 관점의 통합
- 반복측정 ANOVA — 독립성 위배 대응
- A/B Test — 실험설계에서의 ANOVA