강의영상

- (1/3) Choropleth Map (1) :: 11월24일강의-1

- (2/3) Choropleth Map (2) :: 11월24일강의-2

- (3/3) Choropleth Map (3) :: 11월24일강의-3

- (4/6) folium: 한국지도 그리기 :: 11월29일강의-1

- (5/6) plotly: 한국지도 그리기 (1) :: 11월29일강의-2

- (6/6) plotly: 한국지도 그리기 (2) :: 11월29일강의-3

imports

import folium 
import pandas as pd 
import json 
import requests 

Choropleth Map 시작: 지역구그리기

local_distriction_jsonurl='https://raw.githubusercontent.com/southkorea/southkorea-maps/master/kostat/2018/json/skorea-municipalities-2018-geo.json'
global_distriction_jsonurl='https://raw.githubusercontent.com/southkorea/southkorea-maps/master/kostat/2018/json/skorea-provinces-2018-geo.json'
local_dict = json.loads(requests.get(local_distriction_jsonurl).text)
global_dict = json.loads(requests.get(global_distriction_jsonurl).text)
  • 잔뜩 복잡해보이는 파일이 일단 dict형태로 있음.

- 지역을 global scale로 시각화.

m = folium.Map([36,128],zoom_start=7,scrollWheelZoom=False)
folium.Choropleth(geo_data=global_dict).add_to(m)
#m
<folium.features.Choropleth at 0x7f0f0640c760>

- 지역을 local scale로 시각화

m = folium.Map([36,128],zoom_start=7,scrollWheelZoom=False)
folium.Choropleth(geo_data=local_dict).add_to(m)
#m
<folium.features.Choropleth at 0x7f0f1069bdc0>

json 파일 뜯어보기

- local_dict 를 살펴보자.

