地域経済分析システム(RESAS)は、日本の各都道府県や市町村のデータを提供するシステムです。そのAPIを使うと、各地域のデータが取得できます。前回の記事では京都市の人口データをAPIを使って取得しました。
今回は、RESASのAPIを使って、地域ブロック別純移動数というデータを取得します。このデータを使うと、どの都道府県から、どの年に、どの地域ブロックへ人が移動したかがわかります。
基本的なAPIの使い方は、前回の記事をご参照ください。
京都府のデータを取得する
はじめにシンプルな利用例として、京都府のデータのみを取得します。
都道府県コードを取得する手順を確認します。下のようにコードを書くと、①のステータスコードである200と、②で出力される画像1のような全ての都道府県のコードを含むjsonが出力されます。
import requests
import pandas as pd
import plotly.express as px
header = {'X-API-KEY': 'YOUR_KEY'} # API利用用に取得されたキーを入力ください
end_point = 'https://opendata.resas-portal.go.jp'
todofuken_ichiran = '/api/v1/prefectures' # 都道府県一覧のGET先
r = requests.get(end_point+todofuken_ichiran, headers=header)
print(r.status_code) # ①上が成功したかのコードを確認; 成功すると200が返される
print(r.json()) # ②都道府県一覧で返される値を確認する

次に、2のJSONの’result’部分をpandasのデータフレームに変形します(①)。そして、prefName列で京都府を探し、都道府県番号を得ます。その番号を変数kyoto_numに渡します(②)。
df = pd.DataFrame(r.json()[‘result’]) #①
kyoto_num = df[df['prefName'] == '京都府']['prefCode'].values[0] #②
次に、京都府の地域ブロック別純移動数のデータを得ます。コードは次のとおりです。
ido = '/api/v1/population/society/forArea' # 地域ブロック別純移動数のGET先
params = {'prefCode': kyoto_num} # 都道府県を京都府に指定
r = requests.get(end_point+ido, params=params, headers=header) # APIを叩く
print('status_code', r.status_code)
r.json()
得られるJSONは次のようになります。地域別の移動人数のあとに、移動総数、年のデータが得られます。この2年だけをみると、京都府から出て行く人(’negativeAreas’)は東京圏と関西圏、流入はそれ以外からとわかります。

各年の移動の総数を確認してみます。各年のデータの’total’, ‘value’にある値を取れば良いので、次のようにデータを作成できます。
kyoto_data = r.json()['result']['data']
kyoto_total_dict = dict() # データを格納する辞書を作成
for k_data in kyoto_data:
total = k_data['total']['value'] # 各年の総数
year = k_data['year'] # 年のデータ
kyoto_total_dict[year] = total # キーに年、バリューに総数を渡す
辞書に格納されたデータは次のようになります。京都府からはほとんど毎年人が他のブロックに流出しているようです。また、そのピッチが2018年以降上がっているようにも見えます。合計すると10年で18,520人の流出です。

最後にエリア別の流入・流出を確認しましょう。ここでは、流出、流入とも一つのリストの中に入れて(年のデータを加え)、その後データフレームにしています。
kyoto_list = list()
for k_data in kyoto_data:
year = k_data['year']
n_data_list = list()
p_data_list = list()
for n_data in k_data['negativeAreas']:
n_data_values = [v for v in n_data.values()]
n_data_values.append(year)
kyoto_list.append(n_data_values)
for p_data in k_data['positiveAreas']:
p_data_values = [v for v in p_data.values()]
p_data_values.append(year)
kyoto_list.append(p_data_values)
kyoto_df = pd.DataFrame(kyoto_list) # 上で作成したリストをデータフレームに
kyoto_df.columns = ['areaNum', 'areaName', 'total', 'year']
できたデータフレームは次のように(左)、各地域の年ごとの推移のデータを持ちます。データが多くなったのでグラフにして確認します(右)。京都府からの流出はほぼ東京圏と関西で、足元関西が増加傾向にあることが分かります。

全都道府県の人の移動状況を取得
次に、全都道府県の年別の移動状況を確認します。都道府県リストから番号を取得して、データをリクエストし、総数のデータを取得するコードを下に書いています。
r = requests.get(end_point + todofuken_ichiran, headers=header)
print(r.status_code)
pref = pd.DataFrame(r.json()['result'])
data_list = list()
for i in tqdm(range(len(pref))):
pref_num = pref.loc[i, 'prefCode']
pref_name = pref.loc[i, 'prefName']
params = {'prefCode': pref_num}
r = requests.get(end_point + ido, params=params, headers=header)
year_list = list()
total_list = list()
for data in r.json()['result']['data']:
year_list.append(int(data['year']))
total_list.append(int(data['total']['value']))
df = pd.DataFrame(total_list, index=year_list, columns=[f'{pref_name}']) #カラム名を都道府県名に
data_list.append(df)
data = pd.concat(data_list, axis=1) # 全ての都道府県のデータをひとつのデータフレームに
作成されたdataを確認すると、次のようなデータフレームになっています。

データを可視化すると次のように、東京への流入が圧倒的!!!といえるグラフとなります。
人口のデータを組み合わせる
「複数のデータを組み合わせると、考えられることがより重厚になる」ということで、上記のデータの合計と人口のデータを組み合わせて可視化します。
移動データの合計値は次のように作成します。
sum10 = pd.DataFrame(data.sum()).sort_values(0, ascending=False).reset_index() sum10 = sum10.rename({‘index’: ‘prefName’, 0: ’10年の移動数’}, axis=1)続いて、人口のデータを取得します。その後、先ほど作成した10年の移動数の合計のデータとマージします。
d_list = list()
for i in tqdm(range(len(pref))):
pref_num = pref.loc[i, 'prefCode']
pref_name = pref.loc[i, 'prefName']
params = {'prefCode': pref_num}
r = requests.get(end_point+jinko, params=params, headers=header)
data = pd.DataFrame(r.json()['result']['data'][0]['data'])
data['prefName'] = pref_name
d_list.append(data)
data1 = pd.concat(d_list)
data1 = data1.reset_index(drop=True)
data2020 = data1[data1['year'] == 2020].reset_index(drop=True)
mer = sum10.merge(data2020, on='prefName') #データをマージ
mer = mer.rename({'value': '2020年人口'})
マージしたデータを可視化したのが、次のグラフです。人の多いところに、人は集まる傾向が見えますが、兵庫県と北海道は人は多いが、現状は人を引きつけていないことが分かります。
まとめ
以上、RESASのAPIを使ってデータを取得し、人口移動の傾向をちょこっと探ってみました。
RESASにはたくさんのデータがあるため、様々な角度から地域分析を行えます。活用方法のご相談は長目までご気軽にお問い合わせください!
RESAS APIの使い方無料セミナー開催のお知らせ
合同会社長目が、PythonからRESAS APIを使う無料セミナーを開催します。
ウェブセミナーなので、全国からご参加いただけます。開催日時は7月20日水曜日19時から20時までです。
お申し込みはテックプレイよりお願いいたします。