13.5 클리블랜드 점 그래프

일변량 연속형 변수를 ggplot2 패키지를 이용하여 막대 그래프로 시각화하는 방법에 대하여 학습한 적이 있습니다. 그런데 이러한 막대 그래프의 훌륭한 대안으로서 점 그래프(Dot Plot)가 있습니다.
그래프를 보면서 사람들은 여러 가지 판단을 내립니다. 선의 길이, 파이 차트의 일부 영역, 공통 척도 상의 점의 위치, 선의 기울기 또는 그려지는 점, 선 그리고 막대의 기타 여러 속성을 판단할 수 있습니다.

Cleveland and McGill (1984) 이 “Graphical Methods for Data Presentation: Full Scale Breaks, Dot Charts, and Multibased Logging.” 이라는 논문에서 그래프를 읽을 때 수행되는 작업 또는 판단을 식별하고 이러한 판단 중 가장 정확한 판단을 결정하기 위해 신중하게 설계된 실험을 수행했습니다. 그런 다음 실험에서 얻은 지식을 활용하기 위해 그래프를 설계하였습니다. 그 결과가 클리블랜드 점 그래프(Cleveland Dot Plot)라는 도트 플롯이었습니다.

이번 절에서는 도트 플롯을 소개하고 그래픽 프레젠테이션을 위해 이를 막대 그래프와 비교해 보겠습니다. 또한 기본 클리블랜드 도트 플롯에서 보다 세련되고 가치가있는 그래픽으로 이동하는 방법에 대하여 학습하겠습니다.

13.5.1 데이터 세트

분석에 활용할 데이터는 MASS 패키지 내 Cars93 데이터 프레임으로, 제조업체(Manufacturer), 자동차 구동방식(DriveTrain), Max.Price 등의 3개 변수를 사용하겠습니다.

그리고 관측치 개수가 많아서 한 화면에 모두 표시하기에 어려워서 범주형 변수인 자동차 종류(Type)의 Level 중에서 “Large,” “Midsize,” “Small” 만 선별하고 “Compact,” “Sproty,” “Van”은 제외하도록 하겠습니다.

ggplot2 패키지를 포함하고 있으며 데이터 관리를 위해 tidyverse 패키지를 불러 오고, Cars93 데이터 세트를 포함하고 있는 Mass 패키지를 불러 옵니다.

library(tidyverse)
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 ...

Go Top

13.5.2 기본 클리블랜드 점 그래프

여러분 대부분은 점 그래프(dot plot)이나 막대 그래프(bar plot)의 기본을 이해하고 있을 것입니다.

이번 절에서는 제조업체별(TManufacturerype)로 최대 가격(Max.Price) 을 기준으로 데이터를 정렬하고, 최대 가격(Max.Price)가 높은 것부터 낮은 것의 순서로 정렬이 된 클리블랜드 점 그래프를 생성해 보겠습니다.

13.5.2.1 데이터 세트의 생성

먼저 클리블랜드 점 그래프를 그리기 위한 데이터 세트 Manu_Price를 생성합니다.

  • Cars93 데이터 세트에 대하여 제조업체별(Manufacturer)로 그룹핑을 하고,

  • 각 제조업체별(Manufacturer)로 평균 최대 가격(Mean.Price)을 구합니다.

  • Mean.Price 를 기준으로 하여 정렬을 해 줍니다.

  • Manufacturer를 범주형 변수로 바꿔 줍니다. (Manufacturer 변수는 현재 범주형 변수입니다. 따라서 이 부분은 필요가 없는 부분인데, 범주형 변수가 이닌 문자형 변수를 사용할 경우를 대비하여 참고하시기 바랍니다.)

Manu_Price <- Cars93 %>%
        group_by(Manufacturer) %>%
        summarise(Mean.Price = mean(Max.Price, na.rm = TRUE)) %>%
        arrange(Mean.Price) %>%
        mutate(Manufacturer = factor(Manufacturer, levels = .$Manufacturer))
str(Manu_Price)
## tibble [32 x 2] (S3: tbl_df/tbl/data.frame)
##  $ Manufacturer: Factor w/ 32 levels "Suzuki","Hyundai",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ Mean.Price  : num [1:32] 10 11.6 11.8 12.9 14.5 ...

Go Top

13.5.2.2 막대 그래프

먼저 자동차 제조업체별(TManufacturer)로 최대 가격(Max.Price)을 geom_bar() 함수를 이용하여 수평 막대 그래프로 표현해 보겠습니다.

ggplot(Manu_Price, aes(Manufacturer, Mean.Price)) +
        geom_bar(stat = "identity") +
        coord_flip() +
  ggtitle("기본 클리블랜드 점 그래프 : 막대 그래프")
기본 클리블랜드 점 그래프 : 막대 그래프

Figure 13.47: 기본 클리블랜드 점 그래프 : 막대 그래프

