반응형
교통사고 현황 데이터 분석 및 지도 시각화
서울을 기준으로 한번 실습해보자!
- 이 경우 강남이나 강북의 차이를 보도록 하자.
1. 데이터 분석, 시각화
2. 지도 시각화
3. 느낀점
** 데이터 전처리 과정은 이전 글에서 확인 **
1) 데이터 준비하기
su_df = df[df['발생지시도'] == '서울']
su_df.info()
2) 데이터 확인
su_df.head()
3) 발생시간별 사망자수 현황
fig = px.bar(su_df,x='사망자수', y='발생시간', orientation='h')
fig.show()
4) 요일별 사망자수 현황
fig = px.bar(su_df,x='사망자수', y='요일', orientation='h',color='주야')
fig.show()
5) 발생지별 사망자수 현황
fig = px.bar(su_df,x='발생지시군구', y='사망자수')
fig.show()
6) 사고유형별 사망자수 현황
fig = px.bar(dj_df,x='사망자수', y='사고유형', orientation='h', color='주야')
fig.show()
7) 서울 지도 그리기
import folium
# 서울 시청을 기준으로 지도를 그려보자.
su_map = folium.Map(location=[37.5666805,126.9784147]) # location = 중심좌ㅛ -> [위도, 경도]
su_map
8) 데이터 전처리
# circlemarker를 그리기위한 데이터 전처리
# 반지름 계싼을 위해 float로 변환
su_df = su_df.astype({'사망자수' : 'float'})
su_df = su_df.astype({'부상자수' : 'float'})
su_df.info()
9) 지도에 CIrcleMarker를 표시해보자
- 사망자수 + 부상자수를 반지름 사이즈로 갖되, 사고유형이 횡단중에 속한다면 빨간 원으로 채워보자
su_map = folium.Map(location=[37.5666805,126.9784147])
# dj_df 데이터가 있을 때 까지 반복적으로 CircleMarker를 지도에 add 시키는 작업(지도에 올리는 작업) -> 74번 실행
for n in su_df.index :
cnt = su_df['사망자수'][n] + su_df['부상자수'][n] # circlemarker의 반지름 크기를 고정
# folium.CircleMarker([위도, 경도], 반지름사이즈, 팝업, 색, 채울색).add_to(어느 지도에 올릴건지)
if su_df['사고유형'][n] == '횡단중' :
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'red', fill_color='red').add_to(su_map)
else:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'blue', fill_color='blue').add_to(su_map)
su_map
10) 강북과 강남으로 나눠서 그려보자.
- 우선, 구가 너무 많아서 리스트로 강북만 나눠서 넣어준 후 리스트 요소와 비교해서 강북이면 빨강, 강남이면 파랑으로 칠해보자
- 일단, 발생지시군구에 어떤 요소들이 있는지 확인해보자.
su_df['발생지시군구'].unique()
# 발생지시군구별로 강북이면 red, 강남이면 blue로 그려보자.
su_map = folium.Map(location=[37.5666805,126.9784147])
# dj_df 데이터가 있을 때 까지 반복적으로 CircleMarker를 지도에 add 시키는 작업(지도에 올리는 작업) -> 74번 실행
for n in su_df.index :
cnt = su_df['사망자수'][n] + su_df['부상자수'][n] # circlemarker의 반지름 크기를 고정
kb = ['강북구', '마포구', '서대문구', '은평구', '중구', '종로구', '용산구', '성동구', '광진구', '중랑구', '강북구', '도봉구', '동대문구', '노원구', '성북구']
if su_df['발생지시군구'][n] in kb:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'red', fill_color='red').add_to(su_map)
else:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'blue', fill_color='blue').add_to(su_map)
su_map
11) 사고유형이 횡단중인 것만 분류
# 사고 유형별로 횡단중이면 red, 그 외는 blue로 그려보자.
su_map = folium.Map(location=[37.5666805,126.9784147])
# dj_df 데이터가 있을 때 까지 반복적으로 CircleMarker를 지도에 add 시키는 작업(지도에 올리는 작업) -> 74번 실행
for n in su_df.index :
cnt = su_df['사망자수'][n] + su_df['부상자수'][n] # circlemarker의 반지름 크기를 고정
if su_df['사고유형'][n] == '횡단중':
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'red', fill_color='red').add_to(su_map)
else:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'blue', fill_color='blue').add_to(su_map)
su_map
12) 사고유형별, 강북/강남을 나눠서 구분해보자.
# 발생지시군구별로 강북이면 red, 강남이면 blue로 그려보자.
su_map = folium.Map(location=[37.5666805,126.9784147])
# dj_df 데이터가 있을 때 까지 반복적으로 CircleMarker를 지도에 add 시키는 작업(지도에 올리는 작업) -> 74번 실행
for n in su_df.index :
cnt = su_df['사망자수'][n] + su_df['부상자수'][n] # circlemarker의 반지름 크기를 고정
kb = ['강북구', '마포구', '서대문구', '은평구', '중구', '종로구', '용산구', '성동구', '광진구', '중랑구', '강북구', '도봉구', '동대문구', '노원구', '성북구']
if su_df['사고유형'][n] == '추돌' :
if su_df['발생지시군구'][n] in kb:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'red', fill_color='red').add_to(su_map)
else:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'blue', fill_color='red').add_to(su_map)
elif su_df['사고유형'][n] == '측면충돌' :
if su_df['발생지시군구'][n] in kb:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'red', fill_color='green').add_to(su_map)
else:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'blue', fill_color='green').add_to(su_map)
elif su_df['사고유형'][n] == '정면충돌' :
if su_df['발생지시군구'][n] in kb:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'red', fill_color='yellow').add_to(su_map)
else:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'blue', fill_color='yellow').add_to(su_map)
elif su_df['사고유형'][n] == '공작물충돌' :
if su_df['발생지시군구'][n] in kb:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'red', fill_color='blue').add_to(su_map)
else:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'blue', fill_color='blue').add_to(su_map)
else:
pass
su_map
12) 사고유형이 횡단중인 경우에만 강북/강남 나눠서 분류
# 발생지시군구별로 강북이면 red, 강남이면 blue로 그려보자.
su_map = folium.Map(location=[37.5666805,126.9784147])
# dj_df 데이터가 있을 때 까지 반복적으로 CircleMarker를 지도에 add 시키는 작업(지도에 올리는 작업) -> 74번 실행
for n in su_df.index :
cnt = su_df['사망자수'][n] + su_df['부상자수'][n] # circlemarker의 반지름 크기를 고정
kb = ['강북구', '마포구', '서대문구', '은평구', '중구', '종로구', '용산구', '성동구', '광진구', '중랑구', '강북구', '도봉구', '동대문구', '노원구', '성북구']
if su_df['사고유형'][n] == '횡단중' :
if su_df['발생지시군구'][n] in kb:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'red', fill_color='red').add_to(su_map)
else:
folium.CircleMarker([ su_df['위도'][n], su_df['경도'][n]], radius = cnt*10, popup = su_df['사고유형'][n],
color = 'blue', fill_color='blue').add_to(su_map)
else:
pass
su_map
LIST
'대외활동 > ABC 지역주도형 청년 취업역량강화 ESG 지원산업' 카테고리의 다른 글
[ABC 220831 - 11일차] 웹 크롤링 (0) | 2022.08.31 |
---|---|
[ABC 220830 - 10일차] HTML 기초 (0) | 2022.08.31 |
[ABC 220829- 10일차] 웹 기초 (0) | 2022.08.30 |
[220824 ABC - 7일차] PYTHON 라이브러리 (0) | 2022.08.25 |
[220824 ABC - 7일차] PYTHON 기초 (0) | 2022.08.25 |