AI SCHOOL/project

[mini project 2] 공공데이터를 활용한 대한민국 산업재해 현황 분석

moru_xz 2023. 2. 5. 20:48

사용한 데이터

라이브러리 및 데이터 불러오기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly
import plotly.express as px
import koreanize_matplotlib
df_sectors = pd.read_csv('전체_재해_현황_및_분석업종별_산업별_중분류__20230202111602.csv', encoding = 'cp949')
df_age = pd.read_csv('전체_재해_현황_및_분석연령별_산업별_중분류_21년', encoding = 'cp949')
df_dt = pd.read_csv('118_DT_11806_N011_20230202111759.csv', encoding = 'cp949') # 전체 재해 현황 및 분석-발생형태별(산업별 중분류)
df_temp = pd.read_csv('연령_산업_직업별_비정규직_근로자_규모_및_비중_총괄__산업10차__직업7차__20230204222131.csv', encoding = 'cp949')
df_period = pd.read_csv('전체_재해_현황_및_분석재해정도_요양기간_별_산업별_중분류__20230204225033.csv', encoding='cp949')
df_range = pd.read_csv('전체_재해_현황_및_분석입사근속기간별_산업별_중분류__20230202111722.csv', encoding = 'cp949')

최근 10년간 업종별 사고사망자 추이

df_s = df_sectors[['산업중분류별(1)', '산업중분류별(2)', '2012.3','2013.3','2014.3',
           '2015.3','2016.3', '2017.3', '2018.3', '2019.3','2020.3', 
            '2021.3']]
df_s = df_s.loc[df_s['산업중분류별(2)'] == '소계']
df_s = df_s.drop(['산업중분류별(2)'], axis = 1)
df_s.columns = ['산업중분류별', '2012','2013', '2014','2015', '2016', '2017',
               '2018','2019','2020','2021']
df_s = df_s.set_index('산업중분류별')
df_s = df_s.apply(pd.to_numeric)

df_s = df_s.sort_values(by = ['2021'], ascending = False)

df_s = df_s.T
df_s = df_s.drop(['총계'], axis = 1)
df_s.plot(figsize = (8, 4), title = '최근 10년간 업종별 사고사망자 추이' ) 
plt.legend(bbox_to_anchor = (1, 1)) ;

  • 건설업, 제조업, 기타의 사업, 광업, 운수 창고 및 통신업 순으로 최근 10년간 업종별사고사망자가 많은 것을 알 수 있음
  • 광업을 제외한 나머지 업종에서 사망자의 수가 꾸준히 상승하는 것을 알 수 있음
  • 하지만 광업에서의 사망자가 줄어드는 것이 안전관리가 잘 되어서인지 아니면 단순히 산업 자체에 근로자가 줄어드는 것인지는 알아 볼 필요가 있음

최근 10년간 업종별 요양재해자 추이

 

df_d = df_sectors[['산업중분류별(1)', '산업중분류별(2)', '2012.2','2013.2','2014.2',
           '2015.2','2016.2', '2017.2', '2018.2', '2019.2','2020.2', 
            '2021.2']]
df_d = df_d.loc[df_d['산업중분류별(2)'] == '소계']
df_d = df_d.drop(['산업중분류별(2)'], axis = 1)
df_d.columns = ['산업중분류별','2012','2013', '2014','2015', '2016', '2017',
               '2018','2019','2020','2021']
df_d = df_d.set_index('산업중분류별')
df_d = df_d.apply(pd.to_numeric)
df_d = df_d.sort_values(by = ['2021'], ascending = False)
df_d = df_d.T
df_d = df_d.drop(['총계'], axis = 1)
df_d.plot(figsize = (8, 4), title = '최근 10년간 업종별 요양재해자 추이') 
plt.legend(bbox_to_anchor = (1, 1)) ;

  • 기타의 사업, 제조업, 건설업, 운수 창고 및 통신업 순으로 최근 10년간 업종별 요양재해자가 많은 것을 알 수 있음
  • 사망자추이에서 높은 순위를 차지했던 광업이 요양재해자에서는 눈에 띄게 높지는 않음
  • 그렇다면 광업에서 산업재해가 일어난다면 다른 사업과 달리 사망으로 이어지는 경우가 많은지 살펴 볼 필요가 있음

요양재해자에 대한 사망자의 비

