R

PCA(주성분 분석) with iris

한번해보즈아 2021. 4. 7. 18:06

이번시간에는 주성분분석을 해보도록 하겠습니다. 학교다닐때 관련수업을 듣긴했지만 이해도 안되고 어떻게 쓰는건지도 모르겠고 왜 쓰는지도 모르겠었는데 지금은 아주아주아주 쪼금이라도 이해가 되서 다시 도전합니다. 하지만 아직도 어떻게, 왜 쓰는지 이해는 잘 안되긴합니다.

 

기본적인 주성분분석의 개념은 고차원의데이터를 저차원으로 변경시키는것으로 알고 있는데 2차원 까지는 변경시킬수 있겠는데 3차원이상은 어떻게 표현하는지 모르겠습니다.... 즉, 현재상황은 PC1, PC2, PC3, PC4 중에서 2개를 골라서  그래프를 그리는거 까지만 가능합니다. 

 

이번에 쓸 데이터는 기본적으로 iris데이터를 사용할건데 4개의 연속형변수와 1개의 범주형 변수로 이루어져있는 데이터입니다. 먼저 연속형 변수(4개)와 범주형변수(1개)로 데이터를 나누어 줍니다. 요즘 빅데이터분석기사를 공부하고 있는데 거기서 누적기여율(Cumulative Proportion)이 85%이상이면 주성분의수로 결정할수있다고 합니다. PC2에서 누적기여율이 95.81%이므로 현재 PC1,PC2로 차원을 축소 할수있습니다.

 

> ##PCA
> head(iris,5)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa

> df <- iris[,-5]
> df_group <- iris[,5]


> pca_df <- prcomp(df,  #정규화한후 주성분분석실행
+                  center=T,
+                  scale=T)


> pca_df
Standard deviations (1, .., p=4):
[1] 1.7083611 0.9560494 0.3830886 0.1439265

Rotation (n x k) = (4 x 4):
                    PC1         PC2        PC3        PC4
Sepal.Length  0.5210659 -0.37741762  0.7195664  0.2612863
Sepal.Width  -0.2693474 -0.92329566 -0.2443818 -0.1235096
Petal.Length  0.5804131 -0.02449161 -0.1421264 -0.8014492
Petal.Width   0.5648565 -0.06694199 -0.6342727  0.5235971


> summary(pca_df)
Importance of components:
                          PC1    PC2     PC3     PC4
Standard deviation     1.7084 0.9560 0.38309 0.14393
Proportion of Variance 0.7296 0.2285 0.03669 0.00518
Cumulative Proportion  0.7296 0.9581 0.99482 1.00000

 

 

혹시 몰라서 상관분석도 시행해보았습니다.

> cor(df)
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000

 

 

흔히 알고있는 주성분분석그래프도 그려보았습니다. 2번째에서 꺽인것을 확인할수있으며 위의 수치적결과(PC2)와 같은결과가 나온것을 확인할수있습니다.

2번째에서 꺽임

 

좀더 상세한 그래프를 그려보기 위하여 ggbiplot을 이용할건데 install.packages("")를 사용하는게 아니라 github에서 패키지를 가져오도록 하겠습니다.

install.packages("devtools")
library(devtools)
install_github("vqv/ggbiplot")
library(ggbiplot)

> ggbiplot(pca_df,
+          choices=c(1,2), # PC1, PC2 로 그래프를 그리겠다.
+          obs.scale=1,
+          var.scale=1,
+          groups=df_group,
+          ellipse=T, #각 색깔별로 원을 3개그린다.
+          circle=T)+ #큰 원을 그린다.
+   scale_color_discrete(name='')+  # 범례에 'groups'라는 단어를 지운다.
+   theme(legend.direction = 'horizontal', #범례를 수평선으로 나열
+         legend.position = 'top') #범례를 상위로 나열

 

ggbiplot을 이용한 그래프

 

원래 iris의 종류(Species)는 4개의변수(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)로 이루어져있었는데 주성분분석을 통해 4개의 변수를 2개(PC1, PC2)로 축소하였습니다. 그래프에서 PC1과 수평을 이루는 변수일수록 높은 설명력을 가지고 있습니다.

즉,  PC1과 수평을 이루고 있는 Petal.Length가 제일 높은 설명력을 가지고 있을것이고 그다음은 Petal.Width입니다. 반대로 PC2에서는 Sepal.Width가 제일 높은 설명력을 가지고 있는걸 알수있습니다.

 

 

간단한 데이터를 이용하여 주성분 분석을 해보았는데 앞서말했다시피 아직은 왜 사용하는지 와닿지는 않습니다. 만약 누적기여율 85%기준을 넘는 PC변수들의 갯수가 3개이상이 넘어가버리면 그래프를 어떻게 그려야하는지 모르겠고 저 변수들을 어떻게 사용할지도 모르겠습니다.