본문 바로가기

Theory/DataScience

전세계 테러 데이터 분석 (따라하기)

오늘은 따라하기입니다.^^

Kaggle에 전세계 테러리즘이라는 데이터가 있습니다. 1970년부터 2017년까지의 자료입니다.

이 데이터는 압축을 풀면 무려~ 155.27MB의 크기입니다. 헉~ 그리고 저렇게 상세하게 테러 데이터가 정리되어 있습니다.

그 중에서 가 장 인기(^^)가 많은 글을 따라가보았습니다.

이 분의 글이지요. 이 글이 흥미로워서 따라 읽다가 저는 잘 실행되지 않는 곳도 있고, 또 아주 약간 편집한 것도 있어서 그냥 블로그에 옮겨 봅니다. 다시 말씀드리지만, 따라하기 입니다.ㅠㅠ.

import pandas as pd

terror = pd.read_csv('./data/globalterrorismdb_0617dist.csv',encoding='ISO-8859-1')
terror.rename(columns={'iyear':'Year', 'imonth':'Month',
                       'iday':'Day', 'country_txt':'Country',
                       'region_txt':'Region', 'attacktype1_txt':'AttackType',
                       'target1':'Target', 'nkill':'Killed',
                       'nwound':'Wounded', 'summary':'Summary',
                       'gname':'Group', 'targtype1_txt':
                       'Target_type', 'weaptype1_txt':
                       'Weapon_type', 'motive':'Motive'},
              inplace=True)

terror = terror[['Year', 'Month', 'Day', 'Country', 'Region', 'city',
                 'latitude', 'longitude', 'AttackType', 'Killed', 'Wounded', 'Target',
                 'Summary', 'Group', 'Target_type', 'Weapon_type', 'Motive']]
terror['casualities'] = terror['Killed'] + terror['Wounded']
terror.head()

먼저 원하는 컬럼만 가져와서 컬럼 이름을 변경했습니다.

연도와 날짜, 나라, 도시와 그 위도/경도 데이터, 사망자, 부상자 수, 등등 참 자세하네요.

terror[terror['Country']=='South Korea'][:5]

그 중 궁금해서 한국 데이터만 가져와 봅니다.

어~? 데이터가 있습니다. 전 이때까지 한국은 테러가 없는 나라라고 생각했거든요. 그래서 봤더니, 1974년 육영수 여사 피살 사건도 테러였습니다. 아 그런데, 1986년 김포공항 테러는 뭘까요. 사망이 5명이나 있는 사건입니다.

실제 있었던 엄청난 사건이었군요. 왜 저는 모르고 있었을까요. 에구...

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

plt.subplots(figsize=(15,6))
sns.countplot('Year', data=terror, palette='RdYlGn_r', 
              edgecolor=sns.color_palette('dark',7))
plt.xticks(rotation=90)
plt.title('Number Of Terrorist Activities Each Year')
plt.show()

다시 연도별 테러 발생 건수를 확인합니다.

2004년 부터 테러가 엄청 증가하네요ㅠㅠ.

import numpy as np
import folium

terror_killed_sort = terror.sort_values('Killed', ascending=False)[:1000]

map2 = folium.Map(location=[30,0], tiles='CartoDB dark_matter', zoom_start=2)
for _, row in terror_killed_sort[0:100].iterrows():
    if ~np.isnan(row['latitude']):
        folium.CircleMarker(location=[row['latitude'], row['longitude']],
                            radius=row['Killed']/100, fill=True,
                            color='red', fill_opacity=0.7).add_to(map2)
map2

사망자 순으로 데이터를 정렬하고, 그 중 상위 1000개 데이터만 추려서, 지도 시각화로 소개해 드린 적이 있는 folium에서 표현해 보았습니다.

이렇게 보입니다. 확실히 중동이 많네요. 그리고 미국은 뉴욕의 9/11 입니다.

