Foliumで手軽に地理データを可視化する

2021.05.31

はじめに

データアナリティクス事業本部の鈴木です。

緯度・経度の情報が入っている地理データを確認する機会がありました。 手軽に確認するのに、Foliumというライブラリを使うと便利だったので紹介します。

Foliumとは

pythonからLeafletを使ってインタラクティブな地図を作成できるライブラリです。LeafletはオープンソースのJavaScriptライブラリで、Web地図サービスでインタラクティブな地図を作成するのに使われています。

Foliumを使うと、緯度・経度の値を使って、地図上にマーカーを立てたり、そのマーカーに視覚的な効果を付け足すことができます。タイルはいくつかの選択肢がありますが、デフォルトではOpenStreetMapが使われます。

こんなときに使うと便利

  • データの観測地点の場所が知りたいとき

地図上にマーカーを作成できるので、データの場所を可視化できます。 必要に応じて縮尺を変えることもできます。例えば、世界中の空港の利用客数のデータがあった場合、どの大陸のどのあたりに位置しているのかが分かります。

  • データ観測地点周辺の地理的な情報が知りたいとき

マーカー付近の地理的な特徴(山地なのか、海上なのか、市街地なのかなど)が分かります。 例えば、水位を計測したデータをFoliumでプロットすることで、データが川から得られたものなのか、それとも、湖や湧水のものなのかが分かります。それらの情報からデータに対する考察ができます。

いずれも地理データの可視化に一般的なメリットかもしれませんが、pandasなどと組み合わせて、pythonで完結して可視化できるので便利です。

可視化の準備

検証に使ったツールのバージョン

  • Visual Studio Code: 1.56.2
  • Jupyter Extension for Visual Studio Code: v2021.6.832593372
  • Python: 3.8.2
  • Folium: 0.12.1

環境準備

Foliumのインストール

ターミナルから、pipでインストールできます。

pip install folium

データ

今回は検証用に県庁所在地の緯度・経度を格納したCSVファイルを準備しました。 座標データは地理院地図から収集しました。

データを可視化してみる

では早速、Foliumを使ってデータを可視化してみます。

標準的な可視化をしてみる

まず、ベースとなる地図を作り、県庁所在地の座標にマーカーを立ててみます。

import folium
import pandas as pd

# このCSVには、県庁所在地の緯度・経度がlatitudeカラムとlongitudeカラムに入っている。
df_prefecture = pd.read_csv("../data/prefectural_capital_locations.csv")

def visualize_locations(df,  zoom=4):
    """日本を拡大した地図に、pandasデータフレームのlatitudeおよびlongitudeカラムをプロットする。
    """
        	
    # 図の大きさを指定する。
    f = folium.Figure(width=1000, height=500)

    # 初期表示の中心の座標を指定して地図を作成する。
    center_lat=34.686567
    center_lon=135.52000
    m = folium.Map([center_lat,center_lon], zoom_start=zoom).add_to(f)
        
    # データフレームの全ての行のマーカーを作成する。
    for i in range(0,len(df)):
        folium.Marker(location=[df["latitude"][i],df["longitude"][i]]).add_to(m)
        
    return m
    
visualize_locations(df_prefecture)

foliumでマーカーをプロットしたサンプル図

インタラクティブな地図上にデータ点をプロットすることができました。

データ周辺の状況などもよく分かります。例えば、お城の近くに県庁があることが多いのが分かります(歴史的な経緯でそのようになっているそうです)。

個々のデータ点の例

このように、分析対象を地図にプロットしてみて分かることがたくさんあります。

マーカーをカスタマイズしてみる

マーカーに表示されているアイコンは、folium.Markerのicon引数に、folium.Iconを渡すことで変えることができます。アイコンはFont AwesomeやTwitter Bootstrapのものが使用できます。

import folium
import pandas as pd

# このCSVには、県庁所在地の緯度・経度がlatitudeカラムとlongitudeカラムに入っている。
df_prefecture = pd.read_csv("../data/prefectural_capital_locations.csv")

def visualize_locations_with_icon(df,  zoom=4):
    """日本を拡大した地図に、pandasデータフレームのlatitudeおよびlongitudeカラムをプロットする。
    """
        	
    # 図の大きさを指定する。
    f = folium.Figure(width=1000, height=500)

    # 初期表示の中心の座標を指定して地図を作成する。
    center_lat=34.686567
    center_lon=135.52000
    m = folium.Map([center_lat,center_lon], zoom_start=zoom).add_to(f)
        
    # データフレームの全ての行のマーカーを作成する。
    # folium.Iconを使うことでマーカーをカスタムできる。
    for i in range(0,len(df)):
        folium.Marker(location=[df["latitude"][i],df["longitude"][i]],
                      icon=folium.Icon(color="orange", icon="info-sign")).add_to(m)
        
    return m

visualize_locations_with_icon(df_prefecture)

マーカーのカスタム例

縮尺によってマーカーをまとめてみる

folium.plugins.MarkerClusterを使うことで縮尺に合わせて点を省略することができます。

import folium
import pandas as pd
from folium.plugins import MarkerCluster

# このCSVには、県庁所在地の緯度・経度がlatitudeカラムとlongitudeカラムに入っている。
df_prefecture = pd.read_csv("../data/prefectural_capital_locations.csv")

def visualize_locations_with_marker_cluster(df,  zoom=4):
    """日本を拡大した地図に、pandasデータフレームのlatitudeおよびlongitudeカラムをプロットする。
    """
        	
    # 図の大きさを指定する。
    f = folium.Figure(width=1000, height=500)

    # 初期表示の中心の座標を指定して地図を作成する。
    center_lat=34.686567
    center_lon=135.52000
    m = folium.Map([center_lat,center_lon], zoom_start=zoom).add_to(f)

    # 縮尺によって、マーカーがまとめられるように設定する。
    marker_cluster = MarkerCluster().add_to(m)
        
    # データフレームの全ての行のマーカーを作成する。
    for i in range(0,len(df)):
        folium.Marker(location=[df["latitude"][i],df["longitude"][i]]).add_to(marker_cluster)
        
    return m
    
visualize_locations_with_marker_cluster(df_prefecture, zoom=3)

マーカーをまとめたときの例

地図の縮尺によって、マーカーがまとまって表示されるようになりました。

デフォルトの設定で地図を表示したときは、縮尺が小さいときに大量のマーカーが表示されていたため少し見づらかったです。マーカーをまとめることにより、すっきりさせることができました。

最後に

Foliumを使い、緯度・経度が含まれるデータをインタラクティブな地図上にプロットすることで、手軽に概観を掴むことができました。FoliumはJupyter notebook上で使うことにより、出力をノートブック上にそのまま出力できるため、重宝します。最近では、Jupyter拡張を使って、Visual Studio Codeでも同様のことができるようになっています。とても便利なので、是非使ってみてください。

参考