본문 바로가기

회사생활/R

R 예제 코드 - PCA / Principal Component Analysis / 주성분 분석

R 예제 코드 - PCA / Principal Component Analysis / 주성분 분석




iris 데이터의 주성분 분석을 하는 R 코드를 만들어 보자.


-

(1) 데이터 준비하기

(2) PCA 하기

(3) PCA 결과 확인하기

(4) PCA 결과 시각화하기1 - Scree Chart

(5) PCA 결과 시각화하기2 - ggbiplot

(6) 군집분석으로 검증하기

-




(1) 데이터 준비하기


데이터는 R에서 기본 제공되는 iris 데이터를 사용하겠다. 일단 PCA에는 연속형 변수(Continuous Variable)만 사용하기 때문에 연속형 변수와 범주형 변수(Categorical Variable)를 분리한다.

# 연속형 변수
dt <- iris[, -5]

# 범주형 변수
dt_group <- iris[, 5]




(2) PCA 하기


연속형 변수 데이터인 dt를 prcomp 함수를 이용해 PCA를 돌린다. center와 scale을 T로 해서 표준화 해줘야 변수 간의 단위 차이를 없앨 수 있다.

pca_dt <- prcomp(dt,
                 center = T,
                 scale. = T)




(3) PCA 결과 확인하기


prcomp 결과를 저장한 pca_dt를 실행시켜 보자.

pca_dt



투입된 변수가 4개이면, 주성분 PC도 4개까지 생성된다. 결과에 보이는 수치는 각 변수가 PC1부터 PC4까지에 기여한 정도를 보여준다.




(4) PCA 결과 시각화하기 1 - Scree Chart


데이터에서 주성분을 추출하여 변수를 축소하기 위한 기법이 바로 PCA였다. 그럼 몇 번째 PC까지 사용해야하는 걸까?

이 문제를 해결하기 위한 시각화 기법이 Scree Chart이다. 아마 형태는 여러 곳에서 많이 보았을 것이다.

# Proportion of variance 출력
plot(pca_dt,
     type = "l")



위 그래프에서 기울기가 달라지는 꺽이는 지점, 이 부분을 Elbow Point라고 부르는데 보통 이 부분의 PC까지를 사용해서 변수를 축소하게 된다. 눈으로 보기에는 3이 Elbow Point라고 여겨지는데, 정확한 수치를 보기 위해서는 아래 코드를 실행해 보자.

summary(pca_dt)



Scree Chart에서 본 Elbow Point의 PC는 PC3이고 이 부분의 정확한 누적비율은 99.5%라고 해석한다. 즉 PC3까지만 사용해도 이 데이터의 99.5%의 변동을 설명할 수 있다는 이야기이다. 그럼 변수를 원래 4개에서 PC 3개로 줄일 수 있다는 뜻이다.



또한 시각화를 쉽게할 수 있도록 2개의 변수 PC1과 PC2만으로도 95.8%의 변동을 설명할 수 있다. 그럼 이번에는 PC1과 PC2로 2차원 그래프를 그려 얼마나 데이터를 잘 표현하고 있는지 확인해보자.




(5) PCA 결과 시각화하기2 - ggbiplot


시각화를 위해 새로운 패키지 ggbiplot과 vqv를 설치해보자. ggbiplot과 vqv는 install.packages 함수가 아닌 install_github 함수를 이용해야하므로 devtools 라이브러리를 불러와서 설치해야 한다.

만약 이미 설치되어 있다면 생략하고 바로 라이브러리를 불러오자.

# 라이브러리 설치 및 불러오기
install_github("devtools")
library(devtools)
install_github("ggbiplot", "vqv")
library(ggbiplot)





ggbiplot은 이름처럼 ggplot과 유사한 구조를 가지고 있다.

# 시각화하기
g <- ggbiplot(pca_dt,
              choices = c(1, 2),
              obs.scale = 1,
              var.scale = 1,
              groups = dt_group,
              ellipse = TRUE,
              circle = TRUE)
g <- g + scale_color_discrete(name = '')
g <- g + theme(legend.direction = 'horizontal', 
               legend.position = 'top')
print(g)



그래프의 축에서 알 수 있듯이 PC1이 데이터의 73.0%를 설명하고 PC2가 22.9%를 설명하여 단 2개의 축으로도 기존 데이터의 변동을 95.9% 설명하고 있는 그래프이다.


변수 이름이 쓰여있는 갈색 화살표는 해당 데이터가 각 PC에 얼마나 기여했는지를 보여준다.

예를 들어 Petal.Width나 Petal.Length는 PC1 축에 평행하고 있는 것을 볼 때 PC2에는 거의 기여하지 않고 PC1에 많이 기여한 것을 알 수 있다. 또한 Sepal.Width는 PC2에 많이 기여한 편이고 PC1에도 기여한 바가 있다.




(6) 군집분석으로 검증하기


PCA로 변수를 축소하는 것이 얼마나 이득인지를 클러스터링(Clustering)을 통해 검증해보자. 검증 방법은 변수의 개수를 1개에서 4개로 늘려감에 따라 얼마나 잘 분류하는지를 원본 데이터와 PCA 결과 데이터를 가지고 비교하는 방법으로 진행하려고 한다.


이 내용에 대한 포스팅은 후속 포스팅으로 따로 다루겠다.





#Algorithm#Analysis#bigdata#data#ggbiplot#PC1#pc2#PCA#PCA 시각화#r#rsourcecode#rstudio#r샘플#r예제#R코드#scree chart#scree plot#데이터분석#분석#빅데이터분석#스크리차트#알고리즘#주성분#주성분 분석 시각화 r#주성분분석#통계분석