12.1 막대 그래프

이번 절에서는 X변수와 Y변수 모두 범주형 변수를 ggplot2 패키지의 geom_bar() 함수로 시각화 하는 방법에 대하여 학습하겠습니다.

12.1.1 데이터 세트

사용할 데이터는 MASS 패키지에 있는 Cars93 데이터 프레임에서 자동차 유형(Type), 자동차 구동 방식(DriveTrain) 등의 범주형/요인(factor)형 변수를 사용하겠습니다.

library(ggplot2)
library(MASS)
str(Cars93)

Go Top

12.1.2 일변량 범주형 변수의 시각화

먼저 자동차 유형(Type)을 막대 그래프로 시각화해 보겠습니다.

ggplot(Cars93,
       aes(x = Type)) +
  geom_bar() +
  ggtitle("일변량 범주형 변수의 시각화")
일변량 범주형 변수의 시각화

Figure 12.1: 일변량 범주형 변수의 시각화

Go Top

12.1.3 범주형 변수의 수준 확인

자동차 구동 방식(DriveTrain)의 클래스 타입은 앞의 데이터 세트에서 확인한 바와 같이 ’요인형(factor)’임을 알 수 있습니다. 그러면 이 변수의 수준(levels)을 확인해 보겠습니다.

levels(Cars93$DriveTrain)
## [1] "4WD"   "Front" "Rear"

즉, 자동차 구동 방식(DriveTrain) 변수는 “4WD,” “Front,” “Rear” 등을 수준으로 하는 변수임을 알 수 있습니다. “4WD”는 사륜구동을, “Front”는 전륜구동, 그리고 “Rear”는 후륜구동을 나타내고 있습니다.

Go Top

12.1.4 막대 그래프

범주형 변수인 자동차 유형(Type)을 X축으로 하는 막대 그래프에 두 번째 범주형 변수인 자동차 구동 방식(DriveTrain)을 표현하기 위해서는 aes() 함수 내에 fill = 이나 color = 모수를 이용합니다.

12.1.4.1 누적 막대 그래프

다음과 같이 aes() 함수 내에 fill = DriveTrain를 입력하면 다음과 같이 누적 막대 그래프(stacked bar char)가 생성됩니다.

ggplot(Cars93,
       aes(x = Type,
           fill = DriveTrain)) +
  geom_bar() +
  ggtitle("누적 막대 그래프")
누적 막대 그래프

Figure 12.2: 누적 막대 그래프

이제 대부분의 자동차들이 ’전륜구동 방식(Front)’이 다수를 차지하고 있으며, 반면에 Van의 경우에는 ’4륜구동 방식(4WD)’이 다수를 차지하고 있음을 알 수 있습니다.

이때 y축에는 count빈도수로 표시됨을 알 수 있습니다.

12.1.4.2 그룹 막대 그래프

한편, 각 자동차 유형별로 자동차 구동 방식이 누적 형태로 표시하는 대신에 자동차 유형별(그룹)(Type)로 자동차 구동 방식(DriveTrain)을 또 다른 막대 그래프로 비교할 수도 있습니다.

이를 위해서는 geom_bar() 함수 내에 position = "dodge" 모수를 입력해 줍니다.

ggplot(Cars93,
       aes(x = Type,
           fill = DriveTrain)) +
  geom_bar(position = "dodge") +
  ggtitle("그룹 막대 그래프")
그룹 막대 그래프

Figure 12.3: 그룹 막대 그래프

그런데 이 그래프에서 보면 자동차 유형별(Type)로 자동차 구동 방식(DriveTrain)을 궅이 한 그래프에 다 표시하지 않고 분할하여 그래프로 나타낼 수 도 있습니다.

이는 아래의 그룹별 막대 그래프에서 확인하기 바랍니다.

한편 그림 12.3geom_text() 함수를 이용하여 데이터 레이블을 표시해 보겠습니다.

