본문 바로가기
재미로 하는 코딩

folium, plotly로 스타벅스 매장 표시해보기

by 헬푸밍 2023. 2. 12.

저번에 미니프로젝트로 스타벅스 매장 데이터를 수집했다!

2023.01.31 - [멋쟁이사자처럼 AI스쿨] - 멋쟁이사자처럼 miniproject1(스타벅스 매장 정보 수집하기)

 

멋쟁이사자처럼 miniproject1(스타벅스 매장 정보 수집하기)

멋쟁이 사자처럼 수강을 하면서 첫 프로젝트가 닥쳤다! 평소에 커피를 많이 좋아하기 때문에... 여러 데이터 중 스타벅스 매장 데이터를 수집해보기로 했다! 일단 데이터를 수집하고...(post방식)

helpming.tistory.com

 

이 매장 데이터로 스타벅스 매장을 지도에 표시해보고...

코로플리스 지도도 그려보자!

 

일단 필요라이브러리를 불러오자!

import pandas as pd
import numpy as np
import plotly.express as px
import seaborn as sns
import koreanize_matplotlib

 

starbucks_store데이터를 불러오고...

확인!

starbucks_store = pd.read_csv('data/starbucks_store.csv')
starbucks_store

 

근데 시도에 강원도랑 강원이 따로따로 표시되어있다!
이렇게...

starbucks_store[starbucks_store['시도'] == '강원도']

starbucks_store[starbucks_store['시도'] == '강원']

 

그래서  시도를 강원으로 통일해 준다!

starbucks_store.loc[starbucks_store['시도'] == '강원도', '시도'] = '강원'

 

이제 전국 스타벅스매장을 매장타입별로 표시해볼거다!

 

folium을 import하고...

import folium

 

한국의 위경도를 전국 매장의 위경도 중앙값으로 설정해준 뒤...

마우스를 가까이하면 매장이름-도로명주소가 나오게끔 설정!

그리고 드라이브스루매장은 노란색

일반매장은 초록색

리저브매장은 파란색

드라이브스루앤리저브매장은 빨간색으로 표시했다!

korea_latlong = starbucks_store[['위도', '경도']].mean().values

f_map = folium.Map(korea_latlong, zoom_start=7, tiles="Stamen Toner")

for i in starbucks_store.index:
    sub_lat = starbucks_store.loc[i, "위도"]
    sub_long = starbucks_store.loc[i, "경도"]
    
    store_type = starbucks_store.loc[i, '매장타입']
    title = f"{starbucks_store.loc[i, '매장이름']} - {starbucks_store.loc[i, '도로명주소']}"
    color = {"DriveThrough":"yellow", "General":"green", "Reserve":"blue", "DriveThrough&Reserve":"red"}
    
    folium.CircleMarker([sub_lat, sub_long],
                        radius=3,
                        color=color[store_type],
                        tooltip=title).add_to(f_map)
f_map

이렇게 지도가 그려졌다!

리저브매장과 드라이브스루앤리저브 매장은 적어서 잘 안보인다!

 

이번엔 코로플리스 지도를 그려볼건데...

먼저 plotly로 전국 코로플리스 지도를 그려보자!

 

json데이터를 읽어오기 위한 모듈들을 import해주고...

필요 url주소도 지정해주고....

ko_geojson에 위경도 json을 넣어줬다!

from urllib.request import urlopen
import json

south_korea_url = "https://raw.githubusercontent.com/southkorea/southkorea-maps/master/kostat/2018/json/skorea-provinces-2018-geo.json"

with urlopen(south_korea_url) as response:
    ko_geojson = json.load(response)
ko_geojson['features'][0]['properties']

근데... name이 서울이 아니라 서울특별시라...

시도를 맞춰주기위한 작업이 필요하다!

 

starbucks_store의 시도를 geojson의 name과 맞춰준다!

