4. Rmarkdown - 상관계수와 산점도 matrix
2019. 2. 19. 11:09
- 상관계수와 산점도 매트릭스
상관계수
- 숫자형 칼럼만 뽑는 2가지 방법 :
- str()확인후 직접 칼럼 여러개 인덱싱
- 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점의모양
'한의대 생활 > └ 통계에 대한 나의 정리' 카테고리의 다른 글
4-2. 3집단 이상의 (숫자형)분석 ANOVA (0) | 2019.02.19 |
---|---|
4-1. 2개 집단의 평균 비교 - t-test (4) | 2019.02.19 |
4. 상관계수 정리 (1) | 2019.02.18 |
3-6. 반복문, ifelse-binning + 빈도분석, 데이터합치기(rbind, cbind, merge) (0) | 2019.02.17 |
3-5. 확률변수 , 확률분포, 그리고 대표적 확률분포 (0) | 2019.02.17 |