1 정의
세 요인 \(A, B, C\) 각각 2 수준, 셀 평균 \(\mu_{jkl}\) (\(j,k,l \in \{0, 1\}\)):
\[ \mu_{jkl} = \mu + \alpha_j + \beta_k + \gamma_l + (\alpha\beta)_{jk} + (\alpha\gamma)_{jl} + (\beta\gamma)_{kl} + (\alpha\beta\gamma)_{jkl} \]
제약: 모든 단·이중·삼중 효과 모수의 합이 0 (sum-to-zero coding).
자유도: 각 효과 자유도 1, 총 7 개 효과 + grand mean = 8 셀.
2 8 셀의 직교 대비 표
각 셀을 \((jkl) = 000, 001, 010, 011, 100, 101, 110, 111\) 로 정렬. ±1 대비 계수:
| 효과 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | \(\sum c^2\) |
|---|---|---|---|---|---|---|---|---|---|
| \(A\) | \(-1\) | \(-1\) | \(-1\) | \(-1\) | \(+1\) | \(+1\) | \(+1\) | \(+1\) | 8 |
| \(B\) | \(-1\) | \(-1\) | \(+1\) | \(+1\) | \(-1\) | \(-1\) | \(+1\) | \(+1\) | 8 |
| \(C\) | \(-1\) | \(+1\) | \(-1\) | \(+1\) | \(-1\) | \(+1\) | \(-1\) | \(+1\) | 8 |
| \(AB\) | \(+1\) | \(+1\) | \(-1\) | \(-1\) | \(-1\) | \(-1\) | \(+1\) | \(+1\) | 8 |
| \(AC\) | \(+1\) | \(-1\) | \(+1\) | \(-1\) | \(-1\) | \(+1\) | \(-1\) | \(+1\) | 8 |
| \(BC\) | \(+1\) | \(-1\) | \(-1\) | \(+1\) | \(+1\) | \(-1\) | \(-1\) | \(+1\) | 8 |
| \(ABC\) | \(-1\) | \(+1\) | \(+1\) | \(-1\) | \(+1\) | \(-1\) | \(-1\) | \(+1\) | 8 |
각 행의 부호 곱은 다음 패턴이다. - 주효과 \(A\) = \(\text{sign}(j)\) - 이원 \(AB\) = \(\text{sign}(j) \times \text{sign}(k)\) - 삼원 \(ABC\) = \(\text{sign}(j) \times \text{sign}(k) \times \text{sign}(l)\)
직교성 검증: 임의의 두 행은 부호 곱의 합이 0 (4 양·4 음). 예: \(A \cdot AB\) 의 부호 곱 = \((-1)(+1) + (-1)(+1) + (-1)(-1) + (-1)(-1) + (+1)(-1) + (+1)(-1) + (+1)(+1) + (+1)(+1) = -1 -1 +1 +1 -1 -1 +1 +1 = 0\). ✓
8×8 의 부호 표는 Hadamard 행렬 \(H_8\) 의 정확한 형태이다. Hadamard 행렬은 임의의 두 행이 직교하는 ±1 행렬로, factorial design 의 직교 대비를 통합적으로 표현한다. 이 구조는 fractional factorial (G-MON3-6) 과 weighing design (G-MON9) 으로도 확장된다.
3 SS 계산 공식
각 효과의 SS: \[ SS_{\text{effect}} = \frac{n \, \hat\psi^2}{\sum c^2_{jkl}} = \frac{n \, \hat\psi^2}{8} \]
여기서 \(\hat\psi = \sum_{jkl} c_{jkl} \bar Y_{jkl}\).
\(F\) 검정: \(F = SS_{\text{effect}} / MS_W\), 자유도 \((1, abc(n-1))\).
4 가상 데이터 — 학습 시간 × 형식 × 동기
요인: - \(A\) = 학습 시간 (1 시간 = 0, 2 시간 = 1) - \(B\) = 학습 형식 (반복 = 0, 검색 = 1) - \(C\) = 동기 부여 (비보상 = 0, 보상 = 1)
각 셀당 \(n = 8\), \(N = 64\). 셀 평균 (가상):
| 셀 \((jkl)\) | 조건 | \(\bar Y_{jkl}\) |
|---|---|---|
| 000 | 1h, 반복, 비보상 | 5.0 |
| 001 | 1h, 반복, 보상 | 6.5 |
| 010 | 1h, 검색, 비보상 | 6.0 |
| 011 | 1h, 검색, 보상 | 7.0 |
| 100 | 2h, 반복, 비보상 | 7.0 |
| 101 | 2h, 반복, 보상 | 8.5 |
| 110 | 2h, 검색, 비보상 | 9.5 |
| 111 | 2h, 검색, 보상 | 12.0 |
\(MS_W = 1.5\) (\(df_W = 56\)) 가정.
4.1 7 개 대비 적용
| 효과 | \(\hat\psi\) 계산 | \(\hat\psi\) | \(SS\) | \(F\) |
|---|---|---|---|---|
| \(A\) | \(-(5.0+6.5+6.0+7.0)+(7.0+8.5+9.5+12.0)\) | \(+12.5\) | \(8 \times 156.25/8 = 156.25\) | 104.2 |
| \(B\) | \(-(5.0+6.5)-( ... )+(6.0+7.0)+(9.5+12.0)\) \(= -(5.0+6.5+7.0+8.5)+(6.0+7.0+9.5+12.0)\) |
\(+7.0\) | \(49.0\) | 32.7 |
| \(C\) | \(-(5.0+6.0+7.0+9.5)+(6.5+7.0+8.5+12.0)\) | \(+6.5\) | \(42.25\) | 28.2 |
| \(AB\) | \(+(5.0+6.5)-(6.0+7.0)-(7.0+8.5)+(9.5+12.0)\) | \(+12.5\)? | 계산 필요 | — |
| … | … | … | … | … |
(부호 표 정확 적용: \(AB\) 대비 = \(+(000+001) - (010+011) - (100+101) + (110+111)\) \(= +(5.0+6.5) - (6.0+7.0) - (7.0+8.5) + (9.5+12.0) = 11.5 - 13.0 - 15.5 + 21.5 = 4.5\).)
\[ SS_{AB} = \frac{8 \times 4.5^2}{8} = 20.25,\quad F_{AB} = 13.5 \]
다른 대비도 동일하게 적용. 자세한 계산은 Python 코드 참조.
5 Python 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
# 가상 데이터: 셀 평균 + 노이즈
np.random.seed(2026)
cell_means = {
(0, 0, 0): 5.0,
(0, 0, 1): 6.5,
(0, 1, 0): 6.0,
(0, 1, 1): 7.0,
(1, 0, 0): 7.0,
(1, 0, 1): 8.5,
(1, 1, 0): 9.5,
(1, 1, 1): 12.0,
}
sigma = np.sqrt(1.5)
n = 8
records = []
for (a, b, c), mu in cell_means.items():
y = np.random.normal(mu, sigma, n)
for v in y:
records.append({"A": a, "B": b, "C": c, "Y": v})
data = pd.DataFrame(records)
# Sum coding 으로 ANOVA
model = ols("Y ~ C(A, Sum) * C(B, Sum) * C(C, Sum)", data=data).fit()
anova = sm.stats.anova_lm(model, typ=2)
print("Type II ANOVA:")
print(anova.round(3))
# 부호 대비 기반 SS 검증
def hadamard_8():
H = np.array([
[-1, -1, -1, -1, +1, +1, +1, +1], # A
[-1, -1, +1, +1, -1, -1, +1, +1], # B
[-1, +1, -1, +1, -1, +1, -1, +1], # C
[+1, +1, -1, -1, -1, -1, +1, +1], # AB
[+1, -1, +1, -1, -1, +1, -1, +1], # AC
[+1, -1, -1, +1, +1, -1, -1, +1], # BC
[-1, +1, +1, -1, +1, -1, -1, +1], # ABC
])
names = ["A", "B", "C", "AB", "AC", "BC", "ABC"]
return H, names
cell_order = [(0,0,0),(0,0,1),(0,1,0),(0,1,1),
(1,0,0),(1,0,1),(1,1,0),(1,1,1)]
y_cells = np.array([cell_means[c] for c in cell_order])
H, names = hadamard_8()
print("\n=== Hadamard contrast SS (n={}) ===".format(n))
for i, name in enumerate(names):
psi = np.dot(H[i], y_cells)
ss = n * psi**2 / np.sum(H[i]**2)
print(f" {name:>4s}: psi={psi:+6.2f}, SS={ss:7.2f}")
# 직교성 검증
print("\n=== Orthogonality (any two rows should have dot=0) ===")
for i in range(7):
for j in range(i+1, 7):
dp = np.dot(H[i], H[j])
assert dp == 0, f"{names[i]} × {names[j]} = {dp}"
print("All 21 pairs orthogonal. ✓")기대 출력:
Type II ANOVA:
sum_sq df F PR(>F)
C(A, Sum) 156.250 1.0 ~104.2 0.000
C(B, Sum) 49.000 1.0 ~32.7 0.000
C(C, Sum) 42.250 1.0 ~28.2 0.000
C(A, Sum):C(B, Sum) 20.250 1.0 ~13.5 0.001
C(A, Sum):C(C, Sum) ...
C(B, Sum):C(C, Sum) ...
C(A, Sum):C(B, Sum):C(C, Sum) ...
Residual ~84.0 56.0 NaN NaN
=== Hadamard contrast SS (n=8) ===
A: psi=+12.50, SS= 156.25
B: psi= +7.00, SS= 49.00
C: psi= +6.50, SS= 42.25
AB: psi= +4.50, SS= 20.25
...
All 21 pairs orthogonal. ✓
ANOVA 의 분산 분해와 Hadamard 대비의 SS 가 정확히 일치한다.
6 효과 크기와 검정력
각 효과의 partial \(\eta^2\): \[ \text{partial } \eta^2 = \frac{SS_{\text{effect}}}{SS_{\text{effect}} + SS_W} \]
위 데이터의 \(SS_W \approx 56 \times 1.5 = 84\), partial \(\eta^2\): - \(A\): \(156.25 / (156.25 + 84) = 0.65\) — 매우 큰 효과 - \(B\): \(49.0 / 133.0 = 0.37\) — 큰 효과 - \(C\): \(42.25 / 126.25 = 0.33\) — 큰 효과 - \(AB\): \(20.25 / 104.25 = 0.19\) — 큰 효과 - …
세 주효과가 모두 큰 효과 크기를 가진다는 것은 시뮬레이션 데이터에서 의도된 신호이다. 실무 데이터에서는 보통 효과가 더 작고 (partial \(\eta^2 < 0.1\)), 검정력 분석에서 셀당 표본을 늘려야 한다.
7 시각화 — 이원 상호작용 plot 의 panel 형태
삼원 설계의 시각화는 두 가지 표준 형태이다.
Format: 검색 학습 Format: 반복 학습
Y │ *(C=보상) Y │ *(C=보상)
│ / │ /
│ *(C=비보상) │ *(C=비보상)
│ / │ /
│_/ │_/
└────────────── └──────────────
1h 2h 1h 2h
(Time A) (Time A)
각 panel 은 한 요인 (\(B\)) 의 한 level 에서 나머지 두 요인 (\(A, C\)) 의 이원 상호작용을 보여 준다. panel 사이의 상호작용 패턴이 다르면 삼원 상호작용이 존재한다 (G-MAX8-2).
8 가정과 한계
- 셀 등분산·정규성·독립성: ANOVA 표준.
- 셀 표본 균등: 직교 분해의 전제. 불균등이면 Type II/III SS (G-MAX8-3).
- \(n \ge 5\) 권장: 셀당 표본이 너무 작으면 within SS 자유도 부족.
- 고정 효과: 세 요인의 levels 가 모두 연구자 선택. 무작위 levels 는 G-MAX10.
- 2 수준의 한계: 양적 요인의 비선형성을 잡지 못한다 (수준이 2 개라 선형 추세만 검정 가능). 양적 요인은 3 수준 이상 권장 (G-MON3-4 의 3-level factorial).
9 관련 주제
선행 지식
후속 주제
다른 카테고리 연결
- AB Test — 다중 비교 실험 — multivariate testing 의 IT 적용