BioPlayground

🧬
목록으로

단일세포 QC: 죽어가는 세포와 두 겹 세포를 걸러내는 통계적 기준

scRNA-seq에서 죽어가는 세포와 두 겹 세포를 어떻게 통계적으로 걸러내나. 미토콘드리아 %, MAD 기반 강건 임계, Scrublet doublet 검출을 PBMC 3k로 직접 실습합니다.

중급
|
18
|
검증 완료 (2026-07-24)
single cell QCdoublet detectionmitochondrial fractionScanpy
진행률0/64 (0%)

로드한 세포가 다 진짜 세포는 아닙니다

S26에서 우리는 PBMC 3k를 열어 2,700개 세포 × 32,738개 유전자 행렬을 손에 넣었습니다. 그런데 이 "2,700개 세포" 중 상당수는 진짜 세포가 아닙니다. 미세유체 방울(GEM) 안에서 벌어지는 일은 이상적이지 않기 때문입니다.

  • 빈 방울(empty droplet): 세포 없이 주변 RNA(ambient)만 들어감 → 유전자 수가 극히 적음
  • 죽어가는 세포: 세포막이 터져 세포질 mRNA는 새어 나가고 미토콘드리아 mRNA만 남음 → 미토콘드리아 비율이 비정상적으로 높음
  • 두 겹 세포(doublet): 한 방울에 세포 두 개 → 유전자 수·카운트가 비정상적으로 많고, 서로 다른 세포 유형의 마커가 섞임

이 쓰레기를 걸러내지 않으면 이후 모든 분석이 오염됩니다. Garbage in, garbage out. 이 편은 그 필터의 통계적 근거를 다룹니다.

세 가지 QC 지표

세포마다 세 숫자를 계산합니다.

  1. n_genes_by_counts — 그 세포에서 검출된 유전자 종류 수
  2. total_counts — 그 세포의 총 UMI 수
  3. pct_counts_mt — 총 카운트 중 미토콘드리아 유전자(사람은 MT- 접두)의 비율

핵심 직관: 너무 낮은 유전자 수 = 빈 방울/저품질, 너무 높은 유전자 수·카운트 = doublet 의심, 높은 미토콘드리아 비율 = 죽어가는 세포. 각 지표의 양극단을 잘라내는 것이 QC의 뼈대입니다.

임계값을 어떻게 정하나 — 고정 숫자의 함정

초보가 흔히 하는 실수는 "미토 20% 이상 제거"처럼 고정 숫자를 어디서나 쓰는 것입니다. 조직마다 정상 미토 비율이 다릅니다. 심근·간세포는 대사가 활발해 미토 비율이 원래 높습니다. 고정 임계는 멀쩡한 세포를 학살합니다.

더 나은 방법은 데이터 기반 강건 임계입니다. 중앙값에서 얼마나 벗어났는지를 MAD(Median Absolute Deviation)로 재고, 예컨대 5 MAD를 넘는 세포를 이상치로 봅니다.

MAD=median(ximedian(x)),이상치:ximedian(x)>nmadMAD\text{MAD} = \text{median}(|x_i - \text{median}(x)|), \qquad \text{이상치}: |x_i - \text{median}(x)| > n_{\text{mad}} \cdot \text{MAD}

평균·표준편차 대신 중앙값·MAD를 쓰는 이유는 강건성입니다. 이상치 자체가 평균과 표준편차를 오염시켜 임계를 망치는 것을 막습니다. 이건 통계·CS의 robust statistics 그대로입니다.

손으로 MAD 감 잡기

미토 비율이 [3, 4, 4, 5, 5, 6, 40] (%) 인 세포 7개가 있다고 합시다. 중앙값 = 5. 편차 절댓값 = [2,1,1,0,0,1,35], 그 중앙값 MAD = 1. 임계 5 MAD = 중앙값 + 5×1 = 10%. 마지막 세포(40%)는 임계를 크게 초과 → 죽어가는 세포로 제거됩니다. 평균(9.6)·표준편차(약 12.9)로 잡으면 임계가 74%까지 벌어져 그 세포를 못 거릅니다. MAD의 강건함이 이 차이를 만듭니다.

Doublet — 시뮬레이션으로 잡는다

doublet은 단일 지표로는 안 잡힙니다. 유전자 수가 많다고 다 doublet은 아니니까요. Scrublet의 아이디어가 영리합니다.

  1. 실제 세포 둘을 무작위로 골라 그 발현을 합쳐 가짜 doublet을 대량 시뮬레이션합니다.
  2. 진짜 세포 + 시뮬레이션 doublet을 함께 발현 공간에 임베딩합니다.
  3. 각 실제 세포 주변의 k-최근접 이웃 중 시뮬레이션 doublet 비율이 높으면, 그 세포는 doublet일 확률이 높다고 점수(doublet score)를 매깁니다.

