1 RBD with Covariate
\[ Y_{ij} = \mu + \tau_j + \beta_i + \gamma(X_{ij} - \bar X) + \varepsilon_{ij} \]
- \(\tau_j\): 처치 (fixed).
- \(\beta_i\): 블록 효과.
- \(\gamma\): covariate 의 회귀 계수.
- \(X_{ij}\): covariate (예: 초기 식물 크기).
- \(\varepsilon \sim N(0, \sigma^2)\).
ANOVA 의 일반화 — block 통제 + covariate 통제.
2 농학 사례
2.1 가상 실험
5 비료 (A, B, C, D, E) × 4 농장 (블록). 각 셀에 1 plot. \(Y\): 수확량 (kg/plot). \(X\): 토양 비옥도 점수 (사전 측정).
가상 데이터:
| 농장 | 비료 | \(X\) | \(Y\) |
|---|---|---|---|
| 1 | A | 60 | 35 |
| 1 | B | 60 | 40 |
| 1 | C | 60 | 30 |
| 1 | D | 60 | 45 |
| 1 | E | 60 | 33 |
| 2 | A | 80 | 50 |
| 2 | B | 80 | 55 |
| … | … | … | … |
각 농장 내 \(X\) 가 비슷 (block effect 통제) 하지만 각 plot 의 미세 변동 잔존.
3 ANOVA vs ANCOVA 비교
3.1 ANOVA (covariate 무시)
| Source | \(SS\) | \(df\) | \(MS\) | \(F\) |
|---|---|---|---|---|
| 비료 | 240 | 4 | 60 | \(60 / 6 = 10.0\) |
| 농장 | 800 | 3 | 267 | \(267/6 = 44\) |
| 잔차 | 72 | 12 | 6 | — |
3.2 ANCOVA
covariate 통제 후:
| Source | \(SS\) | \(df\) | \(MS\) | \(F\) |
|---|---|---|---|---|
| 비료 (adjusted) | 240 | 4 | 60 | \(60 / 3 = 20.0\) |
| 농장 (adjusted) | 50 | 3 | 17 | — |
| Covariate (\(X\)) | 750 | 1 | 750 | — |
| 잔차 | 33 | 11 | 3 | — |
(가상 수치 — 실제 데이터에 따라 변동.)
비료 검정력: \(F\) 가 \(10 \to 20\) 으로 증가. covariate 가 잡음의 일부를 설명.
농장 효과의 SS 가 줄음: 농장 간 차이의 일부가 토양 비옥도로 흡수.
블록 (농장) 의 효과는 토양 비옥도, 일조량, 배수성 등의 종합. covariate \(X\) (토양 비옥도) 가 그 일부를 명시적으로 측정 → 블록 효과의 SS 감소, 잔차도 감소.
이것이 ANCOVA 의 농학적 가치 — 블록 효과를 더 세밀하게 설명할수록 처치 효과의 검정력 ↑.
또 ANCOVA 는 연속 측정 의 covariate 를 활용 (이산 block 이 아닌). 더 풍부한 정보.
4 보정 평균 (Adjusted Means)
각 처치의 보정 평균: \[ \bar Y_j^{\text{adj}} = \bar Y_j - \hat\gamma (\bar X_j - \bar X) \]
각 비료 그룹 내 covariate 가 우연히 다를 때 보정.
4.1 가상 결과
| 비료 | \(\bar Y_j\) | \(\bar X_j\) | \(\bar Y_j^{\text{adj}}\) |
|---|---|---|---|
| A | 42 | 70 | 41.5 |
| B | 47 | 70 | 46.5 |
| C | 38 | 70 | 37.5 |
| D | 52 | 70 | 51.5 |
| E | 41 | 70 | 40.5 |
이 경우 모든 covariate 평균이 같아 보정이 minimal. 다르면 보정 차이 ↑.
5 회귀 동질성 가정
ANCOVA 는 모든 처치 그룹이 같은 \(\gamma\) 가정. 위반 시: - 처치 × covariate interaction 존재. - 처치 효과가 covariate 수준에 따라 달라짐 (HTE).
검정: \[ F_{\text{slope}} = \frac{SS(\text{slope difference})}{MS_E^{\text{full}}} \]
유의면 ANCOVA 부적합. Johnson-Neyman 절차 또는 separate analysis.
6 검정력 비교
| 분석 | 비료 \(F\) | \(df_E\) |
|---|---|---|
| CRD (블록·covariate 무시) | 3 | 16 |
| RBD (covariate 무시) | 10 | 12 |
| ANCOVA (covariate 추가) | 20 | 11 |
각 단계마다 잔차 분산 ↓ → 검정력 ↑.
7 Maxwell Ch.9 와의 비교
| Maxwell G-MAX9 | Montgomery G-MON8 | |
|---|---|---|
| 응용 분야 | 임상·심리 | 농학·산업 |
| 강조점 | Lord’s paradox, change score | 결측, 변환, 비균등 설계 |
| 데이터 | 교육 점수, SBP | 수확량, 수율 |
| 처치 모형 | CRD, RBD | RBD, Latin Square, factorial |
| 변환 | 부수적 | 핵심 (heteroscedasticity 통제) |
본 시리즈는 두 시각의 통합.
8 Python 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
np.random.seed(2026)
fertilizers = ["A", "B", "C", "D", "E"]
farms = list(range(4))
fert_eff = {"A": 0, "B": 5, "C": -3, "D": 9, "E": -1}
farm_eff = {0: -10, 1: 5, 2: -8, 3: 13}
gamma = 0.6 # 토양 비옥도의 회귀 계수
records = []
for farm in farms:
farm_baseline = 50 + farm_eff[farm]
for fert in fertilizers:
X = farm_baseline + np.random.normal(0, 3) # 토양 비옥도
Y_true = 40 + fert_eff[fert] + farm_eff[farm] + gamma * (X - 50)
Y = Y_true + np.random.normal(0, 2)
records.append({"farm": farm, "fertilizer": fert, "X": X, "Y": Y})
data = pd.DataFrame(records)
# 1) ANOVA (covariate 무시)
model_anova = ols("Y ~ C(fertilizer) + C(farm)", data=data).fit()
print("=== ANOVA (no covariate) ===")
print(sm.stats.anova_lm(model_anova, typ=2).round(3))
# 2) ANCOVA
model_ancova = ols("Y ~ C(fertilizer) + C(farm) + X", data=data).fit()
print("\n=== ANCOVA (with covariate X) ===")
print(sm.stats.anova_lm(model_ancova, typ=2).round(3))
# 비교
F_ano = sm.stats.anova_lm(model_anova).loc["C(fertilizer)", "F"]
F_anc = sm.stats.anova_lm(model_ancova).loc["C(fertilizer)", "F"]
print(f"\nF (ANOVA) = {F_ano:.2f}, F (ANCOVA) = {F_anc:.2f}")
print(f"검정력 ratio: {F_anc / F_ano:.2f}")
# Adjusted means
gamma_hat = model_ancova.params["X"]
mean_X = data["X"].mean()
adjusted = {}
for fert in fertilizers:
sub = data[data["fertilizer"] == fert]
adj = sub["Y"].mean() - gamma_hat * (sub["X"].mean() - mean_X)
adjusted[fert] = adj
print("\n=== Adjusted means ===")
for fert, v in adjusted.items():
raw = data[data["fertilizer"] == fert]["Y"].mean()
print(f" {fert}: raw = {raw:.2f}, adjusted = {v:.2f}")
# 회귀 동질성 검정
model_full = ols("Y ~ C(fertilizer) * X + C(farm)", data=data).fit()
F_slope = (model_ancova.ssr - model_full.ssr) / (len(fertilizers) - 1)
F_slope /= model_full.mse_resid
from scipy import stats
p_slope = 1 - stats.f.cdf(F_slope, len(fertilizers) - 1, model_full.df_resid)
print(f"\n=== Slope homogeneity test ===")
print(f"F = {F_slope:.2f}, p = {p_slope:.4f}")9 가정과 한계
- 회귀 동질성: 모든 처치 그룹이 같은 \(\gamma\) 가정.
- 선형성: \(X\) 와 \(Y\) 의 관계가 선형. 위반 시 다항식.
- 공변량의 처치 전 측정: covariate 가 처치에 영향받지 않음.
- 결측 데이터: covariate 결측 시 분석 어려움.
10 응용
| 분야 | 처치 | 공변량 |
|---|---|---|
| 농학 | 비료 | 토양 비옥도, 초기 식물 크기 |
| 임상 | 약물 | baseline 점수 |
| 산업 | 공정 | machine 의 calibration |
| 동물 | 사료 | 초기 체중, 성별 |
| 교육 | 교수법 | IQ, 사전 지식 |
| IT | UI 변종 | 사용자 사전 활동 |
11 ML 매핑
ML 모델 평가에서 baseline accuracy 통제:
Treatment: 모델 (A, B, C, D)
Block: dataset (4 datasets)
Covariate: baseline accuracy (어느 simple model 의 accuracy)
분석: \[ \text{accuracy}_{ij} = \mu + \tau_j + \beta_i + \gamma \cdot \text{baseline}_{ij} + \varepsilon \]
baseline 이 dataset 의 difficulty 를 측정 → 잔차 ↓ → 처치 (모델) 검정력 ↑.
이는 ML 의 systematic baseline-controlled 비교의 통계적 형식.
12 본 시리즈
G-MON8-0 개관
G-MON8-1 ANCOVA + RBD ← 현재 글
G-MON8-2 CRD/Latin/비직교
G-MON8-3 비직교 + 다중 공변량
G-MON8-4 결측과 변환
13 관련 주제
선행 지식
후속 주제
14 더 읽을 거리
- Cochran, W. G., Cox, G. M. (1957). “Experimental Designs” (2nd ed). Wiley.
- Pearce, S. C. (1983). “The Agricultural Field Experiment.” Wiley.
- Snedecor, G. W., Cochran, W. G. (1989). “Statistical Methods” (8th ed). Iowa State.
- Maxwell, S. E., Delaney, H. D. (2004). “Designing Experiments and Analyzing Data.”