DEV Community

Cover image for Multiple testing 보정 — 메트릭 10개 동시에 보면 거짓 양성을 어떻게 통제하나
HyunSeok Jeong
HyunSeok Jeong

Posted on • Originally published at blog.trysitely.com

Multiple testing 보정 — 메트릭 10개 동시에 보면 거짓 양성을 어떻게 통제하나

A/B 테스트 결과 페이지에 메트릭이 매출·전환·CTR·리텐션·체류시간… 10개 정도 떠 있습니다. 한두 개가 p<0.05p < 0.05 로 표시됩니다. 운영자는 자연스럽게 "통계적으로 유의함"으로 보고합니다. 그게 함정입니다. 효과가 정말 0인 메트릭 10개를 동시에 검정하면 적어도 1개는 우연히 0.05를 깨뜨릴 확률이 약 40%입니다. 메트릭 10개를 보는 행위 자체가 5% 보증을 깨뜨립니다. 이 함정을 푸는 표준 도구 두 가지를 정리합니다.

1. 메트릭 10개 동시 검정의 거짓 양성률

A/B 테스트의 5% 거짓 양성률은 한 메트릭에 한 번만 검정한다는 가정 위에 있습니다. 메트릭 kk 개를 동시에 검정하고 어느 하나라도 p<0.05p < 0.05 면 "유의"로 보고하는 룰을 굴리면, 적어도 한 메트릭이 우연히 0.05를 깨뜨릴 확률은 다음입니다.

Pr(최소 한 메트릭 거짓 양성)=1(1α)k \Pr(\text{최소 한 메트릭 거짓 양성}) = 1 - (1 - \alpha)^k

α=0.05\alpha = 0.05 , k=10k = 10 이면 1 - 0.95^10 ≈ 0.40. 거의 절반입니다. 메트릭 20개면 0.64까지 올라갑니다.

운영적으로 이 함정의 결과는 다음입니다.

  • 효과 없는 안을 효과 있는 것처럼 보고 — 잘못된 캠페인 확장
  • "이번 실험은 분명 유의했는데"가 반복 — 통계 보고에 대한 신뢰 하락
  • 가드레일 메트릭이 깜빡이는 신호로 알람 폭증

이 함정의 정답이 multiple testing correction입니다. 검정의 임계 α\alpha 를 메트릭 수에 맞춰 조정하거나, 거짓 양성의 비율(FDR)을 직접 통제합니다.

Bonferroni vs FDR 보정의 비교 다이어그램
단순한 Bonferroni는 모든 메트릭의 임계를 균등 분할한다. Benjamini-Hochberg(BH)는 p-value 순서 위에서 거짓 발견 비율(FDR)을 직접 통제한다.

📌 이 글에서 다루는 것

이 글은 multiple testing의 두 가지 표준 보정 — Bonferroni(가장 보수적, FWER 통제)와 Benjamini-Hochberg(현대 표준, FDR 통제) — 를 마케터 시각으로 풀어냅니다. A/B 대시보드의 한 칸 코드 변경만으로 보고 정합성을 크게 올릴 수 있는 자리입니다.

2. Bonferroni 보정 — 가장 단순, 가장 보수적

가장 단순한 보정은 Bonferroni입니다. 한 줄 규칙은 다음입니다.

메트릭 kk 개를 동시에 검정하면, 각 메트릭의 임계를 α/k\alpha/k 로 낮춰라.

α=0.05\alpha = 0.05 , k=10k = 10 이면 각 메트릭은 p<0.005p < 0.005 여야 유의로 보고. 매우 보수적입니다. 적어도 하나라도 거짓 양성일 확률(family-wise error rate, FWER)이 5% 이하로 보증됩니다.

장단점이 명확합니다.

  • 장점 — 단순, 어떤 dependency에서도 안전, 손으로 계산 가능
  • 단점 — 너무 보수적, 진짜 효과가 있는 메트릭도 놓칠 수 있음

운영에서 Bonferroni가 잘 맞는 자리는 다음입니다.

  • 메트릭 수가 적을 때(3~5개)
  • 가드레일 메트릭처럼 거짓 양성을 절대 못 받을 자리
  • 통계 검정 자체에 익숙하지 않은 의사결정자에게 보고할 때

3. Benjamini-Hochberg — 현대 표준, FDR 통제

