저번에 미니프로젝트로 스타벅스 매장 데이터를 수집했다!
2023.01.31 - [멋쟁이사자처럼 AI스쿨] - 멋쟁이사자처럼 miniproject1(스타벅스 매장 정보 수집하기)
이 매장 데이터로 스타벅스 매장을 지도에 표시해보고...
코로플리스 지도도 그려보자!
일단 필요라이브러리를 불러오자!
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
이런 식으로 그려진다!
색이 잘 구별이 안가서 오랜지색으로 해보면...
이렇다!
댓글