東京都の人口統計データをAmazon QuickSightのpoints mapで可視化してみた

2022.08.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部 IoT事業部の若槻です。

前回のエントリでは、東京都の人口統計データをAmazon QuickSightで可視化してみたのですが、データソースにQuickSightで利用可能な地理空間情報が含まれていなかったため、垂直棒グラフで可視化するに留めました。

今回はちゃんと地理空間情報を活用した可視化を行おうということで、同じく東京都の人口統計データをQuickSightのpoints mapで可視化してみました。

やってみた

統計データの入手

まず下記から前回使用したものと同じデータをダウンロードします。

下の方にスクロールすると、令和4年度の最新の7月のCSV(315KB)があるのでダウンロード。

ダウンロードしたファイルの内容はこんな感じ。余分なヘッダーが付いていたり、文字エンコーディングがShift-JISだったりしますが、後述のデータソース作成時に修正します。

populations.csv

1,東京都の人口(推計)_令和4年7月,,,,,,,,,,,,,,,
2,,,,,6月中の人口の動き(総数・日本人・外国人),,,,,,,,,,,
3,,,,,注1)総数の数値は、日本人及び外国人の合計である。,,,,,,,,,,,
4,,,,,注2)「その他の増減」は、職権等による記載・消除、帰化・国籍喪失等である。,,,,,,,,,,,
5,,,,,地域階層(0:総数 1:区部・市部・町村部 2:郡部・島部 3:支庁 4:区市町村),,,,,,,,,,,
6,国籍,地域階層,地域コード,地域,全体の増減,他県との移動/増減,他県との移動/転入,他県との移動/転出,都内間移動/増減,都内間移動/転入,都内間移動/転出,自然動態/増減,自然動態/出生,自然動態/死亡,その他の増減,(別掲)日本人全体の増減
7,総数,0,13000,総数,6352,72,29079,29007,-37,37170,37207,-2161,7919,10080,8478,-1208
8,総数,1,13100,区部,5599,-44,22867,22911,-713,28462,29175,-892,5777,6669,7248,-843
9,総数,4,13101,千代田区,9,6,170,164,-130,317,447,19,49,30,114,-52
10,総数,4,13102,中央区,198,8,463,455,-43,771,814,69,165,96,164,25
...

次に、地方公共団体情報システム機構のサイトから、東京都の各市区町村の住所情報を入手します。

ブラウザ上で開いたページ上で、[東京都内市町村]のテーブルを選択してコピーします。

それを新規ファイルにペーストして、addresses.tsvという名前で保存します。

<table>要素からコピーしたのでTSV(tab separated value)形式となります。

addresses.tsv

団体コード	団体名	ふりがな小書	新郵便番号	住所	電話番号
131016	千代田区	ちよだく	102-8688	千代田区九段南1-2-1	03-3264-2111
131024	中央区	ちゅうおうく	104-8404	中央区築地1-1-1	03-3543-0211
131032	港区	みなとく	105-8511	港区芝公園1-5-25	03-3578-2111
131041	新宿区	しんじゅくく	160-8484	新宿区歌舞伎町1-4-1	03-3209-1111
...

データソースを作成する

住所データ(addresses.tsv)から緯度経度情報を取得して、人口データ(populations.csv)と結合することによりQuickSightのpoints mapで可視化できるデータソースをPythonを利用して作成します。

まず必要なモジュールをインストール。

pip3 install bs4 tqdm requests pandas

住所から緯度経度を取得するpythonスニペット - Qiitaで紹介されている、geocoding.jpを使用して住所から緯度経度を取得するスクリプトを利用させていただきます。

geocoding.py

import requests
from bs4 import BeautifulSoup
import time
from tqdm import tqdm


URL = 'http://www.geocoding.jp/api/'


