■食べログのpythonスクレイピングと分析 #8 「コスパのよいお店をマッピング/ジャンル別コスパの高いお店を(少し)載せる」

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

はじめに

今回はコスパ指数の高いお店をマッピングしたいと思います。

コスパ指数についてはこちらの記事で定義しています。

今回何故コスパのよいお店をマッピングしようとしたかというと、コスパ指数が高いお店が何だというのが分かっていてもその場所までいちいち調べるのに手間がかかるからです。

Stepとしては

①住所から緯度と経度を求める

②foliumで地図にマッピングをする

です。

Step1: 住所から緯度と経度を求める

食べログから住所情報はとってきてあるので、

その住所情報から緯度と経度情報に変換→dataframeに新しい列として緯度と経度を追加→csvファイルに保存するプログラムを作っておきます。

住所から緯度と経度を求めるプログラムは以下のような感じです。

rom bs4 import BeautifulSoup
import time
from tqdm import tqdm
import numpy as np
import pandas as pd
import datetime

def get_lat_lon_from_address(address):
    url = 'http://www.geocoding.jp/api/'
    try:
        payload = {"v": 1.1, 'q': address}
        r = requests.get(url, params=payload)
        ret = BeautifulSoup(r.content,'lxml')
        if ret.find('error'):
            lat = "-"
            lon = "-"
            time.sleep(10)
        else:
            lat = ret.find('lat').string
            lon = ret.find('lng').string
            time.sleep(10)
    except:
        lat = "-"
        lon = "-"
        time.sleep(10)

    return lat, lon

一つのレストランに対して10秒間のインターバルを設けるので

全ての東京のレストランのアドレスから緯度と経度を求めると膨大な時間がかかってしまいます。

そこで今回はジャンルごとにランチとディナーにおけるコスパ指数ベスト5を求めてそれに対して緯度と経度を求めていきます。(これでも12時間ぐらいかかるのでラズベリーパイで実行して出力をさせておきます。)

Step2: foliumでマッピングをする

まずはanacondaで使用するfoliumのインストールをします。

anaconda promptを開いて以下を実行してみます。

conda install -c conda-forge folium

インストールが完了したらプログラムを書いていきます。

import pandas as pd
import codecs
import folium

with codecs.open("./data/cospa_map_df_2022-10-11.csv", "r", "Shift-JIS", "ignore") as file:
    df_tokyo_for_mapping = pd.read_table(file, delimiter=",",index_col=0).transpose()
    
# 元のcsvファイルの緯度と経度が逆だったのでDataframeの列名を変更しています...👇
# 本来はいらないところです...
df_tokyo_for_mapping = df_tokyo_for_mapping.rename(columns={'lat': 'longitude', 'lon': 'latitude'})

cospa_map = folium.Map(
                   location=[35.6895014, 139.6917337], # 都庁の緯度経度です
                   zoom_start=12,
                   tiles='Stamen Terrain'
                   )

tooltip = 'Click me!'

for index, row in df_tokyo_for_mapping.iterrows():
    if (row['longitude'] != "-" and row['latitude'] != "-"):
        folium.Marker([row['longitude'], row['latitude']], 
                      popup='<i>' + index + ' , ' + row['store_name'] + ' , ' + row['cost_hensa'] + '</i>',
                      tooltip=tooltip).add_to(cospa_map)

cospa_map

ちなみに、今回使用するcsvファイルから作成したdataframeは以下のような感じです。

出力結果は以下です。たくさん出ましたね。いい感じ。

せっかくなのでデザインも変更していきます。

①コスパの値毎に表示する色を変えます。

②ランキング1位のお店は★マークにします。

コードは以下のようになりました。

import pandas as pd
import codecs
import folium
import re

with codecs.open("./data/cospa_map_df_2022-10-11.csv", "r", "Shift-JIS", "ignore") as file:
    df_tokyo_for_mapping = pd.read_table(file, delimiter=",",index_col=0).transpose()
    
