본문 바로가기
데이터 과학 수학

주성분 분석(PCA): 복잡한 데이터에서 핵심만 남기는 기술

by dexien 2026. 4. 24.

100개의 변수가 있는 데이터셋을 받은 적이 있습니다. 어디서부터 시작해야 할지 막막했습니다. 변수가 많으면 정보가 풍부할 것 같지만 실제로는 반대입니다. 변수 간 중복 정보가 많고, 모델이 혼란을 겪고, 시각화는 불가능합니다. PCA를 처음 써봤을 때 100개 변수를 2개로 줄였는데도 데이터의 핵심 패턴이 그대로 살아있는 걸 보고 놀랐습니다.

주성분 분석(PCA, Principal Component Analysis)은 고차원 데이터에서 가장 중요한 정보만 추려내는 차원 축소 기법입니다. 데이터를 버리는 게 아니라 중복된 정보를 걷어내고 핵심 패턴을 보존합니다. 이 연재에서 다룬 공분산 행렬, 고윳값 분해, 선형 변환이 모두 여기서 만납니다. 오늘은 실제 숫자로 PCA 과정을 처음부터 끝까지 따라가 보겠습니다.

주성분 분석(PCA)
주성분 분석(PCA): 복잡한 데이터에서 핵심만 남기는 기술

PCA가 필요한 이유 — 차원의 저주와 중복 정보

변수가 늘어날수록 데이터가 차지하는 공간이 기하급수적으로 넓어집니다. 같은 1000개의 데이터라도 변수가 2개면 2D 평면에 촘촘히 있지만, 변수가 100개면 100차원 공간에 희박하게 흩어집니다. 이게 차원의 저주입니다. 패턴을 찾기 어려워지고 모델 성능이 떨어집니다.

그런데 현실의 고차원 데이터는 대부분 변수 간에 상관관계가 있습니다. 키와 몸무게, 나이와 경력, 광고비와 매출처럼요. 이 상관관계는 중복 정보를 의미합니다. 키를 알면 몸무게를 어느 정도 예측할 수 있으니 둘 다 쓸 필요가 없습니다. PCA는 이 중복 정보를 걷어내고 독립적인 핵심 정보만 남깁니다.

차원 축소가 필요한 상황:

변수 100개, 데이터 500개
→ 파라미터 수 >> 데이터 수 → 과적합 위험

변수 간 상관계수가 0.9 이상인 쌍이 많음
→ 중복 정보가 많다는 신호

시각화가 필요한데 변수가 3개 이상
→ 2D/3D로 줄여야 눈으로 볼 수 있음

PCA 효과:
100차원 → 10차원: 학습 속도 10배 향상
노이즈 차원 제거: 모델 일반화 성능 향상
2~3차원 변환: 데이터 분포 시각화 가능

PCA의 핵심 아이디어 — 분산이 곧 정보량이다

PCA를 관통하는 핵심 아이디어는 하나입니다. "데이터가 가장 넓게 퍼진 방향이 가장 많은 정보를 담고 있다." 분산이 크다는 건 데이터들 사이의 차이가 크다는 뜻이고, 이 차이가 분석에서 의미 있는 정보입니다.

반대로 분산이 0에 가까운 방향은 모든 데이터가 거의 같은 값을 가진다는 뜻입니다. 이 방향에서는 데이터를 구분할 수 없으니 정보가 없는 겁니다. PCA는 분산이 최대인 방향을 첫 번째 주성분(PC1)으로, 그다음으로 큰 방향을 PC2로 잡는 방식으로 새로운 좌표계를 만듭니다.

주성분의 성질:

PC1: 데이터 분산이 최대인 방향
PC2: PC1과 수직이면서 분산이 두 번째로 큰 방향
PC3: PC1, PC2와 수직이면서 분산이 세 번째로 큰 방향
...

핵심 성질:
각 주성분은 서로 수직(직교) → 독립적
PC1이 가장 많은 정보, 뒤로 갈수록 정보 감소
전체 주성분 수 = 원래 변수 수

