인구소멸위기지역 파악
65세 이상 노인인구와 20~39세 여성인구를 비교해서
젊은 여성인구가 노인 인구의 절반에 미달할 경우 '소멸위험지역' 으로 분류
불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager
from matplotlib import rc
import warnings
warnings.filterwarnings(action="ignore")
%matplotlib inline
get_ipython().run_line_magic("matplotlib", "inline")
rc("font", family= "Malgun Gothic")
population = pd.read_excel("../data/07_population_raw_data.xlsx",header=1)
population.fillna(method="pad",inplace=True)
population
*fillna()
pad와 backfill : pad,ffill는 NaN값의 앞에 값을 보고 NaN값을 채워주고 backfill은 뒤의 값으로 채움
axis 설정 시 가로축 기준으로 채울 수 도 있음
컬럼 이름 변경
# 컬럼 이름 변경
population.rename(
columns={
"행정구역(동읍면)별(1)":"광역시도",
"행정구역(동읍면)별(2)":"시도",
"계" : "인구수"
},inplace = True)
population.tail()
# 소계 제거
population = population[population["시도"] != "소계"]
population.head()
# 항목 -> 구분으로 변경
population.is_copy = False
population.rename(
columns={"항목" : "구분"},inplace=True)
# 남,여 인구수 데이터 정리
population.loc[population["구분"]=="총인구수 (명)","구분"] = "합계"
population.loc[population["구분"]=="남자인구수 (명)","구분"] = "남자"
population.loc[population["구분"]=="여자인구수 (명)","구분"] = "여자"
소멸지역 조사 데이터
청년층/ 노년층 구분
# 소멸지역 조사 데이터
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
소멸 비율 계산 및 위기지역 컬럼 생성
# 소멸비율 계산
pop["소멸비율"] = pop["20-39세","여자"]/(pop["65세 이상","합계"] /2)
# 소멸 위기지역
pop["소멸위기지역"] = pop["소멸비율"]<1.0
pop
인구현황 데이터에 지도 ID 만들기
소멸위기지역 조회
# 소멸 위기지역 조회, index 수정
pop[pop["소멸위기지역"]==True].index.get_level_values(1)
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()
지도 시각화를 위한 ID 만들기
si_name = [None] * len(pop)
tmp_gu_dict = {
"수원" : ["장안구","권선구","팔달구","영통구"],
"성남" : ["수정구", "중원구","분당구"],
"안양" : ["만안구", "동안구"],
"안산" : ["상록구", "단원구"],
"고양" : ["덕양구", "일산동구", "일산서구"],
"용인" : ["처인구", "기흥구", "수지구"],
"청주" : ["상당구", "서원구", "흥덕구", "청원구"],
"천안" : ["동남구", "서북구"],
"전주" : ["완산구", "덕진구"],
"포항" : ["남구", "북구"],
"창원" : ["의창구", "성산구", "진해구", "마산함포구", "마산회원구"],
"부천" : ["오정구", "원미구", "소사구"],
(1) 일반 시 이름과 세종시, 광역시도 일반구 정리
for idx,row in pop.iterrows():
if row ["광역시도"][-3:] not in ["광역시", "특별시", "자치시"]:
si_name[idx]=row["시도"][:-1] #광역시 등이 아니면 마지막 글자 빼고 저장해라
elif row["광역시도"] == "세종특별자치시":
si_name[idx]="세종"
else:
if len(row["시도"])==2:
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] = "고성(경남)"
필요없는 데이터 제외하기
del pop["20-39세남자"]
del pop["65세 이상남자"]
del pop["65세 이상여자"]