한 줄 요약
PCA는 데이터가 가장 넓게 퍼진 방향을 새 좌표축으로 삼아, 축 몇 개만으로 데이터를 요약하는 방법입니다. 그 축은 데이터의 공분산 행렬의 고유벡터이고, 각 축이 설명하는 퍼짐의 크기는 고유값입니다.
1. 왜 필요한가: 숫자는 많은데 움직임은 하나
용수철에 매달린 공이 좌우로 흔들리는 실험을 해 봅시다. 공의 위치를 알고 싶어서 카메라 세 대를 아무 각도로 세워 두고 기록합니다. 카메라마다 위치를 (가로, 세로) 두 숫자로 기록하니, 한순간의 기록은 숫자 6개입니다.
그런데 공은 한 직선 위에서만 움직입니다. 실제로 필요한 정보는 "직선 위에서 어디쯤인가" 하나뿐이에요. 숫자 6개 속에는 같은 정보가 여러 번 섞여 있고, 거기에 잡음까지 끼어 있습니다.
이 예시는 Shlens(2014)의 튜토리얼에서 가져온 것입니다. 이 글의 문장과 풀이는 새로 썼습니다.
현실의 데이터도 비슷합니다. 고객 한 명을 나이, 방문 횟수, 구매액, 체류 시간…처럼 수백 개의 숫자로 적어 두었는데, 그중 많은 숫자가 서로 비슷한 이야기를 하고 있습니다. 변수가 너무 많으면 계산이 느려지고, 그림으로 볼 수도 없고, 모델이 우연한 패턴에 속기 쉽습니다. 그래서 정보는 최대한 남기고 변수의 개수만 줄이고 싶습니다.
2. PCA가 하는 일
- 정보를 최대한 유지한다: 중복된 정보와 잡음을 버리고, 데이터가 퍼진 주된 방향을 남깁니다.
- 표현을 쉽게 만든다: 변수가 줄면 계산이 빨라지고, 2차원·3차원 그림으로 구조를 볼 수 있습니다.
핵심 질문은 하나입니다. "어느 방향으로 줄여야 정보를 가장 적게 잃을까?"
3. 작은 예로 먼저 보기
점 5개로 해 봅시다. 평균이 원점이 되도록 맞춘 데이터입니다.
| 점 | x | y |
|---|---|---|
| A | −2 | −2 |
| B | −1 | 0 |
| C | 0 | −1 |
| D | 1 | 2 |
| E | 2 | 1 |
그려 보면 점들이 오른쪽 위로 뻗은 길쭉한 타원 모양입니다. x축이나 y축 방향보다, 대각선 y = x 방향으로 훨씬 넓게 퍼져 있어요. 이 대각선이 바로 첫 번째 주성분입니다.
이제 모든 점을 이 대각선 위로 "그림자"를 떨어뜨려(정사영) 한 줄로 요약해 봅시다. 대각선 방향의 단위벡터는 입니다. 각 점의 위치는 이 방향 위에서 로 쓸 수 있어요.
| 점 | 대각선 위의 위치 | 대각선에서 벗어난 정도 |
|---|---|---|
| A | ||
| B | ||
| C | ||
| D | ||
| E |
"벗어난 정도"가 작으니, 숫자 2개를 1개로 줄여도 원래 점을 꽤 비슷하게 되살릴 수 있습니다.
4. 수학으로 읽기: 한 단계씩
각 단계마다 이미 아는 개념 → 새로 배우는 개념을 짝지어 봅니다.
4-1. 데이터는 벡터, 벡터는 좌표
아는 것: 좌표평면의 점, 평면벡터의 성분 → 새로운 것: m차원 벡터
위의 점 A를 라고 쓰는 건 사실 약속입니다. "가로로 −2, 세로로 −2"는 가로축과 세로축이라는 자를 골랐기 때문에 나오는 숫자예요. 카메라 예시의 6개 숫자도 카메라를 놓은 방식에 따라 정해진 좌표일 뿐입니다.
4-2. 좌표계를 바꾼다 (기저변환)
아는 것: 좌표축을 돌려도 점은 그대로 → 새로운 것: 기저변환
점은 그대로 두고 자(좌표축)만 바꿔서 같은 점을 다시 쓸 수 있습니다. 새 축을 라 하면, 새 좌표는 각 축과의 내적입니다.
내적은 "그 방향으로의 그림자 길이"이므로, 이것이 곧 정사영입니다. PCA의 질문은 이렇게 바뀝니다. 어떤 새 축 를 고르면 데이터를 가장 잘 요약할까?
4-3. "잘 요약한다"는 말을 수식으로: 분산
아는 것: 분산(퍼진 정도) → 새로운 것: 공분산
PCA는 분산이 큰 방향에 정보가 있다고 가정합니다. 용수철 예시에서 진짜 움직임은 직선 위에서 크게 퍼지고, 잡음은 작게 퍼지기 때문입니다. 그리고 두 변수가 함께 움직이는 정도는 공분산으로 잽니다.
공분산이 크다는 것은 두 변수가 "같은 이야기"를 하고 있다는 뜻, 즉 중복입니다. 변수가 여러 개면 분산과 공분산을 한 표로 모을 수 있고, 이것이 공분산 행렬 입니다. 대각선에는 각 변수의 분산, 나머지 칸에는 변수끼리의 공분산이 들어갑니다.
우리 예시의 공분산 행렬은 다음과 같습니다.
x의 분산도 2, y의 분산도 2인데 공분산이 1.6으로 큽니다. x와 y가 거의 같은 이야기를 한다는 뜻이에요.
4-4. 왜 분산이 가장 큰 방향이 최선일까: 피타고라스 정리
아는 것: 중3 피타고라스 정리 → 새로운 것: 오차를 최소로 = 분산을 최대로
점 하나를 새 축 위에 정사영하면, 원점·점·그림자가 직각삼각형을 이룹니다.
- 빗변: 원점에서 점까지의 거리 (데이터가 정해지면 바뀌지 않는 값)
- 한 변: 축 위의 그림자 길이 (남기는 정보)
- 다른 한 변: 점에서 축까지의 수직 거리 (버리는 정보, 되살릴 때의 오차)
피타고라스 정리에서
전체는 정해져 있으니, 버리는 쪽을 가장 작게 하는 것은 남기는 쪽(분산)을 가장 크게 하는 것과 같습니다. 이것이 PCA가 "분산이 최대인 방향"을 고르는 이유입니다.
우리 예시로 확인해 봅시다. 다섯 점의 (거리)² 합은 입니다. 대각선 위로 떨어진 그림자 길이의 제곱합은 , 대각선에서 벗어난 거리의 제곱합은 입니다.
딱 맞아떨어집니다. 5로 나누면 분산이 되어 3.6 + 0.4 = 4 입니다.
4-5. 가장 좋은 축은 어떻게 찾나: 고유벡터
아는 것: 방정식과 행렬의 곱 → 새로운 것: 고유값·고유벡터
분산이 가장 큰 방향을 찾는 문제는, 공분산 행렬 의 고유벡터를 찾는 문제로 바뀝니다. 고유벡터는 행렬을 곱해도 방향이 바뀌지 않고 길이만 변하는 벡터이고, 늘어나는 배수가 고유값입니다.
우리 예시를 풀면:
- , 고유벡터 → 대각선 방향 (퍼짐의 90%)
- , 고유벡터 → 대각선에 수직인 방향 (퍼짐의 10%)
고유값이 곧 그 방향의 분산입니다. 그래서 큰 순서대로 늘어놓고 위에서 몇 개만 남기면 차원이 줄어듭니다. 공분산 행렬은 대칭 행렬이라서 고유벡터들을 서로 수직이 되게 잡을 수 있다는 점이 핵심입니다. 새 축들이 서로 직각이므로 자를 바꾸는 일이 깔끔한 회전이 됩니다.
4-6. SVD와의 관계
새로운 것: 특이값 분해
데이터 행렬 를 특이값 분해하면 같은 답이 나옵니다. 의 특이값을 제곱해서 으로 나눈 것이 공분산 행렬의 고유값과 같습니다. 우리 예시에서 의 특이값을 제곱하면 3.6과 0.4가 나옵니다. 그래서 실제 프로그램은 공분산 행렬을 따로 만들지 않고 SVD로 PCA를 계산하는 경우가 많습니다.
5. 손으로 직접 계산해 보기
계산기 없이 연필만으로 3절의 점 5개를 PCA 해 봅시다. 한 단계씩 따라 쓰면 됩니다.
1단계. 평균이 0인지 확인합니다.
둘 다 0이니 그대로 써도 됩니다. (평균이 0이 아니었다면 먼저 모든 값에서 평균을 빼야 해요.)
2단계. 분산과 공분산을 구합니다. 평균이 0이므로 제곱의 평균, 곱의 평균이면 됩니다.
그래서 공분산 행렬은
3단계. 고유값을 구합니다. 를 으로 고쳐 쓰면, 인 해가 있으려면 행렬 의 행렬식이 0이어야 합니다.
이것은 에 대한 이차방정식이에요. 중3에서 배운 대로 이면 이므로
검산: 두 고유값의 합 는 의 대각선 합 와 같고, 곱 는 와 같습니다. (이 두 가지는 2×2 행렬이면 언제나 성립하는 좋은 검산법이에요.)
4단계. 고유벡터를 구합니다. 일 때 은
그래서 방향은 . 길이를 1로 맞추려고 로 나누면 입니다.
일 때는 이므로 , 곧 . 방향 을 길이 1로 맞추면 입니다.
5단계. 두 축이 수직인지 확인합니다.
내적이 0이니 두 축은 직각입니다. 공분산 행렬이 대칭이라서 이렇게 됩니다.
6단계. 설명하는 비율과 새 좌표를 구합니다.
첫 번째 축 하나가 퍼짐의 90% 를 담고 있어요. 점 D 의 새 좌표는 각 축과의 내적으로
이고, 만 남기면 점 D를 로 되살립니다. 원래 점과의 거리² 는 이고, 이것이 바로 버려진 입니다. 4-4절에서 본 피타고라스 관계가 점 하나에서도 그대로 확인됩니다.
연습 문제
공분산 행렬이 일 때, 두 고유값과 첫 번째 주성분이 설명하는 비율을 구해 보세요. (힌트: 입니다.)
정답 보기
이므로 , 곧 또는 입니다. 합 은 대각선 합 와 같아요. 첫 번째 주성분이 설명하는 비율은 이고, 고유벡터는 과 입니다.
6. 코드로 확인하기
앞 절의 손계산은 아래 코드로도 검산했습니다. 파이썬에서 numpy만 있으면 됩니다.
import numpy as np
P = np.array([(-2, -2), (-1, 0), (0, -1), (1, 2), (2, 1)], float) # 점 5개, 평균 0
X = P.T # 열이 한 점
C = X @ X.T / 5 # 공분산 행렬
w, E = np.linalg.eigh(C) # 고유값(작은 것부터), 고유벡터(열)
print(C) # [[2. 1.6] [1.6 2.]]
print(w, w / w.sum()) # [0.4 3.6] [0.1 0.9]
실제 데이터에서는 보통 scikit-learn의 PCA를 씁니다(내부는 SVD). 그때 변수마다 단위가 다르면 먼저 표준화해야 합니다(아래 "흔한 오해").
7. 흔한 오해와 한계
- 평균부터 빼야 합니다. 위의 식은 평균이 0인 데이터를 가정합니다. 평균을 빼지 않으면 공분산이 아닙니다.
- 단위가 다르면 표준화하세요. 킬로미터와 센티미터 변수가 섞이면 숫자가 큰 변수가 분산을 독차지해서 주성분이 그 변수를 따라갑니다.
- 분산이 크다고 중요한 정보라는 보장은 없습니다. PCA는 "분산이 큰 방향에 신호가 있다"는 가정을 깔고 있습니다. 중요한 신호가 작게 퍼져 있으면 버려질 수 있어요.
- 직선(선형) 구조만 봅니다. 데이터가 휘어진 모양이면 PCA의 직선 축으로는 잘 요약되지 않습니다.
- 주성분은 원래 변수가 아닙니다. 새 축은 원래 변수들의 섞음이라서, "이 축이 무엇을 뜻하는지"는 사람이 해석해야 합니다.
- 설명된 분산 비율은 예측력이 아닙니다. 90%를 설명한다는 말은 "퍼짐의 90%를 담았다"는 뜻이지 "예측이 90% 맞는다"는 뜻이 아닙니다.
8. 뿌리 개념 지도
| 이 글의 개념 | 중학 | 고등 | 대학 1학년 | 물리·과학에서는 |
|---|---|---|---|---|
| 좌표, 점의 위치 | 좌표평면, 점의 좌표 | 평면벡터의 성분 | 의 벡터 | 위치 벡터 |
| 정사영(그림자) | 직각삼각형, 삼각비 | 평면벡터의 내적 | 정사영, 내적 공간 | 힘의 성분, 일(힘×이동 방향 성분) |
| 오차와 남는 정보의 관계 | 피타고라스 정리 | 거리 공식 | 직교 분해 | 벡터의 크기² = 직교 성분²의 합 |
| 퍼진 정도 | 평균, 중앙값 | 분산, 표준편차 | 공분산 행렬 | 측정 잡음, 신호 대 잡음비 |
| 고유값을 구하는 식 | 이차방정식, 인수분해 | 이차방정식의 해와 판별식 | 행렬식 | — |
| 방향이 안 바뀌는 벡터 | — | — | 고유값·고유벡터 | 진동의 고유 모드, 강체의 관성 주축 |
| 행렬의 분해 | — | — | 특이값 분해(SVD) | 이미지·신호 압축 |
학교급 배치는 교육과정 문서로 아직 대조하지 못했습니다. 개정마다 단원 위치가 달라질 수 있으니, 참고용으로 봐 주세요. 행렬은 대학 1학년에서 처음 다루는 경우가 많습니다.
우리 사이트의 중학수학(피타고라스 정리, 좌표)과 수능수학, 데이터분석 학습 경로(LA04 내적, LA20 투영, LA24 고유값·고유벡터, LA26 PCA, LA29 SVD)에서 각 개념을 문제로 연습할 수 있어요.
9. 한 줄 요약
PCA는 데이터의 분산을 가장 잘 설명하는 직교하는 축들을 찾아(공분산 행렬의 고유벡터), 그중 위쪽 몇 개의 축으로만 데이터를 나타내서, 버려지는 정보(오차)를 가장 작게 하는 차원 축소 방법입니다.
읽을거리
- 이 글이 따라간 튜토리얼: J. Shlens, A Tutorial on Principal Component Analysis, 2014, arXiv:1404.1100 (영어, 선형대수 지식을 가정하고 직관과 증명을 함께 다룸)
- 역사적 원 논문(원문은 확인하지 못했고 서지만 적습니다): K. Pearson (1901), H. Hotelling (1933). 서지는 이 글 맨 아래 "출처"에 있습니다.
