Contents

[-]
1 Data Sample
2 주성분 분석
3 해석
4 종합순위
5 참고자료


먼저 고유값과 고유벡터를 이해하자.

1 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);

2 주성분 분석 #

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)

3 해석 #

  • 주성분
    • 제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


4 종합순위 #

영어 <- 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(수학))

5 참고자료 #