🌊 ꡐ톡사고 정보 μ‹œκ°ν™”πŸŒŠ

parkeuΒ·2022λ…„ 8μ›” 25일
0

ABCλΆ€νŠΈμΊ ν”„

λͺ©λ‘ 보기
13/55
post-thumbnail

🐼 μ€€λΉ„ 🐼

  • λ„λ‘œκ΅ν†΅κ³΅λ‹¨_ꡐ톡사고 정보.csv파일 이용
import pandas as pd
import plotly.express as px

df = pd.read_csv('/content/λ„λ‘œκ΅ν†΅κ³΅λ‹¨_ꡐ톡사고 정보.csv', encoding='euc-kr')

βž• df.info() -> 정보확인
βž• plotly -> 데이터 μ‹œκ°ν™” 툴 https://plotly.com/


😒 2019λ…„ 지역별 ꡐ톡사고

πŸ›Ά 데이터 μ „μ²˜λ¦¬

# λ°œμƒλ…„μ›”μΌμ‹œ -> 뒀에 λ‘μžλ¦¬(μ‹œκ°„) λ”°λ‘œ 컬럼으둜 뢄리
# 1) λ°œμƒλ…„μ›”μΌμ‹œ : 연속적인 숫자(int)μ΄λ―€λ‘œ 자λ₯Ό 수 μžˆλŠ” λ¬Έμžμ—΄(string)둜 λ³€κ²½
df = df.astype({'λ°œμƒλ…„μ›”μΌμ‹œ':'string'})

# 2) λ°œμƒλ…„μ›”μΌμ‹œ -> 뒀에 λ‘μžλ¦¬(μ‹œκ°„) 자λ₯΄κ³  λ°œμƒμ‹œκ°„ μ΄λΌλŠ” μ»¬λŸΌμ— λ‹΄κΈ°
# ex) 2019010100 -> 00 뢄리
df['λ°œμƒμ‹œκ°„'] = df['λ°œμƒλ…„μ›”μΌμ‹œ'].str[8:]

# 3) λ°œμƒμ‹œκ°„ 컬럼 숫자 λ°μ΄ν„°νƒ€μž…μœΌλ‘œ λ³€κ²½ -> str은 κ·Έλž˜ν”„λ₯Ό κ·Έλ¦΄μˆ˜μ—†μœΌλ‹ˆκΉŒ !
df = df.astype({'λ°œμƒμ‹œκ°„':'int64'})

# 4) λ°œμƒλ…„μ›”μΌμ‹œ(string) -> λ‚ μ§œ νƒ€μž…μœΌλ‘œ λ³€κ²½
# ex) 2019010100 -> 20190101(년월일) 자λ₯΄κ³  -> YYYY-MM-DD(λ‚ μ§œ ν˜•νƒœλ‘œ λ³€κ²½)
df['λ°œμƒλ…„μ›”μΌμ‹œ'] = pd.to_datetime(df['λ°œμƒλ…„μ›”μΌμ‹œ'].str[:8], format='%Y-%m-%d', errors='raise')

βž• errors='raise' : μ—λŸ¬λ“€μ΄ λ°œμƒν•˜λ©΄ μ•Œλ €μ£Όκ³  멈좰라 / 'ignore'이면 λ¬΄μ‹œν•΄λΌ


🚀 μ‹œκ°ν™”

πŸ—“οΈ λ‚ μ§œλ³„/μ‹œκ°„λ³„ ꡐ톡사고 ν˜„ν™©λ³΄κΈ°

fig = px.scatter(df, x='λ°œμƒλ…„μ›”μΌμ‹œ', y='λ°œμƒμ‹œκ°„', color='λ°œμƒμ§€μ‹œλ„', hover_data=['λ°œμƒμ‹œκ°„'])
fig.show()

βž• fig = px.scatter(df, x='λ°œμƒλ…„μ›”μΌμ‹œ', y='λ°œμƒμ‹œκ°„', color='λ°œμƒμ§€μ‹œλ„', size='μ‚¬λ§μžμˆ˜', hover_data=['λ°œμƒμ‹œκ°„'])
size ='μ‚¬λ§μžμˆ˜' λ₯Ό μΆ”κ°€ν•˜μ—¬ λ²„λΈ”μ°¨νŠΈ λͺ¨μ–‘μœΌλ‘œ 그릴 수 μžˆλ‹€.
!