df_tokyo_for_mapping = df_tokyo_for_mapping.rename(columns={'lat': 'longitude', 'lon': 'latitude'})

cospa_map = folium.Map(
                   location=[35.6895014, 139.6917337],
                   zoom_start=12,
                   tiles='Stamen Terrain'
                   )

tooltip = 'Click me!'

for index, row in df_tokyo_for_mapping.iterrows():
    if (row['longitude'] != "-" and row['latitude'] != "-"):
        if float(row['cospa']) <= 0:
            if re.match(".*_1",index):
                folium.Marker([row['longitude'], row['latitude']], 
                              icon=folium.Icon(icon_color="yellow", color="black", icon="glyphicon glyphicon-star"), 
                              popup='<i>' + index + ' , ' + row['store_name'] + ' , ' + row['cost_hensa'] + '</i>',
                              tooltip=tooltip).add_to(cospa_map)
            else:
                folium.Marker([row['longitude'], row['latitude']], 
                              icon=folium.Icon(icon_color="white", color="black", icon="glyphicon glyphicon-cutlery"), 
                              popup='<i>' + index + ' , ' + row['store_name'] + ' , ' + row['cost_hensa'] + '</i>',
                              tooltip=tooltip).add_to(cospa_map)
        elif (0 < float(row['cospa'])) and (float(row['cospa']) <= 10):
            if re.match(".*_1",index):
                folium.Marker([row['longitude'], row['latitude']], 
                              icon=folium.Icon(icon_color="yellow", color="blue", icon="glyphicon glyphicon-star"), 
                              popup='<i>' + index + ' , ' + row['store_name'] + ' , ' + row['cost_hensa'] + '</i>',
                              tooltip=tooltip).add_to(cospa_map)
            else:
                folium.Marker([row['longitude'], row['latitude']], 
                              icon=folium.Icon(icon_color="black", color="blue", icon="glyphicon glyphicon-cutlery"), 
                              popup='<i>' + index + ' , ' + row['store_name'] + ' , ' + row['cost_hensa'] + '</i>',
                              tooltip=tooltip).add_to(cospa_map)
        elif (10 < float(row['cospa'])) and (float(row['cospa']) <= 20):
            if re.match(".*_1",index):
                folium.Marker([row['longitude'], row['latitude']], 
                              icon=folium.Icon(icon_color="yellow", color="green", icon="glyphicon glyphicon-star"), 
                              popup='<i>' + index + ' , ' + row['store_name'] + ' , ' + row['cost_hensa'] + '</i>',
                              tooltip=tooltip).add_to(cospa_map)
            else:
                folium.Marker([row['longitude'], row['latitude']], 
                              icon=folium.Icon(icon_color="black", color="green", icon="glyphicon glyphicon-cutlery"), 
                              popup='<i>' + index + ' , ' + row['store_name'] + ' , ' + row['cost_hensa'] + '</i>',
                              tooltip=tooltip).add_to(cospa_map)
        elif 30 < float(row['cospa']):
            if re.match(".*_1",index):
                folium.Marker([row['longitude'], row['latitude']], 
                              icon=folium.Icon(icon_color="yellow", color="red", icon="glyphicon glyphicon-star"), 
                              popup='<i>' + index + ' , ' + row['store_name'] + ' , ' + row['cost_hensa'] + '</i>',
                              tooltip=tooltip).add_to(cospa_map)
            else:
                folium.Marker([row['longitude'], row['latitude']], 
                              icon=folium.Icon(icon_color="black", color="red", icon="glyphicon glyphicon-cutlery"), 
                              popup='<i>' + index + ' , ' + row['store_name'] + ' , ' + row['cost_hensa'] + '</i>',
                              tooltip=tooltip).add_to(cospa_map)

cospa_map

出力は以下。1位のお店に★がついているのも確認。いい感じです。

いい感じに可視化できたのではないでしょうか。

コスパジャンル別コスパの高いお店(一部)載せるコスパ

毎度おなじみになりましたが、ジャンル別のコスパ指数の高いお店を一部載せます。(コスパ指数の定義はこちらの記事で記載しています。)