마케팅·유전체학·ML 평가에서 표준이 되어가는 보정은 Benjamini-Hochberg(BH, 1995)입니다. FWER이 아니라 FDR(False Discovery Rate)을 통제합니다.

두 보증의 차이를 한 줄로:

  • FWER — 적어도 한 거짓 양성이 일어날 확률
  • FDR — 양성으로 보고된 메트릭 중 거짓 양성의 비율

마케팅 운영에서 자주 더 가치 있는 보증은 FDR입니다. "거짓 양성 한 개도 절대 안 됨"보다 "보고된 양성의 90%는 진짜다"가 운영적으로 더 의미있는 경우가 많습니다.

3-1. BH의 한 줄 규칙

메트릭 kk 개의 p-value를 작은 순서대로 정렬하고 p(1)p(2)p(k)p_{(1)} \leq p_{(2)} \leq \cdots \leq p_{(k)} , 다음 조건을 만족하는 가장 큰 ii 까지를 양성으로 보고합니다.

p(i)ikα p_{(i)} \leq \frac{i}{k} \cdot \alpha

α=0.10\alpha = 0.10 (FDR 10%), k=10k = 10 이면:

  • p(1)0.01p_{(1)} \leq 0.01 이어야 첫 양성 보고
  • p(2)0.02p_{(2)} \leq 0.02 이어야 두 번째까지 보고
  • p(10)0.10p_{(10)} \leq 0.10 이어야 모두 양성

이 절차는 Bonferroni보다 더 많은 양성을 보고하면서도 FDR을 α\alpha 이하로 보증합니다. 검출력 손실이 훨씬 적습니다.

3-2. 마케터가 보는 결과

메트릭 p-value Bonferroni 보고 (α=0.05) BH 보고 (FDR α=0.10)
매출 0.002 유의 (≤ 0.005) 유의 (≤ 0.010)
전환율 0.012 비유의 유의 (≤ 0.020)
객단가 0.025 비유의 유의 (≤ 0.030)
CTR 0.044 비유의 유의 (≤ 0.040)
리텐션 0.080 비유의 비유의 (≥ 0.050)

같은 데이터에서 BH가 4개를 양성으로 보고하고 Bonferroni는 1개만 보고합니다. FDR 10% 보증 안에서.

from statsmodels.stats.multitest import multipletests

p_values = [0.002, 0.012, 0.025, 0.044, 0.080, 0.150, 0.230, 0.380, 0.500, 0.700]
reject, p_adj, _, _ = multipletests(p_values, alpha=0.10, method='fdr_bh')
print(list(zip(p_values, p_adj, reject)))
Enter fullscreen mode Exit fullscreen mode

이게 본문의 유일한 코드입니다. statsmodels 한 줄로 BH 보정이 끝납니다. 실험 대시보드에 이 한 줄을 추가하면 메트릭 10개 보고의 정합성이 통째로 올라갑니다.

💡 A/B 대시보드에 BH 보정 한 칸 추가

실험 플랫폼이 디폴트로 BH 보정을 안 깔고 있는 경우가 흔합니다. 대시보드 코드 한 칸만 수정해 p-adjusted 컬럼을 추가하면 메트릭 다수 보고의 거짓 양성이 통계적으로 통제됩니다. 운영자가 매번 "5%·10%·20%?"를 의식할 필요 없이 보정된 결과만 보면 됩니다.

4. 메트릭을 어떻게 묶을 것인가

multiple testing 보정의 한 가지 더 어려운 자리는 "어디까지를 한 family로 보고 보정할 것인가"입니다.

운영적으로 묶음이 너무 좁으면 보정이 약해 거짓 양성이 들어오고, 너무 넓으면 보정이 강해 진짜 효과를 놓칩니다.

자주 쓰이는 묶음 규칙은 다음입니다.

  • 메트릭 family 단위 — 핵심 매출 메트릭 묶음 / 가드레일 메트릭 묶음을 따로
  • 실험 단위 — 한 실험의 모든 메트릭을 한 family로
  • 의사결정 단위 — "이 안을 확장할까"의 결정에 쓰이는 메트릭만 묶음

가장 흔한 운영 패턴은 다음입니다.

  • 핵심 매출 메트릭 1~2개 — Bonferroni (보수적)
  • 보조 메트릭 5~10개 — BH (FDR 10%)
  • 가드레일 메트릭 3~5개 — Bonferroni (보수적)

