개별 비교와 대비 — Ch.4 overview

Maxwell Ch.4: 옴니버스 F 검정 이후, 어디에 차이가 있는가

ANOVA 의 옴니버스 F 검정 이후 어느 그룹 사이 차이가 있는지를 묻는 개별 비교 (individual comparisons) 와 대비 (contrast) 분석의 Maxwell Ch.4 흐름을 정리한다. 모형 비교 관점에서 t 와 F 의 관계 (\(F = t^2\)), 대비의 일반화, 직교 대비, 대비의 효과 크기 측정, 계획된 vs 사후 비교의 구분까지 다룬다.

Experimentation
Fundamentals
저자

Kwangmin Kim

공개

2026년 05월 08일

1 도입 — F 가 유의하면, 그 다음은?

A-MAX3-* 시리즈에서 일원 ANOVA 를 다뤘다. F 검정의 결론은 “적어도 한 쌍 의 그룹 평균이 다르다” 는 것이다. 그러나 어떤 쌍 인지는 모른다. 이 한계를 풀어주는 것이 개별 비교 (individual comparisons) 분석이고, Maxwell Ch.4 의 주제다.

1.1 시나리오 — 고혈압 치료 비교

Maxwell 이 든 사례:

“고혈압 치료 연구에서 4 그룹 (약물, 바이오피드백, 식이, 복합 치료) 을 비교한다고 하자. ANOVA F 검정으로 4 그룹이 다른지 검정할 수 있다. 그러나 다음 질문들에는 어떻게 답하는가? - 약물 치료가 바이오피드백과 다른가? - 약물이 식이와 다른가? - 복합 치료가 개별 치료들의 평균 보다 우수한가? - 복합 치료가 각각의 개별 치료 보다 우수한가?” (Maxwell & Delaney, 2004, Ch.4)

이 질문들은 옴니버스 검정 으로 답할 수 없다. 개별 비교 또는 대비 가 필요하다.

정의: 개별 비교 (Individual Comparison)

특정 두 그룹 (또는 그룹의 조합) 의 평균 차이를 검정하는 절차이다. 옴니버스 F 검정의 서브셋 검정 또는 후속 검정 으로 사용된다.

가장 단순한 형태는 두 그룹 간 평균 차이 검정이다. 일반화는 대비 (contrast) 로 이어진다.

정의: 대비 (Contrast)

그룹 평균의 선형 결합 으로, 계수의 합이 0 인 것:

\[ \psi = \sum_{j=1}^{J} c_j \mu_j, \quad \sum_{j=1}^{J} c_j = 0 \]

  • \(c_j\): 대비 계수
  • \(\sum c_j = 0\): 합 0 제약 (대비의 정의)

예시:

  • \((1, -1, 0, 0)\) — 그룹 1 vs 그룹 2 비교
  • \((1, 1, -1, -1)\) — (그룹 1, 2 평균) vs (그룹 3, 4 평균)
  • \((1, -1/3, -1/3, -1/3)\) — 그룹 1 vs 나머지 3 그룹 평균

2 Ch.4 의 4 단계 — 후속 글 안내

Ch.4.1  두 집단 평균 비교 — t 와 F (F = t²)        (A-MAX4-1)
       ↓
Ch.4.2  Contrast 정의 + Complex Contrasts          (A-MAX4-2)
       ↓
Ch.4.3  Orthogonal Contrasts + Effect Size for Contrast (A-MAX4-3)
       ↓
Ch.4.4  Planned vs Post Hoc → Ch.5 (다중 비교) 로 이어짐

3 모형 비교로서의 개별 비교

A-MAX3-* 에서 봤듯이 모형 비교 골격은 임의의 검정 에 적용된다. 개별 비교도 마찬가지다.

3.1 Full Model (Ch.3 와 동일)

\[ Y_{ij} = \mu_j + \varepsilon_{ij} \]

각 그룹이 자기 평균을 가진다.

3.2 Restricted Model (Ch.4 에서 새 형태)

특정 가설에 따라 일부 그룹 평균이 같다 는 제약을 추가한다.

예시: \(H_0: \mu_1 = \mu_2\) 를 검정할 때:

\[ Y_{i1} = \mu^* + \varepsilon_{i1}, \quad Y_{i2} = \mu^* + \varepsilon_{i2}, \quad Y_{ij} = \mu_j + \varepsilon_{ij} \; (j \geq 3) \]

