Principal Component Analysis (PCA)
주성분 분석(PCA)은 데이터의 분산을 가장 많이 포착하는 직교 방향으로 데이터를 투영합니다. 작동 원리, k 선택, 활용 사례 및 코드를 살펴봅니다.
주성분 분석 (PCA)은 데이터를 주성분이라고 하는 새로운 비상관 변수로 다시 표현하는 선형 차원 축소 기법입니다. 주성분은 데이터 분산을 설명하는 정도에 따라 순서가 정해집니다. 앞쪽의 소수 성분만 유지하면 정보 대부분을 보존하면서 상관된 여러 특징을 몇 개로 압축할 수 있습니다. Karl Pearson은 1901년에 이 방법을 도입했고 Harold Hotelling은 이를 발전시켜 1933년에 이름을 붙였습니다. PCA는 레이블을 무시하는 비지도 기법이며, 표준적인 데이터 전처리 단계이자 고차원 데이터를 2차원 또는 3차원으로 빠르게 시각화하는 방법입니다. 또한 머신러닝에서 압축과 노이즈 제거를 위한 기준선으로 사용됩니다.
PCA의 작동 방식#
PCA는 먼저 각 특징의 평균을 빼서 중심화합니다. 첫 번째 주성분은 중심화된 데이터의 분산이 가장 큰 방향이며, 그다음 성분은 앞선 모든 성분과 직교하면서 남은 분산이 가장 큰 방향입니다. 성분은 데이터 공분산 행렬의 고유벡터이며 이에 대응하는 고윳값은 각 방향의 분산입니다. 라이브러리는 공분산 행렬을 직접 구성하는 방식보다 수치적으로 안정적인, 중심화된 데이터의 특이값 분해 (SVD)로 두 값을 계산합니다. 데이터의 상위 k개 성분에 대한 투영이 축소된 표현이며, 이를 다시 변환하면 원본의 근사값을 복원할 수 있습니다. k차원으로 투영하는 모든 선형 방법 중 PCA는 제곱 복원 오차를 가장 작게 만듭니다.
분산은 단위에 따라 달라지므로, 달러 단위 소득과 연 단위 나이처럼 척도가 서로 다른 특징은 먼저 표준화합니다. 그렇지 않으면 숫자 범위가 가장 큰 특징이 첫 번째 성분에 가장 큰 영향을 미칩니다. 성분 수 k는 일반적으로 설명 분산 비율을 기준으로 선택합니다. 누적 분산 비율이 95%와 같은 목표에 도달할 때까지 성분을 유지하거나, 성분별 분산을 나타낸 스크리 플롯에서 엘보 지점을 선택합니다.
Scikit-learn의 PCA는 분산 목표를 직접 입력받습니다. 다음 예제는 손글씨 숫자의 8×8 이미지를 압축합니다.
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
# 1,797 handwritten digits, each an 8x8 image flattened to 64 pixel values
X, _ = load_digits(return_X_y=True)
# Keep the fewest components that explain 95% of the variance
pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X)
print(f"{X.shape[1]} features -> {pca.n_components_} components")
print(f"First two components: {pca.explained_variance_ratio_[:2].sum():.1%} of the variance")성분 29개는 픽셀 64개의 분산 중 95%를 유지하면서 입력 크기를 절반 이상 줄이며, 첫 두 성분만으로도 28.5%를 설명합니다. 이처럼 분산이 집중되는 이유는 인접 픽셀 간 상관관계가 강하고 이미지의 좌우 가장자리에 있는 픽셀은 거의 변하지 않기 때문입니다.
한계#
PCA는 선형 구조만 찾아내므로 곡면 위에 놓인 데이터에는 실제 차원보다 더 많은 컴포넌트가 필요합니다. 각 컴포넌트는 모든 원본 특성을 혼합하므로 해석하기 어렵고, 제곱 거리를 사용하면 소수의 이상치가 컴포넌트의 방향을 기울게 할 수 있습니다. 또한 높은 분산이 유용성을 뜻하지는 않습니다. 분산이 낮은 방향에 두 클래스를 구분하는 신호가 담길 수 있으므로, 분산 손실이 작더라도 해당 방향을 버리면 분류기 성능이 저하될 수 있습니다. 많은 특성을 소수의 특성으로 줄이면 특성 수가 증가할수록 모델이 일반화하는 데 훨씬 더 많은 샘플이 필요한 차원의 저주를 완화하고, 특성은 많고 샘플은 적을 때 과적합을 제한하는 데에도 도움이 됩니다.
컴퓨터 비전에서의 임베딩 PCA#
비전 모델은 각 이미지나 객체를 수백 개의 숫자로 이루어진 벡터인 임베딩으로 표현하며, PCA는 이러한 벡터를 시각화하거나 클러스터링하거나 압축할 때 흔히 사용하는 첫 단계입니다. YOLO26 모델은 model.embed()을 통해 이미지당 하나의 임베딩을 반환하며, 해당 벡터를 처음 두 주성분에 투영하면 자체 학습한 모델이 클래스를 어떻게 구분하는지 빠르게 선형으로 살펴볼 수 있습니다. 저장된 임베딩을 더 낮은 차원으로 줄이면 벡터 데이터베이스의 인덱스 크기도 작아지고 벡터 검색도 빨라집니다.
응용 분야#
- 얼굴 인식: Turk와 Pentland(1991)의 eigenfaces 방법은 얼굴 이미지 집합의 주성분에 대한 좌표로 각 얼굴을 표현하고, 해당 좌표를 비교해 사람을 인식했습니다.
- 이상 탐지: 산업 공정 모니터링에서는 정상 작동 중 수집한 센서 데이터에 PCA를 적용하고, 새 측정값의 재구성 오차가 크거나 유지된 컴포넌트 방향으로 크게 벗어나면 경보를 발생시킵니다.
- 집단 유전학: 유전자형 데이터에 PCA를 적용하면 조상을 요약할 수 있으며, 2008년 유럽인 1,387명을 대상으로 한 연구에서는 처음 두 컴포넌트가 유럽의 지도로 알아볼 수 있는 형태를 재현했습니다.
- 금리 위험: 채권 수익률 곡선의 변화는 분석가들이 수준, 기울기, 곡률이라고 부르는 세 컴포넌트가 좌우하므로, 위험 모델은 모든 만기를 추적하는 대신 세 가지 수치를 추적합니다.
PCA와 관련 기법 비교#
- t-SNE 및 UMAP: 시각화를 위해 설계된 비선형 기법으로, 국소 이웃 관계를 보존해 클러스터를 더 뚜렷하게 분리하지만 멀리 떨어진 클러스터 간 거리는 의미를 잃습니다. Scikit-learn의 t-SNE에는 새 데이터 포인트를 변환하는 기능이 없지만, 학습된 PCA는 행렬 곱셈 한 번으로 새 데이터를 투영합니다.
- 오토인코더: 데이터를 압축하고 재구성하며 비선형 구조를 학습할 수 있는 신경망입니다. 제곱 오차로 학습한 선형 오토인코더는 PCA와 동일한 부분 공간을 학습합니다.
- 특성 선택 및 추출: 특성 선택은 원본 열 중 일부를 유지하므로 해석 가능성이 유지됩니다. 반면 고전적인 특성 추출 방법인 PCA는 모든 특성을 결합해 새로운 특성을 만듭니다.
- 선형 판별 분석(LDA): 총분산 대신 클래스 간 분리를 최대화하는 방향을 선택하는 지도 학습 방식의 관련 기법이며, 클래스 수보다 최대 하나 적은 수의 컴포넌트를 생성합니다.










