| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- geocoding
- 다항분포
- 데벨챌
- Roberta
- 원신
- 조축회
- LDA
- 자연어 모델
- 옵티마이저
- 클래스 분류
- 포아송분포
- Optimizer
- 토픽 모델링
- Tableu
- SBERT
- KeyBert
- 붕괴 스타레일
- NLP
- 트위치
- 피파온라인 API
- BERTopic
- 블루 아카이브
- CTM
- 데이터넥스트레벨챌린지
- 구글 스토어 리뷰
- 문맥을 반영한 토픽모델링
- 개체명 인식
- 블루아카이브 토픽모델링
- 데이터리안
- 코사인 유사도
- Today
- Total
분석하고싶은코코
이디야는 스타벅스 근처에 입점한다? 본문
이디야는 스타벅스 근처에 입점한다는 이야기를 많이 듣는다고 한다.
그래서 정말 이디야가 스타벅스가 입점한 곳 근처에 많이 입점해 있는지 서울시 한정하여 확인해보기로 하였다.
데이터 가져오기
스타벅스 매장 데이터 가져오기
셀레니움 - 스타벅스 매장 검색 페이지 접근하여 서울 전매장 정보가 담긴 페이지 정보 가져오기
starbucks_url = "https://www.starbucks.co.kr/store/store_map.do"
driver = webdriver.Chrome("./driver/chromedriver 2")
driver.get(starbucks_url)
#지역검색
xpath_1 = '//*[@id="container"]/div/form/fieldset/div/section/article[1]/article/header[2]'
xpath_2 = '//*[@id="container"]/div/form/fieldset/div/section/article[1]/article/article[2]/div[1]/div[2]/ul/li[1]/a'
xpath_3 = '//*[@id="mCSB_2_container"]/ul/li[1]/a'
driver.find_element(By.XPATH, xpath_1).click()
time.sleep(1)
driver.find_element(By.XPATH, xpath_2).click()
time.sleep(1)
driver.find_element(By.XPATH, xpath_3).click()
html = driver.page_source
driver.quit()
뷰티풀숩 - 가져온 페이지 정보에서 매장의 이름, 지역구, 주소 3가지 정보 가져오기
sb_store_name = []
sb_stroe_adress = []
sb_store_gu = []
soup = BeautifulSoup(html, "html.parser")
sb_stores_raw = soup.find_all("ul", class_='quickSearchResultBoxSidoGugun')
sb_stores_list = sb_stores_raw[0].find_all("li")
for sb_stores in sb_stores_list:
sb_store_name.append(sb_stores.find("strong").text)
adress = sb_stores.find("p").text
sb_stroe_adress.append(adress.split(",")[0])
adress_split = adress.split()
sb_store_gu.append(adress_split[1])
데이터프레임화
sb_stores = pd.DataFrame({
"매장명" : sb_store_name,
"지역구" : sb_store_gu,
"주소" : sb_stroe_adress
})
sb_stores.tail()
결과

이디야 매장 가져오기
셀레니움 - 이디야 매장 검색 페이지 접근 , 매장 검색 박스 클릭하여 키워드 입력 후 검색
ediya_url = "https://www.ediya.com/contents/find_store.html"
driver = webdriver.Chrome("./driver/chromedriver 2")
driver.get(ediya_url)
#검색창이 보일때까지 스크롤하고 지역 탭 선택
xpath = '//*[@id="contentWrap"]/div[3]/div/div[1]/ul/li[2]'
variable = driver.find_element(By.XPATH, xpath)
some_tag = driver.find_element(By.ID, 'storename_div')
action = ActionChains(driver)
action.move_to_element(some_tag).perform()
variable.click()
ediya_raw = []
for gu in tqdm(gu_list):
xpath = '//*[@id="keyword"]'
some = driver.find_element(By.XPATH, xpath)
some.click()
some.clear() # 이전 검색 단어 삭제
some.send_keys(gu)
time.sleep(1)
xpath = '//*[@id="keyword_div"]/form/button'
driver.find_element(By.XPATH, xpath).click()
time.sleep(1)
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
ediya_raw.append(soup.select(".result_list > ul > li"))
driver.close()
가져온 페이지 정보로 데이터프레임 만들기
ediya_store_name = []
ediya_stroe_adress = []
ediya_store_gu = []
for stores in ediya_raw:
for store in stores:
ediya_store_name.append(store.find("dt").text)
adress = store.find("dd").text.split('(')[0]
ediya_stroe_adress.append(adress)
adress = adress.split()
ediya_store_gu.append(adress[1])
ediya_stores = pd.DataFrame({
"매장명" : ediya_store_name,
"지역구" : ediya_store_gu,
"주소" : ediya_stroe_adress
})
ediya_stores.tail()

