Oneway Analysis of Variance: The Classic ANOVA Hypothesis

F 검정의 유도, 대비, 동시 추론 — Casella & Berger Ch.11 중심

일원분류 분산분석(Oneway ANOVA)의 가설을 대비(contrast)의 언어로 재정의하고, 합집합-교집합 방법(Union-Intersection Method)으로 F 통계량을 유도한다. Scheffé 동시 신뢰구간과 제곱합 분해(SST = SSB + SSW)를 포함하며, Casella & Berger Ch.11의 이론 체계를 따른다.

Statistics
저자

Kwangmin Kim

공개

2026년 04월 05일

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_0\) 를 기각하면 “어떤 집단들 사이에 차이가 있다”는 결론만 내릴 수 있다. 어떤 쌍이 다른지, 얼마나 다른지에 대한 정보는 제공하지 않는다. \(H_1\) 의 수용은 모든 \(\theta_i\) 가 서로 다르다는 뜻이 아니라, 적어도 두 집단이 다르다는 뜻이다.

이것이 바로 Casella가 강조하는 “고전적 ANOVA 귀무가설의 한계”다 — 실무에서는 귀무가설 기각 자체보다 효과의 정량화가 더 중요하다.


4 대비 (Contrasts): ANOVA 가설의 재언어화

4.1 대비의 정의

정의 11.2.4 (Casella & Berger, 2002): 대비 (Contrast)

\(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 가설 ↔︎ 대비의 등가성

정리 11.2.5 (Casella & Berger, 2002)

\(\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}} \]

예 11.2.6 (Casella & Berger): 대비를 이용한 구체적 검정

집단 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: 이차형식의 최댓값

Lemma 11.2.7 (Casella & Berger, 2002)

\((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\) 의 분포

정리 11.2.8 (Casella & Berger, 2002)

\[ \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\)) 이다.

F 통계량의 직관

\(H_0\) 가 참이면 집단 간 평균 차이 \(\bar{Y}_{i\cdot} - \bar{\bar{Y}}\) 는 순수 표본오차에 의한 것이므로 작다. \(H_0\) 가 거짓이면 진짜 처리 효과 \(\theta_i - \bar{\theta}\) 가 분자에 추가로 반영되어 F 가 커진다.

즉, F 가 크다 = 집단 간 변동이 집단 내 변동에 비해 크다 = 처리 효과가 있다.


7 제곱합 분해 (Partitioning Sums of Squares)

7.1 기본 항등식

정리 11.2.11 (Casella & Berger, 2002)

임의의 수 \(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é 방법 — 모든 대비에 대한 동시 추론

정리 11.2.10 (Casella & Berger, 2002): 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é의 “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}}\)
Casella의 핵심 통찰

고전적 ANOVA F 검정은 “집단들의 평균이 모두 같은가?”라는 단순한 질문에 답하지만, Casella의 접근법은 이 질문이 실제로는 무한히 많은 대비 검정의 교집합임을 보여준다. 이 관점은 세 가지 이점을 제공한다:

  1. F 통계량의 자연스러운 유도: UIT → \(\sup T_a^2\) → F 분포
  2. Scheffé 방법의 타당성: \(\sup T_a^2\) 를 기반으로 모든 대비에 동시 유효
  3. 검정력의 이해: \(H_0\) 기각 후 어떤 대비가 원인인지 역추적 가능

실무에서는 F 검정으로 “처리 효과가 있는가”를 먼저 확인하고, 대비 검정으로 “어떤 처리가, 얼마나 다른가”를 정량화한다.


12 관련 주제

선행 지식

후속 주제

관련 개념

Subscribe

Enjoy this blog? Get notified of new posts by email: