論理の流刑地

地獄の底を、爆笑しながら闊歩する

Rからestatapiパッケージを通してe-stat APIをつかう

Introduction

きのうの#JapanRで、「e-statの中の人」こと西村氏が発表されていて、e-statの近年の発展やAPIやLODの使い方について丁寧な解説がされていた。

↓西村氏の発表
www.youtube.com

学生時代にe-statをつかうとき(そんなに機会があるわけじゃないけど)には、基本的にExcelファイルのほうをDLしていて使っていて、
そのくせ「DBの統合とかしにくくて使いにくいなぁ...」とか思っていた(よく調べずに文句をいっててごめんなさい...)ので、
”鉄は熱いうちに打て”というか、"善は急げ"な感じで、e-statのAPIを使ってみる。
とりあえず一通りの機能を実際に使ってみて覚えたい。

◆参考URL

e-stat APIの基本仕様

どんな機能があるか

上の動画内で西村氏も説明されているが、e-stat APIは7つの基本機能を提供している

  1. 統計表情報取得
  2. メタ情報取得
  3. 統計データ取得
  4. データセット登録
  5. データセット参照
  6. データカタログ情報取得
  7. 統計データ一括取得

このうち、よく使いそうなのは(赤太字にした)統計表情報取得(IDを取得するのに使う)、統計データ取得で、メタ情報取得APIもたまにつかうかな...くらいだと思う。
目的の統計が、DB対応していない場合は、データカタログ情報APIでURL取得→直接DLの流れになるので、そちらも一応抑えていきたい。
上記の仕様解説のページにあるように、取得しようとする形式(JSON/XML/CSVなど)によってアクセスする対象のURLが異なってくるのには、注意したい。

パラメータについて

APIにおいて重要になるのは、どういうパラメータの種類があって何を指定すべきか、を知ることである。
estatapiパッケージ(後述)においても、各関数の引数がAPIのパラメータと対応を為している。

だから、パラメータについての公式仕様をしっかり確認すべき。
統計表情報取得機能のパラメータについて、統計分野(statsField)と、政府統計コードor作成機関(statsCode)に関しては「そもそも何を指定すんねん」感があるので、次のURLを参照すべし

Rから使ってみる

とりあえずの目標設定としては、わりと昔め(平成初期)の産業レベルの男女・年齢別労働人口などを取得したいとする。

estatapiパッケージを使う

Rからの利用にあたっては、Hiroaki, Yutani氏がestatapiというパッケージを公開している(参考URL 2参照)のでそれをつかう。
クラッチでゴリゴリ書く、というのも勿論アリなんだけど、参考URL1の記事をみてもらえれば分かる通り、前処理だけでかなり煩雑になってくるので、ここはありがたく前人の知恵を拝借させていてだく。

各関数の戻り値はtbl_df形式で取得できるため、Rに慣れているひとなら加工しやすい。
別にtibbleが嫌ならすぐにas.data.frame()してもいいし。

各機能をつかう前にアプリケーションID(登録するとすぐに付与される)を登録しとくこと。

api_key <- "XXXXXXXXXX"

機能1:統計表を検索してIDを取得する

e-stat APIを利用する最終的な目標はデータを取得してRで分析すること(がほとんど)だと思うけど、そのためには表のIDを取得することが必要になる。
そこで、estatapi::getStatsList()を使うと、データを検索することができる。
主要な引数は以下の通り、

  • searchWord :検索語。 OR やANDが使用可能。
  • surveyYears:調査年、"2014" , "201303", "199906-200506"のような形式で指定
  • statsField:統計分野,上記参照
  • statsCode:統計コード , 上記参照
  • use_label:可読性を考慮したLabel を使うかどうか(TRUE or FALSE)
  • limit: 最大何件を取得するか

たとえば、総務省(code:00200)がやっている「労働・賃金」分野(code:03)の1989-1995年の調査で、「産業」「年齢」というwordを含むものを最大100件取得したいときには以下のようなコードをかく。

res1 <- estat_getStatsList(appId = api_key , searchWord = "産業 AND 年齢", surveyYears = "199001-199512",statsCode= "00200" ,limit=100, statsField = "03")
res1_df <- as.data.frame(res1 )
head( res1_df, 2)
#' @id        STAT_NAME GOV_ORG                STATISTICS_NAME
#' 1 0000140293 就業構造基本調査  総務省 平成4年就業構造基本調査 全国編
#' 2 0000140562 就業構造基本調査  総務省 平成4年就業構造基本調査 地域編
#' TITLE
#' 1                                                                         従業上の地位(2),産業(35),男女別(3),平均年齢(1),平均年齢(有業者),全国(1)
#' 2 男女別(3),産業(13),従業上の地位(2),平均年齢(有業者)(1),平均年齢(有業者),都道府県(48)・13大都市(13)・14地域(12)・4大都市圏(5)
#' CYCLE SURVEY_DATE  OPEN_DATE SMALL_AREA COLLECT_AREA MAIN_CATEGORY
#' 1     -      199210 2007-08-31          0     該当なし    労働・賃金
#' 2     -      199210 2007-08-31          0     該当なし    労働・賃金
#' SUB_CATEGORY OVERALL_TOTAL_NUMBER UPDATED_DATE     TABULATION_CATEGORY
#' 1       労働力                  210   2007-09-07 平成4年就業構造基本調査
#' 2       労働力                 6084   2007-09-07 平成4年就業構造基本調査
#' TABULATION_SUB_CATEGORY1 DESCRIPTION
#' 1                   全国編            
#' 2                   地域編            

searchWordは"労働 AND ( 男女 OR 産業)"みたいな形の指定もできる。

