R 그래프 - 21년 교통사고 통계를 이용한 막대그래프(연령층별/성별)

도로교통공단의 21년 교통사고 사망자 통계를 가지고 막대그래프로 만들어봤다. 흔히 성별로 그룹핑된 데이터는 좌우로 수평막대그래프 펼쳐 그려서 데이터를 표현한다. 잘 그리지 않는 유형이어서, 조금은 오래걸린거 같다. 색상이 너무 대비되는 걸 선택하면 약간 막대그래프끼리 어긋나보이는 착시(?) 현상이 있어서 비슷한 색감으로 채도만 조금 조정해봤다.

그래프 데이터 만들기

여기를 클릭해서 들어간 사이트에서 엑셀파일을 받을 수 있다. 도로교통공단에서 제공된 자료이며, 아래에 보듯이 엑셀파일 내에는 연령층별 남녀별 사망자/중상자/경상자 등의 데이터를 볼 수 있다. 다운받았다면, 엑셀파일을 read_excel 함수로 읽어준다.

tb1 = readxl::read_excel( "도로교통공단_사상자 연령층별 성별 교통사고 통계_20211231.xlsx")
tb1 %>% head()
# A tibble: 6 × 6
  사상자연령층 사상자성별 사망자수 중상자수 경상자수 부상신고자수
  <chr>        <chr>         <dbl>    <dbl>    <dbl>        <dbl>
1 12세이하     남               15      719     4856          639
2 12세이하     여                8      420     3920          424
3 13-20세      남               73     1787     7078         1164
4 13-20세      여               20      751     3992          331
5 21-30세      남              222     5122    28503         2490
6 21-30세      여               47     2033    15768          914

사망자수에 대한 그래프를 만들 예정이라, 쓸데없는 필드는 제외하는 로직을 추가한다.

tb2 = tb1 %>% 
  select(age = 사상자연령층, gender = 사상자성별, n = 사망자수) %>% 
  filter(age != '불명', gender != "기타/불명")

tb2 %>% head()
# A tibble: 6 × 3
  age      gender     n
  <chr>    <chr>  <dbl>
1 12세이하 남        15
2 12세이하 여         8
3 13-20세  남        73
4 13-20세  여        20
5 21-30세  남       222
6 21-30세  여        47

그래프 만들기

x축에는 연령층(age)을 셋팅하고, y축에는 사망자수(n)을 셋팅한다. 별다른 셋팅없이 geom_col 을 이용해서 막대그래프를 그리면, 누적으로 쌓이는 막대그래프가 그려진다.

ggplot(tb2, aes(age, n, fill = gender)) +
  geom_col()

원하는 그래프는 좌우로 펼쳐지는 막대그래프이기 때문에, 데이터에 정보를 몇가지 더 추가해야 한다.

tb3 = tb2 %>% 
  mutate(n2 = ifelse(gender == "남", n * -1, n),
         ord = as.numeric(str_sub(age, 1, 2))) 

tb3 %>% head
# A tibble: 6 × 6
  age      gender     n    n2     h   ord
  <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
1 12세이하 남        15   -15   1.3    12
2 12세이하 여         8     8  -0.6    12
3 13-20세  남        73   -73   1.3    13
4 13-20세  여        20    20  -0.6    13
5 21-30세  남       222  -222   1.3    21
6 21-30세  여        47    47  -0.6    21

우선 위아래로 x축을 기준으로 막대그래프를 그려야 하기 때문에, 남자는 마이너스값으로 여자는 플러스값으로 셋팅된 n2 값을 사용한다.

ggplot(tb3, aes(age, n2, fill = gender)) +
  geom_col()

coord_flip 함수를 이용해서 x/y 축을 바꿔준다.

ggplot(tb3, aes(age, n2, fill = gender)) +
  geom_col() + 
  coord_flip()

만약 연령층의 순서를 바꾸고 싶으면, reorder 를 이용해서 조정이 가능하다. 자세한 방법은 여기를 클릭.

ggplot(tb3, aes(reorder(age, -ord), n2, fill = gender)) +
  geom_col() + 
  coord_flip()

마지막으로 쓸데없는 정보들 삭제하고, 폰트, 색상 등을 설정하면 끝.


더 보면 좋을 글들