본문 바로가기
Data & Programming/Data Science

[데이터분석] 대한민국 행정구역별 인구현황 시각화

by 눈부셔™ 2023. 9. 28.
728x90

[데이터분석] 대한민국 행정구역별 인구현황 시각화

작년 이맘때쯤 행정구역별 인구현황을 시각화 해보려고 작성했던 코드인데, 보관용으로 남길려고 포스팅 합니다.

지금도 제 피씨엔 최종 코드만 있고 중간작업 파일들은 어디에 뒀는지 안보이네요 ㅡㅡㅋ

기억이 가물거리지만, 우선 생각나는대로만 써보겠습니다.

파이썬 행정구역별 인구현황 시각화

 

관련 라이브러리 import

1
2
3
4
5
6
7
8
9
10
import requests
import json
import pandas as pd
import numpy as np
from pandas.io.json import json_normalize
import os
import webbrowser
import folium
from folium import plugins
print(folium.__version__)  # 0.12.1.post1

 

 

대한민국 행정구역 시각화

행정구역정보 2022.03 기준 (출처 : 지오서비스 공간정보시스템) 

 

파이썬으로 행정구역별 시각화를 위해선 polygon형태의 시군구 지도가 있어야 하는데, 해당 작업을 위해선 시군구의 최신 shp 파일을 구해서, json 형태의 파일로 변경해주어야 합니다.

행정구역정보는 "지오서비스 공간정보시스템"에서 구했었습니다.

변환 작업은 생략하고, 변환된 json 결과물만 올려드리겠습니다. 

혹시 해당과정이 궁금하신분은 방명록에 남겨 주시면, 또다른 포스팅으로 작성해서 올려드리겠습니다.

아래 파일은 2022.03.24기준의 행정구역입니다. 확인해보진 않았지만 그 뒤로 바뀐게 없을 듯 합니다.

SIG_WGS84_20220324.json
1.25MB

1
2
# 본인의 환경에 맞게 수정하시면 됩니다.
state_geo = '/content/drive/MyDrive/작업/data/SIG_WGS84_20220324.json'

전 구글 드라이브에 파일을 올려놓고 , 구글코랩에서 작업했었습니다. 본인의 환경에 맞게 수정하시면 될 것 같습니다.

 

 

인구통계 데이터 로드

통계청 KOSIS 국가통계포털 "행정구역(시군구)별 인구수 자료 활용 (2022.10기준)

 

통계청에서 인구통계 자료를 받았고, 정리한 엑셀파일만 올려드립니다.

Population_202210.xlsx
0.02MB

1
2
3
4
5
6
# 데이터 헤더는 ['CODE', 'POPULATION', 'LOCAL_NAME'] 으로 구성되어 있다. 코드가 숫자로 인식되어 오류가 생기는 경우가 발생하므로 zfill(5) 처리를 해준다.
 
state_data = pd.read_excel("/content/drive/MyDrive/작업/data/Population_202210.xlsx")
state_data.columns = ['CODE''POPULATION''LOCAL_NAME']
state_data['CODE'= state_data.CODE.map(lambda x : str(x).zfill(5))
state_data.head(5)

행정구역별 인구수(2022.10기준)

 

 

행정구역별 인구현황 시각화

컬러는 fill_color 설정을 통해 변경할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
= folium.Map(location=(36.060572704407484128.13569043038126), tiles="OpenStreetMap", zoom_start=7)
 
m.choropleth(
    geo_data=state_geo,
    name='인구수',
    data=state_data,
    columns=['CODE''POPULATION''LOCAL_NAME'],
    key_on='feature.properties.SIG_CD',
    fill_color='YlGn',
    fill_opacity=0.7,
    line_opacity=0.3,
    color = 'gray',
    legend_name = 'Population'
)
 
folium.LayerControl().add_to(m)
m

행정구역별 인구현황 시각화

 

 

 

행정구역별 인구현황 버블맵

choropleth를 통해 영역을 지정하고 색상으로 값을 표현했다면,

CircleMarker을 통해 원의 크기로 값을 표현할 수 있습니다.
버블차트를 구현하기 전에 우선 행정구역별 중심좌표를 구해야 합니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# json 로드
import json
json_data=open(state_geo).read()
jsonResult = json.loads(json_data)
 
# 중앙위치 계산
def center_calc(points_df):
    x = points_df.x
    y = points_df.y
 
    X = (max(x)+min(x))/2.
    Y = (max(y)+min(y))/2.
 
    return X, Y
 
# 다중 Array 구조 이중으로 변환
def points_array(points):
 
    final_points = []
 
    for x in range(0len(points)):
 
        if len(points[x]) == 2:
            final_points.append(points[x])
        else:
            target = points[x]
            for y in range(0len(target)):
                final_points.append(target[y])
 
    return final_points
 
# 구역별 중심 DataFrame 생성
center_locations = pd.DataFrame()
codes = []
names = []
x_list = []
y_list = []
for x in range(0len(jsonResult['features'])):
    code = jsonResult['features'][x]['properties']['SIG_CD']
    name = jsonResult['features'][x]['properties']['SIG_KOR_NM']
    # 중앙값 생성
    points = jsonResult['features'][x]['geometry']['coordinates'][0]
    points = points_array(points)
    points_df = pd.DataFrame(points)
    points_df.columns = ['x','y']
    X, Y = center_calc(points_df)
 
    # 결과
    codes.append(code)
    names.append(name)
    x_list.append(X)
    y_list.append(Y)
 
# 데이터 프레임 생성
center_locations['CODE'= codes
center_locations['NAME'= names
center_locations['X'= x_list
center_locations['Y'= y_list
 
# 위치정보와 인구현황데이터 병합
target_df = pd.merge(state_data,center_locations, how = 'left', on = 'CODE')
target_df = target_df[~np.isnan(target_df['X'])] # 위치 정보 없는 값 제외
 
target_df

행정구역별 좌표

1
2
3
4
5
6
7
8
9
10
11
12
# 버블차트 생성
= folium.Map(location=[36127], tiles="OpenStreetMap", zoom_start=7)
 
# I can add marker one by one on the map
for i in range(0,len(target_df)):
    latitude = target_df.iloc[i]['Y']
    longitude = target_df.iloc[i]['X']
    location=(latitude, longitude)
    folium.CircleMarker(location, radius=target_df.iloc[i]['POPULATION']/25000,color='#3186cc',fill_color='#3186cc', popup=target_df.iloc[i]['NAME']).add_to(m)
 
folium.LayerControl(collapsed=False).add_to(m)
m

행정구역별 인구현황 버블맵

 

기존에 작성해놓은 코딩을 옮겨놓다보니, 설명이 부족한 부분이 많이 보이긴하네요. ㅋ

혹시 궁금하신 점은 댓글이나 방명록에 남겨주시면, 추가적인 포스팅으로 하던지 하겠습니다.

 

 

 

#데이터분석  #빅데이터  #머신러닝  #파이썬  #python  #시각화  #인구현황  #행정구역 표시  #folium  #버블맵  #지오코딩

728x90