변수의 개수 및 데이터의 형태에 따라서 그래프, 시각화 방법이 달라지는데요,

 

지난번 포스팅에서는 한 변수의 연속형 데이터의 시각화 방법으로

 

 - 히스토그램(Histogram)
    : geom_histogram()

- 커널 밀도 곡선(Kernel Density Curve)
    : geom_density()

 - 박스 그래프(Box Plot)
    : geom_boxplot()

 - 바이올린 그래프(Violin Plot)
    : geom_violin()

 

범주형 데이터에 대한 시각화 방법으로

 

 - 막대그림(Bar Chart): geom_bar()

 - 원그림(Pie Chart): geom_bar() + coord_polar()

 - 모자이크 그림(Mosaic Chart): vcd 패키지 mosaic()

 

알아보았습니다.

 

 

이번에는 두 개 이상의 연속형 변수를 시각화하는 방법으로

 

 - 산점도 (Scatter Plot): geom_point()

 - 선 그래프(Line Plot): geom_line()

 - 시계열 그래프(Time Series Plot): geom_line()  

 

에 대해서 알아보겠습니다.

 

참고로 ☞ ggplot2의 geom_point() 산점도 그리기 

          ☞ Base Graphics 패키지의 pairs() 함수를 사용한 산점도 행렬 그리기

 

 

[ 변수 개수 및 형태에 따른 그래프 종류 ]

 

 

 

 

산점도(Scatter Plot)는 x축과 y축에 연속형인 두 변수의 값을 점으로 뿌려준 그래프로서, 연속형인 두 변수 간의 관계를 파악하는데 유용합니다.  다중회귀분석을 할 때 제일 처음 하는 일이 바로 산점도 (행렬)을 그려보고 두 변수간의 선형성 여부를 탐색해보는 일입니다.

 

MASS패키지 내 Cars93 데이터 프레임의 고속도로연비(MPG.highway)와 엔진크기(EngineSize), 무게(Weight), 길이(Length) 와의 관계를 ggplot2 패키지의 geom_point() 함수를 가지고 산포도를 그려서 알아보도록 하겠습니다.   그리고 차종(Type)별로 고속도로연비(MPG.highway) 는 어떻게 되는지도 산포도를 가지고 점의 색깔과 모양을 달리해서 보는 방법을 알아보겠습니다.

 

 

> library(MASS)
> str(Cars93)
'data.frame':	93 obs. of  27 variables:
 $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
 $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
 $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
 $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
 $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
 $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
 $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
 $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
 $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
 $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
 $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
 $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
 $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
 $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
 $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
 $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
 $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
 $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
 $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
 $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
 $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
 $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
 $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
 $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
 $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
 $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
 $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ...

 

 

상관계수를 가지고 고속도로연비(MPG.highway)와 엔진크기(EngineSize), 무게(Weight), 길이(Length) 와의 상관도를 먼저 살펴보면, 고속도로연비와 엔진크기, 무게, 길이가 모두 역의 상관관계가 있는 걸로 나왔고, 특히 무게가 역의 상관관계가 크게 나왔습니다.  

 

> Cars93_MPG <- Cars93[,c("MPG.highway", "EngineSize", "Weight", "Length")]
> cor(Cars93_MPG)
            MPG.highway EngineSize     Weight     Length
MPG.highway   1.0000000 -0.6267946 -0.8106581 -0.5428974
EngineSize   -0.6267946  1.0000000  0.8450753  0.7802831
Weight       -0.8106581  0.8450753  1.0000000  0.8062743
Length       -0.5428974  0.7802831  0.8062743  1.0000000 

 

 

이제 산점도를 그려서 고속도로연비(MPG.highway)와 엔진크기(EngineSize), 무게(Weight), 길이(Length) 관계를 살펴보겠습니다.

 

제일 쉬운 방법은 Base graphics 패키지에 있는 plot()함수를 사용하는 방법입니다.  위에서 분석하려는 변수만 따로 선별해놓은 Cars93_MPG 데이터 프레임을 가지고 한번 산점도 행렬을 그려보겠습니다.

 

> plot(Cars93_MPG, 
+      main="Scatter Plot Matrix")

 

 

 

 

 

 

ggplot2로는 산점도 행렬(Scatter Plot matrix)를 그리는 것이 힘듭니다.  대신 여러 조건을 주어서 두 변수 간 산점도 행렬을 다양하게 그려보는데는 아주 강력합니다   우선 ggplot2의 geom_point()함수를 가지고 색깔(colour)과 모양(shape)을 달리하면서 산점도를 그려보겠습니다.

 

> # Scatter Plot: MPG.highway vs. EngineSize, Weight, Length
> library(ggplot2)
> 
> ggplot(data=Cars93, aes(x=EngineSize, y=MPG.highway)) + 
+   geom_point(shape=15, size=3, colour="blue") + # shape 15: solid square
+   ggtitle("Scatter Plot: MPG.highway vs. EngineSize")

 

 

 

 
 

 

> ggplot(data=Cars93, aes(x=Weight, y=MPG.highway)) + 
+   geom_point(shape=19, size=3, colour="red") + # shape 19: solid circle
+   ggtitle("Scatter Plot: MPG.highway vs. Weight")

 

 

 

 

 

 

