宙畑 Sorabatake

Tellus

【ゼロからのTellusの使い方】モバイル空間統計データで渋谷と巣鴨を比較してみた

Tellusで触れるAPIにモバイル空間統計のデータが加わりました。本記事では簡単な利用事例をご紹介します。

2020年5月7日より、Tellusの開発環境で使用できるデータにモバイル空間統計が加わりました。本記事では、モバイル空間統計APIを利用するサンプルコードと、取得したデータをグラフ化する方法を紹介します。

モバイル空間統計は、ドコモ契約の携帯電話がアクセスしている基地局エリア情報を基に、時間帯別・エリア別に推計した人口統計情報です。

現在は、以下のデータをTellusの開発環境で確認することができます。

===
■2016/7/1~2017/9/30(東京23区、横浜市18区、大阪市24区、名古屋市16区、福岡市7区)
■2016/4/1~2016/7/31(熊本県内全域)
■2018/6/28~2018/7/8+前後1週間(岐阜県、京都府、兵庫県、岡山県、鳥取県、広島県、愛媛県、高知県、福岡県、佐賀県、長崎県)
===

ぜひ興味を持った方は、興味のある地域の分析をしてみてください。また、衛星データと合わせての分析も今後宙畑でご紹介していきたいと思います。

※Tellusで開発環境(Jupyter Lab)を使う方法は、「Tellusの開発環境でAPI引っ張ってみた」をご覧ください。

「Tellus」で様々な地理空間データを触ってみよう!

日本発のオープン&フリーなデータプラットフォーム「Tellus」で、まずは衛星データを見て、触ってみませんか?

★Tellusの利用登録はこちらから

(1)モバイル空間統計APIを実行してみよう

まずはモバイル空間統計APIのデータを確認する以下のコードを実行してみましょう。

import os, requests
TOKEN = "自分のトークン情報を記載してください"

def mobaku(params={}, next_url=''):
    if len(next_url) > 0:
        url = next_url
    else:
        url = 'https://pflow.tellusxdp.com/api/v1/mobaku'
    

    headers = {
        'Authorization': 'Bearer {}'.format(TOKEN)
    }

    r = requests.get(url, params=params, headers=headers)

    if not r.status_code == requests.codes.ok:

        r.raise_for_status()
    return r.json()

data = mobaku({})
print(data['count'])
print(data['next'])
print(data['items'][0:4])

実行すると、以下のようなレスポンスがあります。

100
https://pflow.tellusxdp.com/api/v1/mobaku?cursor=eyJsYXN0X2l0ZW0iOnsiaWQiOjEwMCwiZGF0ZXRpbWUiOiIyMDE2LTAzLTMxVDE1OjAwOjAwWiIsIm1lc2giOiI0ODMwMjM2NDIifSwicXVlcnkiOnsibWVzaCI6IiIsImFmdGVyIjoiIiwiYmVmb3JlIjoiIiwibWluX2xhdCI6IiIsIm1heF9sYXQiOiIiLCJtaW5fbG9uIjoiIiwibWF4X2xvbiI6IiJ9fQ%3D%3D
[{'datetime': '2016-03-31T15:00:00+00:00', 'mesh': '482947592', 'lon': 129.99375, 'lat': 32.375, 'total': 180, 'male_15': 0, 'male_20': 0, 'male_30': 0, 'male_40': 16, 'male_50': 12, 'male_60': 32, 'male_70': 19, 'female_15': 0, 'female_20': 10, 'female_30': 10, 'female_40': 16, 'female_50': 14, 'female_60': 38, 'female_70': 13}, {'datetime': '2016-03-31T15:00:00+00:00', 'mesh': '482947594', 'lon': 129.99375, 'lat': 32.3791667, 'total': 29, 'male_15': 0, 'male_20': 0, 'male_30': 0, 'male_40': 0, 'male_50': 0, 'male_60': 14, 'male_70': 0, 'female_15': 0, 'female_20': 0, 'female_30': 0, 'female_40': 0, 'female_50': 0, 'female_60': 15, 'female_70': 0}, {'datetime': '2016-03-31T15:00:00+00:00', 'mesh': '483012984', 'lon': 130.35625, 'lat': 32.1625, 'total': 85, 'male_15': 0, 'male_20': 0, 'male_30': 0, 'male_40': 0, 'male_50': 17, 'male_60': 14, 'male_70': 10, 'female_15': 0, 'female_20': 0, 'female_30': 0, 'female_40': 10, 'female_50': 0, 'female_60': 22, 'female_70': 12}, {'datetime': '2016-03-31T15:00:00+00:00', 'mesh': '483015644', 'lon': 130.68125, 'lat': 32.1375, 'total': 10, 'male_15': 0, 'male_20': 0, 'male_30': 0, 'male_40': 0, 'male_50': 10, 'male_60': 0, 'male_70': 0, 'female_15': 0, 'female_20': 0, 'female_30': 0, 'female_40': 0, 'female_50': 0, 'female_60': 0, 'female_70': 0}]

レスポンスを見ると、返却されたデータを100件(APIのデフォルトの取得最大件数)取得し、そのうち最初の4件の詳細な内容を表示しています。

レスポンスの”mesh”は地域メッシュコードを表しており、地域メッシュコードとは、日本工業規格で定められた区域を識別するコードです。
参考:統計局ホームページ/地域メッシュ統計について

また、male_15、female_20などのレスポンスからも想像できるように、人口統計情報は、性別と年代ごとに分かれており、“male_15”は15歳から19歳の男性の人数、”female_20”は20歳から29歳の女性の人数を知ることができます。

(2)取得したデータを分析し、地域差を調べよう

では、実際にモバイル空間統計APIを利用して地域別のデモグラを確認してみたいと思います。今回は、渋谷と巣鴨のデータを取得し、年代を比較してみました。なんとなく渋谷に若者が多く、巣鴨には高齢の方が多いという印象がありますが、実際のデータをもって確認したいと思います。

まずは渋谷駅周辺のデータを取得します。

渋谷駅付近の座標を指定して、APIを実行します。最大取得件数(page_size)はデフォルトでは100件ですが、設定可能な最大値である1000件にしています。

# 渋谷駅付近(座標指定) 2017/5/1 12時から18時のデータを取得し、最初の1件を表示する
params = {
    'after' : '2017-05-01T12:00:00+00:00',
    'before' : '2017-05-01T18:00:00+00:00',
    'min_lon': 139.701355,
    'max_lon':  139.751355,
    'min_lat': 35.658220,
    'max_lat':  35.708220,
    'page_size': 1000
}
data = mobaku(params)
print(data['count'])
print(data['items'][0:1])

実行すると、以下のようなレスポンスがあります。

672
[{'datetime': '2017-05-01T12:00:00+00:00', 'mesh': '533935962', 'lon': 139.70625, 'lat': 35.6583333, 'total': 5659, 'male_15': 106, 'male_20': 709, 'male_30': 998, 'male_40': 691, 'male_50': 387, 'male_60': 204, 'male_70': 104, 'female_15': 116, 'female_20': 648, 'female_30': 641, 'female_40': 454, 'female_50': 271, 'female_60': 189, 'female_70': 141}]

座標を指定して実行しましたが、このAPIは地域メッシュコード(mesh)を指定して実行することも可能です。

先程のAPIのレスポンスに含まれるmeshの値をAPIのリクエストパラメータに指定して実行してみます。

# 渋谷駅付近(地域メッシュコード指定) 2017/5/1 12時から18時のデータを取得し、最初の1件を表示する
data = mobaku({
    'after' : '2017-05-01T12:00:00+00:00',
    'before' : '2017-05-01T18:00:00+00:00',
    'mesh':533935962, 
    'page_size': 1000
})
print(data['count'])
print(data['items'][0:1])

実行すると、以下のようなレスポンスがあります。

7
[{'datetime': '2017-05-01T12:00:00+00:00', 'mesh': '533935962', 'lon': 139.70625, 'lat': 35.6583333, 'total': 5659, 'male_15': 106, 'male_20': 709, 'male_30': 998, 'male_40': 691, 'male_50': 387, 'male_60': 204, 'male_70': 104, 'female_15': 116, 'female_20': 648, 'female_30': 641, 'female_40': 454, 'female_50': 271, 'female_60': 189, 'female_70': 141}]

同様の条件で、巣鴨のデータを取得してみましょう。

# 巣鴨駅付近(座標指定) 2017/5/1 12時から18時のデータを取得し、最初の1件を表示する
params = {
    'after' : '2017-05-01T12:00:00+00:00',
    'before' : '2017-05-01T18:00:00+00:00',
    'min_lon': 139.739506,
    'max_lon':  139.789506,
    'min_lat': 35.733101,
    'max_lat':  35.783101,
    'page_size': 1000
}
data = mobaku(params)
print(data['count'])
print(data['items'][0:1])