local_dict?
Type:        dict
String form: {'type': 'FeatureCollection', 'features': [{'type': 'Feature', 'geometry': {'type': 'MultiPolygon <...>  'name': 'sgg', 'crs': {'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:OGC:1.3:CRS84'}}}
Length:      4
Docstring:  
dict() -> new empty dictionary
dict(mapping) -> new dictionary initialized from a mapping object's
    (key, value) pairs
dict(iterable) -> new dictionary initialized as if via:
    d = {}
    for k, v in iterable:
        d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
    in the keyword argument list.  For example:  dict(one=1, two=2)
  • 4개의 원소를 가지는 딕셔너리

- 원소의 이름은 아래와 같이 확인가능

local_dict.keys()
dict_keys(['type', 'features', 'name', 'crs'])
  • type, features, name, crs

- type, name, crs 부터 살펴보자.

local_dict['type']
'FeatureCollection'
local_dict['name']
'sgg'
local_dict['crs']
{'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:OGC:1.3:CRS84'}}

- 위의 3개는 특별한것이 없어보임. 이제 features를 살펴보자.

_features = local_dict['features']
  • 길이가 250인 list
  • 250의 리스트는 각각의 구(혹은 군,시)를 의미하는것 같다.
_features[0] # 첫번째 구 
{'type': 'Feature',
 'geometry': {'type': 'MultiPolygon',
  'coordinates': [[[[126.97468086053324, 37.629805433945975],
     [126.97496550641705, 37.62902584732434],
     [126.97619200024447, 37.629086831818235],
     [126.97841861289852, 37.62929009924553],
     [126.97952791872238, 37.62889299772442],
     [126.97993254143336, 37.62855138674378],
     [126.97997245663913, 37.62845560448294],
     [126.98004544991201, 37.628280435760445],
     [126.97960294035302, 37.626371002121644],
     [126.98090237068868, 37.625391798020395],
     [126.98168803207568, 37.62449661776251],
     [126.98184774907679, 37.62431463061319],
     [126.98310978892584, 37.622104640078],
     [126.98365101056845, 37.62115092912986],
     [126.98355888565348, 37.620963267437894],
     [126.98317999257362, 37.62018285183479],
     [126.9831620682276, 37.6192347829173],
     [126.9837143460292, 37.61775856638039],
     [126.98453643307462, 37.61598061074333],
     [126.985901535693, 37.612194740823796],
     [126.9857804843237, 37.61090698776889],
     [126.98586523076781, 37.60946995153532],
     [126.98623831468637, 37.607736782107125],
     [126.98675598705915, 37.60608704965549],
     [126.98677074181907, 37.60458661863664],
     [126.9866691435352, 37.604023824468506],
     [126.98589778740545, 37.60363176153766],
     [126.98259603020061, 37.60224271097029],
     [126.9806843648502, 37.60161031225276],
     [126.97880665420949, 37.60101042316433],
     [126.97852169405631, 37.60099248777431],
     [126.97841693568347, 37.600914296754326],
     [126.97830701720335, 37.600830447643865],
     [126.97768193317589, 37.60024002437466],
     [126.9774909383084, 37.599649166074286],
     [126.97719804274786, 37.59864847380904],
     [126.97672044958631, 37.59790077442683],
     [126.97713557023776, 37.59768356016227],
     [126.97874017601505, 37.59663493476611],
     [126.97911091252222, 37.596394270916285],
     [126.98148823597326, 37.59533576215007],
     [126.98292059990969, 37.594775982193624],
     [126.98384405286397, 37.59443543461552],
     [126.98432317109803, 37.59437806733553],
     [126.98450416009975, 37.59437471448865],
     [126.9846156223434, 37.59438909275369],
     [126.98463785016311, 37.59439408049888],
     [126.98464216134765, 37.59439557572296],
     [126.98466445483236, 37.59440401859687],
     [126.98474441343951, 37.594434717703415],
     [126.98479058424006, 37.594451906863895],
     [126.98487868712496, 37.59446656147479],
     [126.98514831673403, 37.594501790677405],
     [126.98542946037894, 37.59444945443447],
     [126.98577892249222, 37.59425495254234],
     [126.98851705023388, 37.59194143989685],
     [126.98886704210804, 37.59164472228141],
     [126.98907495209343, 37.59142090222344],
     [126.98908433025534, 37.59140908294205],
     [126.98962720754243, 37.59139763837295],
     [126.99366158210871, 37.59149362412968],
     [126.99744340490047, 37.59221011675905],
     [126.99845395445548, 37.59247126210828],
     [127.00182654761254, 37.59117745103071],
     [127.00408062474574, 37.58773357887768],
     [127.00656012457411, 37.58553460128624],
     [127.00863797169242, 37.58045993171883],
     [127.01051131122689, 37.58025727035416],
     [127.0111260694579, 37.58104392936677],
     [127.0111791729006, 37.58109176738164],
     [127.01169858419944, 37.58150458110694],
     [127.0117885968101, 37.58157458058202],
     [127.0120845128743, 37.581585674737156],
     [127.01222457400928, 37.581550873062085],
     [127.0124187027769, 37.58150235525185],
     [127.01253278245557, 37.58147102693477],
     [127.01262598550882, 37.58144402349896],
     [127.01274334585422, 37.58141185855377],
     [127.01285982629548, 37.58138609392204],
     [127.01314825156626, 37.58143362114355],
     [127.01324571819538, 37.58145032393419],
     [127.0141191759168, 37.581820171723166],
     [127.01474563580459, 37.582305831258346],
     [127.01483334205895, 37.58233145649853],
     [127.01491713941482, 37.582244907556685],
     [127.01638580146992, 37.58193775580977],
     [127.01673363020068, 37.58169269831286],
     [127.01829142498933, 37.579049416348774],
     [127.01830026223921, 37.57903270179077],
     [127.0187770633223, 37.57751723332606],
     [127.02179265953254, 37.57888146291368],
     [127.02313849621643, 37.57802087910892],
     [127.02336168058478, 37.57191110395814],
     [127.0231368263208, 37.57196081106164],
     [127.01902025943656, 37.57101323682973],
     [127.01733386994712, 37.570076865408346],
     [127.01003508740953, 37.569770822171066],
     [127.00983517715241, 37.569764939352325],
     [127.00667501959796, 37.5696322906642],
     [127.00331554021028, 37.56962809025019],
     [127.00166446511412, 37.56954949223042],
     [126.99997987347145, 37.5692153342546],
     [126.99979663625149, 37.569179012484],
     [126.99919901238287, 37.569061584986855],
     [126.99894910731591, 37.56901456760983],
     [126.99872661605082, 37.56897317063658],
     [126.99854409537699, 37.568939937981746],
     [126.99823033791377, 37.56888559029638],
     [126.99795832632955, 37.56884081225306],
     [126.99734249535118, 37.56876646165091],
     [126.99683684418163, 37.568709851806034],
     [126.99646755692298, 37.56866901280384],
     [126.99624859929914, 37.56864873037851],
     [126.9908841263958, 37.568202068530944],
     [126.99015096670833, 37.56813614100136],
     [126.9899958620981, 37.568128802881496],
     [126.98961154520899, 37.5681113107368],
     [126.98956785452701, 37.56810990322031],
     [126.98946917417102, 37.5681067923079],
     [126.98894530081218, 37.56810280048161],
     [126.98892726902085, 37.56810279903639],
     [126.98892019626068, 37.56810279906341],
     [126.98838782923946, 37.56812610223998],
     [126.9882334327857, 37.568133130541256],
     [126.98821751956565, 37.56813396831202],
     [126.98663917909906, 37.568232328822624],
     [126.97973830842082, 37.5690421486377],
     [126.97762523789515, 37.569298907580105],
     [126.97566360541524, 37.56938088043951],
     [126.96909869121171, 37.56824768293371],
     [126.96669861216496, 37.565820355825934],
     [126.9657113705709, 37.56677550324494],
     [126.95940037405296, 37.57304934989536],
     [126.95491745681615, 37.577149174890465],
     [126.95355819355073, 37.578748855084044],
     [126.95362029368313, 37.57880909633655],
     [126.95720618763337, 37.5798655310825],
     [126.9575728370125, 37.58230278085636],
     [126.95799889706633, 37.58412468840079],
     [126.95799717111329, 37.58444209574531],
     [126.95790145320846, 37.584703977736275],
     [126.95782691437041, 37.58485252016721],
     [126.95784782389684, 37.585019116837834],
     [126.95783833056504, 37.58504093891924],
     [126.9578273214224, 37.58506624584095],
     [126.95747215846923, 37.5860469085176],
     [126.95737395766116, 37.587076849872744],
     [126.9573886107174, 37.58906602474426],
     [126.95749035641607, 37.59007828277017],
     [126.95779750312285, 37.592573592797144],
     [126.95852639147067, 37.59418568474202],
     [126.95902399975766, 37.59479744400614],
     [126.95903333866578, 37.59505902103998],
     [126.95826848335163, 37.597788688618316],
     [126.9580418874916, 37.598155874167304],
     [126.95771415677586, 37.59836707719559],
     [126.9573078320294, 37.5985310319704],
     [126.95654122604887, 37.598827579847494],
     [126.95634147535245, 37.59892143950143],
     [126.95414105350225, 37.59909827963582],
     [126.95338041139009, 37.599531288469684],
     [126.95259689745177, 37.60122903220133],
     [126.95250806229828, 37.60156792706982],
     [126.95237511989355, 37.602476036294],
     [126.95356668581537, 37.60447934849368],
     [126.95376271651638, 37.60469036467159],
     [126.95388420830209, 37.60480196572351],
     [126.95254683214502, 37.60665255755602],
     [126.95220372203077, 37.60688813942989],
     [126.95056465460655, 37.60835968464961],
     [126.95033780725277, 37.60909261594867],
     [126.95036280527036, 37.610622635741834],
     [126.94982875644766, 37.61165624620594],
     [126.94986821104538, 37.611730018151725],
     [126.95047793576704, 37.6128699970444],
     [126.95073164301206, 37.61352828204463],
     [126.95079658268352, 37.613849365294406],
     [126.95072414848573, 37.615537943529716],
     [126.95046953204748, 37.616099153508785],
     [126.94986337153628, 37.61872668218891],
     [126.94889796158519, 37.623262743943236],
     [126.94900026337734, 37.6243351349276],
     [126.94971290787633, 37.625344069539224],
     [126.94981195859722, 37.625497586539126],
     [126.95045372101613, 37.626418006443956],
     [126.95556524710337, 37.62828290175954],
     [126.95841841842733, 37.629469751140356],
     [126.96011573909414, 37.62977556572832],
     [126.96708433443806, 37.63070658019315],
     [126.97302977391784, 37.6323747679206],
     [126.97538835725105, 37.63173308759023],
     [126.97536907543345, 37.631698170595676],
     [126.97508476623943, 37.63118349920217],
     [126.97468086053324, 37.629805433945975]]]]},
 'properties': {'name': '종로구',
  'base_year': '2018',
  'name_eng': 'Jongno-gu',
  'code': '11010'}}
  • 첫번째 구는 다시 3개의 원소로 구성된 딕셔너리
_features[0]['type']
'Feature'
_features[0]['geometry']
{'type': 'MultiPolygon',
 'coordinates': [[[[126.97468086053324, 37.629805433945975],
    [126.97496550641705, 37.62902584732434],
    [126.97619200024447, 37.629086831818235],
    [126.97841861289852, 37.62929009924553],
    [126.97952791872238, 37.62889299772442],
    [126.97993254143336, 37.62855138674378],
    [126.97997245663913, 37.62845560448294],
    [126.98004544991201, 37.628280435760445],
    [126.97960294035302, 37.626371002121644],
    [126.98090237068868, 37.625391798020395],
    [126.98168803207568, 37.62449661776251],
    [126.98184774907679, 37.62431463061319],
    [126.98310978892584, 37.622104640078],
    [126.98365101056845, 37.62115092912986],
    [126.98355888565348, 37.620963267437894],
    [126.98317999257362, 37.62018285183479],
    [126.9831620682276, 37.6192347829173],
    [126.9837143460292, 37.61775856638039],
    [126.98453643307462, 37.61598061074333],
    [126.985901535693, 37.612194740823796],
    [126.9857804843237, 37.61090698776889],
    [126.98586523076781, 37.60946995153532],
    [126.98623831468637, 37.607736782107125],
    [126.98675598705915, 37.60608704965549],
    [126.98677074181907, 37.60458661863664],
    [126.9866691435352, 37.604023824468506],
    [126.98589778740545, 37.60363176153766],
    [126.98259603020061, 37.60224271097029],
    [126.9806843648502, 37.60161031225276],
    [126.97880665420949, 37.60101042316433],
    [126.97852169405631, 37.60099248777431],
    [126.97841693568347, 37.600914296754326],
    [126.97830701720335, 37.600830447643865],
    [126.97768193317589, 37.60024002437466],
    [126.9774909383084, 37.599649166074286],
    [126.97719804274786, 37.59864847380904],
    [126.97672044958631, 37.59790077442683],
    [126.97713557023776, 37.59768356016227],
    [126.97874017601505, 37.59663493476611],
    [126.97911091252222, 37.596394270916285],
    [126.98148823597326, 37.59533576215007],
    [126.98292059990969, 37.594775982193624],
    [126.98384405286397, 37.59443543461552],
    [126.98432317109803, 37.59437806733553],
    [126.98450416009975, 37.59437471448865],
    [126.9846156223434, 37.59438909275369],
    [126.98463785016311, 37.59439408049888],
    [126.98464216134765, 37.59439557572296],
    [126.98466445483236, 37.59440401859687],
    [126.98474441343951, 37.594434717703415],
    [126.98479058424006, 37.594451906863895],
    [126.98487868712496, 37.59446656147479],
    [126.98514831673403, 37.594501790677405],
    [126.98542946037894, 37.59444945443447],
    [126.98577892249222, 37.59425495254234],
    [126.98851705023388, 37.59194143989685],
    [126.98886704210804, 37.59164472228141],
    [126.98907495209343, 37.59142090222344],
    [126.98908433025534, 37.59140908294205],
    [126.98962720754243, 37.59139763837295],
    [126.99366158210871, 37.59149362412968],
    [126.99744340490047, 37.59221011675905],
    [126.99845395445548, 37.59247126210828],
    [127.00182654761254, 37.59117745103071],
    [127.00408062474574, 37.58773357887768],
    [127.00656012457411, 37.58553460128624],
    [127.00863797169242, 37.58045993171883],
    [127.01051131122689, 37.58025727035416],
    [127.0111260694579, 37.58104392936677],
    [127.0111791729006, 37.58109176738164],
    [127.01169858419944, 37.58150458110694],
    [127.0117885968101, 37.58157458058202],
    [127.0120845128743, 37.581585674737156],
    [127.01222457400928, 37.581550873062085],
    [127.0124187027769, 37.58150235525185],
    [127.01253278245557, 37.58147102693477],
    [127.01262598550882, 37.58144402349896],
    [127.01274334585422, 37.58141185855377],
    [127.01285982629548, 37.58138609392204],
    [127.01314825156626, 37.58143362114355],
    [127.01324571819538, 37.58145032393419],
    [127.0141191759168, 37.581820171723166],
    [127.01474563580459, 37.582305831258346],
    [127.01483334205895, 37.58233145649853],
    [127.01491713941482, 37.582244907556685],
    [127.01638580146992, 37.58193775580977],
    [127.01673363020068, 37.58169269831286],
    [127.01829142498933, 37.579049416348774],
    [127.01830026223921, 37.57903270179077],
    [127.0187770633223, 37.57751723332606],
    [127.02179265953254, 37.57888146291368],
    [127.02313849621643, 37.57802087910892],
    [127.02336168058478, 37.57191110395814],
    [127.0231368263208, 37.57196081106164],
    [127.01902025943656, 37.57101323682973],
    [127.01733386994712, 37.570076865408346],
    [127.01003508740953, 37.569770822171066],
    [127.00983517715241, 37.569764939352325],
    [127.00667501959796, 37.5696322906642],
    [127.00331554021028, 37.56962809025019],
    [127.00166446511412, 37.56954949223042],
    [126.99997987347145, 37.5692153342546],
    [126.99979663625149, 37.569179012484],
    [126.99919901238287, 37.569061584986855],
    [126.99894910731591, 37.56901456760983],
    [126.99872661605082, 37.56897317063658],
    [126.99854409537699, 37.568939937981746],
    [126.99823033791377, 37.56888559029638],
    [126.99795832632955, 37.56884081225306],
    [126.99734249535118, 37.56876646165091],
    [126.99683684418163, 37.568709851806034],
    [126.99646755692298, 37.56866901280384],
    [126.99624859929914, 37.56864873037851],
    [126.9908841263958, 37.568202068530944],
    [126.99015096670833, 37.56813614100136],
    [126.9899958620981, 37.568128802881496],
    [126.98961154520899, 37.5681113107368],
    [126.98956785452701, 37.56810990322031],
    [126.98946917417102, 37.5681067923079],
    [126.98894530081218, 37.56810280048161],
    [126.98892726902085, 37.56810279903639],
    [126.98892019626068, 37.56810279906341],
    [126.98838782923946, 37.56812610223998],
    [126.9882334327857, 37.568133130541256],
    [126.98821751956565, 37.56813396831202],
    [126.98663917909906, 37.568232328822624],
    [126.97973830842082, 37.5690421486377],
    [126.97762523789515, 37.569298907580105],
    [126.97566360541524, 37.56938088043951],
    [126.96909869121171, 37.56824768293371],
    [126.96669861216496, 37.565820355825934],
    [126.9657113705709, 37.56677550324494],
    [126.95940037405296, 37.57304934989536],
    [126.95491745681615, 37.577149174890465],
    [126.95355819355073, 37.578748855084044],
    [126.95362029368313, 37.57880909633655],
    [126.95720618763337, 37.5798655310825],
    [126.9575728370125, 37.58230278085636],
    [126.95799889706633, 37.58412468840079],
    [126.95799717111329, 37.58444209574531],
    [126.95790145320846, 37.584703977736275],
    [126.95782691437041, 37.58485252016721],
    [126.95784782389684, 37.585019116837834],
    [126.95783833056504, 37.58504093891924],
    [126.9578273214224, 37.58506624584095],
    [126.95747215846923, 37.5860469085176],
    [126.95737395766116, 37.587076849872744],
    [126.9573886107174, 37.58906602474426],
    [126.95749035641607, 37.59007828277017],
    [126.95779750312285, 37.592573592797144],
    [126.95852639147067, 37.59418568474202],
    [126.95902399975766, 37.59479744400614],
    [126.95903333866578, 37.59505902103998],
    [126.95826848335163, 37.597788688618316],
    [126.9580418874916, 37.598155874167304],
    [126.95771415677586, 37.59836707719559],
    [126.9573078320294, 37.5985310319704],
    [126.95654122604887, 37.598827579847494],
    [126.95634147535245, 37.59892143950143],
    [126.95414105350225, 37.59909827963582],
    [126.95338041139009, 37.599531288469684],
    [126.95259689745177, 37.60122903220133],
    [126.95250806229828, 37.60156792706982],
    [126.95237511989355, 37.602476036294],
    [126.95356668581537, 37.60447934849368],
    [126.95376271651638, 37.60469036467159],
    [126.95388420830209, 37.60480196572351],
    [126.95254683214502, 37.60665255755602],
    [126.95220372203077, 37.60688813942989],
    [126.95056465460655, 37.60835968464961],
    [126.95033780725277, 37.60909261594867],
    [126.95036280527036, 37.610622635741834],
    [126.94982875644766, 37.61165624620594],
    [126.94986821104538, 37.611730018151725],
    [126.95047793576704, 37.6128699970444],
    [126.95073164301206, 37.61352828204463],
    [126.95079658268352, 37.613849365294406],
    [126.95072414848573, 37.615537943529716],
    [126.95046953204748, 37.616099153508785],
    [126.94986337153628, 37.61872668218891],
    [126.94889796158519, 37.623262743943236],
    [126.94900026337734, 37.6243351349276],
    [126.94971290787633, 37.625344069539224],
    [126.94981195859722, 37.625497586539126],
    [126.95045372101613, 37.626418006443956],
    [126.95556524710337, 37.62828290175954],
    [126.95841841842733, 37.629469751140356],
    [126.96011573909414, 37.62977556572832],
    [126.96708433443806, 37.63070658019315],
    [126.97302977391784, 37.6323747679206],
    [126.97538835725105, 37.63173308759023],
    [126.97536907543345, 37.631698170595676],
    [126.97508476623943, 37.63118349920217],
    [126.97468086053324, 37.629805433945975]]]]}
_features[0]['properties']
{'name': '종로구', 'base_year': '2018', 'name_eng': 'Jongno-gu', 'code': '11010'}

- _features[0] 는 다시 dict 타입이다. 길이가3, 키는 type, geometry, properties 이다. 이중에서 type은 별 정보가 없고 geometry에는 멀티폴리곤 지옴에 대한 좌표값이 정리되어있다. 그리고 properties에는 이름, 영문이름, 코드와 같은 정보들이 정리되어 있다.

_features[200]['properties']['name']
'진도군'

- 덕진과와 완산구를 찾아보자.

_lst =[_features[i]['properties']['name'] for i in range(250)]
_lst[:10]
['종로구', '중구', '용산구', '성동구', '광진구', '동대문구', '중랑구', '성북구', '강북구', '도봉구']

- 전주시완산구, 전주시덕진구가 있다. (도시의 크기에 따라서 구/군/시 등으로 표기됨)

- 전주시완산구, 전주시덕진구가 _lst의 몇번째에 위치할까?

(예비학습) 리스트에서 특정 원소가 위치한 인덱스를 알아내는 방법 (where)

['a','b','c'].index('c')
2

예비학습끝

_lst.index('전주시덕진구')
166
_lst.index('전주시완산구')
165
_lst.index(['전주시완산구','전주시덕진구'])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_345960/3397077376.py in <module>
----> 1 _lst.index(['전주시완산구','전주시덕진구'])

ValueError: ['전주시완산구', '전주시덕진구'] is not in list
_keywords=['전주시완산구','전주시덕진구']
[_lst.index(_keywords[i]) for i in range(2)] # 구식프로그래밍 
[165, 166]
_keywords=['전주시완산구','전주시덕진구']
[_lst.index(i) for i in _keywords] #신식(?)프로그래밍 
[165, 166]
_keywords=['전주시완산구','전주시덕진구']
[_lst.index(keyword) for keyword in _keywords] # 가독성향상  
[165, 166]
[_lst.index(keyword) for keyword in ['전주시완산구','전주시덕진구']] # compact
[165, 166]

- local_dict와 형식은 똑같은데 덕진구와 완산구만 포함한 local_dict2를 만들자.

(예비학습) VIEW vs COPY

dict1= {'a':1, 'b':2, 'c':3}
dict1
{'a': 1, 'b': 2, 'c': 3}
dict2=dict1 
dict2
{'a': 1, 'b': 2, 'c': 3}
dict2['b']=5
dict2
{'a': 1, 'b': 5, 'c': 3}
dict1
{'a': 1, 'b': 5, 'c': 3}
  • 또 이상한 일이 생김.
  • 이러한 현상을 피하기 위해서는 dict2가 dict1의 카피임을 명시해야 한다. (현재는 dict2가 dict1의 바로가기 아이콘같은 존재)
dict1= {'a':1, 'b':2, 'c':3}
dict2=dict1.copy()
dict2['b']=5 
print(dict1)
print(dict2)
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 5, 'c': 3}
  • 카피임을 명시하니까 문제가 없어짐

(예비학습끝)

local_dict2 = local_dict.copy()
local_dict2.keys()
dict_keys(['type', 'features', 'name', 'crs'])
_keywords=['전주시완산구','전주시덕진구']
_jj = [_lst.index(keyword) for keyword in _keywords] 
_jj
[165, 166]
local_dict2['features'] = [local_dict['features'][j] for j in _jj]

전주시에 해당하는 구만 시각화해보자.

m = folium.Map([36,128],zoom_start=7,scrollWheelZoom=False)
folium.Choropleth(geo_data=local_dict2).add_to(m)
#m
<folium.features.Choropleth at 0x7f0f08c078b0>

- 좀 더 크게 + 위치조정 (전주시를 중심으로)

m = folium.Map([35.84195368311022, 127.1155556693179],zoom_start=11,scrollWheelZoom=False)
folium.Choropleth(geo_data=local_dict2).add_to(m)
#m
<folium.features.Choropleth at 0x7f0f106cf820>

덕진구 vs 완산구 시각화

- 아래와 같은 그림에서 덕진구와 완산구의 어떠한 value를 비교하고 싶음 (카카오바이크 등)

m = folium.Map([35.84195368311022, 127.1155556693179],zoom_start=11,scrollWheelZoom=False)
folium.Choropleth(geo_data=local_dict2).add_to(m)
#m
<folium.features.Choropleth at 0x7f0f0960fee0>

- 선실습, 후설명

df = pd.DataFrame({'key':['전주시덕진구','전주시완산구'],'value':[20,30]})
df
key value
0 전주시덕진구 20
1 전주시완산구 30
m = folium.Map([35.84195368311022, 127.1155556693179],zoom_start=11,scrollWheelZoom=False)
choro = folium.Choropleth(
    data=df, 
    geo_data=local_dict2,
    columns=['key','value'],
    key_on = 'feature.properties.name'
)
choro.add_to(m) 
#m
<folium.features.Choropleth at 0x7f0f106cfeb0>

- folium.Choropleth 의 사용법

(이해를 위해 필요한 약간의 직관)

  • 뭔가 2개의 데이터를 연결해야하는 구조이다. 하나는 df, 다른하나는 json에서 나온 dict (local_dict2) 이다.
  • 데이터를 연결하기 위해서는 공유가능한 연결의 매개체가 필요하다. (cbind: row-index를 공유, rbind: colnames공유, merge: 양쪽 데이터프레임에서 같은 이름을 가진 특정 col이 있었음)
  • 연결의 매개체는 df와 local_dict2에 각각 존재하는데, df에서는 key라는 이름의 칼럼으로 저장했었고 local_dict2 에서는 local_dict2['features'][?]['properties']['name']에 있다.
local_dict2['features'][0]['properties']['name']
'전주시완산구'

(사용법)

choro = folium.Choropleth(
    data=df,  ## data1 
    geo_data=local_dict2, ## data2 (이 시점에서 폴리곤에 대한 정보가 choro 인스턴스에 전달) 
    columns=['key','value'], ## data1에서 중요한것들을 나열. 항상 [key,value]의 조합으로 써야한다. 
        # 이때 ['key','value']는 [data2와의 매개체,지도에서 색의 단계를 표현하는 변수]로 해석가능
    key_on = 'feature.properties.name' ## data2에서 중요한것: 즉 data1과의 연결매개체 
)

Note: folium.Choroplethkey_on 파라메터는 (1) 항상 feature로 시작하고 (2) 이후는에는 local_dict2[&#8217;features&#8217;][?]의 하위에 data1과 매칭되는 path를 찾음
 
local_dict2['features'][0]['properties']['name']
'전주시완산구'

- 당연히 영문이름을 매개체로 쓸 수 있다.

local_dict2['features'][0]['properties']['name_eng']
'Jeonjusiwansangu'
df = pd.DataFrame({'key':['전주시덕진구','Jeonjusiwansangu'],'value':[20,30]})
df
key value
0 전주시덕진구 20
1 Jeonjusiwansangu 30
m = folium.Map([35.84195368311022, 127.1155556693179],zoom_start=11,scrollWheelZoom=False)
choro = folium.Choropleth(
    data=df, 
    geo_data=local_dict2,
    columns=['key','value'],
    key_on = 'feature.properties.name'
)
choro.add_to(m) 
#m
<folium.features.Choropleth at 0x7f0f09aa47f0>
m = folium.Map([35.84195368311022, 127.1155556693179],zoom_start=11,scrollWheelZoom=False)
choro = folium.Choropleth(
    data=df, 
    geo_data=local_dict2,
    columns=['key','value'],
    key_on = 'feature.properties.name_eng'
)
choro.add_to(m) 
#m
<folium.features.Choropleth at 0x7f0f0ba7bbb0>

- 한글이름, 영문이름 뿐만이 아니라 code를 key_on으로 쓸 수 있음.

local_dict2['features'][0]['properties']
{'name': '전주시완산구',
 'base_year': '2018',
 'name_eng': 'Jeonjusiwansangu',
 'code': '35011'}
local_dict2['features'][1]['properties']
{'name': '전주시덕진구',
 'base_year': '2018',
 'name_eng': 'Jeonjusideokjingu',
 'code': '35012'}
df = pd.DataFrame({'key':['35012','35011'],'value':[20,30]})
df
key value
0 35012 20
1 35011 30
m = folium.Map([35.84195368311022, 127.1155556693179],zoom_start=11,scrollWheelZoom=False)
choro = folium.Choropleth(
    data=df, 
    geo_data=local_dict2,
    columns=['key','value'],
    key_on = 'feature.properties.code'
)
choro.add_to(m) 
#m
<folium.features.Choropleth at 0x7f0f0a09e0d0>

대한민국 인구수

대한민국 인구수 (global scale)

df=pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv')
df
행정구역(시군구)별 총인구수 (명)
0 서울특별시 9532428
1 부산광역시 3356311
2 대구광역시 2390721
3 인천광역시 2945009
4 광주광역시 1442454
5 대전광역시 1454228
6 울산광역시 1122566
7 세종특별자치시 368276
8 경기도 13549577
9 강원도 1537717
10 충청북도 1596948
11 충청남도 2118977
12 전라북도 1789770
13 전라남도 1834653
14 경상북도 2627925
15 경상남도 3318161
16 제주특별자치도 676569
m = folium.Map([35.84195368311022, 127.1155556693179],zoom_start=6,scrollWheelZoom=False)
choro= folium.Choropleth(
    data=df, 
    geo_data= global_dict, 
    columns=['행정구역(시군구)별','총인구수 (명)'], 
    key_on='feature.properties.name'
)
choro.add_to(m) 
#m
<folium.features.Choropleth at 0x7f0f0735d7f0>

대한민국 인구수 (local scale)

df=pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-muni.csv')
df
행정구역(시군구)별 총인구수 (명)
0 종로구 145346
1 중구 122781
2 용산구 223713
3 성동구 287174
4 광진구 340814
... ... ...
269 함양군 38475
270 거창군 61242
271 합천군 43029
272 제주시 493225
273 서귀포시 183344

274 rows × 2 columns

m = folium.Map([35.84195368311022, 127.1155556693179],zoom_start=7,scrollWheelZoom=False)
choro= folium.Choropleth(
    data=df, 
    geo_data= local_dict, 
    columns=['행정구역(시군구)별','총인구수 (명)'], 
    key_on='feature.properties.name'
)
choro.add_to(m) 
#m
<folium.features.Choropleth at 0x7f0f10d5a5e0>

plotly 맛보기

공식홈페이지 예제코드

import plotly.express as px
from IPython.display import HTML
df = px.data.election()
geojson = px.data.election_geojson()

fig = px.choropleth_mapbox(df, geojson=geojson, color="Bergeron",
                           locations="district", featureidkey="properties.district",
                           center={"lat": 45.5517, "lon": -73.7073},
                           mapbox_style="carto-positron", zoom=9)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
HTML(fig.to_html(include_plotlyjs='cdn',include_mathjax=False, config=dict({'scrollZoom':False})))
#fig.show(config=dict({'scrollZoom':False}))

구조파악

- 공식홈페이지의 예제를 뜯어보자.

df.head()
district Coderre Bergeron Joly total winner result district_id
0 101-Bois-de-Liesse 2481 1829 3024 7334 Joly plurality 101
1 102-Cap-Saint-Jacques 2525 1163 2675 6363 Joly plurality 102
2 11-Sault-au-Récollet 3348 2770 2532 8650 Coderre plurality 11
3 111-Mile-End 1734 4782 2514 9030 Bergeron majority 111
4 112-DeLorimier 1770 5933 3044 10747 Bergeron majority 112
 
  • properties의 district 혹은 id를 key로 한다.

- 코드를 다시 관찰하자.

df = px.data.election() ### 일반적인 데이터 프레임 
geojson = px.data.election_geojson() ### json파일 

fig = px.choropleth_mapbox(df,  ### 데이터프레임 
                           geojson=geojson, ### json파일 
                           color="Bergeron", ### df에서 코로플레스의 단계를 표시 
                           locations="district", ### df에 존재하는 연결변수 
                           featureidkey="properties.district", ### json에 존재하는 연결매개체
                           center={"lat": 45.5517, "lon": -73.7073}, 
                           mapbox_style="carto-positron", 
                           zoom=9)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show(config=dict({'scrollZoom':False}))

한국의 인구수를 plotly로 시각화

- 우리의 상황으로 바꾸면

df=pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv')
df
행정구역(시군구)별 총인구수 (명)
0 서울특별시 9532428
1 부산광역시 3356311
2 대구광역시 2390721
3 인천광역시 2945009
4 광주광역시 1442454
5 대전광역시 1454228
6 울산광역시 1122566
7 세종특별자치시 368276
8 경기도 13549577
9 강원도 1537717
10 충청북도 1596948
11 충청남도 2118977
12 전라북도 1789770
13 전라남도 1834653
14 경상북도 2627925
15 경상남도 3318161
16 제주특별자치도 676569
geojson = global_dict ### json파일 

fig = px.choropleth_mapbox(df,  ### 데이터프레임 
                           geojson=geojson, ### json파일 
                           color="총인구수 (명)", ### df에서 코로플레스의 단계를 표시 
                           locations="행정구역(시군구)별", ### df에 존재하는 연결변수 
                           featureidkey="properties.name", ### json에 존재하는 연결매개체
                           center={"lat": 35.84195368311022, "lon": 127.1155556693179}, 
                           mapbox_style="carto-positron", 
                           zoom=5)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
HTML(fig.to_html(include_plotlyjs='cdn',include_mathjax=False, config=dict({'scrollZoom':False})))