import pandas as pd
import plotly.express as px
df = pd.read_csv('/content/도로교통공단_교통사고 정보.csv', encoding='euc-kr')
# 발생년월일시 -> 시간 따로 컬럼 분리(뒤의 두자리)
# 1) 시간만 자르기 위해 문자열로 형변환
df = df.astype({'발생년월일시':'string'})
# 2) 발생시간이라는 컬럼에 담기(ex. 2019010100 -> 00)
df['발생시간'] = df['발생년월일시'].str[8:] # string 슬라이싱해서 발생시간에 담음
# 3) 다시 형변환(int로)
df = df.astype({'발생시간':'int64'})
# 4) 발생년월일시(string) -> 날짜타입으로 변경
# ex) 20190101 -> 20190101(년월일) 자르고 -> YYYY-MM-DD인 날짜 형태로 변경
df['발생년월일시'] = pd.to_datetime(df['발생년월일시'].str[:8], format='%Y-%m-%d', errors='raise')
fig = px.scatter(df, x='발생년월일시', y = '발생시간', color = '발생지시도', size = '사망자수', hover_data=['발생시간'])
fig.show()
🔼 결과
이렇게 scatter 그래프를 통해 전체적인 현황을 놓고 보면 특정 시간대나 어느 날짜, 지역에 상관없이 사고가 발생하고 있다는 것을 알 수 있다.
fig = px.bar(df, x='사망자수', y='발생시간', orientation='h')
fig.show()
🔼 결과
19시에 가장 사고가 많이 일어나고 있다는 것을 알 수 있다.
❓ 세로로 하게 되면
🔼 이런식으로 그려진다. 가로로 하는 것이 가독성이 더 좋음.
# 지역별
fig = px.bar(df, x='사망자수', y='발생지시도', orientation='h')
fig.show()
🔼 경기도가 가장 사망자 수가 많다.
# 요일별
fig = px.bar(df, x='사망자수', y='요일', orienta![](https://velog.velcdn.com/images/may_o5/post/c7c26084-ffab-4631-9575-2390287e481c/image.png)
tion='h')
fig.show()
🔼 월요일에 사망사고가 가장 많이 발생하고 있다는 것을 알 수 있다.
# 사고유형별
fig = px.bar(df, x='사망자수', y='사고유형별', orientation='h')
fig.show()
🔼 기타가 가장 많고 횡단중 사고자가 그 다음으로 많다.
(기타사유가 가장 많은데 기타를 좀 세부분류 해주셨다면 좋았을텐데 좀,, 불편할뻔..했는데 대분류, 중분류, 가해자당사자종별 등으로 분류를 해주시긴해서 마음이 좀 덜 불편해졌다)
import folium
map = folium.Map(location=[36.321665,127.378953])
dj_df = dj_df.astype({'사망자수':'float64'})
dj_df = dj_df.astype({'부상자수':'float64'})
# for문을 사용하여 dj_df 데이터가 있을 때까지 반복적으로 CircleMarker를 지도에 add 시키는 작업 -> 74번
for n in dj_df.index:
# CircleMarker 사이즈 계산
cnt = dj_df['사망자수'][n] + dj_df['부상자수'][n]
folium.CircleMarker([dj_df['위도'][n],dj_df['경도'][n]], radius=cnt*10, popup=dj_df['사고유형'][n],
color='#3186cc',fill_color='#3186cc').add_to(map)
map
🔼 결과
(2021년 데이터 또한 분석하여 비교해보았지만 첨부는 하지 않겠습니다..)
for n in gb_df.index:
if gb_df['사고유형'][n]=='기타':
color = 'red'
elif gb_df['사고유형'][n]=='횡단중':
color = 'blue'
else:
color = 'green'
# CircleMarker 사이즈 계산
cnt = gb_df['사망자수'][n] + gb_df['부상자수'][n]
folium.CircleMarker([gb_df['위도'][n],gb_df['경도'][n]], radius=cnt*10, popup=gb_df['사고유형'][n],
color=color, fill_color=color).add_to(gb_map)
🔼 결과
(경상북도의 데이터만 활용)