기준선 추가하기

개요

이번 글에서는 기준선을 추가해 분석의 기준점을 명확히 하고, 데이터를 더 쉽게 이해할 수 있는 방법을 소개합니다. 기준선을 활용하면 데이터의 상대적 위치를 한눈에 파악할 수 있어 시각화의 효과를 높일 수 있습니다. 예제로, 서울특별시 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)
  )

2023년 기준 서울시 구별 주민등록인구 막대그래프

평균선 추가하기

평균선을 추가하기 위해 먼저 평균값(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)
  )

평균선을 추가한 2023년 기준 서울시 구별 주민등록인구 막대그래프

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