p-value와 FDR, 다중검정보정이란? — 왜 RNA-seq 결과는 'adjusted p-value'를 쓸까
BIO GLOSSARY · BIOINFORMATICS 101

TL;DR
• 유전자 2만 개를 한꺼번에 검정하면, 아무 차이가 없어도 우연히 5% (약 1,000개)가 'p < 0.05'로 뜹니다. 이 거짓양성(false positive) 폭증을 막는 게 다중검정보정(multiple testing correction)입니다.
• 두 가지 길 — 본페로니(Bonferroni)는 "거짓양성을 하나도 내지 말자"(엄격), 벤자미니-호크버그(Benjamini-Hochberg, BH)는 "찾아낸 것 중 거짓 비율만 낮추자"(실용). 유전체학은 검정이 수천~수만 개라 보통 BH로 거짓발견율(false discovery rate, FDR)을 통제합니다.
• 그래서 DESeq2·GSEA 결과표의 핵심 열은 raw p-value가 아니라 보정값 —padj·q-value·adjusted p-value. 컷오프는 거기에 거세요(예: padj < 0.05).
🔗 관련 글 · FDR이 실제로 보이는 곳
• DESeq2 차등발현 분석 · Volcano plot 시각화 · clusterProfiler GO·GSEA 농축분석
0. 한 장으로 보는 다중검정 문제

검정을 한 번 하면 'p < 0.05'는 "우연일 확률 5% 이하"라 꽤 믿을 만합니다. 그런데 같은 기준으로 2만 번(유전자 수만큼) 검정하면 이야기가 달라집니다 — 진짜 차이가 하나도 없어도, 순전히 우연으로 약 1,000개가 'p < 0.05'를 통과합니다. 그 1,000개를 그대로 '발견'이라 부르면, 목록의 상당수가 헛것입니다. 이걸 바로잡는 절차가 다중검정보정입니다.
1. 먼저 p-value 복습 — '우연일 확률'
p-value는 "차이가 없다(귀무가설)고 가정했을 때, 지금 본 것만큼 극단적인 결과가 우연히 나올 확률"입니다.
- p = 0.03이면, 차이가 없는데도 이런 결과가 나올 우연이 3%란 뜻.
- 관례적으로 p < 0.05면 "통계적으로 유의하다"고 부릅니다.
여기서 숨은 함정 — p < 0.05라는 기준 자체가 "검정 1번당 거짓양성 5%를 허용한다"는 약속입니다. 검정이 한 번이면 5%는 작지만, 수만 번 반복하면 누적됩니다.
2. 진짜 문제 — '많이 검정하면' 거짓이 쌓인다

RNA-seq는 유전자 하나하나가 별도의 검정입니다. 2만 개면 검정 2만 번.
- 진짜 차이가 0개여도, 각 검정이 5% 확률로 거짓양성을 내니 2만 × 5% ≈ 1,000개가 우연히 유의하게 나옵니다.
- 즉 raw p < 0.05로 거른 목록은 거짓양성으로 오염돼 있습니다.
이 문제를 다루는 두 관점이 있습니다.
① 집안전체 오류율(family-wise error rate, FWER) — "거짓양성을 하나도 내지 말자"
가장 유명한 방법이 본페로니(Bonferroni)입니다. 기준을 검정 수만큼 나눕니다 — 검정이 N개면 p < 0.05 / N일 때만 유의. 2만 개면 p < 0.0000025라는 무지막지하게 엄격한 문턱이 됩니다. 거짓양성은 거의 없지만(보수적), 진짜 차이까지 다 놓칩니다(검정력 손실).
② 거짓발견율(false discovery rate, FDR) — "찾아낸 것 중 거짓 비율만 낮추자"
벤자미니-호크버그(Benjamini-Hochberg, BH) 방법입니다. "하나도 틀리지 말자"가 아니라, '유의하다고 부른 목록 안에서 거짓양성이 차지하는 비율'을 일정 수준(예: 5%) 이하로 통제합니다. 진짜 발견을 훨씬 많이 살리면서 거짓 비율을 관리해(균형), 유전체학의 사실상 표준입니다.
3. BH 절차 — 어떻게 계산하나

