Rによる公的統計の視覚化
経済にかかわる公的統計を,Rを使って視覚化(グラフ化)する例を紹介する。データのダウンロード,整理,グラフの作成をすべてR上で行っているので,コードをコピーして貼り付けるだけで,グラフを作成できる。
データについては,e-Statからダウンロードする。APIで提供されているデータについてはAPIを利用するが,ファイルでしか提供されていないものは,Excel形式やcsv形式のファイルをダウンロードして整理する。グラフは,ggplot2を用いて描く。
APIを使うものについてはe-stat・APIのアプリケーションID取得が必要。アプリケーションIDはこちらから登録すればだれでも取得できる(無料)。
わたし自身,Rは完全に独学で,体系的に学んだわけではないので,コードには非効率であったり読みにくかったりする部分もあると思う。
このサービスは、政府統計総合窓口(e-Stat)のAPI機能を使用していますが、サービスの内容は国によって保証されたものではありません。
APIは,Application Programming Interfaceの略。e-statでは欲しい情報をURLに埋め込んでアクセスすると,XMLやJSON,CSV形式のデータを取得できる。詳細はe-statのWebページを参照。利用は無料だが,アプリケーションIDを取得する必要がある。一度取得してしまえば,とくに更新などは必要ないみたい。
Excelファイルなどで提供されているデータは,それぞれフォーマットが違うので作業の自動化が困難。一方,APIを使えば必要な情報を統計名 (ID),期間,地域などを指定してダウンロードできる。データのフォーマットは統一されているので分析の自動化が容易。また,ファイルのようにデータ全体 (不要な部分まで) をダウンロードしてから絞り込むといった作業も不要。たとえば,「人口動態統計から2000年以降の合計特殊出生率を取得する」とか,「労働力調査から2000〜2010年の男女別失業率を取得する」といったことが簡単にできる。
残念ながらe-statで提供されているデータの全てがAPIで取得できるわけではなく,Excelファイルでのみ提供されているデータも多い。また,同じ統計であっても,年が違うと統計表IDや変数のコードが違うこともあり,そのあたりは将来の改良に期待。とはいえ,csvファイルやExcelファイルをダウンロードして,整理・加工するという前処理が大幅に軽減されるため,非常にパワフルなツール。
Rからe-statのAPIを利用するときは,estatapiというパッケージが便利。
e-stat APIの仕組みを理解するために,Rのestatapiパッケージからe-statのAPIを実際に使ってみる。ここでは,日本の出生数と合計特殊出生率のデータを取得しよう。「人口動態調査・人口動態統計・確定数・出生・4−1・上巻」の統計表IDは"0003411595"。とりあえず統計表IDだけ指定してデータをダウンロードしてみよう(すべてのデータがダウンロードされる)。
library(tidyverse)
library(estatapi)
appID = "取得したアプリケーションID"
# e-Statからデータ取得
estat_vital <- estat_getStatsData(
appId = appID,
statsDataId = "0003411595")
ダウンロードしたデータがどのようなものか,glimpse()で確認してみる。
glimpse(estat_vital)
Rows: 720
Columns: 7
$ cat01_code <chr> "00100", "00100", "00100", "00100", "00100", "00100", "00100", "00100", "00100"…
$ `出生数・出生率・出生性比` <chr> "出生数_総数", "出生数_総数", "出生数_総数", "出生数_総数", "出生数_総数", "出…
$ time_code <chr> "2021000000", "2020000000", "2019000000", "2018000000", "2017000000", "20160000…
$ `時間軸(年次)` <chr> "2021年", "2020年", "2019年", "2018年", "2017年", "2016年", "2015年", "2014年",…
$ unit <chr> "人", "人", "人", "人", "人", "人", "人", "人", "人", "人", "人", "人", "人", "…
$ value <dbl> 811622, 840835, 865239, 918400, 946146, 977242, 1005721, 1003609, 1029817, 1037…
$ annotation <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
データの構造はシンプルで,6種類のデータが120年分で合計720行ある。6種類というのは,出生数・出生率・出生性比
で識別される。
table(estat_vital$`出生数・出生率・出生性比`)
出生性比 出生数_女 出生数_男 出生数_総数 出生率 合計特殊出生率
120 120 120 120 120 120
出生数・出生率・出生性比
の内容は,cat01_code
と一対一で対応している。
table(estat_vital$`出生数・出生率・出生性比`, estat_vital$cat01_code)
cat01_code
出生数・出生率・出生性比 00100 00110 00120 00130 00140 00150
出生性比 0 0 0 0 120 0
出生数_女 0 0 120 0 0 0
出生数_男 0 120 0 0 0 0
出生数_総数 120 0 0 0 0 0
出生率 0 0 0 120 0 0
合計特殊出生率 0 0 0 0 0 120
同様に,time_code
は時間軸(年次)
と一対一で対応している。より複雑な構造のデータであれば,cat02_code, cat03_code,・・・といったように識別のための変数が増える。たとえば,cat01_codeがデータ系列,cat02_codeが性別,cat03_codeが年齢といったイメージ。また,この例は全国のデータだが,都道府県や市町村別のデータであればarea_code
という地域を識別するための変数が追加される。
この例のデータであればサイズが小さいので,すべてダウンロードしてからフィルターをかけても良いが,通常は大きなデータをすべてダウンロードするのは非効率。そこで,必要なデータだけを取得する。たとえば,1965〜2020年の出生数_総数と合計特殊出生率だけを取得するには,以下のようにすれば良い。
estat_vital <- estat_getStatsData(
appId = appID,
statsDataId = "0003411595",
cdCat01 = c("00100", "00150"),
cdTimeFrom = "1965",
cdTimeTo = "2020"
)
cdCat01 = c("00100", "00150")
の部分は出生数_総数および合計特殊出生率に対応するcat01_codeの00100と00150を指定している。cdTimeFrom = "1965", cdTimeTo = "2020"
の部分は1965〜2020年の時期を指定している。ほかに絞込みを指定できるもののリストは,e-statのマニュアルに掲載されている。