【Streamlit】st.mapで位置データを手軽に可視化!

Streamlit
この記事は約9分で読めます。

こんにちは、JS2IIUです。

Streamlitは、Pythonでインタラクティブなウェブアプリケーションを簡単に作成できるオープンソースライブラリです。その中でも、st.mapは位置データを地図上に表示するのに便利な関数です。この記事では、st.mapの基本的な使い方と、具体的なサンプルプログラムを通して、その使いどころ、そして注意点をご紹介します。今回もよろしくお願いします。

st.mapの基本

st.mapは、緯度と経度の情報を含むデータフレームを受け取り、地図上にマーカーとしてプロットします。地図はMapboxが使われています。

Python
st.map(data=None, *, latitude=None, longitude=None, color=None, size=None, zoom=None, use_container_width=True, width=None, height=None)

パラメータ:

  • data: プロットするデータ (st.dataframeでサポートされているもの)
  • latitude: データポイントの緯度座標を含む列の名前。Noneの場合、’lat’、’latitude’、’LAT’、’LATITUDE’という名前の列から緯度データを取得します。
  • longitude: データポイントの経度座標を含む列の名前。Noneの場合、’lon’、’longitude’、’LON’、’LONGITUDE’という名前の列から経度データを取得します。
  • color: 各データポイントを表す円のの色。None、16進数文字列、RGBまたはRGBAタプルで指定できます。列名を指定して、列の値に基づいて色を動的に設定することもできます。
  • size: 各ポイントを表す円のサイズ (メートル単位)。None、数値、または列名を指定できます。列名を指定すると、各データポイントのサイズを動的に設定できます。
  • zoom: ズームレベル。
  • use_container_width: マップの幅を親コンテナの幅に合わせるかどうか。
  • width: マップの幅 (ピクセル単位)。
  • height: マップの高さ (ピクセル単位)。

その他:

  • st.mapはst.pydeck_chartのラッパーであり、地図上に散布図チャートを簡単に作成できます。
  • Mapboxのタイルを使用して地図コンテンツをレンダリングします。
  • Mapboxの利用規約が適用されます。
  • StreamlitはMapboxトークンを提供していますが、ユーザーは独自のトークンを作成して使用することを強くお勧めします。

基本的な使い方例:

Python
import streamlit as st
import pandas as pd

df = pd.DataFrame({
    'lat': [35.689487, 35.658581, 35.703717],
    'lon': [139.691706, 139.745433, 139.771357]
})

st.write('st.map exsample')
st.map(df)

これだけで、東京タワー、渋谷スクランブル交差点、新宿駅周辺の地図が表示されます。

サンプルプログラム

1. Uber Ridesharing Data

Uberの乗車データを使って、乗車場所を地図上に可視化してみましょう。

Python
import streamlit as st
import pandas as pd

df = pd.read_csv('uber-raw-data-apr14.csv')
df['Date/Time'] = pd.to_datetime(df['Date/Time'])
df['hour'] = df['Date/Time'].dt.hour

st.title('Uber Ridesharing Data')
st.header('Pickup Locations')
st.map(df)

st.header('Hourly Pickup Counts')
hourly_counts = df.groupby('hour').size()
st.bar_chart(hourly_counts)

このプログラムでは、uber-raw-data-apr14.csvからUberの乗車データを読み込み、st.mapで乗車場所を地図上に表示しています。さらに、乗車時間帯ごとのヒストグラムも表示することで、データの傾向をより深く理解することができます。

生成AIで作った架空のUberデータ(uber-raw-data-apr14.csv)はこちらからコピーして下さい。

Streamlit_sample_data/data/uber-raw-data-apr14.csv at main · JS2IIU-MH/Streamlit_sample_data
Sample data for blog post about Streamlit. Contribute to JS2IIU-MH/Streamlit_sample_data development by creating an account on GitHub.

2. Airbnb Listings

Airbnbのリスティングデータを使って、宿泊施設の場所と価格を地図上に可視化してみましょう。

Python
import streamlit as st
import pandas as pd

df = pd.read_csv('airbnb-listings_20.csv')

st.title('Airbnb Listings')
st.map(df[['latitude', 'longitude']])

このプログラムでは、airbnb-listings.csvからAirbnbのリスティングデータを読み込み、st.mapで宿泊施設の場所を地図上に表示しています。

架空のAirbnbデータ(airbnb-listings_20.csv)はこちらから入手して下さい。

Streamlit_sample_data/data/airbnb-listings_20.csv at main · JS2IIU-MH/Streamlit_sample_data
Sample data for blog post about Streamlit. Contribute to JS2IIU-MH/Streamlit_sample_data development by creating an account on GitHub.

3. 地震発生地点の可視化

Python
import streamlit as st
import pandas as pd

df = pd.read_csv('dataset_2195_quake.csv')

st.title('Earthquake Data')
st.map(df[['latitude', 'longitude']])

このプログラムでは、地震の発生地点を緯度経度情報のサンプルデータからst.mapで地図上に表示しています。

地震データはKaggleのQuakesを利用しています。データの構成は以下のとおりで、4カラムで構成されています。

  • focal_depth: 震源の深さのことです。地震が発生した地下の地点までの距離をキロメートル(km)で表します。地表に近い場所で発生する地震は浅発地震、深い場所で発生する地震は深発地震と呼ばれます。震源の深さは、地震の揺れの強さや範囲に影響を与えます。
  • latitude: 震源の緯度を表します。緯度は、地球上の位置を北緯と南緯で表す角度で、赤道が0度、北極が北緯90度、南極が南緯90度となります。
  • longitude: 震源の経度を表します。経度は、地球上の位置を東経と西経で表す角度で、イギリスのグリニッジ天文台を通る経線が0度となり、東に向かって180度までが東経、西に向かって180度までが西経となります。
  • richter: 地震の規模を表すマグニチュードのことです。マグニチュードは、地震で放出されるエネルギーの大きさを対数で表したもので、一般的にリヒタースケールで表されます。マグニチュードが1大きくなると、地震のエネルギーは約32倍になります。
Checking your browser - reCAPTCHA

マグニチュードのデータを使って、プロットする点の大きさを変えてみます。sizeパラメータを指定します。マグニチュードの大きさを強調するように少し計算を入れています。

Python
import streamlit as st
import pandas as pd

df = pd.read_csv('main3/dataset_2195_quake.csv')
df['richter'] = df['richter'] * df['richter'] * 10000

st.title('Earthquake Data')
st.map(df, latitude='latitude', longitude='longitude', size='richter')

st.mapを使う上での注意点

  • データ量: 大量のデータをst.mapで表示すると、パフォーマンスが低下する可能性があります。大量のデータを扱う場合は、データの集約やフィルタリングを検討してください。
  • Mapboxの利用規約: st.mapはMapboxのタイルを使用して地図コンテンツをレンダリングします。Mapboxの利用規約を遵守する必要があります。
  • Mapboxトークン: StreamlitはMapboxトークンを提供していますが、独自のトークンを作成して使用することを強くお勧めします。

まとめ

st.mapは、Streamlitで位置データをたった数行で、簡単に可視化することができるとても強力なツールです。この記事で紹介したサンプルプログラムを参考に、ぜひご自身のアプリケーションで活用してみてください。

参考になるWEBサイト

Pythonに関する書籍の<PR>です。

24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。

最後まで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました