経済にかかわる公的統計を,Rを使って視覚化(グラフ化)する例を紹介する。データのダウンロード,整理,グラフの作成をすべてR上で行っているので,コードをコピーして貼り付けるだけで,グラフを作成できる。
データについては,e-Statからダウンロードする。APIで提供されているデータについてはAPIを利用するが,ファイルでしか提供されていないものは,Excel形式やcsv形式のファイルをダウンロードして整理する。グラフは,ggplot2を用いて描く。
APIを使うものについてはe-stat・APIのアプリケーションID取得が必要。アプリケーションIDはこちらから登録すればだれでも取得できる(無料)。
わたし自身,Rは完全に独学で,体系的に学んだわけではないので,コードには非効率であったり読みにくかったりする部分もあると思う。
このサービスは、政府統計総合窓口(e-Stat)のAPI機能を使用していますが、サービスの内容は国によって保証されたものではありません。
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だけ指定してデータをダウンロードしてみよう(すべてのデータがダウンロードされる)。
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
このサービスは、政府統計総合窓口(e-Stat)のAPI機能を使用していますが、サービスの内容は国によって保証されたものではありません。
# appID = "取得したアプリケーションID"
# e-Statからデータ取得
estat_vital <- estat_getStatsData(
appId = appID,
statsDataId = "0003411595")
Fetching record 1-726... (total: 726 records)
ダウンロードしたデータがどのようなものか,glimpse()で確認してみる。
Rows: 726
Columns: 7
$ cat01_code <chr> "00100", "00100", "00100", "00100", "00100"…
$ `出生数・出生率・出生性比` <chr> "出生数_総数", "出生数_総数", "出生数_総数"…
$ time_code <chr> "2022000000", "2021000000", "2020000000", "…
$ `時間軸(年次)` <chr> "2022年", "2021年", "2020年", "2019年", "20…
$ unit <chr> "人", "人", "人", "人", "人", "人", "人", "…
$ value <dbl> 770759, 811622, 840835, 865239, 918400, 946…
$ annotation <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
データの構造はシンプルで,6項目のデータが121年分で合計726行ある。6項目というのは,出生数・出生率・出生性比
で識別される。
table(estat_vital$`出生数・出生率・出生性比`)
出生性比 出生数_女 出生数_男 出生数_総数 出生率
121 121 121 121 121
合計特殊出生率
121
出生数・出生率・出生性比
の内容は,cat01_code
と一対一で対応している。
table(estat_vital$`出生数・出生率・出生性比`, estat_vital$cat01_code)
00100 00110 00120 00130 00140 00150
出生性比 0 0 0 0 121 0
出生数_女 0 0 121 0 0 0
出生数_男 0 121 0 0 0 0
出生数_総数 121 0 0 0 0 0
出生率 0 0 0 121 0 0
合計特殊出生率 0 0 0 0 0 121
同様に,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"
)
Fetching record 1-110... (total: 110 records)
cdCat01 = c("00100", "00150")
の部分は出生数_総数および合計特殊出生率に対応するcat01_codeの00100と00150を指定している。cdTimeFrom = "1965", cdTimeTo = "2020"
の部分は1965〜2020年の時期を指定している。ほかに絞込みを指定できるもののリストは,e-statのマニュアルに掲載されている。