2022-08-25

jm·2022년 8월 25일
0

TIL

목록 보기
12/22
post-thumbnail

📌 plotly를 이용한 데이터 시각화



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)


🔼 결과
(경상북도의 데이터만 활용)

0개의 댓글