πŸ• μ‹œκ°„λŒ€λ³„ ꡐ톡사고 μ‚¬λ§μž ν˜„ν™©

fig = px.bar(df, x='μ‚¬λ§μžμˆ˜', y='λ°œμƒμ‹œκ°„', orientation='h')
fig.show()


πŸ‘€ 19μ‹œμ— κ°€μž₯ μ‚¬λ§μžκ°€ λ§ŽμŒμ„ μ•Œ 수 있음

# μ„Έλ‘œμ°¨νŠΈ
fig = px.bar(df, x='λ°œμƒμ‹œκ°„', y='μ‚¬λ§μžμˆ˜')
fig.show()

πŸ™οΈ μ‹œ, 도 별 ꡐ톡사고 μ‚¬λ§μž ν˜„ν™©

fig = px.bar(df, x='μ‚¬λ§μžμˆ˜', y='λ°œμƒμ§€μ‹œλ„', orientation='h')
fig.show()


πŸ“… μš”μΌλ³„, μ‚¬κ³ μœ ν˜•λ³„ ꡐ톡사고 ν˜„ν™©

  • μš”μΌλ³„
  • μ‚¬κ³ μœ ν˜•λ³„

πŸ“š 2019 λŒ€μ „ ꡐ톡사고 λ°œμƒ 데이터뢄석

πŸ• μ‹œκ°„λŒ€λ³„ ꡐ톡사고 μ‚¬λ§μžν˜„ν™©

# 데이터 μ€€λΉ„
dj_df = df[df['λ°œμƒμ§€μ‹œλ„'] =='λŒ€μ „']

# ꡐ톡사고 λ°œμƒμ‹œκ°„λ³„ μ‚¬λ§μžν˜„ν™©
fig = px.bar(dj_df, x='μ‚¬λ§μžμˆ˜', y='λ°œμƒμ‹œκ°„', orientation='h')
fig.show() 

βž• μ„Έλ‘œλͺ¨μ–‘

fig = px.bar(dj_df, x='λ°œμƒμ‹œκ°„', y='μ‚¬λ§μžμˆ˜')
fig.show()

🧭 ꡐ톡사고 지역ꡬ별 μ‚¬λ§μžν˜„ν™©

fig = px.bar(dj_df, x='λ°œμƒμ§€μ‹œκ΅°κ΅¬', y='μ‚¬λ§μžμˆ˜')
fig.show()

πŸ“… μš”μΌλ³„/μ‚¬κ³ μœ ν˜•λ³„ μ‚¬λ§μžν˜„ν™©

fig = px.bar(dj_df, x='μ‚¬λ§μžμˆ˜', y='μš”μΌ', orientation='h')
fig.show()

fig = px.bar(dj_df, x='μ‚¬λ§μžμˆ˜', y='μ‚¬κ³ μœ ν˜•', orientation='h')
fig.show()


πŸ—ΊοΈ μ§€λ„ν™œμš© ꡐ톡사고 ν˜„ν™© 뢄석

import folium
map = folium.Map(location=[36.321665,127.378953]) # λŒ€μ „μ‹œμ²­μ˜ μœ„λ„, 경도 κ°’

# 사망사고 μœ„μΉ˜μ— CircleMarkerν‘œμΆœ
# CircleMarker size μ‚¬λ§μžμˆ˜+κ²½μƒμžμˆ˜ μ„€μ • -> ν΄λ¦­ν•˜λ©΄ νŒμ—…μœΌλ‘œ 정보(μ‚¬κ³ μœ ν˜•) λ‚˜νƒ€λ‚˜λ„λ‘ κ΅¬ν˜„

# CircleMarker size(radius)λŠ” μ‹€μˆ˜ν˜•(float64)둜만 μ„€μ •κ°€λŠ₯
# μ‚¬λ§μžμˆ˜, κ²½μƒμžμˆ˜ int -> float64 데이터 νƒ€μž… λ³€κ²½

dj_df = dj_df.astype({'μ‚¬λ§μžμˆ˜' :'float64'})
dj_df = dj_df.astype({'κ²½μƒμžμˆ˜' :'float64'})

βž• dj_df.info() κ²°κ³Ό

