princomp( )는 PCA를 위해 사용하는 함수다. princomp( ) 수행 뒤 결과의 scores에는 재표현된 좌표가 저장되어 있다.
princomp : 주성분 분석을 수행한다. |
princomp( x, # 행렬 또는 데이터 프레임 cor=FALSE # cor=FALSE면 공분산 행렬, TRUE면 상관 행렬을 사용한 주성분 분석을 한다. ) 반환 값은 princomp 클래스의 객체로, 여러 값을 저장한 리스트기도 하다. 리스트에 저장된 값 중 scores는 주성분 점수다. |
1:10을 저장한 x, 여기에 약간의 노이즈를 추가한 y, x + y에 약간의 노이즈를 추가한 z가 있을 때 이 데이터에 주성분 분석을 수행해보자.
> x <- 1:10 > y <- x + runif(10, min=-.5, max=.5) > z <- x + y + runif(10, min=-10, max=.10) > (data <- data.frame(x, y, z)) x y z 1 1 0.7875775 1.451594 2 2 2.2883051 -1.133020 3 3 2.9089769 2.752440 4 4 4.3830174 4.166615 5 5 5.4404673 1.480007 6 6 5.5455565 10.633789 7 7 7.0281055 6.513592 8 8 8.3924190 6.817220 9 9 9.0514350 11.363434 10 10 9.9566147 19.597102 > pr <- princomp(data) > summary(pr) Importance of components: Comp.1 Comp.2 Comp.3 Standard deviation 6.8598441 1.89730048 0.1269037565 Proportion of Variance 0.9286438 0.07103836 0.0003178115 Cumulative Proportion 0.9286438 0.99968219 1.0000000000
주성분 분석 수행 후 summary( )를 보면 주성분들이 원 데이터의 분산 중 얼마만큼을 설명해주는지를 알 수 있다. Proportion of Variance 행을 보면 첫 번째 주성분은 데이터의 분산 중 92.86%를 설명해주며, 두 번째 주성분은 데이터의 분산 중 7.1%를 설명함을 알 수 있다. 세 번째 주성분은 가장 작은 0.03%의 분산을 설명한다. 마지막 행의 Cumulative Proportion은 Proportion of Variance의 누적 값이다.
결국 원 데이터의 분산은 첫 번째와 두 번째 주성분에 의해 99.97%가 표현됨을 알 수 있다. 이들 두 주성분상의 좌표는 scores를 보고 구하면 된다. 다음 코드에서 Comp.1, Comp.2 두 컬럼은 x, y, z를 2개 차원으로 축약한 결과다.
> pr$scores[, 1:2]
Comp.1 Comp.2
[1,] 7.703254 2.82720720
[2,] 8.903331 -0.08428571
[3,] 5.021586 1.09504330
[4,] 2.883425 0.37848958
[5,] 4.338128 -2.30284349
[6,] -3.758276 2.07791966
[7,] -1.265424 -1.65813435
[8,] -2.431770 -2.90876850
[9,] -6.881441 -1.39430727
[10,] -14.512812 1.96967957