[TIL] 2024-07-28 (folium 지도 만들기)TIL/2024.072024. 7. 28. 20:34
Table of Contents
728x90
Today I Learned (2024-07-28) 🤔
목차
오늘 공부한 내용 🧑🏻💻
1. Doit! 쉡게 배우는 파이썬 데이터 분석 (도서)
지도 데이터 시각화 - 시군구별 인구 단게 분포도 만들기
- 단계 구분도란?
- 지역별 통계치를 색깔 차이로 표현한 지도
- 단계 구분도를 만들면 인구나 소득 같은 통계치가 지역별로 어떻게 다른지 쉽게 이해할 수 있다.
- 단계 구분도를 만들려면 위도, 경도 좌표가 있는 지도 데이터가 필요하다.
- 데이터
SIG.geojson
: 시군구별 경계 좌표Population_SIG.csv
: 시군구별 인구 통계 데이터KOSIS 통계청 데이터
행정구역_시군구_별_주민등록세대수_20240728105926. csv
sig.json
- .geojson 이란?
- 위치 정보를 JSON 포맷으로 저장한 표준 지리 정보 데이터 포맷이다.
- 딕셔너리 자료 구조로 되어 있다.
SIG_CD
: 지역을 나타내는 행정 구역 코드geometry
: 시군구의 경계를 나타낸 위도, 경도 좌표
1. 데이터 준비하기
시군구별 경계 지도 데이터
- 책에서 제공해주는 데이터보다는 제일 최신 데이터를 사용하고 싶었기 때문에
웹 기반 공간정보 서비스 GEOSERVICE-WEB
에서 데이터를 얻어왔다. - 하지만,
.json
이나.geojson
확장자가 아니기 때문에 변환이 필요했다. mapshaper
사이트를 통해서 변환을 했다.
- 책에서 제공해주는 데이터보다는 제일 최신 데이터를 사용하고 싶었기 때문에
시군구별 인구 데이터
- 인구 데이터도 최신 데이터를 사용하기 때문에
KOSIS
에서 2024년 6월 자료를 받아서 사용했다.
- 인구 데이터도 최신 데이터를 사용하기 때문에
2. 데이터 사용하기
시군구별 경계 지도 데이터
import json geo = json.load(open("../data/SIG.json", encoding="utf-8"))
시군구별 인구 데이터
import pandas as pd # 데이터 불러오기 df = pd.read_csv("../data/행정구역_시군구_별_주민등록세대수_20240728105926.csv")
컬럼명 변경
M202406 2024.06
→pop
# 컬럼명 변경 (M202406 2024.06 -> pop) df = df.rename(columns={"M202406 2024.06": "pop"})
인구수가 0이 행 제거
# 인구수가 0인 곳 제거
df_filtered = df[df["pop"] != 0]
- 지역코드와 지역 분리 (code / region)
# 지역코드와 지역 분리 (code / region)
df_filtered.loc[:, "code"] = df_filtered.loc[:, "A 행정구역(시군구)별"].str.split(
" ", expand=True
)[0]
df_filtered.loc[:, "region"] = df_filtered.loc[:, "A 행정구역(시군구)별"].str.split(
" ", expand=True
)[1]
- 필요 없는 컬럼 삭제 및 전국 행 삭제
# 컬럼 삭제
df_filtered.drop(columns=["A 행정구역(시군구)별"])
# 전국 행 삭제
df_filtered.drop(0, axis='index',inplace=True)
- 컬럼 순서 변경
# 컬럼 순서 변경
df_filtered = df_filtered[["code", "region", "pop"]]
df_filtered
code region pop
1 11 서울특별시 4486014
2 11110 종로구 72394
3 11140 중구 65273
4 11170 용산구 104187
5 11200 성동구 133233
... ... ... ...
288 48880 거창군 31219
289 48890 합천군 23895
290 50 제주특별자치도 314321
291 50110 제주시 225423
292 50130 서귀포시 88898
3. 단계 구분도 만들기
folium 설치
- folium : 파이썬을 위한 지도 시각화 라이브러리
기본 맵
import folium
folium.Map(location=[35.97, 127.7], zoom_start=8) # 지도 중심 좌표 # 확대 단계
- 지도 종류 변경
map_sig = folium.Map(
location=[35.95, 127.1], # 지도 중심 좌표
zoom_start=8, # 확대 단계
tiles="cartodbpositron", # 지도 종류
)
map_sig
- 구분도 만들기
# folium.Choropleth()
# geo_data : 지도 데이터
# data : 색깔로 표현할 통계 데이터
# columns : 통계 데이터의 행정 구역 코드 변수, 색깔로 표현할 변수
# key_on : 지도 데이터의 행정 구역 코드
folium.Choropleth(
geo_data=geo,
data=df_filtered,
columns=("code", "pop"),
key_on="feature.properties.SIG_CD",
).add_to(map_sig)
map_sig
- 계급 구간 정하기
quantile()
를 이용해 분위수를 구해서 지역 인구수에 따른 색깔 구분을 해준다.
bins = list(df_filtered['pop'].quantile([0,0.2,0.4,0.6,0.8,1]))
folium.Choropleth(
geo_data=geo, # 지도 데이터
data=df_filtered, # 통계 데이터
columns=('code','pop'), # df_filtered 의 행정 구역 코드, 인구
key_on='feature.properties.SIG_CD', # geo 행정 구역 코드
fill_color='YlGn', # 컬러맵
fill_opacity=0.7, # 투명도
line_opacity=0.5, # 경계선 투명도
bins = bins, # 계급 구간 기준값
legend_name='인구수' # 범례
).add_to(map_sig)
map_sig
어려웠던 내용 📚
- 데이터를 직접 찾고 처리하는 과정
궁금한 내용과 부족한 내용 🙋🏻
- 데이터들의 구조?
느낀 점 💡
- kdt 에서 배웠던 folium 을 다시 써볼 수 있는 기회여서 좋았다.
'TIL > 2024.07' 카테고리의 다른 글
[TIL] 2024-07-30 (미니프로젝트) (0) | 2024.07.31 |
---|---|
[TIL] 2024-07-29 (통계 분석 기법) (0) | 2024.07.30 |
[TIL] 2024-07-27 (텍스트 마이닝) (0) | 2024.07.27 |
[TIL] 2024-07-26 (특강) (0) | 2024.07.27 |
[TIL] 2024-07-25 (데이터 시각화) (0) | 2024.07.26 |
@maneDataLab :: 마네의 데이터랩
배움에 즐거움을 느끼는 마네의 데이터랩 이미지 출처 : https://www.instagram.com/hoseobiiiiiii._.0410/
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!