CRD·Latin·비직교 Two-Way 의 ANCOVA

Montgomery Ch.8.3-8.4 ANCOVA for CRD/Latin · Non-Orthogonal Two-Way

Completely Randomized Design (CRD), Latin Square, 비직교 two-way design 에 covariate 를 추가한 ANCOVA 의 적합·분석 절차, 각 설계의 모형, 자유도, ANOVA 표 차이와 검정력 비교를 산업·농학 사례로 통합 정리한다.

Experimentation
DOE
저자

Kwangmin Kim

공개

2026년 05월 08일

1 CRD with Covariate

정의: CRD ANCOVA Model

\[ Y_{ij} = \mu + \tau_j + \gamma(X_{ij} - \bar X) + \varepsilon_{ij}, \quad j = 1, \ldots, a; \ i = 1, \ldots, n_j \]

블록 효과 없음. covariate 만 추가. 검정 분모 \(df = N - a - 1\) (covariate 1 자유도 추가).

1.1 CRD ANCOVA vs CRD ANOVA

CRD ANOVA CRD ANCOVA
자유도 (residual) \(N - a\) \(N - a - 1\)
잔차 SS 큼 (covariate 무시) 작음 (covariate 흡수)
검정력 낮음 높음 (covariate 가 \(Y\) 와 상관 있을 때)

ANCOVA 의 이득: covariate 가 \(Y\) 의 잡음을 일부 설명 → 잔차 ↓ → 검정력 ↑.

손실: 자유도 1 (covariate 추정에 사용). 거의 무시 가능 (큰 \(N\)).

직관: CRD + ANCOVA = RBD 의 연속 일반화

RBD 의 블록은 이산적 covariate. ANCOVA 의 covariate 는 연속적.

블록의 이산 정보보다 연속 covariate 가 더 정밀할 수 있음 (정보 손실 ↓).

→ 가능하면 covariate (연속) 우선, 그 다음 블록 (이산).

2 Latin Square with Covariate

\(a \times a\) Latin Square 에 covariate 추가:

\[ Y_{ijk(l)} = \mu + \tau_l + \beta_i + \gamma_j + \delta(X_{ijk(l)} - \bar X) + \varepsilon \]

(행 \(\beta_i\), 열 \(\gamma_j\), 처치 \(\tau_l\), 공변량 \(\delta\).)

자유도: - 처치: \(a - 1\) - 행: \(a - 1\) - 열: \(a - 1\) - 공변량: 1 - 잔차: \(a^2 - 3(a-1) - 1 - 1 = (a-1)(a-2) - 1\)

작은 \(a\) 에서는 자유도 이득이 작음 (\(a = 4\) 면 잔차 5).

3 비직교 Two-Way + Covariate

정의: Non-Orthogonal Two-Way

표준 직교 two-way ANOVA 는 균등 셀이 전제. 셀이 다르면 (CRD 에서 처치 → 그룹별 표본 불균등 우연 발생) 비직교.

ANCOVA 추가 시 더욱 복잡. Type II/III SS 가 자동 (R car::Anova, statsmodels typ=3).

함정: 비직교 ANCOVA 의 SS 유형

비직교 + covariate 의 ANCOVA 에서: - Type I (sequential): 변수 순서 의존. - Type II (hierarchical): 같은 차수 통제 후. - Type III (marginal): 다른 모든 변수 통제 후.

일반 권장: Type III + Sum coding (G-MAX7-3).

ols("Y ~ C(A, Sum) * C(B, Sum) + X", data).fit()
sm.stats.anova_lm(model, typ=3)

4 산업 사례 — 반도체 제조

4.1 가상 실험

3 처리 (etching 화학 A, B, C) × 4 wafer 위치 (블록), \(n_j\) 다양 (\(n_A = 6\), \(n_B = 5\), \(n_C = 7\)). \(Y\) = 회로 두께. \(X\) = wafer 의 baseline 두께 (처치 전 측정).

비균등 + covariate. CRD with covariate (블록 무시 시).

4.2 분석 — Type III SS

fit: Y ~ C(treatment) + X (sum coding)
Type III SS: drop each effect once
Effect \(SS\) \(df\) \(F\) \(p\)
Treatment 50 2 12.5 0.0003
Covariate \(X\) 200 1 100 \(<0.001\)
Residual 30 15 2

