기저선 비교의 함정 — Ch.14.3

Hypothesis Test 의 부조리와 적절한 baseline 보고

Schulz Ch.14 의 마지막 deep dive — RCT 보고의 첫 표 (Baseline Characteristics Table) 의 적절·부적절 관행. (1) 무작위 배정 RCT 에서 baseline 의 hypothesis test 가 정의상 부조리한 이유 — Altman “clearly absurd”, (2) Hypothesis test 사용의 부작용 — 보고 억제 메커니즘 (Schulz 외 1994 의 유의 결과 비율 < 5%), (3) 적절한 baseline 보고 — 평균·SD· 중앙값·IQR·percentage 의 사용 원칙, (4) Chance imbalance 의 사전 계획적 adjustment. 각 통계 도구에 직관 비유와 반사실 시나리오를 풍부히 붙인다.

Experimentation
Epidemiology
저자

Kwangmin Kim

공개

2026년 05월 08일

이 글은 Schulz Ch.14 Allocation Concealment 시리즈의 마지막 글이다. Ch.14 개관, 은폐의 중요성, 평가 기준과 사례 에 이어, Baseline comparison 의 적절·부적절 관행 을 깊이 다룬다 (Schulz full md L:5811~6084).

1 진입 직관 — 왜 Baseline 의 Hypothesis Test 는 부조리 한가

대부분 RCT 보고서의 첫 표는 Baseline Characteristics 다 — 두 군의 연령·성별·중증도·병력 등을 비교. 이 표는 두 가지 목적을 가진다.

  1. 모집단 기술 — 이 시험에 참여한 환자가 어떤 특성 인가 (외적 타당도 평가)
  2. 두 군의 비교 가능성 — 무작위 배정이 적절히 작동했는가 의 시각적 확인

그러나 흔한 관행 이 있다 — 각 baseline 변수에 hypothesis test 를 수행해 p-value 를 표에 보고. Schulz 와 Altman 은 이 관행을 강하게 비판한다.

Altman 의 명언: “Such a procedure is clearly absurd.” (Altman 1985)

왜 부조리인가?: 무작위 배정 RCT 에서 두 군의 baseline 차이는 정의상 우연. p-value 는 “차이가 우연일 확률” 을 묻는데, 이미 우연임을 알고 있는 데이터에 묻는 것은 무의미. 0.05 p-value 가 나와도 그것은 Type I 오류 5% 의 정상 발생 — bias 의 증거가 아님.

이 글의 목적:

  1. 왜 baseline test 가 부조리한가 — 수학적 명료화
  2. 왜 부작용까지 있는가 — Schulz 외 (1994) 의 보고 억제 발견
  3. 무엇이 적절한 baseline 보고인가 — Panel 14.3 의 모범 사례
  4. Chance imbalance 의 적절한 처리 — 사전 계획적 adjustment

2 Hypothesis Test 의 부조리 — 수학적 분석

2.1 정상 가설 검정의 논리

일반적 hypothesis test 의 논리:

가설:
  H_0: 효과 없음 (no effect)
  H_1: 효과 있음

데이터 관찰:
  → 만약 H_0 가 참이라면, 이 데이터가 관찰될 확률 (p-value)
  → p < 0.05 이면 H_0 를 *기각* — 효과 *있을 가능성*

이 논리의 핵심: H_0 가 참인지 모르는 상태에서 데이터로 추론.

2.2 Baseline Test 의 문제

무작위 배정 RCT 에서 baseline 차이의 가설:

가설:
  H_0: 두 군의 baseline 분포가 같다
  H_1: 두 군의 baseline 분포가 다르다

문제: H_0 는 *정의상 참*.
  → 무작위 배정 = 두 군이 *동일 모집단에서 추출됨* = 분포 같음
  → H_0 는 알려진 진실이지 검증 대상이 아님

수식 직관: 무작위 배정 변수 \(T\) 와 baseline 변수 \(X\) 사이:

\[T \perp\!\!\!\perp X \quad (\text{무작위 배정의 정의})\]

\(E[X | T = 0] = E[X | T = 1]\). 두 군의 baseline 평균이 동일 모집단 평균 으로 같다. 차이는 순수 우연 (random sampling variability).

반사실: 만약 \(T\)\(X\) 가 종속이라면 (예: 임상의가 위험 낮은 환자에게 새 약 선택), 그것은 concealment 부재의 증거. 그러나 이를 p-value 로 검출하는 것은 부적절 — concealment 평가는 직접 보고 (sequence generation, allocation method) 로 해야 함.

2.3 Type I 오류의 정상 발생

