GIL's LAB

[데이터 코딩테스트 대비 #2] 교통사고 통계 본문

데이터사이언스/커리어

[데이터 코딩테스트 대비 #2] 교통사고 통계

GIL~ 2022. 12. 28. 09:24

문제

accident_stat.xlsx는 교통사고 유형별 교통사고 사고건수, 사망자수, 중상자수 등을 요약한 데이터이다. 이 데이터를 활용하여 아래에 답하시오.

accident_stat.xlsx
0.01MB

(1) 사고유형대분류가 "차대차"인 사고유형별 사망비율을 막대 그래프로 시각화하시오. 단, 사망비율은 사망자수/사고건수로 계산하며, matplotlib에서 폰트는 아래 코드를 이용하여 맑은 고딕으로 설정합니다.
from matplotlib import pyplot as plt
plt.rcParams['font.family'] = 'Malgun Gothic'
 
(2) 사고유형대분류별로 사망자수가 가장 많은 사고 유형을 출력하세요. 그 결과는 ['횡단중', '측면충돌', '공작물충돌']이어야 합니다. 

 

 

(3) 사고유형별 중상비율을 계산하고 중상비율이 50%를 넘는 데이터만 중상비율.csv로 저장합니다. 이 csv 파일은 다음과 같은 구조를 갖습니다.

 

해설

전체 코드는 아래에서 다운로드 받습니다.

예시 답안.ipynb
0.01MB

 

(1)

먼저 모듈과 데이터를 불러옵니다. 

import pandas as pd
from matplotlib import pyplot as plt
plt.rcParams['font.family'] = 'Malgun Gothic'
df = pd.read_excel("accident_stat.xlsx")

다음으로 사고유형대분류가 차대차인 데이터를 필터링하여 f_df에 저장하고, f_df에서 사망비율을 계산하여 시각화합니다. 

f_df = df.loc[df['사고유형대분류'] == '차대차']
f_df['사망비율'] = f_df['사망자수'] / f_df['사고건수']
plt.bar(range(len(f_df)), f_df['사망비율'])
plt.xticks(range(len(f_df)), f_df['사고유형'])
plt.show()

실행 결과는 다음과 같습니다.

 

(2) groupby를 이용하여 구할 수 있습니다. 단, 사망자수의 최댓값을 구하는게 아니라 사망자수의 최댓값을 갖는 사고 유형을 찾는 것이므로 idxmax를 활용합니다.

df.loc[df.groupby('사고유형대분류')['사망자수'].idxmax(), '사고유형'].tolist()
위 코드가 이해하기 어렵다면 이 내용을 참고바랍니다. 
위 코드에서 df.groupby('사고유형대분류')['사망자수'].idxmax() 는 사고유형대분류에 따른 사망자수의 최댓값을 갖는 인덱스를 다음과 같이 반환합니다.
사고유형대분류
차대사람     0
차대차      6
차량단독    12
Name: 사망자수, dtype: int64

즉, 차대사람에서는 0번째, 차대차에서는 6번째, 차량단독에서는 12번째 행에 사망자수의 최댓값이 있습니다.

이걸 df의 인덱스로 사용하면 0, 6, 12번째 행만 가져오게 되고, 추가로 사고 유형을 필터링했으므로 0, 6, 12번째 행의 사고 유형을 가져왔다고 볼 수 있습니다.

 

(3)  중상비율을 계산하고 필터링해서 저장하면 되는 문제입니다. 

df['중상비율'] = df['중상자수'] / df['사고건수']
df.loc[df['중상비율'] > 0.5].to_csv("중상비율.csv", index = False, encoding = "cp949")

한글이 포함되어 있어 encoding을 cp949로 설정했습니다.

이렇게 저장한 파일은 다음과 같습니다.

중상비율.csv
0.00MB

Comments