どの統計がお眼鏡にかなってそうかは、とりあえず上で取得した検索結果一覧をclipboardに張り付けて、excelにペーストしてから*1適当にフィルタで絞っていくのが一番早い気がする(もっとsmartな方法はあるのかもしれませんが...)

clipboardにdata frameを貼り付け方法は以下参照。
ronri-rukeichi.hatenablog.com

機能2:メタデータを取得する

estatapi::estat_getMetaInfo()を使うことによりメタデータを取得してみる。
引数はappIDとstatIDのみ。

とりあえず、上の方法でデータ取得した中から、table ID:140292の
「従業上の地位(2),産業(35),男女別(3),年齢(12),有業者数,全国(1)」という表のメタデータを取得してみよう。

meta1 <-  estat_getMetaInfo( api_key,"0000140440" )
str( meta1)
# List of 7
# $ cat01 : tibble [2 x 3] (S3: tbl_df/tbl/data.frame)
# ..$ @code : chr [1:2] "000" "001"
# ..$ @name : chr [1:2] "総数" " うち雇用者"
# ..$ @level: chr [1:2] "1" "1"
# $ cat02 : tibble [3 x 3] (S3: tbl_df/tbl/data.frame)
# ..$ @code : chr [1:3] "000" "001" "002"
# ..$ @name : chr [1:3] "男女計" " 男" " 女"
# ..$ @level: chr [1:3] "1" "1" "1"

names( meta1)
#[1] "cat01"  "cat02"  "cat03"  "cat04"  "area"   "time"   ".names"

「catXX」に変数の情報が入っていて、「area」はデータ収集の地域に関する情報が、「time」には調査時点に関する情報が、「names」には各変数(例:cat01)の名前(例:従業上の地位)などが入っている。

ちなみに変数情報(「catXX」)は、以下のようになっている。

head(meta1$cat04,3)
# A tibble: 3 x 4
# `@code` `@name`  `@level` `@unit`
# <chr>   <chr>    <chr>    <chr>  
#   1 000     総数     1        千人   
# 2 001      農林業 1        千人   
# 3 002      漁業   1        千人   

コード、対応する値、データ収集の地域レベル、単位がわかるので、のちのちデータ取得してから分析を行うときに有用である。

機能3:データ本体の取得

やっとたどり着いた本丸。用いる関数は、estat_getStatsData
appID , statsDataIDのほかに、いくつかの引数を指定できる。
それ以外の引数の詳細は公式ドキュメントを参照すればよい。

基本的に絞り込みを行う時はlvXXX, cdXXX, cdXXXFrom , cdXXXtoを使い、何で絞りたいかに応じて、XXXをTab(表章), Time(時間), Area(地域),CatXX(各項目)で置き換えればよい。
たとえば、先ほどのデータを女性(コード002)のみに絞って取得するには以下のようにする
(この絞り込みの上で、さきほどのメタデータ取得が役に立つわけですね。なるほど.....)

dta1_f <- estat_getStatsData(api_key ,"0000140440" ,cdCat02 = c("002"))
dta1_f_df <- as.data.frame( dta1_f)

head( dta1_f_df,2)
# cat01_code 従業上の地位140014 cat02_code 男女別140001 cat03_code
# 1        000               総数        002          女        000
# 2        000               総数        002          女        000
# 産業140015 cat04_code 産業・1年前140087 area_code 全国140001  time_code
# 1       総数        000               総数     00000       全国 1992000000
# 2       総数        001            農林業     00000       全国 1992000000
# 時間軸(年次) unit value annotation
# 1       1992年 千人  1412       <NA>
# 2       1992年 千人    12       <NA>

とても便利だ。。。。

機能4:データカタログの取得

e-statはDB対応していない統計表もたくさん収録されていて、それらは上のように直接APIからデータとして読み込むのは難しい。
しかし、estat_getDataCatalog()を使うことによって、それらをDLするためのURLを取得できる。
基本的な引数は検索用のestat_getStatsList()と同じで、dataType= c("CSV", "PDF", "DB","XLS")引数を使うことで、データの種類を絞り込む

catalog1 <- estat_getDataCatalog(appId = api_key, searchWord = "チョコレート", dataType = c("PDF", "XLS"))

head( as.data.frame(catalog1)[,1:12],2)
# @id
# 1 000000701890
# 2 000000701988
# NAME
# 1     価格分布_1_業態別価格分布-全国,都市階級,都道府県_0104チョコレート
# 2 価格分布_2_立地環境別価格分布-全国,都市階級,都道府県_0104チョコレート
# TABLE_CATEGORY TABLE_NO                                   TABLE_NAME
# 1       価格分布        1     業態別価格分布-全国,都市階級,都道府県
# 2       価格分布        2 立地環境別価格分布-全国,都市階級,都道府県
# TABLE_EXPLANATION TABLE_SUB_CATEGORY1 TABLE_SUB_CATEGORY2
# 1                      0104チョコレート                    
# 2                      0104チョコレート                    
# TABLE_SUB_CATEGORY3
# 1                    
# 2                    
# URL
# 1 https://www.e-stat.go.jp/stat-search/file-download?&statInfId=000000701890&fileKind=0
# 2 https://www.e-stat.go.jp/stat-search/file-download?&statInfId=000000701988&fileKind=0
# DESCRIPTION FORMAT
# 1                XLS
# 2                XLS

この$URLにアクセスすることで、直接DLができる。

Conclusion

同一調査の同じテーブルの時系列推移とかを追いたいときにかなり便利だと感じた。
あと、XLSやCSV開いてから変換するよりはかなり工数が削減できそう。
ありがとう#JapanR!!


SOFFet - 人生一度(official video)


Enjoy!!

*1:貼りつける前にデータ形式を文字列にしとく