[R] 연습

[R] 차원축소 (PCA편)

Simon Yoon 2021. 12. 11. 22:48

지금까지는 dplyr 패키지를 이용해서 데이터 프레임을 다루는 연습과 결측값, 이상값의 판별과 처리에 대한 부분을 연습했다.

이제는 데이터 분석에 앞서 또 하나 중요한 과정인 차원축소에 대한 부분을 다뤄보도록 하겠다.

 

차원축소 방법 중에 가장 기본적인 방법으로 주성분 분석(PCA)가 있다.

주성분 분석은 변수들의 선형 결합을 통해서 최대한 전체 정보를 설명할 수 있는 서로 독립적인 인공 변수로 변환하는 분석 방법이다.

예를 들어 기업의 신용평가를 위한 재무변수가 100개가 넘는데, 이러한 변수를 다 사용하면 오버피팅(overfitting)문제가 발생할 수 있다. 따라서 고차원에서 저차원으로 변환하는 방법이 필요하게 된다.

이론적인 내용에 대해서는 향후 다른 카테고리에 따로 정리할 예정이므로 여기서는 R로 어떻게 주성분 분석을 할 수 있는지를 중심으로 설명할 것이다.

 

이번 포스팅에서는 한번 다루어 봤던 cereals 데이터를 사용할 것이다.

Cereals.csv
0.00MB
Cereals 데이터의 일부

참고로 cereals 데이터는 77개 관측치, 16개 변수로 이루어져있다. 이 중에서 name, mfr, type를 제외한 나머지 변수들이 수치형 데이터들이다. 따라서 수치형 변수들로만 주성분 분석을 연습해 보겠다.


Q. 주성분 분석을 하고 싶다면?

A. princomp() 혹은 prcomp() 함수를 사용하자.

 

princomp()를 사용할 것이며, princomp( 데이터x, cor = T/F, scores = T/F )의 형태로 구성되어 있다.

'cor = '의 경우에는 공분산 행렬 이나 상관 행렬의 사용 여부에 대한 것이며, TRUE일 경우는 상관행렬, FALSE는 공분산행렬 사용이다. 디폴트값으로는 TRUE 로 설정되어 있다.

'scores = '는 각 주성분 점수의 계산 여부에 대한 것이다. TRUE면 주성분 점수를 계산하고 반대면 계산하지 않는다.

 

cereals 데이터에는 결측치가 포함되어 있다. 결측치의 처리는 앞의 포스팅에 작성해 두었기 때문에 참고하면 될 것이다.

2021.12.01 - [[R] 연습] - [R] 데이터 정제하기 (결측치편)

일단 결측치가 포함된 행을 제거하고 분석하였다.

 

pca.cereals <- princomp(cereals.df, cor = FALSE, scores = TRUE)
summary(pca.cereals)

주성분 분석 결과 누적 기여율 확인

위의 그림에서 알 수 있듯이 제 2주성분까지의 결과를 이용하면 전체 데이터의 92.6%를 설명할 수 있다.

 

주성분 적재 값(loadings)와 점수(scores)를 보기 위해서는 다음과 같이 코드를 작성할 수 있다.

pca.cereals$loadings
pca.cereals$scores

 

다만 여기서 중요한 부분 하나를 생각해야 할 필요가 있다.

데이터에서 sodium과 potass 변수는 밀리그램(mg)으롤 측정된 반면에 protein, fat, fiber, carbo, sugars는 그램(g)으로 측정되어서 서로 스케일이 다르다는 문제가 있다. 이러한 부분은 값에 왜곡을 주기 때문에 정규화 한 후 분석을 해야 한다.

따라서 이때는 'cor = T'로 작성하면 된다.

pca2 <- princomp(cereals.df, cor = T)
summary(pca2)

직접 실행해보면 주성분 분석 결과도 달라졌음을 확인할 수 있다.


주성분 분석은 단순히 결과만 출력하는 것이 아니라 해석을 해야한다. 따라서 plot을 이용해서 시각적으로 확인하면 더 좋다.

Q. 스크리 산점도(Scree Plot)과 주성분 점수 시각화를 하고 싶다면?

A. plot()과 biplot() 함수를 사용하자.

 

코드 예시는 다음과 같다.

plot(pca2, type = 'l', main = "scree plot")
biplot(pca2, scale = 0, main = "biplot")

 

이렇게 하면 스크리 산점도로 주성분 분석 결과를 확인하고 몇 번째 주성분까지 사용할 것인지 결정할 수 있고, biplot 결과로 분석 결과에 대한 시각적인 해석이 가능하다.