8 분 소요


지도 시각화 실습

제주도 주민센터 데이터

  • 제주 주민센터 주소값으로 마커찍기
  • 인구에 따른 색상

  • 위경도값 가져오기 - kakao api 이용
In [1]:
import pandas as pd
In [2]:
data = pd.read_csv('jeju.csv', encoding='cp949')
data.head()
Out [2]:
지역 읍면동 전화번호 주소 일반현황 청사현황 자치센터현황 데이터기준일자 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

In [3]:
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)
In [4]:
import requests
In [5]:
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)
In [6]:
r.json()
Out [6]:
{'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}}
In [7]:
# 위경도값 추출
r.json()['documents'][0]['y'], r.json()['documents'][0]['x']
Out [7]:
('35.9766482774579', '126.99597495347')
In [8]:
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)
In [9]:
r.json()
Out [9]:
{'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}}
In [10]:
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)
In [11]:
r.json() # 못찾아 올 수도 있다!
Out [11]:
{'documents': [],
 'meta': {'is_end': True, 'pageable_count': 0, 'total_count': 0}}
In [12]:
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)
In [13]:
r.json()
Out [13]:
{'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 약국
In [14]:
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)
In [15]:
r.json()
Out [15]:
{'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}}

데이터 처리

In [16]:
data.info()
Out [16]:
<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

  • 검색의 정확성을 위해 주소의 괄호삭제
In [17]:
data.head(1)
Out [17]:
지역 읍면동 전화번호 주소 일반현황 청사현황 자치센터현황 데이터기준일자 Unnamed: 8
0 제주시 일도1동 064-728-4412 제주특별자치도 제주시 중앙로7길 15 (일도일동) 인구 3146명 / 면적 0.33㎢ / 11통 61개반 지상 3층 / 연면적 585㎡ 개소일 2000-12-20 2019-06-20 NaN
In [18]:
# 1. Unnamed: 8 column제거
data.drop(columns=['Unnamed: 8'], inplace=True)
# data.drop(['Unnamed: 8'], axis=1, inplace=True)
data.head(1)
Out [18]:
지역 읍면동 전화번호 주소 일반현황 청사현황 자치센터현황 데이터기준일자
0 제주시 일도1동 064-728-4412 제주특별자치도 제주시 중앙로7길 15 (일도일동) 인구 3146명 / 면적 0.33㎢ / 11통 61개반 지상 3층 / 연면적 585㎡ 개소일 2000-12-20 2019-06-20
In [19]:
# 2. 주소에서 ()부분 제거
data['주소'] = data['주소'].str.split('(').str.get(0)
data.head(1)
Out [19]:
지역 읍면동 전화번호 주소 일반현황 청사현황 자치센터현황 데이터기준일자
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를 이용해서 적용
  • 결과값이 없을 경우 ‘결과없음’으로 처리
In [20]:
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 '결과없음'
In [21]:
# 작동확인
get_yx('제주특별자치도 제주시 중앙로7길 15')
Out [21]:
['33.5150582697264', '126.526377102562']
In [22]:
get_yx('제주특별자치도 제주시 고마로 28')
Out [22]:
'결과없음'
In [23]:
# apply를 이용해 함수 일괄적용
data['위치'] = data['주소'].apply(get_yx)
data.head(3)
Out [23]:
지역 읍면동 전화번호 주소 일반현황 청사현황 자치센터현황 데이터기준일자 위치
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)
In [24]:
import folium
from folium.plugins import MarkerCluster
In [25]:
jeju_loc = (33.361646, 126.5291977)
In [27]:
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
Out [27]:
Make this Notebook Trusted to load map: File -> Trust Notebook
  • apply 이용
In [28]:
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
Out [28]:
Make this Notebook Trusted to load map: File -> Trust Notebook

속도상 iterrow보다 apply가 조금 더 빠르다

제주도 인구수 데이터

데이터 전처리

지역, 읍면동을 이용해 영역을 구분짓고 인구수에 따라 색칠

In [29]:
data.head(2)
Out [29]:
지역 읍면동 전화번호 주소 일반현황 청사현황 자치센터현황 데이터기준일자 위치
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 결과없음
  • 일반현황에서 인구수를 추출 ‘인구수 컬럼을 추가, 데이터 타입은 정수형으로 저장
In [30]:
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] # 문제가 있음
Out [30]:
'가구'
In [31]:
import re
In [32]:
data['일반현황'].apply(lambda x: int(re.search('[0-9]{4,}', x).group()))[36] # 문제가 있음
Out [32]:
2082
In [33]:
temp = data['일반현황'].str.split('/').str.get(0).str.split('(').str.get(0).str.split().str.get(-1).str.replace('명', '').astype(int)
temp[36] # 문제해결
Out [33]:
4980
In [34]:
data['인구'] = temp
data.head(3)
Out [34]:
지역 읍면동 전화번호 주소 일반현황 청사현황 자치센터현황 데이터기준일자 위치 인구
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와 데이터의 지역명을 통일
In [35]:
data.지역.value_counts()
Out [35]:
제주시     26
서귀포시    17
Name: 지역, dtype: int64
In [36]:
data['지역명'] = data['지역'].replace(['제주시', '서귀포시'], ['Jeju', 'Seogwipo']) # str에 replace하면 일부 변경 # Series의 replace는 모두 같아야 변경, 리스트로 가능
data.head(3)
Out [36]:
지역 읍면동 전화번호 주소 일반현황 청사현황 자치센터현황 데이터기준일자 위치 인구 지역명
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

데이터 시각화

  • 지역명으로 인구수 묶기
In [37]:
result = data.groupby(['지역명'])['인구'].sum().reset_index() # 정수형이 하나뿐이라 안적어도 됨
result
Out [37]:
지역명 인구
0 Jeju 462396
1 Seogwipo 167641
In [38]:
import json
In [39]:
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
Out [39]:
Make this Notebook Trusted to load map: File -> Trust Notebook
  • 읍면동으로 나눠서 표시
In [40]:
data.head(3)
Out [40]:
지역 읍면동 전화번호 주소 일반현황 청사현황 자치센터현황 데이터기준일자 위치 인구 지역명
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와 읍면동이 일치

In [41]:
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
Out [41]:
Make this Notebook Trusted to load map: File -> Trust Notebook

geojson 전국을 잘라서, id 만들어 넣기
주민등록상 인구를 기준으로

Reference

  • 이 포스트는 SeSAC 인공지능 자연어처리, 컴퓨터비전 기술을 활용한 응용 SW 개발자 양성 과정 - 심선조 강사님의 강의를 정리한 내용입니다.
  • Kakao developers
  • Requests

댓글남기기