해당 글은 pinkwink 강사님의 daily project를 풀이하였습니다.
이번 프로젝트에서 느낀점은
저는 그동안 직접 모든 소스코드를 작성해왔는데
막히는 부분이 있다면 인터넷에 있는 소스코드를 그대로 가져와서 참조한다는 것이 조금 어색했습니다.
강의시간에 프로젝트를 진행하면서 최대한 코드를 긁어오지 않으려고 했는데 그거 때문에 많이 늦어졌네요.
이번 프로젝트에서는
내가 어떤 상황에서 이 정보를 써야한다는 것을 알고, 구글링을 빠르게 하여
내 코드 상황에 맞게 적용해나가는 훈련을 할 수 있었습니다.
결국엔 강의자료를 더 많이 찾아보았지만, 계속하다보면 연습이 될 것 같습니다.
이번 프로젝트는
세계 테러 데이터 분석으로 캐글에서 테러 관련 데이터를 가져와 분석을 하는 프로젝트입니다.
https://www.kaggle.com/datasets/START-UMD/gtd?resource=download
저는 해당 사이트에서 자료를 다운받아서 진행을 하였습니다.
step 1 : 전체 기간에서 테러의 숫자를 연도별로 집계하여 연도별 테러 숫자 시각화
- 테러는 특정 연도를 기점으로 급격하게 증가한다. 이 구간을 특정짓고 그 "기점"에서 세계적 이슈가 무엇인지 추측
import pandas as pd
# 위 사이트에서 받아온 자료를 불러온다.
Terror_World = pd.read_csv("./globalterrorismdb_0718dist.csv", encoding="ISO-8859-1")
Terror_World
파일은 같은 경로에 넣으면 작동합니다.
- step 1에서 필요한 자료를 먼저 생각해보자. 전체 기간에서 숫자를 연도별로 집계해야함으로 연도별 테러의 총합을 구해야할 것이라 생각된다,
# 자료에서 연도만 가져와 저장한다.
Terror_World_step1 = Terror_World.loc[:, ["iyear"]]
Terror_World_step1
# 연도별 테러발생 횟수를 구한다.
Terror_World_step1["iyear"].value_counts().head()
이제 연도별 자료가 모두 준비되었으니 시각화를 진행합니다.
# matplotlib의 경우 한글폰트 깨짐현상을 방지하기 위한 코드
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False
f_path = "c:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname=f_path).get_name()
rc('font', family=font_name)
#연도별 테러발생 횟수를 시각화 하는 코드
import seaborn as sns
plt.subplots(figsize=(15,6))
sns.barplot(Terror_World_step1['iyear'].value_counts().index, Terror_World_step1['iyear'].value_counts().values)
plt.xticks(rotation=90)
plt.title('연도별 테러발생 횟수')
plt.show()
- 그래프를 확인한 결과 2012년을 기점으로 테러가 증가하고 있다.
- 그렇다면 2012~2013년도에 어떠한 일이 발생했었는가?
결론 : 나의 추측
- https://namu.wiki/w/iPhone
- 2007년 아이폰을 시작으로 스마트폰이 등장하였음.
- 2008년~2012년까지 스마트폰이 보급되던 시기
- https://catalk.kr/information/worldwide-social-media-users.html
- http://www.inss.re.kr/upload/bbs/BBSA05/202101/F20210125215731169.pdf
- 그와 동시에 등장한 매체가 SNS
- 이슬람 극단주의자들 등은 SNS를 통해 자신들의 체제를 선전하면서 성장했음.
- 그러한 이유로 스마트폰의 보급과 소셜 네트워크의 성장으로 이슬람 극단주의자들의 영향력이 커지며, 그와 동시에 관련 테러가 증가하였다고 예상된다.
Step 2 : 전세계 테러 데이터를 가지고, 테러가 많이 일어난 국가를 정렬해 상위 10위의 국가를 시각화
- 국가별로 테러 발생횟수를 저장해야 한다. 연도별 테러의 총합을 구하자.
# 나라이름을 가져온다.
Terror_World_step2 = Terror_World.loc[:, ["country_txt"]]
Terror_World_step2
# 계산 혹은 보여지기 편리하기 위해 컬럼의 이름을 변경한다.
Terror_World_step2.rename(columns={Terror_World_step2.columns[0]: "국가"}, inplace=True)
# 국가가 언급된 횟수를 구한다.
Terror_World_step2["국가"].value_counts()
# 그 값을 가지고 상위 10개국을 뽑아내 시각화를 진행한다.
plt.subplots(figsize=(15,6))
sns.barplot(
Terror_World_step2['국가'].value_counts().index[ :10],
Terror_World_step2['국가'].value_counts().values[ : 10]
)
plt.xticks(rotation=90)
plt.title('테러가 많이 일어난 국가')
plt.show()
- 테러가 가장 많이 일어난 국가는 이라크, 파키스탄, 아프가니스탄, 인도, 콜롬비아, 필리핀, 페루, 엘살바도르, 영국, 터키 순서이다.
Step 3 : step 2의 전 세계 테러가 일어난 횟수별 상위 10위 국가에 대해 사망자 수와 부상자 수를 구분하여 시각화 하시오.
- 어떤 테러횟수와 사상자의 관계를 구해보세요.
# 이 문제를 풀기위해 나라이름, 사망자, 부상자를 가져오자.
Terror_World_step3 = Terror_World.loc[:, ["country_txt", "nkill", "nwound" ]].fillna(0)
Terror_World_step3
# 계산 혹은 보여지기 편리하기 위해 컬럼의 이름을 변경한다.
import numpy as np
Terror_World_step3.rename(columns={Terror_World_step3.columns[0]: "국가"}, inplace=True)
Terror_World_step3.rename(columns={Terror_World_step3.columns[1]: "사망자"}, inplace=True)
Terror_World_step3.rename(columns={Terror_World_step3.columns[2]: "부상자"}, inplace=True)
#피벗테이블을 이용하여 국가를 인덱스로 국가별 사상자의 수를 계산한 데이터프레임을 작성한다.
Terror_World_step3 = Terror_World_step3.pivot_table(Terror_World_step3, index=["국가"], aggfunc = [np.sum] )
Terror_World_step3
다른 것 보다도 피벗테이블 만드는 과정이 너무 이해하기 힘들어서, 다음 프로젝트부터는 무조건 피벗테이블을 하나씩 써보는 것으로 하겠습니다.
#피벗테이블을 사용하면 멀티인덱스 상태가 된다. 이 상태에서 value에 접근하는 방법을 알기 어려워 멀티인덱스를 없애는 코드를 가져왔다.
Terror_World_step3.columns = ['/'.join(col) for col in Terror_World_step3.columns]
Terror_World_step3
# 3번은 국가별 테러횟수와 사상자의 관계를 찾는 것이다. 그렇기에 테러횟수를 데이터프레임으로 저장한다.
Terror_nara=Terror_World_step2["국가"].value_counts().to_frame()
Terror_nara.rename(columns={Terror_nara.columns[0]: "테러횟수"}, inplace=True)
Terror_nara
# 계산 혹은 보여지기 편리하기 위해 컬럼의 이름을 변경한다.
Terror_World_step3.rename(columns={Terror_World_step3.columns[0]: "부상자"}, inplace=True)
Terror_World_step3.rename(columns={Terror_World_step3.columns[1]: "사망자"}, inplace=True)
Terror_World_step3
#테러횟수 데이터프레임과 부상자, 사망자가 있는 데이터프레임을 하나로 합친다.
Terror_World_step3_nara =pd.merge(Terror_nara, Terror_World_step3, left_index=True, right_index=True, how='right').sort_values(by="테러횟수", ascending=False).head(10)
Terror_World_step3_nara
# 대한민국 범죄율 pdf에서 가져온 원 그래프를 그려 테러횟수, 부상자, 사망자를 보여준다.
f, ax = plt.subplots(1,3, figsize=(20,6))
Terror_World_step3_nara['테러횟수'].plot.pie(ax= ax[0], autopct = "%.1f")
ax[0].set_title('테러횟수')
ax[0].set_ylabel('')
Terror_World_step3_nara['부상자'].plot.pie( ax= ax[1], autopct = "%.1f")
ax[1].set_title('부상자')
ax[1].set_ylabel('')
Terror_World_step3_nara['사망자'].plot.pie( ax= ax[2], autopct = "%.1f")
ax[2].set_title('사망자')
ax[2].set_ylabel('')
plt.show()
여기까지 테러횟수, 부상자, 사망자 통계를 얻었으나 우리가 알아야할 정보는 테러횟수와 사상자, 사망자간의 관계이다.
#보는 것도 중요하지만 테러횟수와 사상자의 관계를 알고 싶다. 그렇기에 사상자 컬럼을 새로 만든다.
Terror_World_step3_nara["사상자"] = Terror_World_step3_nara["사망자"] + Terror_World_step3_nara["부상자"]
Terror_World_step3_nara
# 테러당 몇명의 사상자가 발생하는지 계산하여 새로운 컬럼으로 추가한다.
Terror_World_step3_nara["평균테러사상자"] = Terror_World_step3_nara["사상자"] / Terror_World_step3_nara["테러횟수"]
a=Terror_World_step3_nara.sort_values(by="평균테러사상자", ascending=False).head(10)
a
# 그 값을 표현한다.
plt.figure()
a["평균테러사상자"].plot.pie(autopct='%.1f')
plt.ylabel('')
plt.title('평균테러사상자')
plt.show()
- 이라크의 경우 테러 한 번이 발생하면 평균적으로 20명의 사상자가 발생한다.
- 영국의 경우 테러 한 번이 발생하면 평균적으로 4.3명의 사상자가 발생한다.
step 4. 중동& 북아프리카, 남아시아, 남아메리카, 서유럽 등등 지역으로 구분하여 각 지역별로 테러 공격 형태, 사망자와 사상자의 수 등에 대해 각 지역별로 특성들이 있는지 확인하세요.
# 이 문제를 풀기 위해 국가, 대륙, 유형, 사망자, 부상자를 가져왔다.
Terror_World_step4 = Terror_World.loc[:, ["country_txt", "region_txt", "attacktype1_txt", "nkill", "nwound" ]].fillna(0)
Terror_World_step4
# 계산 혹은 보여지기 편리하기 위해 컬럼의 이름을 변경한다.
Terror_World_step4.rename(columns={Terror_World_step4.columns[0]: "국가"}, inplace=True)
Terror_World_step4.rename(columns={Terror_World_step4.columns[1]: "지역"}, inplace=True)
Terror_World_step4.rename(columns={Terror_World_step4.columns[2]: "유형"}, inplace=True)
Terror_World_step4.rename(columns={Terror_World_step4.columns[3]: "사망자"}, inplace=True)
Terror_World_step4.rename(columns={Terror_World_step4.columns[4]: "부상자"}, inplace=True)
# 잘 바뀌었는지 확인
Terror_World_step4
# 이 문제는 사망자와 사상자만 필요하기 때문에 사상자를 하나 만들고 부상자는 삭제했다.
Terror_World_step4["사상자"] = Terror_World_step4["사망자"] + Terror_World_step4["부상자"]
del Terror_World_step4["부상자"]
Terror_World_step4
#피벗 테이블을 이용해 대륙별 테러유형에 따른 사망,사상자를 데이터프레임으로 나타냈다.
continent_Terror =Terror_World_step4.pivot_table(Terror_World_step4, index=["지역", "유형"], aggfunc = [np.sum] )
continent_Terror
# 계산의 용의함을 위해 멀티인덱스를 단일로 풀어내었다.
continent_Terror.columns = ['/'.join(col) for col in continent_Terror.columns]
continent_Terror = continent_Terror.reset_index()
continent_Terror
# 계산 혹은 보여지기 편리하기 위해 컬럼의 이름을 변경한다.
continent_Terror.rename(columns={continent_Terror.columns[2]: "사망자"}, inplace=True)
continent_Terror.rename(columns={continent_Terror.columns[3]: "사상자"}, inplace=True)
continent_Terror
# 피벗테이블을 이용해 지역별 유형에따른 사망, 사상자를 표시하는 데이터프레임을 작성
continent_Terror =Terror_World_step4.pivot_table(Terror_World_step4, index=["지역"], columns=["유형"], aggfunc = [np.sum] )
continent_Terror
오른쪽에는 사상자 데이터가 들어있어요. 캡쳐해야하나
# 인터넷에서 가져온 최대값만 배경색을 바꾸는 함수
def draw_color_at_maxmum(x,color):
color = f'background-color:{color}'
is_max = x == x.max()
return [color if b else '' for b in is_max]
# 사망자부분만 분리해서 최대값의 배경에 색을 칠한다.
continent_Terror_die = continent_Terror.iloc[:, 0:9]
continent_Terror_die.style.apply(draw_color_at_maxmum,color='#ff9090',axis=1)
출처를 깜빡했습니다..
대륙의 사망자의 통계
- Australasia & Oceania, Central America & Caribbean,Central Asia, East Asia 등의 경우 무장 공격(총기난사?)가 사망자가 많았다.
- Eastern Europ, Middle East & North Africa 등은 Bombing/Explosion(폭탄테러)가 사망자가 많았다.
- Western Europe의 경우 암살이 많았다.
- North America 의 경우 Hijacking(항공기 납치)의 사망자가 많았다. ->
- North Ameria는 항공기납치가 빈번하게 일어나는가? -> 아니다 -> 9.11 테러 하나의 사망자가 3000명 이상 / 사상자는 최대 40000만명 이상이다.
- https://namu.wiki/w/9.11%20테러?from=9.11
#이번엔 사상자만 가져와서 최대값에 색을 칠한다.
continent_Terror_injury = continent_Terror.iloc[:, 9:17]
continent_Terror_injury.style.apply(draw_color_at_maxmum,color='#ff9090',axis=1)
대륙의 사상자의 통계
- Australasia & Oceania, Central America & Caribbean,Central Asia, South America 등의 경우 무장 공격(테러)가 사상자가 많았다.
- Eastern Europ, Middle East & North Africa, South Asia 등은 Bombing/Explosion(폭탄테러)가 사상자가 많았다.
- East Asia의 경우 비무장 공격의 사상자가 많았다.
- North America 의 경우 Hijacking(항공기 납치)의 사상자가 많았다.
Step 5. 중동,북아메리카, 남아시아 등 지역으로 구분하여 진행한 문제 4번에 대해 문제 1번에서 특정 지은 시기를 기준으로 다시 분리하여 테러의 양상을 분석해보시오.
- 2011~2012년 테러가 급증하던 시기에 테러의 양상을 분석해보세요.
(이 부분은 step 4와 겹치기 때문에 코드를 최대한 길게 적고 결과를 조금 보여주면서 넘어가겠습니다.)
#원본 데이터를 가공해서 2011년~2012년 데이터만 뽑아내자.
Terror_world2 = Terror_World[(Terror_World["iyear"] == 2012) | (Terror_World["iyear"] == 2013) ]
#데이터 가공을 완료하고, step 4에서 진행한 내용을 복사 붙여넣기하여 빠르게 지나가도록 하겠습니다.
Terror_World_step5 = Terror_world2.loc[:, ["country_txt", "region_txt", "attacktype1_txt", "nkill", "nwound" ]].fillna(0)
Terror_World_step5.rename(columns={Terror_World_step5.columns[0]: "국가"}, inplace=True)
Terror_World_step5.rename(columns={Terror_World_step5.columns[1]: "지역"}, inplace=True)
Terror_World_step5.rename(columns={Terror_World_step5.columns[2]: "유형"}, inplace=True)
Terror_World_step5.rename(columns={Terror_World_step5.columns[3]: "사망자"}, inplace=True)
Terror_World_step5.rename(columns={Terror_World_step5.columns[4]: "부상자"}, inplace=True)
Terror_World_step5["사상자"] = Terror_World_step5["사망자"] + Terror_World_step5["부상자"]
del Terror_World_step5["부상자"]
whathappen_2012_3 =Terror_World_step5.pivot_table(Terror_World_step5, index=["지역", "유형"], aggfunc = [np.sum] )
whathappen_2012_3
#step 4에서 했던 과정을 반복하고 있다.
whathappen_2012_3.columns = ['/'.join(col) for col in whathappen_2012_3.columns]
whathappen_2012_3 = whathappen_2012_3.reset_index()
whathappen_2012_3.rename(columns={whathappen_2012_3.columns[2]: "사망자"}, inplace=True)
whathappen_2012_3.rename(columns={whathappen_2012_3.columns[3]: "사상자"}, inplace=True)
whathappen_2012_3 =whathappen_2012_3.pivot_table(whathappen_2012_3, index=["지역"], columns=["유형"], aggfunc = [np.sum] ).fillna(0)
whathappen_2012_3
우측은 이제 언급하지 않아도 다 알것이라 생각합니다.
# sort를 해야하는데, 멀티인덱스 환경이라 방법을 몰라 풀어내었다.
whathappen_2012_3_die = whathappen_2012_3.iloc[:, 0:9]
whathappen_2012_3_die.columns = ['/'.join(col) for col in whathappen_2012_3_die.columns]
whathappen_2012_3_die
# sort를 진행하였다.
whathappen_2012_3_die.sort_values(by="sum/사망자/Armed Assault", ascending=False)
결론 : 2011~2012년도에 테러는 남아시아, 사하라 이남 아프리카, 중동아시아 혹은 북아프리카, 동남아시아에서 테러가 발생했다.
- 1번에서 가정한 sns의 발전으로 이슬람 극단주의자들이 성장하여 테러가 증가하였다. 라는 가설을 검증하기 위해 세계에서 이슬람의 영향권을 확인해봐야겠다.
- http://news.kmib.co.kr/article/view.asp?arcid=0923143410&code=11141300&sid1=spo?
- 지도를 확인해보았을 때, 이슬람의 영향권과 테러가 일어난 지역이 겹치는 것으로 보아 이슬람 극단주의자들의 영향으로 2012~2013년 전세계 테러횟수가 증가하였다고 결론 내릴 수 있겠다
Step 6. 테러의 위험성을 알릴 수 있는 효과적인 시각화 방법을 고민해보시오.
- 이런 테러의 어둡고 무서운 면을 강조할 수 있는 방법을 고민하여 데이터를 분석하고 시각화하여 제시하시오.
- 전세계 사망자 중에서 테러로 사망하는 사람은 얼마나 될까?
- https://data.worldbank.org/indicator/SP.DYN.CDRT.IN 해당 사이트에서 1000명당 사망률 통계를 받아왔다.
death_rate = pd.read_csv("./death_rate.csv", encoding="ISO-8859-1").fillna(0)
death_rate
death_rate = death_rate.sum().to_frame()
death_rate
death_rate_frame = death_rate.iloc[11:59]
death_rate_frame.rename(columns={death_rate_frame.columns[0]: "사망자"}, inplace=True)
death_rate_frame_real = death_rate_frame['사망자']*1000
death_frame=death_rate_frame_real.to_frame()
death_frame
Terror_death = Terror_World.loc[:, ["iyear", "nkill"]].fillna(0)
Terror_death = Terror_death.pivot_table(Terror_death, index=["iyear"], aggfunc = [np.sum] )
Terror_death.columns = ['/'.join(col) for col in Terror_death.columns]
Terror_death.rename(columns={Terror_death.columns[0]: "테러사망자"}, inplace=True)
Terror_death
Terror_death[['테러사망자']].plot(figsize=(20,10))
death_frame[['사망자']].plot(figsize=(20,10))
plt.show()
매년 사망자는 줄고 있는데, 테러 사망자는 오히려 늘어나고 있다.
'ㅇ 프로젝트 > (Toy)_project' 카테고리의 다른 글
네이버 API를 이용해서 그래픽카드 특가를 노려보자 (2/2) (0) | 2022.10.03 |
---|---|
5. 네이버 API를 이용해서 그래픽카드 특가를 노려보자 (1/2) (0) | 2022.10.02 |
crawling을 통해 그래픽카드의 특가를 노려보자. (0) | 2022.09.29 |
전기기사 자격증의 데이터를 분석해보자. (0) | 2022.09.27 |
(JAVA) (대학교) 농산물 관리 프로그램 텀프로젝트 (1) | 2022.09.01 |