12.1 막대 그래프
이번 절에서는 X변수와 Y변수 모두 범주형 변수를 ggplot2 패키지의 geom_bar() 함수로 시각화 하는 방법에 대하여 학습하겠습니다.
12.1.1 데이터 세트
사용할 데이터는 MASS
패키지에 있는 Cars93
데이터 프레임에서 자동차 유형(Type
), 자동차 구동 방식(DriveTrain
) 등의 범주형/요인(factor)형 변수를 사용하겠습니다.
library(ggplot2)
library(MASS)
str(Cars93)
12.1.2 일변량 범주형 변수의 시각화
먼저 자동차 유형(Type
)을 막대 그래프로 시각화해 보겠습니다.
ggplot(Cars93,
aes(x = Type)) +
geom_bar() +
ggtitle("일변량 범주형 변수의 시각화")
12.1.3 범주형 변수의 수준 확인
자동차 구동 방식(DriveTrain
)의 클래스 타입은 앞의 데이터 세트에서 확인한 바와 같이 ’요인형(factor)’임을 알 수 있습니다. 그러면 이 변수의 수준(levels)을 확인해 보겠습니다.
levels(Cars93$DriveTrain)
## [1] "4WD" "Front" "Rear"
즉, 자동차 구동 방식(DriveTrain
) 변수는 “4WD,” “Front,” “Rear” 등을 수준으로 하는 변수임을 알 수 있습니다. “4WD”는 사륜구동을, “Front”는 전륜구동, 그리고 “Rear”는 후륜구동을 나타내고 있습니다.
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("누적 막대 그래프")
이제 대부분의 자동차들이 ’전륜구동 방식(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("그룹 막대 그래프")
그런데 이 그래프에서 보면 자동차 유형별(Type
)로 자동차 구동 방식(DriveTrain
)을 궅이 한 그래프에 다 표시하지 않고 분할하여 그래프로 나타낼 수 도 있습니다.
이는 아래의 그룹별 막대 그래프에서 확인하기 바랍니다.
한편 그림 12.3에 geom_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)
12.1.5 상대 비율 막대 그래프
앞의 누적 막대 그래프의 경우는 Y축에 빈도를 나타내는 count
로 표시가 되고 있습니다.
그런데 이를 100%에 대한 상대 비율로 시각화할 수도 있습니다 이를 위해서는 geom_bar()
함수에 position = "fill"
모수를 추가해 주면 됩니다.
ggplot(Cars93,
aes(x = Type,
fill = DriveTrain)) +
geom_bar(position = "fill") +
ggtitle("상대 비율 막대 그래프")
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() 함수 이용")
이제 각 자동차 유형별(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() 함수 이용")
ncol = 1
모수를 입력함으로써 facet_grid()
함수와 비슷한 결과를 보여 주고 있습니다.
12.1.7 Theme의 사용
여기에서도 앞에서 사용한 바와 같은 테마를 사용할 수 있습니다.
ggplot(Cars93,
aes(x = Type,
fill = DriveTrain)) +
geom_bar() +
ggtitle("이변량 범주형 막대 그래프 : Theme의 사용") +
::theme_classic() + # 그래프 테마 지정
ggplot2::theme(axis.title.x = element_text(size = 10,
ggplot2face = "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축의 서식 스타일 지정
::scale_y_continuous(labels = scales::comma) # Y 값의 천단위에 콤마 표시 ggplot2