実行すると以下のようなレスポンスがあります。

672
[{'datetime': '2017-05-01T12:00:00+00:00', 'mesh': '533945892', 'lon': 139.74375, 'lat': 35.7333333, 'total': 5110, 'male_15': 71, 'male_20': 346, 'male_30': 532, 'male_40': 501, 'male_50': 381, 'male_60': 441, 'male_70': 248, 'female_15': 72, 'female_20': 361, 'female_30': 502, 'female_40': 513, 'female_50': 372, 'female_60': 381, 'female_70': 389}]

渋谷と同様に、地域メッシュコード(mesh)を指定しての実行も行います。

# 巣鴨駅付近(地域メッシュコード指定) 2017/5/1 12時から18時のデータを取得し、最初の1件を表示する
data = mobaku({
    'after' : '2017-05-01T12:00:00+00:00',
    'before' : '2017-05-01T18:00:00+00:00',
    'mesh':533945892, 
    'page_size': 1000
})
print(data['count'])
print(data['items'][0:1])

実行すると以下のようなレスポンスがあります。

7
[{'datetime': '2017-05-01T12:00:00+00:00', 'mesh': '533945892', 'lon': 139.74375, 'lat': 35.7333333, 'total': 5110, 'male_15': 71, 'male_20': 346, 'male_30': 532, 'male_40': 501, 'male_50': 381, 'male_60': 441, 'male_70': 248, 'female_15': 72, 'female_20': 361, 'female_30': 502, 'female_40': 513, 'female_50': 372, 'female_60': 381, 'female_70': 389}]

このように、APIを利用することで、ふたつの地点のデータを取得することができました。
次に、取得したデータをグラフに出力して比較してみましょう。

(3)モバイル空間統計APIで取得した結果をグラフ化してみよう

上述の通り、モバイル空間統計APIで性別と年代ごとにデータを取得することができました。

より分かりやすくデータを確認するために、渋谷、巣鴨の各地点のデータを対象に、年代を比較するグラフを作成してみましょう。

取得したデータのグラフ化には、pandasを利用します。

import pandas as pd

渋谷、巣鴨それぞれの12時時点のデータを取得し、男女別のグラフを作成します。

“mesh”の値は、最初に座標指定でAPIを実行して取得した各駅付近の地域メッシュコードを利用しています。

# 渋谷 2017/5/1 12:00
data = mobaku({
    'after' : '2017-05-01T12:00:00+00:00',
    'before' : '2017-05-01T12:00:00+00:00',
    'mesh':533935962, 
    'page_size': 1000
})

df = pd.DataFrame(data['items'])

df_male = df.loc[:, df.columns.str.startswith('male')]
df_female = df.loc[:, df.columns.str.startswith('female')]

df_male.plot.bar()
df_female.plot.bar()
渋谷のデモグラ(男性)
渋谷のデモグラ(女性)

渋谷は、データを取得した日時において、男性は30代が最も多く、女性は20代が最も多いという結果になりました。

次に、巣鴨を確認します。

# 巣鴨
data = mobaku({
    'after' : '2017-05-01T12:00:00+00:00',
    'before' : '2017-05-01T12:00:00+00:00',
    'mesh':533945892, 
    'page_size': 1000
})

df = pd.DataFrame(data['items'])

df_male = df.loc[:, df.columns.str.startswith('male')]
df_female = df.loc[:, df.columns.str.startswith('female')]

df_male.plot.bar()
df_female.plot.bar()
巣鴨のデモグラ(男性)
巣鴨のデモグラ(女性)

渋谷では20代~40代が多く50代以上は少ないですが、巣鴨では50代から70代が多い結果となりました。

また、巣鴨では、70代になると女性の数が多くなっている特徴も見受けられます。

(4)まとめ

今回は、モバイル空間統計APIを利用するサンプルコードと、取得したデータをグラフ化する方法を紹介しました。

性別や年代別、地域、時間という観点で人口統計情報を取り扱う際には、このモバイル空間統計APIが便利です。

利用できるデータの期間が絞られているので、時系列の比較はまだ難しいかもしえませんが、過疎地域・過密地域のデモグラ比較や、衛星データとのなんらかの相関を調査してみるのも面白いと思います。ぜひ利用してみてください。

「Tellus」でモバイル空間統計データを触ってみよう!

日本発のオープン&フリーなデータプラットフォーム「Tellus」で、モバイル空間統計データを触ってみませんか? 衛星データと組み合わせての分析もおすすめです。

★Tellusの利用登録はこちらから