R에서 피어슨 및 스피어만 상관 행렬을 작성하는 예제
⚡ 스마트 요약
R에서 피어슨 상관계수와 스피어만 상관계수는 두 변수가 얼마나 강하게 함께 움직이는지를 측정합니다. 단일 변수 쌍의 경우에는 `cor()` 함수를 사용하고, 여러 변수 쌍의 경우에는 상관계수 행렬을 사용합니다. 이 가이드에서는 `Hmisc`를 이용한 유의성 검정을 추가하고, `GGally` 히트맵을 사용하여 결과를 시각화합니다.

R의 이변량 상관관계
이변량 관계는 R의 두 변수 간의 관계 또는 상관관계를 설명합니다. 이 튜토리얼에서는 상관관계의 개념을 논의하고 R에서 두 변수 간의 관계를 측정하는 데 이 상관관계를 사용하는 방법을 보여줍니다.
R 프로그래밍의 상관관계
R 프로그래밍에는 두 변수 간의 상관 관계를 계산하는 두 가지 기본 방법이 있습니다.
- 피어슨: 매개변수 상관관계
- 창병: 비모수적 상관관계
R의 피어슨 상관 행렬
Pearson 상관관계 방법은 일반적으로 두 변수 간의 관계에 대한 기본 검사로 사용됩니다.
The 상관 계수r로 표기되는 이 기호는 강도를 측정합니다. 선의 두 변수 x와 y 사이의 관계는 다음과 같이 계산됩니다.
과
x의 표준편차는
y의 표준편차는 얼마입니까?
상관관계의 범위는 -1과 1 사이입니다.
- r 값이 0에 가깝거나 같다는 것은 x와 y 사이에 선형 관계가 거의 없거나 전혀 없음을 의미합니다.
- r 값이 1 또는 -1에 가까울수록 선형 관계가 강해집니다.
r이 0과 다른지 여부는 아래 t-통계량을 이용하여 검정할 수 있으며, 이 통계량을 자유도 n-2인 스튜던트 분포와 비교합니다.
R의 Spearman 순위 상관 관계
순위 상관계수는 관측치를 순위별로 정렬하고 순위 간 유사도 수준을 계산합니다. 순위 상관계수는 이상치에 강건하며 데이터 분포와 무관하다는 장점이 있습니다. 또한 순서형 변수에 적합한 분석 방법입니다.
스피어만 순위 상관계수(rho)는 -1에서 1 사이의 값을 가지며, 양 극단값에 가까울수록 강한 단조 상관관계를 나타냅니다. 계산식은 다음과 같습니다.
분자는 x와 y의 순위 간의 공분산이고, 분모는 두 변수의 표준편차의 곱입니다.
R에서는 두 값 모두 cor() 함수를 사용하여 계산되며, 이 함수는 x, y, method라는 세 가지 인수를 받습니다.
cor(x, y, method)
인수:
- x: 첫 번째 벡터
- y: 두 번째 벡터
- 방법: 상관 관계를 계산하는 데 사용되는 공식입니다. 세 가지 문자열 값:
- “피어슨”
- “켄달”
- "창병"
벡터에 누락된 값이 포함된 경우 선택적 인수를 추가할 수 있습니다. = "complete.obs"를 사용하세요.
우리는 BudgetUK 데이터세트를 사용할 것입니다. 이 데이터 세트는 1980년에서 1982년 사이 영국 가구의 예산 할당을 보고합니다. 그 중 1519가지 특징을 가진 XNUMX개의 관측치가 있습니다.
- wfood: 음식 공유 지출
- 연료: 연료 지출 공유
- 옷감: 의류 지출에 대한 예산 분배
- 월크: 술 소비를 공유
- 트랜스: 교통비 지출 분담
- 워더: 기타 재화 지출의 몫
- 토텍스: 총 가구 지출(파운드)
- 수입: 총 순가구 소득
- 나이: 가구의 나이
- 어린이: 자녀의 수
예시
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/british_household.csv" data <- read.csv(PATH) %>% filter(income < 500) %>% mutate(log_income = log(income), log_totexp = log(totexp), children_fac = factor(children, order = TRUE, labels = c("No", "Yes"))) %>% select(-c(X, X.1, children, totexp, income)) glimpse(data)
Code 설명
- 먼저 데이터를 가져오고 dplyr 라이브러리의 looking() 함수를 사용하여 살펴봅니다.
- 세 가구가 500 이상의 소득을 신고했으므로 filter(소득 < 500)를 사용하면 해당 가구가 제거되어 행 수가 1,519에서 1,516으로 줄어듭니다.
- 화폐변수를 로그로 변환하는 것이 일반적인 관행입니다. 이상값의 영향을 줄이고 데이터 세트의 왜곡을 줄이는 데 도움이 됩니다.
출력:
## Observations: 1,516 ## Variables: 10 ## $ wfood <dbl> 0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0... ## $ wfuel <dbl> 0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0... ## $ wcloth <dbl> 0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0... ## $ walc <dbl> 0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0... ## $ wtrans <dbl> 0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0... ## $ wother <dbl> 0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0... ## $ age <int> 25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2... ## $ log_income <dbl> 4.867534, 5.010635, 5.438079, 4.605170, 4.605170,... ## $ log_totexp <dbl> 3.912023, 4.499810, 5.192957, 4.382027, 4.499810,... ## $ children_fac <ord> Yes, Yes, Yes, Yes, No, No, No, No, No, No, Yes, ...
"pearson" 및 "spearman" 방법을 사용하여 소득과 wfood 변수 간의 상관 계수를 계산할 수 있습니다.
cor(data$log_income, data$wfood, method = "pearson")
출력:
## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")
출력:
## [1] -0.2501252
이를 모든 변수 쌍에 적용하기 전에, 단일 계수를 어떻게 해석해야 하는지 먼저 정립하는 것이 좋습니다.
상관계수를 해석하는 방법
계수는 그 의미를 설명할 수 있을 때 비로소 유용합니다. 아래 표는 일반적인 판독값이며, 부호는 강도와 별도로 읽습니다.
| r의 절댓값 | 관계의 강도 |
|---|---|
| 0.00 ~ 0.19 | 매우 약하거나 전혀 없음 |
| 0.20 ~ 0.39 | 약한 |
| 0.40 ~ 0.59 | 보통 |
| 0.60 ~ 0.79 | 강한 |
| 0.80 ~ 1.00 | 매우 강하다 |
따라서 앞서 계산된 log_income과 wfood 사이의 값인 -0.2467은 약한 음의 상관관계를 나타냅니다. 즉, 소득이 높은 가구일수록 예산에서 식비로 지출하는 비중이 약간 더 작다는 것을 의미합니다.
모든 계수에는 세 가지 주의 사항이 적용됩니다.
- 상관관계는 인과관계가 아닙니다. 상관계수 r이 높다는 것은 두 변수가 함께 움직인다는 것을 의미하며, 결코 한 변수가 다른 변수의 원인이라는 것을 의미하지는 않습니다. 측정되지 않은 제3의 변수가 두 변수 모두에 영향을 미치는 경우가 많습니다.
- 피어슨은 직선만 인식합니다. 완벽한 U자형 관계는 0에 가까운 r 값을 나타냅니다. 수치를 신뢰하기 전에 항상 데이터를 그래프로 나타내십시오.
- 규모가 중요성보다 더 중요하다. 1,516개의 관측치를 사용하면, 0.06의 계수 값은 통계적으로 유의미할 수 있지만 실제적인 의미는 없을 수 있습니다.
cor.test()를 사용하여 상관관계의 유의성을 검정하는 방법
cor() 함수는 계수만 반환합니다. 단일 쌍의 경우 cor.test() 함수는 p값과 신뢰구간을 한 번에 제공합니다.
cor.test(data$log_income, data$wfood, method = "pearson")
결과물은 읽어볼 만한 네 부분으로 구성되어 있습니다.
- t와 df: 검정 통계량과 자유도, n – 2.
- P-값이: 실제 상관관계가 0일 경우 이처럼 큰 계수를 볼 확률.
- 95% 신뢰 구간: 실제 상관관계에 대한 타당한 범위. 이 범위에 0이 포함되지 않으면 해당 수준에서 관계가 유의미합니다.
- 표본 추정치: 계수 자체이며, cor() 함수가 반환하는 값과 동일합니다.
동일한 함수에서 하나의 인수만 변경하면 순위 기반 테스트가 실행됩니다.
# Spearman rank correlation with a p-value cor.test(data$log_income, data$wfood, method = "spearman") # One-sided test: is the correlation greater than zero? cor.test(data$log_income, data$wfood, alternative = "greater")
어떤 상황에서 어떤 것을 사용해야 할까요? 특정 쌍 하나를 검사할 때는 rcorr() 함수에서 제공하지 않는 신뢰구간을 제공하는 cor.test() 함수를 사용하십시오. 전체 행렬에 대한 p값을 한 번에 구해야 할 때는 위에 표시된 Hmisc 패키지의 rcorr() 함수를 사용하십시오. 많은 쌍을 검사하면 위양성률이 높아지므로, 큰 행렬에서 결론을 도출하기 전에 p.adjust(p_value, method = “BH”) 함수를 사용하여 p값을 조정하십시오.
R의 상관 행렬
이변량 상관 분석은 좋은 출발점이지만, 다변량 분석은 더 넓은 시각을 제공합니다. 상관 행렬 모든 변수와 다른 모든 변수 간의 쌍별 상관관계를 나타내는 정사각형 표입니다.
cor() 함수는 상관 행렬을 반환합니다. 이변량 상관관계와의 유일한 차이점은 어떤 변수를 지정할 필요가 없다는 것입니다. 기본적으로 R은 모든 변수 간의 상관 관계를 계산합니다.
요인에 대해서는 상관관계를 계산할 수 없으므로 데이터프레임을 cor() 함수에 전달하기 전에 모든 범주형 열을 제거하십시오.
상관 행렬은 대칭적입니다. 즉, 대각선 위의 값이 아래 값과 동일한 값을 가집니다. 행렬의 절반을 표시하는 것이 더 시각적입니다.
cor() 함수는 인수분해를 처리할 수 없으므로 children_fac는 제외됩니다.
# the last column of data is a factor level. We don't include it in the code mat_1 <-as.dist(round(cor(data[,1:9]),2)) mat_1
Code 설명
- cor(data[, 1:9])9개의 숫자 열에 대한 상관 행렬을 계산합니다.
- 라운드(…, 2)모든 계수를 소수점 둘째 자리까지 반올림하세요.
- as.dist()행렬이 대칭이므로 하삼각 부분만 출력합니다.
출력:
## wfood wfuel wcloth walc wtrans wother age log_income ## wfuel 0.11 ## wcloth -0.33 -0.25 ## walc -0.12 -0.13 -0.09 ## wtrans -0.34 -0.16 -0.19 -0.22 ## wother -0.35 -0.14 -0.22 -0.12 -0.29 ## age 0.02 -0.05 0.04 -0.14 0.03 0.02 ## log_income -0.25 -0.12 0.10 0.04 0.06 0.13 0.23 ## log_totexp -0.50 -0.36 0.34 0.12 0.15 0.15 0.21 0.49
유의 수준
계수 자체만으로는 관계가 통계적으로 신뢰할 만한지 여부를 판단할 수 없습니다. Hmisc 라이브러리의 rcorr() 함수는 각 쌍에 대한 p값을 반환합니다. 해당 라이브러리는 다음 링크에서 다운로드할 수 있습니다. 콘도 코드를 복사하여 터미널에 붙여넣습니다.
conda install -c r r-hmisc
rcorr()에는 행렬로 저장될 데이터 프레임이 필요합니다. p-값으로 상관 행렬을 계산하기 전에 데이터를 행렬로 변환할 수 있습니다.
library("Hmisc") data_rcorr <-as.matrix(data[, 1: 9]) mat_2 <-rcorr(data_rcorr) # mat_2 <-rcorr(as.matrix(data)) returns the same output
목록 객체 mat_2에는 세 가지 요소가 포함되어 있습니다.
- r: 상관행렬의 출력
- n: 관찰 횟수
- P: p-값
우리는 세 번째 요소인 p-값에 관심이 있습니다. 상관계수 대신 p-값을 사용하여 상관행렬을 표시하는 것이 일반적입니다.
p_value <-round(mat_2[["P"]], 3) p_value
Code 설명
- mat_2[[“P”]]: p-값은 P라는 요소에 저장됩니다.
- round(mat_2[[“P”]], 3): 요소를 세 자리 숫자로 반올림합니다.
출력:
wfood wfuel wcloth walc wtrans wother age log_income log_totexp wfood NA 0.000 0.000 0.000 0.000 0.000 0.365 0.000 0 wfuel 0.000 NA 0.000 0.000 0.000 0.000 0.076 0.000 0 wcloth 0.000 0.000 NA 0.001 0.000 0.000 0.160 0.000 0 walc 0.000 0.000 0.001 NA 0.000 0.000 0.000 0.105 0 wtrans 0.000 0.000 0.000 0.000 NA 0.000 0.259 0.020 0 wother 0.000 0.000 0.000 0.000 0.000 NA 0.355 0.000 0 age 0.365 0.076 0.160 0.000 0.259 0.355 NA 0.000 0 log_income 0.000 0.000 0.000 0.105 0.020 0.000 0.000 NA 0 log_totexp 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 NA
R에서 상관 행렬 시각화
히트맵은 상관 행렬을 해석하는 또 다른 방법입니다. GGally 라이브러리는 ggplot2를 확장한 것으로, conda가 아닌 CRAN에서 설치해야 합니다.
install.packages("GGally")
라이브러리에는 모든 변수의 상관 관계 및 분포와 같은 요약 통계를 표시하는 다양한 기능이 포함되어 있습니다. 매트릭스.
ggcorr() 함수에는 많은 인수가 있습니다. 튜토리얼에서 사용할 인수만 소개하겠습니다.
ggcorr 함수
ggcorr(df, method = c("pairwise", "pearson"), nbreaks = NULL, digits = 2, low = "#3B9AB2", mid = "#EEEEEE", high = "#F21A00", geom = "tile", label = FALSE, label_alpha = FALSE)
인수 :
- df: 사용된 데이터세트
- 방법: 상관관계를 계산하는 공식입니다. 기본적으로 쌍별 및 피어슨이 계산됩니다.
- nbreaks: 계수 색상에 대한 범주형 범위를 반환합니다. 기본적으로 끊김이 없으며 색상 그라데이션이 연속됩니다.
- 숫자: 상관계수를 반올림합니다. 기본적으로 2로 설정됩니다.
- 낮은: 발색의 낮은 단계를 조절합니다.
- 중순: 발색의 중간 정도를 조절합니다.
- 높은: 높은 발색력을 조절
- 기하학: 기하학적 인수의 모양을 제어합니다. 기본적으로 "타일"
- 상표: 부울 값. 라벨을 표시하거나 표시하지 않습니다. 기본적으로 'FALSE'로 설정됩니다.
기본 히트맵
패키지의 가장 기본적인 플롯은 히트 맵입니다. 그래프의 범례는 -1에서 1까지의 그라데이션 색상을 보여주는데, 뜨거운 색상은 강한 양의 상관관계를 나타내고 차가운 색상은 음의 상관관계를 나타냅니다.
library(GGally) ggcorr(data)
Code 설명
- ggcorr(데이터): 데이터 프레임 이름인 하나의 인수만 필요합니다. 요인 수준 변수는 그림에 포함되지 않습니다.
출력:
히트 맵에 제어 추가
그래프에 더 많은 컨트롤을 추가할 수 있습니다.
ggcorr(data, nbreaks = 6, low = "steelblue", mid = "white", high = "darkred", geom = "circle")
Code 설명
- nbreak=6: 6랭크로 전설을 깨뜨려보세요.
- 낮음 = "스틸블루": 음의 상관관계를 나타내려면 더 밝은 색상을 사용하십시오.
- 중간 = "흰색": 중간 범위의 상관관계를 위해 흰색 색상을 사용합니다.
- 높음 = “어두움”: 양의 상관관계를 위해서는 어두운 색상을 사용합니다.
- 기하학 = “원”: 히트 맵에서 창문 모양으로 원을 사용합니다. 원의 크기는 상관관계의 절대값에 비례합니다.
출력:
히트맵에 라벨 추가
GGally를 사용하면 창 내부에 레이블을 추가할 수 있습니다.
ggcorr(data, nbreaks = 6, label = TRUE, label_size = 3, color = "grey50")
Code 설명
- 라벨 = 참: 히트맵 내부의 상관계수 값을 추가합니다.
- 색상 = “회색50”: 색상을 선택하세요(예: 회색)
- label_size = 3: 라벨의 크기를 3으로 설정
출력:
ggpairs 함수
GGally 라이브러리는 플롯 행렬을 반환하는 ggpairs() 함수도 제공합니다. k개의 변수를 선택하면 결과는 ak x k 그리드 형태로 나타납니다. 대각선에는 각 변수의 분포가 표시되고, 대각선 위아래 패널에는 각각 다른 계산 결과가 표시됩니다. 구문은 다음과 같습니다.
ggpairs(df, columns = 1:ncol(df), title = NULL, upper = list(continuous = "cor"), lower = list(continuous = "smooth"), mapping = NULL)
인수 :
- df: 사용된 데이터세트
- 열: 플롯을 그릴 열을 선택합니다.
- 제목: 제목 포함
- 상단그래프 대각선 위의 상자를 제어합니다. 반환할 계산 또는 그래프 유형을 지정해야 합니다. `continuous = “cor”`로 설정하면 R에게 상관관계를 계산하도록 요청합니다. 인수는 리스트여야 합니다. 다른 인수도 사용할 수 있습니다. 자세한 내용은 해당 문서를 참조하십시오. GGally 문서
- 절감: 대각선 아래의 상자를 제어합니다.
- 지도ping: 그래프의 심미성을 나타냅니다. 예를 들어, 다양한 그룹에 대한 그래프를 계산할 수 있습니다.
ggpair와 grou를 사용한 이변량 분석ping
다음 그래프에는 세 가지 정보가 표시됩니다.
- 가구에 자녀가 있는지 여부에 따라 그룹화된 log_totexp, log_income, age 및 wtrans 변수 간의 상관 행렬입니다.
- 그룹별 각 변수의 분포를 도표화합니다.
- 그룹별 추세를 산점도로 표시
library(ggplot2) ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor", size = 3)), lower = list(continuous = wrap("smooth", alpha = 0.3, size = 0.1)), mapping = aes(color = children_fac))
Code 설명
- 열 = c(“log_totexp”, “log_income”, “age”, “wtrans”): 그래프에 표시할 변수를 선택합니다.
- title = “영국 가계의 수입 지출에 대한 이변량 분석”: 제목 추가
- 상단 = 목록(): 그래프의 상단 부분을 제어합니다. 즉, 대각선 위
- 연속 = Wrap(“cor”, 크기 = 3)): 상관계수를 계산합니다. 그래프의 미학을 제어하기 위해 Wrap() 함수 내부에 연속 인수를 래핑합니다(예: 크기 = 3). -lower = list(): 그래프의 아래쪽 부분을 제어합니다. 즉, 대각선 아래.
- 연속 = 랩("부드러운",알파 = 0.3,크기=0.1): 선형 추세가 있는 산점도를 추가합니다. 그래프의 미학을 제어하기 위해 Wrap() 함수 내부에 연속 인수를 래핑합니다(예: 크기=0.1, 알파=0.3).
- 지도ping = aes(color = children_fac): 모든 패널을 children_fac(자녀가 없는 가구는 "아니오", 자녀가 있는 가구는 "예"로 표시된 순서형 요인)을 기준으로 분할합니다.
출력:
부분 그룹을 사용한 ggpair를 이용한 이변량 분석ping
아래 그래프는 약간 다릅니다. 지도의 위치를 바꿨습니다.ping 상위 인수 내부.
ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor", size = 3), mapping = aes(color = children_fac)), lower = list( continuous = wrap("smooth", alpha = 0.3, size = 0.1)) )
Code 설명
- 다음을 제외하면 이전 예제와 완전히 동일한 코드입니다.
- 지도ping = aes(color = children_fac): 상단의 리스트를 list()로 이동합니다. 그래프의 상단 부분에는 그룹별로 계산된 결과만 표시되도록 하고 싶습니다.
출력:
R에서의 상관관계 분석: 핵심 내용 및 함수 참조
- 이변량 관계는 R의 두 변수 사이의 관계 또는 상관 관계를 설명합니다.
- 두 변수 사이의 상관 관계를 계산하는 두 가지 기본 방법이 있습니다. R 프로그래밍: 피어슨 앤 스피어먼.
- Pearson 상관관계 방법은 일반적으로 두 변수 간의 관계에 대한 기본 검사로 사용됩니다.
- 순위 상관은 관측치를 순위별로 정렬하고 순위 간의 유사성 수준을 계산합니다.
- 스피어만 순위 상관계수는 -1에서 1 사이의 값을 가지며, 양 극단에 가까운 값은 강한 단조 관계를 나타냅니다.
- 상관행렬은 모든 변수 간의 쌍별 상관관계를 담고 있는 정사각형 표입니다.
- p값은 관찰된 상관관계가 통계적으로 0과 구별되는지 여부를 알려줍니다.
이 튜토리얼에서 사용된 모든 상관 함수는 아래에 나열되어 있습니다.
| 도서관 | 목표 | 방법 | Code |
|---|---|---|---|
| Base | 이변량 상관관계 | 피어슨 |
cor(dfx2, method = "pearson") |
| Base | 이변량 상관관계 | 창병 |
cor(dfx2, method = "spearman") |
| Base | 다변량 상관관계 | 피어슨 |
cor(df, method = "pearson") |
| Base | 다변량 상관관계 | 창병 |
cor(df, method = "spearman") |
| 흐미스크 | P 값 | - |
rcorr(as.matrix(data[,1:9]))[["P"]] |
| GGally | 히트 맵 | - |
ggcorr(df)
|
| GGally | 다변량 플롯 행렬 | - |
ggpairs(df, columns = c("x1", "x2")) |









