家の近所、例えば、最寄り駅から半径10km圏内を目安として食事の美味しい店を探そうと思った場合、ほとんどの人は、食べログの口コミ評価を頼りにするのではないだろうか。見知らぬ店にいきなり事前調査も無しに入るのは危険な行為と言えるだろう。27年前に、家の近所の蕎麦屋に入った時に、店のあまりの汚さに驚かされ、さらに、出てきた蕎麦のあまりの不味さに驚愕した記憶がある。よくこんな酷い店が、今まで潰れずに残ったものだと感心させられた。そのような悲劇に遭わないためにも、口コミ評価に事前に目を通す必要がある。今回は、家の近所の評価の高い店だけを知りたい時のために、地図上に評価の高い店だけ表示させてみようと思う。
食べログデータの収集¶
先ず、家の最寄駅から10km圏内の禁煙の店だけを抽出する。今時、禁煙でない店は入る価値もないだろう。取り敢えず、店名、評価、店舗URLを抽出してみるが、コードがあまりにも汚いので、データのロードから始める。
import pandas as pd
df = pd.read_csv('tabelog.csv',encoding='utf-8')
ロードしたデータをチラ見する。
df.head()
マッピングには経度と緯度が必要¶
foliumを使って地図上に店をマッピングするには経度と緯度が必要なので、店舗の詳細サイトからデータを拾ってくる必要がある。これもコードがあまりにも見苦しいので、収集したデータをロードするところから始める。
df1 = pd.read_csv('tabelog_1.csv',encoding='utf-8')
新たにロードしたデータをチラ見する。
df1.head()
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