松屋をマッピングする(Yahoo! ローカルサーチAPI)

概要

  • 全国の松屋マッピングしたくなったのでやってみた。
  • Yahoo! ローカルサーチAPIを叩いて、松屋の店舗一覧をざっくり取り出せた(※完全ではないけど、趣味なのでその程度の精度でいいってことにする)。この方法は別に松屋に限ったものではないので、他の様々なチェーン店等のデータ抽出にも応用できる。
  • GISで他のデータに重ねて遊べる。「標高が1番高い松屋」とかがわかる。松屋は都市部中心に立地しているので標高が低い場所にあるものが大半であり、標高が高い松屋は山梨・長野らへんに集中している。

手法検討

全国の松屋(系列店を含まずに牛丼屋としての松屋に限定すると、現時点で958店舗*1)をマッピングして、自分の好奇心を満たすことや達成感を得ることが目的。

手段として思い当たったのは以下3つ。

  1. 松屋の公式 Web サイトからひたすらコピペする
  2. 松屋の公式 Web サイトをスクレイピングする
  3. 外部の地図サイト等のデータを取得する(API 叩き等)

1. はアホらしいように思えたし、せっかくならスキルアップにつながるのがよいとも思った。残るは 2. と 3.。結局、2. はそこそこハードルが高かったこともあって、3. を試してみた。API 叩くのは、個別サイトの構造にあわせてコードを書くスクレイピングと比較して、他で同じようなことをするにもパラメータを変えれば十分なので応用が効きやすいとも思った。

外部のサイトのデータとして、Google Maps API も思いついたけど、全国のデータを検索するのはちょっと面倒そうだった*2

ちょうど、以下のツイートを見かけて、おれもYahoo! ローカルサーチAPIが使うといいんじゃないかと思ったので、これでやってみることにした。



Yahoo! ローカルサーチAPIを叩く

Yahoo!ローカルサーチAPIは「店舗、イベント、クチコミ情報などの地域・拠点情報(POI)を検索するためのAPI」であるとのこと。POIって響きがカワイイですね。「地域・拠点情報」ってネーミングがやや独特だけど、要はお店やイベントの情報ってことでよいらしい。

Yahoo! ローカルサーチAPI に係る利用上の制約はいまいち把握しづらかったけれども、以下のような点には留意する必要があるらしい(万が一同様のことを真似しようという人がいたら、この辺りは念のため調べてほしい)。

  • 24時間中1アプリケーションIDにつき50000件のリクエストが上限
  • 利用者自身の便宜をはかる非商用目的のみに使用することが認められている

松屋は5万件もないし、このデータ遊びに自分の好奇心を満たす以上の目的はないので、これらの利用上の制約は特に問題ないように思われた。利用に必要であるところのアプリケーションIDを取得した。

リクエストパラメータや返ってくる値のフィールドについては以下にバッチリまとめられている。
developer.yahoo.co.jp

  • 1回あたりの取得件数は最大100件。何度かループで回せばもっと多い件数のデータを取れるが、取得開始位置の最大値が3,000とされているので、3,101件以上取得する場合には対象地域を分割するなどの工夫が必要になる。住所コードで対象を限定できるので、適宜それを使えばよいと思う。今回は、松屋は1,000店舗程度なのでたぶん大丈夫かな(後ほど確認)。
  • 地域・拠点情報の名称および業種をキーワードで検索できるとのこと。今回は「松屋」で……。
  • 業種コードによって限定することもできる。今回は、狙っているもの以外の「松屋」たち(例:松屋銀座など)を極力排除すべく、「0101031(丼もの、牛丼、親子丼)」に設定した。
  • 出力結果をソートする基準はいくつか選べる。今回は、狙っているもの以外の「松屋」たちがコンタミしたときに手作業で取り除きやすいように、アイウエオ順でソートしてもらった。
  • 出力形式は XMLJSON を選べる(デフォルトは XML)。XML いけるなら、前書いたやつ*3みたいに Excel から API 叩くこともできるかと思ったけど、今回は Python で書くことにして、JSON で出力させた。
  • 出力させる情報はいっぱいあるものから好きに選べばよいけど、①住所コードがあると北から南にソートしたり市区町村別に集計したりできて便利、②重複データが時々あるので、電話番号も出しておくと重複削除に便利。

ここで、取得件数について確認。出力件数を1件に絞って API を叩いてみて、上記の条件で API 叩いたときの全データ件数(ResultInfo の Total)を確認した。「松屋」のうち「丼もの、牛丼、親子丼」にあてはまるものは全国で 1,339 件らしい。であれば上記の制限に対して余裕なので、全国分のデータを一気に出してもらうことにした。

あとは、上記の条件設定で API 叩いて、出てきたものを csv とかに出力するように、Python で 50 行くらいざくっと書いて実行した。
ほぼ一瞬で、1,339 行分の「松屋」データが出力された。店舗名欄を見ると、牛丼チェーンではなく田舎の食堂な「松屋」とか、「なか卯 松屋町店」(大阪府)とか、偽物(自分が探したいものではないというだけ)があるので、削除する。また、店舗名の重複もそこそこあるので、電話番号が被っているものは削除する方針で重複削除。

結果、整理されたデータは946件。実際の松屋は958店舗なので、99%ぐらい捕捉できていることになる。先のツイートによればコンビニの捕捉率は87%程度らしいので、それと比べても割と優秀なんじゃないか。捕捉できていないのは、新規開店とか、カレー食堂等との系列店との併設とか、そういう店舗のような気がする。たぶん。

遊ぶ

ここまでくればどうとでも加工できます。各店舗の緯度経度を GIS に突っ込めば地図になってくれる。松屋は首都圏にいっぱい(こなみ)。首都圏は鉄道路線沿いに立地してる感じがしますね(特に埼玉方面)。
f:id:serendipity0926:20210612213528p:plain
f:id:serendipity0926:20210612213549p:plain

GIS データ化して初めてできることとして、標高別に分類。ざっくりでいいので、国土地理院の全球版標高データ*4と重ねて、各店舗の標高を取得。解像度は 15 arcseconds とのことなので、ざっくり450m 四方ぐらいの標高だけど、まあいいでしょ。山梨・富士吉田の松屋が1番標高が高そう(840m程度)で、以下、上位を多く占めるのは長野県。標高500m以上のところにありそうなのは8店舗程度の模様。
f:id:serendipity0926:20210612213209p:plain

もうちょっと真面目に言うと、おそらく吉野家すき家も同じようにデータを取得して適当な単位で集計すると、なんかわかることがあるかも。今後の課題ですね!

<追伸>

すき家吉野家のデータも作ろうとしてみたところ、すき家はほぼ全店舗取れた(1,940店舗中、1,936店舗)けど、吉野家は全然データが取れない(1,197店舗中、656店舗)。本当に今後の課題になってしまった。気になるのでどこかで解決したい。

<追伸2>

地点別の標高、全球版標高データを重ねたりしなくても、国土地理院から出ている緯度経度に応じて標高を出せるAPIを使えば解決なんですね。知らなかった。。。
maps.gsi.go.jp

*1:執筆時点での店舗検索結果 https://pkg.navitime.co.jp/matsuyafoods/spot/list?category=0101 による

*2:ちょっと調べると、全国を網羅する緯度経度のデータを使って検索かけていた人がいたけど、松屋の店舗立地は都市部に偏っているので、そこまでやると無駄が大きそうだった

*3:Excel 上で施設・店舗名のリストから自動で住所リストをつくる(Google Maps API 活用) - 書きもの置き場

*4:地球地図全球版 | 国土地理院