[V_log] 세계 자살테러 데이터 시각화 with R

Blushed·2023년 10월 22일
1

V_log

목록 보기
1/3
post-thumbnail

최근 블로그 쓰기에 맛들렸기에.. 혼자 노션에 옴싹옴싹 적어오던 것을 블로그에 적어보면 어떨까 하는 생각이 들었다. 그러다 나의아기컴퓨터박사 권양이 velog 플랫폼을 추천해주었기에 .. 여기에 남겨본다! 선배랑 언니랑 같이 R 시각화 이야기 나누던 것과 따로 공부하는 내용을 조금 더 자세하게 적어보려 한다. 주기적 연재를 할 만큼 귀찮음을 이겨낼 수 있을지 모르겠지만 .. 아자아자 ㅎ

💡어떤 데이터?

https://github.com/blushedmw/MabuChallenge/tree/53d372362a81744a6c9dd7f1db03fd8744211595/10%EC%9B%94_3%EC%A3%BC
ㄴ 위 링크의 "dsat_dist_2020_10.xlsx" 파일을 활용했다.

시카고 대학교에서 만든 The Database on Suicide Attacks (DSAT)의 데이터로, 1982년부터 2019년까지의 자살테러 사건 관련 정보가 들어있다. sheet 2에는 공격 전반에 대한 정보가, 3에는 테러 주장에 대한 정보, 4에는 공격자에 관한 정보가 담겨있다. 그 중 내가 사용한 건 sheet 2!

💡어떤 고민?

(1) 아이디어를 섞고 싶다는 생각

여러 지역의 테러 정보가 있지만, 이-팔 지역에 초점을 두고 싶었고, 얼마나 큰 피해가 있었는지를 나타내고 싶었다. 그리고 데이터를 들여다보니 부상자, 사망자 수 뿐 아니라 민간인 사망자 수도 집계되어 있어 이것 또한 담아보고자 했다.

그럼 이제 어떻게 보여줘야 할까.

이전에 US Mass Shooting data로 시각화했을 때, 선배께서 사망자와 부상자를 핏자국처럼 보이게 시각화하신 적이 있었는데, 그게 너무 신기했어서 나도 아이디어를 섞어보고 싶었다.

그 핏자국 시각화는 아래와 같은 느낌이다. (이번 데이터로 코드 카피해봤다) 색이 진한 원이 사망자 수, 회색 원은 사망자 + 부상자 수이다. (즉 전체 피해자 수!)

library(tidyverse)
library(lubridate)
library(readxl)

dsat <- read_xlsx('dsat_dist_2020_10.xlsx',sheet=2)

#핏자국 코드카피
dsat %>% filter((admin0_txt %in% c("Israel","Palestine")) & date_year>=1990) %>%
  mutate(date_x = as_date(paste('2020-',as.character(date_month),'-',as.character(date_day))),
         damaged = wounded_high+killed_high) %>%
  ggplot(aes(x=date_x, y=date_year)) +
  geom_point(aes(size=damaged), color='grey80', alpha=0.5)+
  geom_point(aes(size=killed_high), color='#C70050', alpha=0.5)+
  theme_minimal() +
  scale_x_date(date_breaks = "1 month", date_labels = "%b") +
  scale_size(range=c(0.1,18))+
  scale_y_reverse()+
  theme(legend.position = "none")

아!! ggblur 패키지 쓰면 저 점이 번져서 더더욱 의도한 느낌을 낼 수 있었는데,

install.packages('devtools')
devtools::install_github("coolbutuseless/ggblur")
install.packages('ggblur')
library(ggblur)

그걸 위해 필요한 저 위의 과정을 실행해보려다가

"네임스페이스 ‘pkgload’ 1.2.4는 로드되었으나 >= 1.3.0가 필요합니다"
ㄴ 이딴 에러가 나를 열받게 하여서, 에러 고치면 다시 업뎃해보도록 하겠습니다,

(2) 레퍼런스 찾기

저렇게 원의 크기로 피해를 나타내는 것 말고 다른 게 뭐가 있을까 하다가, 세상엔 똑똑한 사람들이 참 많으니 전쟁 피해 시각화 관련 레퍼런스를 찾아보기로! 했다. War damage visualization .. Death data visualization ... 이런 키워드로 검색을 막 하다가 발견한, 심플하면서도 처절한 시각화.

South China Morning post에서 제작한, 미 연합군의 이라크 침공으로 인한 사망자 시각화이다. 쨍한 빨간색은 시민 사망자를 나타낸 것이고, 더 짙은 빨간색은 연합군 사망자이다.

https://www.scmp.com/infographics/article/1284683/iraqs-bloody-toll

검색하다가 함께 찾은 아래 사진을 보고, 역시 시각화는 보여주고자 하는 방향에 따라 천차만별이 될 수 있음을 다시금 깨달았다. 오른쪽 그림처럼 뒤집어 보면, 사망자가 감소하고 있었다 ^^ 라고 말할 수 있었을 테니 말이다. 전쟁 피해의 무게를 강조하기 위해 피가 흘러내리는 듯한 모양으로 시각화를 한 센스에 감탄했고, 이걸 따라해보기로 했다!