즉 그룹 1 과 2 가 같은 평균 \(\mu^*\) 를 갖고, 나머지 그룹은 자기 평균을 가진다.

3.3 모수 수의 변화

  • Full model: \(J\) 개 모수 (\(\mu_1, \ldots, \mu_J\))
  • Restricted model: \(J - 1\) 개 모수 (그룹 1, 2 가 합쳐져서)

따라서 자유도 차이는 1 이다. 이것이 개별 비교 F 통계량의 분자 자유도가 1 인 이유다.

직관 — 자유도 1 의 의미

개별 비교의 분자 자유도 = 1 은 한 개의 제약 을 검정한다는 뜻이다. “\(\mu_1 = \mu_2\)” 라는 제약은 두 모수를 하나로 묶으므로 자유도가 1 줄어든다.

대조적으로 옴니버스 F 검정 (\(H_0: \mu_1 = \mu_2 = \cdots = \mu_J\)) 은 \(J - 1\) 개의 제약 을 동시에 검정한다 (모든 평균이 같다는 것은 \(J - 1\) 개의 등식). 따라서 분자 자유도가 \(J - 1\) 이다.

자유도가 제약의 개수 라는 일관된 직관이 모형 비교 골격의 우아함이다.

4 두 그룹 비교의 F 통계량

Maxwell 이 도출한 식 (Equation 1, Ch.4):

\[ F = \frac{(\bar{Y}_1 - \bar{Y}_2)^2}{\left(\frac{1}{n_1} + \frac{1}{n_2}\right) \text{MS}_W} \]

이 식의 분자는 두 그룹 평균의 차이 제곱 이고, 분모는 표준 오차의 제곱과 MS_W 의 곱 이다. \(\text{MS}_W\) 는 옴니버스 ANOVA 의 그룹 내 평균 제곱 (모든 \(J\) 그룹의 자료로 계산) 이다.

4.1 t 통계량과의 관계

같은 검정의 t 통계량 (등분산 가정):

