-
국내 대형마트(홈플러스, 이마트, 롯데마트) 위치 데이터 분석 & 시각화 With Python/MapboxData Analysis/Real Estate 2021. 3. 30. 18:47
카카오 지도 검색 API를 활용해서 국내 위치한 대형마트(홈플러스, 이마트, 롯데마트) 위치 데이터를 가져와서 파이썬으로 다루어보도록 하겠다.
1. Data Source
여기서 활용할 대형마트 위치 데이터는 카카오 API를 통해서 가져오도록 하겠다. 홈플러스, 이마트, 롯데마트 별로 전국에 위치한 위치 정보를 긁어오겠다.
from bs4 import BeautifulSoup as bs import pandas as pd import requests link='https://inasie.github.io/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/5/' gu=pd.read_html(link,encoding='utf-8')[0] gu['법정동코드']=gu['법정동코드'].astype(str) sido=gu[(gu['법정동코드'].str.contains('000')) | (gu['법정동주소']=='세종특별자치시') ] api='~~' homeplus=[] for q in sido['법정동주소']: query= q+' 홈플러스' for i in range(1,46): url = f'''https://dapi.kakao.com/v2/local/search/keyword?query={query}&page={i}&size=15&category_group_code=MT1''' headers = { "Authorization": f"KakaoAK {api}" } places = requests.get(url, headers = headers).json()['documents'] homeplus.extend(places) hp=pd.DataFrame(homeplus) hp2=hp[~hp['place_name'].str.contains('익스프레스')] hp3=hp2[hp2['place_name'].str.contains('홈플러스')] hp4=hp3.drop_duplicates(['place_name'],keep='first') emart=[] for q in sido['법정동주소']: query= q+' 이마트' for i in range(1,46): url = f'''https://dapi.kakao.com/v2/local/search/keyword?query={query}&page={i}&size=15&category_group_code=MT1''' headers = { "Authorization": f"KakaoAK {api}" } places = requests.get(url, headers = headers).json()['documents'] emart.extend(places) em=pd.DataFrame(emart) em2=em[~em['place_name'].str.contains('에브리데이')] em2=em2[~em2['place_name'].str.contains('트레이더스')] em2=em2[~em2['place_name'].str.contains('노브랜드')] em2=em2[~em2['place_name'].str.contains('몰리스')] em3=em2[em2['place_name'].str.contains('이마트')] em4=em3.drop_duplicates(['place_name'],keep='first') lotte=[] for q in sido['법정동주소']: query= q+' 롯데마트' for i in range(1,46): url = f'''https://dapi.kakao.com/v2/local/search/keyword?query={query}&page={i}&size=15&category_group_code=MT1''' headers = { "Authorization": f"KakaoAK {api}" } places = requests.get(url, headers = headers).json()['documents'] lotte.extend(places) lt=pd.DataFrame(lotte) lt2=lt.drop_duplicates(['place_name'],keep='first') lt3=lt2[~lt2['place_name'].str.contains('슈퍼')] lt4=lt3[~lt3['place_name'].str.contains('빅마켓')] hp4['sido']=hp4['address_name'].apply(lambda x:x.split(' ')[0]) em4['sido']=em4['address_name'].apply(lambda x:x.split(' ')[0]) lt4['sido']=lt4['address_name'].apply(lambda x:x.split(' ')[0]) hp_count=pd.DataFrame(hp4.groupby(['sido']).count()['place_name']) lt_count=pd.DataFrame(lt4.groupby(['sido']).count()['place_name']) em_count=pd.DataFrame(em4.groupby(['sido']).count()['place_name']) hp_count.columns=['HomePlus'] lt_count.columns=['LotteMart'] em_count.columns=['Emart'] temp=pd.merge(left=hp_count,right=lt_count, left_on=hp_count.index,right_on=lt_count.index,how='left') temp=temp.set_index('key_0') df=pd.merge(left=temp,right=em_count, left_on=temp.index,right_on=em_count.index,how='left') df=df.fillna(0) df=df.rename(columns={'key_0':'Sido'}) sido_df=df.melt(id_vars=['Sido'],var_name ="Mart",value_name='Counts')
2. 대형마트(홈플러스, 이마트, 롯데마트) 총 지점 수 시각화
다음으로는 대형마트별 위치 수를 반응형 그래프 Plotly를 통해서 시각화하도록 하겠다.
data={ 'Mart':['Homeplus','Emart','LotteMart'], 'Counts':[len(hp4),len(em4),len(lt4)] } counts=pd.DataFrame(data) import plotly.express as px fig = px.bar(counts, x='Mart', y='Counts') fig.show() aa=fig.to_json()
카카오에서 긁어온 데이터에 따르면 전국 대형마트 순으로는 이마트, 홈플러스, 롯데마트 순으로 가장 많았다.
2-1. 대형마트(홈플러스, 이마트, 롯데마트) 시도별 지점 수 시각화
다음으로는 지역별로 지점 수가 얼마나 있는지 동일하게 Plotly를 사용해서 시각화하도록 하겠다.
si_do={'강원':'Gangwon-do','경기':'Gyeonggi-do', '경남':'Gyeongsangnam-do','경북':'Gyeongsangbuk-do', '광주':'Gwangju','대구':'Daegu','대전':'Daejeon','부산':'Busan', '서울':'Seoul','세종특별자치시':'Sejongsi','울산':'Ulsan','인천':'Incheon', '전남':'Jeollanam-do','전북':'Jeollabuk-do','제주특별자치도':'Jeju-do','충남':'Chungcheongnam-do', '충북':'Chungcheongbuk-do'} kor_eng=pd.DataFrame.from_dict(si_do,orient='index').reset_index() kor_eng.columns=['kor','eng'] tb=pd.merge(left=sido_df,right=kor_eng,how='left',left_on=sido_df['Sido'],right_on=kor_eng['kor']) fig = px.bar(tb, x="Mart", y="Counts", color="eng", title="# of Mart") fig.show() bb=fig.to_json() for x,y in zip(list(si_do.keys()), list(si_do.values())): bb = bb.replace(y, x)
위 쿼리가 문제없이 돌아간다면 아래와 같이 마트 지역별 지점 수를 확인할 수 있다.
3. 대형마트(홈플러스, 이마트, 롯데마트) 위치 지도에 시각화
홈플러스, 이마트, 롯데마트 전국 지점 위치를 색깔별로 시각화해보면 아래와 같은 결과를 확인할 수 있다. 확실히 수도권과 부산에 많이 위치한 점을 볼 수 있다. 마우스를 점에 호버링하면 해당 지점명, 좌표, 전화번호도 같이 확인할 수 있다.
from mapboxgl.utils import * from mapboxgl.viz import * from mapboxgl.utils import df_to_geojson import json final=pd.concat([hp4,em4,lt4],axis=0) final['x']=final['x'].astype(float) final['y']=final['y'].astype(float) final['mart']=final['category_name'].apply(lambda x:x.split(' ')[-1]) geo_data = df_to_geojson( df=final, properties=['place_name', 'place_url','address_name','phone','mart'], lat='y', lon='x', precision=5, filename = "mart.geojson" ) geo_data_2 = 'mart.geojson' with open(geo_data_2) as f: gdata = json.loads(f.read()) token = '~~' center = [128.033400, 36.801156] match_color_stops = [ ['홈플러스', 'rgb(46,204,113)'], ['이마트', 'rgb(231,76,60)'], ['롯데마트', 'rgb(142,68,173)'] ] viz = CircleViz( color_function_type='match', color_property='mart', color_stops=match_color_stops, data=gdata, access_token=token, center=center, zoom=6.2, radius=3, stroke_color='black' ) viz.show() viz.create_html('mart.html')
마지막으로 지점 위치를 기준으로 클러스터링 시각화해보도록 하겠다.
color_stops = create_color_stops([20,40,60,80,100,120], colors='BrBG') cviz = ClusteredCircleViz(gdata, access_token=token, color_stops=color_stops, radius_stops=[[1,5], [10, 10], [50, 15], [100, 20]], radius_default=2, cluster_maxzoom=10, cluster_radius=30, label_size=12, opacity=0.9, center=center, zoom=6) cviz.show() cviz.create_html('마트 수.html')
오늘은 대형마트 데이터를 가져와서 지도에 시각해봤다. 다음에도 이런 방법으로 오프라인 지점 위치 정보를 가져와서 지도에 시각화해보도록 하겠다.
'Data Analysis > Real Estate' 카테고리의 다른 글
서울 주요 핫플레이스(홍대입구, 건대입구, 이태원, 명동) 방문객 분석 with 지하철역 하차 인원 수 (0) 2021.05.19 서울시 전통시장 현황 분석 With Python, Mapbox, Pydeck (0) 2021.04.17 국민 임대 주택 총 세대 수 현황 알아보자 with 공공데이터 & 파이썬 (0) 2021.04.08 서울 내 스타벅스가 가장 많은 지역을 알아보자 - 스타벅스 위치 데이터 분석 With Python (0) 2021.04.01 20년 서울시 행정구역별 전세 값 데이터 분석 & 시각화 with Python/Mapbox (0) 2021.03.04