foliumで近所の食べログ高評価の店をマッピングしてみる

家の近所、例えば、最寄り駅から半径10km圏内を目安として食事の美味しい店を探そうと思った場合、ほとんどの人は、食べログの口コミ評価を頼りにするのではないだろうか。見知らぬ店にいきなり事前調査も無しに入るのは危険な行為と言えるだろう。27年前に、家の近所の蕎麦屋に入った時に、店のあまりの汚さに驚かされ、さらに、出てきた蕎麦のあまりの不味さに驚愕した記憶がある。よくこんな酷い店が、今まで潰れずに残ったものだと感心させられた。そのような悲劇に遭わないためにも、口コミ評価に事前に目を通す必要がある。今回は、家の近所の評価の高い店だけを知りたい時のために、地図上に評価の高い店だけ表示させてみようと思う。

スポンサーリンク

食べログデータの収集

先ず、家の最寄駅から10km圏内の禁煙の店だけを抽出する。今時、禁煙でない店は入る価値もないだろう。取り敢えず、店名、評価、店舗URLを抽出してみるが、コードがあまりにも汚いので、データのロードから始める。

import pandas as pd

df = pd.read_csv('tabelog.csv',encoding='utf-8')

ロードしたデータをチラ見する。

df.head()
店名 口コミ評価 店舗URL
0 鮨 なんば 阿佐ヶ谷 4.51 https://tabelog.com/tokyo/A1319/A131905/13127515/
1 SATOブリアン にごう 4.42 https://tabelog.com/tokyo/A1319/A131905/13159782/
2 SATOブリアン 本店 4.33 https://tabelog.com/tokyo/A1319/A131905/13127046/
3 器楽亭 4.20 https://tabelog.com/tokyo/A1318/A131806/13050819/
4 サトブリDA 4.18 https://tabelog.com/tokyo/A1319/A131905/13216529/
スポンサーリンク

マッピングには経度と緯度が必要

foliumを使って地図上に店をマッピングするには経度と緯度が必要なので、店舗の詳細サイトからデータを拾ってくる必要がある。これもコードがあまりにも見苦しいので、収集したデータをロードするところから始める。

df1 = pd.read_csv('tabelog_1.csv',encoding='utf-8')

新たにロードしたデータをチラ見する。

df1.head()
店名 口コミ評価 ジャンル 住所 交通手段 営業時間・定休日 予算(口コミ集計) 経度 緯度 最寄り駅
0 鮨 なんば 阿佐ヶ谷 4.51 寿司 東京都杉並区阿佐谷南3-44-4 B1F このお店は「杉並区天沼3-11-3」から移転してい… 阿佐ヶ谷駅徒歩2~3分■南口を出て、交番の横を通り細い道をまっすぐ突き当たりまで進みます。■… 営業時間 18:00~20:50 21:00~24:00(二部制) 日曜営業 定休日 水曜 … [夜]¥20,000~¥29,999 [昼]¥20,000~¥29,999 35.701314 139.637222 阿佐ケ谷駅
1 SATOブリアン にごう 4.42 焼肉、牛料理、牛タン 東京都杉並区阿佐ヶ谷南2-17-2 阿佐ヶ谷駅すぐ 阿佐ケ谷駅から180m 営業時間 17:00~23:30(L.O.) 日曜営業 定休日 不定休 [夜]¥15,000~¥19,999 [昼]¥15,000~¥19,999 35.701623 139.640903 阿佐ケ谷駅
2 SATOブリアン 本店 4.33 焼肉 東京都杉並区阿佐谷南3-44-2 新井ビル 1F 阿佐ヶ谷駅南口 徒歩2分■ご予約人数とコースSATOブリアン本店は4〜6名様迄、にごう店のご… 営業時間 営業時間17:00~23:30(23:00L.O.) 日曜営業 定休日 (不定休) [夜]¥15,000~¥19,999 35.701390 139.637411 阿佐ケ谷駅
3 器楽亭 4.20 割烹・小料理、居酒屋 東京都杉並区久我山5-7-9 久我山ハウジング103 井の頭線 久我山駅 徒歩3分 久我山駅から151m 営業時間 18:00~22:00頃(最終入店) 日曜営業 定休日 水曜 [夜]¥15,000~¥19,999 35.684561 139.604234 久我山駅
4 サトブリDA 4.18 焼肉 東京都杉並区阿佐谷南3-57-1 阿佐ヶ谷駅徒歩1分 阿佐ケ谷駅から102m 営業時間 17:00~23:30(23:00L.O.) 定休日 不定休 [夜]¥15,000~¥19,999 [昼]¥15,000~¥19,999 35.701614 139.637793 阿佐ケ谷駅
スポンサーリンク

foliumで食べログデータをマッピング

import folium
m = folium.Map(location=[35.658099,139.741357],tiles="OpenStreetMap",zoom_start=5)
for i in range(0,len(df1)):
    if df1.iloc[i]['口コミ評価']>= 4.2:
        folium.Marker([df1.iloc[i]['経度'],df1.iloc[i]['緯度']],
        radius=10*df1.iloc[i]['口コミ評価'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"店名:"+df1.iloc[i]['店名']+"<br>"+"スコア:"+df1.iloc[i]['口コミ評価'].astype(str)+
        "<br>"+"ジャンル:"+df1.iloc[i]['ジャンル']+"<br>"+"予算:"+
        df1.iloc[i]['予算(口コミ集計)']+"<br>"+"最寄り駅:"+
        df1.iloc[i]['最寄り駅']+'</div>',max_width=400,min_width=400,
        parse_html=False),color='purple',fill_color='purple',).add_to(m)
