AI SCHOOL/project

[mini project] 스타벅스 매장정보 수집

moru_xz 2023. 1. 29. 20:03

스타벅스 서울 매장 가져오기

#라이브러리 불러오기
import requests
import json
import pandas as pd
!pip install -U finance-datareader #코랩 사용시 설치 필요요
import FinanceDataReader as fdr
# 스타벅스 서울 매장 가져오는 함수 
def get_star() :
    data = {
    'ins_lat':'37.56682',
    'ins_lng':'126.97865',
    'p_sido_cd':'01',
    'p_gugun_cd':'',
    'in_biz_cd':'',
    'set_date':'',
    'iend':'1000'}
    url = "<https://www.starbucks.co.kr/store/getStore.do>"
    response = requests.post(url, data = data)
    star_list = response.json()['list']
    df_star = pd.DataFrame(star_list)
    df = df_star[['open_dt','s_name', 'sido_name','gugun_name','doro_address', 'tel', 'lat', 'lot','sido_code']]
    cols = ['오픈일', '매장명', '시/도', '구/군', '주소', '전화번호', '위도', '경도', '코드']  
    df.columns = cols
    df['위도'] = df['위도'].astype(float)
    df['경도'] = df['경도'].astype(float)
    df = df.sort_values('오픈일').reset_index(drop = True)
    
    return df

df_seoul = get_star()
file_name_1 = 'starbucks_seoul'
df_seoul.to_csv(file_name_1, index=False)

전국 매장 가져오기

# 전국 매장 함수

def get_all(sido_code) : 
    url = '<https://www.starbucks.co.kr/store/getStore.do?r=UENRAT44P1>'
    data = {
    'ins_lat':'37.2637696',
    'ins_lng':'127.0939648',
    'p_sido_cd':sido_code, #전국의 코드가 다르기 때문에
    'p_gugun_cd':'',  
    'in_biz_cd':'',
    'set_date':'',
    'iend':'1000'
    }
    response = requests.post(url, data)
    data_list = response.json()['list']
    df_all = pd.DataFrame(data_list)
    
    df = df_all[['open_dt','s_name', 'sido_name','gugun_name','doro_address', 'tel','sido_code', 'lat', 'lot']]
    cols = ['오픈일', '매장명', '시/도', '구/군', '주소', '전화번호', '코드', '위도', '경도']  
    df.columns = cols
    df = df.sort_values('오픈일', ascending = True).reset_index(drop = True)
    df['위도'] = df['위도'].astype(float)
    df['경도'] = df['경도'].astype(float)
    
    
    return df

df_list = []
for i in range(1, 18) :
    if i <= 9 :
        df_coffee = get_all(f'0{i}')
    else :
        df_coffee = get_all(i)
    
    df_list.append(df_coffee)

df_all_city = pd.concat(df_list).reset_index(drop = True)
df_all_city

file_name = 'starbucks_all'
df_all_city.to_csv(file_name, index=False)

 

스타벅스 시각화

구/군별 스타벅스 매장 수

plt.figure(figsize = (17, 8))
sns.countplot(x = '구/군', data = df_seoul)

연도별 오픈 매장수

# 오픈연도만 뽑아오기
df_year = df_seoul.copy()
df_year['오픈일'] = df_year['오픈일'].astype(str)
df_year['오픈일'] = df_year['오픈일'].str[:4]

df_year = pd.DataFrame(df_year['오픈일'].value_counts())
df_year = df_year.reset_index()
df_year.columns = ['오픈연도', '매장수']

df_year = df_year.sort_values('오픈연도')
plt.figure(figsize = (17,8))
plt.plot(df_year['오픈연도'], df_year['매장수'])
plt.xlabel('오픈연도도') 
plt.ylabel('매장수') 
plt.title('연도별 오픈매장 수') 
plt.show()

folium을 활용해서 지도에 스타벅스 매장 그려보기

starbucks_map = folium.Map(location = [37.573050, 126.979189],
                           titles = 'stamenTerrain',
                           zoom_start = 11)

for idx in df_seoul.index :
    lat = df_seoul.loc[idx, '위도']
    lng = df_seoul.loc[idx, '경도']
    folium.CircleMarker(location = [lat, lng],
                        color = 'yellow',
                        radius = 3,
                        weight = 1,
                        fill = True,
                        fill_color = 'green',
                        fill_opacity = 0.5). add_to(starbucks_map)

starbucks_map


json 을 읽어올 때 response.text.와 response.json()을 가져올 때 무슨 차이가 있는지 궁금해서 찾아봤다. 

# 스타벅스 공홈 json 가져오기
data = {
    'ins_lat':'37.56682',
    'ins_lng':'126.97865',
    'p_sido_cd':'01',
    'p_gugun_cd':'',
    'in_biz_cd':'',
    'set_date':'',
    'iend':'1000'
}

url = "https://www.starbucks.co.kr/store/getStore.do"
response = requests.post(url, data=data)
response.json()

response.text

response.json() 은 bs 한 것 처럼 정리해서 나오고, text는 그냥 ~ 구구절절 나옴

이때 response.json()은 기존에 우리가 한 것 처럼(etf) []를 사용하여 원하는 내용을 찾아 그 다음에 pd.DataFrame에 담아 데이터 프레임에 담아 주는 것이고,

response.text일 때는 json_normalize()라는 json을 DataFrmae으로 생성할 수 있다.(json에서 데이터 프레임을 쉽게 생성할 수 있도록 도움을 주는 메서드)

-> 내 생각엔... response.json() 이 편하지 않나?

json.load(response.text)를 변수에 넣어주고 하면 더욱 깔끔하겠지만 일단 과정을 보기 위해서... 

 

사업체현황과 인구수를 스타벅스 동별 매장 리스트와 합치기

data = pd.read_csv('/content/사업체현황(산업대분류별_동별)2020년_20230129154423.txt', sep='\t', header=2)
data_final = data[['동별(2)', '소계','소계.2']]
data_final.columns = ['구/군', '사업체수', '종사자수']
data_final = data_final.drop([0, 1, 2])
data_final = data_final.reset_index(drop = True)
df_people = pd.read_csv('/content/주민등록인구2020csv_20230128204537.csv')
df_people = df_people[['동별(2)', '2020.1']]
df_people.columns = ['구/군', '주민등록인구']
df_people = df_people.drop([0, 1])
df_people = df_people.reset_index(drop = True)
star_count = df_seoul.pivot_table(index = '구/군', values = '매장명', aggfunc = 'count')
star_count = star_count.reset_index(drop = False).rename(columns = {'매장명' : '스타벅스_매장수'})
star_count_all = pd.merge(star_count,df_people, how = 'left' , on = '구/군')
star_count_all

star_count_all = pd.merge(star_count_all,data_final, how = 'left' , on = '구/군')
star_count_all

 


  • 좋았던 것(Liked) : folium 활용 / 처음에 정말 어떻게 해야할 지 모르겠던 스벅 매장 리스트를 긁어올 수 있었다. 
  • 배운 것(Learned) : json 타입을 어떻게 데이터프레임으로 만들 수 있는지에 대해 알 수 있었다. 
  • 부족했던 것(Lacked) : 스타벅스 매장과 인구, 사업체수로 시각화 하는 것을 끝까지 하지 못했다. 데이터를 불러오기는 했지만 그 후 map을 만드는 것이 쉽지 않았다. 
  • 바라는 것(Longed for) : 노력