본문 바로가기

대외활동/ABC 지역주도형 청년 취업역량강화 ESG 지원산업

[ABC 220829 - 10일차] 웹기초 실습(혼자 해본 것)

반응형

교통사고 현황 데이터 분석 및 지도 시각화

서울을 기준으로 한번 실습해보자!

- 이 경우 강남이나 강북의 차이를 보도록 하자.

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