RNA-seq 정량 단위 완전 정리 — TPM·RPKM·FPKM·CPM, 무엇을 언제 쓰나

BIO GLOSSARY · BIOINFORMATICS 101

RNA-seq 정량 단위 완전 정리 — TPM·RPKM·FPKM·CPM, 무엇을 언제 쓰나

TL;DR
• 유전자마다 read를 센 날 카운트⁠(raw count)는 그대로 비교하면 안 됩니다. 샘플마다 시퀀싱 깊이⁠(sequencing depth)가 다르고, 유전자마다 길이⁠(length)가 달라 긴 유전자가 더 많이 읽히기 때문입니다. 이 두 편향을 어떻게 보정하느냐가 정량 단위를 가릅니다.
CPM (counts per million)은 깊이만, RPKM/FPKM (reads/fragments per kilobase per million)은 깊이+길이, TPM (transcripts per million)은 길이를 먼저 보정한 뒤 합을 100만 (10⁶)으로 맞춥니다. 그래서 TPM은 샘플 안에서 합이 항상 100만이라 조성 비교에 더 안정적이고, 같은 이유로 RPKM보다 TPM이 권장됩니다.
• 한 줄 요약 — 한 샘플 안에서 유전자끼리 비교하면 TPM, 조건 간 차등발현⁠(DE)이면 raw count + DESeq2·edgeR의 내부 정규화입니다. TPM·RPKM을 DE 도구에 직접 넣지 마세요.
🔗 관련 글 · 한 단계 위에서 보기
RNA-seq 정규화란?  ·  DESeq2로 차등발현 분석  ·  edgeR 차등발현 분석

1. 한 줄 정의 — 정량 단위는 '비교 가능하게' 만드는 환산기

RNA-seq 정량 단위⁠(CPM·RPKM·FPKM·TPM)는 유전자별 날 카운트를, 샘플과 유전자를 가로질러 비교할 수 있는 값으로 바꾸는 환산 공식입니다. 정규화 편⁠(BG-032)이 "왜 보정이 필요한가"를 다뤘다면, 이번 글은 그 '단위' 자체를 한 칸씩 뜯어봅니다 — 각 단위가 무엇을 어떤 순서로 나누는지, 합이 왜 달라지거나 같아지는지, 그리고 어떤 질문에 어떤 단위를 써야 하는지.

이게 중요한 이유는 단순합니다. 잘못된 단위로 비교하면, 생물학적 차이가 아니라 깊이·길이라는 기술적 잡음을 비교하게 됩니다. 히트맵의 색, 막대그래프의 높이, "이 유전자가 2배 높다"는 문장 — 전부 단위 선택에 좌우됩니다.

2. 왜 날 카운트는 비교 불가인가 — 깊이와 길이

날 카운트에는 생물학적 발현량이 아닌 두 가지 기술적 편향이 섞여 있습니다.

  • ① 시퀀싱 깊이⁠(라이브러리 크기, library size) — 더 깊게 읽은 샘플은 모든 유전자에서 read가 많습니다. 샘플 A를 2배 깊게 시퀀싱하면, 발현이 똑같아도 카운트가 약 2배로 뜹니다. 그러니 샘플끼리⁠(between-sample) 비교하려면 깊이를 맞춰야 합니다.
  • ② 유전자 길이⁠(length) — 전장을 읽는 프로토콜에서는 긴 전사체일수록 잘려 나온 read가 더 많이 잡힙니다. 길이가 2배인 유전자는, 전사체 개수가 같아도 read가 약 2배입니다. 그러니 한 샘플 안에서 서로 다른 유전자⁠(within-sample)를 비교하려면 길이를 맞춰야 합니다.

핵심은 '무엇을 비교하느냐'에 따라 필요한 보정이 다르다는 점입니다 — 이게 단위 선택의 전부입니다. 아래에서 각 단위가 이 두 보정 중 무엇을, 어떤 순서로 적용하는지 봅니다⁠(기호 정의: C = 유전자 read 수, N = 총 매핑 read 수, L = 유전자 길이).

3. CPM — 깊이만 보정

가장 단순한 보정이 CPM (counts per million, 백만당 카운트)입니다. 총 read로 나눠 깊이만 맞춥니다.

CPM = (C / N) × 10⁶

