쭈쌤
쭈쌤 Hello World

[R 데이터분석] 상관분석

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터분석] 상관분석≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[R 데이터분석] 상관분석

상관분석은 두 변수가 서로 관련이 있는지 검정하는 통계 분석 기법입니다.

#01. 상관계수 (Correlation Coefficient)

상관분석을 통해 도출한 값으로 두 변수가 얼마나 관련되어 있는지, 관련성의 정도를 파악할 수 있다.

  • 상관계수는 0~1 사이의 값을 갖는다.
  • 1에 가까울 수록 관련성이 크다는 의미.
  • 양수면 정비례, 음수면 반비례 관계임을 의미.

상관 분석은 R에 내장된 cor.test() 함수를 이용하여 수행할 수 있다.

1) 패키지 및 샘플 데이터 준비

패키지 가져오기

1
2
3
4
5
6
7
8
9
10
REPO_URL <- "https://cran.seoul.go.kr"

# 패키지 설치 및 로드
if (!require(ggplot2))  install.packages("ggplot2", repos=REPO_URL)
if (!require(corrplot)) install.packages("corrplot", repos=REPO_URL)
if (!require(dplyr))    install.packages("dplyr", repos=REPO_URL)

library(ggplot2)
library(corrplot)
library(dplyr)

샘플 데이터 준비

ggplot2에 내장된 샘플 데이터 활용

자동차 32종의 11개 속성에 대한 정보를 담고 있는 데이터

1
mtcars
▶ 출력결과

A data.frame: 32 × 11

mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Mazda RX421.06160.01103.902.62016.460144
Mazda RX4 Wag21.06160.01103.902.87517.020144
Datsun 71022.84108.0 933.852.32018.611141
Hornet 4 Drive21.46258.01103.083.21519.441031
Hornet Sportabout18.78360.01753.153.44017.020032
Valiant18.16225.01052.763.46020.221031
Duster 36014.38360.02453.213.57015.840034
Merc 240D24.44146.7 623.693.19020.001042
Merc 23022.84140.8 953.923.15022.901042
Merc 28019.26167.61233.923.44018.301044
Merc 280C17.86167.61233.923.44018.901044
Merc 450SE16.48275.81803.074.07017.400033
Merc 450SL17.38275.81803.073.73017.600033
Merc 450SLC15.28275.81803.073.78018.000033
Cadillac Fleetwood10.48472.02052.935.25017.980034
Lincoln Continental10.48460.02153.005.42417.820034
Chrysler Imperial14.78440.02303.235.34517.420034
Fiat 12832.44 78.7 664.082.20019.471141
Honda Civic30.44 75.7 524.931.61518.521142
Toyota Corolla33.94 71.1 654.221.83519.901141
Toyota Corona21.54120.1 973.702.46520.011031
Dodge Challenger15.58318.01502.763.52016.870032
AMC Javelin15.28304.01503.153.43517.300032
Camaro Z2813.38350.02453.733.84015.410034
Pontiac Firebird19.28400.01753.083.84517.050032
Fiat X1-927.34 79.0 664.081.93518.901141
Porsche 914-226.04120.3 914.432.14016.700152
Lotus Europa30.44 95.11133.771.51316.901152
Ford Pantera L15.88351.02644.223.17014.500154
Ferrari Dino19.76145.01753.622.77015.500156
Maserati Bora15.08301.03353.543.57014.600158
Volvo 142E21.44121.01094.112.78018.601142

2) 상관분석 수행

mpg(연비)와 cyl(실린더 수)의 상관분석

1
cor.test(mtcars$mpg, mtcars$cyl)
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
Pearson's product-moment correlation

data:  mtcars$mpg and mtcars$cyl
t = -8.9197, df = 30, p-value = 6.113e-10
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.9257694 -0.7163171
sample estimates:
      cor
-0.852162

상관계수(cor)가 -0.852162이므로 연비와 실린더 수는 반비례 관계이고, 1에 가까우므로 서로 연관성이 높다고 볼 수 있다.

cyl(실린더 수)와 wt(무게)의 상관분석

1
cor.test(mtcars$cyl, mtcars$wt)
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
Pearson's product-moment correlation

data:  mtcars$cyl and mtcars$wt
t = 6.8833, df = 30, p-value = 1.218e-07
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.5965795 0.8887052
sample estimates:
      cor
0.7824958

상관계수(cor)가 0.7824958이므로 실린더가 많을 수록 더 무거운 경향이 있다는 것을 알 수 있다.

#02. 상관분석 시각화 하기

1) 상관 행렬

여러 변수의 관련성을 한 번에 알아보고기 위해 모든 변수의 상관 관계를 나타낸 행렬로서 각 변수가 서로 교차하는 지점이 두 변수간의 상관계수이다.

상관행렬을 보면 어떤 변수끼리 관련이 크고 적은지 파악할 수 있다.

1
2
car_cor <- cor(mtcars)
round(car_cor, 2) # 소수점 셋째 자리에서 반올림해서 출력
▶ 출력결과

