PCA의 누적 기여율 80%로 충분할까? 분산과 분류 성능이 일치하지 않는 데이터를 만들어 검증하다
요약
본 글은 주성분 분석(PCA)의 누적 기여율 기준이 항상 최적인지에 대해 의문을 제기합니다. PCA는 데이터의 분산(흩어짐)을 최대화하는 방향을 찾지만, 이 흩어짐이 분류에 필요한 정보와 일치하지 않을 수 있음을 실험으로 증명했습니다.
핵심 포인트
- PCA는 데이터의 '분산'을 기준으로 주성분을 추출합니다.
- 누적 기여율은 데이터 전체의 흩어짐 설명 정도를 의미할 뿐입니다.
- 높은 기여율의 성분이 분류에 무용지물일 수 있습니다. (예: 제1주성분)
- 낮은 기여율의 성분만으로도 높은 분류 성능을 얻을 수 있습니다. (예: 제2주성분)
주성분 분석(PCA)을 거친 후, 반드시 결정해야 하는 것이 있다. 몇 개를 남길지다.
정석적인 답은 정해져 있다.
누적 기여율이 80%(혹은 90%)를 넘는 지점까지 남기는 것이다.
나도 그렇게 해왔다. 세 줄로 설명할 수 있고, 근거를 물어도 '원래 정보의 8할을 보존하고 있습니다'라고 말할 수 있다.
헷갈렸던 부분은, 기여율이 '무엇의' 8할인지였다. 실제로 측정해보니, 기여율 88.57%의 성분에는 분류에 대한 단서가 하나도 없었고, 버려지는 기여율 1.88%의 성분만으로 정확도 0.95를 얻었다.
실험에 사용한 코드 전문은 GitHub에 올렸습니다.
주성분 분석이 무엇을 하는지, 30초 만에
먼저 용어를 통일하겠습니다. 이미 알고 계신 분은 다음 절로 건너뛰셔도 됩니다.
100개의 항목이 있는 설문조사 데이터를 상상해 보세요. 100개 열이 있으면 다루기 어려우므로, 비슷한 움직임을 하는 열을 모아서 적은 본수로 다시 표현하고 싶다는 것이 PCA의 목적입니다.
PCA는 데이터가 가장 크게 흩어져 있는 방향을 찾습니다. 그 방향을 제1주성분이라고 부릅니다. 다음으로, 그것과 직교하는 방향 중 가장 흩어져 있는 방향을 제2주성분으로 합니다. 아래와 같이 나열해 나갑니다.
- 기여율(Contribution Rate): 그 방향이 데이터 전체의 흩어짐 중 몇 %를 차지하고 있는지 -
- 누적 기여율(Cumulative Contribution Rate): 상위 k개 본수까지의 기여율 합계
따라서 '누적 기여율 80%까지 남긴다'는 것은, 데이터의 흩어짐의 8할을 설명할 수 있는 지점까지 남긴다는 의미가 됩니다.
여기서 문제가 되는 것이, 흩어짐이 크다는 것과 우리가 알고 싶은 정보가 들어있다는 것은 별개라는 점입니다.
키와 몸무게 데이터로 남녀를 구분하고 싶다고 가정해 봅시다. 가장 흩어져 있는 방향은 '몸집이 크다/작다'의 방향일 수 있습니다. 하지만 그것은 남녀 모두에게 존재합니다. 남녀를 나누는 것은, 흩어짐이 더 작지만 별개의 방향일 수 있습니다. PCA는 전자를 우선하여 남기고, 후자를 버립니다.
이렇게 되면 어떻게 될까요? 실제로 해봤습니다.
먼저, 가장 까다로운 데이터를 만들어 본다
20개 열의 데이터를 준비했습니다. 만드는 방법은 이렇습니다.
- 모든 열에 공통으로 작용하는 강한 변동을 하나 넣었습니다. 이것이 흩어짐 대부분을 만듭니다. 공장 센서로 치면 '그날의 기온'처럼, 모든 측정값을 한꺼번에 올리거나 내리는 요인 - 클래스 A와 클래스 B를 나누는 것은,
그 변동과 직교하는 방향(앞쪽 10개 열과 뒤쪽 10개 열의 차이)에 넣은 작은 오차뿐입니다.
즉, '크게 움직이는 방향'과 '알고 싶은 정보가 들어있는 방향'을 의도적으로 분리했습니다.
주성분 분석을 했더니 이렇게 되었습니다.