πŸ” μ‚¬λ§μžμˆ˜+κ²½μƒμžμˆ˜ CircleMarker

# 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.save('2019_λŒ€μ „κ΅ν†΅μ‚¬κ³ ν˜„ν™©.html') : html파일둜 μ €μž₯


😒 2021λ…„ 지역별 ꡐ톡사고

🐼 μ€€λΉ„

import pandas as pd
import plotly.express as px

df = pd.read_csv('/content/λ„λ‘œκ΅ν†΅κ³΅λ‹¨_사망 ꡐ톡사고 정보_20211231.csv', encoding='euc-kr')
df.head()

πŸ›Ά 데이터 μ „μ²˜λ¦¬

# μ‹œκ°„λ§Œ 남기기
# 2021-01-01 03:00μ—μ„œ 03만 남기기
date_split = df['λ°œμƒλ…„μ›”μΌμ‹œ'].str.split(' ') # λ‚ μ§œμ™€ μ‹œκ°„:λΆ„ 뢄리
time_split = date_split.str.get(1) # μ‹œκ°„:λΆ„λ§Œ 선택
df['λ°œμƒμ‹œκ°„'] = time_split.str.split(':').str.get(0) # μ‹œκ°„λ§Œ 선택
df = df.astype({'λ°œμƒμ‹œκ°„':'int64'})

βž• df.info()

# λ°œμƒλ…„μ›”μΌ μΆ”κ°€
df['λ°œμƒλ…„μ›”μΌ'] = pd.to_datetime(date_split.str.get(0), format='%Y-%m-%d', errors='raise')

βž• df.info()

지역별/μ‹œκ°„λ³„ ꡐ톡사고 ν˜„ν™©

fig = px.scatter(df, x='λ°œμƒλ…„μ›”μΌμ‹œ', y='λ°œμƒμ‹œκ°„', color='λ°œμƒμ§€μ‹œλ„', size='μ‚¬λ§μžμˆ˜', hover_data=['λ°œμƒμ‹œκ°„'])
fig.show()

fig = px.scatter(df, x='λ°œμƒλ…„μ›”μΌ', y='λ°œμƒμ‹œκ°„', color='λ°œμƒμ§€μ‹œλ„', size='μ‚¬λ§μžμˆ˜', hover_data=['λ°œμƒμ‹œκ°„'])
fig.show()

μ‹œκ°„λŒ€λ³„/μ‹œ,도별 ꡐ톡사고 ν˜„ν™©

fig = px.bar(df, x='μ‚¬λ§μžμˆ˜', y='λ°œμƒμ‹œκ°„', orientation='h')
fig.show()

fig = px.bar(df, x='λ°œμƒμ‹œκ°„', y='λ°œμƒμ§€μ‹œλ„', orientation='h')
fig.show()

주간야간별/μ‚¬κ³ μœ ν˜•λ³„ ꡐ톡사고 ν˜„ν™©

fig = px.bar(df, x='μ‚¬λ§μžμˆ˜', y='μ£Όμ•Ό', orientation='h')
fig.show()

fig = px.bar(df, x='μ‚¬λ§μžμˆ˜', y='μ‚¬κ³ μœ ν˜•', orientation='h')
fig.show()

πŸ“š 2021 λŒ€μ „ ꡐ톡사고 λ°œμƒ 데이터뢄석

데이터쀀비

# 데이터 μ€€λΉ„
dj_df = df[df['λ°œμƒμ§€μ‹œλ„'] =='λŒ€μ „']

λ°œμƒμ‹œκ°„λ³„

fig = px.bar(dj_df, x='μ‚¬λ§μžμˆ˜', y='λ°œμƒμ‹œκ°„', orientation='h')
fig.show()

지역ꡬ별

fig = px.bar(dj_df, x='λ°œμƒμ§€μ‹œκ΅°κ΅¬', y='μ‚¬λ§μžμˆ˜')
fig.show()

πŸ—ΊοΈ μ‚¬λ§μžμˆ˜+λΆ€μƒμžμˆ˜μ— λ”°λ₯Έ CircleMarker ν‘œκΈ°ν•œ 지도

import folium
dj_map = folium.Map(location=[36.321665,127.378953]) # λŒ€μ „μ‹œμ²­μ˜ μœ„λ„, 경도 κ°’

