LoginSignup
0
1

More than 1 year has passed since last update.

食べログとSNSの評価を比較してみた [その4]~食べログ取得・比較~

Last updated at Posted at 2021-10-09

お読みいただきありがとうございます!
本記事は[その4]となります。

以下4記事がまとめて3分で読める!
[3分で読める] 食べログとSNSの評価を比較してみた~ショート編~

簡単なあらすじ(リンク付き!)

5.食べログ評価の取得(2021年09月29日)

コード一覧はこちら
!pip install requests
!pip install beautifulsoup4

from bs4 import BeautifulSoup
import requests
import pandas as pd
import time
import matplotlib.pyplot as plt
import numpy as np
import traceback

data = []

base_url = 'https://tabelog.com/tokyo/A1306/A130602/13014316/dtlrvwlst/COND-0/smp1/?smp=1&lc=0&rvw_part=all&PG='
numb = 1

try:
  while numb <= 50:
    url=base_url+ str(numb)
    res = requests.get(url)
    # 文字化けしていない文字を抽出
    res.encoding = res.apparent_encoding
    soup = BeautifulSoup(res.text, "html.parser")


     # 口コミ
    time.sleep(1)
    view = soup.find_all("div",class_ = "js-rvw-item-clickable-area")
    for item in view:
      rate_list = [(rate.text) for rate in item.find_all('b', class_='c-rating-v2__val')]
      name_id = item.find("span",class_ = "lev").text
      fre = item.find("span",class_ = "u-text-num").text

      tmp = [[name_id,rate,fre]for rate in rate_list]
      data += tmp

    numb += 1

    column =["id(sum)",'rate','frequency']
    df = pd.DataFrame(data,columns = column)

    #評価「-」の行を消去
    norate = df[df['rate'] == "-"].index.tolist() 
    df = df.drop(norate)

    df.index += 1 
    df["count"] = df.groupby(by = ['rate',"frequency"]).transform('count')
    print(df.shape)

except:
  print('error')
  traceback.print_exc()
else:
  print('no_error')
finally:
  print('finish')

食べログをスクレイピング

tabe.png

[その1]で選定したお店の評価をスクレイピングします。

取得情報

column =["id(sum)",'rate','frequency']

食べログから取得するのは

- id
- rate(評価)
- frequency(来店回数)

口コミ数

base_url = 'https://tabelog.com/tokyo/A1306/A130602/13014316/dtlrvwlst/COND-0/smp1/?smp=1&lc=0&rvw_part=all&PG='
numb = 1

try:
  while numb <= 50:
    url=base_url+ str(numb)
    res = requests.get(url)

食べログの口コミ1ページには20人分の評価が記載されています。
今回取得する口コミの最大数が1000件未満だったため、
50ページ分の情報を取得できるように設定しました。

評価なし

#評価「-」の行を消去
    norate = df[df['rate'] == "-"].index.tolist() 
    df = df.drop(norate)

口コミの中には、文章のみ記載し、評価をしていない方もいます。
rateにstr型の"-"が含まれている場合、エラーが発生してしまうので事前に処理しておきます。

結果をプロット

~2種類のグラフを作成~
Evaluation and number of visits
(グラフ左)が「訪問回数と評価」を可視化。
x軸にrate(評価)
y軸にfrequency(訪問回数)
丸が大きいほど同じ評価が多いことを表し、来店回数における評価の変化を可視化。
x軸が上昇するほど、再来店(リピーター)の評価となる。

Evaluation distribution
(グラフ右)が「評価の分布」を可視化
x軸にrate(評価)
y軸にcount(同じ評価を付けた人の数)
棒グラフにより、どのあたりの評価が多いのかを可視化。
それぞれ、棒グラフの数(ビン数)を30に設定。
「青棒」 = 食べログでの評価
「オレンジ棒」= Twitterでの評価

10店舗の一覧は以下

「「表示方法」」
「食べログ」= 食べログ評価 / 件数
「Twitter」= Twitter評価 / 処理後の件数 (行った倍数) 
※()内はツイートを複製し棒グラフを伸ばした回数 = 数を合わせるため

ケンズカフェ

