일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 데벨챌
- KeyBert
- 피파온라인 API
- 원신
- 다항분포
- BERTopic
- 포아송분포
- 옵티마이저
- 조축회
- NLP
- Tableu
- 개체명 인식
- 트위치
- 구글 스토어 리뷰
- 붕괴 스타레일
- Roberta
- 코사인 유사도
- 토픽 모델링
- LDA
- 블루 아카이브
- SBERT
- 블루아카이브 토픽모델링
- 데이터넥스트레벨챌린지
- CTM
- 자연어 모델
- 문맥을 반영한 토픽모델링
- geocoding
- 클래스 분류
- 데이터리안
- Optimizer
- Today
- Total
분석하고싶은코코
스타벅스 매장은 정말 매장마다 차이가 없을까?? - (1) 본문
이디야가 스타벅스 근처에 입점한다는 데이터 분석을 하면서 의문점이 하나 생겼다. 스타벅스는 모든 매장이 직영점이라는 것을 다른 프랜차이즈 커피 전문점과 다른점이라는 것을 강조한다. 직영점이라하면 본사에서 매장을 직접 관리하는 것인데 그렇다면 이러한 운영이 정말 소비자로 하여금 모든 매장에서 비슷한 경험을 할 수 있게 해주고 있는가에 대해서 의문이 들었다.
물론 스타벅스코리아에서 자체적으로 방문한 고객들에게 랜덤으로 설문조사를 통해서 그에 대한 평가가 이뤄지고 있다. 그런데 이 데이터는 내가 접근할 수 없으니 공개되어있는 리뷰를 분석해 정말 그런지 확인해보기로 했다.
1. 스타벅스 매장 정보 가져오기
지난번 사용했던 코드 그대로 사용했기 때문에 자세한 내용은 스킵!
2. 네이버 플레이스 리뷰 페이지 링크 가져오기
#URL 저장 리스트
review_url = []
#검색을 위한 기본 지도창 열기
driver = webdriver.Chrome("./driver/chromedriver")
url = "https://map.naver.com/v5/search/스타벅스"
driver.get(url)
search_box = driver.find_element(By.CLASS_NAME, "input_search")
# 스타벅스 매장명으로 검색하여 방문자 리뷰 링크 가져오기
for store in tqdm(sb_store_name):
time.sleep(2.5)
search_box.clear()
store_name = "스타벅스" + store + "점"
search_box.send_keys(store_name)
search_box.send_keys(Keys.ENTER)
time.sleep(2.5)
try:
driver.switch_to.frame("entryIframe")
except:
driver.switch_to.frame("searchIframe")
result_stores = driver.find_elements(By.CSS_SELECTOR,
"#_pcmap_list_scroll_container > ul > li > div > a > div > div > span.place_bluelink")
#검색 결과가 여러개일때 검색 단어와 일치하는 매장 선택
cnt = 0
for name in result_stores:
if str.replace(store_name, " ", "") == str.replace(name.text, " ", ""): break
cnt += 1
#검색 결과에 검색단어와 일치하는 매장이 없는 경우
if len(result_stores) == (cnt):
time.sleep(2)
driver.switch_to.default_content()
review_url.append(np.nan)
continue
result_stores[cnt].click()
time.sleep(2)
driver.switch_to.default_content()
driver.switch_to.frame("entryIframe")
review_url.append(
driver.find_elements(By.CLASS_NAME, "flicking-camera")[0].find_elements(By.TAG_NAME, "a")[3].get_attribute(
"href"))
driver.switch_to.default_content()
driver.close()
링크 리스트 데이터 프레임에 넣어주고 자료 저장
sb_stores["review_url"] = pd.DataFrame(review_url)
sb_stores.to_csv('starbuck_review.csv')
2번 과정에서 새롭게 알게 된 내용은 Frame간 이동이다.
네이버 지도 화면의 경우 검색창, 검색 결과가 나오는 곳이 i-frame으로 잡혀 있어서 셀레니움에서 프레임을 이동하는 명령을 해줘야 정상적으로 작동했다.
driver.switch_to.frame("프레임명") 이렇게 실행해주고 해당 프레임에서 나오려면 default_content()를 통해서 기본 화면으로 나오는 동작이 필요했다.
3. 방문자 리뷰 페이지에서 정보 가져오기
- 최근 90일의 리뷰를 가져오기
- 방문 횟수 가져오기
- 방문일 가져오기
3가지 기준으로 리뷰를 가져왔는데 가져오는 코드에서 더보기 버튼을 누르면 먹통이 되거나 방문자 리뷰 페이지에서 메인 컨테이너를 불러오지 못하는 현상이 발생해서 해결중.... 노가다로 모든 리뷰를 불러오기는 했지만 리뷰를 자동으로 가져오는 부분은 해결하고 코드 업로드 예정...
4. 매장 리뷰 키워드 워드클라우딩
from wordcloud import WordCloud
from konlpy.tag import Twitter
from collections import Counter
# 불용어 사전 불러오기
stopwords = pd.read_csv("https://raw.githubusercontent.com/yoonkt200/FastCampusDataset/master/korean_stopwords.txt").values.tolist()
# 텍스트 전처리
def text_cleaning(text):
hangul = re.compile('[^ ㄱ-ㅣ 가-힣]') # 정규 표현식 처리
result = hangul.sub('', text)
okt = Okt() # 형태소 추출
nouns = okt.morphs(result)
# nouns = [x for x in nouns if len(x) > 1] # 한글자 키워드 제거
nouns = [x for x in nouns if x not in stopwords] # 불용어 제거
return nouns
def wordCloudingMulti(review, col, row, name):
sum_review = "".join(review)
counts = Counter(text_cleaning(sum_review))
tags = counts.most_common(30)
wc = WordCloud(font_path='폰트 경로',background_color="white", max_font_size=60)
cloud = wc.generate_from_frequencies(dict(tags))
ax[col][row].imshow(cloud)
ax[col][row].set_title(name)
# 원하는 매장명 입력시 워드클라우딩 진행
search_stores = ["안암역", "고대안암병원", "회기역사거리", "한양대", "종암DT", "대학로"]
col = 0; row = 0
fig, ax = plt.subplots(ncols = 2, nrows = 3, figsize=(10,10))
for search in search_stores:
flag = (sb_stores["매장명"] == search)
store_code = int(sb_stores[flag].index.values)
wordCloudingMulti(reveiw_text[store_code], col, row, search)
col +=1
if col > 2:
col = 0
row +=1
결과
매장 리뷰에 많이 등장한 단어들을 확인할 수 있었지만 텍스트 전처리가 깔끔하게 이뤄지지 못했다. '굿', '굳'과 같은 긍정적인 키워드가 있어서 한글자를 없애는 작업을 하지 않았더니 '나, '가', '요', '맛'과 같이 의미가 없는 단어들이 자주 등장한게 눈에 띄었다. 또한 워드클라우딩은 다양한 매장을 출력해서 보니 눈에 쉽게 들어오지 않는 문제가 있었다. 그래서 매장별로 긍/부정에 대한 반응을 나누어 그 결과를 보는게 적합하겠다는 생각이 들었다. 다음 포스팅에서는 매장의 리뷰가 긍정인지 부정인지 평가하고 매장의 전체적인 반응을 살펴보는 작업을 해보도록 하겠다!!
'데이터분석' 카테고리의 다른 글
최동원 선수 연봉 예측 프로젝트 (2) | 2023.01.12 |
---|---|
따릉이 수요량 예측 (0) | 2023.01.03 |
텍스트 마이닝 - Bag of words / TF-IDF (0) | 2022.12.12 |
이디야는 스타벅스 근처에 입점한다? (0) | 2022.11.25 |
제주도 교통량 예측(1)_EDA (0) | 2022.10.11 |