다수의 변수간 상관관계를 파악하려고 할 때, 회귀분석에서 종속변수와 독립변수간 선형관계를 파악하거나 독립변수간 다중공선성을 파악하려고 할 때 사용하는 분석 기법이 상관계수 행렬이며, 시각화 방법이 산점도 행렬과 상관계수 행렬 Plot (correlation matrix plot) 입니다.

 

이전 포스팅에서 ggplot2의 geom_point() 산점도를 다루었으며,

 

다음 포스팅에서는 Base Graphics 패키지의 pairs() 함수를 사용한 산점도 행렬을 소개하였고,

 

이번 포스팅에서는 상관계수 행렬 Plot을 중심으로 해서 corrplot 패키지 사용법을 알아보겠습니다. 

 

 

예제로 사용한 데이터는 뉴욕의 1973년도 공기의 질을 측정한 airquality 데이터셋의 Ozone, Solar.R, Wind, Temp 4개의 변수가 되겠습니다.

 

 

> str(airquality)
'data.frame':	153 obs. of  6 variables:
 $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
 $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
 $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...
> 

> # Month, Day는 빼기

> airquality_1 <- airquality[,c(1:4)]
> 
> str(airquality_1)
'data.frame':	153 obs. of  4 variables:
 $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
 $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...

 

 

 

 

상관계수 분석을 할 때 결측값이 있으면 NA 값이 나오게 되므로 사전에 결측값 처리하는 것이 필요합니다.  Ozone과 Solar.R이 결측값이 각각 37개, 7개 있다보니 아래처럼 상관계수가 NA가 나왔습니다.

 

> # 결측값 확인
> sum(is.na(airquality_1$Ozone)) # 37
[1] 37
> sum(is.na(airquality_1$Solar.R)) # 7
[1] 7
> sum(is.na(airquality_1$Wind)) # 0
[1] 0
> sum(is.na(airquality_1$Temp)) # 0
[1] 0
> # 결측값 있는 상태에서 상관계수 계산했을 때
> cor(airquality_1)
        Ozone Solar.R       Wind       Temp
Ozone       1      NA         NA         NA
Solar.R    NA       1         NA         NA
Wind       NA      NA  1.0000000 -0.4579879
Temp       NA      NA -0.4579879  1.0000000

 

 

 

 

na.omit() 함수를 사용하여 결측값이 있는 행 전체를 삭제한 후에 상관계수를 구해보면 아래와 같습니다.  corrplot 패키지의 corrplot() 함수는 상관계수 행렬 데이터셋을 가지고 그래프를 그리므로 아래처럼 결측값을 제거한 후의 데이터셋을 가지고 미리 상관계수 행렬을 계산해두어야 합니다.

 

 

> # 결측값 있는 행 전체 삭제
> airquality_2 <- na.omit(airquality_1)
> str(airquality_2)
'data.frame':	111 obs. of  4 variables:
 $ Ozone  : int  41 36 12 18 23 19 8 16 11 14 ...
 $ Solar.R: int  190 118 149 313 299 99 19 256 290 274 ...
 $ Wind   : num  7.4 8 12.6 11.5 8.6 13.8 20.1 9.7 9.2 10.9 ...
 $ Temp   : int  67 72 74 62 65 59 61 69 66 68 ...
 - attr(*, "na.action")=Class 'omit'  Named int [1:42] 5 6 10 11 25 26 27 32 33 34 ...
  .. ..- attr(*, "names")= chr [1:42] "5" "6" "10" "11" ...
> sum(is.na(airquality_2$Ozone)) # 0
[1] 0
> sum(is.na(airquality_2$Solar.R)) # 0
[1] 0
> # 상관계수 계산
> airquality_cor <- cor(airquality_2)
> airquality_cor
             Ozone    Solar.R       Wind       Temp
