
주성분분석
주성분 분석(PCA)은 고차원의 데이터를 저차원의 데이터로 환원시키는 기법이다.
주성분의 대수적 유도
-
m개의 서로 다른 P개의 확률변수들의 선형결합을 각각 P1,P2,...,Pm이라 하자
Ps=us′Yi
-
var(P1)≥var(P2)≥...≥var(Pm)
-
P1,P2,...,Pm는 서로 독립 <=> 고유벡터 u1,u2,...,uk는 서로 직교
-
∣uk∣=1 (내적이 1)
-
2~4를 만족하는 u1,u2,...,uk 구하는 문제는 다음과 같이 정의되는 Lk를 최소화하는 u1,u2,...,uk를 구하는 문제로 볼 수 있다.
L1=Var(P1)−λ1(u1′u1−1)=u1′Ru1−λ1(u1′u1−1)∂u1∂L1=2Ru1−2λ1u1=0L1=u1′Ru1−λ1(u1′u1−1)=λ1
L1의 최대값은 R의 고유값 중 최고값에 해당되고 u1은 이때의 고유벡터
Lj=VAR(Pj)−λj(uj′uj−1)k=1∑j−1δkjuj′uk=uj′Ruj−λj(uj′uj−1)k=1∑j−1δkjuj′uk∂uj∂L1=2Ruj−2λjuj−k∑δkjuk=0Ruj−λjuj−21k∑δkjuk=0uj∗Ruj−λjuj∗′uj−21k∑δkjuj∗uk=0uj∗Ruj−21δj∗j=uj∗λj∗uj−21δj∗j=−21δj∗j=0δj∗j=0Ruj−λjuj=0Lj=VAR(Pj)−λ(uj′uj−1)
-
u1,u2,...,uk는 R의 고유값 λ1≥λ2≥⋯≥λm에 대응되는 고유벡터
주성분의 설명력
- cov(Y)=R
- cov(P)=cov(U′Y)=U′cov(Y)U=Λ
- tr(cov(P))=tr(U′RU)=tr(RUU′)=tr(R)=tr(cov(Y))=k=1∑pλk
- Pj의 설명비율 : k=1∑pλkλj
- m개의 주성분 설명력: 상위 m개의 설명비율 합 tm=k=1∑pλkk=1∑mλk×100
- m을 선택하는 방법
1 ) 누적 설명력이 70%를 초과하는 성분들 중 최소 갯수
2 ) scrr graph: 고유값 크기 순으로 나열 (x,λx)를 꺾은 선으로 그래프 그린 후 elbow까지의 성분을 주성분으로 함
3 ) Kaiser Rule : 고유값이 1 이상인 성분을 주성분으로 함, 과다선정의 문제 있음
주성분 관한 R코드를 작성한다
##### 주성분분석 #####
#eigen 사용해 표본상관행렬의 고유값과 고유벡터 구함
eeR=eigen(cov(d2))
l1=eeR$values #고유값
eeR$vectors #고유벡터
l1/sum(l1)*100 #주성분점수
U=eeR$vectors
L=diag(eeR$values)
U%*%L%*%t(U)
cov(d2)
round(U%*%t(U),2)
###
Y=d2
Y11=matrix(Y[1,],ncol=1)
p11=t(U[,1])%*%Y11
p11b=p11=t(U[,1])%*%Y[1,]
p11;p11b
p1=Y%*%U[,1]
p1[1:3]
mean(p1)
sd(p1)
par(mfrow=c(1,2))
hist(p1)
qqplot(qnorm(ppoints(length(p1)),sd=sqrt(L[1,1])),p1)
qqline(p1,distribution = function(p) qnorm(p, sd=sqrt(L[1,1])))
###
p1=Y%*%U[,1]
p2=Y%*%U[,2]
require(KernSmooth)
z<- bkde2D(cbind(p1,p2),1)
persp(z$fhat,theta=0,phi=90)
Z<- bkde2D(Y[,1:2],1)
persp(Z$fhat,theta=0,phi=45)
plot(p1,p2)
##
#기타 그래프들
##
###주성분분석 실시
library(HSAUR)
data(heptathlon)
hep.data.tmp <- heptathlon
hep.data.tmp$hurdles <- max(hep.data.tmp$hurdles)-hep.data.tmp$hurdle
hep.data.tmp$run200m <- max(hep.data.tmp$run200m)-hep.data.tmp$run200m
hep.data.tmp$run800m <- max(hep.data.tmp$run800m)-hep.data.tmp$run800m
hep.data <- hep.data.tmp[,-8]
hep.data.tmp[,-8]
##
hep.data.pca <- prcomp(hep.data, scale. =T)
hep.data.pca
#standard deviations: 는 표준편차를 의미하는것으로
#각 변수가 얼마나 많은 부분을 차지하고 있는지를 알려준다.??
#scale. = T는 수치간 표준화를 지정하는 것으로
#각 변수당 단위가 다르기 때문에 표준화가 필요하다.??
#참고로 prcomp 가 아닌 stat 패키지의 princomp도 주성분 분석을 할 수 있는데
#여기서는 cor=T를 주면 된다
summary(hep.data.pca)
#summary를 하면 주성분 분석에 대한 결과 요약 설명이 나온다.
#Standard deviation : 표준편차
#Propertion of Variance : 분산비율, 각 주성분의 차지하는 비율을 말하며
#클 수록 영향도가 그만큼 높다는 의미임
#Cumulative Proportion : 분산의 누적 합계이며 주성분 갯수 구함(0.7)
screeplot(hep.data.pca, type="lines", pch=1, main="scree plot")
#그림 통해서 주성분 갯수 고름름
hep.data.pca$rotation[,1:2]
hep.data.pca$x[,1:2] #순위별로 주성분 변수의 값을 알 수 있음
biplot(hep.data.pca, main="Biplot")
# 각 개체에 대한 첫 번째, 두 번째 주성분 점수 및 행렬도(biplot)
# 각 개체의 관찰값은 주성분점수로 하고,
#각 변수와 주성분과의 관계를 나타내는 주성분 계수를 동시에 나타내어
#이들의 관계를 살피려는 다변량 그래프 분석 기법이다.