상관계수

  • 숫자형 칼럼만 뽑는 2가지 방법 :
    1. str()확인후 직접 칼럼 여러개 인덱싱
    1. Filter( is.numeric, df )
# 데이터 준비
library(moonBook)
data(acs)

# 1. 상관계수(숫자-숫자)만 구하기 : na제거후 cor(칼럼인덱싱1, 칼럼인덱싱2)
cor(acs$height, acs$weight)
## [1] NA
cor(acs$height, acs$weight, use = "na.or.complete") # na 포함시 use옵션을 넣어줘야한다.
## [1] 0.6315767
# 2. 상관계수 매트릭스 : str() -> 숫자형칼럼만 뽑아서 cor(dataframe)
# - str()로 숫자형 칼럼만 인덱싱하여 df만들고 나서, dataframe 자체를 넣어준다.

str(acs) # age(1), EF(6), height(7), weight(8), BMI(9) 등
## 'data.frame':    857 obs. of  17 variables:
##  $ age             : int  62 78 76 89 56 73 58 62 59 71 ...
##  $ sex             : chr  "Male" "Female" "Female" "Female" ...
##  $ cardiogenicShock: chr  "No" "No" "Yes" "No" ...
##  $ entry           : chr  "Femoral" "Femoral" "Femoral" "Femoral" ...
##  $ Dx              : chr  "STEMI" "STEMI" "STEMI" "STEMI" ...
##  $ EF              : num  18 18.4 20 21.8 21.8 22 24.7 26.6 28.5 31.1 ...
##  $ height          : num  168 148 NA 165 162 153 167 160 152 168 ...
##  $ weight          : num  72 48 NA 50 64 59 78 50 67 60 ...
##  $ BMI             : num  25.5 21.9 NA 18.4 24.4 ...
##  $ obesity         : chr  "Yes" "No" "No" "No" ...
##  $ TC              : num  215 NA NA 121 195 184 161 136 239 169 ...
##  $ LDLC            : int  154 NA NA 73 151 112 91 88 161 88 ...
##  $ HDLC            : int  35 NA NA 20 36 38 34 33 34 54 ...
##  $ TG              : int  155 166 NA 89 63 137 196 30 118 141 ...
##  $ DM              : chr  "Yes" "No" "No" "No" ...
##  $ HBP             : chr  "No" "Yes" "Yes" "No" ...
##  $ smoking         : chr  "Smoker" "Never" "Never" "Never" ...
acs2 <- acs[ , c(1, 6, 7, 8, 9)] # 숫자형 칼럼만 뽑기
cor(acs2)
##        age EF height weight BMI
## age      1 NA     NA     NA  NA
## EF      NA  1     NA     NA  NA
## height  NA NA      1     NA  NA
## weight  NA NA     NA      1  NA
## BMI     NA NA     NA     NA   1
cor(acs2 , use = "na.or.complete")
##                age           EF       height      weight         BMI
## age     1.00000000 -0.062814463 -0.401352041 -0.42825035 -0.22291089
## EF     -0.06281446  1.000000000 -0.001477943  0.07494425  0.09332209
## height -0.40135204 -0.001477943  1.000000000  0.63285106 -0.00198798
## weight -0.42825035  0.074944253  0.632851060  1.00000000  0.76568388
## BMI    -0.22291089  0.093322093 -0.001987980  0.76568388  1.00000000
# 3. 상관계수 heatmap : corrplot(  cor(df, use="na.or.complete") )
# install.packages("corrplot")
library(corrplot)
## corrplot 0.84 loaded
corrplot(cor(acs2, use="na.or.complete")) # 원형

corrplot(cor(acs2, use="na.or.complete"), method = "square") # 사각형

corrplot(cor(acs2,use="na.or.complete"),method="ellipse") # 타원

corrplot(cor(acs2,use="na.or.complete"),method="number") # *상관계수 매트릭스 색으로

corrplot(cor(acs2,use="na.or.complete"),method="shade") # 사각형 + 빗금

corrplot(cor(acs2,use="na.or.complete"),method="color") # 사각형

corrplot(cor(acs2,use="na.or.complete"),method="pie") # pie차트 형식

상관계수의 종류별 테스트

  • 기본 : 1. 피어슨 상관계수 - 정규성을 따르는 숫자-숫자의 상관관계
  • 비모수 : 2. 스피어만 순위 상관계수, 3. 켄달의 타우
