다중 검정에서 Bonferroni 보정과 FDR 제어 선택하기
다중 가설 검정에서 누적되는 1종 오류를 다루기 위해 Bonferroni·Holm 보정과 BH·BY 기반 FDR 제어를 선택하고 보고하는 방법
2026-08-14 · 최초 발행 2024-04-29
여러 가설을 한꺼번에 검정할 때 생기는 문제
실험이나 관측 데이터에서 다수의 가설을 동시에 검정하면, 각 검정을 유의수준 α로 판정하는 것만으로는 전체 1종 오류를 관리할 수 없다. 이것이 다중 비교 문제다.
m개의 가설을 검정할 때 개별 검정의 유의수준을 α로 유지하면, 전체 거짓 양성 확률은 α보다 커진다. 예를 들어 m=100, α=0.05라면 모든 영가설이 참이어도 평균적으로 5개 내외의 거짓 양성이 발생한다.
오류를 어떤 방식으로 측정할지부터 구분해야 한다.
- FWER(Family-Wise Error Rate)는 적어도 하나의 거짓 양성이 발생할 확률 P(V≥1)다. 단일 거짓 양성도 허용하기 어려운 상황에서 쓰는 엄격한 지표다.
- FDR(False Discovery Rate)은 거짓 발견 비율의 기댓값 E[V/R]이다. R>0일 때 V/R로 계산하며, R=0이면 0으로 정의한다. 탐색적 분석에서 유용하다.
Bonferroni 보정은 검정별 기준을 α/m으로 낮춰 FWER ≤ α를 보장한다. BH(Benjamini–Hochberg) 절차는 p값을 오름차순으로 정렬한 뒤 p(i) ≤ (i/m)·q를 만족하는 최대 i를 찾고, 그 이하 가설을 기각한다. 독립 또는 약한 양의 상관을 가정할 때 FDR ≤ q를 근사 보장한다.
오류 허용 범위에 따라 방법이 달라진다
규제·임상시험·확증적(Confirmatory) 연구처럼 거짓 양성 하나도 치명적인 경우에는 FWER 통제가 맞다. Bonferroni나 Holm을 선택할 수 있다. 반대로 오믹스, 전사체, A/B 테스트처럼 다수의 후보에서 신호를 찾아야 하는 단계에는 BH나 BY 기반 FDR 제어가 더 적합하다.
Bonferroni는 임계값을 α/m으로 줄이는 방식이라 해석이 단순하지만, m이 커질수록 보수성이 급격히 커지고 거짓 음성이 늘어날 수 있다. Holm step-down은 FWER 통제를 유지하면서 검정력을 약간 개선할 수 있다.
BH는 정렬된 p값과 계단형 임계값 (i/m)·q를 비교해 기각선을 정한다. q-value는 FDR 관점에서 각 가설의 최소 q를 해석하는 데 사용한다. 거짓 양성을 일부 허용하는 대신 더 많은 실제 효과를 탐지할 수 있으므로, 보고할 때는 기대 거짓 발견 비율도 함께 제시해야 한다.
상관구조도 선택 기준이다. Bonferroni와 Holm은 상관구조와 무관하게 FWER 상계를 보장하지만 보수적이다. BH는 독립 또는 PRDS(양의 상관)에서 FDR을 보장하며, 일반 상관에서는 더 보수적인 BY를 고려한다.
분석 목적에 맞춘 적용 장면
유전체 변이 연관성 분석에서는 수십만 SNP와 표현형의 연관을 검정할 수 있다. 1차 스크리닝에서 BH(q=0.05)로 후보군을 정하고, 복제(cohort replication) 단계에서는 FWER 통제를 적용하는 방식이 가능하다.
디지털 제품의 A/B 테스트에서는 여러 KPI를 함께 평가한다. 핵심 KPI에는 Holm으로 FWER를 통제하고, 보조 지표나 세그먼트 분석에는 BH를 적용해 탐색적 의사결정을 분리할 수 있다.
다중 엔드포인트 임상시험에서는 공동 1차 엔드포인트 세트에 Bonferroni나 게이트팅(gatekeeping) 전략을 적용한다. 2차 엔드포인트는 FDR로 신호를 찾은 뒤 후속 검증으로 이어갈 수 있다.
Bonferroni에서 FWER α=0.05를 설정하면 임의의 거짓 양성이 발생할 확률 ≤ 5%를 보장한다. BH에서 FDR q=0.05를 설정하면 평균적으로 기각된 결과 중 거짓의 비율을 ≤ 5% 수준으로 유지한다.
이 구분은 데이터 기반 의사결정의 신뢰성과 재현성을 높이고, 탐색과 확증 단계를 분리해 연구 생산성을 높이는 데 도움이 된다. 오류 지표를 명확히 하면 이해관계자 및 규제 대응을 위한 커뮤니케이션 비용도 줄일 수 있다.
| 항목 | Bonferroni/Holm | FDR (BH/BY) |
|---|---|---|
| 오류 통제 | FWER 엄격 통제 | FDR 평균 비율 통제 |
| 검정력(민감도) | 낮음(보수적) | 높음(탐색적에 유리) |
| 상관 가정 | 무관(보수적) | BH: 독립/양의 상관, BY: 일반 상관 |
| 확장성(m↑) | 임계값 α/m로 급격히 보수화 | 기각선 (i/m)·q로 상대적 완화 |
| 운영 편의 | 해석·보고 단순 | 해석 시 q·기각 수(R) 병기 필요 |
가설 집합부터 결과 보고까지의 흐름
운영에서 먼저 고정할 기준
분석 전에 가족(family) 단위의 가설 집합을 명세하고, 1차와 2차 지표를 구분한다. 목표 오류 지표를 FWER 또는 FDR 중에서 정한 뒤 α 또는 q를 사전 등록한다.
실행 단계에서는 동일 모형, 동일 전처리, 동일 샘플을 사용해 검정의 일관성을 확보한다. p값의 NaN과 극단값을 점검한 뒤 Bonferroni, Holm, BH, BY 중 선택한 보정을 적용하고, 보정 p값과 기각 결과를 산출한다.
결과에는 R(기각 수), 보정 p값 분포, 예상 거짓 발견 수(≈q·R) 또는 FWER 목표를 명시한다. 상관구조, 가정, 도구 버전을 기록하고 재현 스크립트를 저장한다.
Python으로 보정 결과 계산하기
전제조건: Python 3.10+, statsmodels ≥ 0.14, numpy ≥ 1.24
import numpy as np
from statsmodels.stats.multitest import multipletests
# 예시 p값 (가상의 20개 검정)
np.random.seed(7)
pvals = np.sort(np.random.rand(20))
# 1) Bonferroni (FWER α=0.05)
rej_bonf, p_bonf, _, _ = multipletests(pvals, alpha=0.05, method='bonferroni')
# 2) Holm step-down (FWER)
rej_holm, p_holm, _, _ = multipletests(pvals, alpha=0.05, method='holm')
# 3) BH (FDR q=0.05)
rej_bh, p_bh, _, _ = multipletests(pvals, alpha=0.05, method='fdr_bh')
# 4) BY (FDR, 일반 상관에 보수적)
rej_by, p_by, _, _ = multipletests(pvals, alpha=0.05, method='fdr_by')
print("원 p값:", pvals.round(4))
print("Bonferroni 기각 수:", rej_bonf.sum(), "보정 p값 예:", p_bonf[:5].round(4))
print("Holm 기각 수:", rej_holm.sum())
print("BH(FDR) 기각 수:", rej_bh.sum())
print("BY(FDR) 기각 수:", rej_by.sum())
매우 작은 p값인 0.0은 수치 오버플로를 피하기 위해 최소값 epsilon=1e-16을 적용할 수 있다. 다중 패밀리가 존재하면 패밀리별로 별도 보정을 수행한다.
가정이 흔들리는 분석에서 점검할 사항
강한 음의 상관이나 복잡한 종속성이 있으면 BH의 보장이 약해질 수 있다. 이 경우 퍼뮤테이션 기반 FDR, BY, IHW(가중 FDR)를 검토한다.
Storey의 q-value처럼 π0 추정을 사용하는 적응적 방법은 검정력을 높일 수 있지만 추정 편향 위험이 있다. 보수적 임계값과 교차검증이 필요하다.
반복 모니터링이나 순차적 분석처럼 연속적으로 의사결정하는 환경에서는 α-소모 문제가 생긴다. 알파 스펜딩이나 온라인 FDR(예: LORD)처럼 별도 프레임워크를 검토한다.
사전 계획과 실제 분석의 차이, 제외 기준, 데이터 정제 내역은 결과와 함께 공개한다. 탐색 단계에는 FDR을, 확증 단계에는 FWER를 적용하는 방식으로 분석 목적과 오류 통제 기준을 분리할 수 있다.