ggplot(Cars93,
       aes(x = Type,
           fill = DriveTrain)) +
  geom_bar(position = "dodge") +
  ggtitle("그룹 막대 그래프") +
  geom_text(stat = "count",
            aes(label = ..count..),
            position = position_dodge(width = 0.9),
            vjust = 1.5,
            size = 2.5)
그룹 막대 그래프

Figure 12.4: 그룹 막대 그래프

Go Top

12.1.5 상대 비율 막대 그래프

앞의 누적 막대 그래프의 경우는 Y축에 빈도를 나타내는 count로 표시가 되고 있습니다.

그런데 이를 100%에 대한 상대 비율로 시각화할 수도 있습니다 이를 위해서는 geom_bar() 함수에 position = "fill" 모수를 추가해 주면 됩니다.

ggplot(Cars93,
       aes(x = Type,
           fill = DriveTrain)) +
  geom_bar(position = "fill") +
  ggtitle("상대 비율 막대 그래프")
상대 비율 막대 그래프

Figure 12.5: 상대 비율 막대 그래프

Go Top

12.1.6 그룹별 막대 그래프

앞에서 이미 aes() 함수를 이용하여 그룹별로 막대 그래프를 작성하였으므로, 여기에서는 facet_grid() 함수와 facet_wrap() 함수의 사용에 대하여 학습하겠습니다.

12.1.6.1 facet_grid() 함수의 이용

앞에서 작성한 그룹 막대 그래프에 다음과 같이 facet_grid() 함수를 추가해 주면 자동차 구동 방식별로 막대 그래프를 분할하여 표시할 수 있습니다.

ggplot(Cars93,
       aes(x = Type,
           fill = DriveTrain)) +
  geom_bar(position = "dodge") +
facet_grid(DriveTrain ~ .)  + # facet_grid(. ~ DriveTrain)  
ggtitle("그룹별 막대 그래프 : facet_grid() 함수 이용")
그룹별 막대 그래프 : facet_grid() 함수 이용

Figure 12.6: 그룹별 막대 그래프 : facet_grid() 함수 이용

이제 각 자동차 유형별(Type)로 자동차 구동 방식(DriveTrain)을 더 쉽게 비교할 수 있습니다.

12.1.6.2 facet_wrap() 함수의 이용

facet_wrap() 함수를 이용해도 비슷한 효과를 볼 수 있습니다.

ggplot(Cars93,
       aes(x = Type,
           fill = DriveTrain)) +
  geom_bar(position = "dodge") +
  facet_wrap( ~ DriveTrain, ncol = 1) +
  ggtitle("그룹별 막대 그래프 : facet_wrap() 함수 이용")
그룹별 막대 그래프 : facet_wrap() 함수 이용

Figure 12.7: 그룹별 막대 그래프 : facet_wrap() 함수 이용

ncol = 1 모수를 입력함으로써 facet_grid() 함수와 비슷한 결과를 보여 주고 있습니다.

Go Top

12.1.7 Theme의 사용

여기에서도 앞에서 사용한 바와 같은 테마를 사용할 수 있습니다.

ggplot(Cars93,
       aes(x = Type,
           fill = DriveTrain)) +
  geom_bar() + 
  ggtitle("이변량 범주형 막대 그래프 : Theme의 사용") +
  ggplot2::theme_classic() +                                         # 그래프 테마 지정
  ggplot2::theme(axis.title.x = element_text(size  = 10, 
                                             face  = "italic", 
                                             color = "gray", 
                                             angle = 0, 
                                             vjust = 0.5),
                 axis.title.y = element_text(size  = 10, 
                                             face  = "bold.italic", 
                                             color = "gray", 
                                             angle = 0, 
                                             vjust = 0.5))  +       # X축과 Y축의 서식 스타일 지정
  ggplot2::scale_y_continuous(labels = scales::comma)              # Y 값의 천단위에 콤마 표시
이변량 범주형 막대 그래프 : Theme의 사용

Figure 12.8: 이변량 범주형 막대 그래프 : Theme의 사용

Go Top