# 데이터 준비
# Filter( 칼럼에 대한 조건, data )를 통한 숫자형 칼럼 인덱싱
acs2 <- Filter( is.numeric , acs )
head(acs2)
##   age   EF height weight      BMI  TC LDLC HDLC  TG
## 1  62 18.0    168     72 25.51020 215  154   35 155
## 2  78 18.4    148     48 21.91381  NA   NA   NA 166
## 3  76 20.0     NA     NA       NA  NA   NA   NA  NA
## 4  89 21.8    165     50 18.36547 121   73   20  89
## 5  56 21.8    162     64 24.38653 195  151   36  63
## 6  73 22.0    153     59 25.20398 184  112   38 137
# 참고. 문자형 칼럼 인덱싱
acs3 <- Filter (is.character, acs)
head(acs3)
##      sex cardiogenicShock   entry              Dx obesity  DM HBP smoking
## 1   Male               No Femoral           STEMI     Yes Yes  No  Smoker
## 2 Female               No Femoral           STEMI      No  No Yes   Never
## 3 Female              Yes Femoral           STEMI      No  No Yes   Never
## 4 Female               No Femoral           STEMI      No  No  No   Never
## 5   Male               No  Radial          NSTEMI      No Yes Yes  Smoker
## 6 Female               No  Radial Unstable Angina     Yes Yes Yes   Never
# 0. 기본데이터를 이용해서, 산점도 + 선헝회귀선 + 상관관계 구해보기
data  <- data.frame(
  a = c(15,20,25,27,31,25,23,23,42,12,34,23,40),
  b = c(50,55,52,52,56,54,62,56,70,46,43,50,54)
)
plot(data$a, data$b)  # 산점도
# lm(data$a ~ data$b) # 두 변수간의 선형회귀를 통한 기울기+절편이 담겨있는 직선식
abline(lm(data$b ~ data$a)) # 산점도에 그린  y축 ~ x축 순서대로 해야 나온다!!

cor(data$a, data$b) # 상관계수
## [1] 0.433905
# 14번째 행으로 아웃라이어 추가
data[14,] = c(200, 230) # 아웃라이어 1개 추가로 인해 선형회귀 + 상관계수가 달라진다.

plot(data$a, data$b)  # 산점도
abline(lm(data$b ~ data$a)) # 산점도에 그린  y축 ~ x축 순서대로 해야 나온다!!

cor(data$a, data$b) # 상관계수
## [1] 0.9852541
# 1. 피어슨 상관계수 by cor와 상관계수 heatmap by corrplot
# 1_1. 상관계수
cor(acs2, use = "na.or.complete")
##                age          EF       height      weight          BMI
## age     1.00000000 -0.05240312 -0.399852042 -0.42569584 -0.221490011
## EF     -0.05240312  1.00000000 -0.014042881  0.06543177  0.090386043
## height -0.39985204 -0.01404288  1.000000000  0.63089489 -0.002069904
## weight -0.42569584  0.06543177  0.630894886  1.00000000  0.767190062
## BMI    -0.22149001  0.09038604 -0.002069904  0.76719006  1.000000000
## TC     -0.18357028  0.07467456 -0.077176366  0.01897155  0.084842113
## LDLC   -0.15973875  0.03663333 -0.039607198  0.05826248  0.105221247
## HDLC   -0.02621982  0.01099877 -0.085782836 -0.10664527 -0.058842589
## TG     -0.22143405  0.15153722  0.034817498  0.17231426  0.183409287
##                 TC        LDLC        HDLC          TG
## age    -0.18357028 -0.15973875 -0.02621982 -0.22143405
## EF      0.07467456  0.03663333  0.01099877  0.15153722
## height -0.07717637 -0.03960720 -0.08578284  0.03481750
## weight  0.01897155  0.05826248 -0.10664527  0.17231426
## BMI     0.08484211  0.10522125 -0.05884259  0.18340929
## TC      1.00000000  0.82328304  0.27272521  0.27757126
## LDLC    0.82328304  1.00000000  0.09587078  0.06600925
## HDLC    0.27272521  0.09587078  1.00000000 -0.15468035
## TG      0.27757126  0.06600925 -0.15468035  1.00000000
# 1_2. 히트맵
# install.packages("corrplot")
library(corrplot)
corrplot( cor(acs2, use = "na.or.complete"), method = "number") # 상관계수 matrix

corrplot( cor(acs2, use = "na.or.complete"), method = "color" ) # 상관계수 heatmap

# 2. spearman 순위 상관계수 : 비모수적 상관계수1
cor(acs2$height,acs2$weight,method="spearman", use = "na.or.complete") # 0.6379538
## [1] 0.6379538
# 3. kendall's tau : 비모수적 상관계수2
cor(acs2$height,acs2$weight,method="kendall", use = "na.or.complete") # 0.4749274
## [1] 0.4749274

산점도 매트릭스

# 1. 산점도 매트릭스 + 자신의 히스토그램 : psych 패키지 - pairs.panels( df ) 함수
# - na처리 안해도 알아서 해준다.
# install.packages("psych")
library(psych)
pairs.panels( acs2 )

# 2. 산점도 매트릭스 + 자신의 히스토그램 + @ : PerformanceAnalytics 패키지의 chart.Correlation 함수
# install.packages("PerformanceAnalytics");
library(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
chart.Correlation(acs2, histogram = TRUE, pch = 19) # baseplot의pch점의모양

+ Recent posts