오늘은 데이터 공부하면서 자주 참고하는 유튜브 채널인 오늘의 코드에 올라온 스타벅스와 이디야 상권분석을 따라해보고자 한다. 순서는 아래와 같다.
1. 데이터 수집
2. 시각화
# 요약
folium # 지리정보 시각화 모듈
reset.index() # 인덱스 정리
.str.lower() # 영문 소문자화
.str.contains("x" | "y") # ~을 포함하는 문자
df.plot.scatter(x,y) # 산점도
sns.barplot(data=??, x=??, y=??, hue = ??) # 카테고리 변수를 뜻하는 hue 인수
1. 데이터 수집
분석에 사용된 데이터는 공공데이터포털(https://www.data.go.kr/)에 제공하는 데이터이다. 상가업소정보 외에도 다양한 데이터를 제공하고 있으며 오픈API 형식으로 제공하고 있다.
# 필요한 모듈 설치
import pandas as pd
import numpy as np
import seaborn as sns
import folium # 지리정보 시각화
shop_2019 = pd.read_csv("./상가업소정보_201912_01_final.csv",encoding = 'cp949', engine = 'python')
shop_2019.columns
2. 시각화
그래프로 보아 해당 데이터는 두 지역의 데이터만 존재하는 듯하다. 실제로 서울시와 부산시 데이터만 존재했고 서울시로 한정하여 시각화를 진행하고자 한다.
# 위도와 경도로 산점도를 그린 후 서울시로 한정하여 분석 진행
shop_2019[:1000].plot.scatter(x="경도", y="위도", grid = "True")
shop_seoul = shop_2019[shop_2019['시도명'] == '서울특별시']
확실히 편의점의 수가 많았으며, 업종을 "커피점/카페"로 한정했을때는 "간단하지만 특별한 화피디Cafe"라는 처음 듣는 브랜드의 점포 수가 가장 많았다. 확인해본 결과, 대게 작은 규모의 커피점으로 건물 내에 자리잡은 점포들이었다.
shop_seoul.상호명.value_counts().head()
shop_seoul[shop_seoul.상권업종중분류명=="커피점/카페"].상호명.value_counts().head()
이제 본격적으로 스타벅스와 이디야만 추출하여 시각화를 해보았다. 우선 상호명이 영문로 된 경우도 있고 그것도 소문자와 대문자로 나눠져 복잡하게 되어 있는 것을 확인했다. 따라서 영문의 경우 모두 소문자로 치환하여 새로운 변수에 저장했다.
# 데이터 프레임 전체에 .lower를 적용하기 위해서 .str를 앞에 붙임
shop_seoul["상호명2"] = shop_seoul["상호명"].str.lower()
# .contains는 특정 문자열을 포함하는 경우를 찾고자 할 때 사용. "|"은 or의 개념
df_cafe = shop_seoul[shop_seoul.상호명2.str.contains("이디야|ediya|스타벅스|starbucks")]
새로 지정한 df_cafe 데이터프레임에서 상호명을 스타벅스 또는 이디야로 통일해준다.
# ~는 not을 의미
df_cafe.loc[df_cafe["상호명"].str.contains("스타벅스|starbucks"), "브랜드명"] = "스타벅스"
df_cafe.loc[~df_cafe["상호명"].str.contains("스타벅스|starbucks"), "브랜드명"] = "이디야"
# 데이터 확인
df_cafe[['상호명','브랜드명']].head()
df_cafe["브랜드명"].value_counts()
2.1. 지리정보 시각화 모듈 folium 사용하여 시각화
# 지리정보 시각화
geo_df = df_cafe
# 지리정보 시각화 모듈 folium 사용
map = folium.Map(location = [geo_df["위도"].mean(), geo_df["경도"].mean()], zoom_start=12)
for n in geo_df.index :
# 팝업에 들어갈 텍스트 지정
popup_name = geo_df.loc[n,'상호명'] + '-' + geo_df.loc[n,'도로명주소']
if geo_df.loc[n,'브랜드명'] == '스타벅스' :
icon_color = "green"
else :
icon_color = "blue"
# 표시 마커 설정
folium.features.CircleMarker(
location = [geo_df.loc[n,'위도'], geo_df.loc[n,'경도']],
radius=3,
popup = popup_name,
color = icon_color,
fill = True,
fill_color = icon_color
).add_to(map)
map.save('index.html') # 버젼 문제로 한글깨짐 따라서 html 형식으로 추출
map
2.2. seaborn 모듈을 이용한 막대그래프
# 구별 브랜드별 점포수
## 그룹바이로 "시군구명","브랜드명"별로 정렬한 후 각각 "상호명"의 수를 계산
## 이를 데이터 프레임화, 이 때 인덱스가 지저분한데 이를 정리하기 위해 reset_index() 사용
df_cafe_brand = pd.DataFrame(df_cafe.groupby(['시군구명','브랜드명'])['상호명'].count()).reset_index()
df_cafe_brand.columns = ['구', '브랜드명', '매장수']
# 그래프 생성
plt.figure(figsize=(24,6))
sns.barplot(data=df_cafe_brand, x="구", y="매장수", hue = '브랜드명')
마치며..
상권분석이라고는 하지만 기초적인 수준에서 EDA 정도라고 보면 될 듯하다. 주어진 데이터에서 다른 어떤 분석을 이끌어낼 수 있을지 고민해봐야겠다. 자세한 내용은 출처를 참고하면 된다.
*Reference : https://www.youtube.com/channel/UCLR3sD0KB_dWpvcsrLP0aUg
todaycode오늘코드
공공데이터 분석 데이터 시각화 캐글을 통한 머신러닝/딥러닝 튜토리얼 Pandas, Numpy, Scipy, scikit-learn, TensorFlow, Keras, Jupyter, Colaboratory mail : joeunpark@gmail.com
www.youtube.com
'study' 카테고리의 다른 글
[Kaggle] IMDB 감정 분석 Part 1 (0) | 2020.03.21 |
---|---|
아파트 분양가격 동향 (0) | 2020.03.19 |
스타벅스 이디야 매장 수 비교 (2) | 2020.03.19 |
러닛 - 우주 최초 플립러닝 플랫폼 (0) | 2020.03.16 |
Database 기초 (0) | 2020.03.14 |
[Kaggle] Survival on the Titanic (0) | 2020.03.11 |
비밀댓글입니다
답글
안녕하세요:) 답장이 늦어 죄송합니다ㅜㅜ
저도 처음에 같은 문제을 겪었는데 버전 문제로인해 깨짐현상이 발생한다고 하더라고요. (어떤 버젼을 말하는지는 모르겠으나) map을 html 형식으로 저장한 후 확인해봐도 같은 현상이 발생하시나요?