실전 업무에서는 다변량 데이터(multivariate data set)를 사용하는 경우가 다반사입니다. 그리고 분석업무 초반에 탐색적 분석을 수행할 때 시각화를 통해 변수들 간의 관계, 패턴을 탐색하는 분석 기법이 굉장히 유용합니다.
하지만 다변량 데이터 중에서도 특히 3개 이상의 변수를 가지는 다변량 데이터의 경우 그동안 소개해드렸던 히스토그램, 막대그림, 박스 그림, 산점도, 선그림/시계열 그림 등을 활용해서 2차원 평면에 나타낼 수 없는 한계가 있습니다. (물론, 색깔이라든지 모양을 데이터 그룹 별로 달리하면 3차원, 4차원의 정보를 시각화할 수 있기는 합니다만...)
변수 3개 이상의 다변량 데이터를 2차원 평면에 효과적으로 시각화할 수 있는 방법으로
(1) 레이더 차트 (radar chart) or 거미줄 그림(spider plot)
(2) 별 그림 (star graph) (레이더 차트와 유사, 중심점 다름)
(3) 평행 좌표 그림 (parallel coordinate plot)
(4) 3차원 산점도 (3 dimensional scatter plot)
(5) 체르노프 얼굴그림 (Chernoff faces)
(6) 산점도 행렬(scatter plot matrix)
등이 있습니다.
산점도 행렬(http://rfriend.tistory.com/83, http://rfriend.tistory.com/82)과 모자이크 그림(http://rfriend.tistory.com/71)은 이전 포스팅을 참고하시기 바랍니다.
이번 포스팅에서는 (1) 레이더 차트 (radar chart)에 대해서 소개하겠습니다. 방사형의 레이더 차트가 마치 거미줄을 닮아서 거미줄 그림 (spider plot)이라고도 부릅니다.
별 그림 (star plot) 도 레이더 차트와 형태는 거의 유사한데요, 약간 현태가 다른 점이 있고 stars 라는 R 패키지가 별도로 있고 해서 다음번에 따로 설명을 드리겠습니다.
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 ... > |
먼저 table() 함수를 사용하여 차 유형별 분할표를 만들어보았습니다. 6종류의 차 유형별로 10~20여대씩 분포하고 있음을 알 수 있습니다.
> table(Cars93$Type) Compact Large Midsize Small Sporty Van 16 11 22 21 14 9 |
다음으로, 차 유형(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") Installing package into ‘C:/Users/user/Documents/R/win-library/3.2’ (as ‘lib’ is unspecified) trying URL 'http://cran.rstudio.com/bin/windows/contrib/3.2/doBy_4.5-14.zip' Content type 'application/zip' length 3419973 bytes (3.3 MB) downloaded 3.3 MB package ‘doBy’ successfully unpacked and MD5 sums checked The downloaded binary packages are in C:\Users\user\AppData\Local\Temp\RtmpGGgn4j\downloaded_packages > library(doBy) 필요한 패키지를 로딩중입니다: survival Warning message: 패키지 ‘doBy’는 R 버전 3.2.3에서 작성되었습니다 > > 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 Price.mean
1 Compact 29.87500 5362.500 131.0000 2918.125 182.1250 18.21250
2 Large 26.72727 4672.727 179.4545 3695.455 204.8182 24.30000
3 Midsize 26.72727 5336.364 173.0909 3400.000 192.5455 27.21818
4 Small 35.47619 5633.333 91.0000 2312.857 167.1905 10.16667
5 Sporty 28.78571 5392.857 160.1429 2899.643 175.2143 19.39286
6 Van 21.88889 4744.444 149.4444 3830.556 185.6667 19.10000
|
다음으로, 레이더 차트(radar chart)를 그리려면 fmsb Package 를 사용합니다. install.packages("fmsb")로 설치하고, library(fmsb)로 호출해보겠습니다.
> install.packages("fmsb") Installing package into ‘C:/Users/user/Documents/R/win-library/3.2’ (as ‘lib’ is unspecified) trying URL 'http://cran.rstudio.com/bin/windows/contrib/3.2/fmsb_0.5.2.zip' Content type 'application/zip' length 214358 bytes (209 KB) downloaded 209 KB package ‘fmsb’ successfully unpacked and MD5 sums checked The downloaded binary packages are in C:\Users\user\AppData\Local\Temp\RtmpGGgn4j\downloaded_packages > library(fmsb) Warning message: 패키지 ‘fmsb’는 R 버전 3.2.3에서 작성되었습니다
|
fmsb Package의 radarchart() 함수를 사용하기 위한 데이터 형태는
(1) 데이터 구조는 Dataframe
(2) 첫번째 행(1st row)에 최대값(max value)
(3) 두번째 행(2nd row)에 최소값(min value)
(4) 세번째 행부터는 원래의 관측값
이 오도록 데이터를 전처리해주어야 합니다.
[ fmsb Package의 radrchart() 함수 사용하기 위한 데이터 준비 ]
R 사용자정의함수로 첫번째 행에 최대값, 두번째 행에 최소값이 오도록 하여 Dataframe으로 묶는 명령어는 아래와 같습니다.
사용자정의함수에 더하여 scale() 함수를 사용해서 6개의 변수를 표준화 하였습니다.
> # data frame includes possible maximum values as row 1 >
|
드디어 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 + ) >
> legend("topleft", legend = mean_by_Type$Type, col = c(1:6), lty = c(1:6), lwd = 2)
|
선의 형태(plty)나 선의 색깔(pcol)을 프로그래밍 편하라고 1:6 이라고 했는데요, 원하는 선 모양이나 색깔을 순서대로 지정할 수 있습니다.
다음번 포스팅에서는 별 그림(star graph)에 대해서 알아보겠습니다.
많은 도움 되어기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^
'R 분석과 프로그래밍 > R 그래프_시각화' 카테고리의 다른 글
R 다변량 그래프 (3) 평행 좌표 그림 (parallel coordinate plot) : parcoord() (2) | 2016.02.20 |
---|---|
R 다변량 그래프 (2) 별 그래프 (star graph, segment diagrams) (0) | 2016.02.12 |
R Graphics 낮은 수준의 그래프 함수 (7) 다각형 추가 : polygon(x, y, ...) (0) | 2016.01.12 |
R Graphics 낮은 수준의 그래프 함수 (6) 범례 추가 : legend(x, y, legend, ...) (0) | 2016.01.10 |
R Graphics 낮은 수준의 그래프 함수 (5) 문자 추가 : text(x, y, labels, ...), mtext() (0) | 2016.01.10 |