🤖 AI/ML

PCA

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 전에 반드시 데이터 표준화가 필요합니다. 스케일이 다른 변수가 있으면 큰 스케일의 변수가 첫 번째 주성분을 지배하게 되어 의미 있는 분석이 어렵습니다."

⚠️ 흔한 실수 & 주의사항

표준화 없이 PCA 적용

변수 스케일이 다르면 큰 값의 변수가 첫 번째 주성분을 지배합니다. StandardScaler로 반드시 표준화하세요.

비선형 관계에 PCA 적용

PCA는 선형 변환이므로 비선형 관계는 포착하지 못합니다. 비선형 데이터에는 Kernel PCA나 t-SNE를 고려하세요.

올바른 방법

explained_variance_ratio_를 확인하여 적절한 차원 수를 선택하세요. 보통 누적 분산이 95% 이상이 되는 차원 수를 사용합니다.

🔗 관련 용어

📚 더 배우기