geom_bar(stat = "identity") 에 있는 stat = "identity"는 y축에 연속형 변수인 Mean.Price를 사용하기 위한 것임은 이미 앞에서 언급한 바 있습니다.

Go Top

13.5.2.3 점 그래프

또는 이를 다음과 같이 geom_point() 함수를 이용하여 점 그래프로도 표현할 수 있습니다.

ggplot(Manu_Price, aes(Manufacturer, Mean.Price)) +
        geom_point() +
        coord_flip() +
  ggtitle("기본 클리블랜드 점 그래프 : 점 그래프 1")
기본 클리블랜드 점 그래프 : 점 그래프 1

Figure 13.48: 기본 클리블랜드 점 그래프 : 점 그래프 1

그런데 x축에 범주형 변수인 제조업체(Manufacturer) 그리고 y축에 연속형 변수인 평균 최대 가격(Mean.Price)를 표시되는 점 그래프에 대하여 축 변경을 위해 coord_flip() 함수를 이용하고 있습니다. x축과 y축의 순서를 바꾸면 이 축 변경 함수를 생략할 수 있습니다.

ggplot(Manu_Price, aes(Mean.Price, Manufacturer)) +
        geom_point() +
  ggtitle("기본 클리블랜드 점 그래프 : 점 그래프 2")
기본 클리블랜드 점 그래프 : 점 그래프 2

Figure 13.49: 기본 클리블랜드 점 그래프 : 점 그래프 2

Go Top

13.5.3 그룹별 클리블랜드 점 그래프

범주형 변수인 자동차의 구동방식(DriveTrain) 변수를 이용하여 구동방식별로 클리블랜드 점 그래프를 작성해 보겠습니다.

13.5.3.1 데이터 세트의 생성

그룹별 클리블랜드 점 그래프를 작성하기 위해 Cars93 데이터 세트에 대하여 제조업체별(Manufacturer)로 구동방식(DriveTrain)의 최대 가격(Max.Price)의 평균을 담고 있는 데이터 세트 Manu_DrvTr_Price를 생성합니다.

  • Cars93 데이터 세트에 대하여 제조업체(Manufacturer)와 구동방식(DriveTrain)로 그룹핑을 하고,

  • 각 제조업체(Manufacturer)와 구동방식(DriveTrain) 별로 최대 가격(Max.Price)의 평균(Mean.Max.Pr)을 구합니다.

  • Manufacturer를 범주형 변수로 바꿔 줍니다. (이미 범주형 변수입니다.)

Manu_DrvTr_Price <- Cars93 %>%
        group_by(Manufacturer, DriveTrain) %>%
        summarise(Mean.Max.Pr = mean(Max.Price, na.rm = TRUE)) %>%
        ungroup() %>%
        mutate(Manufacturer = factor(Manufacturer, 
                                     levels = Manu_Price$Manufacturer))
## `summarise()` has grouped output by 'Manufacturer'. You can override using the `.groups` argument.
head(Manu_DrvTr_Price)
## # A tibble: 6 x 3
##   Manufacturer DriveTrain Mean.Max.Pr
##   <fct>        <fct>            <dbl>
## 1 Acura        Front             28.8
## 2 Audi         Front             38.4
## 3 BMW          Rear              36.2
## 4 Buick        Front             21.8
## 5 Buick        Rear              24.9
## 6 Cadillac     Front             39.5

Go Top

13.5.3.2 aes() 함수 이용

자동차의 구동방식별(DriveTrain)로 클리블랜드 점 그래프를 그리기 위해서는 ggplot() 함수 내의 aes() 함수 안에 colour = DriveTrain을 입력해 줍니다.

ggplot(Manu_DrvTr_Price, 
       aes(x = Mean.Max.Pr, y = Manufacturer, 
           colour = DriveTrain)) +
       geom_point() +
  ggtitle("그룹별 클리블랜드 점 그래프 : aes() 함수")
그룹별 클리블랜드 점 그래프 : aes() 함수

Figure 13.50: 그룹별 클리블랜드 점 그래프 : aes() 함수

Go Top

13.5.3.3 facet_grid() 함수의 이용

자동차 구동방식(DriveTrain) 별로 facet_grid(. ~ DriveTrain) 함수를 적용하여 면을 분할한 클리블랜드 점 그래프(Cleveland dot plot)을 그려보겠습니다.

ggplot(Manu_DrvTr_Price, 
       aes(x = Mean.Max.Pr, y = Manufacturer)) +
  geom_point(size = 2, aes(colour = DriveTrain)) +
  facet_grid(. ~ DriveTrain) +
  ggtitle("그룹별 클리블랜드 점 그래프 : facet_grid() 함수")
그룹별 클리블랜드 점 그래프 : facet_grid() 함수

Figure 13.51: 그룹별 클리블랜드 점 그래프 : facet_grid() 함수

Go Top

13.5.3.4 facet_wrap() 함수의 이용

