地域経済分析システム(RESAS)とは、
地域ごとの産業構造、人口、人の流れなどのデータを、
収集・可視化するシステムで、政府によって提供されています。
可視化に用いられているデータを API を通じて取得することもでき、
これが今回用いる RESAS-API です。
簡単に RESAS-API の使い方に慣れるために、
ここでは、RからAPIを利用して、
県毎の人口を取得してみます。
準備
RESAS-APIを利用するには、
利用登録を行い、APIキーを取得する必要があります。
RESAS-APIのトップページから、
無料の利用者登録を行いましょう。
登録の申請後、本登録のためのメールが届くので、
メール中のURLにアクセスすれば本登録完了です。
この時、APIキーが表示されるので、
登録画面を閉じる前にメモしておきましょう。
登録画面を閉じてしまっても、RESAS-APIのページから、
ログインすれば、APIキーが確認できます。
APIからデータを取得
上記の手順でAPIキーを取得した後は、
HTTPリクエストを通じてデータの取得を行います。
API利用のための共通処理
RESAS-APIでは、データの種類に応じて、
様々なAPIが用意されています。
どのAPIも、APIキーを乗せたリクエストを送り、
json形式のレスポンスを受け取るという共通の動作を行うので、
このような共通の動作を関数化しておきます。
library(httr) library(rjson) RESAS_API_KEY = "[APIキー]" RESAS_ENDPOINT = "https://opendata.resas-portal.go.jp" resas_api = function(api,param=NULL){ res = GET(paste(RESAS_ENDPOINT,api,sep=""), add_headers("X-API-KEY"=RESAS_API_KEY), query=param) Sys.sleep(1/5) return(content(res)) }
RESAS_API_KEY
には上で取得したAPIキーを指定します。
引数はそれぞれ次のように対応します。
APIの利用上限が1秒間に5リスエストとなっているので、
毎回0.2秒間スリープするようにしています。
都道府県コードのリストを取得
人口を取得するAPIでは、
人口を取得する都道府県を都道府県コードで指定する必要があります。
どの都道府県がどの番号に対応しているかを調べるため、
まず、都道府県名と都道府県コードの一覧を取得しましょう。
下の関数は、先ほどの共通処理の関数を利用して、
都道府県のリストを取得するAPIを利用しています。
このAPIにパラメータはないので、param
は指定していません。
list_prefectures = function(){ res = resas_api("/api/v1/prefectures") t(sapply(res$result,function(x){x})) }
取得されたデータは、JSONの入れ子形式になっているので、
読みやすくなるように、表形式に直しています。
この関数を実行すると、
下のように都道府県と都道府県コードの一覧が取得できます。
都道府県毎の人口構成を取得する
都道府県コードと都道府県の対応が分かったので、
人口を知りたい都道府県のデータを取得しましょう。
RESAS-APIでは、指定した都道府県の人口を、
年齢別(3区分)、年別(5年毎)に取得できます。
下の関数は、都道府県と市区町村を指定してデータを取得する関数です。
市区町村を指定する場合は、都道府県と同じように、
対応する市区町村コードを把握して上で指定します。
指定しなければ、全市区町村の合算値が取得されます。
population_perYear = function(prefCode,cityCode=NULL){ if(is.null(cityCode)){ cityCode = "-" } param = list(prefCode=prefCode, cityCode=cityCode) res = resas_api("/api/v1/population/composition/perYear",param) tmp = lapply(res$result$data,function(X){ tmp = t(sapply(X$data,function(x){x})) return(tmp) }) names(tmp) = sapply(res$result$data,function(X){X$label}) return(tmp) }
list_prefectures
と同様に、
jsonの入れ子構造を見やすいように整形しています。
実行結果は、下の図のようになり、
「総人口」「年少人口」「生産年齢人口」「老年人口」
の4種類の人口が5年毎に取得できます。
全都道府県の人口を取得する
RESAS-APIでは1度に1つの都道府県しか指定できないようです。
そのため、全都道府県の人口を取得するためには、
ループして取得することになります。
prefs = list_prefectures() pops = NULL for(i in prefs[,1]){ res = population_perYear(i) pops = cbind(pops,res[[1]][,2]) } colnames(pops) = prefs[,2] rownames(pops) = res[[1]][,1]
上では、各都道府県の年別の総人口だけを抽出して、
変数pops
に格納しています。
実行後、pops
の中身は下の図のようになります。
人口に応じて地図を塗り分ける
せっかく全都道府県の人口を取得したので、
地図上に可視化してみましょう。
地図を書くためには、
通常シェープファイルと呼ばれる地形の情報を持ったファイルが必要ですが、
chroplethrAdmin1
ではそのシェープファイルを
ライブラリ内に持っているため、
手軽に地図を描画することができます。
2020年の総人口のデータを使って、
地図を色分けします。
library(choroplethr) library(choroplethrAdmin1) x = data.frame( region = df_japan_census$region[order(as.numeric(rownames(df_japan_census)))], value = unlist(pops["2020",]) ) admin1_choropleth("japan",x,legend = "population",num_colors = 4)
結果は下の図のようになりました。
まとめ
RESAS-APIを使ってRから都道府県別の人口を取得する方法を紹介しました。
RESAS-APIでは人口だけではなく実に様々なデータが無料で提供されています。
基本的な使い方は共通しているので、
RESAS-API仕様書のAPI一覧を眺めてみて、
人口以外にも面白そうなAPIを使ってみると楽しいかもしれません。