유전자 카운트를 그 샘플의 총 매핑 read 수로 나누고 100만 (10⁶)을 곱한 값입니다. 직관적으로는 "이 샘플 read 100만 개 중 이 유전자에서 몇 개가 나왔나"입니다.

  • 장점 — 깊이를 맞추므로 같은 유전자를 샘플 간에 비교할 때 적절합니다.
  • 한계길이를 보정하지 않습니다. 그래서 한 샘플 안에서 길이가 다른 유전자끼리⁠(예: 유전자 A vs B) 비교하는 데는 부족합니다.

CPM은 특히 edgeR·limma의 입력·필터링 기준으로 자주 쓰입니다 — 예를 들어 "CPM > 1인 샘플이 n개 이상인 유전자만 남긴다"는 식의 저발현 필터에 등장합니다. 단, CPM 값 자체를 차등발현 검정에 넣는 게 아니라(그건 raw count), 어디까지나 필터·시각화·간단 비교용입니다.

4. RPKM과 FPKM — 깊이와 길이를 모두 보정

CPM에서 한 걸음 더 나아가 길이까지 나눈RPKM (Mortazavi 외 2008)과 FPKM (Trapnell 외 2010)입니다.

RPKM = (10⁹ × C) / (N × L) — 즉 CPM ÷ 길이⁠(kb)

여기서 L은 bp 단위 길이, 10⁹ = 10⁶ (깊이) × 10³ (kb 환산)입니다. 풀어 보면 깊이로 한 번, 길이⁠(kb)로 한 번 나눈 것과 같습니다.

  • RPKM (reads per kilobase per million) — read를 셉니다⁠(단일말단, single-end 시절 표기).
  • FPKM (fragments per kilobase per million) — fragment를 셉니다. 양말단⁠(paired-end)에서는 한 cDNA fragment가 양쪽 끝 read 2개로 잡히는데, 이를 이중으로 세지 않으려고 fragment 단위로 환산한 것뿐입니다. 아이디어는 RPKM과 같습니다.

정리하면 RPKM ≈ FPKM (read냐 fragment냐의 차이)이고, 둘 다 깊이+길이를 보정합니다. 그런데 이 둘에는 약점이 하나 있습니다 — 샘플마다 값의 총합이 달라진다는 것. 다음 단위가 바로 그 문제를 고칩니다.

5. TPM — 길이 먼저, 그다음 정규화 (왜 권장되나)

TPM (transcripts per million)은 RPKM과 같은 두 보정⁠(깊이·길이)을 하되, 나누는 순서를 뒤집습니다. 이 순서 차이가 결과를 가릅니다.

  1. 먼저 길이로 나눕니다 → RPK = C / L (kb) (reads per kilobase)
  2. 그다음 그 샘플의 모든 RPK의 합으로 나누고 10⁶을 곱합니다 → TPM
TPM = (RPK / ΣRPK) × 10⁶,  여기서 RPK = C / L (kb)

RPKM이 '깊이 먼저 → 길이 나중'이라면, TPM은 '길이 먼저 → 정규화⁠(합으로 나눔) 나중'입니다. 효과가 결정적입니다 — 모든 샘플에서 TPM의 합이 항상 10⁶로 같아집니다. 각 값이 "이 샘플의 전사체 100만 개 중 이 유전자가 몇 개"라는 비율⁠(조성, composition)이 되는 것이죠.

왜 TPM이 RPKM보다 권장되나 (Wagner 외 2012). RPKM은 샘플마다 합이 제각각이라⁠(아래 7절 예시에서 직접 확인), "이 유전자가 전체에서 차지하는 몫"이라는 해석이 샘플 간에 일관되지 않습니다. 반면 TPM은 합이 고정돼 있어 샘플 간 조성 비교의 기준선이 흔들리지 않습니다. 그래서 오늘날 샘플 내·샘플 간 상대 발현을 볼 때 RPKM/FPKM보다 TPM이 표준으로 자리 잡았습니다. Salmon·kallisto 같은 정량 도구가 기본으로 TPM을 내놓는 이유이기도 합니다⁠(tximport로 정량 불러오기 참고).

💡 한 가지 주의 — "TPM이 샘플 간 비교에 낫다"도 상대적 우위일 뿐입니다. 샘플 간 총 RNA 양이나 조성이 크게 다르면 TPM조차 안전하지 않습니다 (Zhao 외 2020). 엄밀한 조건 간 정량·차등발현은 결국 다음 단위가 아니라 raw count + DESeq2입니다⁠(8절).

6. 손으로 한 번 — 3유전자 × 2샘플 계산

