12 분 소요


In [1]:
# 경고 메시지 숨김
import warnings
warnings.filterwarnings('ignore')
In [2]:
import pandas as pd

1. 데이터 내용 파악

In [3]:
data = pd.read_csv('202208_202208_주민등록인구및세대현황_월간.csv', encoding='cp949')
data.head(3)
Out [3]:
행정구역 2022년08월_총인구수 2022년08월_세대수 2022년08월_세대당 인구 2022년08월_남자 인구수 2022년08월_여자 인구수 2022년08월_남여 비율
0 서울특별시 (1100000000) 9,488,454 4,472,975 2.12 4,601,295 4,887,159 0.94
1 서울특별시 종로구 (1111000000) 143,499 73,866 1.94 69,408 74,091 0.94
2 서울특별시 종로구 청운효자동(1111051500) 11,766 5,198 2.26 5,392 6,374 0.85
In [4]:
data.info()
# object형 자료->float이나 integer로 되지 못한 이유가 있을것
Out [4]:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3865 entries, 0 to 3864
Data columns (total 7 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   행정구역             3865 non-null   object 
 1   2022년08월_총인구수    3865 non-null   object 
 2   2022년08월_세대수     3865 non-null   object 
 3   2022년08월_세대당 인구  3865 non-null   float64
 4   2022년08월_남자 인구수  3865 non-null   object 
 5   2022년08월_여자 인구수  3865 non-null   object 
 6   2022년08월_남여 비율   3865 non-null   float64
dtypes: float64(2), object(5)
memory usage: 211.5+ KB

2. column 이름 수정

In [5]:
data.columns
Out [5]:
Index(['행정구역', '2022년08월_총인구수', '2022년08월_세대수', '2022년08월_세대당 인구',
       '2022년08월_남자 인구수', '2022년08월_여자 인구수', '2022년08월_남여 비율'],
      dtype='object')
In [6]:
data.columns = ['행정구역', '총인구수', '세대수', '세대당 인구',
                '남자', '여자', '남여 비율']
data.head(3)
Out [6]:
행정구역 총인구수 세대수 세대당 인구 남자 여자 남여 비율
0 서울특별시 (1100000000) 9,488,454 4,472,975 2.12 4,601,295 4,887,159 0.94
1 서울특별시 종로구 (1111000000) 143,499 73,866 1.94 69,408 74,091 0.94
2 서울특별시 종로구 청운효자동(1111051500) 11,766 5,198 2.26 5,392 6,374 0.85

3. 필요없는 컬럼 제거 - ‘남여 비율’

In [7]:
data.drop(columns='남여 비율', inplace=True)
data.head(3)
Out [7]:
행정구역 총인구수 세대수 세대당 인구 남자 여자
0 서울특별시 (1100000000) 9,488,454 4,472,975 2.12 4,601,295 4,887,159
1 서울특별시 종로구 (1111000000) 143,499 73,866 1.94 69,408 74,091
2 서울특별시 종로구 청운효자동(1111051500) 11,766 5,198 2.26 5,392 6,374

4. GeoJSON과 연결할 키를 확인

지역별 총계가 존재 -> 분리작업이 필요

  • 행정구역을 이용해서 시, 구, 동 column을 만들어준다.
  • 개별 데이터는 남기고 대분류, 중분류에 해당하는 값은 제거한다.
  • 부산 지역의 데이터만 가지고 와서 idx는 새로 부여한다.
In [8]:
# dropna를 편하게 쓰기 위해 조정
data['행정구역'] = data['행정구역'].str.split('(').str.get(0)
In [9]:
data['시'] = data['행정구역'].str.split().str.get(0)
data['구'] = data['행정구역'].str.split().str.get(1)
data['동'] = data['행정구역'].str.split().str.get(2).str.split('(').str.get(0)
data.head(3)
Out [9]:
행정구역 총인구수 세대수 세대당 인구 남자 여자
0 서울특별시 9,488,454 4,472,975 2.12 4,601,295 4,887,159 서울특별시 NaN NaN
1 서울특별시 종로구 143,499 73,866 1.94 69,408 74,091 서울특별시 종로구 NaN
2 서울특별시 종로구 청운효자동 11,766 5,198 2.26 5,392 6,374 서울특별시 종로구 청운효자동
In [10]:
data.dropna(inplace=True) # defatult axis=0 이므로 행단위로 제거
data.head(3)
Out [10]:
행정구역 총인구수 세대수 세대당 인구 남자 여자
2 서울특별시 종로구 청운효자동 11,766 5,198 2.26 5,392 6,374 서울특별시 종로구 청운효자동
3 서울특별시 종로구 사직동 9,278 4,668 1.99 4,124 5,154 서울특별시 종로구 사직동
4 서울특별시 종로구 삼청동 2,384 1,188 2.01 1,130 1,254 서울특별시 종로구 삼청동
In [11]:
busan = data[data['시'] == '부산광역시']
busan.head(3)
Out [11]:
행정구역 총인구수 세대수 세대당 인구 남자 여자
454 부산광역시 중구 중앙동 3,139 2,435 1.29 1,475 1,664 부산광역시 중구 중앙동
455 부산광역시 중구 동광동 2,590 1,703 1.52 1,323 1,267 부산광역시 중구 동광동
456 부산광역시 중구 대청동 6,185 3,562 1.74 2,877 3,308 부산광역시 중구 대청동
In [12]:
busan.reset_index(drop=True, inplace=True) # 기존 idx를 데이터에 포함시키지 않고 제거하기 위해 drop=True
busan.head(3)
Out [12]:
행정구역 총인구수 세대수 세대당 인구 남자 여자
0 부산광역시 중구 중앙동 3,139 2,435 1.29 1,475 1,664 부산광역시 중구 중앙동
1 부산광역시 중구 동광동 2,590 1,703 1.52 1,323 1,267 부산광역시 중구 동광동
2 부산광역시 중구 대청동 6,185 3,562 1.74 2,877 3,308 부산광역시 중구 대청동

5. 총인구수, 남자, 여자 column의 데이터 타입을 정수형으로 변경

  • astype
  • to_numeric : nan으로 채워버림
In [13]:
busan['총인구수'] = busan['총인구수'].str.replace(',', '').astype(int)
busan['남자'] = busan['남자'].str.replace(',', '').astype(int)
busan['여자'] = busan['여자'].str.replace(',', '').astype(int)
In [14]:
busan.info()
Out [14]:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 205 entries, 0 to 204
Data columns (total 9 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   행정구역    205 non-null    object 
 1   총인구수    205 non-null    int32  
 2   세대수     205 non-null    object 
 3   세대당 인구  205 non-null    float64
 4   남자      205 non-null    int32  
 5   여자      205 non-null    int32  
 6   시       205 non-null    object 
 7   구       205 non-null    object 
 8   동       205 non-null    object 
dtypes: float64(1), int32(3), object(5)
memory usage: 12.1+ KB

In [15]:
busan.head(3)
Out [15]:
행정구역 총인구수 세대수 세대당 인구 남자 여자
0 부산광역시 중구 중앙동 3139 2,435 1.29 1475 1664 부산광역시 중구 중앙동
1 부산광역시 중구 동광동 2590 1,703 1.52 1323 1267 부산광역시 중구 동광동
2 부산광역시 중구 대청동 6185 3,562 1.74 2877 3308 부산광역시 중구 대청동

6. 동별, 구별, 부산인구를 차트로 표시(인구순 5개 항목만 출력)

In [16]:
# 구별 인구수
gu = busan.groupby(['구'])['총인구수'].sum().sort_values(ascending=False).head().reset_index() # seaborn 사용위해 idx 데이터화
gu
Out [16]:
총인구수
0 해운대구 389841
1 부산진구 351682
2 사하구 304029
3 북구 280116
4 동래구 274638
In [17]:
import seaborn as sns
In [18]:
sns.barplot(data=gu, x='구', y='총인구수')
Out [18]:
<AxesSubplot:xlabel='구', ylabel='총인구수'>

img

In [19]:
# 동별 인구수
dong = busan.sort_values(by='총인구수', ascending=False).head()
dong
Out [19]:
행정구역 총인구수 세대수 세대당 인구 남자 여자
202 부산광역시 기장군 정관읍 81242 32,042 2.54 40196 41046 부산광역시 기장군 정관읍
161 부산광역시 강서구 명지1동 53762 21,188 2.54 26986 26776 부산광역시 강서구 명지1동
200 부산광역시 기장군 기장읍 52213 25,757 2.03 25411 26802 부산광역시 기장군 기장읍
83 부산광역시 남구 용호제1동 43554 17,119 2.54 20860 22694 부산광역시 남구 용호제1동
99 부산광역시 북구 화명제1동 40825 14,385 2.84 19953 20872 부산광역시 북구 화명제1동
In [20]:
sns.barplot(data=dong, x='동', y='총인구수')
Out [20]:
<AxesSubplot:xlabel='동', ylabel='총인구수'>

img

7. Json파일 정리

GeoJSON 편집
구별로 하고 싶으면 sggnm
동별로 하고 싶으면 adm_nm를 불러와 잘라서 써야함

부산것만 쓸것이기에 sidonm에서 부산광역시만

In [21]:
import json
In [22]:
jsonfile = open('HangJeongDong_ver20220701.geojson', 'r', encoding='utf-8').read()
In [23]:
type(jsonfile)
Out [23]:
str
In [24]:
jsondata = json.loads(jsonfile) # 문자열이라 load's'
In [25]:
type(jsondata)
Out [25]:
dict
In [26]:
json_busan = {"type": "FeatureCollection"}

json_pick = [] # features에 넣을 데이터 저장
json_dong = [] # 동 정보 저장

for item in jsondata['features']:
    # print(time[properties]'['sidonm']')
    if item['properties']['sidonm'] == '부산광역시':
        dong = item['properties']['adm_nm'].split()[-1].strip() # strip 공백제거
        item['id'] = dong
        json_pick.append(item)
        json_dong.append(dong)

json_busan['features'] = json_pick
In [27]:
# json_busan

8. 지도 그리기

In [28]:
import folium
In [29]:
loc = [35.1681608, 129.0573853]
m = folium.Map(loc, zoom_start=11)
folium.Choropleth(geo_data=json_busan, data=busan, columns=['동', '총인구수'], key_on='feature.id').add_to(m)
m
Out [29]:
Make this Notebook Trusted to load map: File -> Trust Notebook

키값이 맞지 않은 곳이 black으로 표시됨

In [30]:
json_dong = sorted(json_dong)
#json_dong
In [31]:
df_dong = sorted(busan['동'])
# df_dong
In [32]:
# 길이 확인
len(json_dong), len(df_dong)
Out [32]:
(205, 205)
In [33]:
for i, item in enumerate(zip(df_dong, json_dong)):
    print(i, item)
Out [33]:
0 ('가덕도동', '가덕도동')
1 ('가락동', '가락동')
2 ('가야제1동', '가야2동')
3 ('가야제2동', '가야제1동')
4 ('감만제1동', '감만1동')
5 ('감만제2동', '감만2동')
6 ('감전동', '감전동')
7 ('감천제1동', '감천1동')
8 ('감천제2동', '감천2동')
9 ('강동동', '강동동')
10 ('개금제1동', '개금1동')
11 ('개금제2동', '개금2동')
12 ('개금제3동', '개금3동')
13 ('거제제1동', '거제1동')
14 ('거제제2동', '거제2동')
15 ('거제제3동', '거제3동')
16 ('거제제4동', '거제4동')
17 ('광복동', '광복동')
18 ('광안제1동', '광안1동')
19 ('광안제2동', '광안2동')
20 ('광안제3동', '광안3동')
21 ('광안제4동', '광안4동')
22 ('괘법동', '괘법동')
23 ('괴정제1동', '괴정1동')
24 ('괴정제2동', '괴정2동')
25 ('괴정제3동', '괴정3동')
26 ('괴정제4동', '괴정4동')
27 ('구서제1동', '구서1동')
28 ('구서제2동', '구서2동')
29 ('구평동', '구평동')
30 ('구포제1동', '구포1동')
31 ('구포제2동', '구포2동')
32 ('구포제3동', '구포3동')
33 ('금곡동', '금곡동')
34 ('금사회동동', '금사회동동')
35 ('금성동', '금성동')
36 ('기장읍', '기장읍')
37 ('남부민제1동', '남부민1동')
38 ('남부민제2동', '남부민2동')
39 ('남산동', '남산동')
40 ('남천제1동', '남천1동')
41 ('남천제2동', '남천2동')
42 ('남포동', '남포동')
43 ('남항동', '남항동')
44 ('녹산동', '녹산동')
45 ('다대제1동', '다대1동')
46 ('다대제2동', '다대2동')
47 ('당감제1동', '당감1동')
48 ('당감제2동', '당감2동')
49 ('당감제4동', '당감4동')
50 ('당리동', '당리동')
51 ('대연제1동', '대연1동')
52 ('대연제3동', '대연3동')
53 ('대연제4동', '대연4동')
54 ('대연제5동', '대연5동')
55 ('대연제6동', '대연6동')
56 ('대저1동', '대저1동')
57 ('대저2동', '대저2동')
58 ('대청동', '대청동')
59 ('덕천제1동', '덕천1동')
60 ('덕천제2동', '덕천2동')
61 ('덕천제3동', '덕천3동')
62 ('덕포제1동', '덕포1동')
63 ('덕포제2동', '덕포2동')
64 ('동광동', '동광동')
65 ('동대신제1동', '동대신1동')
66 ('동대신제2동', '동대신2동')
67 ('동대신제3동', '동대신3동')
68 ('동삼제1동', '동삼1동')
69 ('동삼제2동', '동삼2동')
70 ('동삼제3동', '동삼3동')
71 ('만덕제1동', '만덕1동')
72 ('만덕제2동', '만덕2동')
73 ('만덕제3동', '만덕3동')
74 ('망미제1동', '망미1동')
75 ('망미제2동', '망미2동')
76 ('명륜동', '명륜동')
77 ('명장제1동', '명장1동')
78 ('명장제2동', '명장2동')
79 ('명지1동', '명지1동')
80 ('명지2동', '명지2동')
81 ('모라제1동', '모라1동')
82 ('모라제3동', '모라3동')
83 ('문현제1동', '문현1동')
84 ('문현제2동', '문현2동')
85 ('문현제3동', '문현3동')
86 ('문현제4동', '문현4동')
87 ('민락동', '민락동')
88 ('반송제1동', '반송1동')
89 ('반송제2동', '반송2동')
90 ('반여제1동', '반여1동')
91 ('반여제2동', '반여2동')
92 ('반여제3동', '반여3동')
93 ('반여제4동', '반여4동')
94 ('범일제1동', '범일1동')
95 ('범일제2동', '범일2동')
96 ('범일제5동', '범일5동')
97 ('범천제1동', '범천1동')
98 ('범천제2동', '범천2동')
99 ('보수동', '보수동')
100 ('복산동', '복산동')
101 ('봉래제1동', '봉래1동')
102 ('봉래제2동', '봉래2동')
103 ('부곡제1동', '부곡1동')
104 ('부곡제2동', '부곡2동')
105 ('부곡제3동', '부곡3동')
106 ('부곡제4동', '부곡4동')
107 ('부민동', '부민동')
108 ('부암제1동', '부암1동')
109 ('부암제3동', '부암3동')
110 ('부전제1동', '부전1동')
111 ('부전제2동', '부전2동')
112 ('부평동', '부평동')
113 ('사직제1동', '사직1동')
114 ('사직제2동', '사직2동')
115 ('사직제3동', '사직3동')
116 ('삼락동', '삼락동')
117 ('서대신제1동', '서1동')
118 ('서대신제3동', '서2동')
119 ('서대신제4동', '서3동')
120 ('서제1동', '서대신1동')
121 ('서제2동', '서대신3동')
122 ('서제3동', '서대신4동')
123 ('선두구동', '선두구동')
124 ('송정동', '송정동')
125 ('수민동', '수민동')
126 ('수영동', '수영동')
127 ('수정제1동', '수정1동')
128 ('수정제2동', '수정2동')
129 ('수정제4동', '수정4동')
130 ('수정제5동', '수정5동')
131 ('신선동', '신선동')
132 ('신평제1동', '신평1동')
133 ('신평제2동', '신평2동')
134 ('아미동', '아미동')
135 ('안락제1동', '안락1동')
136 ('안락제2동', '안락2동')
137 ('암남동', '암남동')
138 ('양정제1동', '양정1동')
139 ('양정제2동', '양정2동')
140 ('엄궁동', '엄궁동')
141 ('연산제1동', '연산1동')
142 ('연산제2동', '연산2동')
143 ('연산제3동', '연산3동')
144 ('연산제4동', '연산4동')
145 ('연산제5동', '연산5동')
146 ('연산제6동', '연산6동')
147 ('연산제8동', '연산8동')
148 ('연산제9동', '연산9동')
149 ('연지동', '연지동')
150 ('영선제1동', '영선1동')
151 ('영선제2동', '영선2동')
152 ('영주제1동', '영주1동')
153 ('영주제2동', '영주2동')
154 ('온천제1동', '온천1동')
155 ('온천제2동', '온천2동')
156 ('온천제3동', '온천3동')
157 ('용당동', '용당동')
158 ('용호제1동', '용호1동')
159 ('용호제2동', '용호2동')
160 ('용호제3동', '용호3동')
161 ('용호제4동', '용호4동')
162 ('우암동', '우1동')
163 ('우제1동', '우2동')
164 ('우제2동', '우3동')
165 ('우제3동', '우암동')
166 ('일광읍', '일광읍')
167 ('장림제1동', '장림1동')
168 ('장림제2동', '장림2동')
169 ('장안읍', '장안읍')
170 ('장전제1동', '장전1동')
171 ('장전제2동', '장전2동')
172 ('재송제1동', '재송1동')
173 ('재송제2동', '재송2동')
174 ('전포제1동', '전포1동')
175 ('전포제2동', '전포2동')
176 ('정관읍', '정관읍')
177 ('좌제1동', '좌1동')
178 ('좌제2동', '좌2동')
179 ('좌제3동', '좌3동')
180 ('좌제4동', '좌4동')
181 ('좌천동', '좌천동')
182 ('주례제1동', '주례1동')
183 ('주례제2동', '주례2동')
184 ('주례제3동', '주례3동')
185 ('중앙동', '중1동')
186 ('중제1동', '중2동')
187 ('중제2동', '중앙동')
188 ('철마면', '철마면')
189 ('청룡노포동', '청룡노포동')
190 ('청학제1동', '청학1동')
191 ('청학제2동', '청학2동')
192 ('초량제1동', '초량1동')
193 ('초량제2동', '초량2동')
194 ('초량제3동', '초량3동')
195 ('초량제6동', '초량6동')
196 ('초읍동', '초읍동')
197 ('초장동', '초장동')
198 ('충무동', '충무동')
199 ('하단제1동', '하단1동')
200 ('하단제2동', '하단2동')
201 ('학장동', '학장동')
202 ('화명제1동', '화명1동')
203 ('화명제2동', '화명2동')
204 ('화명제3동', '화명3동')

  • json데이터 편집 : 가야제1동->가야1동
In [34]:
json_busan = {"type": "FeatureCollection"}

json_pick = [] # features에 넣을 데이터 저장
json_dong = [] # 동 정보 저장

for item in jsondata['features']:
    # print(time[properties]'['sidonm']')
    if item['properties']['sidonm'] == '부산광역시':
        dong = item['properties']['adm_nm'].split()[-1].strip() # strip 공백제거
        if dong == '가야제1동':
            dong = '가야1동'
        item['id'] = dong
        json_pick.append(item)
        json_dong.append(dong)

json_busan['features'] = json_pick
In [35]:
json_dong = sorted(json_dong)
df_dong = sorted(busan['동'])

for i, item in enumerate(zip(df_dong, json_dong)):
    print(i, item)
Out [35]:
0 ('가덕도동', '가덕도동')
1 ('가락동', '가락동')
2 ('가야제1동', '가야1동')
3 ('가야제2동', '가야2동')
4 ('감만제1동', '감만1동')
5 ('감만제2동', '감만2동')
6 ('감전동', '감전동')
7 ('감천제1동', '감천1동')
8 ('감천제2동', '감천2동')
9 ('강동동', '강동동')
10 ('개금제1동', '개금1동')
11 ('개금제2동', '개금2동')
12 ('개금제3동', '개금3동')
13 ('거제제1동', '거제1동')
14 ('거제제2동', '거제2동')
15 ('거제제3동', '거제3동')
16 ('거제제4동', '거제4동')
17 ('광복동', '광복동')
18 ('광안제1동', '광안1동')
19 ('광안제2동', '광안2동')
20 ('광안제3동', '광안3동')
21 ('광안제4동', '광안4동')
22 ('괘법동', '괘법동')
23 ('괴정제1동', '괴정1동')
24 ('괴정제2동', '괴정2동')
25 ('괴정제3동', '괴정3동')
26 ('괴정제4동', '괴정4동')
27 ('구서제1동', '구서1동')
28 ('구서제2동', '구서2동')
29 ('구평동', '구평동')
30 ('구포제1동', '구포1동')
31 ('구포제2동', '구포2동')
32 ('구포제3동', '구포3동')
33 ('금곡동', '금곡동')
34 ('금사회동동', '금사회동동')
35 ('금성동', '금성동')
36 ('기장읍', '기장읍')
37 ('남부민제1동', '남부민1동')
38 ('남부민제2동', '남부민2동')
39 ('남산동', '남산동')
40 ('남천제1동', '남천1동')
41 ('남천제2동', '남천2동')
42 ('남포동', '남포동')
43 ('남항동', '남항동')
44 ('녹산동', '녹산동')
45 ('다대제1동', '다대1동')
46 ('다대제2동', '다대2동')
47 ('당감제1동', '당감1동')
48 ('당감제2동', '당감2동')
49 ('당감제4동', '당감4동')
50 ('당리동', '당리동')
51 ('대연제1동', '대연1동')
52 ('대연제3동', '대연3동')
53 ('대연제4동', '대연4동')
54 ('대연제5동', '대연5동')
55 ('대연제6동', '대연6동')
56 ('대저1동', '대저1동')
57 ('대저2동', '대저2동')
58 ('대청동', '대청동')
59 ('덕천제1동', '덕천1동')
60 ('덕천제2동', '덕천2동')
61 ('덕천제3동', '덕천3동')
62 ('덕포제1동', '덕포1동')
63 ('덕포제2동', '덕포2동')
64 ('동광동', '동광동')
65 ('동대신제1동', '동대신1동')
66 ('동대신제2동', '동대신2동')
67 ('동대신제3동', '동대신3동')
68 ('동삼제1동', '동삼1동')
69 ('동삼제2동', '동삼2동')
70 ('동삼제3동', '동삼3동')
71 ('만덕제1동', '만덕1동')
72 ('만덕제2동', '만덕2동')
73 ('만덕제3동', '만덕3동')
74 ('망미제1동', '망미1동')
75 ('망미제2동', '망미2동')
76 ('명륜동', '명륜동')
77 ('명장제1동', '명장1동')
78 ('명장제2동', '명장2동')
79 ('명지1동', '명지1동')
80 ('명지2동', '명지2동')
81 ('모라제1동', '모라1동')
82 ('모라제3동', '모라3동')
83 ('문현제1동', '문현1동')
84 ('문현제2동', '문현2동')
85 ('문현제3동', '문현3동')
86 ('문현제4동', '문현4동')
87 ('민락동', '민락동')
88 ('반송제1동', '반송1동')
89 ('반송제2동', '반송2동')
90 ('반여제1동', '반여1동')
91 ('반여제2동', '반여2동')
92 ('반여제3동', '반여3동')
93 ('반여제4동', '반여4동')
94 ('범일제1동', '범일1동')
95 ('범일제2동', '범일2동')
96 ('범일제5동', '범일5동')
97 ('범천제1동', '범천1동')
98 ('범천제2동', '범천2동')
99 ('보수동', '보수동')
100 ('복산동', '복산동')
101 ('봉래제1동', '봉래1동')
102 ('봉래제2동', '봉래2동')
103 ('부곡제1동', '부곡1동')
104 ('부곡제2동', '부곡2동')
105 ('부곡제3동', '부곡3동')
106 ('부곡제4동', '부곡4동')
107 ('부민동', '부민동')
108 ('부암제1동', '부암1동')
109 ('부암제3동', '부암3동')
110 ('부전제1동', '부전1동')
111 ('부전제2동', '부전2동')
112 ('부평동', '부평동')
113 ('사직제1동', '사직1동')
114 ('사직제2동', '사직2동')
115 ('사직제3동', '사직3동')
116 ('삼락동', '삼락동')
117 ('서대신제1동', '서1동')
118 ('서대신제3동', '서2동')
119 ('서대신제4동', '서3동')
120 ('서제1동', '서대신1동')
121 ('서제2동', '서대신3동')
122 ('서제3동', '서대신4동')
123 ('선두구동', '선두구동')
124 ('송정동', '송정동')
125 ('수민동', '수민동')
126 ('수영동', '수영동')
127 ('수정제1동', '수정1동')
128 ('수정제2동', '수정2동')
129 ('수정제4동', '수정4동')
130 ('수정제5동', '수정5동')
131 ('신선동', '신선동')
132 ('신평제1동', '신평1동')
133 ('신평제2동', '신평2동')
134 ('아미동', '아미동')
135 ('안락제1동', '안락1동')
136 ('안락제2동', '안락2동')
137 ('암남동', '암남동')
138 ('양정제1동', '양정1동')
139 ('양정제2동', '양정2동')
140 ('엄궁동', '엄궁동')
141 ('연산제1동', '연산1동')
142 ('연산제2동', '연산2동')
143 ('연산제3동', '연산3동')
144 ('연산제4동', '연산4동')
145 ('연산제5동', '연산5동')
146 ('연산제6동', '연산6동')
147 ('연산제8동', '연산8동')
148 ('연산제9동', '연산9동')
149 ('연지동', '연지동')
150 ('영선제1동', '영선1동')
151 ('영선제2동', '영선2동')
152 ('영주제1동', '영주1동')
153 ('영주제2동', '영주2동')
154 ('온천제1동', '온천1동')
155 ('온천제2동', '온천2동')
156 ('온천제3동', '온천3동')
157 ('용당동', '용당동')
158 ('용호제1동', '용호1동')
159 ('용호제2동', '용호2동')
160 ('용호제3동', '용호3동')
161 ('용호제4동', '용호4동')
162 ('우암동', '우1동')
163 ('우제1동', '우2동')
164 ('우제2동', '우3동')
165 ('우제3동', '우암동')
166 ('일광읍', '일광읍')
167 ('장림제1동', '장림1동')
168 ('장림제2동', '장림2동')
169 ('장안읍', '장안읍')
170 ('장전제1동', '장전1동')
171 ('장전제2동', '장전2동')
172 ('재송제1동', '재송1동')
173 ('재송제2동', '재송2동')
174 ('전포제1동', '전포1동')
175 ('전포제2동', '전포2동')
176 ('정관읍', '정관읍')
177 ('좌제1동', '좌1동')
178 ('좌제2동', '좌2동')
179 ('좌제3동', '좌3동')
180 ('좌제4동', '좌4동')
181 ('좌천동', '좌천동')
182 ('주례제1동', '주례1동')
183 ('주례제2동', '주례2동')
184 ('주례제3동', '주례3동')
185 ('중앙동', '중1동')
186 ('중제1동', '중2동')
187 ('중제2동', '중앙동')
188 ('철마면', '철마면')
189 ('청룡노포동', '청룡노포동')
190 ('청학제1동', '청학1동')
191 ('청학제2동', '청학2동')
192 ('초량제1동', '초량1동')
193 ('초량제2동', '초량2동')
194 ('초량제3동', '초량3동')
195 ('초량제6동', '초량6동')
196 ('초읍동', '초읍동')
197 ('초장동', '초장동')
198 ('충무동', '충무동')
199 ('하단제1동', '하단1동')
200 ('하단제2동', '하단2동')
201 ('학장동', '학장동')
202 ('화명제1동', '화명1동')
203 ('화명제2동', '화명2동')
204 ('화명제3동', '화명3동')

  • df데이터 수정 : 거제1~4동 제외한 주소는 ‘제’ 삭제, 4곳은 수정
In [36]:
busan['동'] = busan['동'].str.replace('제', '')
# busan['동'].str.replace('제', '').to_list()
In [37]:
busan['동'] = busan['동'].replace(['거1동', '거2동', '거3동', '거4동'], ['거제1동', '거제2동', '거제3동', '거제4동']) # 전체일치 찾기
In [38]:
json_dong = sorted(json_dong)
df_dong = sorted(busan['동'])

for i, item in enumerate(zip(df_dong, json_dong)):
    print(i, item)
Out [38]:
0 ('가덕도동', '가덕도동')
1 ('가락동', '가락동')
2 ('가야1동', '가야1동')
3 ('가야2동', '가야2동')
4 ('감만1동', '감만1동')
5 ('감만2동', '감만2동')
6 ('감전동', '감전동')
7 ('감천1동', '감천1동')
8 ('감천2동', '감천2동')
9 ('강동동', '강동동')
10 ('개금1동', '개금1동')
11 ('개금2동', '개금2동')
12 ('개금3동', '개금3동')
13 ('거제1동', '거제1동')
14 ('거제2동', '거제2동')
15 ('거제3동', '거제3동')
16 ('거제4동', '거제4동')
17 ('광복동', '광복동')
18 ('광안1동', '광안1동')
19 ('광안2동', '광안2동')
20 ('광안3동', '광안3동')
21 ('광안4동', '광안4동')
22 ('괘법동', '괘법동')
23 ('괴정1동', '괴정1동')
24 ('괴정2동', '괴정2동')
25 ('괴정3동', '괴정3동')
26 ('괴정4동', '괴정4동')
27 ('구서1동', '구서1동')
28 ('구서2동', '구서2동')
29 ('구평동', '구평동')
30 ('구포1동', '구포1동')
31 ('구포2동', '구포2동')
32 ('구포3동', '구포3동')
33 ('금곡동', '금곡동')
34 ('금사회동동', '금사회동동')
35 ('금성동', '금성동')
36 ('기장읍', '기장읍')
37 ('남부민1동', '남부민1동')
38 ('남부민2동', '남부민2동')
39 ('남산동', '남산동')
40 ('남천1동', '남천1동')
41 ('남천2동', '남천2동')
42 ('남포동', '남포동')
43 ('남항동', '남항동')
44 ('녹산동', '녹산동')
45 ('다대1동', '다대1동')
46 ('다대2동', '다대2동')
47 ('당감1동', '당감1동')
48 ('당감2동', '당감2동')
49 ('당감4동', '당감4동')
50 ('당리동', '당리동')
51 ('대연1동', '대연1동')
52 ('대연3동', '대연3동')
53 ('대연4동', '대연4동')
54 ('대연5동', '대연5동')
55 ('대연6동', '대연6동')
56 ('대저1동', '대저1동')
57 ('대저2동', '대저2동')
58 ('대청동', '대청동')
59 ('덕천1동', '덕천1동')
60 ('덕천2동', '덕천2동')
61 ('덕천3동', '덕천3동')
62 ('덕포1동', '덕포1동')
63 ('덕포2동', '덕포2동')
64 ('동광동', '동광동')
65 ('동대신1동', '동대신1동')
66 ('동대신2동', '동대신2동')
67 ('동대신3동', '동대신3동')
68 ('동삼1동', '동삼1동')
69 ('동삼2동', '동삼2동')
70 ('동삼3동', '동삼3동')
71 ('만덕1동', '만덕1동')
72 ('만덕2동', '만덕2동')
73 ('만덕3동', '만덕3동')
74 ('망미1동', '망미1동')
75 ('망미2동', '망미2동')
76 ('명륜동', '명륜동')
77 ('명장1동', '명장1동')
78 ('명장2동', '명장2동')
79 ('명지1동', '명지1동')
80 ('명지2동', '명지2동')
81 ('모라1동', '모라1동')
82 ('모라3동', '모라3동')
83 ('문현1동', '문현1동')
84 ('문현2동', '문현2동')
85 ('문현3동', '문현3동')
86 ('문현4동', '문현4동')
87 ('민락동', '민락동')
88 ('반송1동', '반송1동')
89 ('반송2동', '반송2동')
90 ('반여1동', '반여1동')
91 ('반여2동', '반여2동')
92 ('반여3동', '반여3동')
93 ('반여4동', '반여4동')
94 ('범일1동', '범일1동')
95 ('범일2동', '범일2동')
96 ('범일5동', '범일5동')
97 ('범천1동', '범천1동')
98 ('범천2동', '범천2동')
99 ('보수동', '보수동')
100 ('복산동', '복산동')
101 ('봉래1동', '봉래1동')
102 ('봉래2동', '봉래2동')
103 ('부곡1동', '부곡1동')
104 ('부곡2동', '부곡2동')
105 ('부곡3동', '부곡3동')
106 ('부곡4동', '부곡4동')
107 ('부민동', '부민동')
108 ('부암1동', '부암1동')
109 ('부암3동', '부암3동')
110 ('부전1동', '부전1동')
111 ('부전2동', '부전2동')
112 ('부평동', '부평동')
113 ('사직1동', '사직1동')
114 ('사직2동', '사직2동')
115 ('사직3동', '사직3동')
116 ('삼락동', '삼락동')
117 ('서1동', '서1동')
118 ('서2동', '서2동')
119 ('서3동', '서3동')
120 ('서대신1동', '서대신1동')
121 ('서대신3동', '서대신3동')
122 ('서대신4동', '서대신4동')
123 ('선두구동', '선두구동')
124 ('송정동', '송정동')
125 ('수민동', '수민동')
126 ('수영동', '수영동')
127 ('수정1동', '수정1동')
128 ('수정2동', '수정2동')
129 ('수정4동', '수정4동')
130 ('수정5동', '수정5동')
131 ('신선동', '신선동')
132 ('신평1동', '신평1동')
133 ('신평2동', '신평2동')
134 ('아미동', '아미동')
135 ('안락1동', '안락1동')
136 ('안락2동', '안락2동')
137 ('암남동', '암남동')
138 ('양정1동', '양정1동')
139 ('양정2동', '양정2동')
140 ('엄궁동', '엄궁동')
141 ('연산1동', '연산1동')
142 ('연산2동', '연산2동')
143 ('연산3동', '연산3동')
144 ('연산4동', '연산4동')
145 ('연산5동', '연산5동')
146 ('연산6동', '연산6동')
147 ('연산8동', '연산8동')
148 ('연산9동', '연산9동')
149 ('연지동', '연지동')
150 ('영선1동', '영선1동')
151 ('영선2동', '영선2동')
152 ('영주1동', '영주1동')
153 ('영주2동', '영주2동')
154 ('온천1동', '온천1동')
155 ('온천2동', '온천2동')
156 ('온천3동', '온천3동')
157 ('용당동', '용당동')
158 ('용호1동', '용호1동')
159 ('용호2동', '용호2동')
160 ('용호3동', '용호3동')
161 ('용호4동', '용호4동')
162 ('우1동', '우1동')
163 ('우2동', '우2동')
164 ('우3동', '우3동')
165 ('우암동', '우암동')
166 ('일광읍', '일광읍')
167 ('장림1동', '장림1동')
168 ('장림2동', '장림2동')
169 ('장안읍', '장안읍')
170 ('장전1동', '장전1동')
171 ('장전2동', '장전2동')
172 ('재송1동', '재송1동')
173 ('재송2동', '재송2동')
174 ('전포1동', '전포1동')
175 ('전포2동', '전포2동')
176 ('정관읍', '정관읍')
177 ('좌1동', '좌1동')
178 ('좌2동', '좌2동')
179 ('좌3동', '좌3동')
180 ('좌4동', '좌4동')
181 ('좌천동', '좌천동')
182 ('주례1동', '주례1동')
183 ('주례2동', '주례2동')
184 ('주례3동', '주례3동')
185 ('중1동', '중1동')
186 ('중2동', '중2동')
187 ('중앙동', '중앙동')
188 ('철마면', '철마면')
189 ('청룡노포동', '청룡노포동')
190 ('청학1동', '청학1동')
191 ('청학2동', '청학2동')
192 ('초량1동', '초량1동')
193 ('초량2동', '초량2동')
194 ('초량3동', '초량3동')
195 ('초량6동', '초량6동')
196 ('초읍동', '초읍동')
197 ('초장동', '초장동')
198 ('충무동', '충무동')
199 ('하단1동', '하단1동')
200 ('하단2동', '하단2동')
201 ('학장동', '학장동')
202 ('화명1동', '화명1동')
203 ('화명2동', '화명2동')
204 ('화명3동', '화명3동')

In [39]:
loc = [35.1681608, 129.0573853]
m = folium.Map(loc, zoom_start=11)
folium.Choropleth(geo_data=json_busan, data=busan, columns=['동', '총인구수'],
                  key_on='feature.id', fill_color='PuRd', fill_opacity=0.8).add_to(m)
m
Out [39]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [40]:
# 툴팁 표시
loc = [35.1681608, 129.0573853]
m = folium.Map(loc, zoom_start=11)
cho = folium.Choropleth(geo_data=json_busan, data=busan, columns=['동', '총인구수'],
                  key_on='feature.id', fill_color='PuRd', fill_opacity=0.8).add_to(m)

cho.geojson.add_child(folium.features.GeoJsonTooltip(['adm_nm'], labels=False))
m
Out [40]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Reference

  • 이 포스트는 SeSAC 인공지능 자연어처리, 컴퓨터비전 기술을 활용한 응용 SW 개발자 양성 과정 - 심선조 강사님의 강의를 정리한 내용입니다.
  • 행정안전부 : 주민등록 인구 및 세대현황

댓글남기기