Ozone    1.0000000  0.3483417 -0.6124966  0.6985414
Solar.R  0.3483417  1.0000000 -0.1271835  0.2940876
Wind    -0.6124966 -0.1271835  1.0000000 -0.4971897
Temp     0.6985414  0.2940876 -0.4971897  1.0000000
 

 

 

 

corrplot 패키지는 별도의 설치 및 호출이 필요한 패키지이므로 아래의 절차를 거칩니다.

 

> install.packages("corrplot")
Installing package into ‘C:/Users/user/Documents/R/win-library/3.2’
(as ‘lib’ is unspecified)
trying URL 'http://cran.rstudio.com/bin/windows/contrib/3.2/corrplot_0.73.zip'
Content type 'application/zip' length 2680505 bytes (2.6 MB)
downloaded 2.6 MB

package ‘corrplot’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\user\AppData\Local\Temp\Rtmpk1gkRL\downloaded_packages
> library(corrplot) 

 

 

 

산점도 행렬 그림 (scatter matrix plot)을 복습해보자면 아래와 같습니다.

 

> # scatter plot matrix
> plot(airquality_2)

 

 

 

 

 

correlation plot의 method 에는 method = c("circle", "square", "ellipse", "number", "shade", "color", "pie") 등이 있으며, method별로 하나씩 예를 들어보겠습니다.

 

 

> corrplot(airquality_cor, method="circle")
 

 

 

> corrplot(airquality_cor, method="square")

 

 

 

  

> corrplot(airquality_cor, method="ellipse")

 

 

 

 

> corrplot(airquality_cor, method="number")

 

 

 

 

> corrplot(airquality_cor, method="shade")

 

 

 

 

> corrplot(airquality_cor, method="color")

 

 

 

 

> corrplot(airquality_cor, method="pie")

 

 

 

 

마지막으로 mehtod="shade", 상관관계 방향성 제시, 대각선 값 미제시, 상관계수 숫지 검정색으로 해서 추가해서 corrplot을 그려보겠습니다.  order 는 FPC(First Principle Component), hclust(hierarchical clustering), AOE(Angular Order of Engenvectors) 등이 있으며, 정렬 기준을 지정해주면 같은 색깔 끼리 뭉쳐서 보일 수 있도록 정렬을 시켜줘서 보기에, 해석하기에 더 좋게 보여줍니다.

 

> # corrplot
> corrplot(airquality_cor, 
+          method="shade", # 색 입힌 사각형
+          addshade="all", # 상관관계 방향선 제시
+          # shade.col=NA, # 상관관계 방향선 미제시
+          tl.col="red", # 라벨 색 지정
+          tl.srt=30, # 위쪽 라벨 회전 각도
+          diag=FALSE, # 대각선 값 미제시
+          addCoef.col="black", # 상관계수 숫자 색
+          order="FPC" # "FPC": First Principle Component
+                      # "hclust" : hierarchical clustering
+                      # "AOE" : Angular Order of Eigenvectors
+          )

 

 

 

 

많은 도움이 되었기를 바랍니다.

 

-----------

 

(참고) pairs() 함수를 활용한 상관계수 행렬 그리기 ☞ http://rfriend.tistory.com/83

 

