■食べログのpythonスクレイピングと分析 #3 「データの収集(全国分)そしてちょっと分析」

スポンサーリンク
tech系(python)
スポンサーリンク

※今回の分析は2022年7月に集めたデータでしています。

全国分データを集める

前回までで札幌のお店の情報まで集めた。

今回は北海道全体のお店の情報を集め、最終的には全国のお店の情報を集める。

以下のような流れで。

①札幌駅周辺のお店の情報をできるだけすべて集め、

②その次に札幌のお店の情報をできるだけすべて集め、(←★前回はここまで)

③最後には北海道全土のお店の情報をできるだけすべて集めます。(←★今回はここから)

というところなんだけど、いっそのこともう全国のデータを集めるようにしたコードから載せちゃうね。

もう結果からね、載せちゃうね。

前回の最後の記事のコードあるよね。「ステップ②のコード」のところのコード

これに以下を追加して完成!

import requests
from bs4 import BeautifulSoup
import time
import pandas as pd

todoufuken_list = [
    "hokkaido/A01",
    "aomori/A02", "iwate/A03", "miyagi/A04",  "akita/A05", "yamagata/A06", "fukushima/A07",
    "ibaraki/A08", "tochigi/A09", "gunma/A10", "saitama/A11", "chiba/A12", "tokyo/A13", "kanagawa/A14", 
    "niigata/A15", "toyama/A16", "ishikawa/A17", "fukui/A18", "yamanashi/A19", "nagano/A20", 
    "gifu/A21", "shizuoka/A22", "aichi/A23", "mie/A24", 
    "shiga/A25", "kyoto/A26", "osaka/A27", "hyogo/A28", "nara/A29", "wakayama/A30",
    "tottori/A31", "shimane/A32", "okayama/A33", "hiroshima/A34", "yamaguchi/A35",
    "tokushima/A36", "kagawa/A37", "ehime/A38", "kochi/A39", 
    "fukuoka/A40", "saga/A41", "nagasaki/A42", "kumamoto/A43", "oita/A44", "miyazaki/A45", "kagoshima/A46",
    "okinawa/A47"
]

for todoufuken_item in todoufuken_list: # 全国分のループ
    count = 0
    for todoufuken_erea_num in range(1, 15): # エリア別 このループで都道府県の一つ分 A0101とか、A0102とか
        info_dict = {}
        url_elem = todoufuken_item.split('/')

        if todoufuken_erea_num < 10:
            place_num = url_elem[1] + "0" + str(todoufuken_erea_num)
        elif todoufuken_erea_num >= 10:
            place_num = url_elem[1] + str(todoufuken_erea_num)
        ## ここまででA0101, A0102ができる

#============================================
# 🤗前回の「ステップ②のコード」のところのコード(importのところは抜いてね! あと追加したfor文に合わせてインデント)
'''
 for erea_num in range(1, 30):
    if erea_num < 10:
        erea_item = url_elem[1] + "0" + str(erea_num)
    elif erea_num >= 10:
        erea_item = url_elem[1] + str(erea_num)
### ・・・略・・・
'''
#============================================

        output_df = pd.DataFrame(info_dict)
        output_df.to_csv('【csvファイルを出力するpath】/erea_data_' + place_num + "_" + url_elem[0] + '.csv', encoding='utf_8_sig')

ちなみに以下の部分について、1~14でfor文が回ることになるんだけど、東京のエリア数が凄い多いので14じゃ納まらない。だから別途rangeを変えて東京だけ集める必要がある。

    for todoufuken_erea_num in range(1, 15): # エリア別 このループで都道府県の一つ分 A0101とか、A0102とか

そして集めるんだけど、前回まではjupyter notebookでパソコンでプログラムを実行してた。

だけど北海道の札幌だけでも相当時間がかかったからラズベリーパイで動かすことにした。

昔、構築したやつね

バックグラウンド実行をして、プログラムを実行させて放置することにした。

ほぼ5日かかったよ。。

バックグラウンド実行はこちらの記事なんかを読むのがおススメかな。

このプログラムでエリアごとのデータがまとめて1つのcsvファイルとして出力される。

上記コードの以下の部分で。

        output_df.to_csv('【csvファイルを出力するpath】/erea_data_' + place_num + "_" + url_elem[0] + '.csv', encoding='utf_8_sig')

データを見てみる

集めたcsvデータをpythonのdataframeとして読み込んで分析をする。

試しに北海道から。

まずはエリアごとにcsv出力されているからこれらをつなげて一つのdataframeとして作る必要がある。

レシピとしては

  • Pandasのread_csvを使ってdataframeを作る
  • エリアごとに分かれているからconcatを使ってhokkaidoのdataframeを結合させて1つのdataframeを作る
  • 転置させる(transpose()を使う)

下の方に行数が出てるけど、35225件ある。

北海道だけで3万件以上のデータがあるということで、全部ですごい量になりそう。

まずは一旦、昼の値段と夜の値段の値がどんな値があるかを見てみる。

昼の値段はday_value、夜の値段はnight_valueなので以下のようにvalue_countsを使用して見てみる。

print(df_hokkaido_tr['day_value'].value_counts())
print("--------------------------------------")
print(df_hokkaido_tr['night_value'].value_counts())

実行結果は以下。