https://gravyanecdote.com/uncategorized/should-you-trust-a-data-visualisation/
(아래 사진 출처)

(3) 따라해보기

이제 시각화 진화 과정을 적어보겠다.

1) geom_col 버전

문제 1. 딱 방향만 뒤집어서 막대그래프(geom_col)로 나타낸 버전이다. (2000~2005년 사이 피해가 집중적으로 발생해서 이 구간만 시각화해보았다.) 막대가 네모져서 그런지, 뭘 나타내려 하는지 잘 모르겠다. 모양을 바꿔야 한다!

문제 2. 그리고 부상자, 사망자 수에 단순히 -1을 곱해 아래로 내리니, y축 라벨 값에 -200, -400 이렇게 적혀있다. 표현 방식을 바꿔주어야 한다!

문제 3. 또, (선배께서 짚어주신 부분인데) 지금 그래프에서는 빨간색(red)이 부상자, 가장 짙은 (red4) 빨간색이 사망자, 중간 짙은 빨간색 (red3)이 시민 사망자를 나타낸다. 그런데 부상자 수와 사망자 수는 별개이기 때문에, 이런 식으로 막대 위에 막대를 깔게 되면 부상자 수 안에 사망자 수가 포함되도록 잘못 해석할 수 있는 여지가 생긴다. 그러니, 가장 처음 두는 막대 레이어에 아예 부상자수 + 사망자수를 나타내는 게 좋겠다!

dsat %>% filter(admin0_txt %in% c("Israel","Palestine")) %>%
  mutate(attack_date_month = as_date(paste(as.character(date_year),'-',as.character(date_month),'-01')),
         wounded_high_rev = (-1)*wounded_high,
         killed_high_rev = (-1)*killed_high,
         killed_high_civilian_rev = (-1)*killed_high_civilian) %>%
  group_by(attack_date_month) %>% summarize(wdd_s = sum(wounded_high_rev),
                                            kill_s = sum(killed_high_rev),
                                            kill_c_s = sum(killed_high_civilian_rev)) %>%
  filter((attack_date_month >= as_date('2000-01-01')) & (attack_date_month <= as_date('2006-01-01'))) %>%
  ggplot(aes(x=attack_date_month)) +
  geom_col(aes(y=wdd_s), fill='red') +
  geom_col(aes(y=kill_s), fill='red4') +
  geom_col(aes(y=kill_c_s), fill='red3') +
  theme_minimal() +
  labs(title = 'Israel-Palestine Bloody toll',
       subtitle = '2000~2005') +
  theme(plot.title = element_text(hjust=0.5),
        plot.subtitle = element_text(hjust=0.5))

3) 이것저것 수정해본 버전

해결 1. geom_chicklet으로 둥글게 하고, 아까 전 사진에서 0 부근의 삐죽삐죽한 것들을 다듬어줬다. radius 값을 조정해준 건데, 좀 덜 둥글고 0 부근엔 아직도 둥근 값들이 조금씩 남아있지만 그래도 아까보단 낫다 ㅎ

해결 2. scale_y_reverse 를 써서 굳이 마이너스 안 붙이고도 아래로 내렸다!

해결 3. 부상자 수 + 사망자 수 더해서 피해자수 (damaged)로 제일 밑 막대 깔았다!

(+) 보기 좋게 하기 위하여... x축 y축 이름 바꾸고 연도 표시를 위로 올렸다. 그리고 (사랑해요 미리캔버스) 따로 범례 추가 ㅎㅎ

dsat %>% filter(admin0_txt %in% c("Israel","Palestine")) %>%
  mutate(attack_date_month = as_date(paste(as.character(date_year),'-',as.character(date_month),'-01')),
         damaged = wounded_high+killed_high) %>%
  group_by(attack_date_month) %>% summarize(dmg_s = sum(damaged),
                                            kill_s = sum(killed_high),
                                            kill_c_s = sum(killed_high_civilian)) %>%
  filter((attack_date_month >= as_date('2000-01-01')) & (attack_date_month < as_date('2006-01-01'))) %>%
  ggplot(aes(x=attack_date_month)) +
  geom_chicklet(aes(y=dmg_s), fill='red', color='red', radius=unit(0.3,'mm'), width=30) +
  geom_chicklet(aes(y=kill_s), fill='red4', color='red4', radius=unit(0.3,'mm'), width=30) +
  geom_chicklet(aes(y=kill_c_s), fill='red3', color='red3', radius=unit(0.3,'mm'), width=30) +
  theme_minimal() +
  scale_x_date(position = "top", breaks = "1 year", date_labels = "%Y") +
  scale_y_reverse()+
  labs(title = 'Israel-Palestine Bloody toll',
       subtitle = '2000~2005',
       x= 'Year', y= 'How many') +
  theme(plot.title = element_text(hjust=0.5),
        plot.subtitle = element_text(hjust=0.5))

세상에서 제일 주절대는 시각화일지 작성 완료..

최뱁새 열심히 해보겠음. 아자자 ^_^

profile
데이터로 전하는 사람 이야기

0개의 댓글