-----------

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 스윗쥬스 2016.08.04 17:06 신고  댓글주소  수정/삭제  댓글쓰기

    order Option은 3가지가 있습니다.
    직접 테스트를 했는데도, 어떤 기준으로 정렬하는지 파악이 잘 안되네요.
    각 기준이 어떻게 정렬하는지 알려주실 수 있으실까요..?

    1.FPC(First Principle Component)
    2.hclust(hierarchical clustering)
    3.AOE(Angular Order of Engenvectors)

    • R Friend R_Friend 2016.08.04 23:00 신고  댓글주소  수정/삭제

      스윗쥬스님,

      order option별로 설명을 드리자면,

      1)FPC(First Principle Component)

      주성분분석이 데이터의 분산을 최대로 많이 설명할 수 있는 선형조합을 찾는 것이며, 제1 주성분이 데이터의 정보량을 가장 많이 설명을 합니다. 보통 변수들 간에 상관성이 높을 수록 제1 주성분의 설명력가 높습니다. 이론상으로는 제1 주성분에 대한 변수별 기여도를 가지고 ordering을 하면 서로 상관성이 높은 변수들의 순서대로 정렬이 될겁니다.


      ☞ 주성분분석(PCA) 참고 포스팅 :
      http://rfriend.tistory.com/61


      2)hclust(Hierarchical Clustering) :

      계층적 군집화 방법에는 6가지 세부 알고리즘이 있는데요, 기본 원리는 객체 간 유사성(similarity)을 측정해서 유사한 객체끼리 군집이 하나가 될때까지 반복해서 묶어주는 작업을 합니다. 보통은 Euclidean Distance 를 가지고 유사성(정확히는 비유사성, dissimilarity)를 측정해서 군집화를 해줍니다. 앞서 말씀드린 주성분분석 (혹은 요인분석)은 '변수'에 대해서 '상관성'을 가지고 주성분으로 묶어주는 것이라면, 군집분석은 '객체(관측치)'에 대해서 '유사성'을 가지고 군집으로 묶어주는 것입니다.

      따라서 상관관계분석의 ordering 기준으로 계층적군집분석을 쓴다는게 어떤 매카니즘인지를 저는 정확히 이해를 못하겠습니다. ^^; 죄송합니다.

      보통 군집분석 끝내고 나면 군집별로 특성 파악을 위해 변수들과 cross-tabulation 해가면서 profiling을 하는데요, 각 군집별로 특성을 잘 나타낼 수 있는 변수들이 있다면 그 변수들의 상관성이 높다고 해석할 수도 있을 것 같습니다.

      ☞ 응집형 계층적 군집화 - 단일(최단) 연결법 참고 포스팅 :
      http://rfriend.tistory.com/202


      3) AOE(Angular Order of Eigenvectors) :

      1)번에서 주성분분석을 얘기했었는데요, 주성분 구할 때 성분을 분해하면서 고유값(Eigenvalue)과 고유벡터(Eigenvector)를 사용합니다. 첫번째, 두번째, ... 이 순서대로 고유값이 컸다가 작아지구요, 설명력도 첫번째 고유값, 고유벡터가 제일 크고 점점 작아진다고 생각하시면 됩니다. 1)번의 FPC와 대략 같은 맥락의 order 기준이라고 생각하시면 될거 같습니다.

      ☞ 고유값(eigenvalue), 고유벡터(eigenvector) 참고 포스팅 : http://rfriend.tistory.com/181

    • 스윗쥬스 2016.08.05 16:15 신고  댓글주소  수정/삭제

      답변감사합니다 ~
      덕분에 많이 공부했습니다. ^^

  2. 지나가던학생 2016.11.09 20:26  댓글주소  수정/삭제  댓글쓰기

    저 질문이 있는데... 상관계수 구해서 시각화할때 유의성, 즉 p값은 고려하지 않고, 단순 값만 시각화 된것인가요? 만약 저 매트릭스에서 p값이 유의하지 않게 나온 값은 표시되지 않게 할수 있는 방법은 없을까요

    • R Friend R_Friend 2016.11.10 00:26 신고  댓글주소  수정/삭제

      pairs() 함수와 사용자 정의 함수를 사용하면 (두 변수들 간의) 산점도 행렬 + (한 변수의) 히스토그램 + (두 변수들 간의) 상관계수를 한꺼번에 볼 수 있습니다.

      특히 우측 상단의 상관계수의 절대값 크기에 비례해서 숫자 크기가 달라짐에 따라 상관계수절대값이 큰 값만 눈에 잘 띄며, 별로 관계가 없는 값은 숫자 크기가 매우 작게 나타나는 시각화 효과를 제공합니다.

      아래 링크의 포스팅 참고하세요.

      => http://rfriend.tistory.com/83