UMAP vs t-SNE 완벽 비교: 고차원 데이터 시각화 실전 가이드 (Python 코드 포함)

Updated Feb 13, 2026

들어가며: 왜 차원 축소가 필요한가?

현실 세계의 데이터는 수백, 수천 개의 feature를 갖는 경우가 흔합니다. 이미지 데이터는 픽셀 수만큼, 유전체 데이터는 수만 개의 유전자 발현값을 갖죠. 이런 고차원 데이터를 사람이 이해할 수 있는 2D·3D로 압축하는 것이 차원 축소(Dimensionality Reduction)의 핵심입니다.

그중에서도 t-SNEUMAP은 비선형 차원 축소의 양대 산맥입니다. 이 글에서는 두 알고리즘의 원리, 성능, 실무 활용법을 코드와 함께 비교합니다.

핵심 질문: “내 데이터에는 t-SNE와 UMAP 중 어떤 것이 더 적합할까?”

t-SNE란?

t-SNE(t-distributed Stochastic Neighbor Embedding)는 2008년 Laurens van der Maaten이 제안한 알고리즘입니다.

작동 원리

  1. 고차원 공간에서 각 데이터 포인트 간 조건부 확률(가우시안 분포)을 계산
  2. 저차원 공간에서 t-분포 기반 확률을 계산
  3. 두 확률 분포 간 KL divergence를 최소화하도록 반복 최적화

t-분포를 사용하는 이유는 저차원에서 발생하는 crowding problem을 완화하기 위해서입니다. 가우시안보다 꼬리가 두꺼운 t-분포 덕분에 멀리 있는 점들이 더 잘 분리됩니다.

주요 하이퍼파라미터

  • perplexity (5~50): 이웃 수의 유효 크기. 데이터 크기에 따라 조절
  • learning_rate (10~1000): 너무 작으면 수렴 실패, 너무 크면 발산
  • n_iter (≥1000): 충분한 반복 횟수가 필요
Enjoying this article? Get more like it delivered to your inbox. Subscribe to the newsletter

UMAP이란?

UMAP(Uniform Manifold Approximation and Projection)은 2018년 Leland McInnes가 제안했으며, 리만 기하학과 대수적 위상수학에 기반합니다.

작동 원리

  1. 고차원 데이터의 k-최근접 이웃 그래프를 구성
  2. 이 그래프를 fuzzy simplicial set으로 표현
  3. 저차원에서 유사한 위상 구조를 갖도록 cross-entropy를 최소화

주요 하이퍼파라미터

  • n_neighbors (5~200): 지역 vs 전역 구조 균형 조절
  • min_dist (0.0~1.0): 저차원에서 포인트 간 최소 거리
  • metric: 거리 측정 방식 (euclidean, cosine, manhattan 등)

t-SNE vs UMAP 핵심 비교

비교 항목 t-SNE UMAP
속도 느림 (O(n²) ~ O(n log n)) 빠름 (대규모 데이터에 강점)
확장성 수만 건까지 실용적 수십만~수백만 건도 가능
전역 구조 보존 약함 (지역 구조에 집중) 상대적으로 우수
지역 구조 보존 우수 우수
재현성 실행마다 결과 변동 random_state 고정 시 안정적
새 데이터 변환 불가 (재학습 필요) 가능 (transform 메서드)
이론적 기반 확률 분포 매칭 위상수학·리만 기하학
하이퍼파라미터 민감도 높음 (perplexity 영향 큼) 상대적으로 낮음

UMAP은 속도와 확장성에서 t-SNE를 압도하며, 전역 구조 보존에서도 앞서는 경우가 많습니다. 다만 t-SNE는 작은 데이터셋의 클러스터 분리를 시각적으로 더 뚜렷하게 보여주는 경향이 있습니다.

Python 실전 코드: MNIST 데이터셋 비교

환경 설정

pip install umap-learn scikit-learn matplotlib

데이터 준비 및 PCA 전처리

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import umap
import time

# MNIST 로드 (70,000장의 손글씨 숫자, 784차원)
mnist = fetch_openml('mnist_784', version=1, as_frame=False)
X, y = mnist.data[:10000], mnist.target[:10000].astype(int)

