Tomokazu NOMURA
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Rによる公的統計の視覚化

はじめに

経済にかかわる公的統計を,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だけ指定してデータをダウンロードしてみよう(すべてのデータがダウンロードされる)。

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のマニュアルに掲載されている。

Contents