\[ t = \frac{\bar{Y}_1 - \bar{Y}_2}{\sqrt{\text{MS}_W \left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]

이를 제곱하면:

\[ t^2 = \frac{(\bar{Y}_1 - \bar{Y}_2)^2}{\text{MS}_W \left(\frac{1}{n_1} + \frac{1}{n_2}\right)} = F \]

개별 비교의 F = (해당 t)².

직관 — 왜 ANOVA 의 MS_W 를 사용하는가

두 그룹 비교에 전체 ANOVA 의 \(\text{MS}_W\) 를 사용하는 것이 핵심이다. 단순한 two-sample t 검정은 그 두 그룹의 자료로만 분산을 추정한다. 그러나 ANOVA 의 \(\text{MS}_W\)모든 그룹 (J 개) 의 자료로 분산을 추정한다.

전제는 모든 그룹의 분산이 같다 (등분산 가정) 는 것이다. 이 가정이 성립하면 모든 그룹의 자료 로 추정한 \(\text{MS}_W\) 가 두 그룹만 사용한 추정보다 더 정확 하다.

이는 자유도에서 직접 보인다.

  • Two-sample t (두 그룹만): 자유도 = \(n_1 + n_2 - 2\)
  • 개별 비교 t (전체 ANOVA): 자유도 = \(n - J\) (총 표본 - 그룹 수)

\(n - J > n_1 + n_2 - 2\) 일 때 (즉 다른 그룹의 자료가 있을 때), 개별 비교 t 의 자유도가 더 크다 → 임계값 작음 → 검정력 더 높음.

이것이 ANOVA 후 사후 검정에서 전체 \(\text{MS}_W\) 를 쓰는 이유다.

5 대비의 일반화 — Complex Contrasts

두 그룹 비교는 가장 단순한 대비 이다 (계수 \((1, -1, 0, \ldots, 0)\)).

더 일반적인 대비는 복합 비교 (complex contrast) 이다.

5.1 예시 1 — 한 그룹 vs 나머지

\[ \psi = \mu_1 - \frac{1}{3}(\mu_2 + \mu_3 + \mu_4) \]

계수: \(c = (1, -1/3, -1/3, -1/3)\). 합 = 0.

5.2 예시 2 — 두 그룹 vs 두 그룹

\[ \psi = \frac{1}{2}(\mu_1 + \mu_2) - \frac{1}{2}(\mu_3 + \mu_4) \]

계수: \(c = (1/2, 1/2, -1/2, -1/2)\). 합 = 0.

5.3 예시 3 — 선형 추세 (Linear Trend)

수준이 순서 있는 (예: 약물 용량 0, 10, 20, 30 mg) 경우:

\[ \psi = -3 \mu_1 - 1 \mu_2 + 1 \mu_3 + 3 \mu_4 \]

계수: \(c = (-3, -1, 1, 3)\). 이는 그룹 평균이 선형으로 증가하는가 를 검정한다.

직관 — 대비 계수의 의미

대비 계수 \(c_j\)그 그룹이 비교에 어떤 부호와 가중치로 기여하는가 를 나타낸다.

  • \(c_j > 0\): 그 그룹의 평균이 가설
  • \(c_j < 0\): 그 그룹의 평균이 작을 가설
  • \(c_j = 0\): 그 그룹은 비교에 미참여

합이 0 인 제약 (\(\sum c_j = 0\)) 은 대비가 평균 차이만 측정 하도록 한다. 만약 합이 0 이 아니면, 대비는 절대 수준 (예: 모든 그룹의 평균) 도 측정하게 되어 해석이 복잡해진다.

A/B 테스트에서 4 변형 중 2 개씩 비교 한다고 하자. 대비 \((1, -1, 0, 0)\) 는 변형 1 과 2 의 차이만, \((1/2, 1/2, -1/2, -1/2)\)변형 1, 2 의 평균 vs 변형 3, 4 의 평균 차이를 검정한다. 비즈니스 질문에 따라 다른 대비를 설계한다.

6 대비 검정의 일반 형태

대비 \(\psi = \sum c_j \mu_j\) 의 표본 추정량:

\[ \widehat{\psi} = \sum_{j=1}^{J} c_j \bar{Y}_j \]

이 추정량의 분산:

\[ \text{Var}(\widehat{\psi}) = \sigma^2 \sum_{j=1}^{J} \frac{c_j^2}{n_j} \]

표본에서 \(\sigma^2\)\(\text{MS}_W\) 로 추정하면 표준 오차:

\[ \text{SE}(\widehat{\psi}) = \sqrt{\text{MS}_W \sum_{j=1}^{J} \frac{c_j^2}{n_j}} \]

t 통계량:

\[ t = \frac{\widehat{\psi}}{\text{SE}(\widehat{\psi})} = \frac{\sum c_j \bar{Y}_j}{\sqrt{\text{MS}_W \sum c_j^2 / n_j}} \]

자유도 \(n - J\). F 통계량은 \(t^2\).

7 직교 대비 (Orthogonal Contrasts)

정의: 직교 대비 (Orthogonal Contrasts)

두 대비 \(\psi_1 = \sum c_{1j} \mu_j\)\(\psi_2 = \sum c_{2j} \mu_j\)직교 라는 것은:

\[ \sum_{j=1}^{J} \frac{c_{1j} \cdot c_{2j}}{n_j} = 0 \quad (\text{균형 설계에서는 } \sum c_{1j} c_{2j} = 0) \]

7.1 직교의 의미

직교 대비는 서로 독립인 정보 를 제공한다. 즉 두 검정 결과가 상관 없다.

7.2 직교 대비의 SS 가산성

\(J\) 그룹 ANOVA 에서 서로 직교인 \(J - 1\) 개의 대비 를 만들 수 있고, 이들의 제곱합이 \(\text{SS}_B\) 와 같다.

\[ \text{SS}_B = \text{SS}_{\psi_1} + \text{SS}_{\psi_2} + \cdots + \text{SS}_{\psi_{J-1}} \]

여기서 \(\text{SS}_{\psi_k} = \widehat{\psi}_k^2 / \sum (c_{kj}^2 / n_j)\).

즉 옴니버스 \(\text{SS}_B\)\(J - 1\) 개의 독립적인 비교로 완전 분해 된다.

7.3 예시 — 4 그룹 직교 분해

4 그룹 사례에서 3 개의 직교 대비를 만들 수 있다. 한 가지 표준 분해:

대비 \(c_1\) \(c_2\) \(c_3\) \(c_4\) 의미
\(\psi_1\) 1 -1 0 0 그룹 1 vs 2
\(\psi_2\) 0 0 1 -1 그룹 3 vs 4
\(\psi_3\) 1 1 -1 -1 (1, 2) vs (3, 4)

직교 점검: \(\sum c_{1j} c_{2j} = 0 + 0 + 0 + 0 = 0\). \(\sum c_{1j} c_{3j} = 1 - 1 + 0 + 0 = 0\). \(\sum c_{2j} c_{3j} = 0 + 0 - 1 + 1 = 0\). 모두 직교.

7.4 직교 분해의 가치

직교 분해는 다음 장점을 가진다.

  1. 독립적 정보 — 한 대비의 결과가 다른 대비에 영향 X
  2. 다중 비교 보정 단순 — Bonferroni 등이 단순 적용
  3. 해석 명료 — 각 대비가 고유한 비교를 검정

8 대비의 효과 크기

대비도 자체 효과 크기를 가진다. Cohen 의 d for contrast:

\[ d_\psi = \frac{\widehat{\psi}}{s_p \cdot \sqrt{\sum c_j^2}} \]

여기서 \(s_p = \sqrt{\text{MS}_W}\) 는 풀링된 표준편차.

8.1 부분 \(\eta^2\) for Contrast

\[ \eta^2_{\psi} = \frac{\text{SS}_{\psi}}{\text{SS}_T} \]

또는 (다른 효과 통제 후) partial \(\eta^2\):

\[ \eta^2_{\text{partial}, \psi} = \frac{\text{SS}_{\psi}}{\text{SS}_{\psi} + \text{SS}_W} \]

8.2 신뢰 구간

\(\widehat{\psi}\) 의 95 % CI:

\[ \widehat{\psi} \pm t_{0.025, n-J} \cdot \text{SE}(\widehat{\psi}) \]

이 CI 가 효과 크기 보고 의 핵심이다. 점추정 + CI + p 값이 완전한 보고 형식이다.

9 Planned vs Post Hoc 비교

정의: 계획된 vs 사후 비교
  • Planned (a priori): 자료 수집 에 결정된 비교. 연구 가설에 기반.
  • Post hoc (a posteriori): 자료를 본 결정된 비교. 데이터 탐색 후 발견된 패턴.

9.1 차이의 의미

측면 Planned Post hoc
결정 시점 연구 가설 단계 자료 분석 단계
검정 횟수 보통 적음 (1-3 개) 보통 많음 (모든 쌍)
\(\alpha\) 통제 단순 (Bonferroni) 복잡 (Tukey, Scheffé)
검정력 일반적으로 높음 일반적으로 낮음
정직성 높음 (사전 등록) 낮음 (cherry picking 위험)

9.2 Cherry Picking 의 문제

Post hoc 비교에서 유의한 결과만 보고 하는 것은 p-hacking 의 한 형태이다. 4 그룹 사례에서 가능한 쌍별 비교는 \(\binom{4}{2} = 6\) 개이다. 모든 6 개를 검정하고 유의한 것만 보고 하면, 진정한 \(\alpha\) 가 5 % 보다 크다.

이것이 Maxwell Ch.5 의 다중 비교 보정 의 동기다.

직관 — 사전 vs 사후 비교의 정직성 차이

A/B 테스트에서 4 가지 디자인 (A, B, C, D) 을 비교한다고 하자.

Planned 시나리오: 실험 시작 전에 “B 가 A 보다 더 나을 것이다” 라는 단일 가설을 등록한다. 자료 수집 후 그 한 가설 만 검정한다. \(\alpha = 0.05\)그대로 유지된다.

Post hoc 시나리오: 자료를 본 후 “어, C 가 가장 좋네!” 발견한다. C vs 나머지 3 개의 비교를 한다. \(\alpha = 0.05\) 검정에서 적어도 한 비교는 우연만으로 유의해질 가능성이 높다. 실제 \(\alpha\) 가 5 % 보다 훨씬 크다.

이 차이는 통계적 정직성 의 문제다. Planned 비교는 사전 등록된 가설에 책임을 지지만, post hoc 은 자료를 보고 가설을 만든 셈이다.

해결책: 사전 등록 (preregistration) 을 통해 검증할 가설을 명시한다. 그 외 결과는 탐색적 분석 으로 표시하고 다중 비교 보정한다.

10 대비 분석의 흐름

연구 가설 → 대비 설계 (계수 $c_j$ 지정)
   ↓
자료 수집
   ↓
ANOVA F 검정 (옴니버스)
   ↓
선택 1: F 유의 → 사후 비교 (Tukey, Scheffé) — Ch.5
선택 2: 사전 등록된 대비 → 직접 검정 (Bonferroni 보정)
선택 3: 직교 분해 → SS 가산성 활용

11 코드 예시 — 대비 분석

import numpy as np
import pandas as pd
from scipy.stats import t, f
import statsmodels.api as sm
from statsmodels.formula.api import ols

np.random.seed(42)
n_each = 15

# 4 그룹 자료 (고혈압 치료)
group_drug = np.random.normal(120, 10, n_each)
group_biofeedback = np.random.normal(125, 10, n_each)
group_diet = np.random.normal(123, 10, n_each)
group_combined = np.random.normal(115, 10, n_each)  # 복합이 가장 좋음

groups = ['drug']*n_each + ['biofeedback']*n_each + ['diet']*n_each + ['combined']*n_each
all_data = np.concatenate([group_drug, group_biofeedback, group_diet, group_combined])
df = pd.DataFrame({'bp': all_data, 'treatment': groups})

# 1. 옴니버스 ANOVA
model = ols('bp ~ C(treatment)', data=df).fit()
anova_table = sm.stats.anova_lm(model)
print(anova_table)

ms_w = anova_table['mean_sq'].iloc[1]
df_w = anova_table['df'].iloc[1]
n = len(df)
J = 4

# 2. 그룹 평균
means = df.groupby('treatment')['bp'].mean()
print(f"\n그룹 평균:\n{means}")

# 3. 대비 1 — 약물 vs 바이오피드백 (단순 비교)
c1 = {'drug': 1, 'biofeedback': -1, 'diet': 0, 'combined': 0}
psi1 = sum(c1[g] * means[g] for g in c1)
se_psi1 = np.sqrt(ms_w * sum(c1[g]**2 / n_each for g in c1))
t_psi1 = psi1 / se_psi1
p_psi1 = 2 * (1 - t.cdf(abs(t_psi1), df_w))
print(f"\n대비 1 (drug vs biofeedback): ψ = {psi1:.2f}, t = {t_psi1:.3f}, p = {p_psi1:.4f}")

# 4. 대비 2 — 복합 vs 개별 평균 (복합 비교)
c2 = {'drug': -1/3, 'biofeedback': -1/3, 'diet': -1/3, 'combined': 1}
psi2 = sum(c2[g] * means[g] for g in c2)
se_psi2 = np.sqrt(ms_w * sum(c2[g]**2 / n_each for g in c2))
t_psi2 = psi2 / se_psi2
p_psi2 = 2 * (1 - t.cdf(abs(t_psi2), df_w))
print(f"대비 2 (combined vs others avg): ψ = {psi2:.2f}, t = {t_psi2:.3f}, p = {p_psi2:.4f}")

# 5. 대비의 95 % 신뢰 구간
ci_psi2 = (psi2 - t.ppf(0.975, df_w) * se_psi2,
           psi2 + t.ppf(0.975, df_w) * se_psi2)
print(f"대비 2 의 95 % CI = ({ci_psi2[0]:.2f}, {ci_psi2[1]:.2f})")

# 6. 대비의 효과 크기 (d for contrast)
s_p = np.sqrt(ms_w)
sum_c2_squared = sum(c2[g]**2 for g in c2)
d_psi2 = psi2 / (s_p * np.sqrt(sum_c2_squared))
print(f"d for contrast 2 = {d_psi2:.3f}")

# 7. 직교성 점검 (대비 1 과 2)
orthogonal = sum(c1[g] * c2[g] for g in c1)  # = 0 이면 직교
print(f"\n대비 1 과 2 의 직교성: Σ c1·c2 = {orthogonal:.3f}")

이 코드는 옴니버스 ANOVA + 두 개의 대비 + 효과 크기 + CI + 직교성 점검 을 한 번에 수행한다.

12 후속 — 다중 비교

이 글에서는 개별 비교의 골격 을 다뤘다. 그러나 여러 비교를 동시에 수행 하면 \(\alpha\) 가 인플레이션된다 (Cherry picking). 이를 정식으로 다루는 것이 Ch.5 의 다중 비교 보정 (Bonferroni, Tukey, Scheffé, FDR) 이다. 후속 시리즈 A-MAX5-* 에서 다룬다.

13 관련 주제

선행 지식

후속 주제 (Phase A)

  • A-MAX4-1 t-F 관계 (F = t²) 자세히
  • A-MAX4-2 Contrast 정의와 일반화
  • A-MAX4-3 Orthogonal Contrasts 와 효과 크기
  • A-MAX5-* 다중 비교 보정

다른 카테고리 연결

Subscribe

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