멋쟁이 사자처럼 수강을 하면서 첫 프로젝트가 닥쳤다!
평소에 커피를 많이 좋아하기 때문에...
여러 데이터 중 스타벅스 매장 데이터를 수집해보기로 했다!
일단 데이터를 수집하고...(post방식)
여러 전처리를 거치는 함수이다!
특히 이름의 뒷부분에 매장타입에 관한 정보를 가지고 매장타입을 파생변수로 생성했다!
# 필요 라이브러리 호출
import pandas as pd
import requests
import numpy as np
#url을 통해 스타벅스 매장의 데이터를 수집하는 함수
def get_starbucks_store(url):
# 데이터를 수집할 때 필요한 데이터
data = {
'p_sido_cd':'',
'p_gugun_cd':'',
'in_biz_cd':'',
'set_date':'',
'iend':'10000' #최대 인덱스 수..?
}
# 데이터 요청(post방식)
response = requests.post(url, data=data)
stores = pd.read_json(response.text)['list']
# 필요한 컬럼판 리스트에 담아주기
list_store = []
for store in stores:
list_store.append([store['s_code'],
store['s_name'],
store['sido_name'],
store['gugun_name'],
store['doro_address'],
store['open_dt'],
store['lat'],
store['lot']])
df_store = pd.DataFrame(list_store)
# 컬럼 명 변경
cols=['매장코드', '매장이름', '시/도', '구/군', '도로명주소', '오픈날짜', '위도', '경도']
df_store.columns = cols
# 위도 경도 실수형으로 타입변경
df_store['위도'] = df_store['위도'].astype(float)
df_store['경도'] = df_store['경도'].astype(float)
# 이름에 있는 정보로 매장 타입 추출 및 생성
dt_r_dtr = [
df_store['매장이름'].str.endswith('DT'),
df_store['매장이름'].str.endswith('R') & ~df_store['매장이름'].str.endswith('DTR'),
df_store['매장이름'].str.endswith('DTR')]
choicelist = ['DriveThrough', 'Reserve', 'DriveThrough&Reserve']
df_store['매장타입'] = np.select(dt_r_dtr, choicelist, default='General')
return df_store
함수를 호출하고 데이터를 확인해 보면...
# get_starbucks_store(url)함수를 통해 전체 스타벅스 매장 정보 확인
df_store = get_starbucks_store('https://www.starbucks.co.kr/store/getStore.do')
df_store
아래처럼 매장코드, 매장이름, 시/도, 구/군, 도로명주소, 오픈날짜, 위도, 경도, 매장타입 컬럼을 가진 데이터프레임이다!
일단 결측치를 확인해보자!
# 결측치 확인! (구/군)에서 결측치가 있음을 알 수 있다
df_store.info()
구/군에서 12개의 결측치가 있음을 알 수 있다!
구/군 컬럼이 결측치인 데이터를 살펴보면...
# 구/군 컬럼의 결측치가 어느 데이터에서 생겼는지 확인!
# 시/도 가 세종특별시 인곳에서 결측치가 생김!
df_store[df_store['구/군'].isna()]
세종특별시에서 결측치가 생긴 것을 확인할 수 있다!
그래서 결측치를 세종시로 대체했다.
# 결측치를 세종시로 대체
df_store = df_store.fillna('세종시')
결측치가 잘 대체되었는지 확인해보면...
# 결측치를 세종시로 대체
df_store = df_store.fillna('세종시')
이렇게 깔끔하게 결측값이 없어졌다.
이제 중복값을 제거해보자!
# 중복값 확인 및 제거(중복값 없음)
display(df_store.shape)
df_store = df_store.drop_duplicates()
display(df_store.shape)
중복값 제거해도 데이터가 전과 같다!
한 번 오브젝타 타입변수 기술통계를 확인해보면...
# 오브젝트 타입변수 기술통계 확인
df_store.describe(include = "O")
매장코드는 모두 다른 것을 확인할 수 있다!
그런데 주소가 겹치는 것이 있음을 알 수 있다...
어떻게 된 것인지 한 번 확인해보면...
# 도로명 주소가 같아도 매장은 다르다!
df_store[df_store['도로명주소'] == '경기도 하남시 미사대로 750 (신장동)']
이렇게 같은 건물에 여러 개의 매장이 있는 것이었음을 알 수 있다!
위도와 경도가 있으니...
이래저래 잘 해보면 집에서 가장 가까운 매장을 찾을 수 있지 않을까? 하는 생각이 들었다!
나는 단순하게 위도와 경도를 이용해 가장 가까운 매장을 구하기에 그쳤지만...
# 가장 가까운 매장의 데이터를 찾아주는 함수
def find_closest_store(lat, lot):
diff_square = (lat - df_store['위도']) ** 2 + (lot - df_store['경도']) ** 2
return df_store[diff_square == min(diff_square)]
팀원들이 주소를 위도로와 경도로 바꿔주는 함수와 위도와 경도를 이용해 거리를 계산하는 함수를 찾아주셔서...
!pip install geopy
!pip install Haversine
from geopy.geocoders import Nominatim
from haversine import haversine
# 현재 위치를 위도, 경도 값으로 변환!
# !pip install geopy
# from geopy.geocoders import Nominatim
geo_local = Nominatim(user_agent='South Korea')
# 주소를 입력하면 위도 경도 값이 나오는 함수
def geocoding(address):
try:
geo = geo_local.geocode(address)
x_y = [geo.latitude, geo.longitude]
return x_y
except:
print("다시 입력해주세요.")
return [0,0]
주소를 입력하면 가장가까운 매장과 거리를 알려주게 만들 수 있었다!
# 가장 가까운 매장과 거리 계산(위의 코드 한번에 작동시키기)
# !pip install Haversine
# from haversine import haversine
me = input("지역을 입력해 주세요(도로명 주소가 더 잘 작동합니다) :")
my_location = geocoding(me)
my_lot = my_location[0]
my_lat = my_location[1]
closest_starbucks = find_closest_store(my_lot, my_lat)
closest_starbucks_lot_lat = (closest_starbucks.iloc[0, 6], closest_starbucks.iloc[0, 7])
# 거리 계산
distance_1 = haversine((my_lot, my_lat), closest_starbucks_lot_lat, unit = 'km')
distance = (str(round(distance_1, 2)) +'km 거리에 ' + closest_starbucks.iloc[0, 1] + ' 매장이 있습니다.')
print(distance)
closest_starbucks
이렇게 주소를 입력하면!
가장 가까운 매장과 거리가 나오고...
아래와 같이 실제 네이버 지도에서 확인해보니 거리가 꽤나 정확하다는 것을 알 수 있었다!
그 다음에는 데이터 분석을 통해 스타벅스의 이모저모?를 알아봤다!
먼저 오픈날짜 최빈값으로 하루에 오픈 날짜가 가장 많은 날짜를 알아봤다.
# 하루에 오픈 날짜가 장 많은 날짜?
mode_open_date = df_store['오픈날짜'].mode().loc[0]
print(mode_open_date)
df_store[df_store['오픈날짜'] == mode_open_date]
2020년 12월 10일에 7개의 매장이 오픈했다!
스타벅스 1호점은 어디일까?
# 스타벅스 매장 데이터에서 가장 오래된 매장과 실제 가장 오래된 매장이 일치하는지 확인!
first_store = df_store[df_store['오픈날짜']
== min(df_store['오픈날짜'])]
first_store
이대R점이 1호점이다!
스타벅스 홈페이지에서 직접 확인해보면
출처 : https://www.starbucks.co.kr/footer/company/starbucks_information.do
실제 1호점인 것을 알 수 있다!(리저브 매장인 이유는 2019년 리뉴얼됐기 때문)
DT매장 1호점은 어디일까?
# 스타벅스 매장 데이터에서 가장 오래된 드라이브스루매장과 실제 가장 오래된 드라이브스루 매장이 일치하는지 확인!
df_dt_store = df_store[df_store['매장타입']
== 'DriveThrough']
first_dt_store = df_dt_store[df_dt_store['오픈날짜']
== min(df_dt_store['오픈날짜'])]
first_dt_store
출처 : https://www.starbucks.co.kr/search/search.do?search=1%25ED%2598%25B8%25EC%25A0%2590
역시 데이터와 실제가 일치했다!
유일한 DTR매장은 어디일까?
#유일한 DTR매장 확인
dtr_store = df_store[df_store['매장타입']
== 'DriveThrough&Reserve']
dtr_store
출처 : https://www.starbucks.co.kr/search/search.do?search=%25EC%2596%2591%25ED%258F%2589
역시 확인해 보면 일치하는 것을 알 수 있다!
시/도 별 매장 개수도 확인해봤다!
import matplotlib.pyplot as plt
print(df_store.value_counts('시/도'))
plt.figure(figsize=(15, 10))
plt.rc('font', family='Malgun Gothic')
x = df_store.value_counts('시/도').index
y = list(df_store.value_counts('시/도'))
plt.bar(x, y, color='darkred')
서울이 가장 많은 것을 볼 수 있고
그래프도 그려봤다..
마지막으로 매장 타입별 매장 개수를 확인해 봤다!
import matplotlib.pyplot as plt
print(df_store.value_counts('매장타입'))
labels = df_store.value_counts('매장타입').index
explode = [0, 0.10, 0.20, 0.40]
plt.pie(df_store.value_counts('매장타입'), labels=labels,autopct='%.2f%%' , explode=explode)
드라이브 쓰루 매장이 꽤 많은 것을 볼 수 있다!
아래 처럼 파이차트도 그려봤다!
스타벅스 매장 데이터 수집 프로젝트를 해봤다!
데이터와 실제정보가 일치하는지 확인하면서 스타벅스에서 제공하는 정보가 꽤 정확하다는 것을 알았다!
재미있는 프로젝트였다!
'멋쟁이사자처럼 AI스쿨' 카테고리의 다른 글
멋쟁이사자처럼 AI스쿨 7주차 회고 (0) | 2023.02.02 |
---|---|
멋쟁이사자처럼 miniproject1(네이버 증권 웹사이트 정보 수집하기) (0) | 2023.02.02 |
멋쟁이사자처럼 AI스쿨 5주차 회고 (0) | 2023.01.19 |
네이버 증권 종목토론실수집(과제보충) (0) | 2023.01.18 |
네이버 증권 종목토론실수집(과제) (2) | 2023.01.13 |
댓글