Hypothesis test 의 본질: \(\alpha = 0.05\)5% 의 진짜 무차이 데이터 에서도 \(p < 0.05\) 발생.

시나리오: 20 개 baseline 변수 (연령·성별·BMI·흡연·…) 를 검정하면, 기댓값 1 개 가 우연히 \(p < 0.05\). 이는 bias 의 증거가 아님 — 다중 검정의 정상 결과.

반사실: Reviewer 가 baseline 표에서 한 변수의 \(p < 0.05\)imbalance 의 증거 로 해석하면 잘못된 비판. 시험을 부당히 거부 하거나 post-hoc adjustment 를 강요할 수 있음.

3 Hypothesis Test 의 부작용 — 보고 억제 메커니즘

Schulz 의 가장 흥미로운 발견 — baseline test 는 단지 무의미한 게 아니라 적극적 해롭다.

3.1 Schulz 외 (1994) 의 발견

분석 결과 (Schulz, Chalmers, Grimes, Altman 1994; Altman & Doré 1990):

Baseline hypothesis test 사용 시험에서, 유의 결과의 비율이 우연 기댓값 (5%) 보다 적다.

이게 왜 충격인가:

정상 기대:
  20 개 baseline 변수 × 100 개 시험 = 2000 검정
  α = 0.05 → 우연히 100 개 (5%) 가 p < 0.05 가 되어야 함

관찰:
  실제 p < 0.05 비율이 5% 보다 *적음*

Schulz 의 해석: “일부 연구자가 유의한 baseline 차이를 의도적으로 보고하지 않음. ‘유의한 baseline imbalance 가 있으면 보고서가 의심받을 것’ 이라는 잘못된 인식 때문.”

반사실: 만약 한 시험에서 baseline 연령 \(p = 0.04\) 발견. 연구자가 “이 변수는 별로 중요하지 않다” 며 표에서 제외. 다른 변수들만 보고. Reviewer 는 “baseline 잘 균형되었다” 고 판단. 정보 은폐 가 의도치 않게 일어남.

3.2 문제의 핵심

Hypothesis test 가 imbalance 의 imaginary 평가 도구 로 작동:

  1. 연구자가 baseline 차이의 통계적 유의성 을 검토
  2. 유의하면 보고 억제 또는 post-hoc 변경 동기 발생
  3. Reviewer 도 유의성으로만 baseline 평가 — 임상적 중요성 무시
  4. 결과: Reviewer 가 시험의 baseline 적절성을 진짜로 평가할 수 없음

so what: Hypothesis test 는 단지 무의미한 게 아니라 시험 진실성을 위협. 학술지·CONSORT 가 baseline test 사용을 명시적으로 비추천 하는 이유.

4 적절한 Baseline 보고 — Panel 14.3

Schulz 의 모범 사례 (Panel 14.3):

Characteristic Antibiotic Group Placebo Group
Age (mean ± SD) (years) 30.2 ± 5.2 31.1 ± 5.9
Weight (median [IQR]) (kg) 64 (55, 82) 65 (56, 85)
Nulliparous (n, %) 62 (53%) 63 (49%)
Previous pelvic inflammatory disease (n, %) 24 (21%) 28 (22%)

핵심 특징:

  • 연속 변수: 평균 + SD (또는 중앙값 + IQR)
  • 범주 변수: 빈도 + 백분율
  • p-value 없음
  • 명시적 단위 (years, kg)

4.1 변수 유형별 적절 통계

변수 유형 분포 적절 통계 부적절
Continuous, 정규 연령, BMI, 혈압 평균 ± SD t-test p-value
Continuous, 비대칭 체중, 시간, 비용 중앙값 + IQR t-test p-value
Categorical, 이분 성별, 흡연 n (%) χ² test p-value
Categorical, 다범주 인종, 교육 n (%) per category χ² test p-value
Continuous, count 입원 횟수 중앙값 + IQR or 평균 Poisson test

변동성 표기 — SD vs SE vs CI:

통계 의미 적절성
SD (Standard Deviation) 데이터 분포의 폭 [O] Baseline 에 적절
SE (Standard Error) 추정량의 정밀성 [X] Baseline 에 부적절
95% CI 모수의 추정 구간 [X] Baseline 에 부적절

Baseline 표는 기술 통계 (descriptive), SE/CI 는 추론 통계 (inferential). 두 목적이 다름.

4.2 비대칭 분포의 처리

나이 같은 정규 분포 변수는 평균·SD. 체중·소득·입원 일수 같은 비대칭 분포는 중앙값·IQR.