plt.subplots(figsize=(15,6))
sns.countplot('Region', data=terror, palette='RdYlGn',
              edgecolor=sns.color_palette('dark',7),
              order=terror['Region'].value_counts().index)
plt.xticks(rotation=90)
plt.title('Number Of Terrorist Activities By Region')
plt.show()

이번에는 지역별로 구분해서 확인해보겠습니다.

확실히 중동이 많습니다. 그런데 그 다음이 남아시아군요. 아시아도 테러에서 안전한 곳은 아니었던 모양입니다.

plt.subplots(figsize=(18,6))
sns.barplot(terror['Country'].value_counts()[:15].index,
            terror['Country'].value_counts()[:15].values,
            palette='inferno')
plt.title('Top Affected Countries')
plt.show()

다시 국가별로해서 테러가 많이 발생한 국가를 확인합니다.

이라크, 파키스칸, 아프카니스탄이 1, 2, 3위네요. 그런데, 아시아 국가 중에서 인도와 필리핀도 상위군요. 필리핀도 테러가 많이 발생하는 국가입니다. 태국도 그 위에 있네요. 필리핀과 태국은 관광지로만 알고 있었는데 테러가 많이 발생했네요ㅠㅠ.

from matplotlib import animation,rc
import io
import base64
from IPython.display import HTML, display
import codecs
import warnings
from mpl_toolkits.basemap import Basemap
warnings.filterwarnings('ignore')

fig = plt.figure(figsize = (10,6))

def animate(Year):
    ax = plt.axes()
    ax.clear()
    ax.set_title('Animation Of Terrorist Activities'+'\n'+'Year:' +str(Year))
    m6 = Basemap(projection='mill',
                 llcrnrlat=-80, urcrnrlat=80, llcrnrlon=-180, urcrnrlon=180, lat_ts=20,
                 resolution='c')
    
    lat6=list(terror[terror['Year']==Year].latitude)
    long6=list(terror[terror['Year']==Year].longitude)
    
    x6, y6 = m6(long6, lat6)
    m6.scatter(x6, y6, s=[(kill+wound)*0.1 
                          for kill, wound in 
                              zip(terror[terror['Year']==Year].Killed,
                                  terror[terror['Year']==Year].Wounded)],
               color = 'r')
    
    m6.drawcoastlines()
    m6.drawcountries()
    m6.fillcontinents(zorder = 1,alpha=0.4)
    m6.drawmapboundary()
    
ani = animation.FuncAnimation(fig, animate, list(terror.Year.unique()), 
                              interval = 1500)    
ani.save('animation.gif', writer='pillow', fps=1)
plt.close(1)

filename = 'animation.gif'
video = io.open(filename, 'r+b').read()
encoded = base64.b64encode(video)
path = '''<img src="data:image/gif;base64,{0}" type="gif" />'''
HTML(data=path.format(encoded.decode('ascii')))

이제 연도별 테러 상황을 지도에 나타내보는 것입니다. 먼저 matplotlib를 이용해서 애니메이션 효과를 내기 위해 편리한 basemap을 사용합니다. 그리고 matplotlib의 애니메이션 효과를 사용하구요.

이렇게 확인할 수 있습니다.

비록 이번 글은 처음에 이야기했듯이 어느 고수의 글을 따라한 것이었습니다. 이 글을 따라하다보면 죄없는 어린 아이들까지도 희생해야하는 테러에 대해 화가 나기도 합니다. 엄마 잃은 소녀가 엄마를 그려두고 그 안에서 잠드는 사진과 배를 타고 안전을 위해 대피하다가 숨진 소년, 죽은 부모의 무덤 사이에서 잠든 소년... 이런 일들이 생기지 않았으면 정말 좋겠습니다. 마지막으로 제가 정말 좋아하는 애니인 은영전의 양웬리의 명언 한 줄로 마무리 하겠습니다.

테러리즘과 신비주의가 역사를 건설적인 방향으로 움직였던 적은 없다.
- 은하영웅전설 5권 풍운편에서 - 양 웬리의 말 -


반응형