# PCA로 50차원으로 사전 축소 (t-SNE 속도 개선용)
pca = PCA(n_components=50, random_state=42)
X_pca = pca.fit_transform(X)
print(f"PCA 설명 분산: {pca.explained_variance_ratio_.sum():.2%}")

t-SNE 실행

start = time.time()
tsne = TSNE(n_components=2, perplexity=30, learning_rate=200,
            n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X_pca)
print(f"t-SNE 소요 시간: {time.time() - start:.1f}초")

UMAP 실행

start = time.time()
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1,
                    n_components=2, random_state=42)
X_umap = reducer.fit_transform(X_pca)
print(f"UMAP 소요 시간: {time.time() - start:.1f}초")

시각화 비교

fig, axes = plt.subplots(1, 2, figsize=(16, 7))

for ax, data, title in zip(axes, [X_tsne, X_umap], ['t-SNE', 'UMAP']):
    scatter = ax.scatter(data[:, 0], data[:, 1], c=y, cmap='tab10',
                         s=1, alpha=0.7)
    ax.set_title(title, fontsize=16, fontweight='bold')
    ax.set_xticks([])
    ax.set_yticks([])

plt.colorbar(scatter, ax=axes, label='Digit', shrink=0.8)
plt.tight_layout()
plt.savefig('tsne_vs_umap.png', dpi=150, bbox_inches='tight')
plt.show()

실무에서의 선택 가이드

UMAP을 선택하는 경우

  • 데이터가 10만 건 이상으로 대규모일 때
  • 학습된 모델로 새로운 데이터를 변환해야 할 때
  • 전역 구조(클러스터 간 거리 관계)가 중요할 때
  • ML 파이프라인에 차원 축소를 전처리 단계로 포함할 때

t-SNE를 선택하는 경우

  • 데이터가 수천~수만 건으로 비교적 작을 때
  • 클러스터 분리를 명확하게 시각화하고 싶을 때
  • 탐색적 분석(EDA) 목적으로 한 번만 시각화할 때
  • 논문이나 발표에서 시각적으로 뚜렷한 군집을 보여줘야 할 때

하이퍼파라미터 튜닝 팁

상황 t-SNE 권장값 UMAP 권장값
작은 데이터 (<1K) perplexity=5~15 n_neighbors=5~15
중간 데이터 (1K~50K) perplexity=30~50 n_neighbors=15~30
큰 데이터 (>50K) 사용 비권장 n_neighbors=30~200
밀집 클러스터 강조 min_dist=0.0~0.05
전역 구조 강조 n_neighbors ↑, min_dist ↑

자주 하는 실수와 주의점

  1. 클러스터 간 거리를 해석하지 마세요 — t-SNE에서 클러스터 간 거리는 의미가 없습니다. UMAP은 상대적으로 낫지만 여전히 주의가 필요합니다.
  2. PCA 전처리를 빼먹지 마세요 — 고차원 데이터를 50~100차원으로 먼저 축소하면 속도와 품질 모두 향상됩니다.
  3. 하이퍼파라미터 하나로 판단하지 마세요 — perplexity나 n_neighbors를 여러 값으로 실험하고 결과를 비교하세요.
  4. 클러스터 크기를 비교하지 마세요 — 두 알고리즘 모두 클러스터의 상대적 크기를 보존하지 않습니다.

실무 팁: 결과 해석 시에는 반드시 원본 feature space에서의 통계량(거리, 밀도 등)을 함께 확인하세요. 시각화는 탐색의 출발점이지, 결론이 아닙니다.

마무리

  • t-SNE는 작은 데이터의 지역 구조 시각화에 탁월하며, 클러스터를 시각적으로 뚜렷하게 분리합니다.
  • UMAP속도, 확장성, 전역 구조 보존 모든 면에서 실무에 유리하며, transform() 메서드로 새 데이터 변환이 가능합니다.
  • 2024년 이후 대부분의 실무 프로젝트에서는 UMAP이 기본 선택지로 자리잡고 있습니다.
  • 어떤 알고리즘을 쓰든 하이퍼파라미터 실험PCA 전처리는 필수입니다.
  • 시각화 결과만으로 결론 내리지 말고, 정량적 분석과 함께 활용하세요.

Did you find this helpful?

Your support keeps this blog running and ad-free content coming.

☕ Buy me a coffee
TODAY 372 | TOTAL 113,648