df_b = df_period.rename(columns = df_period.iloc[0])
df_b = df_b.loc[df_b['산업중분류별(2)'] == '소계']
df_b = df_b.reset_index(drop = True)
df_b= df_b.drop(df_b.index[0:1])
df_b = df_b.drop(['산업중분류별(2)'], axis =1)
df_b = df_b.rename(columns = {'산업중분류별(1)': '산업중분류'})
df_b = df_b.set_index('산업중분류')
df_b = df_b.apply(pd.to_numeric)
df_b['사망자'] = df_b['사망자'] / df_b['요양재해자'] * 100
df_b['6개월 이상'] = df_b['6개월 이상'] / df_b['요양재해자'] * 100
df_b['91~180일'] = df_b['91~180일'] / df_b['요양재해자'] * 100
df_b['29~90일'] = df_b['29~90일'] / df_b['요양재해자'] * 100
df_b['15~28일'] = df_b['15~28일'] / df_b['요양재해자'] * 100
df_b['8~14일'] = df_b['8~14일'] / df_b['요양재해자'] * 100
df_b['4~7일'] = df_b['4~7일'] / df_b['요양재해자'] * 100
df_b

df_b.sort_values(by = '사망자', ascending = False, inplace = True)
df_b.loc[:,'사망자'].plot(title = '요양재해자에 대한 사망자',kind = 'bar', rot = 70, color = 'darkred',
                      figsize = (12, 4));

df_b.iloc[0,1:].plot(kind = 'bar', rot = 60, figsize = (12, 4)) ;

df_b.iloc[:,1:].plot(kind = 'bar', subplots = True, figsize = (10,30), rot = 60) ;

  • 다른 산업에 비해 광업에서 사망자가 요양재해자 대비 많은 것을 알 수 있다.

근속기간별 산업재해 발생 추이

 df_r = df_range[(df_range['산업중분류별(2)'] == '산업중분류별(2)') | (df_range['산업중분류별(1)'] == '총계')]
df_r21 = df_r[['2021.1', '2021.2', '2021.3', '2021.4', '2021.5', '2021.6', '2021.7', '2021.8']].T
df_r21.columns = ['근속기간', '2021']
df_r18 = df_r[['2018.1', '2018.2', '2018.3', '2018.4', '2018.5', '2018.6', '2018.7', '2018.8']].T
df_r18.columns = ['근속기간', '2018']
df_r15 = df_r[['2015.1', '2015.2', '2015.3', '2015.4', '2015.5', '2015.6', '2015.7', '2015.8']].T
df_r15.columns = ['근속기간', '2015']
df_r12 = df_r[['2012.1', '2012.2', '2012.3', '2012.4', '2012.5', '2012.6', '2012.7', '2012.8']].T
df_r12.columns = ['근속기간', '2012']
df_r_all  = pd.merge(df_r21,df_r18)
df_r_all  = pd.merge(df_r_all,df_r15)
df_r_all  = pd.merge(df_r_all,df_r12)
df_r_all = df_r_all.set_index('근속기간')
df_r_all = df_r_all.astype(float)
df_r_all.plot(figsize = (10 , 4), title = '입사 근속기간별 산업재해 발생 추이') ; 
 
 
  • 2012 ~ 2021 모두 비슷한 흐름을 보여준다
  • 근속기간이 6개월 미만인 근로자에게 산업재해가 많이 일어나는 것을 알 수 있다
  • 특이한점은 단 6개월 차이지만 6개월 미만 근로자와 1년 미만의 근로자의 산업재해 발생 추이가 크게 난다는 것을 알 수 있다

연령별 산업재해 발생 추이

df_a = df_age.rename(columns = df_age.iloc[0])
df_a = df_a.drop(df_a.index[0])
df_a = df_a[(df_a['산업중분류별(2)'] == '소계') & (df_a['산업중분류별(1)'] == '총계')]
df_a = df_a.drop(['계','산업중분류별(2)','산업중분류별(1)'], axis = 1)
df_a = df_a.rename(index = {1 : '산업재해자'})
df_a

