본문 바로가기
Data Analysis

예제 4. 인구 소멸 위기 지역

by ram_ 2022. 11. 28.

목표

01. 인구 소멸 위기 지역 파악
02. 인구 소멸 위기 지역의 지도 표현
03. 지도 표현에 대한 카르토그램 표현


 

Step 01.  데이터 읽기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import set_matplotlib_hangul
import warnings

warnings.filterwarnings(action="ignore")
%matplotlib inline

기본 세팅을 해준다.

 

# 엑셀 파일 확인하니 칼럼이 2줄 사용중이라 header = 1 설정
population = pd.read_excel("../ds_study/data/07_population_raw_data.xlsx", header=1) 

# nan값 삭제
population.fillna(method="pad", inplace=True)
population

엑셀 파일을 불러오고, fillna(method="pad", inplace=True)를 사용하여 nan값을 그 앞 데이터로 채워준 뒤, 저장해준다.

fillna에 관한 자세한 예제와 설명은 07.Population.ipynb 파일에 기록해두었다.

 

# 컬럼 이름 변경
population.rename(
    columns={
        "행정구역(동읍면)별(1)" : "광역시도",
        "행정구역(동읍면)별(2)" : "시도",
        "계" :"인구수"    
    }, inplace=True)

population.head()

# 소계 제거
population = population[population["시도"] != "소계"]
population.head()

# copy 했을 때 warning 내보내지 말라는 문구
population.is_copy = False

population.rename(
    columns={"항목" : "구분"}, inplace=True)
    
# loc는 컴마를 기준으로 앞은 행, 뒤는 열 
population.loc[population["구분"]== "총인구수 (명)","구분"] = "합계"
population.loc[population["구분"]== "남자인구수 (명)","구분"] = "남자"
population.loc[population["구분"]== "여자인구수 (명)","구분"] = "여자"

칼럼과 data의 내용을 정리 재정렬 해준다.

 


Step 02. 인구소멸지역 계산하기

# 소멸지역을 조사하기 위한 데이터 조사
population["20-39세"] = (
    population["20 - 24세"] + population["25 - 29세"]+ population["30 - 34세"] +population["35 - 39세"]
)
population["65세 이상"] = (
    population["65 - 69세"] + population["70 - 74세"] + population["75 - 79세"] +
    population["80 - 84세"] + population["85 - 89세"] + population["90 - 94세"] +
    population["95 - 99세"] + population["100+"]
)


# pivot_table
pop = pd.pivot_table(
    data = population, 
    index = ["광역시도", "시도"],
    columns= ["구분"],
    values= ["인구수", "20-39세", "65세 이상"]
)
pop

소멸지역을 조사하기 위해 청년층과 노년층을 분리하여 새로운 컬럼을 만들어준다.

pivot_table을 사용하여 새로운 dataFrame을 생성한다. 원래 파일에서 필요한 index와 columns, value만 뽑아온다.

 

# 소멸 비율 계산
pop["소멸비율"] = pop["20-39세", "여자"] / (pop["65세 이상", "합계"] / 2)
pop.head()


# 소멸위기지역 컬럼 생성
pop["소멸위기지역"] = pop["소멸비율"] < 1.0
pop

기준에 소멸비율을 계산하는 방법을 참고하여 계산한 뒤, 새로운 칼럼으로 만들어준다. 

소멸위기지역 칼럼을 새로이 만들어 True, False로 표기되도록 한다.

 

# 구분 인덱스 생성
pop.reset_index(inplace=True)
pop.head()


# 멀티컬럼 정리 첫번째줄 + 두번째줄
tmp_columns = [
    pop.columns.get_level_values(0)[n] + pop.columns.get_level_values(1)[n]
    for n in range(0, len(pop.columns.get_level_values(0)))
]

pop.columns = tmp_columns
pop.head()

기존 인덱스를 reset 해준다. 

기존 컬럼이 2줄로 되어있어 첫번째 줄과 두번째 줄의 정보를 합쳐준다.

.get_level_values로  0번째 인덱스의 n번째값과 1번째 인덱스의 n번째값을 합쳐준다.

tmp_columns를 기존 dataFrame에 할당해준다.


Step 03. 지도 시각화를 위한 지역별 ID 생성

si_name = [None] * len(pop)
si_name

tmp_gu_dict = {
    "수원" : ["장안구", "권선구", "팔달구", "영통구"],
    "성남" : ["수정구", "중원구", "분당구"],
    "안양" : ["만안구", "동안구"],
    "안산" : ["상록구", "단원구"],
    "고양" : ["덕양구", "일산동구", "일산서구"],
    "용인" : ["처인구", "기흥구", "수지구"],
    "청주" : ["상당구", "서원구", "흥덕구", "청원구"],
    "천안" : ["동남구", "서북구"],
    "전주" : ["완산구", "덕진구"],
    "포항" : ["남구", "북구"],
    "창원" : ["의창구", "성산구", "진해구", "마산항포구", "마산회원구"],
    "부천" : ["오정구", "원미구", "소사구"],
     
}

 

  • 만들고자 하는 ID의 형태
    • 서울 중구
    • 서울 서초
    • 통영
    • 남양주
    • 안양 만안
    • 인천 남동

(1) 일반 시 이름과 세종시, 광역시도 일반 구 정리

for idx, row in pop.iterrows():
    if row["광역시도"][-3:] not in ["광역시", "특별시", "자치시"]:
        si_name[idx] = row['시도'][:-1]   # ex)만안
    
    elif row["광역시도"] == "세종특별자치시" :
        si_name[idx] = "세종"
    
    else :
        if len(row["시도"]) == 2:  # ex)서구 중구
            si_name[idx] = row["광역시도"][:2] + " " + row["시도"] #서울 중구
        else : 
            si_name[idx] = row["광역시도"][:2] + " " + row["시도"][:-1] # 서울 경산

(2) 행정구

for idx, row in pop.iterrows():
    if row["광역시도"][-3:] not in ["광역시", "특별시", "자치시"]:
        for keys, values in tmp_gu_dict.items():
            if row["시도"] in values : 
                if len(row["시도"]) == 2:
                    si_name[idx] = keys + " " + row["시도"]
                elif row["시도"] in ["마산합포구", "마산회원구"]:
                        si_name[idx] = keys + " " + row["시도"][2:-1] #합포 만 뽑고싶어서
                else : 
                    si_name[idx] = keys + " " + row["시도"][:-1]

(3) 고성군

for idx, row in pop.iterrows():
    if row["광역시도"][-3:] not in ["광역시", "특별시", "자치시"]:
        if row["시도"][:-1]== "고성" and row["광역시도"] == "강원도" : 
            si_name[idx] = "고성(강원)"
        elif row["시도"][:-1] == "고성" and row["광역시도"] == "경상남도" :
            si_name[idx] = "고성(경남)"

pop["ID"] = si_name

del pop["20-39세남자"]
del pop["65세 이상남자"]
del pop["65세 이상여자"]

for문과 if문을 이용해 정리를 마친 뒤 소멸위기지역 계산에 필요가 없는 컬럼들을 삭제해준다.