A matrix: 11 × 11 of type dbl

mpgcyldisphpdratwtqsecvsamgearcarb
mpg 1.00-0.85-0.85-0.78 0.68-0.87 0.42 0.66 0.60 0.48-0.55
cyl-0.85 1.00 0.90 0.83-0.70 0.78-0.59-0.81-0.52-0.49 0.53
disp-0.85 0.90 1.00 0.79-0.71 0.89-0.43-0.71-0.59-0.56 0.39
hp-0.78 0.83 0.79 1.00-0.45 0.66-0.71-0.72-0.24-0.13 0.75
drat 0.68-0.70-0.71-0.45 1.00-0.71 0.09 0.44 0.71 0.70-0.09
wt-0.87 0.78 0.89 0.66-0.71 1.00-0.17-0.55-0.69-0.58 0.43
qsec 0.42-0.59-0.43-0.71 0.09-0.17 1.00 0.74-0.23-0.21-0.66
vs 0.66-0.81-0.71-0.72 0.44-0.55 0.74 1.00 0.17 0.21-0.57
am 0.60-0.52-0.59-0.24 0.71-0.69-0.23 0.17 1.00 0.79 0.06
gear 0.48-0.49-0.56-0.13 0.70-0.58-0.21 0.21 0.79 1.00 0.27
carb-0.55 0.53 0.39 0.75-0.09 0.43-0.66-0.57 0.06 0.27 1.00

2) 상관행렬 히트맵

상관행렬을 그래프로 표시한 형태를 상관행렬 히트맵.

corrplot 패키지를 이용해 상관행렬에서 상관계수 값의 크기를 색상으로 표현한 그래프로 구성할 수 있다.

기본 사용 방법

1
corrplot(car_cor)

png

원 대신 상관계수를 출력하기

1
corrplot(car_cor, method = "number")
▶ 출력결과

png

옵션 지정하기

사용할 색상 목록 지정
1
col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
상세 옵션을 지정한 히트맵 생성
1
2
3
4
5
6
7
8
9
corrplot(car_cor,                # 상관행렬
         method = "color",       # 색깔로 표현
         col = col(200),         # 색상 200개 선정
         type = "lower",         # 왼쪽 아래 행렬만 표시
         order = "hclust",       # 유사한 상관계수끼리 군집화
         addCoef.col = "black",  # 상관계수 색깔
         tl.col = "black",       # 변수명 색깔
         tl.srt = 45,            # 변수명 45도 기울임
         diag = FALSE)           # 대각 행렬 제외
▶ 출력결과

png

#03. 교통사고 발생건수와 부상자 수의 상관관계 분석

1) 샘플 데이터 가져오기

1
2
교통사고 <- read.csv("http://itpaper.co.kr/demo/r/traffic.csv", stringsAsFactors=F, fileEncoding="euc-kr")
교통사고
▶ 출력결과
A data.frame: 168 × 5
년도발생건수사망자수부상자수
<int><int><int><int><int>
2005 11549450425413
2005 21324443121635
2005 31658047725550
2005 41781750728131
2005 51908557129808
2005 61809247628594
2005 71867552829984
2005 81903556231603
2005 91875957729831
2005101975763931597
2005111912957430337
2005121850453029750
2006 11497142024533
2006 21427037322903
2006 31676746526013
2006 41794846928725
2006 51914053130279
2006 61743545527032
2006 71863451629978
2006 81879458530882
2006 91929358030186
2006101910065130715
2006111987770131270
2006121751658127713
2007 11491446823975
2007 21469644623717
2007 31816647628811
2007 41805546028555
2007 51926451630532
2007 61831053828662
...............
2016 71895535828586
2016 81839833628017
2016 91788337526761
2016101991844029635
2016111923441628520
2016121886940828192
2017 11697035326099
2017 21483228022323
2017 31704729525046
2017 41771729326530
2017 51850236627268
2017 61804731526454
2017 71815835727362
2017 81868235328162
2017 91989141929371
2017101886342028698
2017111937737928472
2017121824935527044
2018 11702630425438
2018 21620827524630
2018 31702231025015
2018 41799230326643
2018 51863630927834
2018 61808226626574
2018 71869931528104
2018 81833535727749
2018 91837134827751
2018101973837328836
2018111902929828000
2018121801032326463

2) 상관분석 수행

발생건수와 부상자수의 상관분석

1
cor.test(교통사고$발생건수, 교통사고$부상자수)
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
Pearson's product-moment correlation

data:  교통사고$발생건수 and 교통사고$부상자수
t = 37.867, df = 166, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.9283630 0.9604416
sample estimates:
      cor
0.9467014

상관계수(cor)가 0.9467014 이므로 교통사고 발생건수와 부상자 수는 아주 밀접한 관계가 있다는 것을 알 수 있다.

발생건수와 사망자수의 상관분석

1
cor.test(교통사고$발생건수, 교통사고$사망자수)
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
Pearson's product-moment correlation

