2022/06/27

webスクレイピング×GISで旅行を計画する

旅行先でのルートを決める方法について、データサイエンス風に決めてみませんか?

研究室生活を送っていると、自然と技術が身についてきます。私の場合では、Pythonを使ったwebスクレイピングの技術が身につきました。webスクレイピングというのは、例えば、インターネット上に存在する情報へ自動的にアクセスし、欲しい情報をエクセルに保存できるような技術です。この技術を用いて、インターネット上で公開されている観光地の住所データを取得してみたいと思います。また、住所データを地図上に可視化できるサービスである地理情報システム(GIS)に入力して、旅行のルートを決めてみたいと思います。GISは「ArcGIS Pro」や「QGIS」などがあるのですが、今回は誰でも簡単にweb上で操作できるGISである「統計GIS(jSTAT MAP)」を使います。コーディングに関してはPython3.8を使用しています。

※スクレイピングはルールが多いです。特に、やってはいけないことがいくつか存在するので、実行する際はルールをよく確認してからにしましょう。

Step 1:旅行先と目的を決める

まずは行きたい場所を決めます。今回は夏休み期間の「ちょっと長くてリッチな旅行」を想定して、九州を一周する旅行の計画をテーマにします。九州はとても広く、魅力的な場所が多いので、どのように観光すればいいか迷うと思います。せっかくなら、有名な観光地であったり、九州ならではのものを体験してみたいですよね。まずは、どのような観光地があるのか情報を集めてみましょう。

Step 2:観光地のリストを作成する

観光地が公開されているサイトを探しましょう。今回は「一休.com」というサイトから、九州の観光名所をスクレイピングします。ほしい方法は「観光地名」と「住所」の2つです。観光地名はランキングページに記載されているのですが、住所はクリックしないと表示されないみたいなので、それを考慮したコードを書きます。使用するライブラリはSeleniumとBeautifulSoupなどで、chrome drivreを用いて実行します。

コーディングの手順として、まずはSeleniumとBeautifulSoupを用いてそのページのソースを取得します。その後、ページにURLが記載されている部分を抜き出します。これらの作業はPythonとBeautiful SoupでWebスクレイピングとHTML解析をする方法が参考になるかと思います。欲しいURLは「/kankou/spot」が含まれているものなので、取得したURLからフィルターをかけて抽出します。その後、抽出したURLをfor文で回し、観光地の詳細ページへアクセスします。そして、soup.find_allで観光地名・住所を取得します。観光地名はsoup.find_all(‘h1’, ‘this-title inlineblock’)、住所はsoup.find_all(‘tr’, ‘this-address’)から取得できます。その後、.textで単語のみにし、replace関数で空白や改行などの余計な文字を変換します。これらをリストに格納し、リストをデータフレームとして変換します。このデータフレームをcsv出力することで、住所一覧データが完成します。

Step 3:情報をGISに入力する

早速スクレイピングした住所情報csvを地図に出力してみましょう。統計GISにアクセスし、左上の「統計地図作成」の「プロット作成」から「ジオコーディング」を選択します。

その後、先ほど作成したcsvファイルをアップロードすると、勝手にプロットしてくれます。プロットしたポイントを赤色の四角で表してみました。そうすると、30件中、29件が成功しました。大分県の「パークプレイス大分」が出力されていないみたいですね。住所の情報が荒い別府温泉の「大分県別府市北浜」が正常に出力されていることから、パークプレイス大分の「大分県大分市公園通り西2丁目1」が出力されないのは謎ですね。しかし、それ以外の場所は正常にプロットされているみたいです。

宮崎県が観光ランキングに一つも入ってないのは良くわかりません…。一時期話題になった都道府県魅力度ランキングでは、17位という悪くない順位なはずなんですけどね。

ここでもう一つ情報を加えましょう。スタート地点とゴール地点の追加です。私は埼玉県に住んでいるので、九州へは飛行機で向かいたいです。そのため、このマップに空港の場所をプロットしましょう。自分自身、交通費は極力抑えたい派なので、LCC(ここではJetstar)が離着陸する空港をプロットします。成田空港発で九州に行ける空港は福岡空港、大分空港、鹿児島空港、熊本空港、宮崎空港、長崎空港のみなので、手動でプロットします。プロット方法は、先ほどの「統計地図作成」の「プロット作成」から、「地図クリック」を選択します。新規グループを作成することで、空港グループのアイコンを表示することができます。空港のグループを「人型(青)」でプロットしてみました。以上で手を動かす分析の項目は終了です。

Step 4:旅行ルートを考える

最後に、分析して出てきた結果からルートを考えてみましょう。赤い四角の場所を多く回れることがベストですが、北部と南部で明確に分離していることがわかります。それなので、今回は赤い四角が密集している九州北部を観光するルートを考えてみましょう。密集度から考えると、福岡博多の市街地、北九州、大分の別府あたりに向かえばたくさん回れそうですね。せっかくなら色々な場所でアクティビティを楽しんで、最後に温泉で癒されるルートが理想的です。そのため、別府温泉、大分空港をゴールに設定してみましょう。そうすると、スタート地点は福岡空港か長崎空港か、ですかね。観光地の中から行きたい場所を考えると・・・(以下略、あとは自分好みに設定してみてください)。

ちなみに私は福岡空港スタートで、博多を満喫した後、新幹線で熊本へ。そこからレンタカーで黒川温泉、由布院温泉、別府温泉をめぐるツアーを計画しました。

まとめ

webスクレイピング×GISで旅行計画というのは、かなり実用性が高く、私自身、旅行計画を立てるときに使用していました。最初はPythonに触ることやGISに触ることが難しいと思う人もいるかもしれませんが、インターネットの情報が豊富に存在するので、わからないことがあれば検索すると大体解決します。なので、興味を持ったら是非試してみてください。

また、研究室活動はこのブログの延長みたいな感じです。データを見つける、データを収集する、データを整理する、そのデータで分析する、分析結果を考察する、という流れは、このブログも研究も大差ありません。市川研究室では「シミュレーション」という単語に印象を持つ方が多いですが、このようなデータサイエンス・情報処理のような分野も存在するので、気になる方は是非研究室に見学しにきてください。

著者プロフィール

塚本純也

芝浦工業大学 理工学研究科 システム理工学専攻。将来なくなる大学についての研究に従事。

関連記事はこちら