Pandas (10) - 지도 시각화 실습
지도 시각화 실습
제주도 주민센터 데이터
- 제주 주민센터 주소값으로 마커찍기
-
인구에 따른 색상
- 위경도값 가져오기 - kakao api 이용
import pandas as pd
data = pd.read_csv('jeju.csv', encoding='cp949')
data.head()
지역 | 읍면동 | 전화번호 | 주소 | 일반현황 | 청사현황 | 자치센터현황 | 데이터기준일자 | Unnamed: 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 제주시 | 일도1동 | 064-728-4412 | 제주특별자치도 제주시 중앙로7길 15 (일도일동) | 인구 3146명 / 면적 0.33㎢ / 11통 61개반 | 지상 3층 / 연면적 585㎡ | 개소일 2000-12-20 | 2019-06-20 | NaN |
1 | 제주시 | 일도2동 | 064-728-4442 | 제주특별자치도 제주시 고마로 28 (일도이동) | 인구 38400명 / 면적2.18㎢ / 48통326반 | 지상 2층·지하 1층 / 연면적 1307.01 | 총면적 617.22㎡ / 개소일 2000-12-24 | 2019-06-20 | NaN |
2 | 제주시 | 이도1동 | 064-728-1530 | 제주특별자치도 제주시 중앙로25길 17 (이도1동) | 인구 7418명 / 면적 0.79㎢ / 16통 97개반 | 지상 2층 / 2층면적 205㎡ | 개소일 2000-12-28 | 2019-06-20 | NaN |
3 | 제주시 | 이도2동 | 064-755-2021 | 제주특별자치도 제주시 오복3길 8 (이도이동) | 인구 41428명 / 면적 5.4㎢ / 49통 323반 | 지하 1층·지상 3층 / 연면적 1223.52㎡ | 총면적 388.9㎡ / 개소일 2000-10-05 | 2019-06-20 | NaN |
4 | 제주시 | 삼도1동 | 064-728-4532 | 제주특별자치도 제주시 전농로 40 (삼도일동) | 인구 14281명 / 면적0.87㎢ / 18통122반 | 지하 1층·지상3층 / 연면적 2070.37㎡ | 총면적 456.55㎡ | 2019-06-20 | NaN |
위경도값 가져오기 - Kakao REST API
REST_API_KEY = '09d72f7782355ca8e2881df1352d6f8f'
주소명으로 장소검색
#Sample Request#
curl -v -X GET “https://dapi.kakao.com/v2/local/search/address.json”
-H “Authorization: KakaoAK ${REST_API_KEY}”
–data-urlencode “query=전북 삼성동 100”
Request
- Parameter
Name | Type | Description | Required |
---|---|---|---|
x | String | X 좌표값, 경위도인 경우 경도(longitude) | O |
y | String | Y 좌표값, 경위도인 경우 위도(latitude) | O |
input_coord | String | x, y로 입력되는 값에 대한 좌표계 지원 좌표계: WGS84, WCONGNAMUL, CONGNAMUL, WTM, TM (기본값: WGS84) |
X |
output_coord | String | 결과에 출력될 좌표계 지원 좌표계: WGS84, WCONGNAMUL, CONGNAMUL, WTM, TM (기본값: WGS84) |
X |
Response
- meta
Name | Type | Description |
---|---|---|
total_count | Integer | 검색어에 검색된 문서 수 |
- documents
Name | Type | Description |
---|---|---|
region_type | String | H(행정동) 또는 B(법정동) |
address_name | String | 전체 지역 명칭 |
region_1depth_name | String | 지역 1Depth, 시도 단위 바다 영역은 존재하지 않음 |
region_2depth_name | String | 지역 2Depth, 구 단위 바다 영역은 존재하지 않음 |
region_3depth_name | String | 지역 3Depth, 동 단위 바다 영역은 존재하지 않음 |
region_4depth_name | String | 지역 4Depth region_type이 법정동이며, 리 영역인 경우만 존재 |
code | String | region 코드 |
x | Double | X 좌표값, 경위도인 경우 경도(longitude) |
y | Double | Y 좌표값, 경위도인 경우 위도(latitude) |
import requests
url = 'https://dapi.kakao.com/v2/local/search/address.json?query=전북 삼성동 100&size=2'
headers = {'Authorization': f'KakaoAK {REST_API_KEY}'}
r = requests.get(url, headers=headers)
r.json()
{'documents': [{'address': {'address_name': '전북 익산시 부송동 100',
'b_code': '4514013400',
'h_code': '4514069000',
'main_address_no': '100',
'mountain_yn': 'N',
'region_1depth_name': '전북',
'region_2depth_name': '익산시',
'region_3depth_h_name': '삼성동',
'region_3depth_name': '부송동',
'sub_address_no': '',
'x': '126.99597495347',
'y': '35.9766482774579'},
'address_name': '전북 익산시 부송동 100',
'address_type': 'REGION_ADDR',
'road_address': None,
'x': '126.99597495347',
'y': '35.9766482774579'},
{'address': {'address_name': '전북 익산시 임상동 100',
'b_code': '4514013200',
'h_code': '4514069000',
'main_address_no': '100',
'mountain_yn': 'N',
'region_1depth_name': '전북',
'region_2depth_name': '익산시',
'region_3depth_h_name': '삼성동',
'region_3depth_name': '임상동',
'sub_address_no': '',
'x': '126.980268573424',
'y': '35.9816612949055'},
'address_name': '전북 익산시 임상동 100',
'address_type': 'REGION_ADDR',
'road_address': None,
'x': '126.980268573424',
'y': '35.9816612949055'}],
'meta': {'is_end': False, 'pageable_count': 3, 'total_count': 3}}
# 위경도값 추출
r.json()['documents'][0]['y'], r.json()['documents'][0]['x']
('35.9766482774579', '126.99597495347')
url = 'https://dapi.kakao.com/v2/local/search/address.json?query=제주특별자치도 제주시 중앙로7길 15 (일도일동)&size=2'
headers = {'Authorization': f'KakaoAK {REST_API_KEY}'}
r = requests.get(url, headers=headers)
r.json()
{'documents': [{'address': {'address_name': '제주특별자치도 제주시 일도일동 1306-7',
'b_code': '5011010100',
'h_code': '5011051000',
'main_address_no': '1306',
'mountain_yn': 'N',
'region_1depth_name': '제주특별자치도',
'region_2depth_name': '제주시',
'region_3depth_h_name': '일도1동',
'region_3depth_name': '일도일동',
'sub_address_no': '7',
'x': '126.526377102562',
'y': '33.5150582697264'},
'address_name': '제주특별자치도 제주시 중앙로7길 15',
'address_type': 'ROAD_ADDR',
'road_address': {'address_name': '제주특별자치도 제주시 중앙로7길 15',
'building_name': '일도1동주민센터',
'main_building_no': '15',
'region_1depth_name': '제주특별자치도',
'region_2depth_name': '제주시',
'region_3depth_name': '일도일동',
'road_name': '중앙로7길',
'sub_building_no': '',
'underground_yn': 'N',
'x': '126.526377102562',
'y': '33.5150582697264',
'zone_no': '63277'},
'x': '126.526377102562',
'y': '33.5150582697264'}],
'meta': {'is_end': True, 'pageable_count': 1, 'total_count': 1}}
url = 'https://dapi.kakao.com/v2/local/search/address.json?query=제주특별자치도 제주시 고마로 28 (일도이동)&size=2'
headers = {'Authorization': f'KakaoAK {REST_API_KEY}'}
r = requests.get(url, headers=headers)
r.json() # 못찾아 올 수도 있다!
{'documents': [],
'meta': {'is_end': True, 'pageable_count': 0, 'total_count': 0}}
url = 'https://dapi.kakao.com/v2/local/search/address.json?query=제주특별자치도 제주시 중앙로25길 17 (이도1동)&size=2'
headers = {'Authorization': f'KakaoAK {REST_API_KEY}'}
r = requests.get(url, headers=headers)
r.json()
{'documents': [{'address': {'address_name': '제주특별자치도 제주시 이도일동 1695-10',
'b_code': '5011010300',
'h_code': '5011053000',
'main_address_no': '1695',
'mountain_yn': 'N',
'region_1depth_name': '제주특별자치도',
'region_2depth_name': '제주시',
'region_3depth_h_name': '이도1동',
'region_3depth_name': '이도일동',
'sub_address_no': '10',
'x': '126.526722329545',
'y': '33.5068653918458'},
'address_name': '제주특별자치도 제주시 중앙로25길 17',
'address_type': 'ROAD_ADDR',
'road_address': {'address_name': '제주특별자치도 제주시 중앙로25길 17',
'building_name': '이도1동주민센터',
'main_building_no': '17',
'region_1depth_name': '제주특별자치도',
'region_2depth_name': '제주시',
'region_3depth_name': '이도일동',
'road_name': '중앙로25길',
'sub_building_no': '',
'underground_yn': 'N',
'x': '126.526722329545',
'y': '33.5068653918458',
'zone_no': '63194'},
'x': '126.526722329545',
'y': '33.5068653918458'}],
'meta': {'is_end': True, 'pageable_count': 1, 'total_count': 1}}
주소를 주고 검색결과가 하나일 경우는 상관없으나 결과가 여려개일 경우 모두 찾아온다
키워드로 장소검색
키워드로 필터링 가능! 괄호는 잘 못찾을 수도 #Sample Request#
curl -v -X GET “https://dapi.kakao.com/v2/local/search/keyword.json?y=37.514322572335935&x=127.06283102249932&radius=20000”
-H “Authorization: KakaoAK ${REST_API_KEY}”
–data-urlencode “query=카카오프렌즈”
Request
- Parameter
Name | Type | Description | Required |
---|---|---|---|
query | String | 검색을 원하는 질의어 | O |
category_group_code | String | 카테고리 그룹 코드 카테고리로 결과 필터링을 원하는 경우 사용 |
X |
x | String | 중심 좌표의 X 혹은 경도(longitude) 값 특정 지역을 중심으로 검색할 경우 radius와 함께 사용 가능 |
X |
y | String | 중심 좌표의 Y 혹은 위도(latitude) 값 특정 지역을 중심으로 검색할 경우 radius와 함께 사용 가능 |
X |
radius | Integer | 중심 좌표부터의 반경거리. 특정 지역을 중심으로 검색하려고 할 경우 중심좌표로 쓰일 x,y와 함께 사용 (단위: 미터(m), 최소: 0, 최대: 20000) |
X |
rect | String | 사각형의 지정 범위 내 제한 검색을 위한 좌표 지도 화면 내 검색 등 제한 검색에서 사용 가능 좌측 X 좌표, 좌측 Y 좌표, 우측 X 좌표, 우측 Y 좌표 형식 |
X |
page | Integer | 결과 페이지 번호 (최소: 1, 최대: 45, 기본값: 1) |
X |
size | Integer | 한 페이지에 보여질 문서의 개수 (최소: 1, 최대: 45, 기본값: 15) |
X |
sort | String | 결과 정렬 순서 distance 정렬을 원할 때는 기준 좌표로 쓰일 x, y와 함께 사용 distance 또는 accuracy(기본값: accuracy) |
X |
https://developers.kakao.com/docs/latest/ko/local/dev-guide#search-by-keyword-request-category-group-code
- category_group_code
Name | Description |
---|---|
MT1 | 대형마트 |
CS2 | 편의점 |
PS3 | 어린이집, 유치원 |
SC4 | 학교 |
AC5 | 학원 |
PK6 | 주차장 |
OL7 | 주유소, 충전소 |
SW8 | 지하철역 |
BK9 | 은행 |
CT1 | 문화시설 |
AG2 | 중개업소 |
PO3 | 공공기관 |
AT4 | 관광명소 |
AD5 | 숙박 |
FD6 | 음식점 |
CE7 | 카페 |
HP8 | 병원 |
PM9 | 약국 |
url = 'https://dapi.kakao.com/v2/local/search/address.json?query=제주특별자치도 제주시 오복3길 8 (이도이동)&category_group_code=PO3'
headers = {'Authorization': f'KakaoAK {REST_API_KEY}'}
r = requests.get(url, headers=headers)
r.json()
{'documents': [{'address': {'address_name': '제주특별자치도 제주시 이도이동 1051-6',
'b_code': '5011010400',
'h_code': '5011054000',
'main_address_no': '1051',
'mountain_yn': 'N',
'region_1depth_name': '제주특별자치도',
'region_2depth_name': '제주시',
'region_3depth_h_name': '이도2동',
'region_3depth_name': '이도이동',
'sub_address_no': '6',
'x': '126.535301157179',
'y': '33.4970696074971'},
'address_name': '제주특별자치도 제주시 오복3길 8',
'address_type': 'ROAD_ADDR',
'road_address': {'address_name': '제주특별자치도 제주시 오복3길 8',
'building_name': '이도2동주민센터',
'main_building_no': '8',
'region_1depth_name': '제주특별자치도',
'region_2depth_name': '제주시',
'region_3depth_name': '이도이동',
'road_name': '오복3길',
'sub_building_no': '',
'underground_yn': 'N',
'x': '126.535301157179',
'y': '33.4970696074971',
'zone_no': '63211'},
'x': '126.535301157179',
'y': '33.4970696074971'}],
'meta': {'is_end': True, 'pageable_count': 1, 'total_count': 1}}
데이터 처리
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 43 entries, 0 to 42
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 지역 43 non-null object
1 읍면동 43 non-null object
2 전화번호 43 non-null object
3 주소 43 non-null object
4 일반현황 43 non-null object
5 청사현황 43 non-null object
6 자치센터현황 41 non-null object
7 데이터기준일자 43 non-null object
8 Unnamed: 8 0 non-null float64
dtypes: float64(1), object(8)
memory usage: 3.1+ KB
- 검색의 정확성을 위해 주소의 괄호삭제
data.head(1)
지역 | 읍면동 | 전화번호 | 주소 | 일반현황 | 청사현황 | 자치센터현황 | 데이터기준일자 | Unnamed: 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 제주시 | 일도1동 | 064-728-4412 | 제주특별자치도 제주시 중앙로7길 15 (일도일동) | 인구 3146명 / 면적 0.33㎢ / 11통 61개반 | 지상 3층 / 연면적 585㎡ | 개소일 2000-12-20 | 2019-06-20 | NaN |
# 1. Unnamed: 8 column제거
data.drop(columns=['Unnamed: 8'], inplace=True)
# data.drop(['Unnamed: 8'], axis=1, inplace=True)
data.head(1)
지역 | 읍면동 | 전화번호 | 주소 | 일반현황 | 청사현황 | 자치센터현황 | 데이터기준일자 | |
---|---|---|---|---|---|---|---|---|
0 | 제주시 | 일도1동 | 064-728-4412 | 제주특별자치도 제주시 중앙로7길 15 (일도일동) | 인구 3146명 / 면적 0.33㎢ / 11통 61개반 | 지상 3층 / 연면적 585㎡ | 개소일 2000-12-20 | 2019-06-20 |
# 2. 주소에서 ()부분 제거
data['주소'] = data['주소'].str.split('(').str.get(0)
data.head(1)
지역 | 읍면동 | 전화번호 | 주소 | 일반현황 | 청사현황 | 자치센터현황 | 데이터기준일자 | |
---|---|---|---|---|---|---|---|---|
0 | 제주시 | 일도1동 | 064-728-4412 | 제주특별자치도 제주시 중앙로7길 15 | 인구 3146명 / 면적 0.33㎢ / 11통 61개반 | 지상 3층 / 연면적 585㎡ | 개소일 2000-12-20 | 2019-06-20 |
- 주소를 이용해서 카카오 로컬 키워드 검색을 이용해서 ‘위치’ 컬럼에 [y, x] 저장
- 함수(get_yx)를 작성, apply를 이용해서 적용
- 결과값이 없을 경우 ‘결과없음’으로 처리
def get_yx(query):
import requests # 나중에 함수를 사용할 경우를 위해 실행환경도 같이 설정
REST_API_KEY = '09d72f7782355ca8e2881df1352d6f8f'
url = f'https://dapi.kakao.com/v2/local/search/address.json?query={query}&category_group_code=PO3'
headers = {'Authorization': f'KakaoAK {REST_API_KEY}'}
r = requests.get(url, headers=headers)
data = r.json()
try:
return [data['documents'][0]['y'], data['documents'][0]['x']]
except:
return '결과없음'
# 작동확인
get_yx('제주특별자치도 제주시 중앙로7길 15')
['33.5150582697264', '126.526377102562']
get_yx('제주특별자치도 제주시 고마로 28')
'결과없음'
# apply를 이용해 함수 일괄적용
data['위치'] = data['주소'].apply(get_yx)
data.head(3)
지역 | 읍면동 | 전화번호 | 주소 | 일반현황 | 청사현황 | 자치센터현황 | 데이터기준일자 | 위치 | |
---|---|---|---|---|---|---|---|---|---|
0 | 제주시 | 일도1동 | 064-728-4412 | 제주특별자치도 제주시 중앙로7길 15 | 인구 3146명 / 면적 0.33㎢ / 11통 61개반 | 지상 3층 / 연면적 585㎡ | 개소일 2000-12-20 | 2019-06-20 | [33.5150582697264, 126.526377102562] |
1 | 제주시 | 일도2동 | 064-728-4442 | 제주특별자치도 제주시 고마로 28 | 인구 38400명 / 면적2.18㎢ / 48통326반 | 지상 2층·지하 1층 / 연면적 1307.01 | 총면적 617.22㎡ / 개소일 2000-12-24 | 2019-06-20 | 결과없음 |
2 | 제주시 | 이도1동 | 064-728-1530 | 제주특별자치도 제주시 중앙로25길 17 | 인구 7418명 / 면적 0.79㎢ / 16통 97개반 | 지상 2층 / 2층면적 205㎡ | 개소일 2000-12-28 | 2019-06-20 | [33.5068653918458, 126.526722329545] |
지도 시각화
- ‘위치’ 컬럼의 값을 이용해서 마커를 생성
- tooltip으로 ‘읍면동’컬럼을 값을 사용해서 지도에 표시(MarkerCluster)
import folium
from folium.plugins import MarkerCluster
jeju_loc = (33.361646, 126.5291977)
m = folium.Map(jeju_loc, zoom_start=10)
mc = MarkerCluster().add_to(m)
for idx, row in data.iterrows(): # idx와 value(Series)
if row['위치'] != '결과없음':
folium.Marker(row['위치'], tooltip=row['읍면동']).add_to(mc)
m
- apply 이용
m = folium.Map(jeju_loc, zoom_start=10)
mc = MarkerCluster().add_to(m)
# 데이터를 지도에 표시하는 함수
def display(data, map):
if data[0] != '결과없음':
folium.Marker(data[0], tooltip=data[1]).add_to(map)
# lambda식 활용
data[['위치', '읍면동']].apply(lambda x:display(x, map=mc), axis=1)
m
속도상 iterrow보다 apply가 조금 더 빠르다
제주도 인구수 데이터
데이터 전처리
지역, 읍면동을 이용해 영역을 구분짓고 인구수에 따라 색칠
data.head(2)
지역 | 읍면동 | 전화번호 | 주소 | 일반현황 | 청사현황 | 자치센터현황 | 데이터기준일자 | 위치 | |
---|---|---|---|---|---|---|---|---|---|
0 | 제주시 | 일도1동 | 064-728-4412 | 제주특별자치도 제주시 중앙로7길 15 | 인구 3146명 / 면적 0.33㎢ / 11통 61개반 | 지상 3층 / 연면적 585㎡ | 개소일 2000-12-20 | 2019-06-20 | [33.5150582697264, 126.526377102562] |
1 | 제주시 | 일도2동 | 064-728-4442 | 제주특별자치도 제주시 고마로 28 | 인구 38400명 / 면적2.18㎢ / 48통326반 | 지상 2층·지하 1층 / 연면적 1307.01 | 총면적 617.22㎡ / 개소일 2000-12-24 | 2019-06-20 | 결과없음 |
- 일반현황에서 인구수를 추출 ‘인구수 컬럼을 추가, 데이터 타입은 정수형으로 저장
temp = data['일반현황'].str.split('/').str.get(0).str.split().str.get(1)
def to_int(dummy):
num = ""
for i in dummy:
if 48 <= ord(i) <= 57:
num += i
else:
break
return num
temp.apply(to_int)
temp[36] # 문제가 있음
'가구'
import re
data['일반현황'].apply(lambda x: int(re.search('[0-9]{4,}', x).group()))[36] # 문제가 있음
2082
temp = data['일반현황'].str.split('/').str.get(0).str.split('(').str.get(0).str.split().str.get(-1).str.replace('명', '').astype(int)
temp[36] # 문제해결
4980
data['인구'] = temp
data.head(3)
지역 | 읍면동 | 전화번호 | 주소 | 일반현황 | 청사현황 | 자치센터현황 | 데이터기준일자 | 위치 | 인구 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 제주시 | 일도1동 | 064-728-4412 | 제주특별자치도 제주시 중앙로7길 15 | 인구 3146명 / 면적 0.33㎢ / 11통 61개반 | 지상 3층 / 연면적 585㎡ | 개소일 2000-12-20 | 2019-06-20 | [33.5150582697264, 126.526377102562] | 3146 |
1 | 제주시 | 일도2동 | 064-728-4442 | 제주특별자치도 제주시 고마로 28 | 인구 38400명 / 면적2.18㎢ / 48통326반 | 지상 2층·지하 1층 / 연면적 1307.01 | 총면적 617.22㎡ / 개소일 2000-12-24 | 2019-06-20 | 결과없음 | 38400 |
2 | 제주시 | 이도1동 | 064-728-1530 | 제주특별자치도 제주시 중앙로25길 17 | 인구 7418명 / 면적 0.79㎢ / 16통 97개반 | 지상 2층 / 2층면적 205㎡ | 개소일 2000-12-28 | 2019-06-20 | [33.5068653918458, 126.526722329545] | 7418 |
- GeoJSON의 지역 id와 데이터의 지역명을 통일
data.지역.value_counts()
제주시 26
서귀포시 17
Name: 지역, dtype: int64
data['지역명'] = data['지역'].replace(['제주시', '서귀포시'], ['Jeju', 'Seogwipo']) # str에 replace하면 일부 변경 # Series의 replace는 모두 같아야 변경, 리스트로 가능
data.head(3)
지역 | 읍면동 | 전화번호 | 주소 | 일반현황 | 청사현황 | 자치센터현황 | 데이터기준일자 | 위치 | 인구 | 지역명 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 제주시 | 일도1동 | 064-728-4412 | 제주특별자치도 제주시 중앙로7길 15 | 인구 3146명 / 면적 0.33㎢ / 11통 61개반 | 지상 3층 / 연면적 585㎡ | 개소일 2000-12-20 | 2019-06-20 | [33.5150582697264, 126.526377102562] | 3146 | Jeju |
1 | 제주시 | 일도2동 | 064-728-4442 | 제주특별자치도 제주시 고마로 28 | 인구 38400명 / 면적2.18㎢ / 48통326반 | 지상 2층·지하 1층 / 연면적 1307.01 | 총면적 617.22㎡ / 개소일 2000-12-24 | 2019-06-20 | 결과없음 | 38400 | Jeju |
2 | 제주시 | 이도1동 | 064-728-1530 | 제주특별자치도 제주시 중앙로25길 17 | 인구 7418명 / 면적 0.79㎢ / 16통 97개반 | 지상 2층 / 2층면적 205㎡ | 개소일 2000-12-28 | 2019-06-20 | [33.5068653918458, 126.526722329545] | 7418 | Jeju |
데이터 시각화
- 지역명으로 인구수 묶기
result = data.groupby(['지역명'])['인구'].sum().reset_index() # 정수형이 하나뿐이라 안적어도 됨
result
지역명 | 인구 | |
---|---|---|
0 | Jeju | 462396 |
1 | Seogwipo | 167641 |
import json
m = folium.Map(jeju_loc, zoom_start=10)
jsonfile = open('jejusi.json', 'r')
jsondata = json.loads(jsonfile.read())
folium.Choropleth(jsondata, data=result, columns=['지역명', '인구'],
key_on='feature.id').add_to(m)
m
- 읍면동으로 나눠서 표시
data.head(3)
지역 | 읍면동 | 전화번호 | 주소 | 일반현황 | 청사현황 | 자치센터현황 | 데이터기준일자 | 위치 | 인구 | 지역명 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 제주시 | 일도1동 | 064-728-4412 | 제주특별자치도 제주시 중앙로7길 15 | 인구 3146명 / 면적 0.33㎢ / 11통 61개반 | 지상 3층 / 연면적 585㎡ | 개소일 2000-12-20 | 2019-06-20 | [33.5150582697264, 126.526377102562] | 3146 | Jeju |
1 | 제주시 | 일도2동 | 064-728-4442 | 제주특별자치도 제주시 고마로 28 | 인구 38400명 / 면적2.18㎢ / 48통326반 | 지상 2층·지하 1층 / 연면적 1307.01 | 총면적 617.22㎡ / 개소일 2000-12-24 | 2019-06-20 | 결과없음 | 38400 | Jeju |
2 | 제주시 | 이도1동 | 064-728-1530 | 제주특별자치도 제주시 중앙로25길 17 | 인구 7418명 / 면적 0.79㎢ / 16통 97개반 | 지상 2층 / 2층면적 205㎡ | 개소일 2000-12-28 | 2019-06-20 | [33.5068653918458, 126.526722329545] | 7418 | Jeju |
사용할 GeoJSON의 id와 읍면동이 일치
m = folium.Map(jeju_loc, zoom_start=10)
jsonfile = open('jeju.json', 'r')
jsondata = json.loads(jsonfile.read())
folium.Choropleth(jsondata, data=data, columns=['읍면동', '인구'],
key_on='feature.id').add_to(m)
m
geojson 전국을 잘라서, id 만들어 넣기
주민등록상 인구를 기준으로
Reference
- 이 포스트는 SeSAC 인공지능 자연어처리, 컴퓨터비전 기술을 활용한 응용 SW 개발자 양성 과정 - 심선조 강사님의 강의를 정리한 내용입니다.
- Kakao developers
- Requests
댓글남기기