반사실: 입원 일수의 분포가 강하게 우편향 (대부분 1~3 일, 일부 30+ 일). 평균 5.2 일, SD 8.7 일을 보고하면 오해 — “평균적으로 5 일 입원” 이 아니라 대부분은 단기, 일부는 매우 장기. 중앙값 2 일 (IQR 1, 4) 이 더 정확한 그림.

5 What to Look for — Baseline Reading 능력

CONSORT 와 Schulz 의 권장 — Reviewer·독자가 baseline 표를 어떻게 평가 해야 하나:

5.1 Step 1: 임상적 중요성 (Clinical Importance)

질문: 이 변수가 결과에 영향을 줄 가능성 이 큰가?

변수 결과 영향 가능성
연령 (대부분 시험) 높음
성별 (대부분 시험) 중~높음
질병 중증도 (severity) 매우 높음
동반 질환 (comorbidity) 높음
학력 보통 낮음
직업 보통 낮음

함의: 임상적으로 중요한 변수에서 imbalance 가 있으면 우려. 덜 중요한 변수에서 imbalance 는 무시.

5.2 Step 2: Imbalance 의 크기 (Magnitude)

질문: Imbalance 가 결과에 영향을 줄 만큼 큰가?

임상적 중요 변수 Imbalance 크기 우려 수준
연령 1 년 차이 낮음
연령 5 년 차이
연령 10 년 차이 높음
중증도 (1~5 단계) 0.3 단계 차이 낮음
중증도 1 단계 차이 매우 높음

so what: Hypothesis test 의 p-value 가 아니라 임상적 의미 로 평가. 100 명 시험에서 연령 차이 5 년 (\(p = 0.03\)) 은 우려, 100,000 명 시험에서 연령 차이 0.5 년 (\(p = 0.001\)) 은 무시.

5.3 Step 3: 다중 비교 인식

질문: 몇 개 변수를 비교했는가? 한 변수의 imbalance 가 우연의 정상 발생 인가?

반사실: 20 개 변수 × Type I 5% = 1 개 우연 imbalance 기댓값. 시험에서 1~2 개 imbalance 발견은 정상. 5~10 개 imbalance 는 우연이 아닐 가능성 — concealment 우려.

6 Chance Imbalance 의 적절한 Adjustment

무작위 배정에도 chance imbalance 는 발생한다. 어떻게 처리해야 하나?

6.1 통계적 분석에서의 자연스러운 처리

Schulz 의 핵심: “결과 분석의 통계 검정이 chance imbalance 를 자동으로 처리한다. 무작위 배정의 random variability 는 기존 통계 이론 에 이미 포함됨.”

즉 t-test, ANOVA, Cox regression 등의 분산 추정 이 chance imbalance 를 반영. 별도 보정 불필요.

6.2 Adjusted Analysis 의 적절성

그러나 adjusted analysis유용한 경우가 있다.

권장: 사전 계획된 (pre-specified) adjustment — 시험 시작 전에 “연령·중증도로 보정” 을 명시. 결과 분석 시 이 변수들로 adjusted estimator 계산.

이는 다음 두 가지 이점:

  1. 정밀성 (precision): \(\hat{\theta}_{\text{adjusted}}\) 의 분산이 일반적으로 더 작음
  2. 편향 차단: Chance imbalance 의 영향 추가 차단

수식 직관: ANCOVA (Analysis of Covariance) 의 결과 표준 오차:

\[\text{SE}(\hat{\theta}_{\text{adj}}) = \text{SE}(\hat{\theta}_{\text{unadj}}) \cdot \sqrt{1 - r^2}\]

여기서 \(r\) 은 covariate 와 결과의 상관. \(r = 0.5\) 면 SE 가 약 13% 감소 → 검정력 증가.

6.3 Post-hoc Adjustment 의 위험

반대: 결과 보고서에서 imbalance 발견 후 보정한 분석 = post-hoc adjustment. 위험:

  1. 변수 선택의 임의성 — 어떤 변수를 보정할지 결과를 보고 결정 → bias
  2. 유리한 결과 cherry-picking — 여러 보정 시나리오 중 가장 유리한 것 선택
  3. 재현 불가능성 — 다른 연구자가 동일 결과 재현 어려움

권장: 모든 adjusted analysis 는 사전 계획. 사후 발견 imbalance 보정은 exploratory 로만 보고.

7 CONSORT 의 권장 사항

CONSORT 2010 Item 15:

“A table showing baseline demographic and clinical characteristics for each group.”

추가 권장:

  • 임상적으로 중요한 변수만 포함
  • p-value 제거
  • 평균·SD 또는 중앙값·IQR 적절 사용
  • 백분율은 분모 명시 (예: “62/117 (53%)” 또는 “53% (n = 62)”)

