콘텐츠로 이동

PCA: 주성분 분석

PCA(principal component analysis, 주성분 분석)는 숫자로 된 특징이 많은 데이터에서 큰 변화 방향을 찾아 축의 수를 줄이는 통계 방법입니다. 원래 특징을 하나씩 버리는 대신, 여러 특징을 조합해 PC1, PC2 같은 새로운 축을 만듭니다.

PCA 산점도의 점 하나는 원래 행 하나입니다. 가까운 점은 입력한 특징들의 전체 패턴이 비슷하고, 먼 점은 다르다는 뜻입니다. 왜 비슷하거나 다른지는 PCA가 정답으로 알려 주지 않으므로 행에 붙은 그룹, 시점, 장비 같은 정보를 함께 봐야 합니다.

많은 숫자 열을 PC1과 PC2 두 열로 바꾼다

섹션 제목: “많은 숫자 열을 PC1과 PC2 두 열로 바꾼다”

서버 100대에서 수집한 지표가 다음 DataFrame에 들어 있다고 해봅시다.

servercpumemorylatencyerror_rate
S142681030.01
S23971980.01
S391844300.12

각 행은 관측치 하나이고, 각 숫자 열은 관측치를 표현하는 특징 하나입니다. 특징이 5,000개라면 서버 하나는 숫자 5,000개를 원소로 가진 벡터가 됩니다. 사람이 이 공간을 직접 그릴 수 없으므로 PCA가 원래 열들을 조합해 새 열을 만듭니다.

serverPC1PC2
S1-18.43.2
S2-17.12.7
S321.6-1.4

PC1PC2는 CPU나 latency처럼 원래 측정한 특징이 아닙니다. 여러 특징에 서로 다른 가중치를 곱해 더한 새 좌표입니다. 이 두 열을 x축과 y축으로 사용하면 행 100개를 평면에 그릴 수 있습니다.

PCA는 다음 순서로 새 좌표축을 만듭니다.

  1. 각 특징에서 그 특징의 평균을 빼 중심을 0으로 옮깁니다.
  2. 관측치들이 가장 넓게 퍼지는 방향을 찾아 PC1로 정합니다.
  3. PC1과 직각이면서 남은 변화가 가장 큰 방향을 찾아 PC2로 정합니다.
  4. 각 관측치를 (PC1, PC2) 좌표로 투영해 평면에 그립니다.

아래 가상 데이터에서 점 하나는 관측치 하나이고, 가로축과 세로축은 숫자 특징 두 개입니다. 후보 축을 돌리면 각 점이 주황색 투영점으로 눌려 붙습니다. 투영점의 퍼짐이 가장 커지는 방향이 PC1입니다.

행렬을 X, 특징별 가중치를 모은 행렬을 W라고 하면 새 좌표는 다음처럼 쓸 수 있습니다.

Z=XcenteredWZ = X_{\text{centered}} W

Z의 행은 원래 관측치이고 열은 새 축입니다. 관측치의 새 좌표를 score, 각 특징이 축을 만드는 데 사용된 가중치를 loading이라고 부릅니다.

PCA 산점도에서 확인할 대상은 네 가지입니다.

  • 점 하나: 입력 행렬의 행 하나입니다.
  • 점 사이 거리: 사용한 특징과 전처리 기준에서 전체 숫자 패턴이 얼마나 비슷한지 보여 줍니다.
  • 점의 색과 모양: 그룹이나 측정 시점처럼 사람이 나중에 겹쳐 표시한 metadata입니다.
  • 멀리 떨어진 점: 실제로 독특한 관측치일 수도 있고, 측정이나 라벨 문제일 수도 있는 확인 대상입니다.

PCA는 그룹 라벨을 보지 않고 축을 만드는 비지도 분석입니다. 색으로 표시한 두 그룹이 갈라졌다면 PCA가 그룹을 학습해 분류한 것이 아니라, 라벨 없이 찾은 큰 변화 방향이 그 그룹과 잘 대응한 것입니다.

축 이름 옆의 백분율은 설명 분산 비율(explained variance ratio)입니다. PC1 40%라면 입력 행렬에서 관측치들이 보인 전체 변동 가운데 40%를 PC1 한 축이 담았다는 뜻입니다.

이 숫자는 다음 의미가 아닙니다.

  • 행의 40%를 올바르게 분류했다는 정확도
  • 특징의 40%를 그대로 보존했다는 비율
  • 어떤 그룹이 전체 변동의 40%를 만들었다는 인과 효과

PC1과 PC2가 각각 40%와 15%라면 2차원 그림은 전체 변동의 55%를 보여 줍니다. 나머지 45%는 PC3 이후 축에 남아 있으므로 평면에서 가까운 두 점도 다른 축에서는 차이가 날 수 있습니다.

좌우와 위아래는 뒤집힐 수 있다

섹션 제목: “좌우와 위아래는 뒤집힐 수 있다”

축의 모든 가중치에 -1을 곱해도 같은 변화 방향을 표현합니다. 따라서 같은 데이터를 다른 도구로 계산하면 한 그림의 PC1 오른쪽에 있던 그룹이 다른 그림에서는 왼쪽에 나타날 수 있습니다.

이 부호 반전은 오류가 아닙니다. 점 사이 거리, 그룹 분리, 설명 분산 비율은 그대로입니다. 그림을 비교할 때는 절대적인 좌우보다 어떤 점이 함께 모이고 어떤 그룹이 갈라지는지를 봅니다.

어떤 특징이 축을 만들었는지는 loading으로 본다

섹션 제목: “어떤 특징이 축을 만들었는지는 loading으로 본다”

산점도는 관측치 사이의 관계를 보여 주지만, 어떤 특징이 축에 크게 기여했는지는 직접 보여 주지 않습니다. PC1에서 절댓값이 큰 loading을 가진 특징을 찾으면 관측치를 PC1 방향으로 나누는 데 크게 기여한 열을 확인할 수 있습니다.

loading의 양수와 음수는 축의 어느 방향과 연결되는지를 나타냅니다. 축 전체의 부호가 뒤집힐 수 있으므로 양수는 항상 A 그룹처럼 고정해서 해석하지 않습니다. 같은 실행에서 얻은 점의 위치와 loading 방향을 함께 읽습니다.

PCA는 숫자의 단위와 크기에 영향을 받습니다. CPU 사용률은 0~100, 요청 수는 수백만 단위라면 요청 수의 변동이 거리를 지배할 수 있습니다. 그래서 각 특징의 의미와 분포를 확인한 뒤 변환이나 표준화를 선택합니다.

scikit-learn의 PCA는 특징의 평균을 빼는 centering은 하지만, 표준편차를 1로 만드는 scaling은 자동으로 하지 않습니다. 모든 특징을 z-score로 바꾸면 작은 단위의 특징과 큰 단위의 특징에 같은 비중을 주는 다른 분석이 됩니다. 관습적으로 적용하기보다 질문에 맞는 선택인지 판단해야 합니다.

분산이 평균에 따라 커지는 데이터라면 VST처럼 평균과 분산의 관계를 완화하는 변환이 도움이 될 수 있습니다.

사례: 유전자 발현 행렬에 적용하면

섹션 제목: “사례: 유전자 발현 행렬에 적용하면”

RNA-seq 발현 행렬에서는 행 하나가 샘플, 열 하나가 유전자입니다. 유전자가 20,000개라면 샘플 하나는 원소가 20,000개인 벡터이고, PCA는 이 벡터들을 PC1과 PC2 좌표로 줄여 샘플 관계를 보여 줍니다.

raw count는 평균이 큰 유전자일수록 분산도 커지고 샘플마다 시퀀싱 깊이도 다릅니다. PCA 전에 낮은 count와 특수 카운터를 정리하고, 시퀀싱 깊이를 고려한 뒤 VST나 rlog처럼 count의 평균과 분산 관계를 완화하는 변환을 적용하는 경우가 많습니다.

PCA에서 조건별 샘플이 분리되면 조건이 전체 발현 패턴의 큰 차이와 연결됐다는 단서가 됩니다. 다만 batch나 조직(tissue) 특성, 품질 차이가 조건과 함께 움직여도 같은 분리를 만들 수 있습니다. PCA는 탐색 도구이며, 유전자마다 조건 효과를 검정하는 차등 발현 분석을 대신하지 않습니다.

  1. 점 하나가 어떤 관측 단위인가?
  2. PCA에 어떤 특징과 전처리된 값을 넣었는가?
  3. PC1과 PC2가 설명하는 분산은 각각 몇 퍼센트인가?
  4. 그룹뿐 아니라 시점, 장비, 배치 같은 metadata로도 색칠해 봤는가?
  5. 멀리 떨어진 점의 측정 품질과 metadata를 확인했는가?
  6. 분리의 원인을 PCA 그림만으로 단정하고 있지는 않은가?

PCA를 UMAP과 비교하거나 고차원 거리의 의미를 더 살펴보려면 거리와 차원축소를 이어서 읽으세요.