PCA: 주성분 분석
PCA(principal component analysis, 주성분 분석)는 숫자로 된 특징이 많은 데이터에서 큰 변화 방향을 찾아 축의 수를 줄이는 통계 방법입니다. 원래 특징을 하나씩 버리는 대신, 여러 특징을 조합해 PC1, PC2 같은 새로운 축을 만듭니다.
PCA 산점도의 점 하나는 원래 행 하나입니다. 가까운 점은 입력한 특징들의 전체 패턴이 비슷하고, 먼 점은 다르다는 뜻입니다. 왜 비슷하거나 다른지는 PCA가 정답으로 알려 주지 않으므로 행에 붙은 그룹, 시점, 장비 같은 정보를 함께 봐야 합니다.
많은 숫자 열을 PC1과 PC2 두 열로 바꾼다
섹션 제목: “많은 숫자 열을 PC1과 PC2 두 열로 바꾼다”서버 100대에서 수집한 지표가 다음 DataFrame에 들어 있다고 해봅시다.
| server | cpu | memory | latency | error_rate | … |
|---|---|---|---|---|---|
S1 | 42 | 68 | 103 | 0.01 | … |
S2 | 39 | 71 | 98 | 0.01 | … |
S3 | 91 | 84 | 430 | 0.12 | … |
각 행은 관측치 하나이고, 각 숫자 열은 관측치를 표현하는 특징 하나입니다. 특징이 5,000개라면 서버 하나는 숫자 5,000개를 원소로 가진 벡터가 됩니다. 사람이 이 공간을 직접 그릴 수 없으므로 PCA가 원래 열들을 조합해 새 열을 만듭니다.
| server | PC1 | PC2 |
|---|---|---|
S1 | -18.4 | 3.2 |
S2 | -17.1 | 2.7 |
S3 | 21.6 | -1.4 |
PC1과 PC2는 CPU나 latency처럼 원래 측정한 특징이 아닙니다. 여러 특징에 서로 다른 가중치를 곱해 더한 새 좌표입니다. 이 두 열을 x축과 y축으로 사용하면 행 100개를 평면에 그릴 수 있습니다.
PCA가 축을 고르는 네 단계
섹션 제목: “PCA가 축을 고르는 네 단계”PCA는 다음 순서로 새 좌표축을 만듭니다.
- 각 특징에서 그 특징의 평균을 빼 중심을 0으로 옮깁니다.
- 관측치들이 가장 넓게 퍼지는 방향을 찾아
PC1로 정합니다. PC1과 직각이면서 남은 변화가 가장 큰 방향을 찾아PC2로 정합니다.- 각 관측치를
(PC1, PC2)좌표로 투영해 평면에 그립니다.
아래 가상 데이터에서 점 하나는 관측치 하나이고, 가로축과 세로축은 숫자 특징 두 개입니다. 후보 축을 돌리면 각 점이 주황색 투영점으로 눌려 붙습니다. 투영점의 퍼짐이 가장 커지는 방향이 PC1입니다.
행렬을 X, 특징별 가중치를 모은 행렬을 W라고 하면 새 좌표는 다음처럼 쓸 수 있습니다.
Z의 행은 원래 관측치이고 열은 새 축입니다. 관측치의 새 좌표를 score, 각 특징이 축을 만드는 데 사용된 가중치를 loading이라고 부릅니다.
점과 거리를 읽는 법
섹션 제목: “점과 거리를 읽는 법”PCA 산점도에서 확인할 대상은 네 가지입니다.
- 점 하나: 입력 행렬의 행 하나입니다.
- 점 사이 거리: 사용한 특징과 전처리 기준에서 전체 숫자 패턴이 얼마나 비슷한지 보여 줍니다.
- 점의 색과 모양: 그룹이나 측정 시점처럼 사람이 나중에 겹쳐 표시한 metadata입니다.
- 멀리 떨어진 점: 실제로 독특한 관측치일 수도 있고, 측정이나 라벨 문제일 수도 있는 확인 대상입니다.
PCA는 그룹 라벨을 보지 않고 축을 만드는 비지도 분석입니다. 색으로 표시한 두 그룹이 갈라졌다면 PCA가 그룹을 학습해 분류한 것이 아니라, 라벨 없이 찾은 큰 변화 방향이 그 그룹과 잘 대응한 것입니다.
PC1 40%는 무엇의 40%인가
섹션 제목: “PC1 40%는 무엇의 40%인가”축 이름 옆의 백분율은 설명 분산 비율(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는 탐색 도구이며, 유전자마다 조건 효과를 검정하는 차등 발현 분석을 대신하지 않습니다.
그림을 읽을 때 확인할 질문
섹션 제목: “그림을 읽을 때 확인할 질문”- 점 하나가 어떤 관측 단위인가?
- PCA에 어떤 특징과 전처리된 값을 넣었는가?
- PC1과 PC2가 설명하는 분산은 각각 몇 퍼센트인가?
- 그룹뿐 아니라 시점, 장비, 배치 같은 metadata로도 색칠해 봤는가?
- 멀리 떨어진 점의 측정 품질과 metadata를 확인했는가?
- 분리의 원인을 PCA 그림만으로 단정하고 있지는 않은가?
PCA를 UMAP과 비교하거나 고차원 거리의 의미를 더 살펴보려면 거리와 차원축소를 이어서 읽으세요.