8 IT / 디지털 실험 매핑

역학 (RCT) IT (A/B Test)
Baseline characteristics table Pre-period activity table (per bucket)
Hypothesis test on baseline Pre-period statistical test (남용)
Sequentially numbered IDs Hash-based assignment
Chance imbalance Random allocation imbalance
Pre-specified adjustment CUPED, CUPAC variance reduction
Post-hoc imbalance check A/A test
Altman “clearly absurd” “Pre-period p-value 보지 마라” 의 IT 버전

A/B 테스트의 동형 함정: IT 에서 pre-period 차이 를 hypothesis test 로 평가하는 관행이 흔하다. 그러나 hash 기반 assignment 가 적절하면 정의상 우연. p-value 보고 시험 진행 결정에 사용하는 것은 baseline test 와 동일하게 부조리.

CUPED 의 가치: Deng 외 (2013) 의 CUPED (Controlled-experiment Using Pre-Experiment Data) 는 사전 계획된 adjustment 의 IT 버전. Pre-period 활동을 covariate 로 활용해 분산 감소. 이는 임상의 ANCOVA 와 동형.

9 코드 예시 — Baseline 분석 시뮬레이션

import numpy as np
from scipy import stats

np.random.seed(42)

# 시험 시뮬레이션 1000 회
n_sim = 1000
n_per_arm = 100
n_baseline_vars = 20

# 각 시험에서 baseline 변수 비교
all_p_values = []

for _ in range(n_sim):
    # 무작위 배정된 두 군
    group_A = np.random.normal(50, 10, n_per_arm)   # 연령 (mean=50, SD=10)
    group_B = np.random.normal(50, 10, n_per_arm)

    # 20 개 baseline 변수 비교
    for _ in range(n_baseline_vars):
        var_A = np.random.normal(50, 10, n_per_arm)
        var_B = np.random.normal(50, 10, n_per_arm)
        _, p = stats.ttest_ind(var_A, var_B)
        all_p_values.append(p)

# Type I 오류율 — α=0.05 에서 5% 가 정상
p_significant = np.mean(np.array(all_p_values) < 0.05)
print(f"[Baseline test 의 Type I 오류 시뮬레이션]")
print(f"전체 검정 수: {len(all_p_values)}")
print(f"P(p < 0.05) = {p_significant:.3f} (이론적 0.050)")
print(f"→ 무작위 배정 하에서 정확히 5% 가 우연 유의 — bias 증거 아님\n")

# 한 시험당 유의 변수 수
n_significant_per_trial = []
for trial_p in np.array(all_p_values).reshape(n_sim, n_baseline_vars):
    n_significant_per_trial.append(sum(trial_p < 0.05))

print("[한 시험당 유의 변수 수 분포]")
import collections
counts = collections.Counter(n_significant_per_trial)
for n_sig in sorted(counts.keys()):
    pct = counts[n_sig] / n_sim * 100
    print(f"  {n_sig}/20 변수 유의: {counts[n_sig]} 시험 ({pct:.1f}%)")

# 적절한 baseline 보고 형식
print("\n[적절한 Baseline Table — Panel 14.3 형식]")
np.random.seed(42)
n_per_arm = 100

# 시뮬레이션 데이터
ages_A = np.random.normal(30.2, 5.2, n_per_arm)
ages_B = np.random.normal(31.1, 5.9, n_per_arm)
weight_A = np.random.lognormal(np.log(64), 0.3, n_per_arm)
weight_B = np.random.lognormal(np.log(65), 0.3, n_per_arm)
nullip_A = np.random.binomial(1, 0.53, n_per_arm)
nullip_B = np.random.binomial(1, 0.49, n_per_arm)
pid_A = np.random.binomial(1, 0.21, n_per_arm)
pid_B = np.random.binomial(1, 0.22, n_per_arm)

print(f"{'Characteristic':<40} {'Antibiotic':>20} {'Placebo':>20}")
print(f"{'-'*40} {'-'*20} {'-'*20}")
print(f"{'Age (mean ± SD) (years)':<40} {f'{ages_A.mean():.1f} ± {ages_A.std():.1f}':>20} {f'{ages_B.mean():.1f} ± {ages_B.std():.1f}':>20}")
print(f"{'Weight (median [IQR]) (kg)':<40} {f'{np.median(weight_A):.0f} ({np.percentile(weight_A, 25):.0f}, {np.percentile(weight_A, 75):.0f})':>20} {f'{np.median(weight_B):.0f} ({np.percentile(weight_B, 25):.0f}, {np.percentile(weight_B, 75):.0f})':>20}")
print(f"{'Nulliparous (n, %)':<40} {f'{nullip_A.sum()} ({nullip_A.mean()*100:.0f}%)':>20} {f'{nullip_B.sum()} ({nullip_B.mean()*100:.0f}%)':>20}")
print(f"{'Previous PID (n, %)':<40} {f'{pid_A.sum()} ({pid_A.mean()*100:.0f}%)':>20} {f'{pid_B.sum()} ({pid_B.mean()*100:.0f}%)':>20}")