5つのジャンルのランチとディナーにおけるランキングBest 5を載せます。

データは2022年8月に収集したものになります。

①飲茶・点心

ランチ

1 位: 龍口酒家本店(ロンコウチュウチャ)

評価値の偏差値: 74.6356 (評価値: 3.74 )

価格帯の偏差値: 49.5114 (価格帯: ¥1,000~¥1,999 )

コスパ指数: 25.1242

食べログのページはこちら


2 位: SENYO(圳陽)

評価値の偏差値: 73.4691 (評価値: 3.72 )

価格帯の偏差値: 49.5114 (価格帯: ¥1,000~¥1,999 )

コスパ指数: 23.9577

食べログのページはこちら


3 位: 上海わんたん・食彩厨房

評価値の偏差値: 69.9696 (評価値: 3.66 )

価格帯の偏差値: 49.5114 (価格帯: ¥1,000~¥1,999 )

コスパ指数: 20.4581

食べログのページはこちら


4 位: JASMINE憶江南

評価値の偏差値: 69.3863 (評価値: 3.65 )

価格帯の偏差値: 49.5114 (価格帯: ¥1,000~¥1,999 )

コスパ指数: 19.8749

食べログのページはこちら


5 位: 餃子のハルピン(ギョウザノハルピン)

評価値の偏差値: 63.5537 (評価値: 3.55 )

価格帯の偏差値: 45.4487 (価格帯: ~¥999 )

コスパ指数: 18.1051

食べログのページはこちら

ディナー

1 位: 上海わんたん・食彩厨房

評価値の偏差値: 69.2026 (評価値: 3.66 )

価格帯の偏差値: 44.4134 (価格帯: ¥1,000~¥1,999 )

コスパ指数: 24.7892

食べログのページはこちら


2 位: 龍口酒家本店(ロンコウチュウチャ)

評価値の偏差値: 73.6973 (評価値: 3.74 )

価格帯の偏差値: 54.7620 (価格帯: ¥6,000~¥7,999 )

コスパ指数: 18.9354

食べログのページはこちら


3 位: 餃子のハルピン(ギョウザノハルピン)

評価値の偏差値: 63.0223 (評価値: 3.55 )

価格帯の偏差値: 44.4134 (価格帯: ¥1,000~¥1,999 )

コスパ指数: 18.6089

食べログのページはこちら


4 位: 菜香餃子房(サイコウギョウザボウ)

評価値の偏差値: 66.3934 (評価値: 3.61 )

価格帯の偏差値: 48.1765 (価格帯: 4.0 )

コスパ指数: 18.2168

食べログのページはこちら


5 位: SENYO(圳陽)

評価値の偏差値: 72.5736 (評価値: 3.72 )

価格帯の偏差値: 54.7620 (価格帯: ¥6,000~¥7,999 )

コスパ指数: 17.811

食べログのページはこちら

②台湾まぜそば

ランチ

1 位: 濃厚ラーメンかなや

評価値の偏差値: 68.7892 (評価値: 3.76 )

価格帯の偏差値: 45.0870 (価格帯: ~¥999 )

コスパ指数: 23.7022

食べログのページはこちら


2 位: 麺酒やまの

評価値の偏差値: 67.5503 (評価値: 3.73 )

価格帯の偏差値: 45.0870 (価格帯: ~¥999 )

コスパ指数: 22.4634

食べログのページはこちら


3 位: 神田ラーメンわいず

評価値の偏差値: 67.1374 (評価値: 3.72 )

価格帯の偏差値: 45.0870 (価格帯: ~¥999 )

コスパ指数: 22.0504

食べログのページはこちら


4 位: ラーメン燈郎(とうろう)

評価値の偏差値: 66.7245 (評価値: 3.71 )

価格帯の偏差値: 45.0870 (価格帯: ~¥999 )

コスパ指数: 21.6375

食べログのページはこちら


5 位: はるか秋葉原店

評価値の偏差値: 63.0079 (評価値: 3.62 )

