2019년도 사망 교통사고 자료를 분석하고 시각화한 것과 대체로 같으나,
이 두 가지가 기존 시각화 절차와 달라 추가로 기록하고자 한다.
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)
#변수 추가 설정 없이 바로 분도 바로 분리
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
쥬디님 타슈 웹크롤링 글 클릭하면 404 오류나요... 보고 싶은데 공개 좀 해주세요