말로만 보면 헷갈리니 작은 예시로 직접 계산해 봅니다. 유전자 3개⁠(A·B·C), 샘플 2개⁠(S1·S2), 두 샘플 모두 총 매핑 read N = 1,000개라고 하겠습니다⁠(실제 데이터는 유전자가 2만 개라 값이 훨씬 작지만, 비율과 합의 성질은 그대로입니다).

유전자길이 LS1 카운트S2 카운트
A2 kb400200
B0.5 kb100400
C1 kb500400
1,0001,000

S1을 계산하면 (N = 1,000):

  • CPM = (C / 1,000) × 10⁶ → A = 400,000 · B = 100,000 · C = 500,000 → 합 = 1,000,000
  • RPK = C / L (kb) → A = 400/2 = 200 · B = 100/0.5 = 200 · C = 500/1 = 500 → ΣRPK = 900
  • RPKM = CPM / L (kb) → A = 200,000 · B = 200,000 · C = 500,000 → 합 = 900,000
  • TPM = (RPK / 900) × 10⁶ → A ≈ 222,222 · B ≈ 222,222 · C ≈ 555,556 → 합 = 1,000,000

여기서 눈여겨볼 점 — 유전자 A와 B는 raw 카운트가 4배 차이⁠(400 vs 100)인데 TPM은 똑같습니다⁠(둘 다 ≈ 22.2%). A가 4배 길어서, 길이로 나누면 전사체 개수는 같아지기 때문입니다. 길이 보정이 하는 일이 바로 이것입니다.

S2도 같은 방식으로 계산하면 ΣRPK = 100 + 800 + 400 = 1,300이 나옵니다. 그래서 S2의 RPKM 합 = 1,300,000으로 S1의 900,000과 다릅니다. 반면 TPM 합은 두 샘플 모두 정확히 1,000,000입니다. RPKM의 약점과 TPM의 강점이 숫자로 드러나는 대목입니다.

7. 흔한 오해 — TPM 합은 100만, RPKM 합은 들쭉날쭉

항목CPMRPKM / FPKMTPM
깊이 보정
길이 보정
계산 순서깊이만깊이 → 길이길이 → 정규화
샘플 내 합10⁶ (고정)샘플마다 다름항상 10⁶ (고정)
read vs fragmentreadRPKM=read · FPKM=fragmentRPK 기반
주 용도edgeR/limma 필터·입력(구) 샘플 내 비교샘플 내·간 상대 발현

여기서 가장 자주 틀리는 두 가지 —

  • ❌ "RPKM도 합이 일정하니 비율이다" — 아닙니다. 6절에서 봤듯 RPKM 합은 샘플마다 달라집니다⁠(S1 = 900,000 vs S2 = 1,300,000). 합이 고정된 건 CPM과 TPM뿐입니다.
  • ❌ "TPM과 RPKM은 사실상 같다" — 보정하는 양⁠(깊이·길이)은 같지만 순서가 달라 샘플 간 해석이 갈립니다. TPM만 "조성 비율"로 일관되게 읽힙니다.

8. 언제 무엇을 쓰나 — DE는 왜 raw count인가

이제 실전 결정입니다. 질문이 단위를 정합니다.

질문 / 상황무엇을 보정?권장 단위
한 샘플 안에서 "유전자 A가 B보다 높나?"유전자 길이TPM (또는 FPKM)
샘플 간 "이 유전자 상대 발현이 어떻게 변하나?"깊이+길이⁠(조성)TPM
시각화(히트맵·z-score 전, 클러스터링)분산 안정화TPM 또는 log₂(x+1)
조건 간 차등발현⁠(DE)깊이+조성raw count + DESeq2·edgeR
QC·샘플 군집 보기⁠(PCA)분산 안정화VST·rlog (또는 log-TPM)

가장 중요한 줄은 마지막 두 번째입니다 — 차등발현 분석에는 TPM·RPKM이 아니라 날 정수 카운트⁠(raw count)를 넣어야 합니다. 학생이 가장 많이 틀리는 지점이라 이유를 분명히 해 둡니다.

  • DE 도구는 카운트를 음이항분포⁠(negative binomial)로 모델링하고, 내부에서 자체 정규화를 합니다 — DESeq2는 median-of-ratios (크기 인자), edgeR는 TMM. TPM·FPKM처럼 미리 정규화한 값을 넣으면 더 이상 정수가 아니고, 모델이 가정하는 평균–분산 관계가 깨져 통계가 무너집니다.
  • 게다가 median-of-ratios·TMM은 단순 깊이뿐 아니라 조성 편향⁠(composition bias)까지 잡습니다 — 소수의 초고발현 유전자가 read를 독식하면 나머지가 상대적으로 적게 잡히는데, 이건 TPM·CPM의 단순 총합 스케일링으로는 보정되지 않습니다.
  • 길이 보정이 DE에 불필요한 이유 — 같은 유전자를 두 조건에서 비교하면 길이가 양쪽에 똑같이 들어가 상쇄됩니다. 그래서 edgeR의 TMM·DESeq2의 크기 인자는 길이를 건드리지 않습니다⁠(길이는 샘플 내 유전자 간 비교에서만 문제).
