[Python] 지방재정/지방행정 연구를 위한 데이터 전처리 – 파트 2: 고령인구비율 전처리

<이전 글>에서 설정한 가설을 검증하기 위해 아래와 같은 형태의 데이터를 구축하기로 했습니다. 이번 글에서는 고령인구비율(%)를 다른 데이터와 합(merge 혹은 join)칠 수 있도록 전처리하겠습니다.

고령인구비율 데이터 다운로드

제가 사용할 데이터는 통계청 국가통계포털(KOSIS)에서 제공하는 ‘고령인구비율(시도/시/군/구)’입니다. 저와 동일한 데이터를 사용하고 싶으신 분이 계시다면, 아래 링크에서 다운로드할 수 있도록 올려놓았습니다.

다운로드 받은 고령인구비율(시도/시/군/구) 데이터

통계청에서 고령인구비율 통계를 처음 조회하면, 아래와 같은 형태의 데이터를 볼 수 있습니다. KOSIS는 데이터를 다운로드하기 전 조회항목이나 형태를 변형할 수 있으므로, 위처럼 가공이 편한 long 데이터 형태로 변환해서 다운로드했습니다.

KOSIS e-지방지표(주제별) 고령인구비율(시도/시/군/구)

다운받은 데이터 전처리

제가 사용한 파이썬 버전은 3.11.8입니다. 처음 파이썬을 사용하시면, 환경에 따라, 아래 코드를 실행하는데 pandasopenpyxl 라이브러리를 설치하셔야 할 수도 있습니다.

1. 데이터 불러오기

이제 다운받은 데이터를 활용할 수 있도록 파이썬에서 전처리하도록 하겠습니다. 고령인구비율 데이터는 파이썬 파일 기준으로 폴더 rawdata 안에 있습니다.

import pandas as pd

# 데이터 불러오기
df = pd.read_excel("rawdata/고령인구비율_시도_시_군_구__20240219021748.xlsx")
Code language: PHP (php)

엑셀 데이터를 pandas를 이용해서 불러옵니다. import pandas as pd로 판다스 라이브러리를 불러오고, df에 다운로드 받은 엑셀 데이터를 데이터프레임으로 옮겨줍니다. 그럼 데이터프레임은 아래와 같이 생겼습니다.

처음 불러온 고령인구비율 데이터

2. 데이터 정리

다른 데이터와 통합해서 사용할 수 있도록 key가 될 ‘자치단체명’ 컬럼을 만들어줘야 합니다. 현재는 서울특별시, 경기도, 충청북도, 제주특별자치도 처럼 긴 이름으로 되어있는 ‘행정구역별(1)’ 컬럼을 서울, 경기, 충북, 제주 등 2글자로 수정하도록 하겠습니다. 그 전에 컬럼명을 보기 쉽게 변경하고 진행하겠습니다.

# 컬럼 수정하기
df.columns = [
    "시도",
    "시군구",
    "시점",
    "고령인구비율(%)",
    "65세이상인구(명)",
    "전체인구(명)",
]
Code language: PHP (php)

그 다음은 변형할 광역자치단체명을 사전(dict) 형태로 만들어줍니다. 그리고 ‘시도’ 컬럼에 replace 함수를 사용해서 변환해줍니다.

# 시도의 형태 변형하기
sido_mapping = {
    "전국": "전국",
    "서울특별시": "서울",
    "부산광역시": "부산",
    "대구광역시": "대구",
    "인천광역시": "인천",
    "광주광역시": "광주",
    "대전광역시": "대전",
    "울산광역시": "울산",
    "세종특별자치시": "세종",
    "경기도": "경기",
    "강원특별자치도": "강원",
    "강원도": "강원",
    "충청북도": "충북",
    "충청남도": "충남",
    "전라북도": "전북",
    "전라남도": "전남",
    "경상북도": "경북",
    "경상남도": "경남",
    "제주특별자치도": "제주",
}


# 불필요한 공백 제거 및 지역명 매핑
df["시도"] = df["시도"].replace(sido_mapping)
Code language: PHP (php)

