코딩하는 타코야끼

[스터디 노트] Week7_3일차 [unit_1 ~ 12] - EDA(인구 분석) 본문

zero-base 데이터 취업 스쿨/스터디 노트

[스터디 노트] Week7_3일차 [unit_1 ~ 12] - EDA(인구 분석)

가스오부시 2023. 8. 18. 00:15
728x90
반응형

1. 인구소멸위기지역 파악하기 진행

  • 인구 소명 위기 지역 파악
  • 지도 표현에 대한 카르토그램 표현

❗️ 메모

  • folium을 활용한 지역 경계선 json 파일은 꼭, 고유한 ID 역할을 하는 것이 있어야 한다.
  • json 파일이 준비되었다면, 인구현황 데이터에도 ID가 필요아하다.
  • 추후 Cartogram으로 그릴때도 ID를 동일하게 맞추면 좋다.

2. 소멸위기지역 파악

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

population.head()


📍 누락된 값 채우기

  • method="pad": 이 옵션은 "pad" 또는 "ffill"로도 알려져 있으며, 이전의 값으로 누락된 값을 채우라는 의미입니다
population.fillna(method="pad", inplace=True)
population.head()


📍  컬럼 이름 바꾸기

population.rename(
    columns={"행정구역(동읍면)별(1)": "광역시도",
            "행정구역(동읍면)별(2)": "시도",
            "계": "인구수"}, inplace=True)
population.head()


📍  소계 제거

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


📍  ’구분’ Values의 값 변경

  • population.loc[population["구분"] == "총인구수", "구분"]: 이 코드는 "구분" 열의 값이 "총인구수"인 행들의 "구분" 열에 접근합니다.
  • = "합계": 이 부분은 앞서 언급한 행과 열의 위치에 있는 값을 "합계"로 변경하는 부분입니다.
population.rename(
    columns={"항목": "구분"}, inplace=True)

population.loc[population["구분"] == "총인구수 (명)",  "구분"] = "합계"
population.loc[population["구분"] == "남자인구수 (명)", "구분"] = "남자"
population.loc[population["구분"] == "여자인구수 (명)", "구분"] = "여자"

population.head()

📍  소멸지역을 조사하기 위한 데이터를 만들기

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+"]
)

population.head(10)


📍  원하는 데이터로만 정리

pop = pd.pivot_table(
    population, index = ["광역시도", "시도"], columns = "구분",
		values = ["20 ~ 39세", "65세이상", "인구수"])
pop["소멸비율"] = pop["20 ~ 39세", "여자"] / (pop["65세이상", "합계"] / 2)
pop["소멸위기지역"] = pop["소멸비율"] < 1.0
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()


3. 각 지역 'ID' 만들기

  • ID 지정
    • 서울 중구
    • 서울 서초
    • 통영
    • 남양주
    • 포항 북구
    • 인천 남동
    • 안양 만안
    • 안양 동안
    • 안산 단원
si_name = [None] * len(pop)

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

pop["광역시도"].unique()
>>>
array(['강원도', '경기도', '경상남도', '경상북도', '광주광역시', '대구광역시', '대전광역시', '부산광역시',
       '서울특별시', '세종특별자치시', '울산광역시', '인천광역시', '전라남도', '전라북도', '제주특별자치도',
       '충청남도', '충청북도'], dtype=object)
for idx, row in pop.iterrows():
    
    # ex) 강릉시 -> 강릉, 춘천시 -> 춘천 이런식으로 전환
    if row["광역시도"][-3:] not in ["광역시", "특별시", "자치시"]:
        si_name[idx] = row["시도"][:-1]
        
    # 세종시는 따로 빼서 넣는다   
    elif row["광역시도"] == "세종특별자치시":
        si_name[idx] = "세종"
        
    # ex) 강남구 -> 강남 과 같이 정리
    else:
        if len(row["시도"]) == 2:
            si_name[idx] = row["광역시도"][:2] + " " + row["시도"]
        else:
            si_name[idx] = row["광역시도"][:2] + " " + row["시도"][:-1]

📍  행정구에 대해 특별시 다시 계산

# 행정구에 대해 특별시 다시 계산
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]

📍  특별히 고성군에 대해 한 번 더 신경써준다.

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] = "고성(경남)"

📍  ‘ID’ 컬럼 생성

pop["ID"] = si_name
pop.head()


4. 시각화

import folium
import json

pop_folium = pop.set_index("ID")
pop_folium.head()


⚡️ 인구수 합계 Mapping

geo_path = "./자료/data/07_skorea_municipalities_geo_simple.json"
geo_str = json.load(open(geo_path, encoding="utf-8"))

mymap = folium.Map(location=[36.2002, 127.054], zoom_start=7)
folium.Choropleth(
    geo_data=geo_str,
    data=pop_folium["인구수합계"],
    columns=[pop_folium.index, pop_folium["인구수합계"]],
    fill_color="YlGnBu",
    key_on="feature.id"
).add_to(mymap)

mymap


⚡️ 소멸위기지역 Mapping

mymap = folium.Map(location=[36.2002, 127.054], zoom_start=7)
folium.Choropleth(
    geo_data=geo_str,
    data=pop_folium["소멸위기지역"],
    columns=[pop_folium.index, pop_folium["소멸위기지역"]],
    fill_color="PuRd",
    key_on="feature.id"
).add_to(mymap)

mymap

반응형