벤자미니-호크버그는 의외로 단순합니다(검정 m개, 목표 FDR = α).
- p값을 작은 순서로 정렬합니다 — p₍₁₎ ≤ p₍₂₎ ≤ … ≤ p₍ₘ₎.
- 각 순위 k에 대해 k/m × α라는 임계값을 만듭니다.
- p₍ₖ₎ ≤ k/m × α를 만족하는 가장 큰 k를 찾습니다.
- 그 k번째까지(즉 더 작은 p값 전부)를 유의하다고 선언합니다.
직관적으로 — 순위가 높은(작은) p값일수록 너그럽게, 순위가 낮은 p값일수록 엄격하게 본다는 뜻입니다. 본페로니가 모든 p에 같은 가혹한 잣대(0.05/m)를 들이대는 것과 대비됩니다.
4. 결과표 읽는 법 — padj · q-value · adjusted p-value
BH 보정을 거친 값이 결과표에 이렇게 나옵니다.
padj(DESeq2),adj.P.Val(limma),q-value/FDR(GSEA·clusterProfiler) — 이름은 달라도 거의 다 BH 보정 p값입니다.- 컷오프는 raw p가 아니라 이 보정값에 겁니다. 관례: padj < 0.05 (때로 0.1).
| 구분 | raw p-value | adjusted p (padj·q) |
|---|---|---|
| 의미 | 검정 1개의 우연 확률 | 다중검정 보정 후 값 |
| 컷오프 | 검정 1번일 때만 | 수천 검정에선 이걸로 |
| RNA-seq | 거름용으로 부적절 | 유의 유전자 = padj < 0.05 |
padj가 NA인 행 — 발현이 너무 낮은 유전자를 자동으로 걸러(독립 필터링) 검정 수를 줄여 검정력을 높인 결과입니다. 버그가 아니라 의도된 동작입니다.5. 흔한 오해 3가지
- ① "FDR < 0.05면 각 유전자가 진짜일 확률 95%" — 아닙니다. FDR은 목록 전체에서 거짓양성의 기대 비율입니다. "유의 유전자 200개, FDR 5%"는 "그중 평균 ~10개가 거짓일 것"이란 뜻이지, 개별 유전자의 확률이 아닙니다.
- ② "p값이 작을수록 효과가 크다" — 아닙니다. p값은 효과 크기가 아니라 증거의 강도(표본 수에 좌우)입니다. 효과 크기는 로그 폴드체인지(log2FC) 같은 별도 지표로 봐야 합니다(그래서 볼케이노 플롯이 padj와 폴드체인지를 둘 다 씁니다).
- ③ "수천 검정인데 raw p < 0.05로 걸러도 되겠지" — 안 됩니다. 그게 정확히 거짓양성 1,000개가 섞이는 길입니다. 반드시 보정값으로 거르세요.
6. 핵심 정리 & 다음 학습
- ✅ 많이 검정하면 우연만으로 거짓양성이 쌓인다(2만 검정 → 약 1,000개).
- ✅ FWER (본페로니) = 거짓양성 하나도 금지(엄격) / FDR (BH) = 발견 목록의 거짓 비율 관리(실용).
- ✅ 유전체학 표준은 BH로 FDR 통제 — 결과표의
padj·q-value가 그것. - ✅ 컷오프는 raw p가 아니라 보정값(예: padj < 0.05)에 건다.
- ✅ FDR은 목록의 기대 거짓 비율이지 개별 확률이 아니다.
• (심화) DESeq2로 차등발현 분석 —
padj 열이 어디서 나오는지 직접• (비교) Volcano plot 시각화 — padj와 폴드체인지를 함께 보는 법
• (참고) clusterProfiler 농축분석 — GO·GSEA의 q-value 읽기
References
- Benjamini, Y., Hochberg, Y. (1995). Controlling the False Discovery Rate: A Practical and Powerful Approach to Multiple Testing. J. R. Statist. Soc. B, 57(1), 289–300.
- Storey, J. D., Tibshirani, R. (2003). Statistical significance for genomewide studies (q-value). PNAS, 100(16), 9440–9445.
- Noble, W. S. (2009). How does multiple testing correction work? Nature Biotechnology, 27, 1135–1137.
- Love, M. I., Huber, W., Anders, S. (2014). DESeq2 — 독립 필터링·BH 보정(padj). Genome Biology, 15, 550.
Pipette & Pipeline · A bio portfolio journal
'Bio Glossary > Bioinformatics 101' 카테고리의 다른 글
| GWAS란? — 전장유전체 연관분석·맨해튼 플롯·다유전자 위험점수 (0) | 2026.06.26 |
|---|---|
| RNA-seq 정량 단위 완전 정리 — TPM·RPKM·FPKM·CPM, 무엇을 언제 쓰나 (0) | 2026.06.18 |
| RNA-seq 정규화란? — 읽은 수를 '비교 가능한 값'으로 바꾸는 법 (정량·정규화·DESeq2 완전 정리) (0) | 2026.06.08 |
| 변이 호출(variant calling)이란? — BAM에서 진짜 변이를 가려내 VCF로 (GATK·DeepVariant 완전 정리) (0) | 2026.06.02 |
| 서열 정렬(read alignment)이란? — 수억 개 read를 유전체에 맞추는 법 (BWA·MAPQ·정렬 도구 완전 정리) (0) | 2026.06.02 |