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