차원 축소:
상위 k개 주성분만 선택 → k차원으로 축소
나머지 주성분의 정보는 포기 (보통 노이즈)

공분산 행렬과 고유값 분해

분산이 최대인 방향을 어떻게 찾을까요. 여기서 공분산 행렬과 고유값 분해가 등장합니다. 공분산 행렬은 변수들이 서로 얼마나 같이 움직이는지를 담은 행렬입니다.

공분산 행렬 C (변수가 3개인 경우):

C = | Var(x1) Cov(x1,x2) Cov(x1,x3) |
    | Cov(x2,x1) Var(x2) Cov(x2,x3) |
    | Cov(x3,x1) Cov(x3,x2) Var(x3) |

대각선: 각 변수의 분산
나머지: 두 변수 사이의 공분산

공분산 행렬을 고유값 분해하면:
C = V × Λ × V^T

V: 고유벡터 행렬 (각 열이 주성분 방향)
Λ: 고유값 대각 행렬 (각 주성분의 분산 크기)

고유값이 클수록 그 방향이 더 많은 정보를 담음
→ 고유값 큰 순서대로 정렬 = 주성분 우선순위

고유벡터가 주성분의 방향이고, 고윳값이 그 방향으로의 분산 크기입니다. 이 연재에서 다룬 고윳값 분해가 PCA의 수학적 엔진입니다. 행렬을 분해해서 데이터의 핵심 구조를 찾아내는 과정 그대로입니다.


실제 숫자로 PCA 계산해보기

키(cm)와 몸무게(kg) 두 변수의 간단한 예시로 PCA 전 과정을 따라가 보겠습니다.

원본 데이터 (5명):
키: [170, 165, 180, 175, 160]
몸무게: [ 65, 60, 75, 70, 55]

① 표준화 (평균=0, 표준편차=1):
키 평균=170, 표준편차=7.07
몸무게 평균=65, 표준편차=7.07

표준화된 키: [-0.0, -0.71, 1.41, 0.71, -1.41]
표준화된 몸무게: [ 0.0, -0.71, 1.41, 0.71, -1.41]

② 공분산 행렬 계산:
Var(키) = 1.0, Var(몸무게) = 1.0
Cov(키, 몸무게) = 1.0 (완전 상관)

C = [[1.0, 1.0],
     [1.0, 1.0]]

③ 고유값 분해:
고유값: λ1=2.0, λ2=0.0
고유벡터: v1=[0.707, 0.707], v2=[-0.707, 0.707]

④ 주성분 선택:
PC1이 전체 분산의 100% 설명 (λ1/(λ1+λ2)=2/2=1.0)
→ PC1 하나만으로 충분 → 2차원 → 1차원 축소

⑤ 데이터 투영:
새 좌표 = 원본 데이터 × v1
→ 키와 몸무게 정보를 하나의 숫자로 요약

이 예시에서 키와 몸무게의 공분산이 1.0으로 완전히 상관됩니다. 두 변수가 완전히 같은 정보를 담고 있다는 뜻입니다. PC1 하나가 100%를 설명하니 1차원으로 줄여도 정보 손실이 없습니다. 현실 데이터에서는 이렇게 완벽하지 않지만 원리는 동일합니다.


주성분 개수 선택하기 — 설명 분산과 스크리 플롯

몇 개의 주성분을 선택할지 결정하는 게 PCA에서 가장 중요한 설계 결정입니다. 너무 적으면 정보 손실이 크고, 너무 많으면 차원 축소 효과가 없습니다.

누적 설명 분산(Cumulative Explained Variance):

고유값: [4.5, 2.1, 1.2, 0.8, 0.3, 0.1]
전체합: 9.0

PC1: 4.5/9.0 = 50% → 누적 50%
PC2: 2.1/9.0 = 23% → 누적 73%
PC3: 1.2/9.0 = 13% → 누적 86% ← 여기서 선택
PC4: 0.8/9.0 = 9% → 누적 95%
PC5: 0.3/9.0 = 3% → 누적 98%
PC6: 0.1/9.0 = 1% → 누적 99%

일반적 기준:
누적 분산 80~90% 이상이 되는 지점까지 선택