data:  교통사고$발생건수 and 교통사고$사망자수
t = 4.8234, df = 166, p-value = 3.175e-06
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.2103588 0.4767059
sample estimates:
      cor
0.3506018

상관계수(cor)가 0.3506018 이므로 교통사고 발생건수와 사망자수는 큰 관계가 없다.

상관행렬

1
2
교통사고_상관관계 <- cor( 교통사고 %>% select(c(발생건수,사망자수,부상자수)) )
round(교통사고_상관관계, 2) # 소수점 셋째 자리에서 반올림해서 출력
▶ 출력결과
A matrix: 3 × 3 of type dbl
발생건수사망자수부상자수
발생건수1.000.350.95
사망자수0.351.000.55
부상자수0.950.551.00

히트맵

1
2
3
4
5
6
7
8
9
10
col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))

corrplot(교통사고_상관관계,         # 상관행렬
         method = "color",       # 색깔로 표현
         type = "lower",         # 왼쪽 아래 행렬만 표시
         order = "hclust",       # 유사한 상관계수끼리 군집화
         addCoef.col = "black",  # 상관계수 색깔
         tl.col = "black",       # 변수명 색깔
         tl.srt = 45,            # 변수명 45도 기울임
         diag = FALSE)           # 대각 행렬 제외
▶ 출력결과

png

#03. 산점도 그래프

두 변수 간의 영향력을 보여주기 위해 가로 축과 세로 축에 데이터 포인트를 그리는 그래프.

포인터들이 오밀조밀 뭉쳐 있으면 두 변수는 서로 관련성 정도가 높고 흩어져 있으면 관련성이 낮고 분석한다.

상관계수의 정도를 시각화 하는 그래프

1) 산점도 그래프의 의미 -> 상관 관계

산점도에서 사용되는 두 변수 간의 관계

그래프에 표시되는 마커들의 배열이 직선에 가까운 경우 두 변수의 상관 관계가 높다.

마커가 산점도에 균등하게 분산되는 경우 상관 관계가 낮거나 0이다.

상관관계의 유형
  • 정의관계 : x가 증가할 때 y도 증가 (상관계수가 0보다 큼)
  • 역의관계 : x가 증가할 때 y는 감소 (상관계수가 0보다 작음)
  • 선형관계 : 직선에 가까운 배치 (상관계수가 1에 가까움)
  • 비선형관계 : 곡선에 가까운 배치 (상관계수가 1에 가깝지 않음)

2) 교통사고 발생건수와 부상자수의 상관관계

1
options(repr.plot.width=20, repr.plot.height=12, warn=-1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ggplot(data=교통사고) +
    geom_point(aes(x=발생건수, y=부상자수), size=3, colour='blue') +
    # 배경을 흰색으로 설정
    theme_bw() +
    # 그래프 타이틀 설정
    ggtitle("교통사고 발생건수와 부상자 수의 상관관계") +
    # x축 제목 설정 --> 표시안함을 위해 빈 문자열 설정
    xlab("발생건수") +
    # y축 제목 설정 --> 표시안함을 위해 빈 문자열 설정
    ylab("부상자수") +
    # 각 텍스트의 색상, 크기, 각도, 글꼴 설정
    theme(plot.title=element_text(family="NanumGothic", color="#0066ff", size=25, face="bold"),
          axis.title.x=element_text(family="NanumGothic", color="#999999", size=18, face="bold"),
          axis.title.y=element_text(family="NanumGothic", color="#999999", size=18,face="bold", hjust=1),
          axis.text.x=element_text(family="NanumGothic", color="#000000", size=16, angle=45),
          axis.text.y  = element_text(family="NanumGothic", color="#000000", size=16, angle=45))
▶ 출력결과

png

3) 교통사고 발생건수와 사망자수의 상관관계

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ggplot(data=교통사고) +
    geom_point(aes(x=발생건수, y=사망자수), size=3, colour='#ff6600') +
    # 배경을 흰색으로 설정
    theme_bw() +
    # 그래프 타이틀 설정
    ggtitle("교통사고 발생건수와 부상자 수의 상관관계") +
    # x축 제목 설정 --> 표시안함을 위해 빈 문자열 설정
    xlab("발생건수") +
    # y축 제목 설정 --> 표시안함을 위해 빈 문자열 설정
    ylab("부상자수") +
    # 각 텍스트의 색상, 크기, 각도, 글꼴 설정
    theme(plot.title=element_text(family="NanumGothic", color="#ff0000", size=25, face="bold"),
          axis.title.x=element_text(family="NanumGothic", color="#999999", size=18, face="bold"),
          axis.title.y=element_text(family="NanumGothic", color="#999999", size=18,face="bold", hjust=1),
          axis.text.x=element_text(family="NanumGothic", color="#000000", size=16, angle=45),
          axis.text.y  = element_text(family="NanumGothic", color="#000000", size=16, angle=45))
▶ 출력결과

png

Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터분석] 상관분석≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus