東京都の人口統計データをAmazon QuickSightのpoints mapで可視化してみた
こんにちは、CX事業本部 IoT事業部の若槻です。
前回のエントリでは、東京都の人口統計データをAmazon QuickSightで可視化してみたのですが、データソースにQuickSightで利用可能な地理空間情報が含まれていなかったため、垂直棒グラフで可視化するに留めました。
今回はちゃんと地理空間情報を活用した可視化を行おうということで、同じく東京都の人口統計データをQuickSightのpoints mapで可視化してみました。
やってみた
統計データの入手
まず下記から前回使用したものと同じデータをダウンロードします。
下の方にスクロールすると、令和4年度の最新の7月のCSV(315KB)があるのでダウンロード。
ダウンロードしたファイルの内容はこんな感じ。余分なヘッダーが付いていたり、文字エンコーディングがShift-JISだったりしますが、後述のデータソース作成時に修正します。
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)形式となります。
団体コード 団体名 ふりがな小書 新郵便番号 住所 電話番号 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を使用して住所から緯度経度を取得するスクリプトを利用させていただきます。
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
を実行し取得した各市区町村の緯度経度の情報を、人口データと結合するスクリプトです。
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
すると求めていたデータソースを作成することができました。
,地域,緯度,経度,全体の増減 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の方も試してみたいと思います。
参考
- PythonによるWebスクレイピング + Amazon QuickSightで大黒天物産ダッシュボードを作る | DevelopersIO
- pandas.read_csv — pandas 1.4.3 documentation
- pandasでcsv/tsvファイル読み込み(read_csv, read_table) | note.nkmk.me
- DataFrame / Series からリストに変換する【Python】 | BioTech ラボ・ノート
- Convert pandas.DataFrame, Series and list to each other | note.nkmk.me
- Merge, join, concatenate and compare — pandas 1.4.3 documentation
- pandasで特定の列を抽出する - Qiita
- pandas.merge — pandas 1.4.3 documentation
- pandas.DataFrame.to_csv — pandas 1.4.3 documentation
- How do I select a subset of a DataFrame? — pandas 1.4.3 documentation
以上