데이터셋을 받으면 제일 먼저 하는 일이 데이트의 구조를 파악하고, 변수명, 변수별 데이터 유형(숫자형, 문자형, 논리형), 결측값 여부, 이상치/영향치 여부, 데이터의 퍼진 정도/분포 모양 등을 탐색하게 됩니다.

 

하나의 연속형 변수에 대한 퍼진 정도/분포 모양와 이상치 여부를 쉽고 빠르게 파악할 수 있는 그래프로

 - 히스토그램(Histogram)

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

 - 박스그림(Box Plot)

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

등 이 있습니다.

 

 

 

[ 변수 개수 및 형태별 그래프 종류 ]

 

 

 

 

박스 그래프(Box Plot)는 Box-and-Whiskers Plot 이라고도 하는데요, 연속형 변수에 대해 min, Q1, median, Q3, max, lower whisker, upper whisker, outlier(*IQR(Inter-Quartile Range)의 1.5배 초과 시) 등을 한눈에 볼 수 있게 그린 그래프입니다. 연속형 한 변수의 분포의 중심, 퍼짐 정도(variance), 치우침 정도(skewness), 이상치/특이값(outlier) 존재 여부, 대칭성(symmetry) 등을 알 수 있는 매우, 매우, 매우 유용한 그래프라고 하겠습니다.  특히 박스 그래프는 이상치에 덜 민감한(robust) 중앙값, IQR 값을 사용한다는 점에서 이상치에 민감한 평균, 표준편차 대비 중심 경향과 퍼짐 정도를 파악하는데 있어 상대적으로 더 믿을 만 하다고 말할 수 있습니다.  상당히 유용하겠지요?!

 

 

[ 박스 그래프(Box-Whiskers Plot) 이해 ]

 

 

 

이번 포스팅에서는 먼저 ggplot2 패키지의 geom_boxplot() 를 활용해서 박스그래프(상자그림)을 그리는 방법에 대해서 알아보겠습니다. 

 

데이터는 MASS 패키지에 들어있는 Cars93 데이터 프레임 데이터 셋에서 가격(Price)과 자동차유형(Type) 변수를 활용하여 히스토그램을 그려보겠습니다. 

 

> # Cars93 데이터 프레임
> 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 ...

 

 

 

그럼, 먼저 Cars93 데이터 프레임 내 가격(Price) 변수 하나를 가지고 geom_boxplot()을 사용하여 박스 그래프(Box Plot)을 그려보겠습니다. 

 

> ggplot(Cars93, aes(x = 1, y = Price)) + # x=1 (임의의 값) 지정해줘야 함
+   geom_boxplot(width=0.8, outlier.size=3, outlier.shape=16, outlier.colour="red") + 
+   scale_x_continuous(breaks = NULL) + # x축 이름 생략
+   theme(axis.title.x = element_blank()) + # x축 구분자 생략
+   ggtitle("Box Plot")

 

 

 

 

 

 

다음으로, 차종별(Type)로 가격(Price) 변수에 대해 박스 그래프를 그려보겠습니다.  aes(x = factor variable) 을 입력해주면 되겠습니다.  여기서 주의할 점은 x 에다가 요인(factor)형 변수를 입력해줘야 합니다.  차종(Type)은 이미 요인형 변수이므로 그대로 입력하면 되겠구요, 만약 요인형 변수가 아니라면 x=factor(variable name)  이런 식으로 입력해주거나, 아니면 transform() 함수로 as.factor()로 데이터 형태를 요인형 변수로 아예 만든 후에 ggplot2 그래프를 그려도 되겠습니다.

 

> # 박스그림(Box Plot) - 차종별(Type)
> ggplot(Cars93, aes(x = Type, y = Price)) + 
+   geom_boxplot(width=0.8, outlier.size=3, outlier.shape=16, outlier.colour="red") +
+   ggtitle("Box Plot by Car Type")

 

 

 

 

 

 

위의 차종(Type)별 박스그림의 박스 가운데 선은 중앙값(Median)을 나타낸다고 했는데요, 이번에는 평균을 추가해 보도록 하겠습니다.  평균은 이상치에 민감하므로 아래 예제처럼 이상치가 있는 경우에는 중심화 경향을 나타내는 통계량으로 부적합하며, 박스 그림의 박스 가운데에 쳐진 선이 의미하는 중앙값(Median) 이 더 적합한 중심화 경향 지표라고 하겠습니다.

 

> # box plot with mean > ggplot(Cars93, aes(x = Type, y = Price)) + + geom_boxplot(width=0.8, outlier.size=3, outlier.shape=16, outlier.colour="red") + + stat_summary(fun.y="mean", geom="point", shape=21, size=3, fill="blue") + + ggtitle("Box Plot by Car Type, adding mean")

 

 

 

 


만약 차종(Type)과 생산지(Origin)의 두 기준/그룹으로 구분해서 박스 그래프를 그리고 싶다면 aes(fill = Origin) 을 추가해주면 됩니다. 



> ggplot(Cars93, aes(x = Type, y = Price, fill = Origin)) + 

+   geom_boxplot(width=0.8, outlier.size=3, outlier.shape=16, outlier.colour="red") +

+   ggtitle("Box Plot by Car Type and Origin")

 





 

다음으로 박스 그래프(Box Plot)와 커널 밀도 곡선(Kernel Density Curve)을 짬뽕해놓은 바이올린 그래프(Violin Plot)를 geom_violin()을 사용해 그려보겠습니다.  제공해주는 정보량이 많아서 바이올린 그래프(Violin Plot) 또한 유용한 편인데요, 실전에서는 별로 사용하지 않게 되는 그래프이기도 합니다. ^^;

 

> # Violin Plot with Box Plot
> ggplot(Cars93, aes(x = Type, y = Price)) + 
+   geom_violin() + 
+   geom_boxplot(width=0.1, fill="white", outlier.colour=NA) +
+   stat_summary(fun.y="median", geom="point", shape=21, size=2, fill="black") + 
+   ggtitle("Violin Plot by Car Type with Box Plot")

 

 

 

 

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

 

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

 

 

728x90
반응형
Posted by Rfriend
,