일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 순열
- 등차수열
- 기계학습
- 스터디노트
- Slicing
- DataFrame
- 통계학
- MacOS
- SQL
- numpy
- plt
- 파이썬
- 재귀함수
- Machine Learning
- pandas
- 머신러닝
- 자료구조
- 조합
- barh
- INSERT
- Folium
- pandas 메소드
- 리스트
- 등비수열
- pandas filter
- maplotlib
- python
- 문제풀이
- matplotlib
- tree.fit
Archives
- Today
- Total
코딩하는 타코야끼
[스터디 노트] Week7_3일차 [unit_1 ~ 12] - EDA(인구 분석) 본문
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
반응형
'zero-base 데이터 취업 스쿨 > 스터디 노트' 카테고리의 다른 글
[스터디 노트] Week8_2일차 [basic_5 ~ 7] - SQL (0) | 2023.08.23 |
---|---|
[스터디 노트] Week8_1일차 [basic_1 ~ 4] - SQL (0) | 2023.08.23 |
[스터디 노트] Week7_2일차 [unit_1 ~ 7] - EDA(Naver API) (0) | 2023.08.18 |
[스터디 노트] Week7_1일차 [Prophet] - EDA(시계열 분석) (0) | 2023.08.16 |
[스터디 노트] Week6_3일차 [unit1 ~ 13] - EDA(유가 분석) (2) | 2023.08.16 |