print("\n→ p-value 없음, 평균/중앙값 + 변동성 통계만")
print("→ Reviewer 가 임상적 중요성과 imbalance 크기로 평가")

# Adjusted analysis 시뮬레이션 — CUPED-like
print("\n[Pre-specified Adjustment 의 효과]")
n = 200
true_effect = 0.5

baseline = np.random.normal(0, 1, n)
T = np.random.choice([0, 1], n)
# 결과 = 처치 효과 + baseline 영향 + noise
Y = T * true_effect + 0.7 * baseline + np.random.normal(0, 1, n)

# Unadjusted
mean_T = Y[T == 1].mean()
mean_C = Y[T == 0].mean()
unadjusted = mean_T - mean_C
se_unadjusted = np.sqrt(Y[T == 1].var()/sum(T==1) + Y[T == 0].var()/sum(T==0))

# Adjusted (linear regression)
import statsmodels.api as sm
X = sm.add_constant(np.column_stack([T, baseline]))
model = sm.OLS(Y, X).fit()
adjusted = model.params[1]
se_adjusted = model.bse[1]

print(f"진짜 효과: {true_effect:.2f}")
print(f"Unadjusted: {unadjusted:.3f} (SE: {se_unadjusted:.3f})")
print(f"Adjusted:   {adjusted:.3f} (SE: {se_adjusted:.3f})")
print(f"SE 감소율: {(1 - se_adjusted/se_unadjusted)*100:.0f}%")

이 코드는 (1) Baseline test 의 Type I 오류율이 정확히 5% — bias 증거 아님, (2) 한 시험당 평균 1 개 유의 변수가 우연 발생, (3) 적절한 baseline 표 형식, (4) Pre-specified adjustment 의 분산 감소 효과를 보여준다.

10 결론 — Ch.14.3 의 한 줄 요약

Baseline 표는 기술 통계만, hypothesis test 는 부조리.

핵심 행동 권고:

  1. Baseline 표에 p-value 보고 금지 — 정의상 부조리 (Altman)
  2. 변수 유형별 적절 통계 — 평균·SD / 중앙값·IQR / n·%
  3. 임상적 중요성 + Imbalance 크기 로 평가, 통계적 유의성 X
  4. Adjusted analysis 는 사전 계획만 — Post-hoc 보정 위험
  5. CUPED 같은 IT variance reduction 도 동일 원리 (사전 계획)

Ch.14 시리즈를 종합하면: Concealment 의 적절성은 RCT 신뢰성의 최대 단일 결정 요인 이다. Sequence generation·Concealment·Baseline 보고 모두 방법론적 표준 을 따라야 비로소 RCT 가 진실의 추구 도구가 된다.

다음 챕터 (Ch.15) 는 또 다른 critical topic — Exclusions and Losses (ITT 원칙) 을 다룬다.

11 관련 주제

선행 지식

Phase C 후속 글

다른 카테고리 연결

12 참고문헌

  • Schulz, K. F. & Grimes, D. A. (2019). Essential Concepts in Clinical Research (2nd ed.), Ch.14, Panel 14.3. Elsevier.
  • Altman, D. (1985). Comparability of randomised groups. Statistician 34, 125-136.
  • Altman, D. G. & Doré, C. J. (1990). Randomisation and baseline comparisons in clinical trials. Lancet 335, 149-153.
  • Schulz, K. F., Chalmers, I., Grimes, D. A., Altman, D. G. (1994). Assessing the quality of randomization. JAMA 272, 125-128.
  • Senn, S. (1997). Statistical Issues in Drug Development. Wiley.
  • Lavori, P. W., Louis, T. A., Bailar, J. C., Polansky, M. (1983). Designs for experiments — parallel comparisons of treatment. N. Engl. J. Med. 309, 1291-1299.
  • Deng, A., Xu, Y., Kohavi, R., Walker, T. (2013). Improving the sensitivity of online controlled experiments by utilizing pre-experiment data. WSDM (CUPED).

Subscribe

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