위아래 모두, 파란색이 클래스 A, 분홍색이 클래스 B의 분포입니다.
상단의 제1주성분은 흩어짐의 88.57%를 설명하지만, 분류에는 아무것도 할 수 없습니다. 두 색상이 완전히 겹쳐져 있습니다. 이 한 본수로 분류하면 정확도 0.486—동전을 던지는 것과 같습니다.
하단의 제2주성분은 기여율이 1.88%입니다. 그런데도 두 색상이 깔끔하게 분리되어 있고, 이 한 본수만으로 정확도 0.952가 나옵니다.
자, 누적 기여율로 자르면 어떻게 될까요? 제1주성분만으로 88.57%가 있으므로, 80% 기준은 k=1에서 충족됩니다. 거기서 잘라내면, 남는 것은 분류에 아무 쓸모가 없는 한 본수뿐입니다.
| 남기는 방식 | 누적 기여율 | 분류 정확도 |
|---|---|---|
| 누적 80%로 자르기 (k=1) | 88.6% | 0.486 |
| ... | ||
| '정보의 88%를 남긴' 한 본수보다, '정보가 2%밖에 없는' 한 본수가 더 강력합니다. |
주성분별로, 그 한 본수만으로 분류했을 때의 정확도를 나열하면 이렇게 됩니다.

회색 막대(기여율)와 분홍색 꺾은선(쓸모가 있는지). 이 둘 사이에는 아무 관계가 없습니다.
실제 데이터에서는, 80%는 오히려 여유롭다
까다로운 데이터에서 무너지는 것은 당연하다고 들릴 것 같아, 실제 데이터에서도 측정해봤습니다. 손글씨 숫자 이미지(64열)와 유방암 진단 데이터(30열). 둘 다 자주 사용되는 연습용 데이터셋입니다.
주성분 개수 k를 한 본수씩 늘리면서, 그때마다 분류 정확도를 교차 검증으로 측정했습니다.

파란색이 누적 기여율, 분홍색이 분류 정확도입니다.
| 데이터 | 모두 사용한 정확도 | 누적 80%가 되는 k | 그때의 정확도 |
|---|---|---|
| 손글씨 숫자 (64열) | 0.9188 | 21 | 0.9054 |
| 유방암 (30열) | 0.9807 | 5 | 0.9719 |
망가지지 않았다. 게다가 분홍색 선이 파란 선보다 왼쪽에 있다. 유방암은 k=2(누적 63.2%)에서 정확도 0.953, 손글씨 숫자는 k=15(누적 70.9%)에서 0.904로 이미 충분하다. 80%까지 남기는 것은 이 두 가지 데이터에서는 오히려 과분하다.**
여기서 중요한 점이 있다. 80%가 안전했던 것이 아니라, 우연히 산포도가 큰 방향에 라벨 정보가 실려 있었을 뿐이다.
손글씨 숫자의 경우 산포도가 큰 방향은 '선의 굵기'나 '기울기'이며, 이는 숫자 구별에도 효과적이다. 산포도의 근원과 라벨의 근원이 같은 것에서 오기 때문에 두 가지가 일치한다. 자연스러운 데이터에서는 이렇게 되기 쉽다.
합성 데이터를 사용한 것은 그 일치를 깨뜨리기 위함이었다. 그리고 현실적인 데이터에서도, 공통의 강한 변동 요인이 있어 라벨이 그것과 무관할 때 같은 일이 발생한다. 센서 개체 차이, 촬영일 조명, 부서별 기입 습관 등—산포도는 크지만 알고 싶은 것과는 관계없는 요인은 실무 데이터에 얼마든지 있다.
표준화를 건너뛰면 제1 주성분의 정체는 '면적'이 된다
또 다른 실무에서 빠지기 쉬운 함정도 측정해 보았다.
유방암 데이터는 열마다 단위가 다르다. 면적은 3자리 값을 취하고, 매끄러움(smoothness)은 0.1 미만이다. PCA는 '산포도가 큰 방향'을 찾기 때문에, 단순히 단위가 크다는 이유만으로 그 열이 주역이 되어버린다. 이를 방지하는 것이 표준화(각 열을 평균 0, 표준편차 1로 맞추는 전처리)다.
건너뛰면 어떻게 되는가.

