MakeBaseTable.ipynb
Download Notebook

Base Table 만들기

0. 라이브러리 설치 및 데이터 불러오기

In [32]:
# 필요 라이브러리 설치
import numpy as np
import pandas as pd
In [50]:
# 데이터 load
data = pd.read_csv('main_data.csv')
/var/folders/sy/5dw5r1ys5fdb3h0gbq8x0g6m0000gn/T/ipykernel_47971/1248266004.py:2: DtypeWarning: Columns (2,4,5,8,13,16,17,18,19,24) have mixed types. Specify dtype option on import or set low_memory=False.
  data = pd.read_csv('main_data.csv')
In [9]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 861719 entries, 0 to 861718
Data columns (total 25 columns):
 #   Column     Non-Null Count   Dtype  
---  ------     --------------   -----  
 0   소관부처명      861666 non-null  object 
 1   법령명        861702 non-null  object 
 2   법령구분       861704 non-null  object 
 3   조번호        861129 non-null  object 
 4   항번호        666590 non-null  object 
 5   호번호        504904 non-null  object 
 6   조문제목       805869 non-null  object 
 7   조문         848856 non-null  object 
 8   사무판단       767124 non-null  object 
 9   사무판단근거     700871 non-null  object 
 10  사무명        60113 non-null   object 
 11  수행주체       60116 non-null   object 
 12  사무유형       60071 non-null   object 
 13  위임사무판단     761139 non-null  object 
 14  위임근거규정     5311 non-null    object 
 15  수임기관       4416 non-null    object 
 16  특행기관       93089 non-null   object 
 17  재위임사무판단    702502 non-null  object 
 18  재위임근거규정    54 non-null      object 
 19  재수임기관      13 non-null      object 
 20  위탁사무판단     758703 non-null  float64
 21  위탁근거규정     3975 non-null    object 
 22  수탁기관       3952 non-null    object 
 23  사무유형(소분류)  60114 non-null   object 
 24  기타         3 non-null       object 
dtypes: float64(1), object(24)
memory usage: 164.4+ MB

1. 데이터 전처리

1) 설명변수(소관부처명, 법령명, 조번호, 항번호, 호번호, 조문제목, 조문)가 모두 결측치인 행 삭제

In [51]:
def x_null_drop(df): 
    select_column = ['소관부처명', '법령명', '조번호', '항번호', '호번호', '조문제목', '조문']
    delete_row_idx = list(df[df[select_column].isnull().all(axis = 1)].index)
    delete_row_idx.sort(reverse = True)
    for i in delete_row_idx:
        df = df.drop([i],axis = 0)
    return df
In [52]:
data = x_null_drop(data)
(861711, 25)

2) 소관부처명 결측치 처리

  • 소관부처명 결측치: 45개
  • 동일한 법령에 대해서는 동일한 소관부처를 가짐
  • 이에, 다른 행 중 동일한 법령을 지닌 소관부처 파악 후 결측치 채워줌
In [53]:
def dep_law_preprocessing(df):
        # department_idx: '법령명'은 채워져있는데 '소관부처명'은 채워져있지 않은 행의 index
        department_idx = df[df['소관부처명'].isnull() & df['법령명'].notnull()].index
        # department_name_list: '소관부처명'이 채워져야할 법령명
        department_name_list = df[df['소관부처명'].isnull() & df['법령명'].notnull()]['법령명'].unique()

        department_dic = {}
        department_dic['건설산업기본법'] = '국토교통부'
        department_dic['보건범죄단속에관한특별조치법시행령'] = '보건복지부'
        department_dic['항로표지법'] = '해양수산부'
        department_dic['수산자원관리법'] = '해양수산부'
        department_dic['연안관리법'] = '해양수산부'
        department_dic['야생생물 보호 및 관리에 관한 법률'] = '환경부'

        for i in range(len(department_idx)):
                for j in range(len(department_name_list)):
                        df.loc[department_idx[i],'소관부처명'] = department_dic[department_name_list[j]]

        # '소관부처명', '법령명' 모두 채워져있지 않은 행
        
        return df
In [54]:
data = dep_law_preprocessing(data)

3) 법령명 결측치 처리

  • 조, 항, 조문 통해 법령명 찾아 삽입
In [55]:
def law_name_preprocessing(df):
    idx = 14168
    df.loc[idx,'소관부처명'] = '고용노동부'
    df.loc[idx,'법령명'] = '근로자퇴직급여 보장법'
    df.loc[idx,'법령구분'] = 1

    idx = 198519
    df.loc[idx,'소관부처명'] = '국토교통부'
    df.loc[idx,'법령명'] = '택수운송사업의 발전에 관한 법률'
    df.loc[idx,'법령구분'] = 1
    df.loc[idx,'조번호'] = 11
    df.loc[idx,'항번호'] = 1
    df.loc[idx,'조문제목'] = '감차계획의 수립 및 시행 등'
    idx = 686791
    df.loc[idx,'소관부처명'] = '해양수산부'
    df.loc[idx,'법령명'] = '수산업ㆍ어촌 공익기능 증진을 위한 직접지불제도 운영에 관한 법률'

    idx = 708300
    df.loc[idx,'소관부처명'] = '해양수산부'
    df.loc[idx,'법령명'] = '해양공간계획 및 관리에 관한 법률'

    idx = 708831
    df.loc[idx,'소관부처명'] = '해양수산부'
    df.loc[idx,'법령명'] = '해양폐기물 및 해양오염퇴적물 관리법'

    idx = 766079
    df.loc[idx,'소관부처명'] = '행정안전부'
    df.loc[idx,'법령명'] = '새마을금고법'

    idx = 859679
    df.loc[idx,'소관부처명'] = '환경부'
    df.loc[idx,'법령명'] = '미세먼지 저감 및 관리에 관한 특별법'

    idx = 859692
    df.loc[idx,'소관부처명'] = '환경부'
    df.loc[idx,'법령명'] = '미세먼지 저감 및 관리에 관한 특별법'

    idx = 859755
    df.loc[idx,'소관부처명'] = '환경부'
    df.loc[idx,'법령명'] = '미세먼지 저감 및 관리에 관한 특별법'
    
    return df