m

器楽亭の位置がグーグルマップの位置と違うので、どうやら、経度と緯度を変換してやる必要があるようである。調べてみると、日本測地系の経度と緯度を世界測地系の経度と緯度に変換しなくてはならないらしい。この変換はPyprojを使えば簡単にできる。変換したデータを新たにロードする。

df2 = pd.read_csv('tabelog_3.csv',encoding='utf-8')
m = folium.Map(location=[35.658099,139.741357],tiles="OpenStreetMap",zoom_start=5)
for i in range(0,len(df2)):
    if df2.iloc[i]['口コミ評価']>= 4.2:
        folium.Marker([df2.iloc[i]['経度'],df2.iloc[i]['緯度']],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"店名:"+df2.iloc[i]['店名']+"<br>"+"スコア:"+df2.iloc[i]['口コミ評価'].astype(str)+
        "<br>"+"ジャンル:"+df2.iloc[i]['ジャンル']+"<br>"+"予算:"+
        df2.iloc[i]['予算(口コミ集計)']+"<br>"+"最寄り駅:"+
        df2.iloc[i]['最寄り駅']+'</div>',max_width=400,min_width=400,
        parse_html=False),icon=folium.Icon(color='green')).add_to(m)
    if df2.iloc[i]['口コミ評価']<4.2 and df1.iloc[i]['口コミ評価']>=4.0:
        folium.Marker([df2.iloc[i]['経度'],df2.iloc[i]['緯度']],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"店名:"+df2.iloc[i]['店名']+"<br>"+"スコア:"+df2.iloc[i]['口コミ評価'].astype(str)+
        "<br>"+"ジャンル:"+df2.iloc[i]['ジャンル']+"<br>"+"予算:"+
        df2.iloc[i]['予算(口コミ集計)']+"<br>"+"最寄り駅:"+
        df2.iloc[i]['最寄り駅']+'</div>',max_width=400,min_width=400,
        parse_html=False),icon=folium.Icon(color='blue')).add_to(m)
    if df2.iloc[i]['口コミ評価']<4.0 and df1.iloc[i]['口コミ評価']>=3.8:
        folium.Marker([df2.iloc[i]['経度'],df2.iloc[i]['緯度']],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"店名:"+df2.iloc[i]['店名']+"<br>"+"スコア:"+df2.iloc[i]['口コミ評価'].astype(str)+
        "<br>"+"ジャンル:"+df2.iloc[i]['ジャンル']+"<br>"+"予算:"+
        df2.iloc[i]['予算(口コミ集計)']+"<br>"+"最寄り駅:"+
        df2.iloc[i]['最寄り駅']+'</div>',max_width=400,min_width=400,
        parse_html=False),icon=folium.Icon(color='purple')).add_to(m)
    if df2.iloc[i]['口コミ評価']<3.8 and df1.iloc[i]['口コミ評価']>=3.6:
        folium.Marker([df2.iloc[i]['経度'],df2.iloc[i]['緯度']],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"店名:"+df2.iloc[i]['店名']+"<br>"+"スコア:"+df2.iloc[i]['口コミ評価'].astype(str)+
        "<br>"+"ジャンル:"+df2.iloc[i]['ジャンル']+"<br>"+"予算:"+
        df2.iloc[i]['予算(口コミ集計)']+"<br>"+"最寄り駅:"+
        df2.iloc[i]['最寄り駅']+'</div>',max_width=400,min_width=400,
        parse_html=False),icon=folium.Icon(color='red')).add_to(m)
    if df2.iloc[i]['口コミ評価']<3.6 and df1.iloc[i]['口コミ評価']>=3.4:
        folium.Marker([df2.iloc[i]['経度'],df2.iloc[i]['緯度']],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"店名:"+df2.iloc[i]['店名']+"<br>"+"スコア:"+df2.iloc[i]['口コミ評価'].astype(str)+
        "<br>"+"ジャンル:"+df2.iloc[i]['ジャンル']+"<br>"+"予算:"+
        df2.iloc[i]['予算(口コミ集計)']+"<br>"+"最寄り駅:"+
        df2.iloc[i]['最寄り駅']+'</div>',max_width=400,min_width=400,
        parse_html=False),icon=folium.Icon(color='black')).add_to(m)
m

中央線沿線が圧倒的に多いことが見て取れる。negombo33というカレー店がいつの間にか評価4を超えていて驚いた。まだ一度も行っていないが、一度は行ってみたいと思っている。阿佐ヶ谷のレベルが高いのにビビった。とは言っても、食べログの評価が絶対という訳でもないので、自分の舌で確かめてみるのがいいのかもしれない。この評価は、あくまでも、外れを引かないための参考程度に考えおくのが良いようである。


スポンサーリンク
スポンサーリンク