(220825) 2021년도 교통사고 현황 분석 및 시각화(팝업 수정)

이은경·2022년 8월 28일
0

2019년도 사망 교통사고 자료를 분석하고 시각화한 것과 대체로 같으나,

  1. '발생년월일시'컬럼을 '발생년월일'과 '발생시간'으로 분리하는 방법
  2. '데이터 지도 시각화'시 제목 지정 및 popup 자료 추가하는 내용

이 두 가지가 기존 시각화 절차와 달라 추가로 기록하고자 한다.

1. '발생년월일시' 컬럼 split 방법

df = pd.read_csv("파일경로", encoding='EUC-KR')
df.head()

위와 같이 '발생년월일시'가 단순 숫자의 나열이 아닌 특수 기호와 공백이 뒤섞인 형태이다.
'2021-01-01 03:00'를 '2021-01-01'과 '03:00'과 같이 '발생년월일'과 '발생시간'으로 분리시켜주기 위해서는 데이터 형태를 확인해야 한다.

df.info()

object형태이므로 str으로 지정하고 특수기호나 공백을 기준으로 split 해야한다.

아래는 변수를 두 번 지정해주는 방식이다.

date_split = df['발생년월일시'].str.split(' ')
#공백을 기준으로 '발생년월일시'의 값을 나눠라
#결과값 = 2021-01-01,03:00
time_split = date_split.str.get(1)
#결과값에서 두번째 값을 가져와라 = 03:00
time_split.str.split(':').str.get(0)
#03:00값에서 :를 기준으로 나누고 첫번째 값을 가져와라 = 03
#해당 원시자료를 확인했을 때, 분값은 모두 00으로 의미없음에 따라 버림

이후 분리한 '시'를 새로운 칼럼을 만들어 담고 데이터 형식을 숫자로 바꾼다.

df['발생시간'] = time_split.str.split(':').str.get(0) 
#발생시간에 스플릿한 값을 담아줌
df=df.astype({'발생시간':'int64'}) #int64가 df에서 사용하는 형식임




참고. 아래는 스플릿 시 변수를 한 번만 지정하는 방식이다.

date_split = df['발생년월일시'].str.split(' ') #날짜와 시간을 분리 완료
date_split.str.get(1).str.split(':').str.get(0) 
#변수 추가 설정 없이 바로 분도 바로 분리



2. 지도 시각화 중 Title 및 Popup 추가 설정

fig = px.bar(se_df, x='사망자수', y='발생지시군구', orientation='h',color='발생지시군구')
fig.update_layout(title_text="서울특별시 지역구별 사망 교통사고 현황", title_x = 0.5)
fig.show()

위와 같이 fig.update_layout을 이용해 차트의 제목을 설정하고 가운데 정렬할 수 있다.

또한 팝업의 레이아웃과 데이터를 추가로 설정할 수 있다. 팝업에 표시될 내용이 너무 긴 경우 수직으로 길게 출력되서 가시성이 떨어지므로 가로로 길게 표시되도록 한다.

-> popup = '<pre>'+ ...... +'</pre>'

✨둘째로 유형에 따라 마커를 다른 색으로 표시할 수 있다. 이때 if 구문을 활용한다.
또한 종전에 사망자수와 경상자수를 합친 합계를 표시했다면 각각을 분리해서 표현할 수 있다.✨

-> Circle마커의 크기를 결정하는 cnt를 세부적으로 설정한다. 즉, cnt = cnt1 + cnt2로 설정하고 cnt1과 cnt2를 각각 정의하는 것이다.

for n in se_df.index:
  
  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='red').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='blue').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='green').add_to(se_map) 
  
se_map

2개의 댓글

comment-user-thumbnail
2022년 8월 29일

쥬디님 타슈 웹크롤링 글 클릭하면 404 오류나요... 보고 싶은데 공개 좀 해주세요

1개의 답글