2000차원을 사람 눈으로 보려면
S28에서 세포를 2,000개 HVG로 표현했습니다. 각 세포는 2,000차원 공간의 한 점입니다. 이 공간에서 비슷한 세포는 가까이, 다른 세포는 멀리 모여 구조를 이룹니다. 문제는 사람이 2,000차원을 볼 수 없다는 것입니다. 이 구조를 잃지 않으면서 2차원 지도로 눌러야 합니다.
세 도구 — PCA · t-SNE · UMAP — 는 이 압축을 서로 다르게 합니다. 그리고 각자 무엇을 지키고 무엇을 버리는지가 다릅니다. 이걸 모르면 UMAP에서 두 클러스터 사이 거리를 생물학적 의미로 오독하는 흔한 실수를 저지릅니다. 이 편의 목표는 그 차이를 정확히 잡는 것입니다.
PCA — 분산을 가장 많이 담는 축
주성분 분석은 데이터가 가장 넓게 퍼진 방향(분산 최대 축)을 차례로 찾습니다. 수학적으로는 공분산 행렬의 고유벡터입니다.
고유값 가 큰 순서대로 축(주성분)을 고르면, 소수의 축으로 데이터 분산의 대부분을 담을 수 있습니다. 2,000차원을 보통 상위 50개 PC로 압축합니다.
PCA는 선형입니다. 곧게 뻗은 구조는 잘 담지만, 휘어진 매니폴드(세포 상태가 곡선을 그리며 변하는 경우)는 못 폅니다. 그래서 PCA는 최종 지도가 아니라 잡음 제거 + 차원 예압축 단계로 씁니다. 50 PC에서 세포 간 거리를 재면 2,000차원 원본보다 잡음이 적고 계산이 훨씬 빠릅니다. 이것이 뒤따르는 kNN 그래프·클러스터링·UMAP의 공통 입력이 됩니다.
손으로 감 잡기
세포들이 대략 한 직선을 따라 늘어서 있다면, PC1(첫 고유벡터)이 그 직선 방향을 잡고 대부분의 분산을 흡수합니다. 나머지 축의 고유값은 작아 버려도 됩니다. "분산 = 정보"라는 가정 아래, 큰 고유값 축만 남기는 것이 PCA의 전부입니다.
t-SNE와 UMAP — 지역 이웃을 지킨다
PCA로 50차원까지 왔지만 여전히 못 봅니다. t-SNE와 UMAP은 여기서 등장하는 비선형 방법으로, 공통 철학은 하나입니다. 원 공간에서 가까운 세포는 2D에서도 가깝게 두자.
t-SNE는 원 공간의 이웃 관계를 확률로 표현합니다. 세포 가 를 이웃으로 고를 확률을 가우시안으로 정의하고, 2D에서는 무거운 꼬리의 t-분포로 정의한 뒤, 두 분포의 KL 발산을 최소화합니다. perplexity가 "이웃을 몇 명으로 볼지"를 정하는 핵심 파라미터입니다.
UMAP은 매니폴드 이론에서 출발합니다. 데이터가 저차원 매니폴드 위에 있다고 가정하고, 지역 이웃 구조를 퍼지 그래프로 만든 뒤 그 위상을 보존하는 2D 배치를 찾습니다. t-SNE보다 빠르고, 전역 구조를 상대적으로 더 잘 보존하며, 대규모 세포에 강합니다. 오늘날 scRNA-seq의 기본 지도는 UMAP입니다.
두 방법의 성격 차이를 정리하면 다음과 같습니다.
| 항목 | PCA | t-SNE | UMAP |
|---|---|---|---|
| 선형/비선형 | 선형 | 비선형 | 비선형 |
| 보존 대상 | 전역 분산 | 지역 이웃 | 지역+약한 전역 |
| 속도 | 빠름 | 느림 | 빠름 |
| 용도 | 예압축·잡음제거 | 시각화 | 시각화(표준) |
결정적 주의 — 거리를 믿지 마세요
t-SNE·UMAP의 가장 흔한 오독은 클러스터 사이의 거리를 생물학적 유사도로 읽는 것입니다. 이 방법들은 지역 이웃을 지키느라 전역 거리를 왜곡합니다. UMAP에서 두 클러스터가 멀리 떨어져 보여도, 실제로는 가까운 세포 유형일 수 있습니다. 클러스터 **덩어리(어떤 세포가 함께 모이나)**는 신뢰하되, 덩어리 사이의 간격은 해석하지 맙시다. 이것 하나만 지켜도 논문 리뷰에서 흔한 지적을 피합니다.
Scanpy 실습 (PBMC 3k)
S28의 HVG 행렬에서 이어갑니다.
import scanpy as sc# adata = S28 정규화 + HVG 선택 완료
# (선택) 스케일링 후 PCAsc.pp.scale(adata, max_value=10)sc.tl.pca(adata, n_comps=50, svd_solver="arpack")sc.pl.pca_variance_ratio(adata, n_pcs=50) # elbow로 유효 PC 수 판단
# PCA 위에서 kNN 그래프 → UMAPsc.pp.neighbors(adata, n_neighbors=15, n_pcs=40)sc.tl.umap(adata)sc.pl.umap(adata, color=["CST3", "NKG7", "MS4A1"]) # 마커로 구조 확인pca_variance_ratio의 elbow(꺾이는 지점)에서 유효 PC 수를 정합니다. 보통 30~50 사이입니다. neighbors가 만드는 kNN 그래프가 UMAP뿐 아니라 다음 편 S30의 Leiden 클러스터링에도 그대로 쓰입니다 — 이 그래프가 단일세포 분석의 중추입니다.
원한다면 t-SNE도 비교해봅시다.
sc.tl.tsne(adata, n_pcs=40, perplexity=30)sc.pl.tsne(adata, color="CST3")perplexity를 5, 30, 50으로 바꿔 그려보면 지도 모양이 크게 변합니다. 이 민감성 때문에 재현성 좋은 UMAP이 선호됩니다.
CS 매핑
- 고유값 분해 / SVD: PCA는 공분산 행렬의 고유분해(또는 데이터 행렬의 SVD)입니다. 선형대수의 핵심이자 추천시스템·이미지 압축과 같은 도구입니다.
- 매니폴드 학습: UMAP은 고차원 데이터가 저차원 매니폴드 위에 있다는 가정에서 위상을 보존합니다. Isomap·LLE와 같은 계보입니다.
- kNN 그래프:
neighbors가 만든 근접 이웃 그래프는 그래프 알고리즘(S30 커뮤니티 검출)의 입력입니다. DryBench의 그래프 편과 직결됩니다. - KL 발산: t-SNE의 목적함수는 두 확률분포의 KL 발산 최소화로, 정보이론과 직접 연결됩니다.
자주 만나는 결함
- UMAP 클러스터 간 거리를 생물학적 의미로 해석 — 가장 흔한 오독입니다. 덩어리는 믿되 간격은 해석하지 맙시다.
- PCA를 건너뛰고 원본 2000차원에서 바로 UMAP — 잡음이 많고 느립니다. PCA 예압축이 표준입니다.
- PC 수를 아무렇게나 — 너무 적으면 구조 손실, 너무 많으면 잡음 유입. variance ratio elbow로 정합니다.
- perplexity/n_neighbors 하나만 보고 결론 — 파라미터에 민감합니다. 여러 값으로 안정성을 확인합시다.
더 깊게 파고 싶다면
본문은 BPD가 직접 재구성한 서술입니다. 심화는 아래 정통 자료를 활용합시다.
- 참고 무료 웹북: Single-cell best practices (sc-best-practices.org) — 차원 축소 챕터가 방법별 함정을 상세히 다룹니다.
- 원 논문(UMAP): McInnes, Healy, Melville (2018), UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction, arXiv:1802.03426.
- 원 논문(t-SNE): van der Maaten & Hinton (2008), Visualizing Data using t-SNE, JMLR 9:2579.
- 직관 자료: Understanding UMAP (pair-code.github.io/understanding-umap) — 파라미터가 지도를 어떻게 바꾸는지 인터랙티브로 보여줍니다.
세포들이 2D 지도 위에 구조를 드러냈습니다. 하지만 아직 "이 덩어리가 무슨 세포인지"는 모릅니다. 다음 편 S30에서 kNN 그래프로 Leiden 클러스터링을 돌리고, 각 클러스터의 마커 유전자로 세포 유형에 이름을 붙입니다.