Home 교통사고 데이터 시각화
Post
Cancel

교통사고 데이터 시각화

Traffic Accident Data Analysis

데이터 선택을 잘못한거 + 지식 부족으로 원하는 결과를 도출해내지 못했음 -> 망한 프로젝트

1. 소개

공공 데이터 포털에서 제공하는 교통 사고 관련 데이터를 분석화하고 시각화 해본 프로젝트

2. 이용 데이터

파일 이름을보면 2020년에 발생한 교통사고에 대한 자료인거 같다.

다양한 종류의 교통 사고 관련 데이터가 있지만, 위의 4개의 데이터를 이용할 예정
공공포털에서 API를 제공하고 있지만, CSV 파일이 좀 더 이용하기 편해서 파일을 다운 받아 이용
-> 이후에 API로 변경 될 수 있음

3. 목표

  1. 각각의 데이터 셋에 대한 분석 및 시각화
  2. 공통 항목을 가진 하나의 데이터 셋 생성
  3. 종합된 데이터 셋에 대한 분석 및 시각화

4. 구현

1. 각 데이터 셋 분석 및 시각화

1
2
3
4
import pandas as pd
import numpy as np
import plotly.express as px
import chart_studio as cs

1. 사고 유형별 교통사고 통계

1
df_accident_type = pd.read_csv("data/도로교통공단_사고유형별 교통사고 통계_20201231.csv", encoding="cp949")
1
df_accident_type
사고유형대분류사고유형중분류사고유형사고건수사망자수중상자수경상자수부상신고자수
0차대사람횡단중횡단중1314752064176617517
1차대사람차도통행중차도통행중370219514232022209
2차대사람길가장자리구역통행중길가장자리구역통행중2079405911371160
3차대사람보도통행중보도통행중2015267071260129
4차대사람기타기타15278288519592901272
5차대차정면충돌정면충돌749418136578468677
6차대차측면충돌측면충돌7474244119893888386945
7차대차후진중충돌후진중충돌325342974003154
8차대차추돌추돌329933707924483453172
9차대차기타기타4607030311000509734764
10차량단독전도전도110890412466281
11차량단독전복전복17826819832
12차량단독공작물충돌공작물충돌323334013761745668
13차량단독주/정차차량 충돌주/정차차량 충돌194881
14차량단독도로이탈도로이탈 추락4139218520346
15차량단독도로이탈도로이탈 기타1993011311324
16차량단독기타기타372813012852213543
17철길건널목철길건널목철길건널목31030
1
2
3
4
5
# 사고 유형별 부상자 수
fig = px.bar(df_accident_type, x="사고유형", y=["사망자수", "중상자수", "경상자수", "부상신고자수"], title="사고유형별 부상자 수")
fig.show()

cs.tools.get_embed(cs.plotly.plot(fig, filename="사고 유형별 부상자 수", auto_open=False))

2. 가해 운전자 연령층별 월별 교통사고 통계

1
df_age_agg_driver_month = pd.read_csv("data/도로교통공단_가해운전자 연령층별 월별 교통사고 통계_12_31_2020.csv", encoding="cp949")
1
df_age_agg_driver_month.sample(5)
가해자연령층발생월사고건수사망자수중상자수경상자수부상신고자수
7865세이상72648568082783205
87불명424003816466
620세이하77095200677129
94불명1132204221691
220세이하3521816054790
1
2
3
4
5
# 가해자 연령별 사고 건수
fig = px.bar(df_age_agg_driver_month, x="가해자연령층", y="사고건수", title="가해자 연령별 사고 건수")
fig.show()

cs.tools.get_embed(cs.plotly.plot(fig, filename="가해자 연령별 사고 건수", auto_open=False))
1
2
3
4
5
# 월별 사고 건수
fig = px.bar(df_age_agg_driver_month, x="발생월", y="사고건수", color="가해자연령층", title="월별 사고 건수")
fig.show()

cs.tools.get_embed(cs.plotly.plot(fig, filename="월별 사고 건수", auto_open=False))
1
2
3
4
5
# 월별 사고건수
fig = px.line(df_age_agg_driver_month, x="발생월", y="사고건수", facet_col="가해자연령층", color="가해자연령층", title="가해 연령층 별 월별 사고건수")
fig.show()