자동차 구동방식(DriveTrain) 별로 facet_wrap( ~ DriveTrain, ncol = 3) 함수를 적용하여 면을 분할한 클리블랜드 점 그래프(Cleveland dot plot)을 그려보면 다음과 같습니다.

ggplot(Manu_DrvTr_Price, 
       aes(x = Mean.Max.Pr, y = Manufacturer)) +
  geom_point(size = 2, aes(colour = DriveTrain)) +
  facet_wrap( ~ DriveTrain, ncol = 3) +
  ggtitle("그룹별 클리블랜드 점 그래프 : facet_wrap() 함수")
그룹별 클리블랜드 점 그래프 : facet_wrap() 함수

Figure 13.52: 그룹별 클리블랜드 점 그래프 : facet_wrap() 함수

Go Top

13.5.3.5 점 그래프와 선 그래프의 충첩

각 제조업체별(Manufacturer)로 자동차의 구동 방식별(DriveTrain) 평균 최대 가격(Mean.Max.Pr)을 선 그래프와 점 그래프를 동시에 표시함으로써 각 제조업체(Manufacturer)에 대하여 구동방식별(DriveTrain) 평균 최대 가격(Mean.Max.Pr)을 서로 비교할 수 있게 해 줍니다. 이때 geom_point() 함수로 표시되는 각 점은 구동방식(DriveTrain)별로 색(colour =)을 달리 표시하고, geom_line() 함수에 의해 표시되는 각 선은 제조업체(Manufacturer) 를 그룹(group =)으로 하여 표시하면 됩니다.

ggplot(Manu_DrvTr_Price, 
       aes(x = Mean.Max.Pr, 
           y = Manufacturer)) +
    geom_line(aes(group = Manufacturer)) +
    geom_point(aes(color = DriveTrain)) +
  ggtitle("클리블랜드 점 그래프 : 점 그래프와 선 그래프의 충첩")
클리블랜드 점 그래프 : 점 그래프와 선 그래프의 충첩

Figure 13.53: 클리블랜드 점 그래프 : 점 그래프와 선 그래프의 충첩

Go Top

13.5.4 데이터 레이블 표시

범주형 변수인 DriveTrain의 범주 갯수에 따라서 x 축에 그 범위를 그래프로 표시할 수 있습니다. 각 점에 데이터 값을 표시해 주면 많은 도움이 될 것입니다.

ggplot() 함수 내에 label = 모수로 Mean.Max.Pr 변수를 지정해 주고, 다음과 같이 geom_text() 함수를 이용하면 그래프 상에 데이터 레이블이 표시됩니다.

ggplot(Manu_DrvTr_Price, 
       aes(x = Mean.Max.Pr,
           y = Manufacturer, 
           label = round(Mean.Max.Pr, 0))) +
        geom_line(aes(group = Manufacturer)) +
        geom_point(aes(color = DriveTrain)) +
        geom_text(aes(color = DriveTrain), hjust = -.5, size = 3) +
  ggtitle("클리블랜드 점 그래프 : 데이터 레이블 표시")
클리블랜드 점 그래프 : 데이터 레이블 표시

Figure 13.54: 클리블랜드 점 그래프 : 데이터 레이블 표시

Go Top

13.5.5 테마 사용

테마를 사용하여 수직의 그리드 선을 제거하고, 수평으로 점선으로된 그리드 선을 다음과 같이 추가할 수 있습니다.

ggplot(Manu_Price, aes(Manufacturer, Mean.Price)) +
        geom_point(stat = "identity") +
        coord_flip() +
  theme_bw() +
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank(),
    panel.grid.major.y = element_line(colour = "grey60", 
                                      linetype = "dashed")
    ) +
  ggtitle("클리블랜드 점 그래프 : 테마 사용 1")
클리블랜드 점 그래프 : 테마 사용 1

Figure 13.55: 클리블랜드 점 그래프 : 테마 사용 1

한편, 그룹별 클리블랜드 점 그래프를 그리는 경우 그룹변수를 나타내는 범주형 변수에 대한 범례를 그래프 내에 표시할 수도 있습니다.

ggplot(Manu_DrvTr_Price, 
       aes(x = Mean.Max.Pr, 
           y = Manufacturer,
           colour = DriveTrain)) +
    geom_point() +
  theme_bw() +
  theme(
    panel.grid.major.y = element_blank(),   # No horizontal grid lines
    legend.position = c(1, 0.55),           # Put legend inside plot area
    legend.justification = c(1, 0.5)
  ) +
  ggtitle("클리블랜드 점 그래프 : 테마 사용 2")
클리블랜드 점 그래프 : 테마 사용 2

Figure 13.56: 클리블랜드 점 그래프 : 테마 사용 2

Go Top


[Reference]

  • Cleveland, William S. 1984. “Graphical Methods for Data Presentation: Full Scale Breaks, Dot Charts, and Multibased Logging.” The American Statistician, 38:270-280.
  • Dot Plots: A Useful Alternative to Bar Charts, Naomi B. Robbins, Ph.D. March 7, 2006