처치와 covariate 모두 매우 유의. covariate 가 강한 효과 → ANCOVA 의 가치.

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)
treatments = ["A", "B", "C"]
n_per = {"A": 6, "B": 5, "C": 7}
treat_eff = {"A": 0, "B": 5, "C": -3}
gamma = 0.5

records = []
for t in treatments:
    for _ in range(n_per[t]):
        X = np.random.normal(50, 8)
        Y = 100 + treat_eff[t] + gamma * (X - 50) + np.random.normal(0, 1.5)
        records.append({"treatment": t, "X": X, "Y": Y})
data = pd.DataFrame(records)

# CRD ANOVA
model_anova = ols("Y ~ C(treatment, Sum)", data=data).fit()
print("=== CRD ANOVA (no covariate) ===")
print(sm.stats.anova_lm(model_anova, typ=2).round(3))

# CRD ANCOVA (Type III)
model_ancova = ols("Y ~ C(treatment, Sum) + X", data=data).fit()
print("\n=== CRD ANCOVA (Type III) ===")
print(sm.stats.anova_lm(model_ancova, typ=3).round(3))

# 검정력 비교
F_ano = sm.stats.anova_lm(model_anova).loc["C(treatment, Sum)", "F"]
F_anc = sm.stats.anova_lm(model_ancova, typ=3).loc["C(treatment, Sum)", "F"]
print(f"\nF (ANOVA) = {F_ano:.2f}, F (ANCOVA) = {F_anc:.2f}")

# Latin Square + covariate
print("\n=== Latin Square + Covariate ===")
ls_pattern = [
    ["A", "B", "C", "D"],
    ["B", "C", "D", "A"],
    ["C", "D", "A", "B"],
    ["D", "A", "B", "C"],
]
ls_records = []
for r_idx, row in enumerate(ls_pattern):
    row_eff = np.random.normal(0, 4)
    for c_idx, t in enumerate(row):
        col_eff = np.random.normal(0, 2)
        X = np.random.normal(50, 5)
        y = (50 + treat_eff[t] + row_eff + col_eff
             + 0.5 * (X - 50) + np.random.normal(0, 1.5))
        ls_records.append({"row": r_idx, "col": c_idx, "treatment": t,
                          "X": X, "Y": y})

ls_data = pd.DataFrame(ls_records)
ls_model = ols("Y ~ C(treatment) + C(row) + C(col) + X", data=ls_data).fit()
print(sm.stats.anova_lm(ls_model, typ=2).round(3))

6 가정과 한계

  • 균등 vs 비균등: 비균등은 Type II/III SS 권장.
  • 회귀 동질성: 처치 그룹 간 같은 \(\gamma\).
  • 결측 처리: covariate 결측은 분석 어려움 (multiple imputation 또는 mixed model).
  • 선형성: \(X\)\(Y\) 의 관계가 선형.

7 응용

분야 설계 Covariate
산업 (반도체) CRD 비균등 wafer baseline
농학 Latin Square 토양 비옥도
임상 비균등 RCT baseline severity
교육 RBD 사전 시험
ML CRD 비균등 dataset baseline accuracy

8 ML 매핑

매핑: ML 의 imbalanced evaluation

ML 모델 비교에서 dataset 수가 다름 (자연스러운 비균등):

Treatment: 모델 A (6 dataset), B (5 dataset), C (7 dataset).
Covariate: dataset 의 size 또는 difficulty.

비균등 ANCOVA 로 systematic 분석: - Type III SS. - Sum coding. - Mixed model 의 random dataset effect.

9 본 시리즈

G-MON8-0  개관
G-MON8-1  ANCOVA + RBD
G-MON8-2  CRD/Latin/비직교  ← 현재 글
G-MON8-3  비직교 + 다중 공변량
G-MON8-4  결측과 변환

10 관련 주제

선행 지식

후속 주제

11 더 읽을 거리

  • Cochran, W. G., Cox, G. M. (1957). “Experimental Designs” (2nd ed). 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.”
  • Pearce, S. C. (1983). “The Agricultural Field Experiment.” Wiley.

Subscribe

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