세 묶음을 따로 보정하면 의사결정의 단순함을 유지하면서 통계적 정합성을 확보할 수 있습니다.

5. 마케팅 실무 케이스 3개

5-1. A/B 결과의 메트릭 다수 보고

핵심 매출은 효과 없는데 보조 메트릭(객단가·체류시간)이 두 개 유의하게 나왔습니다. BH 보정 없이 보고하면 "유의한 변화가 있었음"으로 들리지만, 실제로는 메트릭 10개 동시 검정의 거짓 양성일 가능성이 큽니다. BH 보정 후에도 두 개가 모두 유의하면 진짜 신호일 가능성이 높습니다.

5-2. 채널·세그먼트별 메트릭 비교

같은 캠페인을 채널 5개·세그먼트 3개로 분해해 메트릭 1개씩 비교하면 15번의 검정이 됩니다. 보정 없이 "Meta·신규 유저에서만 효과"로 보고하면 거짓 양성 가능성이 50%를 넘습니다. BH 보정 후 같은 결론이 유지되어야 신뢰할 수 있습니다.

{/* TODO_HUNY: huny가 운영 중인 A/B·캠페인 보고서에서 multiple testing 보정 없이 보고된 자리 한 가지 추가해주세요. 채널·세그먼트·메트릭별로 잘게 쪼개진 보고에서 어디가 가장 위험했는지. */}

5-3. 가드레일 알람의 임계 설정

가드레일 메트릭 5개를 매주 모니터링하면서 어느 하나라도 깜빡이면 알람을 보내는 운영. 보정 없이는 매주 한두 번 거짓 알람이 일어납니다. Bonferroni로 임계를 0.01로 낮추거나, BH로 FDR을 통제하면 알람의 신뢰성이 살아납니다.

6. 보정이 깨질 때 — 흔한 함정 3가지

6-1. p-value들이 강하게 상관

BH의 보증은 p-value들이 독립이거나 약한 양의 상관일 때 가장 깨끗합니다. 강한 상관(예: 매출과 매출/유저)이 있으면 보증이 다소 약해집니다. 이 경우 BH-Yekutieli 변형을 쓰는 게 안전합니다(가장 보수적).

6-2. 같은 family를 두 번 보정

실험 플랫폼이 메트릭 단위 보정을 이미 했는데 운영자가 또 보정하면 이중 보정이 됩니다. 너무 보수적이 되어 진짜 효과를 놓칩니다. 보고서를 받을 때 "이 p-value는 보정 전인가 후인가"를 첫 질문으로 두세요.

6-3. 임계 α\alpha 의 의미를 의사결정자와 공유 안 함

FDR 10%는 "양성 보고 중 평균 10%가 거짓"을 의미합니다. 의사결정자가 이 의미를 모르면 BH 결과를 그대로 절대 보증으로 받아들일 위험이 있습니다. 보고서 한 줄에 "FDR 10% 보정"을 적고, 그 의미를 한 번 공유하는 게 표준입니다.

⚠️ 피킹과 multiple testing은 다른 함정

매일 들여다보는 peeking 함정은 Sequential testing 글에서 다뤘고, 메트릭 다수 검정의 multiple testing 함정은 이 글에서 다룹니다. 두 함정은 다른 도구로 풉니다 — peeking은 always-valid, multiple testing은 BH·Bonferroni. 둘이 동시에 일어날 수도 있으므로(매일 메트릭 10개를 본다) 둘 다 보정하는 운영이 가장 안전합니다.

7. 마치며 — 운영에 가장 단순한 한 줄 패치

multiple testing 보정은 통계적으로 깊은 자리지만, 운영 패치는 매우 단순합니다.

A/B 대시보드에 p-adjusted 컬럼 한 칸을 추가하라.

statsmodels 한 줄, 또는 R의 p.adjust(method='BH') 한 줄이면 됩니다. 이 단순한 패치로 메트릭 다수 보고의 거짓 양성이 통계적으로 통제됩니다. 운영자가 메트릭을 더 안심하고 보고, 의사결정자가 보고서를 더 신뢰합니다.

다음 글에서는 또 다른 마케팅 데이터 자리, cold start 문제를 다룹니다. 신규 유저·신규 상품·신규 캠페인의 정보가 없는 상태에서 어떻게 의사결정하느냐의 문제입니다.

참고

Top comments (0)