다음으로 불필요한 데이터를 제거합니다. 저는 이번 연구에서 “전국” 데이터나 ‘시군구’ 중 “소계” 데이터는 필요가 없습니다.

# 시도가 전국이거나, 시군구가 소계인 경우 제외하기
df = df[~((df['시도'] == '전국') | (df['시군구'] == '소계'))]
Code language: PHP (php)

3. 필요한 변수 생성 및 저장

이제 필요한 변수(자치단체명)를 생성하고, 원하는 컬럼만 추출해서 저장하면됩니다. 파이썬에서 계속 사용하기 위해 데이터를 저장할 때, 주로 pickle을 사용하지만, 여기서는 엑셀로 저장하도록 하겠습니다.

우선 필요한 변수를 생성합니다. 간단하게 문자열 변수를 더하면 됩니다.

# 시도와 시군구 합쳐서 자치단체명 만들기
df["자치단체명"] = df["시도"] + df["시군구"]
Code language: PHP (php)

그리고, 필요한 컬럼만 뽑아서 새로운 데이터프레임(foo)을 만들고 엑셀로 저장합니다.

# 필요한 컬럼만 추출하기
foo = df[
    [
        "시도",
        "자치단체명",
        "시점",
        "고령인구비율(%)",
        "65세이상인구(명)",
        "전체인구(명)",
    ]
]

# 엑셀로 저장하기
foo.to_excel("output/고령인구.xlsx", index=False)Code language: PHP (php)

이렇게 필요한 데이터 중 고령인구비율 데이터 전처리 과정이 끝났습니다. 다른 데이터와 통합에 사용할 key가 되는 연도(시점)별 자치단체명을 생성했습니다. 고령인구비율(%) 변수 자체는 우리가 원하는 형태로 제공되고 있어서 별다른 작업은 필요 없었습니다. 다른 데이터(예산집행률, 정당 일치 여부 등)는 필요한 변수 생성을 위해 가공할 것들이 많습니다.

다음에는 종속변수인 예산집행률 데이터를 전처리하는 과정에 대해서 다뤄보겠습니다. 아래는 오늘 사용한 코드 전문입니다.

전체코드

import pandas as pd

# 데이터 불러오기
df = pd.read_excel("rawdata/고령인구비율_시도_시_군_구__20240219021748.xlsx")

# 컬럼 수정하기
df.columns = [
    "시도",
    "시군구",
    "시점",
    "고령인구비율(%)",
    "65세이상인구(명)",
    "전체인구(명)",
]

# 시도의 형태 변형하기
sido_mapping = {
    "전국": "전국",
    "서울특별시": "서울",
    "부산광역시": "부산",
    "대구광역시": "대구",
    "인천광역시": "인천",
    "광주광역시": "광주",
    "대전광역시": "대전",
    "울산광역시": "울산",
    "세종특별자치시": "세종",
    "경기도": "경기",
    "강원특별자치도": "강원",
    "강원도": "강원",
    "충청북도": "충북",
    "충청남도": "충남",
    "전라북도": "전북",
    "전라남도": "전남",
    "경상북도": "경북",
    "경상남도": "경남",
    "제주특별자치도": "제주",
}


# 불필요한 공백 제거 및 지역명 매핑
df["시도"] = df["시도"].replace(sido_mapping)

# 시도가 전국이거나, 시군구가 소계인 경우 제외하기
df = df[~((df["시도"] == "전국") | (df["시군구"] == "소계"))]

# 시도와 시군구 합쳐서 자치단체명 만들기
df["자치단체명"] = df["시도"] + df["시군구"]

# 필요한 컬럼만 추출하기
foo = df[
    [
        "시도",
        "자치단체명",
        "시점",
        "고령인구비율(%)",
        "65세이상인구(명)",
        "전체인구(명)",
    ]
]

# 엑셀로 저장하기
foo.to_excel("output/고령인구.xlsx", index=False)
Code language: PHP (php)

댓글 남기기