The ANOVA F Test: 기하학적 유도와 실무 진단

투영, 가정 진단, 효과크기, 검정력, 불균형 설계 (Casella §11.2.4 심화)

일원분류 ANOVA의 F 검정을 Casella & Berger §11.2.4의 대수적 유도를 넘어 선형대수적·기하학적 관점에서 재해석한다. ANOVA 가정 진단(정규성, 등분산성, 독립성)과 위배 시 대안(Welch, Kruskal-Wallis), 효과크기(\(\eta^2\), \(\omega^2\), Cohen’s \(f\)), 비중심 F 분포 기반 검정력 분석, Type I/II/III 제곱합을 실무 코드와 함께 다룬다.

Statistics
저자

Kwangmin Kim

공개

2026년 04월 06일

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개를 알면 나머지 하나를 계산한다:

  1. 효과크기 \(f\)
  2. 표본 크기 \(n\) (또는 \(N\))
  3. 유의수준 \(\alpha\)
  4. 검정력 \(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 이 모두 같은 결과를 준다
  • 불균형 설계 + 상호작용 없음: 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 권장
실무 체크리스트
  1. 설계 단계: 검정력 분석으로 표본 크기 결정 (사후 아님)
  2. 데이터 수집 후: Q-Q plot + Levene 로 가정 진단
  3. 가정 만족: 고전 F 검정
  4. 등분산 위배: Welch F 검정
  5. 정규성 심각 위배: Kruskal-Wallis 또는 변수 변환
  6. 결과 보고: F, p, df, 효과크기(\(\omega^2\)), 95% CI 를 모두 기재
  7. 사후 검정: F 가 유의하면 대비 추론으로 이동 (→ 다음 포스트)

10 관련 주제

선행 지식

후속 주제

관련 개념

Subscribe

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