> ggplot(data=Cars93, aes(x=Length, y=MPG.highway)) + 
+   geom_point(shape=24, size=3, colour="black") + # shape 24: filled triangle point-up
+   ggtitle("Scatter Plot: MPG.highway vs. Length")

 

 

 

 

 

 

참고로, R plot의 숫자별 모양은 다음과 같습니다.

 

> # R plot symbols: points
> help(pch)

 

 

 

 

 

 

이번에는 두 변수의 산포도에 모델명 라벨을 geom_text(label=) 함수를 이용하여 입혀보겠습니다.  

 

> # Scatter Plot with Label (Model Name) > ggplot(data=Cars93, aes(x=Weight, y=MPG.highway)) + + geom_point(shape=19, size=3, colour="red") + # shape 19: solid circle + ggtitle("Scatter Plot: MPG.highway vs. Weight with Model Label") + + geom_text(aes(label=Model, size=2, vjust=-1, hjust=0)) # vjust=-1 위로, hjust=1 오른쪽

 

 

 

 

 

 

 

다음으로 차종(Type)별로 구분하여서 무게(Weight)와 고속도로연비(MPG.highway) 간의 관계를 3가지 방법을 사용하여 산포도로 그려보도록 하겠습니다.

 

     (1) 차종(Type)별로 색깔(colour)을 달리해서

     (2) 차종(Type)별로 모양(shape)을 달리해서

     (3) 차종(Type)별로 층(facet_grid)을 나누어서

산포도를 그려보겠습니다.

 

 

(1) 차종(Type)별로 색깔(colour)을 달리했을 때 

 

> # Scatter Plot by Type, using different Colours
> ggplot(data=Cars93, aes(x=Weight, y=MPG.highway, colour=Type)) + 
+   geom_point(shape=19, size=3) + 
+   ggtitle("Scatter Plot by Type, using different Colours")

 

 

 

 

 

 

 (2) 차종(Type)별로 모양(shape)을 달리했을 때

 

> # Scatter Plot by Type, differenct Shapes
> ggplot(data=Cars93, aes(x=Weight, y=MPG.highway, shape=Type)) + 
+   geom_point(size=3) + 
+   ggtitle("Scatter Plot by Type, differenct Shapes")

 

 

 

 

 

(3) 차종(Type)별로 층(facet_grid)을 나누어서 산포도를 그릴 때 

 

> # Scatter Plot by Type, using facet_grid
> ggplot(data=Cars93, aes(x=Weight, y=MPG.highway)) + 
+   geom_point(size=3, shape=19) + 
+   facet_grid(Type ~.) +
+   ggtitle("Scatter Plot by Type, using facet_grid")

 

 

 

 

 

 

다음으로, 산포도에 선형 회귀선 (신뢰구간 95%)을 적합시켜보겠습니다.

 

> # Scatter Plot with linear regression line
> ggplot(data=Cars93, aes(x=Weight, y=MPG.highway)) + 
+   geom_point(shape=19, size=3, colour="red") + # shape 19: solid circle 
+   stat_smooth(method=lm, level=0.95) + 
+   ggtitle("Scatter Plot: Linear Regression Line with Confidence Level 95%")
 

 

 

 

아래는 산포도에 회귀선을 적합시켰는데, 위와는 다르게 신뢰구간은 뺀 경우입니다.

 

> ggplot(data=Cars93, aes(x=Weight, y=MPG.highway)) + 
+   geom_point(shape=19, size=3, colour="red") + # shape 19: solid circle 
+   stat_smooth(method=lm, se=FALSE) + 
+   ggtitle("Scatter Plot: Linear Regression Line without Confidence Level")

 

 

 

 

 

 

산포도에 선을 적합시킬 때 선형회귀선말고도 loess(locally weighted polynomial) 를 써서 비모수 회귀(Nonparametric regression) 선을 적합시킬 수도 있습니다.

 

> # Scatter Plot with loess(locally weighted polynomial)
> ggplot(data=Cars93, aes(x=Weight, y=MPG.highway)) + 
+   geom_point(shape=19, size=3, colour="red") + # shape 19: solid circle 
+   stat_smooth(method=loess, level=0.95) + 
+   ggtitle("Scatter Plot: loess Line with Confidence Level 95%")

 

 

 

 

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

 

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

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. Taecong 2019.11.08 22:36  댓글주소  수정/삭제  댓글쓰기

    선생님 명령어 그대로 복사 붙여넣기 하면 그림이 안나와요..

    Error: Cannot use `+.gg()` with a single argument. Did you accidentally put + on a new line?

    이런 에러만 자꾸 뜨네요 ㅜ

    • R Friend R_Friend 2019.11.08 22:41 신고  댓글주소  수정/삭제

      아, 그것은 앞에 '+' 부호를 빼고 돌리면 됩니다.

      RStudio에서 실행하면 console 창에는 원래 코드에 줄바꿈될 때 '+' 부호가 따라서 붙는데요, 제가 편집창이 아닌 console창의 실행 후 코드('+' 가 붙은) 를 복사해서 붙여서 그런 것입니다.

      포스팅 본문에서 줄바꿈 될 때마다 앞에 붙어있는 '+' 부호를 떼어내고서 다시 돌려보시기 바랍니다.

      단 코드 줄마다 제일 뒤의 '+' 부호는 그대로 두시구요.