#title 주성분 분석 [[TableOfContents]] 먼저 [고유값과 고유벡터]를 이해하자. ==== Data Sample ==== {{{ use tempdb go if object_id('dbo.pc') is not null drop table dbo.pc; create table dbo.pc( 학생 varchar(20) , 국어 int , 영어 int , 수학 int ); insert dbo.pc values('A', 1, 2, 3); insert dbo.pc values('B', 2, 1, 2); insert dbo.pc values('C', 3, 3, 1); insert dbo.pc values('D', 4, 5, 5); insert dbo.pc values('E', 5, 4, 4); }}} ==== 주성분 분석 ==== {{{ library("RODBC") conn <- odbcConnect("26") data <- sqlQuery(conn, "SELECT 국어, 영어, 수학 FROM tempdb.dbo.pc") p <- prcomp(na.exclude(data), scale=FALSE) #데이터의 단위가 다를 경우 scale=TRUE p Standard deviations: [1] 1.5299582 0.7125957 0.3891468 Rotation: PC1 PC2 PC3 국어 0.5708394 0.6158420 0.5430295 영어 0.6210178 0.1087985 -0.7762086 수학 0.5371026 -0.7803214 0.3203424 summary(p) Importance of components: PC1 PC2 PC3 Standard deviation 1.53 0.713 0.3891 --> 표준편차 Proportion of Variance 0.78 0.169 0.0505 --> 기여율 Cumulative Proportion 0.78 0.950 1.0000 --> 누적기여율 predict(p) PC1 PC2 PC3 1 -1.762697 -1.3404825 -0.3098503 2 -2.349978 -0.0531175 0.6890453 3 -1.074205 1.5606429 -0.6406848 4 2.887080 -0.7272039 -0.3687029 5 2.299799 0.5601610 0.6301927 > biplot(p) plot(p) }}} ==== 해석 ==== * 주성분 * 제1주성분: z1 = 0.57x1 + 0.62x2 + 0.54x3, 기여율 = 78% * 제2주성분: z2 = 0.62x1 + 0.11x2 - 0.78x3, 기여율 = 17% * 제3주성분: z3 = 0.54x1 - 0.78x2 + 0.32x3, 기여율 = 5% * 제1주성분: 모두 양수로 종합순위를 나타내는 주성분으로 해석할 수 있다. * 제2주성분: x3(수학)의 계수가 음수라는 것은 수학순위가 내려갈수록 종합 순위가 떨어짐을 의미한다. 즉, 종합순위는 수학점수에 따라 결정될 확률이 높다고 해석할 수 있다. * 제2주성분까지 누적기여율이 95%이지만, 종합순위는 제1주성분만으로 충분히 설명됨. * 정해진 바는 없지만 일반적으로 70~80%이상의 기여율까지 채택함. {{{ select 학생 , 국어 , 영어 , 수학 , 0.57 * (국어-국어평균) + 0.62 * (영어-영어평균) + 0.54 * (수학-수학평균) 제1주성분점수 , 국어 + 영어 + 수학 총점 from pc }}} ==== 종합순위 ==== {{{ 영어 <- c(85,30,40,75,55,55,70,30) 수학 <- c(60,40,30,60,45, 65,40,20) d <- data.frame(영어,수학) head(d) p <- princomp(d) #prcomp:고유벡터이용, princomp:특이값 분해이용 summary(p) biplot(p) plot(p) }}} {{{ > p Call: princomp(x = d) Standard deviations: Comp.1 Comp.2 22.746992 8.736382 2 variables and 8 observations. > summary(p) Importance of components: Comp.1 Comp.2 Standard deviation 22.7469916 8.7363823 Proportion of Variance 0.8714537 0.1285463 Cumulative Proportion 0.8714537 1.0000000 > p$loadings [1:2, 1:2] Comp.1 Comp.2 영어 -0.8228691 0.5682310 수학 -0.5682310 -0.8228691 > p$scores Comp.1 Comp.2 [1,] -33.209538 4.7038937 [2,] 23.412882 -10.0914296 [3,] 20.866501 3.8195713 [4,] -24.980847 -0.9784163 [5,] 0.000000 0.0000000 [6,] -11.364620 -16.4573817 [7,] -9.501881 12.6378104 [8,] 34.777502 6.3659521 > #최종점수 > p$scores[,1] * -1 [1] 33.209538 -23.412882 -20.866501 24.980847 0.000000 11.364620 [7] 9.501881 -34.777502 }}} * 주성분분석의 Score의 부호가 반대다. 그래서 -1을 곱해줬다. * 첫번째 학생의 주성분 점수를 계산하면 (-0.822869 * (85-55) + -0.5682310 * (60-45)) * -1 다. 단계를 밟아가면.. {{{ 영어 <- c(85,30,40,75,55,55,70,30) 수학 <- c(60,40,30,60,45, 65,40,20) d <- data.frame(영어,수학) cov.mat <- cov.wt(d, cor=TRUE)$cov e.vec <- eigen(cor.mat)$vectors comp1 <- e.vec[1,1]*(영어 - mean(영어)) + e.vec[2,1]*(수학 - mean(수학)) comp2 <- e.vec[1,2]*(영어 - mean(영어)) + e.vec[2,2]*(수학 - mean(수학)) }}} ==== 참고자료 ==== * http://blog.naver.com/skkong89/90117511177 --> 자세한 설명 * [https://www.r-bloggers.com/multi-dimensional-reduction-and-visualisation-with-t-sne/ Multi-Dimensional Reduction and Visualisation with t-SNE]