함께하는 데이터 분석

[EDA] PCA with R 본문

통계학과 수업 기록/EDA

[EDA] PCA with R

JEONGHEON 2022. 2. 6. 19:35

오늘은 Principal Component Analysis 일명 PCA에 대해

 

간단한 예제를 R을 통해 알아보는 시간을 갖겠습니다!

 

그러기에 앞서 필요한 파일을 첨부하겠습니다.

stockreturns.RData
0.01MB

위 데이터는 주식에 관한 10개 회사의 값입니다.

 

그럼 시작해볼까요?

 

rm(list=ls()) #할당변수 모두 제거
load("stockreturns.RData") #데이터 불러오기
ls() #변수 확인
>>> [1] "stocks"
head(stocks)
tail(stocks)
str(stocks) #구조 파악
>>> 'data.frame':	100 obs. of  10 variables:
     $ comp1 : num  0.44781 0.98811 0.87456 0.7144 0.00535 ...
     $ comp2 : num  0.0673 1.5816 0.7562 -0.6898 -1.3429 ...
     $ comp3 : num  0.15 -0.611 -2.18 0.254 -2.065 ...
     $ comp4 : num  2.991 2.62 -0.362 2.209 -2.408 ...
     $ comp5 : num  -0.208 0.536 1.372 0.58 -0.187 ...
     $ comp6 : num  0.456 0.59 0.919 1.837 -0.173 ...
     $ comp7 : num  -0.781 1.208 1.115 0.92 0.155 ...
     $ comp8 : num  0.205 1.066 1.545 0.422 -1.104 ...
     $ comp9 : num  -0.00137 -0.55163 1.5231 -0.41715 0.20312 ...
     $ comp10: num  1.465 0.203 0.348 -1.009 1.998 ...
     
dim(stocks) #차수 확인
>>> [1] 100  10

이때 EDA관점에서 PCA를 할 때 중요한 것은

 

오리지널 데이터와 표준화 작업을 한 데이터 두 가지 다 해봐야 한다는 것입니다.

origin <- apply(stocks, 2, mean) #오리지널 열별 평균분석
origin
>>>       comp1       comp2       comp3       comp4       comp5       comp6       comp7       comp8 
    -0.20597360 -0.18538148 -0.41773362 -0.00058670 -0.04152566 -0.07953460  0.16694075 -0.13969141 
      comp9      comp10 
    -0.10858906  0.03052026

standard <- apply(scale(stocks), 2, mean) #표준화 후 열별 평균분석
standard
>>>         comp1         comp2         comp3         comp4         comp5         comp6         comp7 
     3.688456e-18 -8.085980e-18 -1.512489e-17 -3.869789e-18 -1.497934e-17  1.409246e-17 -1.427677e-17 
        comp8         comp9        comp10 
    -2.286203e-17 -1.442856e-17 -1.949396e-18 

plot(standard, ylim = c(-0.1, 0.1)) #그래프로 확인

위의 그래프를 보면 평균이 0으로 표준화가 됐다는 것을 알 수 있습니다.

 

stock.PCA1<-prcomp(stocks) #오리지널
stock.PCA2<-prcomp(scale(stocks)) #표준화

par(mfrow=c(3,2))
screeplot(stock.PCA1)
screeplot(stock.PCA2)
biplot(stock.PCA1, 1:2, main = "no scale") #PCA1, PCA2
abline(h=0, lty=3, col='red')
abline(v=0, lty=3, col='red')
biplot(stock.PCA2, 1:2, main = "scale") #PCA1, PCA2
abline(h=0, lty=3, col='red')
abline(v=0, lty=3, col='red')
biplot(stock.PCA1, 2:3, main = "no scale") #PCA2, PCA3
abline(h=0, lty=3, col='red')
abline(v=0, lty=3, col='red')
biplot(stock.PCA2, 2:3, main = "scale") #PCA2, PCA3
abline(h=0, lty=3, col='red')
abline(v=0, lty=3, col='red')

 

par(mfrow=c(2,2))
with(stock.PCA2, plot(rotation[,1], rotation[,2], type='n', xlab="PC1", ylab="PC2", main='scale'))
with(stock.PCA2, text(rotation[,1], rotation[,2], 1:10))
abline(h=0, lty=3, col='red')
abline(v=0, lty=3, col='red')
with(stock.PCA2, plot(rotation[,2], rotation[,3], type='n', xlab="PC2", ylab="PC3", main='scale'))
with(stock.PCA2, text(rotation[,2], rotation[,3], 1:10))
abline(h=0, lty=3, col='red')
abline(v=0, lty=3, col='red')

with(stock.PCA1, plot(rotation[,1], rotation[,2], type='n', xlab="PC1", ylab="PC2", main='no scale'))
with(stock.PCA1, text(rotation[,1], rotation[,2], 1:10))
abline(h=0, lty=3, col='red')
abline(v=0, lty=3, col='red')
with(stock.PCA1, plot(rotation[,2], rotation[,3], type='n', xlab="PC2", ylab="PC3", main='no scale'))
with(stock.PCA1, text(rotation[,2], rotation[,3], 1:10))
abline(h=0, lty=3, col='red')
abline(v=0, lty=3, col='red')

경향성이 뚜렷한 표준화된 그래프를 살펴보면

 

comp5, 6, 7은 PCA2에 영향을 받으면서 그룹화되어있는 것을 볼 수 있고

 

comp1, 2, 3, 4와 comp8, 9, 10이 따로 뭉쳐있는 것을 확인할 수 있습니다.

 

앞서 배운 Hierarchical Cluster을 사용해보면 더 확인할 수 있습니다!

plot(hclust(dist(t(as.matrix(scale(stocks))))))

감사합니다!

'통계학과 수업 기록 > EDA' 카테고리의 다른 글

[EDA] FA with R  (0) 2022.02.06
[EDA] SVD with R  (0) 2022.02.05
[EDA] K-Means Clustering with R  (0) 2022.02.02
[EDA] Hierarchical Clustering with R  (0) 2022.02.02