2022.08.25

지역별 교통사고 데이터 분석 및 시각화

2019년도 지역별 교통사고 데이터를 분석해보고 시각화해보자!

라이브러리 임포트

import pandas as pd
import plotly.express as px

데이터 준비하기

df = pd.read_csv("/content/도로교통공단_교통사고 정보 (1).csv", encoding = 'euc-kr')
df.head()

df.info()

데이터 파일을 잘 불러온 것을 확인할 수 있다.
그리고 전체 데이터 중에서 null값이 있는지 여부를 알 수 있다.

교통사고 데이터 전처리

# 발생년월일시 -> 뒤에 두자리(시간) 따로 컬럼으로 분리
# 1) 발생년월일시 연속적인 숫자(int) -> 자를 수 있는 문자열(string) 변경
df = df.astype({'발생년월일시':'string'})
df.info()

'발생년월일시값'이 'string'으로 변환된 것을 알 수 있다.

# 2) 발생년월일시 -> 뒤에 두자리(시간) 자르고 발생시간 이라는 컬럼에 담기
# ex) 2019010100 -> 00 시간으로 분리
df['발생시간'] = df['발생년월일시'].str[8:]
# 3) 발생시간 컬럼을 숫자 데이터타입으로 변경
df = df.astype({'발생시간':'int64'})
df.info()

'발생시간' 값이 'int64'로 바뀐 것을 볼 수 있고

# 4) 발생년월일시(string) -> 날짜 타입으로 변경
# ex) 201910100 -> 20190101(년월일) 자르고 -> YYYY-MM-DD (날짜 형태로 변경)
df['발생년월일시'] = pd.to_datetime(df['발생년월일시'].str[:8], format= '%Y-%m-%d', errors = 'raise')

'2019010100'라는 '발생년월일시' 표기값을 '2019-01-01'로 나타낼 수 있게 만들었다.

지역별/시간별 교통사고 현황보기

fig = px.scatter(df, x='발생년월일시', y='발생시간', color='발생지시도', hover_data=['발생시간'])
fig.show()

이런 식으로 지역별/시간별로 교통사고가 발생했는지 볼 수 있다.
하지만 너무 많은 정보때문에 한눈에 보기 위한 그래프가 필요하다는 생각이 든다.
그래서 만든게

시간대별 교통사고 사망자 현황

fig = px.bar(df, x= '사망자수', y= '발생시간', orientation='h')
fig.show()

시간대별로 바로 볼 수 있는데 19시에 교통사고가 가장 많았다는 것을 알 수 있다.
그리고

시도별 교통사고 사망자 현황

fig = px.bar(df, x= '사망자수', y= '발생지시도', orientation='h')
fig.show()

시도별로 그래프를 그릴수 있는데, 경기도가 가장 많은 교통사고가 발생한 지역이라는 것을 알 수 있다.
x,y값을 변경함으로 여러가지 데이터를 시각화할 수 있다.

지도를 활용하여 교통사고 현황 분석

import folium
map = folium.Map(location=[36.321665,127.378953])            
map

대전광역시의 위도와 경도를 'location'에 값을 넣어줘서 지도를 불러온다

대전광역시에 대한 데이터를 정리하기 위해

# 사망 사고 위치에 CircleMarker 표출
# CircleMarker 사이즈 사망자수 + 경상자수 설정 -> 클릭하면 popup으로 정보(사고유형) 나타나도록 구현

# CircleMarker 사이즈(radius)는 실수형(float64)로만 설정 가능
# 사망자 수, 경상자 수 정수형(int) 데이터 -> 실수형(float64) 데이터 타입으로 변경

dj_df = dj_df.astype({'사망자수' : 'float64'})
dj_df = dj_df.astype({'경상자수' : 'float64'})
dj_df.info()

dj_df를 정의하고 데이터를 전처리한다.

사망자수 + 경상자수에 따른 CircleMarker 지도에 표출하기

# for문을 사용하여 dj_df 데이터가 있을 때까지 반복적으로 CircleMarker를 지도에 add 시키는 작업 -> 74번
for i in dj_df.index:
    # CircleMarker 사이즈 계산
    cnt = dj_df['사망자수'][i] + dj_df['경상자수'][i]
    folium.CircleMarker([dj_df['위도'][i],dj_df['경도'][i]], radius=cnt*10, popup=dj_df['사고유형'][i],
                          color='#3186cc',fill_color='#3186cc').add_to(map)
map

교통사고가 발생한 위치를 이렇게 CircleMarker를 이용하여 표시하여 지도에서 볼 수 있도록 한다.

-끝!-

profile
Do (Awe)Something!

1개의 댓글

comment-user-thumbnail
2022년 8월 29일

영웅씨.. 요즘 기술 블로그 글이 뜸하네요.... 빨리 올려줘요.. 현기증나요

답글 달기