def coordinate(address):
    """
    addressに住所を指定すると緯度経度を返す。

    >>> coordinate('東京都文京区本郷7-3-1')
    ['35.712056', '139.762775']
    """
    payload = {'q': address}
    html = requests.get(URL, params=payload)
    soup = BeautifulSoup(html.content, "html.parser")
    if soup.find('error'):
        raise ValueError(f"Invalid address submitted. {address}")
    latitude = soup.find('lat').string
    longitude = soup.find('lng').string
    return [latitude, longitude]


def coordinates(addresses, interval=10, progress=True):
    """
    addressesに住所リストを指定すると、緯度経度リストを返す。

    >>> coordinates(['東京都文京区本郷7-3-1', '東京都文京区湯島3丁目30−1'], progress=False)
    [['35.712056', '139.762775'], ['35.707771', '139.768205']]
    """
    coordinates = []
    for address in progress and tqdm(addresses) or addresses:
        coordinates.append(coordinate(address))
        time.sleep(interval)
    return coordinates

住所データを入力としてgeocoding.pyを実行し取得した各市区町村の緯度経度の情報を、人口データと結合するスクリプトです。

get_populations_with_coordinates_csv.py

import pandas
from geocoding import coordinates

ADDRESSES_FILE_NAME = "addresses.tsv"
POPULATIONS_FILE_NAME = "js227v0000_3.csv"

# 住所一覧を読み込む
addresses_df = pandas.read_csv(ADDRESSES_FILE_NAME, sep="\t")[
    ["団体名", "住所"]]

# 住所一覧を緯度経度に変換する
coordinates = coordinates(addresses_df["住所"].tolist())

# 住所および緯度経度一覧を作る
coordinates_df = pandas.DataFrame(coordinates, columns=["緯度", "経度"])
addresses_with_coordinates_df = pandas.concat(
    [addresses_df, coordinates_df], axis=1)

# 人口一覧を読み込む
populations_df = pandas.read_csv(
    POPULATIONS_FILE_NAME, header=5, encoding='shift_jis', usecols=["国籍", "地域", "全体の増減"])

# 住所および緯度経度一覧と人口一覧を結合する
populations_with_coordinates_df = addresses_with_coordinates_df.merge(
    populations_df[populations_df["国籍"] == "総数"], left_on="団体名", right_on="地域")[["地域", "緯度", "経度", "全体の増減"]]

# 人口および緯度経度一覧をCSVに書き込む
populations_with_coordinates_df.to_csv("populations_with_coordinates.csv")

スクリプトを実行します。

python3 get_populations_with_coordinates_csv.py

すると求めていたデータソースを作成することができました。

populations_with_coordinates.csv

,地域,緯度,経度,全体の増減
0,千代田区,35.694012,139.753618,9
1,中央区,35.671245,139.772661,198
2,港区,35.658044,139.751535,353
3,新宿区,35.693893,139.703426,434
4,文京区,35.707975,139.752791,325
...

QuickSightで可視化する

QuickSightでDatasetにpopulations_with_coordinates.csvファイルを読み込ませました。

ここで緯度および経度カラムをLatitudeおよびLongitudeタイプに変更します。

変更できました。

そしてAnalysisのpoints mapでGeospatial緯度および経度Size全体の増減を指定すると可視化することができました!

少し縮小した様子。島しょ部含めてデータが地図上にマッピングされていますね。

区部および多摩地域にフォーカスした様子。塗りつぶし有りの円が増加、塗りつぶし無しの円が減少です。都心部および副都心部を中心に大きな増加が見らるのがひと目で分かりますね。

Color地域カラムを設定すると、マップの右に色と地域の対応が表示され、マッピングにも反映されました。これは分かりやすい。

おわりに

東京都の人口統計データをAmazon QuickSightのpoints mapで可視化してみました。思ったよりもいい感じに可視化ができたと思います。

Pythonのスクリプトではデータのパースや加工にPandasを活用しましたが、Pandasを使うのは久し振りだったので仕様を確認するのになかなか手間取りました。しかしDataFrameを扱うのはやっぱり楽しいです。

次回はQuiskcightのもう一つの地理情報グラフであるfilled mapの方も試してみたいと思います。

参考

以上