기준선 추가하기
개요
이번 글에서는 기준선을 추가해 분석의 기준점을 명확히 하고, 데이터를 더 쉽게 이해할 수 있는 방법을 소개합니다. 기준선을 활용하면 데이터의 상대적 위치를 한눈에 파악할 수 있어 시각화의 효과를 높일 수 있습니다. 예제로, 서울특별시 25개 구의 주민등록인구를 비교한 막대그래프에 평균선을 추가하는 방법을 살펴보겠습니다. 이 방법은 평균선뿐만 아니라 다양한 기준선을 추가하는 데도 유용하게 응용할 수 있습니다.
데이터 준비하기
먼저, 필요한 패키지를 로드하고 차트에서 사용할 글꼴을 설정합니다.
# 패키지 로드
library(readxl)
library(tidyverse)
library(ggplot2)
library(showtext)
library(scales)
# 차트 글꼴 설정
font_add("kopub", "C:/Users/.../AppData/Local/Microsoft/Windows/Fonts/KoPub Dotum Medium.ttf")
showtext_auto()
showtext_opts(dpi=300)
theme.size = 12
text.size = theme.size / .pt
서울특별시의 25개 구별 주민등록인구 데이터를 가공하여 막대그래프를 그릴 준비를 합니다. 통계청의 시군구별 주민등록인구 데이터 데이터를 활용합니다.
# 데이터 로드
data <- read_xlsx("데이터/주민등록인구_시도_시군구_2023.xlsx", skip=1)
# 데이터 가공
seoul_clr <- data %>%
rename(시도 = `행정구역별(1)`,
구 = `행정구역별(2)`,
인구수 = `계 (명)`) %>%
# 서울 데이터 추출
filter(시도 == "서울특별시",
구 != "소계") %>%
# 색상 칼럼 생성
mutate(순위 = rank(-인구수),
색상 = case_when(순위 < 4 ~ "#027453",
T ~ "#D9D8D6"))
# 데이터 확인
head(seoul_clr)
## # A tibble: 6 × 5
## 시도 구 인구수 순위 색상
## <chr> <chr> <dbl> <dbl> <chr>
## 1 서울특별시 종로구 139417 24 #D9D8D6
## 2 서울특별시 중구 121312 25 #D9D8D6
## 3 서울특별시 용산구 213151 23 #D9D8D6
## 4 서울특별시 성동구 277361 21 #D9D8D6
## 5 서울특별시 광진구 335554 17 #D9D8D6
## 6 서울특별시 동대문구 341149 16 #D9D8D6
막대그래프 그리기
이 데이터를 활용하여 막대그래프를 그립니다. 이에 대한 상세한 설명은 색상으로 특정 값 강조하기 글을 참고해 주세요.
seoul_clr %>%
ggplot(aes(x = reorder(구, -인구수), y = 인구수 / 10000,
fill = 색상)) +
geom_col(width = 0.6,
color = "gray10",
linewidth = 0.2) +
geom_text(aes(label = comma(인구수 / 10000, accuracy = 1)),
family = "kopub",
size = text.size,
color = "gray10",
vjust = -1) +
scale_x_discrete(name = "") +
scale_y_continuous(name = "주민등록인구 수(만 명)",
expand = expansion(mult = c(0, 0.1))) +
scale_fill_identity() +
theme_minimal(base_size = theme.size, base_family = "kopub") +
theme(
axis.line.x = element_line(linewidth = 0.8, color = "gray10"),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_line(linewidth = 0.2, color = "gray40"),
axis.text = element_text(color = "gray10"),
axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)
)

평균선 추가하기
평균선을 추가하기 위해 먼저 평균값(mean_value)을 계산하고, geom_hline 함수를 사용하여 평균선을 추가합니다. annotate 함수를 사용하여 이 선이 나타내는 의미를 텍스트로 표시합니다.
# 평균 계산
mean_value <- mean(seoul_clr$인구수) / 10000
# 평균선 추가
seoul_clr %>%
ggplot(aes(x = reorder(구, -인구수), y = 인구수 / 10000, fill = 색상)) +
geom_col(width = 0.6,
color = "gray10",
linewidth = 0.2) +
geom_text(aes(label = comma(인구수 / 10000, accuracy = 1)),
family = "kopub",
size = text.size,
color = "gray10",
vjust = -1) +
geom_hline(yintercept = mean_value,
color = "black",
linetype = "dashed",
linewidth = 0.7) +
annotate("text",
x = length(unique(seoul_clr$구)), y = mean_value,
label = paste0("평균: ", comma(mean_value, accuracy = 1)),
color = "black",
hjust = 1,
vjust = -1,
family = "kopub",
size = text.size) +
scale_x_discrete(name = "") +
scale_y_continuous(name = "주민등록인구 수(만 명)",
expand = expansion(mult = c(0, 0.1))) +
scale_fill_identity() +
theme_minimal(base_size = theme.size, base_family = "kopub") +
theme(
axis.line.x = element_line(linewidth = 0.8, color = "gray10"),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_line(linewidth = 0.2, color = "gray40"),
axis.text = element_text(color = "gray10"),
axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)
)

평균선을 추가하면 막대그래프의 데이터와 비교하여 서울 각 구의 주민등록인구가 평균보다 높거나 낮은지를 손쉽게 파악할 수 있습니다. 이 방법은 평균선뿐 아니라 다른 기준선을 추가해 다양한 데이터 분석에 활용할 수 있습니다. geom_hline 함수로 가로선을, geom_vline 함수로 세로선을 추가할 수 있으며, 여러 개의 기준선을 추가하려면 yintercept나 xintercept 인자에 벡터를 입력하면 됩니다. 또한, annotate 함수를 활용하면 x와 y의 범위를 세부적으로 조정해 더욱 유연하게 선을 추가할 수 있습니다. 이러한 방법을 활용해 데이터 분석에 필요한 다양한 기준선을 추가해 보세요!