# 사망사고 μœ„μΉ˜μ— CircleMarkerν‘œμΆœ
# CircleMarker size μ‚¬λ§μžμˆ˜+λΆ€μƒμžμˆ˜ μ„€μ • -> ν΄λ¦­ν•˜λ©΄ νŒμ—…μœΌλ‘œ 정보(μ‚¬κ³ μœ ν˜•) λ‚˜νƒ€λ‚˜λ„λ‘ κ΅¬ν˜„

# CircleMarker size(radius)λŠ” μ‹€μˆ˜ν˜•(float64)둜만 μ„€μ •κ°€λŠ₯
# μ‚¬λ§μžμˆ˜, λΆ€μƒμžμˆ˜ int -> float64 데이터 νƒ€μž… λ³€κ²½

dj_df = dj_df.astype({'μ‚¬λ§μžμˆ˜' :'float64'})
dj_df = dj_df.astype({'λΆ€μƒμžμˆ˜' :'float64'})
dj_df.info()

# 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(dj_map)
dj_map


βž• μ €μž₯ : map.save('2021_λŒ€μ „κ΅ν†΅μ‚¬κ³ ν˜„ν™©.html')


🐼 쑰별 ν™œλ™πŸΌ

1) μ‹œκ°„λ³„ μ‚¬λ§μž ν˜„ν™© -> colorλ₯Ό μ£Ό,μ•Όλ‘œ ν‘œμ‹œ
2) 지역ꡬ별 μ‚¬λ§μž ν˜„ν™©
3) 지도λ₯Ό ν™œμš©ν•œ ꡐ톡사고 ν˜„ν™©λΆ„μ„

  • 사망사고 μœ„μΉ˜μ— CircleMarker ν‘œμΆœ
  • color :
    μ‚¬κ³ μœ ν˜• = '기타' : 빨간색
    μ‚¬κ³ μœ ν˜• = 'νš‘λ‹¨μ€‘' : νŒŒλž€μƒ‰
    κ·Έ μ™Έ μ‚¬κ³ μœ ν˜• : μ΄ˆλ‘μƒ‰
    popup μ‚¬κ³ μœ ν˜• ν‘œμ‹œ

데이터 μ „μ²˜λ¦¬

import pandas as pd
import plotly.express as px

df = pd.read_csv('/content/λ„λ‘œκ΅ν†΅κ³΅λ‹¨_사망 ꡐ톡사고 정보_20211231.csv', encoding='euc-kr')
df.head()

# μ‹œκ°„λ§Œ 남기기
# 2021-01-01 03:00μ—μ„œ 03만 남기기
date_split = df['λ°œμƒλ…„μ›”μΌμ‹œ'].str.split(' ') # λ‚ μ§œμ™€ μ‹œκ°„:λΆ„ 뢄리
time_split = date_split.str.get(1) # μ‹œκ°„:λΆ„λ§Œ 선택
df['λ°œμƒμ‹œκ°„'] = time_split.str.split(':').str.get(0) # μ‹œκ°„λ§Œ 선택
df = df.astype({'λ°œμƒμ‹œκ°„':'int64'})
df.info()

df['λ°œμƒλ…„μ›”μΌ'] = pd.to_datetime(date_split.str.get(0), format='%Y-%m-%d', errors='raise')
df.head()

# ν•„μš”μ—†λŠ” 컬럼 μ‚­μ œ
del df['λ°œμƒλ…„μ›”μΌμ‹œ']
df.head()

se_df = df[df['λ°œμƒμ§€μ‹œλ„'] =='μ„œμšΈ']
se_df.info()

1) μ‹œκ°„λ³„ μ‚¬λ§μž ν˜„ν™©

fig = px.bar(se_df, x='μ‚¬λ§μžμˆ˜', y='λ°œμƒμ‹œκ°„', orientation='h', color="μ£Όμ•Ό")
fig.show()

2) 지역ꡬ별 μ‚¬λ§μž ν˜„ν™©

fig = px.bar(se_df, x='λ°œμƒμ§€μ‹œκ΅°κ΅¬', y='μ‚¬λ§μžμˆ˜')
fig.show()

3) 지도λ₯Ό ν™œμš©ν•œ ꡐ톡사고 ν˜„ν™©λΆ„μ„

