1 도입 — 그룹 수 일반화
이전 글 (A-MAX3-1) 에서 한 그룹과 두 그룹 사례를 다뤘다. 이제 임의의 \(J\) 그룹 으로 확장한다. 핵심 통찰: 모형 비교 형태는 그룹 수에 무관하다. SSE 분해와 F 통계량의 형태가 \(J = 2\) 에서 \(J = 3, 4, \ldots\) 로 자연스럽게 확장된다.
2 J 그룹 모형의 정의
\(J\) 개의 그룹, 각 그룹에 \(n_j\) 개의 관측이 있고, 종속 변수 \(Y_{ij}\) 는 그룹 \(j\) 의 \(i\) 번째 관측이다.
\[ Y_{ij} = \mu_j + \varepsilon_{ij}, \quad j = 1, 2, \ldots, J, \; i = 1, 2, \ldots, n_j \]
가정:
- \(\varepsilon_{ij} \sim \text{i.i.d. } N(0, \sigma^2)\)
- 그룹마다 분산이 같음 (등분산성)
- 관측이 서로 독립
총 관측 수는 \(n = \sum_{j=1}^{J} n_j\) 이다.
2.1 동등한 표현 — 효과 모수화 (Effect Coding)
같은 모형을 효과 모수화로 다시 쓰면
\[ Y_{ij} = \mu + \alpha_j + \varepsilon_{ij}, \quad \sum_{j=1}^{J} \alpha_j = 0 \]
여기서
- \(\mu\) — 전체 평균 (grand mean)
- \(\alpha_j = \mu_j - \mu\) — 그룹 \(j\) 의 효과 (전체 평균으로부터의 편차)
이 표현은 두 가지 장점이 있다.
- 해석 용이 — \(\alpha_j\) 가 처치 효과 를 직접 나타낸다.
- 모수의 수 일치 — 제약 \(\sum \alpha_j = 0\) 으로 자유로운 모수의 수가 \(\mu_j\) 표현과 같다 (\(J\) 개).
그러나 \(\mu_j\) 표현이 더 단순하므로 이 글은 그것으로 진행한다.
학생이 “\(\mu_j\) 표현과 \(\mu + \alpha_j\) 표현 중 어느 것이 맞나?” 라고 물을 때, 답은 둘 다 맞고 동등하다 이다.
\(\mu_j\) 표현은 셀 평균 모수화 (cell-means parameterization), \(\mu + \alpha_j\) 표현은 효과 모수화 (effects parameterization) 다. 통계 소프트웨어가 어느 것을 사용하느냐에 따라 출력이 달라지지만, 적합값과 잔차는 동일 하다.
R 의 lm() 은 기본적으로 dummy 코딩 (한 그룹을 reference 로) 을 사용한다. SAS 의 PROC GLM 은 그룹 평균 모수화를 제공한다. 어떤 모수화든 근본적인 모형은 같으므로 F 검정 결과와 \(R^2\) 도 같다.
3 Full Model 과 Restricted Model
3.1 Full Model
각 그룹이 자기 평균을 가진다.
\[ \text{Full: } Y_{ij} = \mu_j + \varepsilon_{ij} \]
모수의 수: \(J\) 개 (\(\mu_1, \mu_2, \ldots, \mu_J\)).
3.2 Restricted Model
모든 그룹이 같은 평균을 가진다.
\[ \text{Restricted: } Y_{ij} = \mu + \varepsilon_{ij} \]
모수의 수: 1 개 (\(\mu\)).
3.3 가설
귀무가설은 restricted model 이 충분하다 와 동치이다.
\[ H_0: \mu_1 = \mu_2 = \cdots = \mu_J \quad \text{vs} \quad H_1: \text{at least one } \mu_j \text{ differs} \]
대안은 어떤 그룹이라도 다르면 참이다. 이 형태가 양측 검정의 자연스러운 일반화다.
4 SSE 분해 — 핵심 정리
각 모형의 잔차 제곱합:
\[ \text{SSE}_F = \sum_{j=1}^{J} \sum_{i=1}^{n_j} (Y_{ij} - \bar{Y}_j)^2 \quad (\text{full model}) \]
\[ \text{SSE}_R = \sum_{j=1}^{J} \sum_{i=1}^{n_j} (Y_{ij} - \bar{Y})^2 \quad (\text{restricted model}) \]
여기서 \(\bar{Y}_j = \frac{1}{n_j} \sum_{i} Y_{ij}\) 는 그룹 평균, \(\bar{Y} = \frac{1}{n} \sum_{i, j} Y_{ij}\) 는 전체 평균이다.
4.1 정리: 분산 분해 (Sum of Squares Decomposition)
\[ \text{SSE}_R = \text{SSE}_F + \sum_{j=1}^{J} n_j (\bar{Y}_j - \bar{Y})^2 \]
오른쪽 두 번째 항이 그룹 간 제곱합 \(\text{SS}_B\) 이다.
\[ \boxed{\text{SS}_T = \text{SS}_W + \text{SS}_B} \]
- \(\text{SS}_T = \text{SSE}_R\) — 전체 제곱합 (total)
- \(\text{SS}_W = \text{SSE}_F\) — 그룹 내 제곱합 (within)
- \(\text{SS}_B = \text{SSE}_R - \text{SSE}_F\) — 그룹 간 제곱합 (between)
4.2 증명 (스케치)
핵심 트릭은 \(Y_{ij} - \bar{Y}\) 를 분해 하는 것이다.
\[ Y_{ij} - \bar{Y} = (Y_{ij} - \bar{Y}_j) + (\bar{Y}_j - \bar{Y}) \]
이 식의 양변을 제곱하고 합하면 cross product 항이 0 이 된다 (각 그룹 내 평균 편차의 합이 0 이라는 사실로부터).
\[ \sum_{i, j} (Y_{ij} - \bar{Y})^2 = \sum_{i, j} (Y_{ij} - \bar{Y}_j)^2 + \sum_{j} n_j (\bar{Y}_j - \bar{Y})^2 \]
이것이 분산 분해의 대수적 도출이다. \(\square\)
자료 점들을 분포로 그리고, 각 점에서 전체 평균 까지의 거리를 빨강, 자기 그룹 평균 까지의 거리를 파랑이라 하자.
- 빨강 거리 제곱합 = \(\text{SS}_T\)
- 파랑 거리 제곱합 = \(\text{SS}_W\)
- 빨강과 파랑의 차이 = \(\text{SS}_B\)
만약 모든 그룹이 같은 평균을 가지면 (귀무가설 참), 그룹 평균이 전체 평균과 일치해 빨강 = 파랑이 되고 \(\text{SS}_B = 0\). 만약 그룹 평균이 멀리 떨어져 있으면, 빨강 (전체에서의 거리) 이 파랑 (그룹에서의 거리) 보다 훨씬 커서 \(\text{SS}_B\) 가 크다.
따라서 \(\text{SS}_B\) 는 “그룹들이 전체 평균에서 얼마나 흩어져 있는가” 를 정량화한 것이다.
5 자유도
각 SS 의 자유도는 다음과 같다.
| SS | 자유도 |
|---|---|
| \(\text{SS}_T\) | \(n - 1\) |
| \(\text{SS}_W\) | \(n - J\) |
| \(\text{SS}_B\) | \(J - 1\) |
자유도의 의미:
- \(\text{SS}_T\): 전체 평균 1 개를 추정했으므로 \(n\) 자료에서 1 자유도가 빠짐
- \(\text{SS}_W\): 각 그룹에서 그룹 평균 1 개씩 (\(J\) 개) 추정했으므로 \(n - J\)
- \(\text{SS}_B\): 그룹 평균 \(J\) 개에서 전체 평균 1 개의 제약이 있어 \(J - 1\)
자유도가 자연스럽게 일치한다: \((n - 1) = (J - 1) + (n - J)\).
6 F 통계량 — 일반 도출
평균 제곱 (mean square, MS) 은 SS 를 자유도로 나눈 것이다.
\[ \text{MS}_B = \frac{\text{SS}_B}{J - 1}, \quad \text{MS}_W = \frac{\text{SS}_W}{n - J} \]
F 통계량:
\[ \boxed{F = \frac{\text{MS}_B}{\text{MS}_W} = \frac{\text{SS}_B / (J - 1)}{\text{SS}_W / (n - J)}} \]
이 F 가 모형 비교의 중심 통계량 이다. 두 모형의 SSE 차이를 정규화한 비율이며,
\[ F = \frac{(\text{SSE}_R - \text{SSE}_F) / (\text{df}_R - \text{df}_F)}{\text{SSE}_F / \text{df}_F} \]
라는 일반 모형 비교 공식 의 특수 사례다. 이 일반 공식이 ANOVA, 회귀의 부분 F 검정, ANCOVA, 다원 ANOVA, MANOVA 까지 모두 동일한 형태로 적용된다.
6.1 F 의 분포
귀무가설 \(H_0: \mu_1 = \cdots = \mu_J\) 하에서, F 통계량은 F 분포 를 따른다.
\[ F \sim F_{J - 1, \; n - J} \]
이 분포는 두 카이제곱 분포의 비율 로 정의되며, Fisher 가 1924 년에 도출했다.
두 독립적 카이제곱 변량 \(X_1 \sim \chi^2_{d_1}\), \(X_2 \sim \chi^2_{d_2}\) 에 대해
\[ F = \frac{X_1 / d_1}{X_2 / d_2} \sim F_{d_1, d_2} \]
ANOVA 에서 \(d_1 = J - 1\) (분자 자유도), \(d_2 = n - J\) (분모 자유도) 이다.
7 ANOVA 표 — 표준 형식
ANOVA 결과는 전통적으로 다음 표 형식으로 보고된다.
| Source | SS | df | MS | F | p |
|---|---|---|---|---|---|
| Between groups | \(\text{SS}_B\) | \(J - 1\) | \(\text{MS}_B\) | \(F\) | \(p\) |
| Within groups (Error) | \(\text{SS}_W\) | \(n - J\) | \(\text{MS}_W\) | ||
| Total | \(\text{SS}_T\) | \(n - 1\) |
표의 첫 행이 처치 효과의 검정 이고, 두 번째 행이 잔차 이다. F 와 p 는 첫 행에만 표시된다.
8 검정 절차
- 자료에서 \(\bar{Y}_j\) (\(j = 1, \ldots, J\)) 와 \(\bar{Y}\) 를 계산한다.
- \(\text{SS}_B\) 와 \(\text{SS}_W\) 를 분해 공식으로 계산한다.
- F 통계량을 계산한다.
- F 분포 표 또는 함수로 p 값을 조회한다.
- p 가 \(\alpha\) 보다 작으면 \(H_0\) 을 기각한다 (그룹 간 차이 존재).
F 통계량을 직관적 으로 본다.
\[ F = \frac{\text{그룹 평균이 흩어진 정도}}{\text{그룹 내 자료가 흩어진 정도}} = \frac{\text{signal}}{\text{noise}} \]
- 분자 (\(\text{MS}_B\)) — 그룹 평균이 전체 평균에서 얼마나 멀리 떨어져 있는가 (signal)
- 분모 (\(\text{MS}_W\)) — 같은 그룹 내에서 자료가 얼마나 변동하는가 (noise)
\(F = 1\) 근처: 그룹 평균의 흩어짐이 자료 자체의 흩어짐과 비슷 → 그룹 차이가 noise 수준 → \(H_0\) 기각 못함. \(F \gg 1\): 그룹 평균이 noise 보다 훨씬 더 흩어져 있음 → 차이가 실재할 가능성 → \(H_0\) 기각.
이 신호 대 잡음 비유는 데이터 사이언스에서 친숙한 패턴이다. 효과를 잡으려면 신호가 잡음보다 충분히 커야 한다 는 원리는 검정력 분석, 표본 크기 산정, A/B 테스트 설계에 모두 적용된다.
9 예시 — Mood Induction 자료
Maxwell Ch.3 그림 3.1 의 자료를 재구성한다.
3 그룹 (\(J = 3\)): Pleasant, Neutral, Unpleasant. 각 그룹에 10 명 (\(n_1 = n_2 = n_3 = 10\), \(n = 30\)).
| 그룹 | \(n_j\) | \(\bar{Y}_j\) | \(s_j\) |
|---|---|---|---|
| Pleasant | 10 | 5.5 | 1.0 |
| Neutral | 10 | 4.0 | 1.0 |
| Unpleasant | 10 | 2.5 | 1.0 |
| 전체 | 30 | 4.0 | — |
분해 계산:
- \(\text{SS}_B = 10 \cdot (5.5 - 4)^2 + 10 \cdot (4.0 - 4)^2 + 10 \cdot (2.5 - 4)^2 = 22.5 + 0 + 22.5 = 45\)
- \(\text{SS}_W = 9 \cdot 1 + 9 \cdot 1 + 9 \cdot 1 = 27\) (각 그룹 분산 \(\times (n_j - 1)\))
- \(\text{MS}_B = 45 / (3 - 1) = 22.5\)
- \(\text{MS}_W = 27 / (30 - 3) = 1.0\)
- \(F = 22.5 / 1.0 = 22.5\)
자유도 \(F_{2, 27}\) 분포에서 \(F = 22.5\) 의 p 값은 \(p < 0.0001\) 로 매우 작다. \(H_0\) 을 강하게 기각한다.
10 표본 크기와 검정력
\(J\) 그룹 ANOVA 의 검정력은 효과 크기와 표본 크기의 함수 이다. 효과 크기는 일반적으로
\[ f = \frac{\sigma_{\text{between}}}{\sigma_{\text{within}}} \]
(Cohen’s f) 로 측정한다. 검정력 \(1 - \beta\) 를 달성하기 위한 표본 크기 \(n\) 은 비중심 F 분포로부터 계산된다.
| Cohen’s \(f\) | 효과 크기 |
|---|---|
| 0.10 | small |
| 0.25 | medium |
| 0.40 | large |
A-WOO8-* 시리즈에서 자세히 다룬다.
11 J = 2 사례와의 연결
\(J = 2\) 일 때 ANOVA 의 F 통계량은 two-sample t 통계량의 제곱이다.
\[ F_{1, n-2} = (t_{n-2})^2 \]
이는 일반 \(J\) 그룹 사례의 특수 사례 이다. 즉 t 검정과 F 검정은 같은 모형 비교 골격 의 두 표현이다.
12 균형 vs 불균형 설계
\(n_1 = n_2 = \cdots = n_J\) 인 경우 균형 설계 (balanced design), 그렇지 않으면 불균형 설계 (unbalanced design) 이다.
| 항목 | 균형 | 불균형 |
|---|---|---|
| 분산 | 그룹별 동일 영향 | 그룹별 가중치 다름 |
| 검정력 | 최대 | 약간 감소 |
| F 의 분포 | 정확히 \(F_{J-1, n-J}\) | 동일 (정확) |
| Type II SS | Type I 과 동일 | Type I 과 다름 |
ANOVA 의 F 검정 자체는 불균형 설계에서도 정확히 작동한다. 다만 제곱합 분해 의 모호성 (Type I, II, III SS) 이 불균형 설계에서 발생한다 (Maxwell Ch.7 에서 다룬다).
A/B 테스트에서 50:50 트래픽 배정이 표준이다. 왜?
검정력의 극대화 때문이다. 같은 총 표본 \(n\) 이라도, 동일하게 분배 할 때 두 그룹 평균 차이의 표준 오차가 가장 작아진다.
\[ \text{SE}(\bar{Y}_1 - \bar{Y}_2) = s_p \sqrt{\frac{1}{n_1} + \frac{1}{n_2}} \]
\(n_1 + n_2 = n\) 고정 시, \(\frac{1}{n_1} + \frac{1}{n_2}\) 는 \(n_1 = n_2 = n/2\) 일 때 최소가 된다 (산술-조화 평균 부등식).
따라서 검정력을 최대화하려면 균형 설계를 선택한다. 다만 비용 차이 가 있는 경우 (한 그룹의 측정 비용이 더 비쌈) 에는 비대칭 배정이 합리적일 수 있다.
13 코드 예시 — J = 3 ANOVA
import numpy as np
import pandas as pd
from scipy.stats import f_oneway, f
import statsmodels.api as sm
from statsmodels.formula.api import ols
np.random.seed(42)
n_each = 10
group_pleasant = np.random.normal(5.5, 1.0, n_each)
group_neutral = np.random.normal(4.0, 1.0, n_each)
group_unpleasant = np.random.normal(2.5, 1.0, n_each)
# 1. scipy 기본 ANOVA
F, p = f_oneway(group_pleasant, group_neutral, group_unpleasant)
print(f"F = {F:.3f}, p = {p:.5f}")
# 2. 직접 분해 계산
all_data = np.concatenate([group_pleasant, group_neutral, group_unpleasant])
groups = ['P']*n_each + ['N']*n_each + ['U']*n_each
df = pd.DataFrame({'y': all_data, 'group': groups})
grand_mean = df['y'].mean()
group_means = df.groupby('group')['y'].mean()
group_sizes = df.groupby('group').size()
ss_between = (group_sizes * (group_means - grand_mean)**2).sum()
ss_within = sum(((df[df['group']==g]['y'] - group_means[g])**2).sum()
for g in ['P', 'N', 'U'])
ss_total = ((df['y'] - grand_mean)**2).sum()
J = 3
n = len(df)
ms_between = ss_between / (J - 1)
ms_within = ss_within / (n - J)
F_manual = ms_between / ms_within
p_manual = 1 - f.cdf(F_manual, J - 1, n - J)
print(f"\n분해:")
print(f"SS_T = {ss_total:.3f}")
print(f"SS_B = {ss_between:.3f}, MS_B = {ms_between:.3f}")
print(f"SS_W = {ss_within:.3f}, MS_W = {ms_within:.3f}")
print(f"F (수동 계산) = {F_manual:.3f}")
print(f"분해 일치: SS_T = SS_B + SS_W → {np.isclose(ss_total, ss_between + ss_within)}")
# 3. statsmodels - ANOVA 표
model = ols('y ~ C(group)', data=df).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print(f"\nANOVA 표:")
print(anova_table)이 코드는 세 가지 다른 방법 으로 동일한 F 통계량을 계산한다.
scipy.stats.f_oneway— 직접 계산- SSE 분해를 수동으로 — 모형 비교 관점
statsmodels의anova_lm— ANOVA 표 출력
세 결과가 일치하며, 이는 세 가지 표현이 같은 분석 임을 보여 준다.
14 후속 — F 검정의 분포와 효과 크기
이 글에서는 F 통계량의 형태 와 분포 를 다뤘다. 다음 글 A-MAX3-3 은 다음을 다룬다.
- F 분포의 특성과 임계값
- 효과 크기 측정 (\(\eta^2\), \(\omega^2\), Cohen’s \(f\), Cohen’s \(d\))
- 신뢰 구간 구성
- 검정력 분석
이 단계가 ANOVA 결과 보고의 완전한 형태 를 만든다.
15 관련 주제
선행 지식
후속 주제 (Phase A)
다른 카테고리 연결