스크리 플롯(Scree Plot):
고유값을 크기 순으로 그린 그래프
기울기가 갑자기 완만해지는 지점(엘보우 포인트)에서 선택
→ 위 예시에서 PC3 이후 고유값이 급격히 작아짐

위 예시에서 PC3까지 선택하면 전체 분산의 86%를 보존하면서 6차원을 3차원으로 줄입니다. 나머지 14%는 포기하는데 이 부분이 보통 노이즈에 해당합니다. 오히려 노이즈를 제거함으로써 모델 성능이 올라가는 경우도 많습니다.


PCA 사용 시 주의사항

PCA를 쓸 때 가장 많이 하는 실수가 표준화를 건너뛰는 겁니다. PCA는 분산을 기준으로 주성분을 찾기 때문에 단위가 큰 변수가 분산도 크게 나와서 주성분을 지배합니다. 연봉(수백만 단위)과 나이(수십 단위)를 그냥 넣으면 연봉이 PC1을 완전히 지배합니다.

PCA 체크리스트:

① 표준화 필수: StandardScaler로 평균=0, 표준편차=1
② 선형성 확인: 변수 간 관계가 선형적인지 확인
   비선형 관계 → PCA 효과 제한적
③ 이상치 제거: PCA는 이상치에 민감
④ 주성분 해석 주의:
   PC1, PC2는 원래 변수의 조합
   "PC1 = 액션성 + 감성"처럼 해석은 분석가 몫
⑤ 테스트 데이터 변환:
   훈련 데이터로 학습한 PCA로 테스트 데이터도 변환
   테스트 데이터로 새로 PCA 학습 금지 (데이터 누수)

또 하나의 함정은 해석입니다. PCA로 만들어진 주성분은 원래 변수들의 선형 조합이라 직관적인 의미가 사라집니다. "PC1이 무엇을 의미하는가"는 각 변수의 가중치(로딩)를 보고 분석가가 판단해야 합니다. 차원만 줄이고 해석을 포기하면 절반짜리 분석입니다.


실무에서 PCA가 쓰이는 방식

PCA는 단순히 차원을 줄이는 것 이상의 역할을 합니다. 실무에서 쓰이는 세 가지 주요 방식입니다.

첫째는 머신러닝 전처리입니다. 변수가 너무 많아서 과적합이 걱정될 때 PCA로 차원을 줄이면 모델이 더 잘 일반화됩니다. 특히 SVM이나 로지스틱 회귀 같은 선형 모델에서 효과적입니다.

둘째는 노이즈 제거입니다. 작은 고윳값에 해당하는 주성분들은 대부분 잡음입니다. 이 차원들을 제거하면 데이터가 더 깨끗해집니다. 이미지 압축에서 PCA를 쓰면 원본 대비 훨씬 작은 용량으로 거의 같은 품질을 유지할 수 있습니다.

셋째는 시각화입니다. 수백 차원의 데이터를 2D나 3D로 줄이면 눈으로 데이터 분포를 볼 수 있습니다. 비슷한 데이터끼리 군집이 보이거나, 이상치가 한눈에 들어오는 경우가 많습니다.

단계 작업 주의사항
1. 표준화 StandardScaler 적용 단위가 다르면 결과가 왜곡됨
2. 공분산 행렬 변수 간 관계 계산 선형 관계 가정 확인
3. 고유값 분해 주성분 방향과 중요도 계산 고유값이 클수록 중요한 주성분
4. 주성분 선택 누적 분산 80~90% 기준 스크리 플롯 엘보우 포인트 참고
5. 데이터 투영 선택한 주성분으로 변환 훈련 데이터 기준으로 테스트도 변환

이 글에서 다룬 공분산, 고유값 분해, 행렬 변환, 선형 대수학이 PCA 하나에 모두 집약됩니다. 100개 변수를 2개로 줄였는데 데이터의 핵심 패턴이 살아있는 걸 처음 봤을 때의 신기함은 직접 써봐야 압니다. 복잡한 데이터에서 핵심만 남기는 기술, 그게 PCA입니다.


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 블로그 이름