df_a.astype(float).T.plot(kind = 'bar', color = 'skyblue', 
                          figsize = (12, 6), rot = 50,
                         title = '연령별 산업재해 발생 추이') ;

  • 앞서 본 '근속기간별 산업재해 발생 추이' 그래프에서 보면 근속 기간이 6개월 미만인 근로자에게 산업재해가 많이 일어나는 것을 알 수 있음
  • 이를 통해 일을 시작한지 얼마 지나지 않은 젊은층의 근로자가 많이 사고를 입는 것이라고 추측했지만 '연령별 산업재해 발생 추이'를 보니 50세 이상의 중장년층에게 산업재해가 많이 일어나는 것을 알 수 있음
  • 이를 통해 산업재해가 근속기간이 나이와 연관이 있는 것이 아닐 수도 있겠다는 생각을 함

연령별 비정규직 근로자 비중

df_a = df_temp.loc[0:7, ['연령, 산업, 직업별', '2021.08.1']]
df_a = df_a.rename(columns = df_a.iloc[0])
df_a = df_a.drop(df_a.index[0:2])
df_a['비중 (%)'] = df_a['비중 (%)'].astype(float)
df_a.columns = ['연령', '비중(%)']
df_a.set_index(df_a['연령'], inplace = True)
df_a = df_a.drop('연령', axis = 1)
df_a.plot(kind = 'bar', rot = 60, figsize = (12, 6),
         title = '연령별 비정규직 근로자 비중') ;
 
 
 
연령/산업/직업별 비정규직 근로자 규모 및 비중(총괄) ,「경제활동인구조사」, 통계청 - 통계설명자료
  • 연령별 비정규직 근로자 비중을 확인해 보니 산업재해가 많이 발생했던 연령층인 50세 이상이 다른 연령층에 비해 ‘연령별 비정규직 근로자 비중’에서 많은 비중을 차지하는 것을 알 수 있음
  • 비정규직에는 단기 근로자(일용직 근로자)도 포함되어 있기 때문에 나이가 많은 중장년층이 단기 근로를 하며 작업에 대한 훈련도 제대로 되지 않은 상태로 바로 현장에서 일 하게 되어 많은 산업재해가 일어나는 것이 아닌가 추측해 볼 수 있음

2021년 발생형태별 산업재해자

df_e = df_dt.loc[df_dt['산업중분류별'] == '총계']
df_e = df_e.drop(df_e.index[0])
df_e = df_e.drop(['산업중분류별', '단위','항목', 'Unnamed: 14'], axis = 1)
df_e = df_e.set_index('발생형태별')
df_e = df_e.sort_values(by = ['2021 년'], ascending= False)
df_e['2021 년'].iloc[0:5].plot(kind = 'bar', rot = 60, color = 'pink',
                             title = '2021년 발생형태별 산업재해자',
                             figsize = (12, 6)) ;

  • 2021년에 발생한 산업재해의 발생형태를 보면 넘어짐, 업무상질병, 떨어짐, 끼임, 절단 베임 찔림 순으로 많이 발생한 것을 알 수 있음

 


  • 좋았던 것(Liked) :  캐글이나 다른 데이터 분석 예제로 많이 사용하는 데이터가 아니라 온전히 내 힘으로 해야했다. 그래서 완벽하지는 않지만 할 수 있는한 내가 아는 한도 내에서 최대한 활용해서 프로젝트를 할 수 있었다 . 
  • 배운 것(Learned) : 전까지는 EDA가 무엇인지 정말 몰랐다. 지금도 물론 제대로 아는 것은 아니지만 이번 프로젝트를 통해 대략적으로나마 알 수 있었다. 그리고 더 배운다면 더 잘 할 수 있을 것이라는 희망(?)이 생겼다. 시각화에 대한 관심이 생겼다.
  • 부족했던 것(Lacked) : 데이터에 대한 이해도. 산업재해라는 분야에 대해 정말 관심이 없었어서 단어 하나하나에 대한 이해가 필요했다. 
  • 바라는 것(Longed for) : 이번 프로젝트에서 무언가 !분석!을 했다기 보다는 그래프를 그려봤다 정도 한 것 같다. 그래서 이게 좀 아쉬웠다. 다음에는 데이터분석 예시를 보고 직접 따라보면서 배우고 싶다. 또한 seaborn이나 matplotlib에 대해서 더 깊고 제대로 배워서 시각화에 대한 완성도를 높여야겠다. -> 그 전에 numpy랑 pandas에 대한 이해도 필요한듯