はじめに
本記事ではコロナ前後での東京23区の人口の推移を可視化してみます。
筆者が東京都民のため対象を東京都としていますが、コードの一部を変えるだけであらゆる地域の人口推移を可視化することができます。
こちらの記事は以前書いた記事の派生になります。こちらの記事もぜひご覧ください。
今回のコードはヘルシンキ大学が公開しているGISに関する教材を元にしています。
筆者はそちらの教材を勉強した後のアウトプットでこの記事を書いています。
GISについて勉強してみたい方はぜひそちらを使ってみてください。そちらの教材についての質問があればQiitaのコメントで議論させていただけると、筆者も勉強になり大変嬉しいです。
※本記事はGoogle Colab上で使用することを想定しています。ローカル環境でのコード実行時には事前に必要なライブラリのインストールが必要になります。
扱うデータについて
本記事では東京都の人口データと市区町村ごとのポリゴンデータを扱います。
東京都の人口データは、東京都の統計から取得します。2015年から2022年までの11月のデータをダウンロードし、ローカルで下図のような表を作成しCSVとして保存します。
※11月のデータを使用するのは執筆時(2022/12/20)のデータ公開状況のためです。
次に東京都の市区町村ごとのポリゴンデータを取得します。
ポリゴンデータとは、簡単に言えば緯度経度を持った形状のデータのことで、日本の市区町村ごとのポリゴンデータは国土交通省のサイトからダウンロードすることができます。令和4年の東京都のファイルをダウンロードし、zipを解凍すると下の画像のファイルが入っています。今回使うのはこの中でも拡張子が”.geojson”のもののため、このファイルをGoogle Driveにアップロードしてください。
東京23区の人口推移のグラフを作成する
必要なライブラリをインポートします。
!pip install geopandas
!pip install japanize_matplotlib
!pip install download
!pip install mapclassify
import mapclassify
import download
import japanize_matplotlib
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import folium
import os
上で作成したCSVをpandasで読み込みます。
fp = '作成した人口のCSVのファイルパスを貼り付けてください'
data = pd.read_csv(fp, encoding="utf-8")
data.head()
人口データの”,”(カンマ)の除去をして、int型に変更します。
data = data.replace(',', '', regex=True)
data[data.columns[1:]] = data[data.columns[1:]].astype(int)
data.head()
各区ごとの人口推移を折れ線グラフで表示します。
fig, ax = plt.subplots(figsize=(12, 8))
data.set_index('Area').transpose().plot(ax=ax)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=10)
折れ線グラフを表示することができました。
全体の傾向として、2020年から推移が横ばいもしくは減少している地域が多いことがみて取れます。
上のグラフではグラフの縦軸のスケールが大きいため、増減を読み取るのが少し困難でした。そこで各年の増減率を計算し、表示してみます。
df_trans = pd.DataFrame(columns=['2015-2016[%]', '2016-2017[%]', '2017-2018[%]', '2018-2019[%]', '2019-2020[%]', '2020-2021[%]', '2021-2022[%]'], index=data["Area"])
for i in range(len(df_trans)):
df_trans.iloc[i]["2015-2016[%]"] = (data.iloc[i]['2016'] - data.iloc[i]['2015']) / data.iloc[i]['2015'] * 100
df_trans.iloc[i]["2016-2017[%]"] = (data.iloc[i]['2017'] - data.iloc[i]['2016']) / data.iloc[i]['2016'] * 100
df_trans.iloc[i]["2017-2018[%]"] = (data.iloc[i]['2018'] - data.iloc[i]['2017']) / data.iloc[i]['2017'] * 100
df_trans.iloc[i]["2018-2019[%]"] = (data.iloc[i]['2019'] - data.iloc[i]['2018']) / data.iloc[i]['2018'] * 100
df_trans.iloc[i]["2019-2020[%]"] = (data.iloc[i]['2020'] - data.iloc[i]['2019']) / data.iloc[i]['2019'] * 100
df_trans.iloc[i]["2020-2021[%]"] = (data.iloc[i]['2021'] - data.iloc[i]['2020']) / data.iloc[i]['2020'] * 100
df_trans.iloc[i]["2021-2022[%]"] = (data.iloc[i]['2022'] - data.iloc[i]['2021']) / data.iloc[i]['2021'] * 100
fig, ax = plt.subplots(figsize=(12, 8))
df_trans.transpose().plot(ax=ax)
plt.axhline(y=0, color='black')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=10)
各年ごとでの増加率の折れ線グラフを表示できました。
値が0のところに黒線を表示しています。この線を下回ると増加率がマイナスで、人口が減少したということになります。
グラフを見てみると、ちょうど新型コロナウィルス蔓延の前後(1回目の緊急事態宣言が2020年3月13日)である2019年から2020年の増加率がマイナスになっている地域が複数出てきている様子が分かります。2019年までは増加率がマイナスになっている地域は見られず、2019年以降から増加率がマイナスとなる地域が見られているため、やはり新型コロナウィルスによる影響で人口が減少したのではないかと予想されます。
2021年から2022年の増加率がプラスに転じている地域も複数見られ、新型コロナウィルスが人口の増減に与える影響が弱くなっていると考えられます。
折れ線グラフでは区ごとの増加率が分かりづらいので、棒グラフで表示してみます。
コロナ前後での人口推移を確認したいので、2019年以降の増加率を表示します。
fig, ax = plt.subplots(3, 1, figsize=(8, 12))
df_trans.plot.barh(y="2019-2020[%]", ax=ax[0])
df_trans.plot.barh(y="2020-2021[%]", ax=ax[1])
df_trans.plot.barh(y="2021-2022[%]", ax=ax[2])
fig.tight_layout()
折れ線グラフからも読み取れたように、”2019年から2020年”と”2020年から2021年”では増加率がマイナスの地域が多く、”2021年から2022年”では増加率がプラスに転じた地域が多いことがわかります。この中でも、墨田区、台東区、文京区、中央区は常に増加率がプラスです。他の地域との違いが気になります。
人口データを地図に表示する
上で作成した人口データを地図に表示します。
まずはGeoPandasでポリゴンデータを取得します。
fp2 = '東京都のポリゴンデータ(.geojson)のファイルパスを貼り付けてください'
geo = gpd.read_file(fp2)
geo.head()
上で表示した結果を見てみると、港区の行が3つあります。これは港区に飛び地があり、一つのポリゴンでは表せない形状をしているためです。これらを1つのポリゴンデータにまとめるためにデータを結合する必要があります。このような場合はGeopandasの.dissolve()を適用することでデータを結合できます。今回は行政区域コード(N03_007)をキーとしてデータを結合します。.dissolve()ではキーとしたcolumn列がindexとなってしまうため、.reset_index()でindexから外します。
dissolved = geo.dissolve(by="N03_007")
dissolved.reset_index(inplace=True)
dissolved.head()
人口のデータフレーム(df_trans)とポリゴンデータのデータフレーム(dissolved)をマージします。地域コードであるdf_transのindexとdissolvedのN03_004をキーにします。
geodata = pd.merge(df_trans, dissolved.loc[:, ["geometry", "N03_004"]], left_index=True, right_on="N03_004")
geodata = gpd.GeoDataFrame(geodata)
geodata.head()
地図に人口データを表示します。
fig, ax = plt.subplots(3, 1, figsize=(8, 12))
geodata.plot(ax=ax[0], column='2019-2020[%]', legend=True)
geodata.plot(ax=ax[1], column='2020-2021[%]', legend=True)
geodata.plot(ax=ax[2], column='2021-2022[%]', legend=True)
fig.tight_layout()
地図に表示することができました。
2021年から2022年にかけて、主に都心部での人口増加が顕著だということがわかります。
まとめ
今回はコロナ前後での東京23区の人口推移を可視化してみました。
コロナ蔓延前後の2019年から2021年にかけて人口減少している区が多いこと、2021年から2022年にかけては人口増加している区が多いことがわかりました。コロナの影響で郊外に引越しをする人が多かったが、最近はコロナの落ち着きでコロナ以前通り東京に引っ越してくる人が増えてきたということでしょうか。
区ごとに増減に特徴がありましたが、その区の特徴までは考察できていません。コロナで明暗を分けた区の特徴の違いがわかると非常に面白いと思います。もし、何か意見等ありましたらコメントいただけますと幸いです。
これからも勉強しながら成果を記事にしていこうと思うので、よろしくお願いします。