즉 "네 이웃이 대부분 인공 doublet이라면, 너도 doublet일 것"이라는 kNN 기반 추론입니다. DoubletFinder도 같은 골격입니다.

Scanpy로 PBMC 3k QC 실습

Kaggle T4에서 실행합니다.

python
!pip install scanpy scrublet -q
import scanpy as sc
adata = sc.datasets.pbmc3k()
# 미토콘드리아 유전자 표시 + QC 지표 계산
adata.var["mt"] = adata.var_names.str.startswith("MT-")
sc.pp.calculate_qc_metrics(adata, qc_vars=["mt"], inplace=True)
# 분포 먼저 눈으로 (자르기 전 반드시)
sc.pl.violin(adata, ["n_genes_by_counts", "total_counts", "pct_counts_mt"],
jitter=0.4, multi_panel=True)

바이올린 플롯을 먼저 보는 것이 철칙입니다. 분포를 안 보고 자르면 조직 특성을 놓칩니다.

python
import numpy as np
# MAD 기반 강건 임계 (예: 미토, 5 MAD 상한)
def mad_outlier(x, nmads=5):
med = np.median(x); mad = np.median(np.abs(x - med))
return (x > med + nmads*mad) | (x < med - nmads*mad)
adata = adata[~mad_outlier(adata.obs["pct_counts_mt"].values)].copy()
adata = adata[adata.obs["n_genes_by_counts"] > 200].copy() # 빈 방울 하한
# Doublet 검출
sc.pp.scrublet(adata) # obs['predicted_doublet'], obs['doublet_score']
adata = adata[~adata.obs["predicted_doublet"]].copy()
print(adata) # 남은 세포 수 확인

QC 전후 세포 수를 반드시 기록합시다. 2,700개에서 얼마가 빠졌는지가 데이터 품질의 첫 지표이고, 논문 methods에 그대로 들어갑니다.

CS 매핑

  • 이상치 탐지(outlier detection): QC는 본질적으로 다변량 이상치 제거입니다. DryBench의 이상치·강건 통계 편과 직결됩니다.
  • MAD 기반 강건 임계: 이상치에 오염되지 않는 중앙값·MAD 사용은 robust statistics의 핵심입니다.
  • kNN 시뮬레이션(Scrublet): 인공 샘플을 만들어 이웃 구성으로 판정하는 것은 준지도·근접 이웃 분류의 응용입니다.
  • 정보 손실 트레이드오프: 임계를 조이면 doublet은 줄지만 진짜 세포도 잃습니다. precision-recall 절충 그 자체입니다.

자주 만나는 결함

  • 고정 미토 임계(예: 20%)를 모든 조직에 적용 — 대사 활발한 조직의 정상 세포를 학살합니다. 분포를 보고 MAD로 정합시다.
  • 분포 확인 없이 바로 필터 — 바이오모달 분포(두 봉우리)를 놓치면 한 세포 유형을 통째로 날릴 수 있습니다.
  • QC를 정규화 이후에 수행 — QC는 raw count에서 먼저 해야 합니다. 정규화가 이상치를 가려버립니다.
  • doublet 미제거로 "새로운 세포 유형" 발견 — 두 유형이 섞인 doublet을 신종 세포로 오해하는 것은 scRNA-seq 논문의 고전적 오류입니다.

더 깊게 파고 싶다면

본문은 BPD가 직접 재구성한 서술입니다. 심화는 아래 정통 자료를 활용합시다.

  • 참고 무료 웹북: Single-cell best practices (sc-best-practices.org, Theis 랩). QC·doublet 챕터가 현행 표준의 결정판입니다.
  • 원 논문(best practices): Luecken & Theis (2019), Current best practices in single-cell RNA-seq analysis: a tutorial, Molecular Systems Biology 15:e8746.
  • 원 논문(Scrublet): Wolock, Lopez, Klein (2019), Scrublet: Computational Identification of Cell Doublets in Single-Cell Transcriptomic Data, Cell Systems 8:281.
  • Wellcome Sanger — 정보학팀의 Quality Control in scRNA-seq 워크숍 (자막 자동번역 보통). 임계 설정의 실무 감각을 줍니다.

세포를 깨끗이 걸렀으니, 다음 편 S28에서 남은 세포의 발현을 정규화하고 신호가 되는 유전자(HVG)만 골라내는 단계로 넘어갑니다. 여기서부터 진짜 생물학적 구조가 드러나기 시작합니다.