価格帯の偏差値: 45.0870 (価格帯: ~¥999 )

コスパ指数: 17.9209

食べログのページはこちら

ディナー

1 位: 濃厚ラーメンかなや

評価値の偏差値: 67.9705 (評価値: 3.76 )

価格帯の偏差値: 44.1098 (価格帯: ~¥999 )

コスパ指数: 23.8606

食べログのページはこちら


2 位: 神田ラーメンわいず

評価値の偏差値: 66.3158 (評価値: 3.72 )

価格帯の偏差値: 44.1098 (価格帯: ~¥999 )

コスパ指数: 22.2059

食べログのページはこちら


3 位: 燕三条豊潤亭

評価値の偏差値: 64.2474 (評価値: 3.67 )

価格帯の偏差値: 44.1098 (価格帯: ~¥999 )

コスパ指数: 20.1376

食べログのページはこちら


4 位: 麺匠いし井→★閉店

評価値の偏差値: 62.1790 (評価値: 3.62 )

価格帯の偏差値: 44.1098 (価格帯: ~¥999 )

コスパ指数: 18.0692

食べログのページはこちら


4 位: はるか秋葉原店

評価値の偏差値: 62.1790 (評価値: 3.62 )

価格帯の偏差値: 44.1098 (価格帯: ~¥999 )

コスパ指数: 18.0692

食べログのページはこちら

③寿司

ランチ

1 位: すし佐竹

評価値の偏差値: 79.2729 (評価値: 3.93 )

価格帯の偏差値: 52.0107 (価格帯: ¥5,000~¥5,999 )

コスパ指数: 27.2622

食べログのページはこちら


2 位: 冨所(とみどころ)

評価値の偏差値: 80.1575 (評価値: 3.95 )

価格帯の偏差値: 54.3566 (価格帯: ¥6,000~¥7,999 )

コスパ指数: 25.8009

食べログのページはこちら


3 位: 匠誠

評価値の偏差値: 72.6382 (評価値: 3.78 )

価格帯の偏差値: 47.3189 (価格帯: ¥2,000~¥2,999 )

コスパ指数: 25.3193

食べログのページはこちら


4 位: 鮨石島

評価値の偏差値: 69.5420 (評価値: 3.71 )

価格帯の偏差値: 45.7549 (価格帯: ¥1,000~¥1,999 )

コスパ指数: 23.7870

食べログのページはこちら


5 位: 鮨龍次郎

評価値の偏差値: 96.0808 (評価値: 4.31 )

価格帯の偏差値: 73.1238 (価格帯: ¥15,000~¥19,999 )

コスパ指数: 22.9570

食べログのページはこちら

ディナー

1 位: 鮨さいとう(【旧店名】鮨かねさか赤坂店)

評価値の偏差値: 109.0669 (評価値: 4.63 )

価格帯の偏差値: 77.6560 (価格帯: ¥30,000~¥39,999 )

コスパ指数: 31.4109

食べログのページはこちら


2 位: 築地虎杖 魚河岸千両(うおがしせんりょう)

評価値の偏差値: 68.2856 (評価値: 3.67 )

価格帯の偏差値: 41.7346 (価格帯: ¥1,000~¥1,999 )

コスパ指数: 26.5510

食べログのページはこちら


3 位: 日本橋蛎殻町すぎた

評価値の偏差値: 112.4654 (評価値: 4.71 )

価格帯の偏差値: 88.3353 (価格帯: ¥40,000~¥49,999 )

コスパ指数: 24.1301

食べログのページはこちら


4 位: すし喜邑(㐂邑)

評価値の偏差値: 101.4204 (評価値: 4.45 )

価格帯の偏差値: 77.6560 (価格帯: ¥30,000~¥39,999 )

コスパ指数: 23.7644

食べログのページはこちら


5 位: 寿志團

評価値の偏差値: 69.5600 (評価値: 3.7 )

価格帯の偏差値: 47.0743 (価格帯: ¥6,000~¥7,999 )

コスパ指数: 22.4857

食べログのページはこちら


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