はじめに
今回はコスパ指数の高いお店をマッピングしたいと思います。
コスパ指数についてはこちらの記事で定義しています。
今回何故コスパのよいお店をマッピングしようとしたかというと、コスパ指数が高いお店が何だというのが分かっていてもその場所までいちいち調べるのに手間がかかるからです。
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
食べログのページはこちら