1 개요
이전 포스트(ANOVA와 회귀의 통합 관점)에서 ANOVA 모형의 구조와 회귀와의 관계를 살펴보았다. 이 포스트는 일원분류 ANOVA의 가설검정 이론을 집중적으로 다룬다.
Casella & Berger(2002, Ch.11)는 ANOVA 귀무가설이 단순한 평균 동일성 검정처럼 보이지만, 실제로는 모든 대비(contrast)가 0이라는 무한차원 귀무가설의 교집합이라는 점을 강조한다. 이 관점은 F 통계량의 유도를 자연스럽게 이끌고, Scheffé의 동시 추론 방법의 타당성을 설명한다.
2 모형 재설정
2.1 셀 평균 모형
일원분류 ANOVA의 셀 평균 모형(cell means model)은 다음과 같다 (Casella & Berger, 2002, eq. 11.2.1):
\[ Y_{ij} = \theta_i + \epsilon_{ij}, \quad i = 1, \ldots, k, \quad j = 1, \ldots, n_i \]
세 가지 가정이 전제된다:
| 가정 | 수식 | 의미 |
|---|---|---|
| 비상관 | \(\text{Cov}(\epsilon_{ij}, \epsilon_{i'j'}) = 0\) | 오차는 독립 |
| 정규성 | \(\epsilon_{ij} \sim N(0, \sigma^2)\) | 정규 오차 |
| 등분산 | 모든 집단에서 동일한 \(\sigma^2\) | 집단 간 분산 동질성 |
따라서 \(Y_{ij} \sim N(\theta_i, \sigma^2)\) 이고, 집단 내 분산은 모두 동일하지만 평균 \(\theta_i\) 는 집단마다 다를 수 있다.
2.2 표기 규약: 점 표기법 (Dot Notation)
아래 첨자 자리에 점(dot)이 오면 해당 첨자를 합산한 것을 나타낸다:
\[ Y_{i\cdot} = \sum_{j=1}^{n_i} Y_{ij}, \quad \bar{Y}_{i\cdot} = \frac{1}{n_i} \sum_{j=1}^{n_i} Y_{ij} \]
두 첨자를 모두 합산한 전체 평균(grand mean)은 표기 단순화를 위해:
\[ \bar{\bar{Y}} = \frac{1}{N} \sum_{i=1}^{k} \sum_{j=1}^{n_i} Y_{ij}, \quad N = \sum_{i=1}^{k} n_i \]
3 고전적 ANOVA 가설
ANOVA 귀무가설은 모든 집단 평균이 동일하다는 가설이다 (Casella & Berger, 2002, eq. 11.2.3):
\[ H_0 : \theta_1 = \theta_2 = \cdots = \theta_k \quad \text{versus} \quad H_1 : \theta_i \neq \theta_j \text{ for some } i, j \]
\(H_0\) 를 기각하면 “어떤 집단들 사이에 차이가 있다”는 결론만 내릴 수 있다. 어떤 쌍이 다른지, 얼마나 다른지에 대한 정보는 제공하지 않는다. \(H_1\) 의 수용은 모든 \(\theta_i\) 가 서로 다르다는 뜻이 아니라, 적어도 두 집단이 다르다는 뜻이다.
이것이 바로 Casella가 강조하는 “고전적 ANOVA 귀무가설의 한계”다 — 실무에서는 귀무가설 기각 자체보다 효과의 정량화가 더 중요하다.
4 대비 (Contrasts): ANOVA 가설의 재언어화
4.1 대비의 정의
\(t = (t_1, \ldots, t_k)\) 를 모수 또는 통계량의 집합이라 하고, \(a = (a_1, \ldots, a_k)\) 를 알려진 상수라 하자. 함수
\[ \sum_{i=1}^{k} a_i t_i \]
를 선형결합(linear combination)이라 한다. 추가로 \(\sum_{i=1}^k a_i = 0\) 이면, 이를 대비(contrast)라 한다.
대비의 핵심은 가중치 합이 0이어야 한다는 조건이다. 이 조건이 있어야 “평균들의 차이”를 나타낼 수 있다.
왜 \(\sum a_i = 0\) 인가? 대비는 상대적 차이를 측정한다. 예를 들어 \(\theta_1 - \theta_2\) 의 계수는 \((1, -1, 0, \ldots)\) 이고 합은 0이다. 만약 합이 0이 아니면(예: \((1, 0, 0, \ldots)\)) 이는 절대적 수준 \(\theta_1\) 을 측정하는 것이지 비교가 아니다. \(\sum a_i = 0\) 은 ’전체 평균을 소거하고 차이만 남겨라’는 조건이다.
대비의 예:
| 대비 벡터 \(a\) | 대비 \(\sum a_i \theta_i\) | 의미 |
|---|---|---|
| \((1, -1, 0, \ldots, 0)\) | \(\theta_1 - \theta_2\) | 집단 1과 2의 평균 차이 |
| \((1, -\frac{1}{2}, -\frac{1}{2}, 0, \ldots)\) | \(\theta_1 - \frac{\theta_2 + \theta_3}{2}\) | 집단 1 vs. 집단 2, 3 평균 |
| \((\frac{1}{2}, \frac{1}{2}, -\frac{1}{2}, -\frac{1}{2})\) | \(\frac{\theta_1+\theta_2}{2} - \frac{\theta_3+\theta_4}{2}\) | 두 집단 쌍의 평균 비교 |
4.2 ANOVA 가설 ↔︎ 대비의 등가성
\(\theta = (\theta_1, \ldots, \theta_k)\) 를 임의의 모수라 하자. 그러면
\[ \theta_1 = \theta_2 = \cdots = \theta_k \iff \sum_{i=1}^{k} a_i \theta_i = 0 \quad \text{for all } a \in \mathcal{A}, \]
여기서 \(\mathcal{A} = \left\{ a = (a_1, \ldots, a_k) : \sum_{i=1}^k a_i = 0 \right\}\) 이다. 즉, 모든 대비가 0이어야 한다.
증명의 핵심 아이디어:
\((\Rightarrow)\) 방향: \(\theta_1 = \cdots = \theta_k = \theta\) 이면,
\[ \sum_{i=1}^{k} a_i \theta_i = \theta \sum_{i=1}^{k} a_i = 0 \quad (\because \sum a_i = 0) \]
\((\Leftarrow)\) 방향: \(a_1 = (1,-1,0,\ldots,0)\), \(a_2 = (0,1,-1,0,\ldots,0)\), …, \(a_{k-1} = (0,\ldots,0,1,-1)\) 을 순서대로 적용하면, \(\theta_1 = \theta_2\), \(\theta_2 = \theta_3\), …, \(\theta_{k-1} = \theta_k\) 가 연쇄적으로 도출된다. \(\square\)
직관: 모든 평균이 같다면( \(\theta_1 = \cdots = \theta_k\) ), 어떤 가중치 \(a\) 로 조합해도 \(\sum a_i \theta_i = \theta \sum a_i = 0\) 이다 — 모든 대비가 0이다. 역으로, 하나라도 다른 평균이 있다면 그 차이를 포착하는 대비가 반드시 존재한다(예: 쌍별 차이). ‘모든 대비 = 0’ 과 ’모든 평균 같음’이 동치인 이유이다.
이 정리 덕분에 ANOVA 귀무가설은 다음과 같이 재표현된다:
\[ H_0 : \sum_{i=1}^{k} a_i \theta_i = 0 \quad \text{for all } a \in \mathcal{A} \]
\[ H_1 : \sum_{i=1}^{k} a_i \theta_i \neq 0 \quad \text{for some } a \in \mathcal{A} \]
이 재표현의 이점은 복잡한 다변량 귀무가설을 단변량 가설들의 교집합으로 분해할 수 있다는 점이다.
5 선형결합의 추론
5.1 분포 결과
ANOVA 가정 하에서 \(Y_{ij} \sim N(\theta_i, \sigma^2)\) 이므로:
\[ \bar{Y}_{i\cdot} \sim N\!\left(\theta_i, \sigma^2/n_i\right) \]
임의의 상수 \(a = (a_1, \ldots, a_k)\) 에 대해 선형결합의 분포는:
\[ E\!\left(\sum_{i=1}^{k} a_i \bar{Y}_{i\cdot}\right) = \sum_{i=1}^{k} a_i \theta_i, \quad \text{Var}\!\left(\sum_{i=1}^{k} a_i \bar{Y}_{i\cdot}\right) = \sigma^2 \sum_{i=1}^{k} \frac{a_i^2}{n_i} \]
5.2 합동 분산 추정량 (Pooled Variance)
각 집단의 표본분산 \(S_i^2 = \frac{1}{n_i-1}\sum_j (Y_{ij} - \bar{Y}_{i\cdot})^2\) 은 동일한 \(\sigma^2\) 를 추정하므로, 이들을 합쳐서 더 정밀한 추정량을 구한다 (Casella & Berger, 2002, eq. 11.2.5):
\[ S_p^2 = \frac{1}{N-k} \sum_{i=1}^{k} (n_i - 1) S_i^2 = \frac{1}{N-k} \sum_{i=1}^{k} \sum_{j=1}^{n_i} (Y_{ij} - \bar{Y}_{i\cdot})^2 \]
\(S_i^2\) 들이 독립이므로 Lemma 5.3.2에 의해:
\[ \frac{(N-k) S_p^2}{\sigma^2} \sim \chi^2_{N-k} \]
5.3 t 통계량 — 단일 대비 검정
\(\sigma\) 를 \(S_p\) 로 대체하면 (Casella & Berger, 2002, eq. 11.2.6):
\[ \frac{\sum_{i=1}^{k} a_i \bar{Y}_{i\cdot} - \sum_{i=1}^{k} a_i \theta_i}{\sqrt{S_p^2 \sum_{i=1}^{k} a_i^2 / n_i}} \sim t_{N-k} \]
이를 이용하면 대비 \(\sum a_i \theta_i\) 에 대한 검정 및 신뢰구간을 구성할 수 있다.
가설검정 (eq. 11.2.7): \(H_0 : \sum a_i \theta_i = 0\) 을 \(H_1 : \sum a_i \theta_i \neq 0\) 에 대해 검정할 때,
\[ \text{기각} \iff \left| \frac{\sum_{i=1}^{k} a_i \bar{Y}_{i\cdot}}{\sqrt{S_p^2 \sum_{i=1}^{k} a_i^2 / n_i}} \right| > t_{N-k,\, \alpha/2} \]
신뢰구간 (eq. 11.2.8): \(1-\alpha\) 신뢰구간은:
\[ \sum_{i=1}^{k} a_i \bar{Y}_{i\cdot} \pm t_{N-k,\, \alpha/2} \sqrt{S_p^2 \sum_{i=1}^{k} \frac{a_i^2}{n_i}} \]
집단 1과 2의 평균 비교: \(a = (1, -1, 0, \ldots, 0)\) 을 사용하면, \(H_0 : \theta_1 = \theta_2\) 의 기각 조건은
\[ \left| \frac{\bar{Y}_{1\cdot} - \bar{Y}_{2\cdot}}{\sqrt{S_p^2 (1/n_1 + 1/n_2)}} \right| > t_{N-k,\, \alpha/2} \]
이는 2-표본 t 검정과 형태가 같지만, 여기서 \(S_p^2\) 는 모든 집단 \(1, \ldots, k\) 의 정보를 활용하여 추정된다는 차이가 있다. 따라서 자유도가 더 크고 검정력이 높다.
집단 1 vs. 집단 2, 3 평균: \(a = (1, -1/2, -1/2, 0, \ldots, 0)\) 을 사용하면, \(H_0 : \theta_1 = (\theta_2 + \theta_3)/2\) 의 기각 조건은
\[ \left| \frac{\bar{Y}_{1\cdot} - \frac{1}{2}\bar{Y}_{2\cdot} - \frac{1}{2}\bar{Y}_{3\cdot}}{\sqrt{S_p^2 (1/n_1 + 1/(4n_2) + 1/(4n_3))}} \right| > t_{N-k,\, \alpha/2} \]
6 ANOVA F 검정 유도
6.1 합집합-교집합 방법 (Union-Intersection Method)
Theorem 11.2.5에 의해 ANOVA 귀무가설은 다음과 같이 교집합으로 표현된다:
\[ H_0 : \theta \in \bigcap_{a \in \mathcal{A}} \Theta_a, \quad \text{여기서 } \Theta_a = \left\{ \theta : \sum_{i=1}^k a_i \theta_i = 0 \right\} \]
UIT(Union-Intersection Test)는 임의의 \(a\) 에 대해 \(H_{0_a}\) 를 기각할 수 있으면 \(H_0\) 를 기각한다. 각 \(H_{0_a}\) 는 t 통계량으로 검정하므로, ANOVA F 검정은 \(\sup_a T_a\) 를 기각역으로 사용한다:
\[ T_a = \left| \frac{\sum_{i=1}^k a_i \bar{Y}_{i\cdot}}{\sqrt{S_p^2 \sum_{i=1}^k a_i^2 / n_i}} \right| \quad (H_0 \text{ 하에서}) \]
6.2 Lemma 11.2.7: 이차형식의 최댓값
\((v_1, \ldots, v_k)\) 를 상수, \((c_1, \ldots, c_k)\) 를 양의 상수라 하자. \(\mathcal{A} = \{a : \sum a_i = 0\}\) 에서,
\[ \max_{a \in \mathcal{A}} \left\{ \frac{\left(\sum_{i=1}^k a_i v_i\right)^2}{\sum_{i=1}^k a_i^2 / c_i} \right\} = \sum_{i=1}^{k} c_i (v_i - \bar{v}_c)^2 \]
여기서 \(\bar{v}_c = \sum c_i v_i / \sum c_i\) 이다. 최댓값은 \(a_i = K c_i (v_i - \bar{v}_c)\) (\(K \neq 0\)) 에서 달성된다.
이 보조정리의 의미: 모든 가능한 대비 중 ’집단 간 차이를 가장 크게 드러내는 방향’을 찾는 것이다. F 통계량은 이 최강 대비에 기반하므로, 어떤 방향의 차이든 놓치지 않는다. 이것이 F 검정이 전방위(omnibus) 검정인 이유이다.
증명 핵심: Cauchy-Schwarz 부등식을 \(c_i/C\) 를 확률측도로 하는 기대값 공간에 적용하면,
\[ \left(\sum b_i v_i\right)^2 \leq \sum_{i=1}^k c_i (v_i - \bar{v}_c)^2 \quad \text{for any } b \in \mathcal{B}, \]
등호는 \(b_i \propto c_i(v_i - \bar{v}_c)\) 일 때 성립한다. \(\square\)
6.3 Theorem 11.2.8: \(\sup T_a^2\) 의 분포
\[ \sup_{a : \sum a_i = 0} T_a^2 = \frac{\sum_{i=1}^{k} n_i \left(\bar{Y}_{i\cdot} - \bar{\bar{Y}}\right)^2}{S_p^2} \]
(여기서 \(H_0\) 하에서 \(\theta_i - \bar{\theta}\) 항이 소거됨). 또한 ANOVA 가정 하에서,
\[ \sup_{a : \sum a_i = 0} T_a^2 \sim (k-1) F_{k-1,\, N-k} \]
즉, \(\sup T_a^2 / (k-1)\) 은 자유도 \((k-1, N-k)\) 의 F 분포를 따른다.
직관: \(\sup_a T_a^2\) 는 ’최악의 경우 대비 검정 통계량’이다. 이를 \((k-1)\) 로 나누면 \(F_{k-1, N-k}\) 분포를 따른다. \((k-1)\) 은 대비가 살 수 있는 자유 차원의 수이다 — \(k\) 개 집단 평균에서 전체 평균을 빼면 \(k-1\) 차원이 남는다.
증명: Lemma 11.2.7을 \(v_i = \bar{U}_i = \bar{Y}_{i\cdot} - \theta_i\), \(c_i = n_i\) 로 적용하면 수치적 결과가 바로 나온다. 분포 결과는 분자와 분모가 독립인 카이제곱 확률변수의 비임을 보이면 된다.
6.4 F 검정 통계량
\(H_0\) 하에서 \(\theta_i = \bar{\theta}\) 이므로, ANOVA F 검정은 다음을 기각역으로 사용한다:
\[ \boxed{F = \frac{\sum_{i=1}^{k} n_i (\bar{Y}_{i\cdot} - \bar{\bar{Y}})^2 / (k-1)}{S_p^2} > F_{k-1,\, N-k,\, \alpha}} \]
분자는 집단 간 변동(MSB), 분모는 집단 내 변동(MSW = \(S_p^2\)) 이다.
\(H_0\) 가 참이면 집단 간 평균 차이 \(\bar{Y}_{i\cdot} - \bar{\bar{Y}}\) 는 순수 표본오차에 의한 것이므로 작다. \(H_0\) 가 거짓이면 진짜 처리 효과 \(\theta_i - \bar{\theta}\) 가 분자에 추가로 반영되어 F 가 커진다.
즉, F 가 크다 = 집단 간 변동이 집단 내 변동에 비해 크다 = 처리 효과가 있다.
7 제곱합 분해 (Partitioning Sums of Squares)
7.1 기본 항등식
임의의 수 \(y_{ij}\) 에 대해,
\[ \underbrace{\sum_{i=1}^{k} \sum_{j=1}^{n_i} (y_{ij} - \bar{\bar{y}})^2}_{\mathrm{SST}} = \underbrace{\sum_{i=1}^{k} n_i (\bar{y}_{i\cdot} - \bar{\bar{y}})^2}_{\mathrm{SSB}} + \underbrace{\sum_{i=1}^{k} \sum_{j=1}^{n_i} (y_{ij} - \bar{y}_{i\cdot})^2}_{\mathrm{SSW}} \]
즉, \(\mathrm{SST} = \mathrm{SSB} + \mathrm{SSW}\).
증명: \((y_{ij} - \bar{\bar{y}}) = (y_{ij} - \bar{y}_{i\cdot}) + (\bar{y}_{i\cdot} - \bar{\bar{y}})\) 로 분해한 후 제곱을 전개하면, 교차항 \(\sum_j (y_{ij} - \bar{y}_{i\cdot})(\bar{y}_{i\cdot} - \bar{\bar{y}}) = (\bar{y}_{i\cdot} - \bar{\bar{y}}) \sum_j (y_{ij} - \bar{y}_{i\cdot}) = 0\) 이 되어 소거된다. \(\square\)
7.2 카이제곱 분포 결과
\(Y_{ij} \sim N(\theta_i, \sigma^2)\) 하에서 (Casella & Berger, 2002, eqs. 11.2.16–11.2.17):
\[ \frac{\mathrm{SSW}}{\sigma^2} = \frac{1}{\sigma^2} \sum_{i=1}^{k} \sum_{j=1}^{n_i} (Y_{ij} - \bar{Y}_{i\cdot})^2 \sim \chi^2_{N-k} \quad \text{(항상 성립)} \]
\(H_0 : \theta_1 = \cdots = \theta_k\) 하에서 추가로:
\[ \frac{\mathrm{SSB}}{\sigma^2} = \frac{1}{\sigma^2} \sum_{i=1}^{k} n_i (\bar{Y}_{i\cdot} - \bar{\bar{Y}})^2 \sim \chi^2_{k-1} \]
\[ \frac{\mathrm{SST}}{\sigma^2} = \frac{1}{\sigma^2} \sum_{i=1}^{k} \sum_{j=1}^{n_i} (Y_{ij} - \bar{\bar{Y}})^2 \sim \chi^2_{N-1} \]
또한 SSB와 SSW는 독립이다 (정규성 가정에 의존). 따라서 F 통계량은:
\[ F = \frac{\mathrm{SSB}/(k-1)}{\mathrm{SSW}/(N-k)} = \frac{\mathrm{MSB}}{\mathrm{MSW}} \sim F_{k-1,\, N-k} \quad \text{under } H_0 \]
7.3 ANOVA 표 (Table 11.2.1)
| 변동원 | 자유도 | 제곱합 | 평균제곱 | F 통계량 |
|---|---|---|---|---|
| 집단 간 (Between) | \(k-1\) | \(\mathrm{SSB} = \sum_i n_i (\bar{y}_{i\cdot} - \bar{\bar{y}})^2\) | \(\mathrm{MSB} = \mathrm{SSB}/(k-1)\) | \(F = \mathrm{MSB}/\mathrm{MSW}\) |
| 집단 내 (Within) | \(N-k\) | \(\mathrm{SSW} = \sum_i \sum_j (y_{ij} - \bar{y}_{i\cdot})^2\) | \(\mathrm{MSW} = \mathrm{SSW}/(N-k)\) | |
| 합계 (Total) | \(N-1\) | \(\mathrm{SST} = \sum_i \sum_j (y_{ij} - \bar{\bar{y}})^2\) |
제곱합 열과 자유도 열은 더해지지만, 평균제곱 열은 더해지지 않는다(평균이기 때문).
8 동시 추론 (Simultaneous Inference)
여러 대비를 동시에 검정하면 개별 유의수준이 \(\alpha\) 이더라도 전체 오류율은 \(\alpha\) 보다 커진다.
8.1 Bonferroni 방법
\(m\) 개의 대비를 동시에 수준 \(1-\alpha\) 로 추론하려면, 각 개별 신뢰구간을 수준 \(1 - \alpha/m\) 으로 구성한다. \(k\) 집단에서 모든 쌍별 차이 \(\theta_i - \theta_j\) 에 대한 동시 신뢰구간의 수는 \(m = k(k-1)/2\) 이므로, 각 구간의 신뢰수준을 \(1 - 2\alpha/[k(k-1)]\) 로 설정한다.
\[ C_{ij} = \left\{ \theta_i - \theta_j : (\theta_i - \theta_j) \in \bar{Y}_{i\cdot} - \bar{Y}_{j\cdot} \pm t_{N-k,\, \alpha/m} \sqrt{S_p^2\!\left(\frac{1}{n_i} + \frac{1}{n_j}\right)} \right\} \]
8.2 Scheffé 방법 — 모든 대비에 대한 동시 추론
ANOVA 가정 하에서 \(M = \sqrt{(k-1)F_{k-1,\, N-k,\, \alpha}}\) 로 정의하면, \(\mathcal{A} = \{a : \sum a_i = 0\}\) 의 모든 대비에 대해 동시에 \(1-\alpha\) 의 확률로
\[ \sum_{i=1}^{k} a_i \bar{Y}_{i\cdot} - M\sqrt{S_p^2 \sum_{i=1}^{k} \frac{a_i^2}{n_i}} \leq \sum_{i=1}^{k} a_i \theta_i \leq \sum_{i=1}^{k} a_i \bar{Y}_{i\cdot} + M\sqrt{S_p^2 \sum_{i=1}^{k} \frac{a_i^2}{n_i}} \]
이 성립한다.
증명: UIT로부터 \(\sup_a T_a^2 \leq M^2 \Leftrightarrow T_a^2 \leq M^2 \text{ for all } a\) 이고, \(P({\sup_a T_a^2 \leq M^2}) = P(F_{k-1,N-k} \leq F_{k-1,N-k,\alpha}) = 1-\alpha\) 이다. \(\square\)
Scheffé vs. Bonferroni 비교:
| Scheffé | Bonferroni | |
|---|---|---|
| 대상 | 모든 대비 (사전에 지정 불필요) | 사전에 지정한 \(m\) 개 대비 |
| 구간 폭 | 항상 넓음 (\(t_{N-k,\alpha/m} \leq M\)) | \(m\) 이 작으면 좁음 |
| 데이터 기반 검정 | 허용 (data snooping 가능) | 사전 지정 필요 |
| 권장 상황 | 탐색적 분석, 대비 수가 많을 때 | 소수의 미리 계획된 대비 |
고전 통계학에서 데이터를 보고 가설을 설정하면 검정이 무효화된다. 그러나 Scheffé 방법은 모든 가능한 대비에 대해 동시 유의수준을 보장하므로, 데이터에서 흥미로운 대비를 발견한 후 검정해도 유효하다.
단, 그 대가로 구간이 넓어지고 검정력이 낮아진다.
9 예시: 어류 독소 실험 (Casella & Berger, Example 11.2.12)
\(k=4\) 종류의 처리(독소 3종 + 대조군), 총 \(N=19\) 마리 물고기에 대한 실험이다. 반응변수는 독소 투여 후 생존 시간(단위: 시간)이다.
\[ \text{T1: } n_1=4, \quad \text{T2: } n_2=6, \quad \text{T3: } n_3=5, \quad \text{Ctrl: } n_4=4 \]
ANOVA 표 (Example 11.2.12):
| 변동원 | 자유도 | 제곱합 | 평균제곱 | F 통계량 |
|---|---|---|---|---|
| 처리 (Between) | 3 | 995.90 | 331.97 | 26.09 |
| 오차 (Within) | 15 | 190.83 | 12.72 | |
| 합계 | 18 | 1,186.73 |
\(F_{3,15,0.05} \approx 3.29\) 이므로, \(F = 26.09 \gg 3.29\): 매우 강한 증거로 \(H_0\) 기각.
독소들이 생존 시간에 다른 영향을 미친다는 결론을 내릴 수 있다.
10 코드 예시
10.1 Step 1: 순수 Python 구현 — F 통계량 직접 계산
import numpy as np
# 어류 독소 데이터 (Casella & Berger, Example 11.2.1)
groups = {
"T1": [28, 23, 14, 27],
"T2": [33, 36, 34, 29, 31, 34],
"T3": [18, 21, 20, 22, 24],
"Ctrl": [11, 14, 11, 16],
}
# 기본 통계
data_all = []
group_labels = []
for name, obs in groups.items():
data_all.extend(obs)
group_labels.extend([name] * len(obs))
y = np.array(data_all)
k = len(groups)
N = len(y)
ns = np.array([len(v) for v in groups.values()])
means = np.array([np.mean(v) for v in groups.values()])
grand = np.mean(y)
# 제곱합 분해
SSB = np.sum(ns * (means - grand) ** 2) # 집단 간
SSW = sum(np.sum((np.array(v) - m) ** 2)
for v, m in zip(groups.values(), means)) # 집단 내
SST = np.sum((y - grand) ** 2) # 전체
print(f"SSB = {SSB:.2f}, df = {k-1}")
print(f"SSW = {SSW:.2f}, df = {N-k}")
print(f"SST = {SST:.2f}, df = {N-1}")
print(f"SSB + SSW = {SSB + SSW:.2f} (= SST: {np.isclose(SSB + SSW, SST)})")
MSB = SSB / (k - 1)
MSW = SSW / (N - k)
F = MSB / MSW
print(f"\nMSB = {MSB:.2f}, MSW = {MSW:.2f}")
print(f"F = {F:.4f}")
# 임계값 및 p-value
from scipy import stats
F_crit = stats.f.ppf(0.95, dfn=k-1, dfd=N-k)
p_val = stats.f.sf(F, dfn=k-1, dfd=N-k)
print(f"F_{{3,15,0.05}} = {F_crit:.4f}")
print(f"p-value = {p_val:.6f}")
print(f"H0 기각: {F > F_crit}")10.2 Step 2: 대비 검정 — 특정 집단 비교
from scipy import stats
import numpy as np
# 데이터 준비
groups_data = {
"T1": np.array([28, 23, 14, 27]),
"T2": np.array([33, 36, 34, 29, 31, 34]),
"T3": np.array([18, 21, 20, 22, 24]),
"Ctrl": np.array([11, 14, 11, 16]),
}
ns = np.array([len(v) for v in groups_data.values()])
means = np.array([v.mean() for v in groups_data.values()])
N = ns.sum()
k = len(groups_data)
SSW = sum(((v - m) ** 2).sum() for v, m in zip(groups_data.values(), means))
Sp2 = SSW / (N - k) # 합동 분산
def contrast_test(a, means, ns, Sp2, N, k, alpha=0.05):
"""대비 sum(a_i * theta_i) = 0 검정 (eq. 11.2.7)."""
a = np.array(a, dtype=float)
assert np.isclose(a.sum(), 0), "대비 조건 sum(a_i) = 0 불충족"
contrast_est = (a * means).sum()
se = np.sqrt(Sp2 * (a**2 / ns).sum())
t_stat = contrast_est / se
t_crit = stats.t.ppf(1 - alpha/2, df=N-k)
ci_lo = contrast_est - t_crit * se
ci_hi = contrast_est + t_crit * se
p_val = 2 * stats.t.sf(abs(t_stat), df=N-k)
return {
"추정값": contrast_est, "SE": se, "t": t_stat,
"p-value": p_val, "95% CI": (ci_lo, ci_hi),
"기각": abs(t_stat) > t_crit,
}
# 대비 1: T2 vs T1 (a = (1, -1, 0, 0) 또는 대칭)
res1 = contrast_test([-1, 1, 0, 0], means, ns, Sp2, N, k)
print("대비: T2 - T1")
print(f" 추정값 = {res1['추정값']:.3f}, t = {res1['t']:.4f}, p = {res1['p-value']:.4f}")
print(f" 95% CI: ({res1['95% CI'][0]:.3f}, {res1['95% CI'][1]:.3f})")
print(f" H0 기각: {res1['기각']}\n")
# 대비 2: Ctrl vs (T1+T2+T3)/3
res2 = contrast_test([-1/3, -1/3, -1/3, 1], means, ns, Sp2, N, k)
print("대비: Ctrl - (T1+T2+T3)/3")
print(f" 추정값 = {res2['추정값']:.3f}, t = {res2['t']:.4f}, p = {res2['p-value']:.4f}")
print(f" 95% CI: ({res2['95% CI'][0]:.3f}, {res2['95% CI'][1]:.3f})")
print(f" H0 기각: {res2['기각']}")10.3 Step 3: statsmodels/scipy 활용
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
from statsmodels.stats.multicomp import pairwise_tukeyhsd
# 데이터프레임 구성
rows = []
for name, obs in groups_data.items():
for val in obs:
rows.append({"group": name, "y": val})
df = pd.DataFrame(rows)
# One-way ANOVA
model = ols("y ~ C(group)", data=df).fit()
anova_table = anova_lm(model, typ=1)
print(anova_table)
# 출력: df, sum_sq, mean_sq, F, PR(>F)
# Tukey HSD 사후 검정 (모든 쌍별 비교)
tukey = pairwise_tukeyhsd(df["y"], df["group"], alpha=0.05)
print(tukey.summary())
# Scheffé 방법을 위한 M 값
from scipy.stats import f as f_dist
alpha = 0.05
M = np.sqrt((k - 1) * f_dist.ppf(1 - alpha, dfn=k-1, dfd=N-k))
print(f"\nScheffé M = {M:.4f}")
print(f"단일 t 임계값 = {stats.t.ppf(1-alpha/2, df=N-k):.4f}")
print(f"Scheffé 구간이 더 넓음: {M > stats.t.ppf(1-alpha/2, df=N-k)}")11 핵심 정리
| 단계 | 개념 | 핵심 수식 |
|---|---|---|
| 모형 | 셀 평균 모형 | \(Y_{ij} = \theta_i + \epsilon_{ij}\) |
| 가설 | ANOVA \(H_0\) | \(\theta_1 = \cdots = \theta_k\) |
| 재언어화 | Theorem 11.2.5 | \(H_0 \Leftrightarrow\) 모든 대비 = 0 |
| 단일 대비 검정 | eq. 11.2.6 | \(t_{N-k}\) 통계량 |
| F 통계량 유도 | Theorem 11.2.8 | \(\sup_a T_a^2 / (k-1) \sim F_{k-1,N-k}\) |
| 제곱합 분해 | Theorem 11.2.11 | \(\mathrm{SST} = \mathrm{SSB} + \mathrm{SSW}\) |
| 동시 추론 | Theorem 11.2.10 | Scheffé \(M = \sqrt{(k-1)F_{k-1,N-k,\alpha}}\) |
고전적 ANOVA F 검정은 “집단들의 평균이 모두 같은가?”라는 단순한 질문에 답하지만, Casella의 접근법은 이 질문이 실제로는 무한히 많은 대비 검정의 교집합임을 보여준다. 이 관점은 세 가지 이점을 제공한다:
- F 통계량의 자연스러운 유도: UIT → \(\sup T_a^2\) → F 분포
- Scheffé 방법의 타당성: \(\sup T_a^2\) 를 기반으로 모든 대비에 동시 유효
- 검정력의 이해: \(H_0\) 기각 후 어떤 대비가 원인인지 역추적 가능
실무에서는 F 검정으로 “처리 효과가 있는가”를 먼저 확인하고, 대비 검정으로 “어떤 처리가, 얼마나 다른가”를 정량화한다.
12 관련 주제
선행 지식
- ANOVA와 회귀의 통합 관점 — 셀 평균 모형, SST 분해, 회귀와의 관계
- 가설검정: 점근 이론과 대규모 표본 검정 — LRT, 점근 카이제곱
후속 주제
- Multiple Linear Regression — 다중회귀와 ANOVA의 통합
- 반복측정 ANOVA — 피험자 내 설계
관련 개념
- A/B Test와 인과추론 — 실험설계에서 ANOVA의 역할
- GLM — t-test부터 로지스틱 회귀까지 — ANOVA의 일반화 선형 모형 관점