Pythonで手軽に人流データ分析ができるライブラリ「scikit-mobility」の紹介（その１）

# この記事の内容
Pythonで人流データを扱うためのライブラリ「**Scikit-mobility**」をご紹介します。
今回は、「そもそも人流データって何？」という方にも興味を持ってもらえるように導入的な内容となります。

1. はじめに
2. 人流データって何？
3. Scikit-mobilityで何ができるの？
4. 前提
    5. ライブラリのインストール
5. 移動履歴データを見てみよう
    6. 今回使うデータセット
    7. データの読み込み
    8. 移動履歴を地図上で可視化してみる
6. まとめ

![logo_skmob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576519/4ae77df1-868f-9973-8752-00d485fe0b48.png)

github[https://github.com/scikit-mobility/scikit-mobility]

# 1. はじめに
「**Scikit-mobility**」というPythonライブラリ、ご存知でしょうか？
[昨年作られたばかり](https://arxiv.org/abs/1907.07062)で、まだご存知の方は少ないかもしれませんが、**人の移動データ（以下、人流データ）の分析のための機能を備えたライブラリ**です。
昨今、地図アプリやSNSなどで位置情報が大量に蓄積されている背景もあり、プライバシーリスクの評価を含め、人流データを処理・分析するためのアルゴリズムが整備されています。

まずは、「**人流データって何？**」「**scikit-mobilityって何ができるの？**」ということについて簡単にご紹介したいと思います。

# 2. 人流データって何？
Scikit-mobilityでは主に**２種類**のデータを取り扱います。

1. **移動履歴データ(trajectories)**
   移動の軌跡を示す緯度経度のデータです。身近なものでは地図アプリやSNSなどで利用する現在地情報や、研究調査などで長期間の行動を収集・分析する際にGPSなどを利用して取得します。
<img width="977" alt="map_0_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576519/dd9ad766-193a-b4eb-2401-b8701adb3535.png">

2. **移動流量データ(fluxes)**
場所間での人の移動流量のデータです。
OD調査のように、特定の場所（起点 / orient）から特定の場所（終点 / destination）へ行った人が何人いるかを表すデータです。

<img width="977" alt="map_0_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576519/ea564196-06ba-c5c4-4f90-10063a88eef5.png">


# 3. Scikit-mobilityで何ができるの？
scikit-mobilityを使うと、人流データに対して以下のような分析が手軽に行えます。

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

それぞれの内容について、今後掘り下げてまとめていきたいと思います。
が、今回はその一歩手前、「**そもそも人流データってどんなものなの？**」というところをもう少しご紹介します。

# 4. 前提

### 実行環境
- MacOS
- Python3 (Anaconda)
- Jupyter Notebook


### インストール
まずはライブラリをインストールしましょう。

```
$ pip install scikit-mobility
```

# 5. 移動履歴データの取り扱い

※ 基本的に[開発者が用意しているチュートリアル](https://github.com/scikit-mobility/scikit-mobility)の内容に従っています。
※ さらに詳しい内容は英語になりますが[こちら](https://github.com/scikit-mobility/scikit-mobility/tree/master/tutorial)に用意されています。もっと詳しく知りたい！という方はぜひこちらもご覧ください。

## 今回使うデータセット
githubに用意されている[サンプルデータ](https://raw.githubusercontent.com/scikit-mobility/scikit-mobility/master/tutorial/data/geolife_sample.txt.gz)を利用します。
（※自動的にダウンロードされるので注意。2MB程度のテキストファイルです）

これは、Microsoftが公開している[GeoLife GPS Trajectories](https://www.microsoft.com/en-us/download/details.aspx?id=52367&from=https%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fdownloads%2Fb16d359d-d164-469e-9fd4-daa38f2b2e13%2F)です。
Microsoft Research Asia Geolife projectによって、北京の182名のユーザーの2007年から2012年に渡るGPSログのデータが収集されています。

サンプルデータにはこの内の２名分のデータが入っています。

## データの読み込み
ダウンロードしたデータを読み込んでいきましょう。
### TrajDataFrameの作成
移動履歴データは`TrjDataFrame`というデータ型で読み込みます。
これはpandasのDataFrameを拡張したものです。

```python
# データの読み込み
tdf = skmob.TrajDataFrame.from_file('geolife_sample.txt.gz'
                                    ,latitude='lat'
                                    ,longitude='lon'
                                    ,user_id='user'
                                    ,datetime='datetime'
                                    )
# 中身を確認する
print(tdf.head())
```

中身はこのようになっています。

```

   uid        lat         lng            datetime
0    1  39.984094  116.319236 2008-10-23 13:53:05
1    1  39.984198  116.319322 2008-10-23 13:53:06
2    1  39.984224  116.319402 2008-10-23 13:53:11
3    1  39.984211  116.319389 2008-10-23 13:53:16
```

#### 必須の引数
`TrajDataFrame`を作成するためには、３つの引数に対応する列名を指定する必要があります。

- *latitude*: 緯度
- *longitude*: 経度
- *datetime*: 日付

これらは、「いつ・どこにいたか」という移動履歴の基本となる情報ですね。

#### オプション
また、オプションで以下の引数も指定することができます

- *user_id*: ユーザーID
「誰の」移動履歴データかを示すものです。一人分のデータであればなくても良いですが、複数人のデータが混ざったものであれば必要になります。

- *tid*: 移動ID (trajectory id)
一連の移動に対してIDを付けたものです。例えば、「徒歩→バス→電車」のように移動手段が切り替わる時、それぞれの移動を区別したい場合などに付与します。

もちろん、これ以外に任意の列があっても問題なく読み込めます。


#### データフレームから作成
データフレームから`TrajDataFrame`に変換することも可能です。

```python
import pandas as pd
import skmob
# サンプルデータの用意
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']]
# データフレームを作成
data_df= pd.DataFrame(data_list, columns=['user', 'lat', 'lon', 'datetime'])
print('変換前: ', type(data_df)) 
# TrjDataFrame に変換する
tdf = skmob.TrajDataFrame(data_df, latitude='lat', longitude='lon', datetime='datetime', user_id='user')
print('変換後: ', type(tdf))
print(tdf.head())
```

```
変換前:  <class 'pandas.core.frame.DataFrame'>
変換後:  <class 'skmob.core.trajectorydataframe.TrajDataFrame'>

   uid        lat         lng            datetime
0    1  39.984094  116.319236 2008-10-23 13:53:05
1    1  39.984198  116.319322 2008-10-23 13:53:06
2    1  39.984224  116.319402 2008-10-23 13:53:11
3    1  39.984211  116.319389 2008-10-23 13:53:16
```

## 移動履歴を地図上で可視化してみる
緯度経度のデータは、数字だけを見てもどこなのかがわかりません。地図上で確認することが大切です。
TrajDataFrameは以下のように簡単に可視化することができます。

#### 移動履歴を地図上にプロット

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

- *zoom*: 地図をどれくらいズーム表示するかを指定できます
- *weight*: 描画する線の太さを指定できます
- *opacity*: 描画する線の透過度を指定できます
- *tiles*: バックグラウンドの地図の種類を選択できます

uidごとに自動的に色分けして表示してくれます。
地図上でみると、どこを移動したのか、どのくらいの行動範囲か、どこの街に行っているかが分かりますね。
<img width="979" alt="map_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576519/cf9a8081-9c53-6b03-c8a5-f8317db6ff64.png">


#### 地図をズームアウト
行動範囲全体が見えるまでズームアウトしてみると、ユーザーがどこまで移動しているかがわかります。片方のユーザーはかなり遠くまで行っています。
<img width="972" alt="map_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576519/f5377910-3e98-69f2-17b6-cdb4c4d4f654.png">

#### 開始点と終了点のポップアップ表示
また、それぞれのユーザーの最初のログ(緑)と最後のログ(赤)はマーカーが表示されており、
クリックすると時間と緯度経度がポップアップ表示されます
<img width="404" alt="map_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576519/8d9f75db-f7d0-546d-abfb-66edb5bf3bfd.png">

こうして地図上に可視化して見ることでユーザーの動きについてより理解しやすくなります。

# 6. まとめ
いかがでしたでしょうか。今回はScikit-mobilityのご紹介と、そこで扱うデータがどのようなものかを簡単に見てみました。
移動履歴のデータは普段なかなか目にすることはないので、初めて見た方もいらっしゃるかもしれません。これを機に人流データ分析に興味を持っていただけたら嬉しいです。
google mapを使っている方は、自分の位置情報をダウンロードして分析してみるのも面白いかもしれません。
（[グーグルマップの履歴(timeline)をダウンロード](https://qiita.com/maatumoDev/items/b2a97006bb382c3ed649)）
次回以降の記事では、流量データのご紹介、具体的な機能やアルゴリズムを紹介していきたいと思います。
今回はここまでです！読んでいただきありがとうございました！