분석하고싶은코코

스타벅스 매장은 정말 매장마다 차이가 없을까?? - (1) 본문

데이터분석

스타벅스 매장은 정말 매장마다 차이가 없을까?? - (1)

코코로코코 2022. 12. 12. 15:49
반응형

이디야가 스타벅스 근처에 입점한다는 데이터 분석을 하면서 의문점이 하나 생겼다. 스타벅스는 모든 매장이 직영점이라는 것을 다른 프랜차이즈 커피 전문점과 다른점이라는 것을 강조한다. 직영점이라하면 본사에서 매장을 직접 관리하는 것인데 그렇다면 이러한 운영이 정말 소비자로 하여금 모든 매장에서 비슷한 경험을 할 수 있게 해주고 있는가에 대해서 의문이 들었다.

물론 스타벅스코리아에서 자체적으로 방문한 고객들에게 랜덤으로 설문조사를 통해서 그에 대한 평가가 이뤄지고 있다. 그런데 이 데이터는 내가 접근할 수 없으니 공개되어있는 리뷰를 분석해 정말 그런지 확인해보기로 했다.

 

 

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

결과

 

매장 리뷰에 많이 등장한 단어들을 확인할 수 있었지만 텍스트 전처리가 깔끔하게 이뤄지지 못했다. '굿', '굳'과 같은 긍정적인 키워드가 있어서 한글자를 없애는 작업을 하지 않았더니 '나, '가', '요', '맛'과 같이 의미가 없는 단어들이 자주 등장한게 눈에 띄었다. 또한 워드클라우딩은 다양한 매장을 출력해서 보니 눈에 쉽게 들어오지 않는 문제가 있었다. 그래서 매장별로 긍/부정에 대한 반응을 나누어 그 결과를 보는게 적합하겠다는 생각이 들었다. 다음 포스팅에서는 매장의 리뷰가 긍정인지 부정인지 평가하고 매장의 전체적인 반응을 살펴보는 작업을 해보도록 하겠다!!

반응형