PCA
Principal Component Analysis
주성분 분석. 차원 축소 기법. 데이터 시각화, 노이즈 제거.
Principal Component Analysis
주성분 분석. 차원 축소 기법. 데이터 시각화, 노이즈 제거.
주성분 분석(PCA, Principal Component Analysis)은 고차원 데이터를 저차원으로 축소하는 대표적인 비지도 학습 기법입니다. 데이터의 분산을 최대한 보존하면서 상관관계가 높은 변수들을 더 적은 수의 주성분(Principal Component)으로 변환합니다.
PCA는 1901년 Karl Pearson에 의해 처음 소개되었고, 1933년 Harold Hotelling이 현재 형태로 정립했습니다. 통계학에서 시작되어 이미지 처리, 유전체학, 금융 분석 등 다양한 분야에서 100년 이상 활용되어 온 검증된 기법입니다.
핵심 원리는 공분산 행렬의 고유값 분해(Eigenvalue Decomposition)입니다. 데이터의 분산이 가장 큰 방향을 첫 번째 주성분으로, 그 다음으로 분산이 크고 첫 번째와 직교하는 방향을 두 번째 주성분으로 선택합니다. 각 고유값은 해당 주성분이 설명하는 분산의 비율을 나타냅니다.
실무에서는 시각화(2D/3D 플롯), 노이즈 제거, 특성 추출, 계산 비용 감소에 활용됩니다. 임베딩 시각화에서 t-SNE나 UMAP 이전에 PCA로 먼저 차원을 축소하면 계산 속도가 크게 향상됩니다.
# PCA 차원 축소 및 시각화 예제
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 데이터 로드 (Iris: 4차원)
iris = load_iris()
X = iris.data
y = iris.target
# 1. 데이터 표준화 (PCA 전 필수!)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 2. PCA 적용 (4차원 -> 2차원)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 3. 설명된 분산 비율 확인
print(f"각 주성분의 설명 분산: {pca.explained_variance_ratio_}")
print(f"누적 설명 분산: {sum(pca.explained_variance_ratio_):.2%}")
# 출력: 약 95% (2개 주성분으로 95%의 정보 보존)
# 4. 차원 축소된 데이터 시각화
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.xlabel('PC1 (첫 번째 주성분)')
plt.ylabel('PC2 (두 번째 주성분)')
plt.title('PCA로 시각화한 Iris 데이터셋')
plt.colorbar(scatter, label='Species')
plt.show()
# 5. 최적 차원 수 결정 (분산 95% 이상 보존)
pca_full = PCA()
pca_full.fit(X_scaled)
cumsum = np.cumsum(pca_full.explained_variance_ratio_)
n_components = np.argmax(cumsum >= 0.95) + 1
print(f"95% 분산 보존에 필요한 차원: {n_components}")
"1000차원 임베딩 데이터를 시각화하기 위해 먼저 PCA로 50차원까지 축소한 후 t-SNE를 적용했습니다. 계산 시간이 10분에서 30초로 단축됐습니다."
"PCA는 공분산 행렬의 고유벡터를 주성분으로 사용합니다. 첫 번째 고유벡터가 가장 큰 분산 방향을 나타내며, 고유값은 해당 방향이 설명하는 분산량을 의미합니다."
"PCA 전에 반드시 데이터 표준화가 필요합니다. 스케일이 다른 변수가 있으면 큰 스케일의 변수가 첫 번째 주성분을 지배하게 되어 의미 있는 분석이 어렵습니다."
변수 스케일이 다르면 큰 값의 변수가 첫 번째 주성분을 지배합니다. StandardScaler로 반드시 표준화하세요.
PCA는 선형 변환이므로 비선형 관계는 포착하지 못합니다. 비선형 데이터에는 Kernel PCA나 t-SNE를 고려하세요.
explained_variance_ratio_를 확인하여 적절한 차원 수를 선택하세요. 보통 누적 분산이 95% 이상이 되는 차원 수를 사용합니다.