1 개요
이전 포스트(Oneway ANOVA: 고전적 가설과 F 검정)에서 일원분류 ANOVA 의 기본 제곱합 항등식 \(\mathrm{SST} = \mathrm{SSB} + \mathrm{SSW}\) 를 증명했고, 기하학적 심화 포스트에서 이를 관측 벡터의 직교 투영으로 재해석했다.
이 포스트는 그 결과를 출발점으로 제곱합 분해(partitioning sums of squares) 이론의 전모를 다룬다. 왜 이 주제를 별도 포스트로 다루는가? 제곱합 분해는 단순히 일원 ANOVA 의 계산 도구가 아니다. 이는 선형 모형 전반을 관통하는 구조적 원리이며, 이원 ANOVA, 다중회귀, ANCOVA, 분산성분 분석(variance components), 혼합모형까지 공통된 뼈대로 작동한다.
Casella & Berger(2002, §11.2.6)의 엄밀한 유도를 따라가면서, 현대 실무에서 요구되는 이원 이상 분해와 회귀와의 연결을 agent 의 사전지식으로 보완한다.
2 일원 분해의 복습과 엄밀화
2.1 항등식의 재확인
임의의 실수 \(y_{ij}\) (\(i = 1, \ldots, k\), \(j = 1, \ldots, n_i\)) 에 대해,
\[ \sum_{i=1}^{k} \sum_{j=1}^{n_i} (y_{ij} - \bar{\bar{y}})^2 = \sum_{i=1}^{k} n_i (\bar{y}_{i\cdot} - \bar{\bar{y}})^2 + \sum_{i=1}^{k} \sum_{j=1}^{n_i} (y_{ij} - \bar{y}_{i\cdot})^2 \]
즉 \(\mathrm{SST} = \mathrm{SSB} + \mathrm{SSW}\).
이 항등식은 분포 가정 없이 임의의 수에 대해 성립하는 대수적 항등식이다. \(y_{ij}\) 가 확률변수일 필요도, 정규성도, 등분산성도 전혀 요구되지 않는다. 이것이 왜 중요한가? 분포 가정은 제곱합 항등식이 아니라 제곱합의 분포에 대해서만 필요하다. 즉, 항등식은 순수 대수이고, \(\chi^2\) 분포 결과는 분포 이론이다.
이 구분이 실무에서 중요한 이유: 비정규 데이터에서도 SS 분해 자체는 유효하며, 부트스트랩이나 순열 검정(permutation test)으로 분포를 대체할 수 있다.
2.2 자유도의 분해
제곱합 분해에 대응하는 자유도 분해:
\[ \underbrace{N - 1}_{\text{SST 자유도}} = \underbrace{k - 1}_{\text{SSB 자유도}} + \underbrace{N - k}_{\text{SSW 자유도}} \]
자유도의 해석은 “제약 후 남은 독립 정보의 수”이다.
- \(\mathrm{SST}\): \(N\) 개 편차 \(y_{ij} - \bar{\bar{y}}\) 중 \(\sum_{ij}(y_{ij} - \bar{\bar{y}}) = 0\) 이라는 1개 제약 → \(N - 1\)
- \(\mathrm{SSB}\): \(k\) 개 편차 \(\bar{y}_{i\cdot} - \bar{\bar{y}}\) 중 \(\sum_i n_i(\bar{y}_{i\cdot} - \bar{\bar{y}}) = 0\) 이라는 1개 제약 → \(k - 1\)
- \(\mathrm{SSW}\): 각 집단 내 \(n_i\) 개 편차 \(y_{ij} - \bar{y}_{i\cdot}\) 중 집단별로 \(\sum_j (y_{ij} - \bar{y}_{i\cdot}) = 0\) 이라는 \(k\) 개 제약 → \(N - k\)
자유도가 단순히 “샘플 크기 빼기 추정 모수 수” 라는 암기식 설명보다, 선형 부분공간의 차원 으로 이해하는 것이 정확하다. 129 포스트의 기하학 관점에서 이는 각 부분공간의 차원과 정확히 일치한다.
3 Cochran 정리: 제곱합의 분포
3.1 정리의 진술
제곱합 항등식은 분포 가정 없이 성립하지만, 각 제곱합이 \(\chi^2\) 분포를 따르고 서로 독립 이라는 결과는 정규성 가정과 Cochran 정리에서 나온다.
\(\mathbf{Z} \sim N_N(\mathbf{0}, \sigma^2 \mathbf{I})\) 이고, 대칭 멱등행렬(idempotent symmetric matrices) \(\mathbf{A}_1, \ldots, \mathbf{A}_r\) 이 다음을 만족한다고 하자:
\[ \sum_{s=1}^{r} \mathbf{A}_s = \mathbf{I}, \quad \text{rank}(\mathbf{A}_s) = \nu_s \]
이때 \(\sum_{s=1}^r \nu_s = N\) 이면,
\[ \frac{\mathbf{Z}^\top \mathbf{A}_s \mathbf{Z}}{\sigma^2} \overset{\text{iid}}{\sim} \chi^2_{\nu_s}, \quad s = 1, \ldots, r \]
즉 이차형식들은 서로 독립인 \(\chi^2\) 확률변수들이다.
3.2 ANOVA 에의 적용
\(\mathbf{y} - \theta\mathbf{1}\) 을 \(\mathbf{Z}\) 로 놓고 (\(\theta = \bar{\theta}\)), 세 개의 투영행렬을 정의한다:
- \(\mathbf{P}_0 = \frac{1}{N}\mathbf{1}\mathbf{1}^\top\) — 전체 평균 공간 투영, rank 1
- \(\mathbf{P}_M = \mathbf{X}(\mathbf{X}^\top\mathbf{X})^{-1}\mathbf{X}^\top\) — 모델 공간 투영, rank \(k\)
- \(\mathbf{P}_B = \mathbf{P}_M - \mathbf{P}_0\) — 처리 효과 공간, rank \(k - 1\)
- \(\mathbf{P}_W = \mathbf{I} - \mathbf{P}_M\) — 잔차 공간, rank \(N - k\)
이들은 모두 대칭 멱등이고, \(\mathbf{P}_0 + \mathbf{P}_B + \mathbf{P}_W = \mathbf{I}\), \(1 + (k-1) + (N-k) = N\) 이므로 Cochran 정리의 조건을 만족한다.
\(H_0 : \theta_1 = \cdots = \theta_k\) 하에서 \(\mathbf{y} - \bar{\theta}\mathbf{1} \sim N(\mathbf{0}, \sigma^2\mathbf{I})\) 이고,
\[ \frac{\mathrm{SSB}}{\sigma^2} = \frac{(\mathbf{y} - \bar{\theta}\mathbf{1})^\top \mathbf{P}_B (\mathbf{y} - \bar{\theta}\mathbf{1})}{\sigma^2} \sim \chi^2_{k-1} \]
\[ \frac{\mathrm{SSW}}{\sigma^2} = \frac{(\mathbf{y} - \bar{\theta}\mathbf{1})^\top \mathbf{P}_W (\mathbf{y} - \bar{\theta}\mathbf{1})}{\sigma^2} \sim \chi^2_{N-k} \]
그리고 \(\mathbf{P}_B \mathbf{P}_W = \mathbf{0}\) 이므로 \(\mathrm{SSB} \perp \mathrm{SSW}\).
Cochran 정리가 없다면, \(\mathrm{SSB}\) 와 \(\mathrm{SSW}\) 의 독립성을 개별적으로 증명해야 한다. 이는 두 이차형식의 공분산 계산을 요구하며, 변수가 많을수록 급속히 복잡해진다.
Cochran 은 이 모든 것을 “부분공간 직교성 → 이차형식 독립성” 이라는 하나의 원리로 통합한다. 이원, 삼원, 다중회귀 ANOVA 에서도 같은 원리가 그대로 적용된다 — 이것이 선형 모형 이론의 위력이다.
직관: 직교 부분공간에 대한 사영은 서로 독립으로 작용한다. 수직인 두 거울을 생각하자 — 한 거울에 수직으로 쏜 빛은 다른 거울에 전혀 닿지 않는다. 마찬가지로 정규 벡터의 직교 사영들은 서로 영향을 주지 않으므로, 각 제곱합 성분이 독립인 \(\chi^2\) 을 따른다. 이 독립성이 \(F\) 통계량의 분포를 보장하는 핵심이다.
4 이원 분산분석의 분해
4.1 모형과 셀 평균
두 범주형 요인 \(A\)(\(a\) 수준), \(B\)(\(b\) 수준), 각 셀에 \(n\) 개 관측값(균형 설계)을 가정한다:
\[ Y_{ijk} = \mu + \alpha_i + \beta_j + (\alpha\beta)_{ij} + \epsilon_{ijk} \]
여기서 \(i = 1, \ldots, a\), \(j = 1, \ldots, b\), \(k = 1, \ldots, n\), 총 \(N = abn\) 개 관측값. 식별성 제약: \(\sum_i \alpha_i = \sum_j \beta_j = \sum_i (\alpha\beta)_{ij} = \sum_j (\alpha\beta)_{ij} = 0\).
4.2 균형 설계의 직교 분해
균형 설계에서는 다음의 완전 직교 분해가 성립한다:
\[ \mathrm{SST} = \mathrm{SSA} + \mathrm{SSB} + \mathrm{SSAB} + \mathrm{SSE} \]
각 항의 정의:
| 항 | 정의 | 자유도 |
|---|---|---|
| \(\mathrm{SSA}\) | \(bn \sum_{i=1}^{a} (\bar{y}_{i\cdot\cdot} - \bar{\bar{\bar{y}}})^2\) | \(a - 1\) |
| \(\mathrm{SSB}\) | \(an \sum_{j=1}^{b} (\bar{y}_{\cdot j\cdot} - \bar{\bar{\bar{y}}})^2\) | \(b - 1\) |
| \(\mathrm{SSAB}\) | \(n \sum_{i,j} (\bar{y}_{ij\cdot} - \bar{y}_{i\cdot\cdot} - \bar{y}_{\cdot j\cdot} + \bar{\bar{\bar{y}}})^2\) | \((a-1)(b-1)\) |
| \(\mathrm{SSE}\) | \(\sum_{i,j,k} (y_{ijk} - \bar{y}_{ij\cdot})^2\) | \(ab(n-1)\) |
자유도의 합: \((a-1) + (b-1) + (a-1)(b-1) + ab(n-1) = ab n - 1 = N - 1\). 완벽히 일치한다.
4.3 왜 직교인가
균형 설계의 핵심은 각 효과가 서로 다른 직교 부분공간에 투영된다는 점이다. 주효과 \(A\) 는 \(i\) 방향 평균으로만, 주효과 \(B\) 는 \(j\) 방향 평균으로만, 상호작용은 두 평균을 제거한 잔차로 정의된다. 이들 부분공간이 서로 직교임은 셀 크기가 같다는 조건 하에서만 성립한다.
비균형 설계 에서는 이 직교성이 깨진다. 주효과 \(A\) 의 방향과 주효과 \(B\) 의 방향이 상관되어 (cell 수가 달라 가중 평균이 비대칭), 다음이 성립하지 않는다:
\[ \mathrm{SST} \neq \mathrm{SSA} + \mathrm{SSB} + \mathrm{SSAB} + \mathrm{SSE} \]
이 때문에 Type I/II/III 라는 세 가지 다른 분해 방식이 필요해진다.
5 Type I/II/III 제곱합의 엄밀 정의
129 포스트에서 실무 관점으로 간략히 다룬 Type I/II/III 를 회귀적 관점에서 엄밀히 재정의한다.
5.1 모델 대조: \(R\) 함수 표기
주어진 모델 \(\mathcal{M}\) 의 잔차제곱합을 \(\mathrm{SSE}(\mathcal{M})\) 으로 표기하고, “추가 설명력” 을 다음으로 정의한다:
\[ R(\text{항} \mid \text{기존 항들}) = \mathrm{SSE}(\text{기존 모델}) - \mathrm{SSE}(\text{기존 + 신규 모델}) \]
5.2 Type I (Sequential / Hierarchical)
모형에 항을 순차적으로 추가할 때의 증분:
\[ \mathrm{SSA}^{\mathrm{I}} = R(A \mid \text{intercept}) \\ \mathrm{SSB}^{\mathrm{I}} = R(B \mid \text{intercept}, A) \\ \mathrm{SSAB}^{\mathrm{I}} = R(AB \mid \text{intercept}, A, B) \]
성질: 순서에 의존한다. \(A, B\) 순서와 \(B, A\) 순서의 결과가 다르다. 비균형 설계에서만 차이가 나며, 균형 설계에서는 모두 같아진다.
언제 유용한가: 요인들에 자연스러운 위계가 있을 때. 예를 들어 “성별 → 연령대 → 치료” 처럼 앞선 변수를 조건부로 다음 변수의 효과를 보는 것이 의미 있는 경우.
5.3 Type II
각 주효과를 동일 차수의 다른 주효과 를 조정한 후 계산하고, 상호작용은 모든 주효과 이후:
\[ \mathrm{SSA}^{\mathrm{II}} = R(A \mid \text{intercept}, B) \\ \mathrm{SSB}^{\mathrm{II}} = R(B \mid \text{intercept}, A) \\ \mathrm{SSAB}^{\mathrm{II}} = R(AB \mid \text{intercept}, A, B) \]
가정: 상호작용이 없다. 상호작용이 유의하지 않다는 것이 확인되었거나 이론적으로 배제될 때 사용한다.
장점: 상호작용 없는 모형에서 검정력이 가장 높다(Langsrud 2003 증명).
5.4 Type III (Marginal)
각 효과를 다른 모든 효과 (상호작용 포함) 조정 후:
\[ \mathrm{SSA}^{\mathrm{III}} = R(A \mid \text{intercept}, B, AB) \\ \mathrm{SSB}^{\mathrm{III}} = R(B \mid \text{intercept}, A, AB) \\ \mathrm{SSAB}^{\mathrm{III}} = R(AB \mid \text{intercept}, A, B) \]
문제점: 상호작용이 유의할 때 \(A\) 의 주효과가 \(AB\) 를 “조건부” 로 해석된다. 이는 \(A\) 의 계수가 “\(B\) 가 기준 수준일 때 \(A\) 의 효과” 로 축소되는 것으로, 원래 주효과가 아니다. 코딩 방식(effects coding vs dummy coding)에 따라 값이 달라지는 것도 이 때문이다.
5.5 세 Type 의 관계
| Type | 조건부 | 순서 의존 | 상호작용 필요 조건 |
|---|---|---|---|
| I | 순차 | 있음 | 무관 |
| II | 같은 차수 효과만 | 없음 | 없다고 가정 |
| III | 모든 효과 | 없음 | 있어도 사용 가능 (해석 주의) |
균형 설계: 세 Type 이 같은 값을 준다. 이 경우 어느 것을 써도 무방.
비균형 설계:
- 실험 연구 + 상호작용 있음 → 단순효과 분석(simple effects), Type III 억지로 쓰지 않음
- 실험 연구 + 상호작용 없음 → Type II (검정력 최대)
- 관찰 연구 + 위계 있음 → Type I (이론적 순서 반영)
- 관찰 연구 + 위계 없음 → Type II 또는 Type III (SAS 관행으로 III)
“SAS 가 기본값으로 Type III” 라는 관행은 역사적 이유일 뿐, 통계적으로 최선이 아닌 경우가 많다.
Type II 가 교호작용이 없을 때 검정력이 최고인 이유: Type II 는 다른 주효과만 보정하고 교호작용은 모형에 넣지 않는다. 불필요한 항을 넣지 않으므로 잔차 자유도가 보존되고, 추정이 날카로워진다. Type III 는 교호작용까지 보정하므로, 교호작용이 실제로 없다면 불필요한 소음을 모형에 추가하는 셈이다.
6 기대 평균제곱 (Expected Mean Squares, EMS)
6.1 정의와 의미
각 평균제곱(MS)의 기댓값을 이론적으로 계산하면, F 검정의 분자/분모가 왜 그렇게 구성되는지 의 근거를 얻는다. 또한 변량효과 모형(random effects) 과 혼합모형(mixed) 에서 F 검정의 올바른 분모를 결정하는 데 필수적이다.
6.2 고정효과 모형
일원 ANOVA(고정효과)에서:
\[ E[\mathrm{MSW}] = \sigma^2 \]
\[ E[\mathrm{MSB}] = \sigma^2 + \frac{\sum_{i=1}^{k} n_i (\theta_i - \bar{\theta})^2}{k - 1} \]
\(H_0 : \theta_1 = \cdots = \theta_k\) 하에서 두 번째 항이 0이 되어 \(E[\mathrm{MSB}] = \sigma^2\). 따라서 \(F = \mathrm{MSB}/\mathrm{MSW}\) 의 기댓값이 \(H_0\) 하에서 \(\approx 1\), \(H_1\) 하에서 \(> 1\).
이것이 “왜 F 비가 1보다 크면 처리 효과를 시사하는가” 의 이론적 근거다.
6.3 변량효과 모형
만약 \(\theta_i \sim N(\mu, \sigma_\alpha^2)\) 로 모집단에서 추출된 수준 이라면(변량효과):
\[ E[\mathrm{MSB}] = \sigma^2 + n \sigma_\alpha^2 \quad (\text{균형 설계}) \]
\[ E[\mathrm{MSW}] = \sigma^2 \]
\(H_0 : \sigma_\alpha^2 = 0\) 의 검정 통계량은 여전히 \(F = \mathrm{MSB}/\mathrm{MSW}\) 이지만, 해석이 다르다: “처리 수준 간 변동성이 존재하는가”.
또한 분산성분 추정량:
\[ \hat{\sigma}_\alpha^2 = \frac{\mathrm{MSB} - \mathrm{MSW}}{n} \]
이는 음수가 될 수 있다 (method of moments 의 한계). 이 경우 0으로 절단(truncate)하거나 REML 추정량으로 전환한다.
6.4 이원 혼합모형의 EMS 표
\(A\) 고정, \(B\) 변량의 이원 혼합모형에서 균형 설계 EMS:
| 원천 | EMS |
|---|---|
| \(A\) (고정) | \(\sigma^2 + n \sigma_{AB}^2 + \frac{bn \sum \alpha_i^2}{a - 1}\) |
| \(B\) (변량) | \(\sigma^2 + an \sigma_B^2\) |
| \(AB\) | \(\sigma^2 + n \sigma_{AB}^2\) |
| 오차 | \(\sigma^2\) |
F 검정 구성:
- \(A\) 검정: \(F = \mathrm{MSA} / \mathrm{MSAB}\) (오차가 아닌 \(\mathrm{MSAB}\)!)
- \(B\) 검정: \(F = \mathrm{MSB} / \mathrm{MSE}\)
- \(AB\) 검정: \(F = \mathrm{MSAB} / \mathrm{MSE}\)
이유: \(A\) 의 “순수 기여” 를 보려면 \(\sigma^2 + n\sigma_{AB}^2\) 를 분모로 써서 \(A\) 의 고유 항만 남겨야 한다. EMS 테이블 없이 F 검정의 올바른 분모를 결정하는 것은 불가능하다.
왜 혼합 모형에서 \(F\) 의 분모가 바뀌는가? 고정 효과 \(A\) 를 검정할 때, \(B\) 가 랜덤이면 \(\text{MS}_{AB}\) 에 \(B\) 의 랜덤 변동이 포함된다. \(A\) 의 순수 효과를 분리하려면, 같은 랜덤 변동을 가진 \(\text{MS}_{AB}\) 로 나눠야 한다. \(\text{MSE}\) 로 나누면 \(B\) 의 변동이 분자에만 남아 \(F\) 가 과대해진다.
대부분의 통계 패키지는 기본값이 고정효과 모형이다. 변량/혼합모형을 사용하려면 lme4::lmer() (R) 또는 statsmodels.MixedLM, pymer4 (Python) 로 명시해야 한다. lm() + anova() 는 모든 효과를 고정으로 취급하므로 F 비의 분모가 잘못 선택된다.
7 회귀 분석과의 통일
7.1 회귀의 제곱합 분해
단순 선형 회귀 \(Y_i = \beta_0 + \beta_1 x_i + \epsilon_i\) 의 제곱합 분해:
\[ \underbrace{\sum_i (Y_i - \bar{Y})^2}_{\mathrm{SST}} = \underbrace{\sum_i (\hat{Y}_i - \bar{Y})^2}_{\mathrm{SSR}} + \underbrace{\sum_i (Y_i - \hat{Y}_i)^2}_{\mathrm{SSE}} \]
- \(\mathrm{SSR}\) (Sum of Squares due to Regression) — 회귀로 설명된 변동
- \(\mathrm{SSE}\) (Sum of Squares Error) — 잔차 변동
이는 ANOVA 의 \(\mathrm{SSB} + \mathrm{SSW}\) 분해와 완전히 같은 구조이다. ANOVA 의 “집단 평균 \(\bar{Y}_{i\cdot}\)” 이 회귀의 “예측값 \(\hat{Y}_i\)” 로 교체되었을 뿐이다.
7.2 \(R^2\) 와 \(\eta^2\) 의 동치성
결정계수:
\[ R^2 = \frac{\mathrm{SSR}}{\mathrm{SST}} = 1 - \frac{\mathrm{SSE}}{\mathrm{SST}} \]
ANOVA 의 효과크기:
\[ \eta^2 = \frac{\mathrm{SSB}}{\mathrm{SST}} \]
두 지표는 수식적으로 동일하다. 집단 변수를 더미로 인코딩한 회귀의 \(R^2\) 는 일원 ANOVA 의 \(\eta^2\) 와 정확히 일치한다.
7.3 수정 \(R^2\)
\[ R^2_{\text{adj}} = 1 - \frac{\mathrm{SSE}/(n - p - 1)}{\mathrm{SST}/(n - 1)} = 1 - (1 - R^2) \cdot \frac{n - 1}{n - p - 1} \]
\(p\) 는 설명변수 수. ANOVA 의 \(\omega^2\) 와 같은 편향 보정 아이디어다 — 모수 수가 늘어날 때의 자유도 손실을 반영한다.
7.4 회귀의 ANOVA 표
선형 회귀 결과에서 나오는 ANOVA 표는 구조가 ANOVA 와 동일하다:
| 원천 | 자유도 | 제곱합 | 평균제곱 | F |
|---|---|---|---|---|
| 회귀 | \(p\) | \(\mathrm{SSR}\) | \(\mathrm{MSR} = \mathrm{SSR}/p\) | \(\mathrm{MSR}/\mathrm{MSE}\) |
| 잔차 | \(n - p - 1\) | \(\mathrm{SSE}\) | \(\mathrm{MSE} = \mathrm{SSE}/(n-p-1)\) | |
| 전체 | \(n - 1\) | \(\mathrm{SST}\) |
이 표의 F 통계량은 “모든 회귀 계수가 0인가” (\(H_0 : \beta_1 = \cdots = \beta_p = 0\)) 를 검정한다. ANOVA 의 “모든 집단 평균이 같은가” 와 정확히 대응한다.
일원 ANOVA → 이원 ANOVA → ANCOVA → 다중회귀 → GLM 으로 이어지는 모든 선형 모형은 다음의 단일 원리를 공유한다:
관측 벡터 \(\mathbf{y}\) 를 모델 공간 \(V_{\text{model}}\) 과 그 직교여공간 \(V_{\text{model}}^\perp\) 로 투영하고, 각 투영의 노름제곱을 모델 설명력과 잔차로 해석한다.
ANOVA 에서는 \(V_{\text{model}}\) 이 “집단별 평균 공간” 이고, 회귀에서는 “설계행렬의 열공간”, ANCOVA 에서는 “두 공간의 합”이다. 수식과 용어는 달라도 구조는 동일하다.
Casella 가 Ch.11 에서 ANOVA 와 회귀를 하나의 챕터에서 다루는 이유가 여기에 있다.
8 코드 예시
8.1 Step 1: 순수 Python — 이원 ANOVA 의 직교 분해
import numpy as np
import pandas as pd
np.random.seed(20260406)
# 균형 설계: 3 수준의 A, 2 수준의 B, 셀당 n=5
a, b, n = 3, 2, 5
alpha = np.array([-2, 0, 2]) # A 효과
beta = np.array([-1, 1]) # B 효과
AB = np.zeros((a, b)) # 상호작용 없음 (예시 단순화)
sigma = 1.5
data = []
for i in range(a):
for j in range(b):
cell_mean = 10 + alpha[i] + beta[j] + AB[i, j]
for _ in range(n):
y = cell_mean + np.random.normal(0, sigma)
data.append((i, j, y))
df = pd.DataFrame(data, columns=["A", "B", "y"])
N = len(df)
y_bar = df["y"].mean()
# 주변 평균
a_means = df.groupby("A")["y"].mean()
b_means = df.groupby("B")["y"].mean()
ab_means = df.groupby(["A", "B"])["y"].mean()
# 제곱합 분해
SST = ((df["y"] - y_bar) ** 2).sum()
SSA = b * n * ((a_means - y_bar) ** 2).sum()
SSB_ = a * n * ((b_means - y_bar) ** 2).sum()
SSAB = 0
for i in range(a):
for j in range(b):
term = ab_means[i, j] - a_means[i] - b_means[j] + y_bar
SSAB += n * term ** 2
SSE = 0
for i in range(a):
for j in range(b):
cell_data = df[(df["A"] == i) & (df["B"] == j)]["y"]
SSE += ((cell_data - ab_means[i, j]) ** 2).sum()
print(f"SST = {SST:.3f}")
print(f"SSA = {SSA:.3f} (df = {a-1})")
print(f"SSB = {SSB_:.3f} (df = {b-1})")
print(f"SSAB = {SSAB:.3f} (df = {(a-1)*(b-1)})")
print(f"SSE = {SSE:.3f} (df = {a*b*(n-1)})")
print(f"\n검증: SSA + SSB + SSAB + SSE = {SSA + SSB_ + SSAB + SSE:.3f}")
print(f" SST = {SST:.3f}")
print(f"차이: {abs(SST - (SSA + SSB_ + SSAB + SSE)):.6f} (균형 설계에서 0)")
# F 통계량
from scipy import stats
MSA = SSA / (a - 1)
MSB = SSB_ / (b - 1)
MSAB = SSAB / ((a - 1) * (b - 1))
MSE = SSE / (a * b * (n - 1))
for name, ms, df1 in [("A", MSA, a-1), ("B", MSB, b-1), ("AB", MSAB, (a-1)*(b-1))]:
F = ms / MSE
p = stats.f.sf(F, df1, a * b * (n - 1))
print(f"{name}: F = {F:.3f}, p = {p:.4f}")8.2 Step 2: 비균형 설계와 Type I/II/III 비교
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
# 비균형 설계: 일부 셀에서 관측치 삭제
df_unbalanced = df.drop(index=[0, 1, 2]).reset_index(drop=True) # A=0, B=0 셀 축소
df_unbalanced["A"] = df_unbalanced["A"].astype("category")
df_unbalanced["B"] = df_unbalanced["B"].astype("category")
model = ols("y ~ C(A) * C(B)", data=df_unbalanced).fit()
print("=== Type I ===")
print(anova_lm(model, typ=1))
print("\n=== Type II ===")
print(anova_lm(model, typ=2))
print("\n=== Type III ===")
# Type III 는 effects coding 필요
model_sum = ols(
"y ~ C(A, Sum) * C(B, Sum)", data=df_unbalanced
).fit()
print(anova_lm(model_sum, typ=3))
# 세 결과 비교 — 비균형이므로 값이 다르다
# 균형 설계로 바꾸면 세 결과가 같아짐을 확인 가능8.3 Step 3: 회귀 ANOVA 표와 R² 동치성
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
np.random.seed(42)
# 일원 ANOVA 데이터
df_anova = pd.DataFrame({
"group": np.repeat(["A", "B", "C"], 20),
"y": np.concatenate([
np.random.normal(10, 2, 20),
np.random.normal(12, 2, 20),
np.random.normal(14, 2, 20),
])
})
# (1) ANOVA
model_anova = ols("y ~ C(group)", data=df_anova).fit()
anova_table = sm.stats.anova_lm(model_anova, typ=2)
print("ANOVA 표:")
print(anova_table)
SSB_anova = anova_table.loc["C(group)", "sum_sq"]
SST_anova = SSB_anova + anova_table.loc["Residual", "sum_sq"]
eta2 = SSB_anova / SST_anova
print(f"eta^2 = {eta2:.4f}")
# (2) 회귀 (더미 인코딩)
X = pd.get_dummies(df_anova["group"], drop_first=True).astype(float)
X = sm.add_constant(X)
model_reg = sm.OLS(df_anova["y"], X).fit()
print(f"\n회귀 R^2 = {model_reg.rsquared:.4f}")
print(f"조정 R^2 = {model_reg.rsquared_adj:.4f}")
# (3) 동치성 확인: eta^2 == R^2
print(f"\n|eta^2 - R^2| = {abs(eta2 - model_reg.rsquared):.2e}")9 핵심 정리
| 주제 | 요지 |
|---|---|
| 일원 분해 | \(\mathrm{SST} = \mathrm{SSB} + \mathrm{SSW}\) 는 분포 가정 없는 대수 항등식 |
| Cochran 정리 | 부분공간 직교 → 이차형식 독립 → \(\chi^2\) 분포 |
| 이원 균형 설계 | \(\mathrm{SST} = \mathrm{SSA} + \mathrm{SSB} + \mathrm{SSAB} + \mathrm{SSE}\) (직교 분해) |
| 이원 비균형 | 직교성 붕괴 → Type I/II/III 필요 |
| Type I | 순차적, 순서 의존, 위계적 모형에 적합 |
| Type II | 같은 차수 조정, 상호작용 없을 때 최고 검정력 |
| Type III | 모든 효과 조정, 상호작용 있을 때 해석 주의 |
| 기대 평균제곱 | F 검정 분모 결정, 혼합모형에서 필수 |
| 회귀와의 통합 | \(\eta^2 = R^2\), ANOVA 표 구조 동일 |
대수적 관점 (입문): \((y_{ij} - \bar{\bar{y}}) = (y_{ij} - \bar{y}_{i\cdot}) + (\bar{y}_{i\cdot} - \bar{\bar{y}})\), 제곱 후 교차항 소거. 계산은 되지만 “왜” 를 설명하지 못한다.
기하학적 관점 (중급): 관측 벡터의 직교 투영. 피타고라스 정리로 한 줄 증명. 이원 이상으로 자연스럽게 일반화.
분포론적 관점 (고급): Cochran 정리. 부분공간 직교성이 이차형식 독립성으로, \(\chi^2\) 분포와 F 분포로 이어진다.
모형 비교 관점 (실무): \(R(\text{항} \mid \text{기존})\) 으로 Type I/II/III 통합. 모형 간 잔차제곱합 차이가 “추가 설명력” 으로 해석된다.
이 네 관점은 모두 같은 수학을 기술하지만, 용도가 다르다. 교육에서는 1→2→3→4 순서로, 실무에서는 4를 주로 쓰되 2~3으로 검증하는 것이 건전한 방식이다.
10 관련 주제
선행 지식
- ANOVA와 회귀의 통합 관점 — 선형 모형의 공통 구조
- Oneway ANOVA: 고전적 가설과 F 검정 — 기본 분해 항등식
- The ANOVA F Test: 기하학적 유도와 실무 진단 — 투영 관점
- 정규 분포와 표본 분포 — \(\chi^2\), F 분포 기초
후속 주제
- Multiple Linear Regression — 회귀에서의 SS 분해
- 혼합 모형 추정 — 변량효과와 REML
- ANCOVA — 공변량을 포함한 SS 분해
관련 개념
- GLM — 하나의 프레임워크 — 지수족 일반화
- Simultaneous Estimation of Contrasts — 다중비교
- 반복측정 ANOVA — 피험자 내 분해