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#주성분분석#통계분석
'회사생활 > R' 카테고리의 다른 글
맥 또는 서버에서 ggplot 한글 깨짐 해결방법 (0) | 2020.03.15 |
---|---|
R에서 DB 사용하기 - SQLite (7) | 2018.07.18 |
R 패키지 설치가 안 되는 경우 해결방법 (0) | 2017.12.17 |
R apply 계열 함수 총 정리 2 ( lapply / mclapply ) (0) | 2017.09.12 |
R에서 JAVA / rJava / JAVA_HOME 설정하기 (6) | 2017.07.22 |