~¥999              16817
-                   8774
¥1,000~¥1,999       7517
¥2,000~¥2,999        937
¥3,000~¥3,999        366
¥6,000~¥7,999        222
¥5,000~¥5,999        174
¥4,000~¥4,999        169
¥10,000~¥14,999      101
¥8,000~¥9,999         70
¥20,000~¥29,999       29
¥15,000~¥19,999       26
¥30,000~¥39,999       11
¥40,000~¥49,999        9
¥50,000~¥59,999        2
¥100,000~              1
Name: night_value, dtype: int64
--------------------------------------
-                  16917
~¥999               4813
¥1,000~¥1,999       3739
¥2,000~¥2,999       2864
¥3,000~¥3,999       2682
¥4,000~¥4,999       1451
¥5,000~¥5,999        815
¥6,000~¥7,999        664
¥10,000~¥14,999      520
¥8,000~¥9,999        423
¥15,000~¥19,999      163
¥20,000~¥29,999      114
¥30,000~¥39,999       37
¥40,000~¥49,999       10
¥60,000~¥79,999        6
¥80,000~¥99,999        5
¥100,000~              2
Name: day_value, dtype: int64

各値は18種類の値段範囲がある事がわかる。

「-」を除いた17種類の値が、各お店の評価とどのような関係があるのかを見ていく。

ラベルをそれぞれの価格帯に貼る。

「~¥999」なら「1」、「¥1,000~¥1,999」なら「2」…という具合だ。

そしてラベルの値を横軸に、評価値を縦軸にとった散布図を出力する。

ラベルが大きくなれば値段が大きくなる。つまり、ラベルが大きくなっていくに従って評価値も上がるのであれば値段によってある程度評価値も決まっているという事になる。

要は値段と評価値の相関を調べようという訳である。

ちなみに今回は値段が無いもの、「-」の価格帯の評価値のものは考えていない。

お昼(ランチ)の値段の散布図

まずはお昼(ランチ)の値段と評価値から。横軸がラベルの値、縦軸が評価値

もうグラフから相関が無いのはわかるね。。。🥲

2つの変数の関係がどれだけ強いのか、又は弱いのかを相関係数という数値で表すんだけど、今回の相関係数は「0.09281」。

相関係数は「1」に近ければ近いほど相関があるといわれ、だいたい0.7ぐらいあればある程度の相関があるねって言われるから、今回は全然ない事がわかる。

夜(ディナー)の値段の散布図

お次は夜(ディナー)の値段と評価値。お昼(ランチ)の値段の時と同様に横軸がラベルの値、縦軸が評価値

はい、これも相関がない事は分かるね。。。

ちなみに相関係数は「0.05988」。

もう全然ないね。

✅ちょっと余談「こんなエラー出ませんでしたか?」▶「ValueError: scatter requires y column to be numeric」

散布図を表示するときに出たエラー。

僕の場合はdf_hokkaido_trに格納されている評価値(score)の値がおかしかったようで、散布図の入力の値のtypeを確認してみよう!

試しにscoreのtypeを見てみる

for i in df_hokkaido_tr['score']:
    print(type(i))

と以下のように出力される

<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>

csvファイルから読み込んだからか文字列になってしまっていた。

なので型を変換する。

以下のようにすれば解決。

df_hokkaido_tr["score"]=df_hokkaido_tr["score"].astype(float)

全国各都道府県の相関係数を見てみる

全国各都道府県のそれぞれの相関係数を見てみる事にする。

相関係数が1に近ければ値段が高いほど評価が高いという、それは、ある意味でコスパの常識が通用することを意味していると言える。

全国各都道府県の相関係数は以下。

 ランチと評価値の相関係数ディナーと評価値の相関係数
北海道0.0930.06
青森県0.1050.1
岩手県0.0970.089
宮城県0.1180.136
秋田県0.1780.148
山形県0.0920.049
福島県0.085-0
茨城県0.1390.008
栃木県0.106-0.01
群馬県0.0810.048
埼玉県0.1040.036
千葉県0.1140.052
神奈川県0.1630.109
東京都0.2420.245
新潟県0.045-0.04
富山県0.2890.192
石川県0.3420.23
福井県0.0860.032
山梨県0.0740.032
長野県0.1080.038
岐阜県0.1090.033
静岡県0.1760.067
愛知県0.230.217
三重県0.1370.093
滋賀県0.2040.136
京都府0.140.031
大阪府0.2090.224
兵庫県0.1530.07
奈良県0.130.087
和歌山県0.1320.048
鳥取県0.1020.093
島根県0.1410.116
岡山県0.1350.106
広島県0.1290.031
山口県0.1380.087
徳島県0.1050.092
香川県0.0280.113
愛媛県0.1030.06
高知県0.1150.024
福岡県0.170.187
佐賀県0.1850.15
長崎県0.1280.114
熊本県0.1280.056
大分県0.1610.085
宮崎県0.1850.144
鹿児島県0.1910.099
沖縄県0.0670.138

相関係数が最大となったのはランチは石川県の「0.3424」でディナーは東京都の「0.2450」だった。

上記の表の結果から、全体的に日本のレストランにおいてコスパの常識は通用しないことを意味する。

同時にそれは、コスパの良いレストランが存在することも意味する。

つまり、値段が高ければ評価が高いという常識が通用するようなであれば、コスパの概念は無くなる。

一方で値段が高くても評価が低いものがあればコスパは悪いという概念が生まれ、値段が低くても評価が高ければコスパは良いと言う概念が生まれる。

次回以降は、コスパの良いレストランの条件を探してみる事にする。

今回はここまでにする。

最後まで読んでいただきありがとうございました。


タイトルとURLをコピーしました