クイックノート

ちょっとした発見・アイデアから知識の発掘を

【R】RESAS-APIを使って都道府県別の人口を取得する

地域経済分析システム(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 : 利用するAPIのパス
  • param : 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入れ子形式になっているので、
読みやすくなるように、表形式に直しています。

この関数を実行すると、
下のように都道府県と都道府県コードの一覧が取得できます。

f:id:u874072e:20190821151731p:plain:w300
都道府県コード一覧の取得結果

都道府県毎の人口構成を取得する

都道府県コードと都道府県の対応が分かったので、
人口を知りたい都道府県のデータを取得しましょう。

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年毎に取得できます。

f:id:u874072e:20190821152845p:plain:w300
都道府県別の人口を取得した結果

都道府県の人口を取得する

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の中身は下の図のようになります。

f:id:u874072e:20190821153742p:plain
都道府県の年別人口

人口に応じて地図を塗り分ける

せっかく全都道府県の人口を取得したので、
地図上に可視化してみましょう。

地図を書くためには、
通常シェープファイルと呼ばれる地形の情報を持ったファイルが必要ですが、
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)

結果は下の図のようになりました。

f:id:u874072e:20190821155638p:plain
2020年の人口マップ

まとめ

RESAS-APIを使ってRから都道府県別の人口を取得する方法を紹介しました。

RESAS-APIでは人口だけではなく実に様々なデータが無料で提供されています。

基本的な使い方は共通しているので、
RESAS-API仕様書API一覧を眺めてみて、
人口以外にも面白そうなAPIを使ってみると楽しいかもしれません。

プライバシーポリシー