# for문을 μ‚¬μš©ν•˜μ—¬ dj_df 데이터가 μžˆμ„ λ•ŒκΉŒμ§€ 반볡적으둜 CircleMarker 지도에 add μ‹œν‚€λŠ” μž‘μ—… -> 74번
for n in se_df.index:
  # CircleMarker μ‚¬μ΄μ¦ˆ 계산
  cnt1 = se_df['μ‚¬λ§μžμˆ˜'][n]
  cnt2 = se_df['λΆ€μƒμžμˆ˜'][n]
  cnt = cnt1+cnt2
  if se_df['μ‚¬κ³ μœ ν˜•'][n] == '기타':
    folium.CircleMarker([se_df['μœ„λ„'][n],se_df['경도'][n]], radius =cnt*10, popup='<pre>'+se_df['μ‚¬κ³ μœ ν˜•'][n]+', μ‚¬λ§μž '+str(int(cnt1))+'λͺ…, '+'λΆ€μƒμž '+ str(int(cnt2))+'λͺ…'+'</pre>',
                        color='red', fill_color='E12727').add_to(se_map)
  elif se_df['μ‚¬κ³ μœ ν˜•'][n] == 'νš‘λ‹¨μ€‘':
    folium.CircleMarker([se_df['μœ„λ„'][n],se_df['경도'][n]], radius =cnt*10, popup='<pre>'+se_df['μ‚¬κ³ μœ ν˜•'][n]+', μ‚¬λ§μž '+str(int(cnt1))+'λͺ…, '+'λΆ€μƒμž '+ str(int(cnt2))+'λͺ…'+'</pre>',
                        color='blue', fill_color='#3186cc').add_to(se_map)
  else:
    folium.CircleMarker([se_df['μœ„λ„'][n],se_df['경도'][n]], radius =cnt*10, popup='<pre>'+se_df['μ‚¬κ³ μœ ν˜•'][n]+', μ‚¬λ§μž '+str(int(cnt1))+'λͺ…, '+'λΆ€μƒμž '+ str(int(cnt2))+'λͺ…'+'</pre>',
                        color='green', fill_color='#cfffbb').add_to(se_map)
se_map

βž• μ €μž₯ : map.save('2021_μ„œμšΈνŠΉλ³„μ‹œκ΅ν†΅μ‚¬κ³ ν˜„ν™©.html')
βž• popup을 κ°€λ‘œ λͺ¨μ–‘μœΌλ‘œ λ°°μΉ˜ν•˜κΈ° μœ„ν•œ 방법


🚩 μ†Œκ° 🚩

ν•œκ°œμ˜ λ°μ΄ν„°νŒŒμΌμ„ 가지고 λ‹€μ–‘ν•œ κ·Έλž˜ν”„λ₯Ό 그릴 수 μžˆλ‹€λŠ” 점이 ν₯λ―Έλ‘œμ› λ‹€. μ˜€λŠ˜λ„ μ „μ²˜λ¦¬ν•˜λŠ” 과정이 μ•½κ°„ ^^.. μ–΄λ €μ› λ‹€. splitκ³Ό get을 μ–΄λŠλ•Œ μ¨μ•Όν•˜λŠ”μ§€ 계속 ν—·κ°ˆλ Έμ—ˆλŠ”λ° 였늘 μ „μ²˜λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ 쀑간에 계속 κ²°κ³Όλ₯Ό λ„μ›Œκ°€λ©΄μ„œ ν™•μΈν•΄λ³΄λ‹ˆκΉŒ 이해할 수 μžˆμ—ˆλ‹€. μ„œμšΈνŠΉλ³„μ‹œ ꡐ톡사고 ν˜„ν™©μ„ κ΅μˆ˜λ‹˜ 도움없이 ν•΄λ΄€λŠ”λ° κ²°κ³Όκ°€ 잘 λ‚˜μ™€μ„œ μž¬λ―Έμžˆμ—ˆλ‹€. 성격이 λ°”λ‘œλ°”λ‘œ 해결이 μ•ˆλ˜λ©΄ 닡닡함을 느끼고 포기각을 μž‘λŠ” νŽΈμ΄κΈ΄ν•œλ° κ³ μ³μ•Όκ² μ–΄μš© .. .γ…Žγ…Ž.....

profile
배고파용.

0개의 λŒ“κΈ€