🔗 관련 문서: Wikipedia - Principal Component Analysis
주성분 분석(PCA)은 고차원 공간에 위치한 데이터를 저차원으로 사상하여, 데이터의 구조적 특성과 분산을 효과적으로 표현하고자 하는 통계적 기법이다. 본 문서는 PCA의 이론적 기반과 절차, 장점 및 한계점을 학술적으로 정리하고자 한다.
차원의 저주란 고차원 공간에서 발생하는 데이터의 희소성과 거리 계산의 왜곡 문제를 일컫는다. 데이터가 차원이 증가함에 따라 관측치 간 거리는 멀어지고, 유의미한 통계적 구조를 포착하기 어려워진다. PCA는 이러한 고차원의 문제를 해결하고자, 분산이 큰 방향을 기준으로 데이터의 차원을 축소함으로써 밀도를 높이고 계산 효율을 증진시킨다.
차원 축소는 고차원 데이터가 갖는 여러 문제를 완화하고, 분석의 효율성과 정확성을 향상시키기 위해 사용된다. 주요한 이유는 다음과 같다.
차원 축소는 고차원 데이터를 보다 효율적으로 분석하고 시각화하기 위해 필수적으로 수행되는 전처리 기법이다. 이 방법은 크게 두 가지 범주로 구분된다: Feature Selection과 Feature Extraction이다.
Feature Selection은 통계적 기법을 활용하여 각 feature의 중요도를 평가하고, 그 순위(rank)에 따라 선택 여부를 결정하는 방법이다. 이 과정은 불필요하거나 관련성이 낮은 feature를 제거함으로써 모델의 단순화와 성능 향상을 도모한다. 그러나 이 방식은 제거된 feature가 가지고 있던 정보를 완전히 폐기하기 때문에, 정보 손실(information loss)이 발생할 수 있다. 또한 동일한 분석 목적이라도 데이터셋에 따라 feature의 순위가 크게 달라질 수 있다는 점에서 일관성의 한계가 존재한다.
Feature Extraction은 기존 feature의 조합이나 변환을 통해 새로운 feature를 생성하는 방법이다. 이 방식은 원래의 데이터를 요약하여 저차원 공간에서 의미 있는 표현을 구성할 수 있도록 한다. 기존 feature에서 포함된 정보를 최대한 보존하면서도 새로운 분석 공간을 구성할 수 있다는 점에서 강력한 차원 축소 방법으로 평가된다.
주성분 분석(Principal Component Analysis, PCA)은 1901년 칼 피어슨(Karl Pearson)에 의해 처음 제안되었다. 그는 통계학의 창시자 중 한 사람으로, 고차원 데이터를 보다 간결하게 설명하기 위한 수학적 방법으로 PCA를 개발하였다.
이후 해럴드 호텔링(Harold Hotelling)이 1933년에 이를 보다 일반화된 형태로 확장하였다. 호텔링은 선형대수학과 통계이론을 결합하여, 오늘날 우리가 사용하는 고유치(eigenvalue) 기반의 PCA 수식을 정립하였다.
20세기 후반에는 고유치 분해뿐 아니라 특이치 분해(SVD)를 기반으로 PCA를 계산하는 방식이 등장하면서, 대규모 데이터셋에도 적용이 가능해졌다.
현재 PCA는 데이터 전처리, 시각화, 차원 축소 등 다양한 분야에서 필수적인 통계 기법으로 널리 활용되고 있다.
주성분 분석(PCA; Principal Component Analysis)은 고차원 데이터를 저차원으로 변환하여 데이터의 분산을 최대한 보존하는 방식으로 차원을 축소하는 기법이다. 이는 고차원 공간에서 분산이 가장 큰 방향으로 주성분을 정의하고 데이터를 그 방향으로 투영함으로써 실현된다.
고차원 데이터에서 분산이 큰 방향은 정보량이 많은 방향이다. PCA는 이러한 방향을 찾아 데이터를 그 축으로 투영하여 불필요한 차원은 제거하고 중요한 정보만 유지한다.
PCA는 공분산 행렬의 고유치 분해 또는 특이치 분해(SVD)를 이용하여 주성분을 산출한다. 고유치는 분산의 크기를, 고유벡터는 방향을 의미한다.
공분산 행렬로부터 도출된 고유벡터는 주성분의 방향을 나타내며, 고유치는 해당 주성분이 설명하는 분산의 크기를 의미한다. 일반적으로 고유치가 큰 주성분일수록 데이터의 중요한 정보를 많이 보존하고 있다 판단한다.
주성분은 고유치가 큰 순서대로 선택되며, 누적 분산이 일정 임계치를 넘는 지점까지 선택하는 방식이 일반적이다. 예를 들어, 누적 설명 분산이 90%를 초과하는 주성분 수만 선택할 수 있다.
PCA는 공분산 행렬의 고유벡터를 기반으로 주성분을 산출한다. 첫 번째 주성분은 데이터의 분산을 최대화하는 방향이며, 두 번째 이후의 주성분은 각각 직교성을 유지하면서 잔여 분산을 설명하는 방향으로 정의된다. 이러한 방식으로 데이터는 주성분 공간으로 투영된다.
원본 데이터를 선택된 주성분 벡터 공간에 투영하여 차원을 축소한다. 이 과정에서 각 샘플은 주성분의 선형 결합으로 표현된다.
PCA는 주성분을 따라 데이터를 투영함으로써 평균 제곱 거리 손실을 최소화하고, 데이터의 분산이 가장 많이 보존되도록 한다.
축소된 차원의 데이터는 다시 원래의 차원으로 복원할 수 있으며, 이때 일부 정보 손실이 발생한다. 하지만 주요한 구조는 대부분 유지된다.
차원 축소 이후에도 선택된 주성분을 통해 원래의 데이터 공간으로 근사 복원이 가능하다. 이는 PCA를 데이터 압축 및 노이즈 제거 목적으로 활용할 수 있게 하며, 정보 손실을 최소화하는 데 기여한다. 단, 축소된 주성분의 수에 따라 원본과의 차이는 존재할 수밖에 없다.
PCA는 선형 가정을 기반으로 하므로, 비선형 구조를 가진 데이터에는 적합하지 않다. 이를 보완하기 위해 커널 PCA(Kernel PCA), t-SNE, Autoencoder 등 다양한 확장 기법이 개발되었다.
또한 주성분은 원래 변수들의 조합이기 때문에 직관적 해석이 어려운 점도 하나의 제약으로 작용한다.
Scikit-Learn의 PCA 를 이용해 간단하게 구할 수 있다. Scikit-Learn은 편차 또한 자동으로 처리해 계산해준다.
# 예제: sklearn으로 PCA 적용
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 데이터 불러오기
data = load_iris()
X = data.data
y = data.target
# PCA 적용 (2차원으로 축소)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 시각화
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('PCA - Iris 데이터')
plt.show()
항목 | 고유치 분해 (Eigendecomposition) | 특이치 분해 (SVD) |
---|---|---|
적용 대상 | 정방행렬 (n×n)만 가능 | 모든 형태의 행렬 (n×m 가능) |
분해 형태 | A = QΛQ⁻¹ | A = UΣVᵀ |
조건 | 대각화 가능해야 함 | 항상 가능함 |
결과 구성 | 고유치(Λ), 고유벡터(Q) | 특이치(Σ), 특이벡터(U, V) |
주요 용도 | 공분산 행렬 분석, PCA 등 | 차원 축소, 압축, LSA, 노이즈 제거 |
주성분 분석(PCA)에서는 고유치 분해와 특이치 분해 두 가지 모두 활용될 수 있다. 고전적인 접근에서는 공분산 행렬을 고유치 분해하여 주성분 방향을 찾는다. 그러나 실제 구현에서는 데이터 행렬에 대해 직접 SVD를 적용하는 방식이 더욱 일반적이며 수치적으로도 안정적이다.
데이터 X를 평균 정규화한 후, 공분산 행렬 C = XᵀX를 계산하고, 이를 고유치 분해하여 고유치와 고유벡터를 통해 주성분을 추출한다.
정규화된 데이터 X에 대해 직접 SVD: X = UΣVᵀ를 수행하면, V의 열벡터가 주성분 방향을 나타내며, Σ는 데이터가 각 방향으로 얼마나 분산되어 있는지를 알려준다. 이 방식은 대규모 데이터셋에도 안정적으로 적용 가능하다.