| 제1 주성분 기여율 | 80% 도달에 필요한 k | 그때의 정확도 |
|---|---|---|
| 표준화 안 함 | 98.2% | 1 |
| 표준화함 | 44.3% | 5 |
표준화를 하지 않으면 제1 주성분 기여율이 98.2%가 된다. 숫자만 보면 '하나로 전부 설명할 수 있었다'고 보일 것 같다.
내용을 살펴보면, worst area (가중치 0.852)와 mean area (0.517)—오직 면적 두 열로 이루어져 있었다. 이 두 열은 표준편차가 각각 568.9와 351.6으로 다른 열보다 두 자릿수 크다.
PCA가 찾아낸 것은 데이터의 구조가 아니라 단위였다.
그리고 '누적 기여율 80%' 기준은 이때 k=1을 반환한다. 정확도는 0.9069이다. 표준화한 후 같은 기준으로 자르면 k=5에서 0.9719가 되므로, 표준화를 건너뛴 대가가 6.5 포인트가 된다.
무엇을 기준으로 삼아야 하는가
실측을 통해 말할 수 있는 것을 정리한다.
누적 기여율은 '원래 데이터를 복원할 수 있는지'의 지표이지, '하고 싶은 일을 할 수 있는지'의 지표가 아니다. 이 두 가지는 산포도의 근원과 라벨의 근원이 같을 때만 일치한다. 일치하는지 여부는 기여율을 봐도 알 수 없다.
따라서 분류나 예측을 하고 있다면, 자를 개수는 그 태스크의 성적으로 결정하는 것이 가장 자연스럽다. k를 정하고 전처리를 포함한 Pipeline을 교차 검증으로 비교한다. 표준화와 PCA를 검증 데이터까지 포함하여 먼저 fit하면 데이터 누수(data leak)가 발생한다. 아래는 그 점을 수정한 실행 예시이며, 위의 표와 그림을 재계산한 결과가 아니다. scikit-learn의 데이터 누수에 관한 해설도 참조하라.
from sklearn.datasets import load_breast_cancer
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
...
기여율이 쓸모없는 장면이 있는 것은 아니다. 라벨이 없는 경우(시각화, 압축, 노이즈 제거)는 복원 여부가 곧 목적이기 때문에, 기여율로 자르는 것이 타당하다. 목적이 복원이라면 기여율, 목적이 예측이라면 예측 성적이라는 당연한 기본으로 돌아간다.
요약
- 상관관계가 높은 20개 열의 데이터에서,
제1 주성분은 기여율 88.57%에 분류 정확도 0.486(추측). 누적 80% 기준을 여기서 충족하므로, 자르면 정확도가 0.947에서 0.486으로 떨어짐 - 버려질 수 있음
제2 주성분은 기여율 1.88%, 그것만으로도 정확도 0.952 - 손글씨 숫자와 유방암 실데이터에서는 80%가 무너지지 않고, 오히려 여유로움. 정확도는 유방암의 경우 k=2(누적 63.2%)에서, 손글씨 숫자의 경우 k=15(누적 70.9%)에서 거의 포화 상태임 - 무너지지 않은 것은 기준이 옳기 때문이 아니라,
분산이 큰 방향에 레이블 정보가 실려 있었기 때문. 공통의 변동 요인(조명, 개체차, 기입 습관)이 있는 상황에서는 이 일치가 깨짐 - 표준화를 생략하면 제1 주성분의 기여율이 **98.2%**가 되지만, 내용은 면적 2개 열에만 해당함. 단위를 포착했을 뿐이며, 80% 기준에서의 정확도는 6.5 포인트 하락함 - 지도 학습(Supervised Learning)이라면, 자를 개수(k)는 반복 검증(Cross-Validation)을 통해 결정하면 됨. 수십 초 만에 끝남
이 실험의 범위와 재현 시 주의사항
본문 내 그림과 표는 원 실험 기록입니다. 원 실험에서는 표준화(Standardization)와 PCA를 모든 데이터에 fit한 후 분류기만 반복 검증을 했으며, 검증 측의 특징량 분포가 전처리 과정에 혼입되어 있습니다. 게재된 정확도는 엄격한 미지 데이터 성능으로 간주할 수 없습니다. 마지막 파이프라인 예시는 이 절차를 수정한 것이지만, 그림과 표의 수치를 재계산한 것은 아닙니다. 또한, 성분 수를 선택하는 데 사용된 CV의 최고값을 최종 성능으로 보고하지 않고, 별도의 테스트 데이터나 중첩 반복 검증(nested CV)으로 평가합니다.
이 글은 Shake AI Lab의 동명 주제 기사를 Zenn용으로 편집한 것입니다. 실험의 그림, 주요 코드, 결과는 본 기사 내에 게재하고, 전체 코드는 상단의 GitHub 링크에서 참조할 수 있습니다.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn ML의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기