Traffic Accident Data Analysis
데이터 선택을 잘못한거 + 지식 부족으로 원하는 결과를 도출해내지 못했음 -> 망한 프로젝트
1. 소개
공공 데이터 포털에서 제공하는 교통 사고 관련 데이터를 분석화하고 시각화 해본 프로젝트
2. 이용 데이터
파일 이름을보면 2020년에 발생한 교통사고에 대한 자료인거 같다.
다양한 종류의 교통 사고 관련 데이터가 있지만, 위의 4개의 데이터를 이용할 예정
공공포털에서 API를 제공하고 있지만, CSV 파일이 좀 더 이용하기 편해서 파일을 다운 받아 이용
-> 이후에 API로 변경 될 수 있음
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")
|
| 사고유형대분류 | 사고유형중분류 | 사고유형 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 |
---|
0 | 차대사람 | 횡단중 | 횡단중 | 13147 | 520 | 6417 | 6617 | 517 |
---|
1 | 차대사람 | 차도통행중 | 차도통행중 | 3702 | 195 | 1423 | 2022 | 209 |
---|
2 | 차대사람 | 길가장자리구역통행중 | 길가장자리구역통행중 | 2079 | 40 | 591 | 1371 | 160 |
---|
3 | 차대사람 | 보도통행중 | 보도통행중 | 2015 | 26 | 707 | 1260 | 129 |
---|
4 | 차대사람 | 기타 | 기타 | 15278 | 288 | 5195 | 9290 | 1272 |
---|
5 | 차대차 | 정면충돌 | 정면충돌 | 7494 | 181 | 3657 | 8468 | 677 |
---|
6 | 차대차 | 측면충돌 | 측면충돌 | 74742 | 441 | 19893 | 88838 | 6945 |
---|
7 | 차대차 | 후진중충돌 | 후진중충돌 | 3253 | 4 | 297 | 4003 | 154 |
---|
8 | 차대차 | 추돌 | 추돌 | 32993 | 370 | 7924 | 48345 | 3172 |
---|
9 | 차대차 | 기타 | 기타 | 46070 | 303 | 11000 | 50973 | 4764 |
---|
10 | 차량단독 | 전도 | 전도 | 1108 | 90 | 412 | 466 | 281 |
---|
11 | 차량단독 | 전복 | 전복 | 178 | 26 | 81 | 98 | 32 |
---|
12 | 차량단독 | 공작물충돌 | 공작물충돌 | 3233 | 340 | 1376 | 1745 | 668 |
---|
13 | 차량단독 | 주/정차차량 충돌 | 주/정차차량 충돌 | 19 | 4 | 8 | 8 | 1 |
---|
14 | 차량단독 | 도로이탈 | 도로이탈 추락 | 413 | 92 | 185 | 203 | 46 |
---|
15 | 차량단독 | 도로이탈 | 도로이탈 기타 | 199 | 30 | 113 | 113 | 24 |
---|
16 | 차량단독 | 기타 | 기타 | 3728 | 130 | 1285 | 2213 | 543 |
---|
17 | 철길건널목 | 철길건널목 | 철길건널목 | 3 | 1 | 0 | 3 | 0 |
---|
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)
|
| 가해자연령층 | 발생월 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 |
---|
78 | 65세이상 | 7 | 2648 | 56 | 808 | 2783 | 205 |
---|
87 | 불명 | 4 | 240 | 0 | 38 | 164 | 66 |
---|
6 | 20세이하 | 7 | 709 | 5 | 200 | 677 | 129 |
---|
94 | 불명 | 11 | 322 | 0 | 42 | 216 | 91 |
---|
2 | 20세이하 | 3 | 521 | 8 | 160 | 547 | 90 |
---|
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")
|
| 발생월 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 |
---|
0 | 1 | 16968 | 277 | 5063 | 18696 | 1683 |
---|
1 | 2 | 16285 | 222 | 4463 | 17530 | 1565 |
---|
2 | 3 | 14949 | 239 | 4356 | 16155 | 1312 |
---|
3 | 4 | 16186 | 213 | 4844 | 17459 | 1478 |
---|
4 | 5 | 18184 | 254 | 5470 | 19563 | 1758 |
---|
5 | 6 | 19017 | 254 | 5614 | 20436 | 1830 |
---|
6 | 7 | 18302 | 240 | 5207 | 19933 | 1829 |
---|
7 | 8 | 17616 | 295 | 5123 | 19410 | 1731 |
---|
8 | 9 | 18124 | 301 | 5194 | 19001 | 1644 |
---|
9 | 10 | 19255 | 309 | 5554 | 20900 | 1736 |
---|
10 | 11 | 18438 | 261 | 5295 | 19832 | 1571 |
---|
11 | 12 | 16330 | 216 | 4381 | 17121 | 1457 |
---|
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")
|
| 사상자연령층 | 사상자성별 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 |
---|
0 | 12세이하 | 남 | 12 | 735 | 4597 | 637 |
---|
1 | 12세이하 | 여 | 12 | 393 | 3681 | 457 |
---|
2 | 13-20세 | 남 | 92 | 2053 | 8108 | 1476 |
---|
3 | 13-20세 | 여 | 11 | 784 | 4132 | 370 |
---|
4 | 21-30세 | 남 | 216 | 5718 | 29486 | 3068 |
---|
5 | 21-30세 | 여 | 45 | 2266 | 15676 | 1042 |
---|
6 | 31-40세 | 남 | 196 | 6214 | 28270 | 2258 |
---|
7 | 31-40세 | 여 | 25 | 2100 | 14765 | 884 |
---|
8 | 41-50세 | 남 | 264 | 6597 | 25066 | 2059 |
---|
9 | 41-50세 | 여 | 52 | 3045 | 15677 | 902 |
---|
10 | 51-60세 | 남 | 426 | 7213 | 24731 | 2164 |
---|
11 | 51-60세 | 여 | 124 | 4842 | 16626 | 944 |
---|
12 | 61-64세 | 남 | 200 | 2674 | 8441 | 698 |
---|
13 | 61-64세 | 여 | 63 | 1956 | 4851 | 317 |
---|
14 | 65세이상 | 기타/불명 | 0 | 0 | 0 | 0 |
---|
15 | 65세이상 | 남 | 852 | 7380 | 14103 | 1659 |
---|
16 | 65세이상 | 여 | 490 | 6588 | 7794 | 623 |
---|
17 | 불명 | 기타/불명 | 1 | 0 | 0 | 0 |
---|
18 | 불명 | 남 | 0 | 4 | 14 | 17 |
---|
19 | 불명 | 여 | 0 | 2 | 18 | 19 |
---|
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="발생월")
|
| 발생월 | 가해자연령층 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 |
---|
0 | 1 | 20세이하 | 452 | 5 | 137 | 456 | 59 |
---|
1 | 1 | 21-30세 | 2260 | 26 | 661 | 2616 | 297 |
---|
2 | 1 | 31-40세 | 2620 | 46 | 709 | 2982 | 278 |
---|
3 | 1 | 41-50세 | 3057 | 41 | 945 | 3351 | 290 |
---|
4 | 1 | 51-60세 | 4218 | 58 | 1281 | 4739 | 332 |
---|
... | ... | ... | ... | ... | ... | ... | ... |
---|
91 | 12 | 41-50세 | 3020 | 27 | 875 | 3145 | 257 |
---|
92 | 12 | 51-60세 | 3990 | 54 | 1078 | 4229 | 291 |
---|
93 | 12 | 61-64세 | 1385 | 22 | 380 | 1435 | 91 |
---|
94 | 12 | 65세이상 | 2266 | 48 | 648 | 2361 | 171 |
---|
95 | 12 | 불명 | 298 | 0 | 33 | 209 | 80 |
---|
96 rows × 7 columns
월별 통계에서 발생월과 가해자 통계를 합쳤다.
기존 df_monthly에도 사고 건수와 사망자수, 중상자 수 등의 데이터가 있지만 세분화 되어있지는 않기에 세분화 시킨 데이터를 가져갈 생각이다.
df_monthly
와 df_age_agg_dirver_month
는 월별로 통계가 나와있어 데이터를 합치기에 유리했지만, df_age_gender
와 df_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))
|
Comments powered by Disqus.