14.1 레이더 차트(radar chart), or 거미줄 그림(spider plot)

이번 포스팅에서는 (1) 레이더 차트 (radar chart)에 대해서 소개하겠습니다. 방사형의 레이더 차트가 마치 거미줄을 닮아서 거미줄 그림 (spider plot)이라고도 부릅니다.

별 그림 (star plot) 도 레이더 차트와 형태는 거의 유사한데요, 약간 현태가 다른 점이 있고 stars 라는 R 패키지가 별도로 있고 해서 다음번에 따로 설명을 드리겠습니다.

14.1.1 데이터 세트

R 실습에 사용할 데이터는 MASS 패키지에 내장되어 있는 Cars93 데이터프레임입니다. 분석 대상 변수로는 차 유형(Type), 가격(Price), 고속도로연비(MPG.highway), 마력(Horsepower), 분당회전수RPM(RPM), 길이(Length), 무게(Weight) 등의 7개 변수입니다.

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 ...

14.1.2 데이터 전처리

14.1.2.1 차 유형별 분할표 작성

먼저 table() 함수를 사용하여 차 유형별 분할표를 만들어보았습니다. 6종류의 차 유형별로 10~20여대씩 분포하고 있음을 알 수 있습니다.

# cross tabulation by car type
table(Cars93$Type)
## 
## Compact   Large Midsize   Small  Sporty     Van 
##      16      11      22      21      14       9

14.1.2.2 차 유형별 평균 구하기

다음으로, 차 유형(Type)별로 가격(Price), 고속도로연비(MPG.highway), 마력(Housepower), 분당회전수RPM(RPM), 길이(Length), 무게(Weight) 등 6개 변수별 평균(mean)을 구해보겠습니다.

doBy package 의 summaryBy() 함수를 사용하면 연속형변수의 다변량 데이터에 일괄적으로 요약통계량을 편리하게 계산할 수 있습니다. Base package가 아니므로 install.packages("doBy")로 설치하시고, library(doBy)로 호출한 후에 summaryBy() 함수의 FUN = c(mean, min, max, sd, ...) 처럼 원하는 통계량 함수를 입력하면 됩니다. 이번에는 평균만 사용할 것이므로 아래 예에서는 FUN = c(mean) 만 입력하였습니다.

# mean of multivariates by Car Type
# install.packages("doBy")
library(doBy)
## 
## Attaching package: 'doBy'
## The following object is masked from 'package:dplyr':
## 
##     order_by
mean_by_Type <- summaryBy(MPG.highway + RPM + Horsepower + Weight + Length + Price ~ Type, 
           data=Cars93, 
           FUN = c(mean))
mean_by_Type
##      Type MPG.highway.mean RPM.mean Horsepower.mean Weight.mean Length.mean
## 1 Compact               30     5362             131        2918         182
## 2   Large               27     4673             179        3695         205
## 3 Midsize               27     5336             173        3400         193
## 4   Small               35     5633              91        2313         167
## 5  Sporty               29     5393             160        2900         175
## 6     Van               22     4744             149        3831         186
##   Price.mean
## 1         18
## 2         24
## 3         27
## 4         10
## 5         19
## 6         19

14.1.3 레이더 차트 그리기

14.1.3.1 패키지 설치

다음으로, 레이더 차트(radar chart)를 그리려면 fmsb Package 를 사용합니다. install.packages("fmsb")로 설치하고, library(fmsb)로 호출해보겠습니다.

# install.packages("fmsb")
library(fmsb)
## 
## Attaching package: 'fmsb'
## The following object is masked from 'package:vcd':
## 
##     oddsratio

14.1.3.2 radarchart() 함수

fmsb Package의 radarchart() 함수를 사용하기 위한 데이터 형태는

  1. 데이터 구조는 Dataframe

  2. 첫번째 행(1st row)에 최대값(max value)

  3. 두번째 행(2nd row)에 최소값(min value)

  4. 세번째 행부터는 원래의 관측값

이 오도록 데이터를 전처리해주어야 합니다.

14.1.3.3 radrchart() 함수를 사용하기 위한 데이터 준비

[ fmsb Package의 radrchart() 함수 사용하기 위한 데이터 준비 ]

img

14.1.3.3.1 사용자 정의 함수 만들기

R 사용자정의함수로 첫번째 행에 최대값, 두번째 행에 최소값이 오도록 하여 Dataframe으로 묶는 명령어는 아래와 같습니다.

# manipulating dataset for radar chart
# data frame includes possible maximum values as row 1 
# and possible minimum values as row 2
df_radarchart <- function(df) {
   df <- data.frame(df)
   dfmax <- apply(df, 2, max) 
   dfmin <- apply(df, 2, min) 
   as.data.frame(rbind(dfmax, dfmin, df))
}
14.1.3.3.2 변수의 표준화

사용자정의함수에 더하여 scale() 함수를 사용해서 6개의 변수를 표준화 하였습니다.

# maximum value as row 1, minimum value as row 2 : user-defined function df_radarchart
# standardization : scale()
mean_by_Type_scale <- df_radarchart(scale(mean_by_Type[,c(2:7)]))
mean_by_Type_scale
##    MPG.highway.mean RPM.mean Horsepower.mean Weight.mean Length.mean Price.mean
## 1              1.61     1.14           0.986        1.14       1.533      1.279
## 2             -1.42    -1.33          -1.730       -1.51      -1.319     -1.634
## 11             0.36     0.44          -0.502       -0.45      -0.187     -0.260
## 21            -0.34    -1.33           0.986        0.91       1.533      0.781
## 3             -0.34     0.38           0.790        0.39       0.603      1.279
## 4              1.61     1.14          -1.730       -1.51      -1.319     -1.634
## 5              0.12     0.52           0.393       -0.48      -0.711     -0.058
## 6             -1.42    -1.15           0.064        1.14       0.081     -0.108

14.1.3.4 레이더 차트 그리기

드디어 radarchart() 함수를 사용해서 레이더 차트를 그려보겠습니다. 각 옵션에 대한 기능은 아래 R 명령어에 부가설명을 달아놓았습니다.

범례는 legend() 함수를 사용해서 왼쪽 상단에 추가하였습니다.

# radar chart (or spider plot)
radarchart(df = mean_by_Type_scale, # The data frame to be used to draw radarchart
            seg = 6, # The number of segments for each axis 
            pty = 16, # A vector to specify point symbol: Default 16 (closed circle)
            pcol = 1:6, # A vector of color codes for plot data
            plty = 1:6, # A vector of line types for plot data
            plwd = 2, # A vector of line widths for plot data
            title = c("radar chart by Car Types") # putting title at the top-middle
            )
 
# adding legend
legend("topleft", legend = mean_by_Type$Type, col = c(1:6), lty = c(1:6), lwd = 2)

선의 형태(plty)나 선의 색깔(pcol)을 프로그래밍 편하라고 1:6 이라고 했는데요, 원하는 선 모양이나 색깔을 순서대로 지정할 수 있습니다.

다음번 포스팅에서는 별 그림(star graph)에 대해서 알아보겠습니다.