【Python】scikit-mobilityで人流データを可視化する

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

移動履歴データや、移動流量データなど人流データをマップ上に可視化するプラグイン、scikit-mobilityの紹介です。

scikit-mobility/scikit-mobility
scikit-mobility: mobility analysis in Python. Contribute to scikit-mobility/scikit-mobility development by creating an account on GitHub.

このライブラリでできること

  • データの前処理 (preprocessing)
  • 行動分析 (measuring)
  • データの生成 (synthesis)
  • 流量の予測 (predicting)
  • プライバシーリスク評価 (Assessing)

人流データとは

移動履歴データ

イメージしやすいデータとしてはGoogleマップなどの地図アプリやSNSで利用する位置情報や、人の動きの研究を目的として蓄積されたGPS情報を収集したデータのことです。

移動流量データ

場所と場所の間での人の移動流量のデータです。
特定の起点から終点まで移動した人がどれくらいいるかを集めたデータのことです。

ライブラリの環境構築

前提条件

Mac
Anaconda
Jupyter notebook
Python 3.7

ライブラリのインストール

ライブラリを事前にインストールしておきます。

#フォルダの作成
mkdir scikit_mobility

#gitリポジトリからクローンする
git clone https://github.com/scikit-mobility/scikit-mobility scikit_mobility

#condaでPython3.7のscikit-mobility実行環境を作成する
conda create -n skmob pip python=3.7

#skmobを有効化する
source activate skmob

#skmobをインストール
cd scikit_mobility
python setup.py install

#ライブラリのインストールに失敗した場合、Anacondaの再インストールをおこなってください。

環境構築に成功すると、skmobの実行環境が作成されるのでskmobのjupyter notebook
を有効化し、起動する。

人流データを可視化する

scikit-mobility/tutorials
Repo for the material used during conference tutorial and talks - scikit-mobility/tutorials

チュートリアルのコードを実行しながら学習します。

TrajDataFrame

TrajDataFrameというDataFrameを拡張したデータ構造を利用します。
次の3つのデータが必須となります

  • latitude (type: float);
  • longitude (type: float);
  • datetime (type: date-time).

テストコード

import skmob
# リストからTrajDataFrameを作成します。
data_list = [[1, 39.984094, 116.319236, '2008-10-23 13:53:05'], [1, 39.984198, 116.319322, '2008-10-23 13:53:06'], [1, 39.984224, 116.319402, '2008-10-23 13:53:11'], [1, 39.984211, 116.319389, '2008-10-23 13:53:16']]
tdf = skmob.TrajDataFrame(data_list, latitude=1, longitude=2, datetime=3)

# TrajDataFrameを表示します
print(tdf.head())

import pandas as pd
# 前のリストからDataFrameを作成します
data_df = pd.DataFrame(data_list, columns=['user', 'latitude', 'lng', 'hour'])
# タイプを表示します
print(type(data_df))

# pandas DataFrameからTrajDataFrameを作成します
tdf = skmob.TrajDataFrame(data_df, latitude='latitude', datetime='hour', user_id='user')
# print the type of the object
print(type(tdf))

# サンプルデータをこちらからダウンロードします。解凍してください https://raw.githubusercontent.com/scikit-mobility/scikit-mobility/master/tutorial/data/geolife_sample.txt.gz

# read the trajectory data (GeoLife, Beijing, China)
tdf = skmob.TrajDataFrame.from_file('geolife_sample.txt', latitude='lat', longitude='lon', user_id='user', datetime='datetime')

# print a portion of the TrajDataFrame
print(tdf.head())

tdf.plot_trajectory(zoom=12, weight=3, opacity=0.9, tiles='Stamen Toner')

FlowDataFrame

FlowDataFrameはPandas DataFrameを拡張したもので起点、終点マトリックスデータを取り扱うことができます。

必須のカラムデータは3つあります。

  • origin (type: string);
  • destination (type: string);
  • flow (type: integer).

  • tile_ID (type:Integer)ロケーションの識別子を示します。
  • geometry 領域上の位置にマーカーを表示します。(たとえば、正方形、ボロノイ形状、近傍の形状)を表示します。

テストコード

import skmob
import geopandas as gpd

# 道路の渋滞状況のテッセレーションを読み込む
url_tess = 'https://raw.githubusercontent.com/scikit-mobility/scikit-mobility/master/tutorial/data/NY_counties_2011.geojson'
tessellation = gpd.read_file(url_tess).rename(columns={'tile_id': 'tile_ID'})

# 読み込んだデータを表示する
print(tessellation.head())

# FlowDataFrameとして読み込む
# データはこちらからダウンロードする: https://raw.githubusercontent.com/scikit-mobility/scikit-mobility/master/tutorial/data/NY_commuting_flows_2011.csv
fdf = skmob.FlowDataFrame.from_file("NY_commuting_flows_2011.csv",tessellation=tessellation,tile_id='tile_ID',sep=",")

# フローデータを一部表示する
print(fdf.head())

# 読み込んだデータを空間テッセレーションでタイルの重心間の線として地理マップ上に視覚化します。
fdf.plot_flows(flow_color='red')

# plot_tessellation関数でマップ上に視覚化します。popup_featuresを指定することでクリックした時のポップアップ情報を表示できます。
fdf.plot_tessellation(popup_features=['tile_ID', 'population'])

# 二種類の表示方法を一緒に表示することができます。
m = fdf.plot_tessellation() # plot the tessellation
fdf.plot_flows(flow_color='red', map_f=m) # plot the flows

ヒートマップ表示

人々の移動情報を個人、集団の両方で把握するための関数が用意されています。
個々の測定値は単一の移動オブジェクトの移動パターンを要約し、集合測定値は集団全体の移動パターンを要約します

from skmob.measures.individual import jump_lengths, radius_of_gyration, home_location
# load a TrajDataFrame from an URL
#url = "https://snap.stanford.edu/data/loc-brightkite_totalCheckins.txt.gz"
#df = pd.read_csv(url, sep='\t', header=0, nrows=100000, names=['user', 'check-in_time', 'latitude', 'longitude', 'location id'])
#tdf = skmob.TrajDataFrame(df, latitude='latitude', longitude='longitude', datetime='check-in_time', user_id='user')
# compute the radius of gyration for each individual
rg_df = radius_of_gyration(tdf)
print(rg_df)

# compute the jump lengths for each individual
jl_df = jump_lengths(tdf.sort_values(by='datetime'))
print(jl_df.head())

# compute the home location for each individual
hl_df = home_location(tdf)
print(hl_df.head())

# now let's visualize a cloropleth map of the home locations 
import folium
from folium.plugins import HeatMap
m = folium.Map(tiles = 'openstreetmap', zoom_start=12, control_scale=True)
HeatMap(hl_df[['lat', 'lng']].values).add_to(m)
https://github.com/scikit-mobility/scikit-mobility

まとめ

移動データを利用することで、行動の分析や、プライバシーリスクのスコアリング
流動のシミュレーションが行えます。
オープンデータなどを利用して実際にやってみてはいかがでしょうか。

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