요인 설계의 효과 크기·검정력 — η² · partial η² · Cohen’s f

Maxwell Ch.7.4 Effect Size and Power for Factorial Designs

factorial design 의 주효과·상호작용에 대한 효과 크기 (η², partial η², ω²) 와 검정력 분석 (Cohen’s f, sample size) 을 정리한다. 단일 요인 ANOVA 와 달리 factorial 에서는 partial η² 가 효과 크기의 표준이며, 검정력 산출 시 다른 효과의 변동을 어떻게 다룰지가 핵심 설계 결정이다.

Experimentation
DOE
저자

Kwangmin Kim

공개

2026년 05월 08일

1 정의

정의: factorial 의 효과 크기 측도
측도 정의 해석
\(\eta^2\) \(SS_{\text{effect}} / SS_{\text{total}}\) 효과가 전체 변동에서 차지하는 비율
partial \(\eta^2\) \(SS_{\text{effect}} / (SS_{\text{effect}} + SS_W)\) 다른 효과를 통제한 후의 비율
\(\omega^2\) \(\frac{SS_{\text{effect}} - df_{\text{effect}} \cdot MS_W}{SS_{\text{total}} + MS_W}\) \(\eta^2\) 의 편향 보정
Cohen’s \(f\) \(\sqrt{\eta^2 / (1 - \eta^2)}\) 검정력 계산용 표준화 효과 크기

\(\eta^2\) 는 직관적이지만 양의 편향이 있고 (작은 표본에서 과대), partial \(\eta^2\) 는 factorial 비교에 표준적이며, \(\omega^2\) 는 비편향 추정량으로 보고 권장이다.

2 단일 요인 vs factorial 의 효과 크기

단일 요인 ANOVA 에서 \(\eta^2 = SS_B / SS_T\) 가 명확하다. Factorial 에서는 다른 효과 (다른 요인, 상호작용) 가 SS_T 에 들어가므로 한 효과의 \(\eta^2\) 가 다른 효과의 크기에 의존한다.

해결: partial \(\eta^2\) — 분모를 “그 효과와 오차” 만으로 한정.

\[ \text{partial } \eta^2_A = \frac{SS_A}{SS_A + SS_W} \]

여러 effect 의 partial \(\eta^2\) 합은 1 을 넘을 수 있다 (각자 다른 분모). 한편 \(\eta^2\) 의 합은 항상 \(\le 1\).

3 Maxwell SBP 데이터의 효과 크기

효과 \(SS\) \(df\) \(\eta^2\) partial \(\eta^2\) \(\omega^2\)
Drug 720 1 \(720/2540 = 0.283\) \(720/(720+1000) = 0.419\) \(\approx 0.260\)
BF 500 1 \(500/2540 = 0.197\) \(500/1500 = 0.333\) \(\approx 0.173\)
Drug × BF 320 1 \(320/2540 = 0.126\) \(320/1320 = 0.242\) \(\approx 0.102\)
Within 1000 16
Total 2540 19

세 효과 모두 Cohen 의 기준 (large \(\eta^2 \approx 0.14\)) 을 넘는 큰 효과.

4 \(\omega^2\) — 비편향 추정량

\[ \omega^2 = \frac{SS_{\text{effect}} - df_{\text{effect}} \cdot MS_W}{SS_T + MS_W} \]

Drug: \[ \omega^2_A = \frac{720 - 1 \times 62.5}{2540 + 62.5} = \frac{657.5}{2602.5} = 0.253 \]

작은 표본에서는 \(\omega^2 < \eta^2\) 가 일반적. Maxwell 의 권장: 결과 보고에는 \(\omega^2\), 검정력 계산에는 \(f\).

직관: 왜 \(\eta^2\) 에 양의 편향이 있는가

\(F\) 통계량의 기대값은 귀무가설이 참이어도 1 보다 약간 크다 (작은 표본 효과). 이로 인해 \(SS_{\text{effect}}\) 가 평균적으로 모집단 효과를 약간 과대평가한다. \(\omega^2\) 의 분자에서 \(df \cdot MS_W\) 를 빼는 것이 이 편향 보정이다 — “\(F = 1\) 일 때 \(\omega^2 = 0\)” 이 되도록 설계됨.

5 Cohen’s \(f\) 와 검정력 분석

Cohen 의 \(f\) 는 ANOVA 검정력 표의 표준 효과 크기:

\[ f = \sqrt{\frac{\eta^2}{1 - \eta^2}} = \sqrt{\frac{SS_{\text{effect}}}{SS_W}} \cdot \frac{1}{\sqrt{N}} \]

(또는 partial \(\eta^2\) 를 사용한 변종.) Cohen 의 기준: - 작은 효과: \(f = 0.10\) - 중간 효과: \(f = 0.25\) - 큰 효과: \(f = 0.40\)

비중심 모수 (noncentrality parameter): \[ \lambda = N \cdot f^2 \]

\(\lambda\) 가 noncentral \(F\) 분포의 위치를 결정해 검정력을 산출한다.

6 검정력 분석 — 표본 크기 산출

\(2 \times 2\) factorial 에서 상호작용을 검출할 검정력 0.80, \(\alpha = 0.05\), \(f = 0.25\) (중간 효과) 에 필요한 표본?

\[ \lambda_{\text{interaction}} = N \cdot f^2 = N \cdot 0.0625 \]

\(F_{\text{crit}}(\alpha, df_1, df_2)\) 와 noncentral \(F\) 분포 from \(\lambda\) 가 만나는 \(N\) 을 풀면 약 \(N = 128\) (셀당 32 명).

이는 주효과보다 큰 표본을 요구하는 것이 일반적이다 — 같은 \(f\) 라도 상호작용은 자유도 분배가 더 까다롭기 때문.

7 검정력 비교: 같은 표본에서 어느 효과를 잘 잡을까?

Maxwell 의 SBP 데이터 (cell n=5, N=20) 에서 사후 검정력:

Drug main: f = √(720/1000)/√20 ≈ 0.190 → 검정력 ≈ 0.90 (df=1,16)
BF main:   f = √(500/1000)/√20 ≈ 0.158 → 검정력 ≈ 0.78
Drug×BF:   f = √(320/1000)/√20 ≈ 0.126 → 검정력 ≈ 0.59

작은 N=20 에서도 큰 효과는 잡히지만, 상호작용 검정력 0.59 는 미흡 — 더 큰 표본이 권장된다.

함정: 사후 검정력의 한계

관측된 \(f\) 를 그대로 사후 검정력 계산에 쓰는 것은 통계적으로 결합 분포 문제를 일으킨다 (observed power 의 부정확성). 사전 (prior) 검정력 분석 을 위해 가장 작은 임상적· 실무적 의미가 있는 효과 크기 (MDE) 를 외부 근거 (이전 연구, Pilot, 도메인 지식) 로 설정하는 것이 표준이다.

8 $G^*Power · statsmodels 비교

도구 검정력 분석 함수
G*Power F tests → ANOVA: Fixed effects, special, main effects and interactions
Python statsmodels FTestAnovaPower().solve_power() (단순)
Python pingouin power_anova() (factorial)
Python scipy ncf 직접 사용 (수동)

9 Python 코드

import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.power import FTestAnovaPower
from scipy import stats

# Maxwell Table 7.1 데이터 재사용
data = pd.DataFrame({
    "drug": ["yes"]*10 + ["no"]*10,
    "bf":   (["yes"]*5 + ["no"]*5) * 2,
    "sbp":  [158, 163, 173, 178, 168,
             188, 183, 198, 178, 193,
             186, 191, 196, 181, 176,
             185, 190, 195, 200, 180]
})

model = ols("sbp ~ C(drug, Sum) * C(bf, Sum)", data=data).fit()
anova = sm.stats.anova_lm(model, typ=2)
print("ANOVA Type II:")
print(anova.round(3))

# Effect sizes
ss_w = anova.loc["Residual", "sum_sq"]
ms_w = anova.loc["Residual", "mean_sq"]
df_w = anova.loc["Residual", "df"]
ss_t = anova["sum_sq"].sum()
N = len(data)

print("\nEffect sizes:")
for src in ["C(drug, Sum)", "C(bf, Sum)", "C(drug, Sum):C(bf, Sum)"]:
    ss = anova.loc[src, "sum_sq"]
    df = anova.loc[src, "df"]
    eta2 = ss / ss_t
    peta2 = ss / (ss + ss_w)
    omega2 = (ss - df * ms_w) / (ss_t + ms_w)
    f_cohen = np.sqrt(peta2 / (1 - peta2))
    # noncentrality for post-hoc power
    F_obs = anova.loc[src, "F"]
    F_crit = stats.f.ppf(0.95, df, df_w)
    ncp = N * f_cohen**2
    power = 1 - stats.ncf.cdf(F_crit, df, df_w, ncp)
    print(f"  {src:>30s}: eta2={eta2:.3f}  peta2={peta2:.3f}  "
          f"omega2={omega2:.3f}  f={f_cohen:.3f}  power={power:.3f}")

# 사전 검정력: MDE = 작은 효과 (f=0.10), large (f=0.40) 에 필요한 N
print("\n=== Sample size for interaction (df=1, alpha=0.05, power=0.80) ===")
for f_target in [0.10, 0.25, 0.40]:
    # statsmodels FTestAnovaPower 는 단순 ANOVA 용 — 직접 풀기
    # interaction df=1, error df=N-4 (2x2)
    power_target = 0.80
    alpha = 0.05
    # bisection
    lo, hi = 10, 5000
    while hi - lo > 1:
        mid = (lo + hi) // 2
        df_e = mid - 4
        if df_e < 1:
            lo = mid; continue
        F_crit = stats.f.ppf(1 - alpha, 1, df_e)
        ncp = mid * f_target**2
        power = 1 - stats.ncf.cdf(F_crit, 1, df_e, ncp)
        if power >= power_target:
            hi = mid
        else:
            lo = mid
    print(f"  f = {f_target} → N ≈ {hi}")

기대 출력:

Effect sizes:
                   C(drug, Sum): eta2=0.283  peta2=0.418  omega2=0.260  f=0.847  power=...
                     C(bf, Sum): eta2=0.197  peta2=0.333  omega2=0.173  f=0.707  power=...
       C(drug, Sum):C(bf, Sum): eta2=0.126  peta2=0.242  omega2=0.102  f=0.566  power=...

=== Sample size for interaction (df=1, alpha=0.05, power=0.80) ===
  f = 0.10 → N ≈ 787
  f = 0.25 → N ≈ 128
  f = 0.40 → N ≈ 52

10 IT 매핑

디자인 셀 표본 가이드 (중간 효과 \(f=0.25\), 검정력 0.80)
\(2 \times 2\) A/B 테스트 (UI 색 × 위치) 셀당 32 명, 총 128 명
\(3 \times 4\) multivariate (가격 × 발송 시간) 셀당 ~20 명, 총 240 명
\(4 \times 4\) ML hyperparameter 각 조합 5~10 회 + 노이즈 모형
디지털 실험에서의 검정력

A/B Test 의 트래픽이 충분하면 (만 단위 사용자) 작은 효과 (\(f = 0.05\)) 도 잡을 수 있다. 이 경우 검정력 분석의 초점이 “통계적 유의” 가 아니라 “의사결정 의미 가 있는 효과 크기 (MDE)” 로 이동한다. Kohavi (2020) 와 Phase F.5 (Speed Matters) 의 점진 분석 (gradual rollout, sequential testing) 이 이 흐름의 연장이다.

11 가정과 한계

  • 셀 등분산: 효과 크기·검정력 모두 \(MS_W\) 에 의존. 셀별 분산이 다르면 robust 대안 (Welch ANOVA, bootstrap CI on partial \(\eta^2\)).
  • 사전 검정력 vs 사후 검정력: 사전 권장. 사후 검정력은 \(F\) 와 함수적 관계라 추가 정보 거의 없음.
  • MDE 의 외부 근거: 효과 크기 추정은 도메인·이전 연구에 의존. 추측보다는 pilot 데이터 또는 expert elicitation.
  • 다중 비교 영향: 여러 효과를 동시에 검정하면 FWER 보정이 검정력을 떨어뜨림. Bonferroni 보정 시 \(\alpha / k\) 로 검정력 재계산.

12 MAX Ch.7 시리즈 정리

G-MAX7-0  Two-Way Factorial 개관 — 주효과·상호작용·검정력의 이득
G-MAX7-1  2×2 설계, 직교 대비 분해
G-MAX7-2  Simple Effects, Interaction Contrasts (post-hoc)
G-MAX7-3  Type I/II/III SS (비직교 설계)
G-MAX7-4  Effect Size, Power, Sample Size  ← 현재 글
    │
    ▼
G-MAX8 (Higher-Order: 2×2×2)
G-MON3 (Factorial 정통, 분수 분할)
G-MON4 (Asymmetric, Split-Plot)

13 관련 주제

선행 지식

후속 주제

  • G-MAX8 — Higher-Order Factorial (작성 예정)
  • G-MON3 — Factorial Experiments (작성 예정)

다른 카테고리 연결

Subscribe

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