「食べログ」= 3.92 / 735件
「Twitter」= 3.41 / 606件 (2)
ケンズカフェ.png

ピエールエルメ

「食べログ」= 3.89 / 841件
「Twitter」= 3.60 / 1005件 (3)
ピエールエルメ.png

資生堂パーラー銀座

「食べログ」= 3.81 / 432件
「Twitter」= 3.60 / 420件 (3)
資生堂パーラー.png

ひみつ堂

「食べログ」= 3.76 / 940件
「Twitter」= 3.65 / 864件 (9)
ひみつ堂.png

和栗や

「食べログ」= 3.73 / 522件
「Twitter」= 3.61 / 477件 (3)
和栗や.png

銀座メゾンアンリ・シャルパンティエ

「食べログ」= 3.71 / 579件
「Twitter」= 3.90 / 618件 (6)
アンリ.png

銀座ウエスト銀座店

「食べログ」= 3.68 / 480件
「Twitter」= 3.73 / 420件 (3)
銀座ウエスト.png

キルフェボン.銀座

「食べログ」= 3.66 / 607件
「Twitter」= 3.60 / 781件
キルフェボン.png

マリアージュフレール銀座

「食べログ」= 3.62 / 405件
「Twitter」= 3.71 / 470件 (2)
マリアージュ.png

ブルーボトルコーヒー清澄白河

「食べログ」= 3.32 / 429件
「Twitter」= 3.78 / 528件 (2)
ブルーボトル.png

考察

左)散布図(食べログ)に関して

  • 来店回数が増えれば増えるほど、5ではなく4または4.5の評価が集まる(常連は5をつけない)
  • 初来店(1回目)の評価は3 ~ 4.5の間が多い
  • 0点の評価はなし
  • 両端(1と5)では1 < 5の評価が多く見られる

右)ヒストグラムに関して

  • 食べログは4周辺の評価が多いが、Twitterでは0または5の両極端も目立つ
  • Twitterでは喜びや期待または、怒りのどちらかでしか感想をツイートしないと予測
  • 結果として似た総合評価を得ているが、分布は全く異なる

6.比較

以下に食べログの評価とTwitterの分析を比較してみました。

店名 食べログ ツイート 食べログ - ツイート
キル フェ ボン 3.66 3.60 0.06
ピエール・エルメ 3.89 3.60 0.29
ブルーボトルコーヒー 3.32 3.78 -0.46
ケンズカフェ東京 3.92 3.41 0.51
マリアージュフレール 3.62 3.71 -0.09
ひみつ堂 3.76 3.65 0.11
資生堂パーラー 3.81 3.60 0.21
和栗や 3.73 3.61 0.12
アンリ・シャルパンティエ 3.71 3.90 -0.19
銀座ウエスト 3.68 3.73 -0.05
  • 食べログ平均点 = 3.71
  • ツイート平均点 = 3.66
  • どちらにもそれほど大きな差はなく、面白い結果となった
  • 分布が全く異なるのにも関わらず、総合評価はあまり変わらないのは面白い結果となった

終わりに

今回の結果より、SNSの情報は良い意見、厳しい意見ともに多かった。
SNSは自分の意見をつぶやくため、指定(店の人)が見てない想定で本音を記入するからだろうか?
ともかく、最終評価はあまり変わらなかったが、それぞれの評価の分布が可視化でき、
SNSの一面を可視化することができたのではないかと思いました。

そのため、利用方法としては、食べログで自分が行きたいお店を探し、
来店して後悔がないよう、SNSで本音を確認してお店を決めると失敗は少ないかもしれません。

今回は好きなカフェを調べてみました。
しかし、カフェの情報はInstagramに写真付きで発信する人が多いのかなと思いました。
私自身もカフェ情報はInstagramから調べます。
Instagramはスクレイピングが禁止されているため難しいですが、できたら面白いのではないでしょうか?

Pythonにて、さまざまな情報を取得し可視化を行い一番思ったのは
前職では広告の効果分析のためExcelに視聴率や離脱率、クリック数など手入力を行っていました。
その時できなかったことを短時間で可能とできるPythonは便利でもっと学んでみたいと感じました。

誤っていることも多々あるかと思いますが、ここまでお読みいただきありがとうございました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1