목표
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문을 이용해 정리를 마친 뒤 소멸위기지역 계산에 필요가 없는 컬럼들을 삭제해준다.
'Data Analysis' 카테고리의 다른 글
예제 6. 유가데이터분석 (0) | 2022.12.11 |
---|---|
예제 5. 이디야는 스타벅스 근처에 위치한다 ? (1) | 2022.11.29 |
예제 3-2. 시카고 맛집 하위페이지 데이터 분석 + 지도 시각화 (0) | 2022.11.23 |
예제 3-1. 시카고 맛집 메인페이지 데이터 분석 (0) | 2022.11.21 |
예제 2. 위키백과 문서 정보 가져오기 (0) | 2022.11.20 |