#geojson과 이름을 일치시키기위해 변경
starbucks_store.loc[starbucks_store['시도'] == '강원', '시도'] = '강원도'
starbucks_store.loc[starbucks_store['시도'] == '경기', '시도'] = '경기도'
starbucks_store.loc[starbucks_store['시도'] == '경남', '시도'] = '경상남도'
starbucks_store.loc[starbucks_store['시도'] == '경북', '시도'] = '경상북도'
starbucks_store.loc[starbucks_store['시도'] == '광주', '시도'] = '광주광역시'
starbucks_store.loc[starbucks_store['시도'] == '대구', '시도'] = '대구광역시'
starbucks_store.loc[starbucks_store['시도'] == '대전', '시도'] = '대전광역시'
starbucks_store.loc[starbucks_store['시도'] == '부산', '시도'] = '부산광역시'
starbucks_store.loc[starbucks_store['시도'] == '서울', '시도'] = '서울특별시'
starbucks_store.loc[starbucks_store['시도'] == '세종', '시도'] = '세종특별자치시'
starbucks_store.loc[starbucks_store['시도'] == '울산', '시도'] = '울산광역시'
starbucks_store.loc[starbucks_store['시도'] == '인천', '시도'] = '인천광역시'
starbucks_store.loc[starbucks_store['시도'] == '전남', '시도'] = '전라남도'
starbucks_store.loc[starbucks_store['시도'] == '전북', '시도'] = '전라북도'
starbucks_store.loc[starbucks_store['시도'] == '제주', '시도'] = '제주특별자치도'
starbucks_store.loc[starbucks_store['시도'] == '충남', '시도'] = '충청남도'
starbucks_store.loc[starbucks_store['시도'] == '충북', '시도'] = '충청북도'

 

이제 시도별로 매장수 데이터만 뽑으면...

starbucks_by_sido = starbucks_store.groupby(['시도'])['매장이름'].count().fillna(0).astype(int)
starbucks_by_sido = starbucks_by_sido.reset_index()
starbucks_by_sido = starbucks_by_sido.rename(columns={'매장이름':'매장수'})
starbucks_by_sido

매장수 데이터가 나온다!

 

plotly를 이용해 코로플리스 지도를 그려보면...

import plotly.express as px

fig = px.choropleth(starbucks_by_sido, geojson=ko_geojson, color="매장수",
                    locations="시도", featureidkey="properties.name", labels="시도",
                    projection="mercator", color_continuous_scale=px.colors.colorbrewer.Greens)
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})

 

이런데...

서울 경기 말고는 매장의 절대적인 수가 작아서 한눈에 들어오진 않는다...

 

이번에는 folium을 이용해 코로플리스 지도를 그려볼건데...

위경도 중심은 전국 매장 위경도의 중앙값으로 지정!

korea_latlong = starbucks_store[["위도", "경도"]].median().values

f_map = folium.Map(korea_latlong, zoom_start=7)

folium.Choropleth(
    geo_data=ko_geojson,
    name='choropleth',
    data=starbucks_by_sido,
    columns=['시도', '매장수'],
    key_on='feature.properties.name',
    fill_color='Greens',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='매장수'
).add_to(f_map)

f_map

역시 서울 경기만 좀 매장이 많고 나머지 지역은 별로 없어서 눈에 잘 안들어온다!

 

그래서 서울지역만 표시해보기로 했다!

 

일단 서울지역의 geojson을 불러오자!

seoul_geo_url = "https://raw.githubusercontent.com/southkorea/seoul-maps/master/kostat/2013/json/seoul_municipalities_geo_simple.json"

with urlopen(seoul_geo_url) as response:
    seoul_geojson = json.load(response)

 

구군별로 매장수 데이터를 가져온 뒤

서울의 구만 남겨주자!

starbucks_by_gugun = starbucks_store.groupby(['시도', '구군'])['매장이름'].count()
starbucks_seoul = starbucks_by_gugun.loc['서울특별시'].reset_index()
starbucks_seoul = starbucks_seoul.rename(columns={'매장이름':'매장수'})
starbucks_seoul

 

먼저 plotly로 코로플리스 지도를 그려보면...

import plotly.express as px

fig = px.choropleth(starbucks_seoul, geojson=seoul_geojson, color="매장수",
                    locations="구군", featureidkey="properties.name", labels="구군",
                    projection="mercator", color_continuous_scale=px.colors.colorbrewer.Greens)
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})

강남구의 색이 아주 진해 매장수가 매우 많은 것을 확인할 수 있다!

 

위경도 중심을 서울지역 매장 위경도 중앙값으로 해준 뒤...

folium으로 그려보면...

seoul_latlong = starbucks_store[starbucks_store['시도'] == '서울특별시'][["위도", "경도"]].median().values

f_map = folium.Map(seoul_latlong, zoom_start=11)

folium.Choropleth(
    geo_data=seoul_geojson,
    name='choropleth',
    data=starbucks_seoul,
    columns=['구군', '매장수'],
    key_on='feature.properties.name',
    fill_color='Greens',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='매장수'
).add_to(f_map)

f_map

이런 식으로 그려진다!

 

색이 잘 구별이 안가서 오랜지색으로 해보면...

이렇다!

'재미로 하는 코딩' 카테고리의 다른 글

시각화 뽀개기7  (0) 2023.03.01
시각화 뽀개기6  (0) 2023.02.13
시각화 뽀개기5  (0) 2023.02.07
시각화 뽀개기4  (0) 2023.02.05
시각화 뽀개기3  (0) 2023.02.05

댓글