데이터 분석
데이터 분석하기 앞서 알 수 있었던 정보
- 서울 내에서는 스타벅스보다는 이디야 점포가 약 200개 정도 많았다.
스타벅스 근처에는 이디야 매장이 있는지 확인하는 방법
- 단순 주소만으로는 확인하기가 어렵다.
- folium으로 스타벅스 매장과 이디야 매장을 모두 표시하여 확인하기에는 두 데이터 합이 1200이 넘어 시각화 의미가 없다.
- 스타벅스와 이디야 매장 주소를 통해서 위도와 경도 값을 얻어 이를 통한 계산을 하기로 하였다.
- 위도와 경도를 통한 거리 계산은 단순 유클리안 거리 계산으로는 할 수 없어서 검색하여 마일/킬로미터로 반환해주는 코드를 가져옴.
- https://ko.martech.zone/calculate-great-circle-distance/
- 우선 반경 300m / 500m 2가지로 분류하고 근처에 이디야 매장이 몇개가 있는지 확인해보기로 함.
위도와 경도의 두 위치 사이의 거리 계산(PHP, Python, MySQL)
위도와 경도를 사용하여 위치 간의 거리를 계산하는 것은 상당히 복잡합니다. 다음은 PHP, Python 및 MySQL의 코드 샘플과 설명입니다.
ko.martech.zone
위도, 경도 정보 가져오기
스타벅스, 이디야의 매장명, 주소를 활용하여 위도, 경도 가져오기
기본적으로 주소를 통해서 좌표를 가져오지만 주소가 검색이 안될 경우 매장명으로 탐색 진행
스타벅스
for idx, rows in tqdm(sb_stores.iterrows()):
search_word = rows["주소"]
tmp = gmaps.geocode(search_word, language="ko")
# 주소로 정보를 찾지 못하면 매장명으로 정보 받아오기
if not tmp:
search_word = search_word = '스타벅스 ' + rows["매장명"] + '점'
tmp = gmaps.geocode(search_word, language="ko")
lat = tmp[0].get("geometry")["location"]["lat"]
lng = tmp[0].get("geometry")["location"]["lng"]
sb_stores.loc[idx, "lat"] = lat
sb_stores.loc[idx, "lng"] = lng
이디야
for idx, rows in tqdm(ediya_stores.iterrows()):
search_word = rows["주소"]
tmp = gmaps.geocode(search_word, language="ko")
if not tmp:
search_word = search_word = '이디야 ' + rows["매장명"]
tmp = gmaps.geocode(search_word, language="ko")
lat = tmp[0].get("geometry")["location"]["lat"]
lng = tmp[0].get("geometry")["location"]["lng"]
ediya_stores.loc[idx, "lat"] = lat
ediya_stores.loc[idx, "lng"] = lng
반경 300m / 500m 이내에 있는 이디야 매장 수 구하기
for idx1, rows1 in tqdm(sb_stores.iterrows()):
search_lat = rows1["lat"]
search_lng = rows1["lng"]
cnt_300 = 0
cnt_500 = 0
for idx2, rows2 in ediya_stores.iterrows():
# if rows1["지역구"] == rows2["지역구"]:
distance = getDistanceBetweenPointsNew(search_lat, search_lng, rows2["lat"], rows2["lng"])
if distance <= 0.3:
cnt_300 += 1
if distance <= 0.5:
cnt_500 += 1
sb_stores.loc[idx1, "area_300"] = int(cnt_300)
sb_stores.loc[idx1, "area_500"] = int(cnt_500)
300m, 500m 각각 매장수 확인
# 주위 300m 내에 이디야가 없는 스타벅스 매장
sb_stores[sb_stores["area_300"]==0].shape[0]
# 주위 500m 내에 이디야가 없는 스타벅스 매장
sb_stores[sb_stores["area_500"]==0].shape[0]
(169, 50)
- 300m 기준
- 169개 매장이 근처에 이디야가 없었음. 이는 서울 스타벅스 매장 중 약 30%에 해당하는 수치.
- 500m 기준
- 50개 매장이 근처에 이디야가 없음. 이는 서울 스타벅스 매장 중 약 8%에 해당하는 수치
- 걸어갈만한 거리인가?
- 300m 기준으로 봐도 스타벅스 근처에 이디야 매장을 쉽게 발견할 수 있는 수치라 보였다. 그런데 300~500m의 거리가 도보로 움직일 수준인가라는 의문이 들어서 거리를 줄여서 확인해보기로 함.
위에서 한 작업에서 범주만 100m, 200m로 수정하여 다시 작업함
결과
sb_stores[sb_stores["area_100"]==0].shape[0], sb_stores[sb_stores["area_200"]==0].shape[0]
463, 284
축소 반경의 결과
- 반경 100m
- 약 80%는 근처에 이디야 매장이 없었음
- 반경 200m
- 약 50%는 근처에 이디야 매장이 없었음
확인 내용
- 스타벅스 매장 기준으로 500m이내에 대부분의 이디야 매장들이 배치하고 있음을 확인하였다.
- 반경 200m안에서는 이디야의 절반의 매장만 위치해 있음을 알 수 있었다.
- 반경 100m내에는 약 20%로 이디야 매장이 스타벅스 매장과 매우 인접한 곳에 입점한 매장이 많지 않음을 확인했다.
정리
- '스타벅스 근처에 이디야가 없다'라고는 할 수 없다.
- '근처'라는 거리의 기준이 애매하다.
- 거리에 대한 기준을 무엇으로 잡을지 생각해보고 다음과 같은 기준으로 정했다.
- 고객이 충분히 도보로 이동 가능한 거리라 생각해야한다. -> 서울 도심의 버스 한 정거장 기준의 거리는 300~500m이다.
- 이동할만하다고 생각하는 대상자들은 스타벅스에서 이탈된 고객이다.
- 걸어갈만한 거리의 기준은?
- 역세권 기준을 사람들은 도보로 3-5분을 이상적으로 보고 있음. 이는 대중교통을 이용하지 않고 걸어갈만한 거리라는 개념으로 활용하기로 함.
- 성인 평균 걸음 속도인 시속 4.5km이다. 이를 3~5분 이동 거리로 계산하면 230m ~ 380m이다.
- 그렇다면 최대 380m이내에 있을 경우 스타벅스가 아닌 다른 카페로 갈 여지가 있다 한다면 그때 이디야 매장이 얼마나 있는지 확인해보기로 했다.
스타벅스 매장 반경 380m 이내에 있는 이디야 매장 수

