한양과학기술고등학교

에듀테크 프로젝트 대시보드

주성분 분석 (PCA)

주성분 분석 (PCA)

데이터가 가장 넓게 퍼진 방향을 찾아 새 좌표축으로 삼는 기법입니다. 2차원 점들을 하나의 축으로 요약하면 차원 축소·압축·시각화가 됩니다. 점을 직접 끌어보며 주축(주성분)이 어떻게 따라 움직이는지 확인해 보세요.

// interactive scatter — 점을 드래그하세요

● 파란 점 = 데이터  |  ━ PC1 (분산 최대 방향)  |  ━ PC2 (PC1에 직교, 남은 분산)  |  ✕ 평균점

// 공분산 행렬 & 고유분해 (실시간)
계산 중…
// 분산 설명 비율 (explained variance)
PC1
PC2

PC1 하나만 남겨도 원본 분산의 대부분을 보존할 수 있으면 1차원으로 압축 가능합니다.

// 지금 이 데이터의 해석

PCA는 4단계로 끝난다

STEP 1

평균 중심화

각 특성에서 평균을 빼 데이터를 원점으로 옮긴다. (스케일 차이가 크면 표준편차로도 나눠 정규화)

STEP 2

공분산 행렬

C = (1/n) XᵀX. 대각선은 각 축의 분산, 비대각선은 두 축이 함께 움직이는 정도(공분산).

STEP 3

고유분해

C의 고유벡터 = 주성분 방향, 고유값 λ = 그 방향의 분산. λ가 큰 순서로 정렬한다.

STEP 4

투영

상위 k개 고유벡터에 데이터를 정사영(내적)하면 k차원으로 축소된 좌표를 얻는다.

2×2 공분산 행렬은 손으로 푼다

공분산 행렬이 C = [[a, b], [b, d]] 라면 (대칭이라 오른쪽 위·왼쪽 아래가 같음), 고유값은 2차 방정식 한 번으로 나온다.

# 트레이스 T = a + d,  판별식 재료 D = a·d − b²
λ = T/2 ± √( T²/4 − D )        # 큰 쪽이 λ₁(PC1), 작은 쪽이 λ₂(PC2)

# 고유벡터 (b ≠ 0 일 때)
v = ( λ − d ,  b )   # 정규화해서 단위벡터로

# 분산 설명 비율
ratio₁ = λ₁ / (λ₁ + λ₂)

두 고유벡터는 항상 서로 직각이다. 그래서 캔버스의 초록·주황 선은 언제나 90°를 이룬다. 타원의 반지름은 √λ 에 비례한다 — 길쭉할수록 PC1로의 압축이 유리하다.

선형 회귀(최소제곱)와 헷갈리지 말 것

선형 회귀 (Least Squares)PCA (PC1)
무엇을 줄이나y 방향 수직 잔차의 제곱합선까지의 수직(직교) 거리의 제곱합
x·y 역할x는 입력, y는 정답(비대칭)x·y 대등하게 취급(대칭)
목적y 예측데이터 구조 요약·차원 축소
축 바꾸면기울기가 달라짐같은 주축(회전 불변)

두 직선은 데이터가 완벽한 직선일 때만 일치하고, 흩어질수록 벌어진다.

NumPy로는 네 줄

import numpy as np

X = X - X.mean(axis=0)                 # 1) 중심화
C = np.cov(X, rowvar=False)          # 2) 공분산 행렬
vals, vecs = np.linalg.eigh(C)       # 3) 고유분해 (오름차순)
pc1 = vecs[:, -1]                     # 가장 큰 고유값의 고유벡터
Z = X @ vecs[:, ::-1][:, :k]        # 4) 상위 k축에 투영

# sklearn: PCA(n_components=k).fit_transform(X) 와 동일

어디에 쓰이나

· 시각화 — 수십 개 특성을 가진 데이터를 2·3차원으로 눌러 산점도로 관찰 (유전자·설문 데이터).

· 압축·잡음 제거 — 이미지의 주요 성분 몇 개만 남겨 용량을 줄이고 미세한 노이즈를 버린다(eigenface).

· 전처리 — 서로 강하게 상관된 특성들을 직교한 소수의 성분으로 바꿔 모델 학습을 안정화(다중공선성 완화).

· 이상 탐지 — 주성분으로 복원했을 때 오차가 큰 샘플을 비정상으로 표시.

한계: 선형 변환만 가능(곡면 구조는 t-SNE·UMAP·오토인코더), 스케일에 민감, 성분의 의미 해석이 어려움.