데이터분석 직무에 코딩테스트 대비를 위한 기록
출처 : GIL`s LAB
1. 막대 그래프로 시각화
2. 가장 많은 유형 출력
3. 중상비율 계산
In [1]:
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
fonts-nanum is already the newest version (20200506-1).
0 upgraded, 0 newly installed, 0 to remove and 45 not upgraded.
/usr/share/fonts: caching, new cache contents: 0 fonts, 1 dirs
/usr/share/fonts/truetype: caching, new cache contents: 0 fonts, 3 dirs
/usr/share/fonts/truetype/humor-sans: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/liberation: caching, new cache contents: 16 fonts, 0 dirs
/usr/share/fonts/truetype/nanum: caching, new cache contents: 12 fonts, 0 dirs
/usr/local/share/fonts: caching, new cache contents: 0 fonts, 0 dirs
/root/.local/share/fonts: skipping, no such directory
/root/.fonts: skipping, no such directory
/usr/share/fonts/truetype: skipping, looped directory detected
/usr/share/fonts/truetype/humor-sans: skipping, looped directory detected
/usr/share/fonts/truetype/liberation: skipping, looped directory detected
/usr/share/fonts/truetype/nanum: skipping, looped directory detected
/var/cache/fontconfig: cleaning cache directory
/root/.cache/fontconfig: not cleaning non-existent cache directory
/root/.fontconfig: not cleaning non-existent cache directory
fc-cache: succeeded
In [2]:
from google.colab import drive
drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
In [3]:
import pandas as pd
df = pd.read_excel('/content/drive/MyDrive/accident_stat.xlsx')
df.head()
Out[3]:
| 사고유형대분류 | 사고유형중분류 | 사고유형 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 차대사람 | 횡단중 | 횡단중 | 12767 | 445 | 5999 | 6664 | 458 |
| 1 | 차대사람 | 차도통행중 | 차도통행중 | 3628 | 146 | 1438 | 2007 | 183 |
| 2 | 차대사람 | 길가장자리구역통행중 | 길가장자리구역통행중 | 1973 | 33 | 563 | 1330 | 121 |
| 3 | 차대사람 | 보도통행중 | 보도통행중 | 2226 | 21 | 745 | 1455 | 131 |
| 4 | 차대사람 | 기타 | 기타 | 14675 | 333 | 4887 | 9139 | 1062 |
In [4]:
df.사고유형대분류.value_counts()
Out[4]:
사고유형대분류
차량단독 7
차대사람 5
차대차 5
Name: count, dtype: int64
1번¶
In [30]:
df['사망비율'] = df.사망자수/df.사고건수
In [31]:
df[df['사고유형대분류'] == '차대차']
Out[31]:
| 사고유형대분류 | 사고유형중분류 | 사고유형 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 | 사망비율 | |
|---|---|---|---|---|---|---|---|---|---|
| 5 | 차대차 | 정면충돌 | 정면충돌 | 7892 | 205 | 3539 | 8837 | 588 | 0.025976 |
| 6 | 차대차 | 측면충돌 | 측면충돌 | 71687 | 404 | 17756 | 84667 | 5781 | 0.005636 |
| 7 | 차대차 | 후진중충돌 | 후진중충돌 | 3514 | 2 | 304 | 4172 | 162 | 0.000569 |
| 8 | 차대차 | 추돌 | 추돌 | 32717 | 379 | 7564 | 47111 | 2748 | 0.011584 |
| 9 | 차대차 | 기타 | 기타 | 44222 | 248 | 9990 | 49616 | 3839 | 0.005608 |
In [29]:
import seaborn as sns
from matplotlib import pyplot as plt
cartocar = df[df['사고유형대분류'] == '차대차']
cartocar
plt.bar(range(len(cartocar['사망비율'])), cartocar['사망비율'])
plt.xticks(range(len(cartocar['사망비율'])), cartocar['사고유형'])
plt.show()
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 51221 (\N{HANGUL SYLLABLE JEONG}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 47732 (\N{HANGUL SYLLABLE MYEON}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 52649 (\N{HANGUL SYLLABLE CUNG}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 46028 (\N{HANGUL SYLLABLE DOL}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 52769 (\N{HANGUL SYLLABLE CEUG}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 54980 (\N{HANGUL SYLLABLE HU}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 51652 (\N{HANGUL SYLLABLE JIN}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 51473 (\N{HANGUL SYLLABLE JUNG}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 52628 (\N{HANGUL SYLLABLE CU}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 44592 (\N{HANGUL SYLLABLE GI}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
/usr/local/lib/python3.10/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 53440 (\N{HANGUL SYLLABLE TA}) missing from current font.
fig.canvas.print_figure(bytes_io, **kw)
In [9]:
# 사망유형대분류별로 사망자수가 가장많은 사고유형
df
Out[9]:
| 사고유형대분류 | 사고유형중분류 | 사고유형 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 | 사망비율 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 차대사람 | 횡단중 | 횡단중 | 12767 | 445 | 5999 | 6664 | 458 | 0.034855 |
| 1 | 차대사람 | 차도통행중 | 차도통행중 | 3628 | 146 | 1438 | 2007 | 183 | 0.040243 |
| 2 | 차대사람 | 길가장자리구역통행중 | 길가장자리구역통행중 | 1973 | 33 | 563 | 1330 | 121 | 0.016726 |
| 3 | 차대사람 | 보도통행중 | 보도통행중 | 2226 | 21 | 745 | 1455 | 131 | 0.009434 |
| 4 | 차대사람 | 기타 | 기타 | 14675 | 333 | 4887 | 9139 | 1062 | 0.022692 |
| 5 | 차대차 | 정면충돌 | 정면충돌 | 7892 | 205 | 3539 | 8837 | 588 | 0.025976 |
| 6 | 차대차 | 측면충돌 | 측면충돌 | 71687 | 404 | 17756 | 84667 | 5781 | 0.005636 |
| 7 | 차대차 | 후진중충돌 | 후진중충돌 | 3514 | 2 | 304 | 4172 | 162 | 0.000569 |
| 8 | 차대차 | 추돌 | 추돌 | 32717 | 379 | 7564 | 47111 | 2748 | 0.011584 |
| 9 | 차대차 | 기타 | 기타 | 44222 | 248 | 9990 | 49616 | 3839 | 0.005608 |
| 10 | 차량단독 | 전도 | 전도 | 956 | 82 | 384 | 403 | 209 | 0.085774 |
| 11 | 차량단독 | 전복 | 전복 | 165 | 36 | 87 | 81 | 27 | 0.218182 |
| 12 | 차량단독 | 공작물충돌 | 공작물충돌 | 2742 | 340 | 1256 | 1504 | 532 | 0.123997 |
| 13 | 차량단독 | 주/정차차량 충돌 | 주/정차차량 충돌 | 23 | 3 | 7 | 8 | 6 | 0.130435 |
| 14 | 차량단독 | 도로이탈 | 도로이탈 추락 | 385 | 73 | 199 | 179 | 44 | 0.189610 |
| 15 | 차량단독 | 도로이탈 | 도로이탈 기타 | 156 | 18 | 73 | 79 | 34 | 0.115385 |
| 16 | 차량단독 | 기타 | 기타 | 3401 | 148 | 1114 | 2030 | 495 | 0.043517 |
In [40]:
df.groupby(['사고유형대분류','사망자수'])['사고유형'].max()
Out[40]:
사고유형대분류 사망자수
차대사람 21 보도통행중
33 길가장자리구역통행중
146 차도통행중
333 기타
445 횡단중
차대차 2 후진중충돌
205 정면충돌
248 기타
379 추돌
404 측면충돌
차량단독 3 주/정차차량 충돌
18 도로이탈 기타
36 전복
73 도로이탈 추락
82 전도
148 기타
340 공작물충돌
Name: 사고유형, dtype: object
In [41]:
df.loc[df.groupby('사고유형대분류')['사망자수'].idxmax(), '사고유형'].tolist()
Out[41]:
['횡단중', '측면충돌', '공작물충돌']
In [42]:
df
Out[42]:
| 사고유형대분류 | 사고유형중분류 | 사고유형 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 | 사망비율 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 차대사람 | 횡단중 | 횡단중 | 12767 | 445 | 5999 | 6664 | 458 | 0.034855 |
| 1 | 차대사람 | 차도통행중 | 차도통행중 | 3628 | 146 | 1438 | 2007 | 183 | 0.040243 |
| 2 | 차대사람 | 길가장자리구역통행중 | 길가장자리구역통행중 | 1973 | 33 | 563 | 1330 | 121 | 0.016726 |
| 3 | 차대사람 | 보도통행중 | 보도통행중 | 2226 | 21 | 745 | 1455 | 131 | 0.009434 |
| 4 | 차대사람 | 기타 | 기타 | 14675 | 333 | 4887 | 9139 | 1062 | 0.022692 |
| 5 | 차대차 | 정면충돌 | 정면충돌 | 7892 | 205 | 3539 | 8837 | 588 | 0.025976 |
| 6 | 차대차 | 측면충돌 | 측면충돌 | 71687 | 404 | 17756 | 84667 | 5781 | 0.005636 |
| 7 | 차대차 | 후진중충돌 | 후진중충돌 | 3514 | 2 | 304 | 4172 | 162 | 0.000569 |
| 8 | 차대차 | 추돌 | 추돌 | 32717 | 379 | 7564 | 47111 | 2748 | 0.011584 |
| 9 | 차대차 | 기타 | 기타 | 44222 | 248 | 9990 | 49616 | 3839 | 0.005608 |
| 10 | 차량단독 | 전도 | 전도 | 956 | 82 | 384 | 403 | 209 | 0.085774 |
| 11 | 차량단독 | 전복 | 전복 | 165 | 36 | 87 | 81 | 27 | 0.218182 |
| 12 | 차량단독 | 공작물충돌 | 공작물충돌 | 2742 | 340 | 1256 | 1504 | 532 | 0.123997 |
| 13 | 차량단독 | 주/정차차량 충돌 | 주/정차차량 충돌 | 23 | 3 | 7 | 8 | 6 | 0.130435 |
| 14 | 차량단독 | 도로이탈 | 도로이탈 추락 | 385 | 73 | 199 | 179 | 44 | 0.189610 |
| 15 | 차량단독 | 도로이탈 | 도로이탈 기타 | 156 | 18 | 73 | 79 | 34 | 0.115385 |
| 16 | 차량단독 | 기타 | 기타 | 3401 | 148 | 1114 | 2030 | 495 | 0.043517 |
In [51]:
# 사고유형별 중상비율 계산 후 50% 넘는 데이터만 .csv로 저장
df['중상비율'] = (df['중상자수'] / df['사고건수']) *100
df[df['중상비율'] > 50].to_csv('중상비율.csv', index=False, encoding='cp949')
요약 : to_csv()