반경 380m이내의 이디야 매장 수
- 112개 매장을 제외하고 최소 1개의 이디야가 근처에 있음을 알 수 있었다. (약 81%)
- 이 결과로 서울시에서는 대부분의 스타벅스 근처에는 이디야가 입점해 있음을 알 수 있었다.
- 그런데 이디야가 스타벅스 근처에 존재할 뿐이지 처음 가정이었던 '이디야가 스타벅스 근처에 입점한다'는 인과관계를 확인 할 수 없었다.
- 처음 데이터에서 확인했듯 이디야의 점포가 200개 더 많았던 점을 고려하면 단순히 '이디야 매장이 많아서 근처에 스타벅스가 있을 뿐'일 수 있기 때문에 예외의 상황이 있는지 확인해보기 위해 지역구별로 스타벅스와 이디야 매장의 수를 확인해보기로 함.
스타벅스 지역별 매장수

이디야 지역별 매장수

동시 비교

- 강남, 중구, 용산, 서초, 종로 지역은 스타벅스 매장이 더 많음을 확인 할 수 있었음.
- 재미있는 결과는 스타벅스와 이디야 브랜드 모두 가장 많은 매장이 있는 지역구는 강남구이지만 그 안에서 스타벅스 매장이 2배가량 많다는 점이다.
- 막대 그래프 형태로는 한 눈에 들어오지 않아 지도 시각화 진행
Folium
스타벅스 - 초록 / 이디야 - 파랑으로 원을 그림. 해당 지역에서 상대적으로 매장이 많을수록 원의 크기는 커짐
m = folium.Map(location=[37.5502, 126.982], zoom_start=11)
for idx, rows in all_stores_gu.iterrows():
folium.CircleMarker(
location=[rows["lat"], rows["lng"]],
radius=abs(rows["스타벅스 매장 수"] - rows["이디야 매장 수 "]),
color="green" if rows["스타벅스 매장 수"] > rows["이디야 매장 수 "] else "blue",
fill=True
).add_to(m)
m