⚠️ 한 줄 정리 — ❌ "TPM으로 정규화한 뒤 DESeq2에 넣는다"(모델이 깨짐) · ❌ "edgeR TMM이 길이까지 보정한다"(아니다, 깊이+조성만). DE는 raw count 그대로 넣고, 정규화는 도구에 맡긴다.

참고로 DESeq2의 VST·rlog는 또 다른 변환입니다 — 저⁠(低)카운트에서 분산이 평균에 끌려가는 문제를 완화하는 분산 안정화⁠(variance-stabilizing) 변환으로, 히트맵·PCA 같은 시각화·탐색용입니다⁠(DE 검정 자체는 raw count 모델 그대로 씁니다).

9. 핵심 정리 & 다음 학습

  • ✅ 날 카운트는 깊이·길이 편향 때문에 그대로 비교 불가 — 어떤 보정을 하느냐가 단위를 가른다.
  • CPM = 깊이만 · RPKM/FPKM = 깊이+길이⁠(read vs fragment) · TPM = 길이 먼저 → 정규화 나중.
  • TPM 합은 항상 10⁶ (조성 비율) → RPKM (합이 들쭉날쭉)보다 샘플 간 비교에 권장 (Wagner 외 2012).
  • 질문이 단위를 정한다 — 샘플 내·간 상대 발현 = TPM, 시각화 = TPM/log 또는 VST.
  • ⚠️ DE엔 raw count — DESeq2 (median-of-ratios)·edgeR (TMM)가 깊이+조성을 내부 보정. TPM·RPKM을 DE에 직접 넣지 말 것.
🎓 다음 학습
(개념) RNA-seq 정규화란? — 단위가 풀려 나온 한 단계 위 개념
(실전) DESeq2로 차등발현 분석 · edgeR 차등발현 분석 — raw count를 넣어 DE를 돌리는 실전
(실전) tximport로 정량 불러오기 — Salmon·kallisto의 TPM·카운트를 R로

References

  1. Mortazavi, A., et al. (2008). Mapping and quantifying mammalian transcriptomes by RNA-Seq (RPKM). Nature Methods, 5(7), 621–628.
  2. Trapnell, C., et al. (2010). Transcript assembly and quantification by RNA-Seq (FPKM/Cufflinks). Nature Biotechnology, 28(5), 511–515.
  3. Li, B., et al. (2010). RNA-Seq gene expression estimation with read mapping uncertainty (TPM 정의). Bioinformatics, 26(4), 493–500.
  4. Wagner, G. P., Kin, K., & Lynch, V. J. (2012). Measurement of mRNA abundance using RNA-seq data: RPKM measure is inconsistent among samples (TPM). Theory in Biosciences, 131(4), 281–285.
  5. Conesa, A., et al. (2016). A survey of best practices for RNA-seq data analysis. Genome Biology, 17, 13.
  6. Love, M. I., Huber, W., & Anders, S. (2014). Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biology, 15(12), 550.
  7. Robinson, M. D., & Oshlack, A. (2010). A scaling normalization method for differential expression analysis of RNA-seq data (TMM). Genome Biology, 11(3), R25.
  8. Zhao, S., Ye, Z., & Stanton, R. (2020). Misuse of RPKM or TPM normalization when comparing across samples and sequencing protocols. RNA, 26(8), 903–909.

Pipette & Pipeline · A bio portfolio journal

이 글을 쓴 사람 Yumingming

생명융합공학과 박사과정.
Microbiome · Cosmetics · RNA Therapeutics · Bioinformatics를 공부하며,
실험(Wet Lab)과 데이터(Dry Lab)를 잇는 글을 논문(article) 기반으로 씁니다.

About · 더 알아보기 →

⚕️ 이 글은 학습·정보 제공 목적이며, 의학적 진단·치료·조언을 대체하지 않습니다. 건강·질병·치료에 관한 결정은 반드시 의사 등 전문가와 상의하세요. 자세한 내용은 면책조항을 참고해 주세요.