3.1. 고용산재보험 가입 현황 적용#
2일차에서 pandas패키지의 DataFrame구조의 데이터에 대해 merge 및 group함수를 이용하여 데이터를 조작하는 법을 배웠다. 이때, 실제 데이터가 아닌 완성된 데이터의 일부를 이용하여 진행했다. 이번 시간에는 raw data(아무것도 하지 않은 데이터)를 이용하여 원하는 결과를 확인하는 과정을 가지고자 한다.
이번 시간의 목표는 2일차 때 사용한 데이터를 고용산재보험 가입 현황데이터를 이용하여 생성하는 것이다. 목표는 다음과 같다.
2022년 제외하고,
2010년 이후 산재 및 고용보험 성립 연도별, 시도별 평균 근로자수 및 가입된 사업장 수 계산
2017년 이후 산재 및 고용보험 성립 연도별, 시도별 음식점에 대한 사업장 수 계산
import pandas as pd
고용산재보험 데이터#
데이터들은 각각 서울, 대구, 대전, 부산, 서울, 울산, 인천에 대해 csv파일이 각각 저장되어 있다. 이들을 모두 읽고 확인해본다.
gj_dat = pd.read_csv("https://uos-bigdata.github.io/lab_data/docs/assets/data_lab_bokji/dat_practice_gwangju.csv")
dg_dat = pd.read_csv("https://uos-bigdata.github.io/lab_data/docs/assets/data_lab_bokji/dat_practice_daegu.csv")
dj_dat = pd.read_csv("https://uos-bigdata.github.io/lab_data/docs/assets/data_lab_bokji/dat_practice_daejeon.csv")
bs_dat = pd.read_csv("https://uos-bigdata.github.io/lab_data/docs/assets/data_lab_bokji/dat_practice_pusan.csv")
sl_dat = pd.read_csv("https://uos-bigdata.github.io/lab_data/docs/assets/data_lab_bokji/dat_practice_seoul.csv")
us_dat = pd.read_csv("https://uos-bigdata.github.io/lab_data/docs/assets/data_lab_bokji/dat_practice_ulsan.csv")
ic_dat = pd.read_csv("https://uos-bigdata.github.io/lab_data/docs/assets/data_lab_bokji/dat_practice_incheon.csv")
sl_dat.head()
| 연번 | 보험구분 | 사업장명 | 우편번호 | 사업장주소 | 고용보험업종코드 | 고용보험업종명 | 산재보험성립일자 | 고용보험성립일자 | 산재보험상시근로자수 | 고용보험상시근로자수 | 산재사업구분 | 고용사업구분 | 사업자등록번호 | 시도 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 전체 | 김구동(부동산) | 7238 | 서울 영등포구 국회대로72길 11 | 74100.0 | 사업시설 유지관리 서비스업 | 2010-07-01 | 2010-07-01 | 1 | 1 | 계속 | 계속 | 1.071384e+09 | 서울 |
| 1 | 2 | 전체 | 바우피엔피 | 4546 | 서울 중구 을지로33길 16 | 20202.0 | 합성수지 및 기타 플라스틱 물질 제조업 | 2014-01-01 | 2014-01-01 | 2 | 2 | 계속 | 계속 | 1.010109e+09 | 서울 |
| 2 | 3 | 전체 | 토탈사인대광부식 | 7291 | 서울특별시 영등포구 영등포로18길 2-3 | 18119.0 | 기타 인쇄업 | 2008-04-01 | 2008-04-01 | 3 | 3 | 계속 | 계속 | 1.010113e+09 | 서울 |
| 3 | 5 | 전체 | 한서전자 | 4545 | 서울 중구 청계천로 160 | 46521.0 | 가전제품 및 부품 도매업 | 2000-07-01 | 1998-10-01 | 5 | 5 | 계속 | 계속 | 1.010113e+09 | 서울 |
| 4 | 6 | 전체 | 삼진상사 | 8217 | 서울 구로구 경인로53길 15 | 46595.0 | 전기용 기계장비 및 관련 기자재 도매업 | 2000-07-01 | 1998-10-01 | 1 | 1 | 계속 | 계속 | 1.010113e+09 | 서울 |
이들은 각각 DataFrame으로 저장되어 있다. pd.concat함수를 이용해서 row를 기준으로 합치는 작업을 진행한다.
이때, pandas 패키지 내에 concat함수를 이용하면 된다. 이는 merge랑 다른 의미의 함수이다.
tmp_dat = pd.concat([gj_dat, dg_dat, dj_dat, bs_dat, sl_dat, us_dat, ic_dat])
tmp_dat.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1066598 entries, 0 to 117092
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 연번 1066598 non-null int64
1 보험구분 1066598 non-null object
2 사업장명 1066597 non-null object
3 우편번호 1066598 non-null int64
4 사업장주소 1066598 non-null object
5 고용보험업종코드 1032051 non-null float64
6 고용보험업종명 1032051 non-null object
7 산재보험성립일자 1060177 non-null object
8 고용보험성립일자 1032047 non-null object
9 산재보험상시근로자수 1066598 non-null int64
10 고용보험상시근로자수 1066598 non-null int64
11 산재사업구분 1060177 non-null object
12 고용사업구분 1032056 non-null object
13 사업자등록번호 1066412 non-null object
14 시도 1066598 non-null object
dtypes: float64(1), int64(4), object(10)
memory usage: 130.2+ MB
tmp_dat.head()
| 연번 | 보험구분 | 사업장명 | 우편번호 | 사업장주소 | 고용보험업종코드 | 고용보험업종명 | 산재보험성립일자 | 고용보험성립일자 | 산재보험상시근로자수 | 고용보험상시근로자수 | 산재사업구분 | 고용사업구분 | 사업자등록번호 | 시도 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 696 | 전체 | 남해상사 | 12724 | 경기 광주시 곤지암읍 새재길190번길 31-14 | 13999.0 | 그 외 기타 분류 안된 섬유제품 제조업 | 2014-06-15 | 2014-06-15 | 1 | 1 | 계속 | 계속 | 1010366494.0 | 광주 |
| 1 | 1279 | 전체 | MK스타일 | 12817 | 경기도 광주시 도척면 도척로699번길30-61 | 13221.0 | 침구 및 관련제품 제조업 | 2013-04-01 | 2013-04-01 | 2 | 2 | 계속 | 계속 | 1010614643.0 | 광주 |
| 2 | 1597 | 전체 | 무등중기 | 62073 | 광주 서구 매월2로15번길 16 | 42600.0 | 건설장비 운영업 | 2020-08-26 | 2020-08-26 | 1 | 1 | 계속 | 계속 | 1010711172.0 | 광주 |
| 3 | 1615 | 전체 | 아이투비 | 12787 | 경기 광주시 태봉로 110 | 23221.0 | 가정용 및 장식용 도자기 제조업 | 2012-01-12 | 2012-01-12 | 2 | 2 | 계속 | 계속 | 1010715412.0 | 광주 |
| 4 | 2185 | 전체 | 바우 | 12769 | 경기 광주시 광남안로 483 | 46742.0 | 직물 도매업 | 2010-04-01 | 2010-04-01 | 1 | 1 | 계속 | 계속 | 1010887591.0 | 광주 |
사업자등록번호가 문자형으로 지정되어 있는 것을 알 수 있다. 즉, 사업자등록번호 중 몇개의 값이 문자의 형태로 저장되었다는 것을 의미한다.
산재 및 고용보험 성립 연도별, 시도별 평균 근로자수, 전체 사업장 수, 가입되지 않은 사업장 수 계산#
이 작업을 하기 위해서는 총 2가지 작업을 진행해야 한다.
산재 관련 변수들의 연도별, 시도별 시도별 평균 근로자수, 전체 사업장 수, 가입되지 않은 사업장 수를 계산
고용 관련 변수들의 연도별, 시도별 시도별 평균 근로자수, 전체 사업장 수, 가입되지 않은 사업장 수를 계산
(1.), (2.)에서 생성한 데이터를 결합
(1.), (2.)을 구분하는 이유는 산재보험성립일자 및 고용보험성립일자의 연도가 반드시 같다는 보장이 없으며, 가입되지 않은 것도 제각각이기 때문이다. 먼저 산재 관련한 데이터 셋을 생성할건데, 데이터에 연도 관련 변수가 없으므로, 먼저 연도를 생성하자.
산재보험성립일자에서 연도를 생성하는 방법은 2가지이다.
앞에서 4자리를 자르는것
이 변수를 날짜형으로 저장하고, 연도만 추출하는것
우리는 두번째 방법을 이용하여 연도를 생성한다. 날짜형으로 저장하기 위해 pandas패키지안에 to_datetime method를 이용한다.
tmp_dat['산재보험성립일자'] = pd.to_datetime(tmp_dat['산재보험성립일자'])
tmp_dat.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1066598 entries, 0 to 117092
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 연번 1066598 non-null int64
1 보험구분 1066598 non-null object
2 사업장명 1066597 non-null object
3 우편번호 1066598 non-null int64
4 사업장주소 1066598 non-null object
5 고용보험업종코드 1032051 non-null float64
6 고용보험업종명 1032051 non-null object
7 산재보험성립일자 1060177 non-null datetime64[ns]
8 고용보험성립일자 1032047 non-null object
9 산재보험상시근로자수 1066598 non-null int64
10 고용보험상시근로자수 1066598 non-null int64
11 산재사업구분 1060177 non-null object
12 고용사업구분 1032056 non-null object
13 사업자등록번호 1066412 non-null object
14 시도 1066598 non-null object
dtypes: datetime64[ns](1), float64(1), int64(4), object(9)
memory usage: 130.2+ MB
산재보험성립일자의 Dtype을 보면 처음 읽었을때랑 다르게 datetime64로 변경 되었음을 확인 할 수 있다.
다음으로 연도를 추출하기 위해 dt method의 year함수를 이용한다.
tmp_dat["산재_year"] = tmp_dat["산재보험성립일자"].dt.year
tmp_dat.head()
| 연번 | 보험구분 | 사업장명 | 우편번호 | 사업장주소 | 고용보험업종코드 | 고용보험업종명 | 산재보험성립일자 | 고용보험성립일자 | 산재보험상시근로자수 | 고용보험상시근로자수 | 산재사업구분 | 고용사업구분 | 사업자등록번호 | 시도 | 산재_year | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 696 | 전체 | 남해상사 | 12724 | 경기 광주시 곤지암읍 새재길190번길 31-14 | 13999.0 | 그 외 기타 분류 안된 섬유제품 제조업 | 2014-06-15 | 2014-06-15 | 1 | 1 | 계속 | 계속 | 1010366494.0 | 광주 | 2014.0 |
| 1 | 1279 | 전체 | MK스타일 | 12817 | 경기도 광주시 도척면 도척로699번길30-61 | 13221.0 | 침구 및 관련제품 제조업 | 2013-04-01 | 2013-04-01 | 2 | 2 | 계속 | 계속 | 1010614643.0 | 광주 | 2013.0 |
| 2 | 1597 | 전체 | 무등중기 | 62073 | 광주 서구 매월2로15번길 16 | 42600.0 | 건설장비 운영업 | 2020-08-26 | 2020-08-26 | 1 | 1 | 계속 | 계속 | 1010711172.0 | 광주 | 2020.0 |
| 3 | 1615 | 전체 | 아이투비 | 12787 | 경기 광주시 태봉로 110 | 23221.0 | 가정용 및 장식용 도자기 제조업 | 2012-01-12 | 2012-01-12 | 2 | 2 | 계속 | 계속 | 1010715412.0 | 광주 | 2012.0 |
| 4 | 2185 | 전체 | 바우 | 12769 | 경기 광주시 광남안로 483 | 46742.0 | 직물 도매업 | 2010-04-01 | 2010-04-01 | 1 | 1 | 계속 | 계속 | 1010887591.0 | 광주 | 2010.0 |
같은 방법으로 고용보험성립일자의 연도를 생성한다.
tmp_dat['고용보험성립일자'] = pd.to_datetime(tmp_dat['고용보험성립일자'])
tmp_dat["고용_year"] = tmp_dat["고용보험성립일자"].dt.year
tmp_dat.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1066598 entries, 0 to 117092
Data columns (total 17 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 연번 1066598 non-null int64
1 보험구분 1066598 non-null object
2 사업장명 1066597 non-null object
3 우편번호 1066598 non-null int64
4 사업장주소 1066598 non-null object
5 고용보험업종코드 1032051 non-null float64
6 고용보험업종명 1032051 non-null object
7 산재보험성립일자 1060177 non-null datetime64[ns]
8 고용보험성립일자 1032047 non-null datetime64[ns]
9 산재보험상시근로자수 1066598 non-null int64
10 고용보험상시근로자수 1066598 non-null int64
11 산재사업구분 1060177 non-null object
12 고용사업구분 1032056 non-null object
13 사업자등록번호 1066412 non-null object
14 시도 1066598 non-null object
15 산재_year 1060177 non-null float64
16 고용_year 1032047 non-null float64
dtypes: datetime64[ns](2), float64(3), int64(4), object(8)
memory usage: 146.5+ MB
산재보험성립일자 및 고용보험성립일자의 결측치의 갯수는 다음과 같다.
[tmp_dat["산재보험성립일자"].isna().sum(), tmp_dat["고용보험성립일자"].isna().sum()]
[6421, 34551]
각각 2632개, 32963개의 결측값을 포함하고 있다. 그러므로, 연도별, 시도별로 계산하기 위해, boolean변수를 생성한다.
tmp_dat["산재_bool"] = tmp_dat["산재보험성립일자"].isna()
tmp_dat["고용_bool"] = tmp_dat["고용보험성립일자"].isna()
tmp_dat.head()
| 연번 | 보험구분 | 사업장명 | 우편번호 | 사업장주소 | 고용보험업종코드 | 고용보험업종명 | 산재보험성립일자 | 고용보험성립일자 | 산재보험상시근로자수 | 고용보험상시근로자수 | 산재사업구분 | 고용사업구분 | 사업자등록번호 | 시도 | 산재_year | 고용_year | 산재_bool | 고용_bool | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 696 | 전체 | 남해상사 | 12724 | 경기 광주시 곤지암읍 새재길190번길 31-14 | 13999.0 | 그 외 기타 분류 안된 섬유제품 제조업 | 2014-06-15 | 2014-06-15 | 1 | 1 | 계속 | 계속 | 1010366494.0 | 광주 | 2014.0 | 2014.0 | False | False |
| 1 | 1279 | 전체 | MK스타일 | 12817 | 경기도 광주시 도척면 도척로699번길30-61 | 13221.0 | 침구 및 관련제품 제조업 | 2013-04-01 | 2013-04-01 | 2 | 2 | 계속 | 계속 | 1010614643.0 | 광주 | 2013.0 | 2013.0 | False | False |
| 2 | 1597 | 전체 | 무등중기 | 62073 | 광주 서구 매월2로15번길 16 | 42600.0 | 건설장비 운영업 | 2020-08-26 | 2020-08-26 | 1 | 1 | 계속 | 계속 | 1010711172.0 | 광주 | 2020.0 | 2020.0 | False | False |
| 3 | 1615 | 전체 | 아이투비 | 12787 | 경기 광주시 태봉로 110 | 23221.0 | 가정용 및 장식용 도자기 제조업 | 2012-01-12 | 2012-01-12 | 2 | 2 | 계속 | 계속 | 1010715412.0 | 광주 | 2012.0 | 2012.0 | False | False |
| 4 | 2185 | 전체 | 바우 | 12769 | 경기 광주시 광남안로 483 | 46742.0 | 직물 도매업 | 2010-04-01 | 2010-04-01 | 1 | 1 | 계속 | 계속 | 1010887591.0 | 광주 | 2010.0 | 2010.0 | False | False |
산재 기준 데이터 생성#
산재 기준으로 데이터를 생성해보자. 먼저 연도별, 시도별로 산재보험상시근로자수를 계산해보자.
먼저, 필요한 변수 선택 및 생성한다. 이때, 산재_year가 결측값이면, 산재_bool도 결측값이 생성된다. 그러므로, 고용_bool에 대한 합을 계산하여 산재보험은 가입했지만, 고용보험은 가입하지 않은 수를 계산한다.
san_dat = tmp_dat.loc[:, ["산재_year", "시도", "산재보험상시근로자수", "고용_bool"]]
san_dat["count"] = 1
다음으로, groupby method와 agg method를 이용하여 산재보험상시근로자수는 mean함수, count는 sum함수를 계산한다.
san_agg_dat = san_dat.groupby(["산재_year", "시도"]).agg({"산재보험상시근로자수" : "mean", "고용_bool" : "sum", "count" : "sum"})
reset_index method를 이용하여 데이터를 정리한다.
san_agg_dat = san_agg_dat.reset_index()
san_agg_dat
| 산재_year | 시도 | 산재보험상시근로자수 | 고용_bool | count | |
|---|---|---|---|---|---|
| 0 | 1960.0 | 부산 | 25.000000 | 0 | 1 |
| 1 | 1960.0 | 서울 | 16.000000 | 0 | 1 |
| 2 | 1960.0 | 인천 | 38.000000 | 1 | 1 |
| 3 | 1962.0 | 부산 | 61.000000 | 0 | 1 |
| 4 | 1964.0 | 광주 | 165.000000 | 0 | 1 |
| ... | ... | ... | ... | ... | ... |
| 406 | 2021.0 | 인천 | 2.604997 | 703 | 15648 |
| 407 | 2022.0 | 광주 | 1.000000 | 0 | 1 |
| 408 | 2022.0 | 대구 | 1.000000 | 1 | 1 |
| 409 | 2022.0 | 대전 | 6.500000 | 2 | 4 |
| 410 | 2022.0 | 부산 | 1.000000 | 0 | 2 |
411 rows × 5 columns
이제, 2010년 이상, 2021년 이하의 데이터를 추출한다. 이번 예시에서는 해당사항이 아니지만, 주의해야 할 점은 결측값(NaN)은 어떤 비교연산자를 이용하더라도 모두 False를 출력한다는 것이다.
tmp_ind = (san_agg_dat["산재_year"] >= 2010) & (san_agg_dat["산재_year"] <= 2021)
san_agg_dat = san_agg_dat.loc[tmp_ind, :]
san_agg_dat
| 산재_year | 시도 | 산재보험상시근로자수 | 고용_bool | count | |
|---|---|---|---|---|---|
| 323 | 2010.0 | 광주 | 6.863187 | 52 | 1820 |
| 324 | 2010.0 | 대구 | 7.366627 | 82 | 2523 |
| 325 | 2010.0 | 대전 | 9.100746 | 59 | 1340 |
| 326 | 2010.0 | 부산 | 8.126126 | 121 | 3108 |
| 327 | 2010.0 | 서울 | 10.971553 | 343 | 11741 |
| ... | ... | ... | ... | ... | ... |
| 402 | 2021.0 | 대전 | 2.658709 | 434 | 7917 |
| 403 | 2021.0 | 부산 | 2.874647 | 688 | 17367 |
| 404 | 2021.0 | 서울 | 7.487265 | 2375 | 59009 |
| 405 | 2021.0 | 울산 | 3.442591 | 273 | 5095 |
| 406 | 2021.0 | 인천 | 2.604997 | 703 | 15648 |
84 rows × 5 columns
마지막으로 변수명들을 정리하자.
san_agg_dat.columns = ["연도", "시도", "산재_평균근로자수", "산재만_가입된사업장수", "산재_가입된사업장수"]
san_agg_dat
| 연도 | 시도 | 산재_평균근로자수 | 산재만_가입된사업장수 | 산재_가입된사업장수 | |
|---|---|---|---|---|---|
| 323 | 2010.0 | 광주 | 6.863187 | 52 | 1820 |
| 324 | 2010.0 | 대구 | 7.366627 | 82 | 2523 |
| 325 | 2010.0 | 대전 | 9.100746 | 59 | 1340 |
| 326 | 2010.0 | 부산 | 8.126126 | 121 | 3108 |
| 327 | 2010.0 | 서울 | 10.971553 | 343 | 11741 |
| ... | ... | ... | ... | ... | ... |
| 402 | 2021.0 | 대전 | 2.658709 | 434 | 7917 |
| 403 | 2021.0 | 부산 | 2.874647 | 688 | 17367 |
| 404 | 2021.0 | 서울 | 7.487265 | 2375 | 59009 |
| 405 | 2021.0 | 울산 | 3.442591 | 273 | 5095 |
| 406 | 2021.0 | 인천 | 2.604997 | 703 | 15648 |
84 rows × 5 columns
여기서, 산재만_가입된사업장수의 의미는 연도, 시도별로 산재가 가입된 연도에, 고용보험이 가입되지 않은 사업장 수를 의미하는 것이다.
고용 기준 데이터 생성#
위에 산재 기준을 생성시킨 데이터를 고용 기준으로 데이터를 생성한다. 산재 데이터 생성과 같은 방식으로 생성한다.
먼저, 필요 변수 선택 및 생성을 진행한다. 마찬가지로, 고용_year가 결측값이면, 고용_bool도 결측값이 생성된다. 그러므로, 산재_bool에 대한 합을 계산하여 고용보험은 가입했지만, 산재보험은 가입하지 않은 수를 계산한다.
go_dat = tmp_dat.loc[:, ["고용_year", "시도", "고용보험상시근로자수", "산재_bool"]]
go_dat["count"] = 1
다음으로, groupby method와 agg method를 이용하여 고용보험상시근로자수는 mean함수, count는 sum함수를 계산한다.
go_agg_dat = go_dat.groupby(["고용_year", "시도"]).agg({"고용보험상시근로자수" : "mean", "산재_bool" : sum, "count" : "sum"})
reset_index method를 이용하여 데이터를 정리한다.
go_agg_dat = go_agg_dat.reset_index()
go_agg_dat
| 고용_year | 시도 | 고용보험상시근로자수 | 산재_bool | count | |
|---|---|---|---|---|---|
| 0 | 1977.0 | 서울 | 0.000000 | 0 | 1 |
| 1 | 1978.0 | 서울 | 1.000000 | 0 | 1 |
| 2 | 1981.0 | 서울 | 1.000000 | 0 | 1 |
| 3 | 1989.0 | 부산 | 18.000000 | 0 | 1 |
| 4 | 1991.0 | 서울 | 16.000000 | 0 | 1 |
| ... | ... | ... | ... | ... | ... |
| 193 | 2021.0 | 울산 | 2.080108 | 262 | 5193 |
| 194 | 2021.0 | 인천 | 1.916362 | 444 | 15615 |
| 195 | 2022.0 | 광주 | 0.500000 | 0 | 2 |
| 196 | 2022.0 | 대전 | 12.000000 | 0 | 2 |
| 197 | 2022.0 | 부산 | 1.000000 | 0 | 2 |
198 rows × 5 columns
2010년 이상, 2020년 이하의 데이터를 추출한다.
tmp_ind = (go_agg_dat["고용_year"] >= 2010) & (go_agg_dat['고용_year'] <= 2021)
go_agg_dat = go_agg_dat.loc[tmp_ind, :]
go_agg_dat
| 고용_year | 시도 | 고용보험상시근로자수 | 산재_bool | count | |
|---|---|---|---|---|---|
| 111 | 2010.0 | 광주 | 6.847419 | 1 | 1763 |
| 112 | 2010.0 | 대구 | 7.051240 | 7 | 2420 |
| 113 | 2010.0 | 대전 | 8.816680 | 3 | 1271 |
| 114 | 2010.0 | 부산 | 7.622692 | 11 | 2979 |
| 115 | 2010.0 | 서울 | 10.869985 | 30 | 11391 |
| ... | ... | ... | ... | ... | ... |
| 190 | 2021.0 | 대전 | 1.887973 | 369 | 8007 |
| 191 | 2021.0 | 부산 | 1.909389 | 660 | 17680 |
| 192 | 2021.0 | 서울 | 2.020801 | 1410 | 58700 |
| 193 | 2021.0 | 울산 | 2.080108 | 262 | 5193 |
| 194 | 2021.0 | 인천 | 1.916362 | 444 | 15615 |
84 rows × 5 columns
go_agg_dat.columns = ["연도", "시도", "고용_평균근로자수", "고용만_가입된사업장수", "고용_가입된사업장수"]
go_agg_dat
| 연도 | 시도 | 고용_평균근로자수 | 고용만_가입된사업장수 | 고용_가입된사업장수 | |
|---|---|---|---|---|---|
| 111 | 2010.0 | 광주 | 6.847419 | 1 | 1763 |
| 112 | 2010.0 | 대구 | 7.051240 | 7 | 2420 |
| 113 | 2010.0 | 대전 | 8.816680 | 3 | 1271 |
| 114 | 2010.0 | 부산 | 7.622692 | 11 | 2979 |
| 115 | 2010.0 | 서울 | 10.869985 | 30 | 11391 |
| ... | ... | ... | ... | ... | ... |
| 190 | 2021.0 | 대전 | 1.887973 | 369 | 8007 |
| 191 | 2021.0 | 부산 | 1.909389 | 660 | 17680 |
| 192 | 2021.0 | 서울 | 2.020801 | 1410 | 58700 |
| 193 | 2021.0 | 울산 | 2.080108 | 262 | 5193 |
| 194 | 2021.0 | 인천 | 1.916362 | 444 | 15615 |
84 rows × 5 columns
여기서, 고용만_가입된사업장수의 의미는 각 연도, 시도별로 고용이 가입된 연도에, 산재보험이 가입되지 않은 사업장 수를 의미하는 것이다.
마지막으로, 두 데이터셋을 merge 함수를 이용하여 결합한다.
join_dat = pd.merge(san_agg_dat, go_agg_dat, on = ["연도", "시도"])
join_dat
| 연도 | 시도 | 산재_평균근로자수 | 산재만_가입된사업장수 | 산재_가입된사업장수 | 고용_평균근로자수 | 고용만_가입된사업장수 | 고용_가입된사업장수 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2010.0 | 광주 | 6.863187 | 52 | 1820 | 6.847419 | 1 | 1763 |
| 1 | 2010.0 | 대구 | 7.366627 | 82 | 2523 | 7.051240 | 7 | 2420 |
| 2 | 2010.0 | 대전 | 9.100746 | 59 | 1340 | 8.816680 | 3 | 1271 |
| 3 | 2010.0 | 부산 | 8.126126 | 121 | 3108 | 7.622692 | 11 | 2979 |
| 4 | 2010.0 | 서울 | 10.971553 | 343 | 11741 | 10.869985 | 30 | 11391 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 79 | 2021.0 | 대전 | 2.658709 | 434 | 7917 | 1.887973 | 369 | 8007 |
| 80 | 2021.0 | 부산 | 2.874647 | 688 | 17367 | 1.909389 | 660 | 17680 |
| 81 | 2021.0 | 서울 | 7.487265 | 2375 | 59009 | 2.020801 | 1410 | 58700 |
| 82 | 2021.0 | 울산 | 3.442591 | 273 | 5095 | 2.080108 | 262 | 5193 |
| 83 | 2021.0 | 인천 | 2.604997 | 703 | 15648 | 1.916362 | 444 | 15615 |
84 rows × 8 columns
join_dat.to_csv("../전체_사업장.csv", index = False)
연도별 음식점에 대한 가입된 사업장의 수#
음식점만 집중적으로 살펴봤을때, 산재 및 고용보험은 일반적으로 가게를 새로 열거나, 새로운 사람 혹은 아르바이트 생을 뽑았을때 가입을 할 것이다. 그렇다면, 코로나 집중기간이였던 2020년에는 과연 가입된 사업장 수가 감소했을까??? 비교 대상으로는 2016년부터 2019년까지 4년치의 데이터를 비교한다.
이를 얻기 위해서는 음식점에 대한 데이터를 생성하여, 연도별, 시도별로 가입된 사업장수를 살펴보고자 한다. 그러기 위해서는 고용보험업종코드 앞의 2자리가 56인 데이터를 가져와야 한다. 따라서, 고용보험업종코드에서 앞의 2자리를 저장하고, 56만 가져오는 작업을 진행한다.
그러기 위해 str.slice()를 사용할 건데, 이는 DataFrame에서 하나의 column 혹은 row에 대해 일부를 자르고 싶을때 사용하는 method이다. 또한, 이 method는 문자열에 적용된다.
먼저, 고용보험업종코드는 숫자형이므로 astype method를 이용해서 문자형으로 변형을 시켜준다.
이후, str.slice method를 이용하여 앞의 2자리를 자른다.
tmp_ser = tmp_dat["고용보험업종코드"].astype(str)
tmp_dat["부분_고용보험업종코드"] = tmp_ser.str.slice(0, 2)
tmp_dat.head()
| 연번 | 보험구분 | 사업장명 | 우편번호 | 사업장주소 | 고용보험업종코드 | 고용보험업종명 | 산재보험성립일자 | 고용보험성립일자 | 산재보험상시근로자수 | 고용보험상시근로자수 | 산재사업구분 | 고용사업구분 | 사업자등록번호 | 시도 | 산재_year | 고용_year | 산재_bool | 고용_bool | 부분_고용보험업종코드 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 696 | 전체 | 남해상사 | 12724 | 경기 광주시 곤지암읍 새재길190번길 31-14 | 13999.0 | 그 외 기타 분류 안된 섬유제품 제조업 | 2014-06-15 | 2014-06-15 | 1 | 1 | 계속 | 계속 | 1010366494.0 | 광주 | 2014.0 | 2014.0 | False | False | 13 |
| 1 | 1279 | 전체 | MK스타일 | 12817 | 경기도 광주시 도척면 도척로699번길30-61 | 13221.0 | 침구 및 관련제품 제조업 | 2013-04-01 | 2013-04-01 | 2 | 2 | 계속 | 계속 | 1010614643.0 | 광주 | 2013.0 | 2013.0 | False | False | 13 |
| 2 | 1597 | 전체 | 무등중기 | 62073 | 광주 서구 매월2로15번길 16 | 42600.0 | 건설장비 운영업 | 2020-08-26 | 2020-08-26 | 1 | 1 | 계속 | 계속 | 1010711172.0 | 광주 | 2020.0 | 2020.0 | False | False | 42 |
| 3 | 1615 | 전체 | 아이투비 | 12787 | 경기 광주시 태봉로 110 | 23221.0 | 가정용 및 장식용 도자기 제조업 | 2012-01-12 | 2012-01-12 | 2 | 2 | 계속 | 계속 | 1010715412.0 | 광주 | 2012.0 | 2012.0 | False | False | 23 |
| 4 | 2185 | 전체 | 바우 | 12769 | 경기 광주시 광남안로 483 | 46742.0 | 직물 도매업 | 2010-04-01 | 2010-04-01 | 1 | 1 | 계속 | 계속 | 1010887591.0 | 광주 | 2010.0 | 2010.0 | False | False | 46 |
그리고 생성된 변수가 문자로 56의 값을 가지는 데이터만 불러오자.
tmp_ind = tmp_dat["부분_고용보험업종코드"] == "56"
sub_dat = tmp_dat.loc[tmp_ind, :]
sub_dat.head()
| 연번 | 보험구분 | 사업장명 | 우편번호 | 사업장주소 | 고용보험업종코드 | 고용보험업종명 | 산재보험성립일자 | 고용보험성립일자 | 산재보험상시근로자수 | 고용보험상시근로자수 | 산재사업구분 | 고용사업구분 | 사업자등록번호 | 시도 | 산재_year | 고용_year | 산재_bool | 고용_bool | 부분_고용보험업종코드 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 13 | 4422 | 전체 | 돈가네김치찌개곤지암점 | 12804 | 경기 광주시 곤지암읍 경충대로 571 | 56111.0 | 한식 일반 음식점업 | 2020-01-28 | 2020-01-28 | 2 | 2 | 계속 | 계속 | 1011562623.0 | 광주 | 2020.0 | 2020.0 | False | False | 56 |
| 16 | 4470 | 전체 | 윤장어 | 12768 | 경기 광주시 순암로 180 | 56114.0 | 한식 해산물요리 전문점 | 2020-08-17 | 2020-08-17 | 1 | 1 | 계속 | 계속 | 1011613681.0 | 광주 | 2020.0 | 2020.0 | False | False | 56 |
| 20 | 4527 | 전체 | 무진장해물탕 | 62319 | 광주 광산구 목련로273번안길 61 | 56111.0 | 한식 일반 음식점업 | 2019-01-01 | 2019-01-01 | 0 | 0 | 계속 | 계속 | 1011693313.0 | 광주 | 2019.0 | 2019.0 | False | False | 56 |
| 32 | 4986 | 전체 | 디저트39 광주상무점 | 61950 | 광주 서구 치평로 86 | 56221.0 | 커피 전문점 | 2019-07-01 | 2019-07-01 | 1 | 1 | 계속 | 계속 | 1012566327.0 | 광주 | 2019.0 | 2019.0 | False | False | 56 |
| 33 | 4990 | 전체 | 이비가짬뽕(전남대점) | 61220 | 광주 북구 용봉로 10 | 56121.0 | 중식 음식점업 | 2015-09-01 | 2015-09-01 | 16 | 16 | 계속 | 계속 | 1012572872.0 | 광주 | 2015.0 | 2015.0 | False | False | 56 |
이제 연도별, 시도별로 사업장의 갯수를 계산한다. 이때도 마찬가지로 count변수를 생성해 sido, 산재_year, 고용_year별로 계산한다.~~
sub_dat["count"] = 1
san_agg_dat = sub_dat.groupby(["시도", "산재_year"])["count"].agg("sum")
san_agg_dat
C:\Users\jieun\AppData\Local\Temp\ipykernel_36584\4066125944.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
sub_dat["count"] = 1
시도 산재_year
광주 1988.0 1
1999.0 1
2000.0 40
2001.0 4
2002.0 10
...
인천 2017.0 1319
2018.0 1817
2019.0 2718
2020.0 2886
2021.0 2891
Name: count, Length: 209, dtype: int64
san_agg_dat = san_agg_dat.reset_index()
san_agg_dat
| 시도 | 산재_year | count | |
|---|---|---|---|
| 0 | 광주 | 1988.0 | 1 |
| 1 | 광주 | 1999.0 | 1 |
| 2 | 광주 | 2000.0 | 40 |
| 3 | 광주 | 2001.0 | 4 |
| 4 | 광주 | 2002.0 | 10 |
| ... | ... | ... | ... |
| 204 | 인천 | 2017.0 | 1319 |
| 205 | 인천 | 2018.0 | 1817 |
| 206 | 인천 | 2019.0 | 2718 |
| 207 | 인천 | 2020.0 | 2886 |
| 208 | 인천 | 2021.0 | 2891 |
209 rows × 3 columns
tmp_ind = (san_agg_dat["산재_year"] >= 2017) & (san_agg_dat['산재_year'] <= 2021)
san_agg_dat = san_agg_dat.loc[tmp_ind, :]
san_agg_dat.head()
| 시도 | 산재_year | count | |
|---|---|---|---|
| 19 | 광주 | 2017.0 | 796 |
| 20 | 광주 | 2018.0 | 1121 |
| 21 | 광주 | 2019.0 | 1674 |
| 22 | 광주 | 2020.0 | 1757 |
| 23 | 광주 | 2021.0 | 1727 |
san_agg_dat.columns = ["시도", "연도", "산재_음식사업장수"]
san_agg_dat.head()
| 시도 | 연도 | 산재_음식사업장수 | |
|---|---|---|---|
| 19 | 광주 | 2017.0 | 796 |
| 20 | 광주 | 2018.0 | 1121 |
| 21 | 광주 | 2019.0 | 1674 |
| 22 | 광주 | 2020.0 | 1757 |
| 23 | 광주 | 2021.0 | 1727 |
같은 형태로, 고용에 대해서 진행한다.
sub_dat["count"] = 1
go_agg_dat = sub_dat.groupby(["시도", "고용_year"])["count"].agg("sum")
go_agg_dat
C:\Users\jieun\AppData\Local\Temp\ipykernel_36584\2061023033.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
sub_dat["count"] = 1
시도 고용_year
광주 1998.0 27
1999.0 3
2000.0 12
2001.0 4
2002.0 10
...
인천 2017.0 1318
2018.0 1835
2019.0 2731
2020.0 2892
2021.0 2898
Name: count, Length: 177, dtype: int64
go_agg_dat = go_agg_dat.reset_index()
go_agg_dat
| 시도 | 고용_year | count | |
|---|---|---|---|
| 0 | 광주 | 1998.0 | 27 |
| 1 | 광주 | 1999.0 | 3 |
| 2 | 광주 | 2000.0 | 12 |
| 3 | 광주 | 2001.0 | 4 |
| 4 | 광주 | 2002.0 | 10 |
| ... | ... | ... | ... |
| 172 | 인천 | 2017.0 | 1318 |
| 173 | 인천 | 2018.0 | 1835 |
| 174 | 인천 | 2019.0 | 2731 |
| 175 | 인천 | 2020.0 | 2892 |
| 176 | 인천 | 2021.0 | 2898 |
177 rows × 3 columns
tmp_ind = (go_agg_dat["고용_year"] >= 2017) & (go_agg_dat['고용_year'] <= 2021)
go_agg_dat = go_agg_dat.loc[tmp_ind, :]
go_agg_dat.head()
| 시도 | 고용_year | count | |
|---|---|---|---|
| 19 | 광주 | 2017.0 | 801 |
| 20 | 광주 | 2018.0 | 1136 |
| 21 | 광주 | 2019.0 | 1679 |
| 22 | 광주 | 2020.0 | 1763 |
| 23 | 광주 | 2021.0 | 1734 |
go_agg_dat.columns = ["시도", "연도", "고용_음식사업장수"]
go_agg_dat.head()
| 시도 | 연도 | 고용_음식사업장수 | |
|---|---|---|---|
| 19 | 광주 | 2017.0 | 801 |
| 20 | 광주 | 2018.0 | 1136 |
| 21 | 광주 | 2019.0 | 1679 |
| 22 | 광주 | 2020.0 | 1763 |
| 23 | 광주 | 2021.0 | 1734 |
두 데이터셋을 시도, 연도 기준으로 merge함수를 이용해서 합치자.
join_dat = pd.merge(san_agg_dat, go_agg_dat, on = ["시도", "연도"])
join_dat
| 시도 | 연도 | 산재_음식사업장수 | 고용_음식사업장수 | |
|---|---|---|---|---|
| 0 | 광주 | 2017.0 | 796 | 801 |
| 1 | 광주 | 2018.0 | 1121 | 1136 |
| 2 | 광주 | 2019.0 | 1674 | 1679 |
| 3 | 광주 | 2020.0 | 1757 | 1763 |
| 4 | 광주 | 2021.0 | 1727 | 1734 |
| 5 | 대구 | 2017.0 | 1367 | 1375 |
| 6 | 대구 | 2018.0 | 1739 | 1749 |
| 7 | 대구 | 2019.0 | 2523 | 2531 |
| 8 | 대구 | 2020.0 | 2428 | 2434 |
| 9 | 대구 | 2021.0 | 2619 | 2624 |
| 10 | 대전 | 2017.0 | 933 | 927 |
| 11 | 대전 | 2018.0 | 1093 | 1131 |
| 12 | 대전 | 2019.0 | 1588 | 1606 |
| 13 | 대전 | 2020.0 | 1767 | 1781 |
| 14 | 대전 | 2021.0 | 1634 | 1652 |
| 15 | 부산 | 2017.0 | 1713 | 1720 |
| 16 | 부산 | 2018.0 | 2159 | 2168 |
| 17 | 부산 | 2019.0 | 3205 | 3215 |
| 18 | 부산 | 2020.0 | 3508 | 3508 |
| 19 | 부산 | 2021.0 | 3829 | 3836 |
| 20 | 서울 | 2017.0 | 6069 | 6117 |
| 21 | 서울 | 2018.0 | 7967 | 8000 |
| 22 | 서울 | 2019.0 | 10576 | 10596 |
| 23 | 서울 | 2020.0 | 10612 | 10631 |
| 24 | 서울 | 2021.0 | 10752 | 10796 |
| 25 | 울산 | 2017.0 | 541 | 541 |
| 26 | 울산 | 2018.0 | 651 | 654 |
| 27 | 울산 | 2019.0 | 996 | 998 |
| 28 | 울산 | 2020.0 | 1137 | 1138 |
| 29 | 울산 | 2021.0 | 1046 | 1048 |
| 30 | 인천 | 2017.0 | 1319 | 1318 |
| 31 | 인천 | 2018.0 | 1817 | 1835 |
| 32 | 인천 | 2019.0 | 2718 | 2731 |
| 33 | 인천 | 2020.0 | 2886 | 2892 |
| 34 | 인천 | 2021.0 | 2891 | 2898 |
join_dat.to_csv("../음식_사업장.csv", index = False)
이렇게 1일차, 2일차에 사용한 데이터를 생성 할 수 있다.