지도 시각화 결과
- 서울의 중심부와 강남 지역을 제외하고는 이디야 매장이 모든 지역에서 많음을 한 눈에 볼 수 있었음.
- 강남구에는 압도적으로 스타벅스 매장 수가 많은 것으로 보임.
- 스타벅스 매장이 많은 곳이 이어져있는 것으로 보아 아마 지리적 공통점이 있을 것으로 추정(상권, 유동인구 수 등...)
- 앞서 이야기한 '단순히 이디야 매장이 많기 때문에 근처에 스타벅스가 있을 뿐' 이라는 가정을 확인해보기 위해 5구와 나머지구를 구분하여 비교해보기로함.
스타벅스가 더 많은 5구(강남, 서초, 용산, 종로, 중구) 스타벅스 매장 중 근처에 이디야가 없는 매장
sb_ogu = sb_stores[(sb_stores["지역구"] == "강남구") |
(sb_stores["지역구"] == "서초구") |
(sb_stores["지역구"] == "중구") |
(sb_stores["지역구"] == "용산구") |
(sb_stores["지역구"] == "종로구")]
sb_ogu[sb_ogu["area_380"] == 0].shape[0]
결과
44
5구(강남, 서초, 용산, 종로, 중구)와 나머지 구의 비교
- 5구에는 256개의 매장이 있었음. 그 매장들을 제외하고 스타벅스 근처에 이디야 매장의 개수를 확인.
- 5구가 약 15%p(3%) 낮았지만 유의미한 차이가 있다고 할 수준은 아니었다.
- '이디야 매장이 많아서 근처에 스타벅스가 있는 것 뿐'이라는 가정은 강남구에 이디야 매장이 서울 지역 중 가장 많은점, 강남구의 스타벅스 매장이 이디야에 비해 2배 이상 많다는 점. 이 두 가지를 고려했을때 서울 전역과 차이가 없기 때문에 가정은 틀렸음을 알 수 있었다.
그렇다면 모든 지역구가 비슷할까?
fig,ax = plt.subplots(nrows =2, figsize=(20,10))
sns.barplot(data = sb_ediya_ratio, x="지역구", y="인근 이디야 입점률", order=all_stores_sb["지역구"].unique(), ax=ax[0])
ax[0].set_title("스타벅스 매장 수가 많은 지역구 기준 정렬")
sns.barplot(data = sb_ediya_ratio, x="지역구", y="인근 이디야 입점률", order=all_stores_ediya["지역구"].unique(), ax=ax[1])
ax[1].set_title("이디야 매장 수가 많은 지역구 기준 정렬")
plt.show()

- 브랜드별 매장 수가 많은 지역구의 입점률로 비교
- 양쪽 브랜드 모두 강남에 입점이 가장 많이 되어 있었고 각 브랜드의 두번째 입점 지역구까지 반대쪽 입점수를 확인해 본 결과 스타벅스의 서초구, 이디야의 노원구를 제외하고 모두 겹치는 지역구로 나왔다.
- 그런데 이 그룹에 입점률이 낮은 강서구와 송파구가 속해 있음을 생각한다면 이디야는 무조건 스타벅스 근처에 입점해 있다고 보기 힘들다 생각한다.
결론
- 서울 전체로 본다면 스타벅스 매장을 중심으로 도보로 이동할만한 거리에 이디야 매장을 쉽게 발견할 수 있다.
- 단순 점포수로 봐서는 이디야가 약 200개 가량의 점포가 많기 때문에 이디야의 점포가 많기 때문에 스타벅스 근처에서 쉽게 발견할 수 있다.
- 하지만 스타벅스 점포수가 더 많은 지역구들을 확인한 결과 이디야의 점포수가 적어도 스타벅스 근처에서 쉽게 발견할 수 있었다.
- 지역구별로 매장의 입점률을 비교해 보았다.
- 입점률이 낮은 그룹에 각 브랜드의 매장이 많은 지역들이 포진해 있었다.
- 각 브랜드의 매장이 많은 순서대로 정렬해보니 각각 1개의 지역구를 제외하고 공통된 지역구로 나타났다. 공통된 지역구에 입점률 하위 그룹인 강서와 송파가 위치해 있었다.
- 이러한 결과를 통해 알 수 있었던 것은 이디야는 무조건 스타벅스 근처에 매장을 입점시키지 않는다는 것이다. 다만 스타벅스 근처에서 이디야가 많이 보이는 이유는 기본적으로 매장의 수가 스타벅스보다 많기 때문이고, 카페라는 공통된 사업 특성상 입점 조건이 어느정도 겹치는 부분이 존재하기 때문이라고 보인다. 이 입점 조건이 두 브랜드가 완벽하게 같지 않기 때문에 지역구별로 입점률의 차이가 나타는 것으로 보인다. 따라서 이디야가 스타벅스 근처에 입점 시킨다는 이야기는 증명하기 어려웠다. 분석을 하면서 이디야가 스타벅스를 따라서 입점시킨다는 이야기가 나온 것은 이디야의 매장이 많아 스타벅스를 찾는 과정에서 자주 발견되기 때문일 수 있다는 생각을 하였다.
'데이터분석' 카테고리의 다른 글
| 스타벅스 매장은 정말 매장마다 차이가 없을까?? - (1) (0) | 2022.12.12 |
|---|---|
| 텍스트 마이닝 - Bag of words / TF-IDF (0) | 2022.12.12 |
| 제주도 교통량 예측(1)_EDA (0) | 2022.10.11 |
| 데이터분석(4) - 타이타닉 생존자 구하기 (0) | 2022.06.27 |
| 데이터분석(3) - 랜덤 포레스트 (0) | 2022.06.07 |