cs.tools.get_embed(cs.plotly.plot(fig, filename="월별 사고건수", auto_open=False))

3. 월별 교통사고 통계

1
df_monthly = pd.read_csv("data/도로교통공단_월별 교통사고 통계_20201231.csv", encoding="cp949")
1
df_monthly
발생월사고건수사망자수중상자수경상자수부상신고자수
01169682775063186961683
12162852224463175301565
23149492394356161551312
34161862134844174591478
45181842545470195631758
56190172545614204361830
67183022405207199331829
78176162955123194101731
89181243015194190011644
910192553095554209001736
1011184382615295198321571
1112163302164381171211457
1
2
3
4
5
# 월별 사고 건수
fig = px.bar(df_monthly, x="발생월", y="사고건수", title="월별 사고 건수")
fig.show()

cs.tools.get_embed(cs.plotly.plot(fig, filename="월별 사고 건수", auto_open=False))

4. 사상자 연령층별 성별 교통사고 통계

1
df_age_gender = pd.read_csv("data/도로교통공단_사상자 연령층별 성별 교통사고 통계_20201231.csv", encoding="cp949")
1
df_age_gender
사상자연령층사상자성별사망자수중상자수경상자수부상신고자수
012세이하127354597637
112세이하123933681457
213-20세92205381081476
313-20세117844132370
421-30세2165718294863068
521-30세452266156761042
631-40세1966214282702258
731-40세25210014765884
841-50세2646597250662059
941-50세52304515677902
1051-60세4267213247312164
1151-60세124484216626944
1261-64세20026748441698
1361-64세6319564851317
1465세이상기타/불명0000
1565세이상8527380141031659
1665세이상49065887794623
17불명기타/불명1000
18불명041417
19불명021819
1
2
3
4
5
# 사상자 연령층
fig = px.bar(df_age_gender, x="사상자연령층", y=["사망자수", "중상자수", "경상자수", "부상신고자수"], color="사상자성별", title="사상자 연령층")
fig.show()

cs.tools.get_embed(cs.plotly.plot(fig, filename="사상자 연령층", auto_open=False))

2. 공통 항목을 가진 하나의 데이터 셋 생성

월별 교통사고 통계를 기본 데이터로해서, 다른 데이터들을 연관 데이터로 사용하면 좋을꺼 같다는 생각으로 4가지 데이터를 이용했다.

1
df_monthly[df_monthly["발생월"]==1]["사고건수"] == df_age_agg_driver_month[df_age_agg_driver_month["발생월"]==1]["사고건수"].sum()
1
2
0    True
Name: 사고건수, dtype: bool
1
df_accident = pd.merge(df_monthly["발생월"], df_age_agg_driver_month, how="inner", on="발생월")
1
df_accident
발생월가해자연령층사고건수사망자수중상자수경상자수부상신고자수
0120세이하452513745659
1121-30세2260266612616297
2131-40세2620467092982278
3141-50세3057419453351290
4151-60세42185812814739332
........................
911241-50세3020278753145257
921251-60세39905410784229291
931261-64세138522380143591
941265세이상2266486482361171
9512불명29803320980

96 rows × 7 columns

월별 통계에서 발생월과 가해자 통계를 합쳤다.
기존 df_monthly에도 사고 건수와 사망자수, 중상자 수 등의 데이터가 있지만 세분화 되어있지는 않기에 세분화 시킨 데이터를 가져갈 생각이다.

df_monthlydf_age_agg_dirver_month는 월별로 통계가 나와있어 데이터를 합치기에 유리했지만, df_age_genderdf_accident_type은 월별 통계가 아니라 합치지 못했다.
이들을 함께 이용하기에는 각 데이터간의 공통점을 당장에는 찾을 수가 없어, 월별 교통사고 가해자 연령층 밖에 생성할 수 없었다.

3. 종합된 데이터 셋에 대한 분석 및 시각화

1
2
3
4
5
# 월별 사고 건수
fig = px.bar(df_accident, x="발생월", y="사고건수", title="2020년 교통사고 발생 추이")
fig.show()

cs.tools.get_embed(cs.plotly.plot(fig, filename="월별 사고 건수", auto_open=False))
This post is licensed under CC BY 4.0 by the author.

깃허브 페이지에서 Plotly 그래프 출력하기

기초 SQL 정리 3

Comments powered by Disqus.