In [56]:
data = law_name_preprocessing(data)

4) 법령구분 처리

  • 법령구분 결측치 처리
  • 법령구분 자료형 int로 통일
In [57]:
def law_category_preprocessing(df):
    # '법령구분'이 결측치인 행들의 index
    null_idx = df[df['법령구분'].isnull()].index
    # 국가법령정보센터 확인 결과, 결측치인 모든 행들은 법률, 즉 '1'에 해당
    for i in null_idx:
        df.loc[i,'법령구분'] = 1
    
    # 국가법령정보센터 확인 결과, '법령구분'이 공백으로 되어있는 행은 시행령, 즉 '2'에 해당
    df.loc[df['법령구분']==' ', "법령구분"] = 2

    # 법령구분 자료형 통일
    df['법령구분'] = df['법령구분'].astype('int64')

    return df
In [58]:
data = law_category_preprocessing(data)

5) 사무판단 처리

  • ’ ’ -> nan, ‘0’ -> 0 , ‘1’ -> 1, ‘0 1’ -> 2 float 형태로 변환
In [65]:
def decision_preprocessing(df):
    # 표기방식 통일
    idx_nan = df[(df['사무판단'] == ' ')].index #idx_nan: '사무판단'이 nan인 행의 index
    for i in idx_nan:
        df.loc[i,'사무판단'] = np.nan
    idx_0 = df[(df['사무판단'] == '0')].index #idx_0: '사무판단'이 '0'인 행의 index
    for i in idx_0:
        df.loc[i,'사무판단'] = 0
    idx_1 = df[(df['사무판단'] == '1')].index #idx_1: '사무판단'이 '1'인 행의 index
    for i in idx_1:
        df.loc[i,'사무판단'] = 1
    idx_2 = df[(df['사무판단'] == '0 1')].index #idx_2: '사무판단'이 '0 1'인 행의 index
    for i in idx_2:
        df.loc[i,'사무판단'] = 2

    # 오류 행 삭제
    ## 경우1: 사무가 아님에도 사무 유형이 분류된 경우
    delete_0_idx = list((df[(df['사무판단'] == 0)  & (df['사무유형(소분류)'].notna())]).index)
    df = df.drop(delete_0_idx, axis = 0)
    
    ## 경우2: 사무임에도 사무 유형이 분류되지 않은 경우
    delete_1_idx1 = list((df[(df['사무판단'] == 1)  & (df['사무유형'].isnull())]).index)
    df = df.drop(delete_1_idx1, axis = 0)
    
    delete_1_idx2 = list((df[(df['사무판단'] == 1)  & (df['사무유형(소분류)'].isnull())]).index)
    df = df.drop(delete_1_idx2, axis = 0)

    # 결측행 처리
    ## 경우1: 사무 유형이 분류된 경우 => '1'로 채움
    change_1_idx = df[(df['사무판단'].isnull())  & (df['사무유형'].notna()) & (df['사무유형(소분류)'].notna())].index
    df.loc[change_1_idx, '사무판단'] = 1
    
    # 경우2: 사무 유형이 분류되지 않은 경우 => '0'으로 채움
    change_0_idx = df[(df['사무판단'].isnull())  & (df['사무유형'].isnull()) & (df['사무유형(소분류)'].isnull())].index
    df.loc[change_0_idx,'사무판단'] = 0
    
    # 자료형 통일
    df['사무판단'] = df['사무판단'].astype('int64')

    return df
In [66]:
data = decision_preprocessing(data)

6) 소관부처명 공백 처리

In [68]:
def blank_preprocessing(df):
    df.loc[df['소관부처명']=="교육부,\n고용노동부", "소관부처명"] = '고용노동부,교육부'
    df.loc[df['소관부처명']=="과학기술정보통신부, \n교육부", "소관부처명"] = '과학기술정보통신부,교육부'
    df.loc[df['소관부처명']=="교육부,\n과학기술정보통신부", "소관부처명"] = '과학기술정보통신부,교육부'
    return df
    
In [69]:
data = blank_preprocessing(data)

7) 조문, 조문 제목 결측치 처리

  • 조문, 조문 제목 null값이면 ’0’으로 채움
In [70]:
def law_preprocessing(df):
    df.loc[df['조문제목'].isna(), '조문제목'] = '0'
    df.loc[df['조문'].isna(), '조문'] = '0'
    return df
In [71]:
data = law_preprocessing(data)