読者です 読者をやめる 読者になる 読者になる

疫学と医療統計学と遺伝学と時々、大学院生活

疫学を専門とする大学院生の研究に関する備忘録的ページ。

R package 'estatapi'を使用して、公開されている政府統計を取得、解析する

R programming visualization

今回は先日公開されたばかりのRパッケージ'estatapi'を使用して、政府統計を取得し、可視(グラフ)化する。
ちなみに参照する統計表は様々な行動の時間などを収録している社会生活基本調査ということのみ決めておく。
(注意)横に大きなデータは見づらくて申し訳ありません。

はじめに

e-statのAPI機能を使用するときにはappIdを取得する必要があります。
その方法は下記の通りです(参考はこちら→estatapiパッケージで簡単にe-Statのデータ取得 - Qiita

  1. e-StatのAPI機能のサイトへ
  2. 利用登録へ
  3. メアド登録してメールを受信し、本文内にあるリンク先へ
  4. 本登録画面が出るので必要事項を入力
  5. 本登録が完了したら、1のAPI機能トップサイトからログイン
  6. 「アプリケーションIDの取得」で、appIdを発行する

早速使う(今回使用するIDはすでにmyIDに格納してあることにする)

library(estatpai)

必要な統計表の検索="社会生活基本調査"を探す

result <- estat_getStatsList(appId = myID, searchWord = "社会生活基本調査")
str(result)

このような結果が返ってくる。

## Classes 'tbl_df', 'tbl' and 'data.frame':    5265 obs. of  11 variables:
##  $ @id                 : chr  "0003005834" "0003005836" "0003005838" "0003070357" ...
##  $ @code               : chr  "03" "03" "03" "03" ...
##  $ $                   : chr  "文化・スポーツ・生活" "文化・スポーツ・生活" "文化・スポーツ・生活" "文化・スポーツ・生活" ...
##  $ STATISTICS_NAME     : chr  "平成18年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編" "平成18年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編" "平成18年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編" "平成23年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編" ...
##  $ @no                 : chr  "0130102" "0130202" "0130302" "0070102" ...
##  $ CYCLE               : chr  "-" "-" "-" "-" ...
##  $ SURVEY_DATE         : chr  "200610" "200610" "200610" "201110" ...
##  $ OPEN_DATE           : chr  "2007-12-21" "2007-12-21" "2007-12-21" "2012-12-21" ...
##  $ SMALL_AREA          : chr  "0" "0" "0" "0" ...
##  $ OVERALL_TOTAL_NUMBER: chr  "39675" "39675" "39675" "43200" ...
##  $ UPDATED_DATE        : chr  "2009-03-09" "2009-03-09" "2009-03-09" "2013-01-07" ...

ここで重要なのが"@id"という数字であり、これはそれぞれの政府統計と対応している。
さらに調査年などでも情報を絞ることができる。

統計表のメタ情報を参照する(構造把握みたいなもの)

Info <- estat_getMetaInfo(appId = myID, statsDataId = "0003066844")
Info
## $cat01
## Source: local data frame [21 x 3]
## 
##    @code          @name @level
##    (chr)          (chr)  (chr)
## 1    001           総数      1
## 2    002           睡眠      1
## 3    003 身の回りの用事      1
## 4    004           食事      1
## 5    005     通勤・通学      1
## 6    006           仕事      1
## 7    007           学業      1
## 8    008           家事      1
## 9    009     介護・看護      1
## 10   010           育児      1
## ..   ...            ...    ...
## 
## $cat02
## Source: local data frame [3 x 4]
## 
##   @code @name @level @parentCode
##   (chr) (chr)  (chr)       (chr)
## 1   001  総数      1          NA
## 2   002    男      2         001
## 3   003    女      2         001
## 
## $cat03
## Source: local data frame [98 x 4]
## 
##    @code               @name @level @unit
##    (chr)               (chr)  (chr) (chr)
## 1    001              標本数      1    NA
## 2    099    10歳以上推定人口      1  千人
## 3    003 行動者率(0:00-0:15)      1    %
## 4    004 行動者率(0:15-0:30)      1    %
## 5    005 行動者率(0:30-0:45)      1    %
## 6    006 行動者率(0:45-1:00)      1    %
## 7    007 行動者率(1:00-1:15)      1    %
## 8    008 行動者率(1:15-1:30)      1    %
## 9    009 行動者率(1:30-1:45)      1    %
## 10   010 行動者率(1:45-2:00)      1    %
## ..   ...                 ...    ...   ...
## 
## $cat04
## Source: local data frame [3 x 3]
## 
##   @code  @name @level
##   (chr)  (chr)  (chr)
## 1 00100   平日      1
## 2 00200 土曜日      1
## 3 00300 日曜日      1
## 
## $area
## Source: local data frame [160 x 3]
## 
##    @code  @name @level
##    (chr)  (chr)  (chr)
## 1  00000   全国      1
## 2  01000 北海道      2
## 3  02000 青森県      2
## 4  03000 岩手県      2
## 5  04000 宮城県      2
## 6  05000 秋田県      2
## 7  06000 山形県      2
## 8  07000 福島県      2
## 9  08000 茨城県      2
## 10 09000 栃木県      2
## ..   ...    ...    ...
## 
## $time
## Source: local data frame [1 x 3]
## 
##        @code  @name @level
##        (chr)  (chr)  (chr)
## 1 2011000000 2011年      1

こんな感じで格納されているので、必要なデータを自分でチェックする

メタ情報をもとに統計表を取得する

今回は"睡眠"と"育児"の行動率を取得したいので、$cat01でいうと、それぞれ"002"と"010"であることを確認しておく。なお、全国($areaで"00000")かつ平日のデータ($cat04で"00100")であることを確認しておく。

まずは、睡眠データから取得する。
sleep <- estat_getStatsData(appId = myID, statsDataId =  "0003066844", cdCat01 = "002", cdCat02 = "001", cdCat04 = "00100", cdArea= "00000")
str(sleep)
## Classes 'tbl_df', 'tbl' and 'data.frame':    98 obs. of  15 variables:
##  $ @cat01    : chr  "002" "002" "002" "002" ...
##  $ @cat02    : chr  "001" "001" "001" "001" ...
##  $ @cat03    : chr  "001" "099" "003" "004" ...
##  $ @cat04    : chr  "00100" "00100" "00100" "00100" ...
##  $ @area     : chr  "00000" "00000" "00000" "00000" ...
##  $ @time     : chr  "2011000000" "2011000000" "2011000000" "2011000000" ...
##  $ $         : chr  "-" "-" "82.93" "83.61" ...
##  $ @unit     : chr  NA "千人" "%" "%" ...
##  $ value     : num  0 0 82.9 83.6 86.2 ...
##  $ cat01_info: chr  "睡眠" "睡眠" "睡眠" "睡眠" ...
##  $ cat02_info: chr  "総数" "総数" "総数" "総数" ...
##  $ cat03_info: chr  "標本数" "10歳以上推定人口" "行動者率(0:00-0:15)" "行動者率(0:15-0:30)" ...
##  $ cat04_info: chr  "平日" "平日" "平日" "平日" ...
##  $ area_info : chr  "全国" "全国" "全国" "全国" ...
##  $ time_info : chr  "2011年" "2011年" "2011年" "2011年" ...
sleep <- sleep[-1:-2, ] #1,2行目は削除する。
knitr::kable(head(sleep)) #表示する
@cat01	@cat02	@cat03	@cat04	@area	@time	$	@unit	value	cat01_info	cat02_info	cat03_info	cat04_info	area_info	time_info
002	001	003	00100	00000	2011000000	82.9382.93	睡眠	総数	行動者率(0:00-0:15)	平日	全国	2011002	001	004	00100	00000	2011000000	83.6183.61	睡眠	総数	行動者率(0:15-0:30)	平日	全国	2011002	001	005	00100	00000	2011000000	86.2386.23	睡眠	総数	行動者率(0:30-0:45)	平日	全国	2011002	001	006	00100	00000	2011000000	86.9086.90	睡眠	総数	行動者率(0:45-1:00)	平日	全国	2011002	001	007	00100	00000	2011000000	90.8690.86	睡眠	総数	行動者率(1:00-1:15)	平日	全国	2011002	001	008	00100	00000	2011000000	91.3791.37	睡眠	総数	行動者率(1:15-1:30)	平日	全国	2011
同様に育児のデータも取得(コードのみ表示)
child <- estat_getStatsData(appId = myID, statsDataId =  "0003066844", cdCat01 = "010", cdCat02 = "001", cdCat04 = "00100", cdArea= "00000")
child <- child[-1:-2, ] #1,2行目は削除する。
knitr::kable(head(child)) #表示する
@cat01	@cat02	@cat03	@cat04	@area	@time	$	@unit	value	cat01_info	cat02_info	cat03_info	cat04_info	area_info	time_info
010	001	003	00100	00000	2011000000	0.070.07	育児	総数	行動者率(0:00-0:15)	平日	全国	2011010	001	004	00100	00000	2011000000	0.060.06	育児	総数	行動者率(0:15-0:30)	平日	全国	2011010	001	005	00100	00000	2011000000	0.070.07	育児	総数	行動者率(0:30-0:45)	平日	全国	2011010	001	006	00100	00000	2011000000	0.070.07	育児	総数	行動者率(0:45-1:00)	平日	全国	2011010	001	007	00100	00000	2011000000	0.080.08	育児	総数	行動者率(1:00-1:15)	平日	全国	2011010	001	008	00100	00000	2011000000	0.070.07	育児	総数	行動者率(1:15-1:30)	平日	全国	2011

これらのデータを可視化する。

par(family = "Osaka", oma = c(0, 0, 0, 2))
plot(child$value, xlim = c(0, 96), ylim = c(0, 3), 
     ylab = "育児の行動率(%)", xlab = "時間", 
     main = "全国の時間帯ごとの育児と睡眠行動率(平日、男女、2011)",
     col = 2, type = "l", axes = FALSE)
axis(1)
axis(2)
par(new=T)
plot(sleep$value, col = 4, xlim = c(0, 96), ylim = c(0, 100), 
     ylab = "", xlab = "", main = "", type = "l", axes = FALSE)
mtext("睡眠の行動率(%)",side = 4, line = 3)  
axis(4)                        
box()
legend("topleft", legend = c("育児", "睡眠"), col = c("red", "blue"), lty = 1)

f:id:ryosukefujii0320:20160330000106p:plain

ちょっと雑ですが、、、完成

さいごに

  • このパッケージは@yutannihilationによって作成されたものであり、本人のブログでも公表されています。

notchained.hatenablog.com

  • e-statのAPI機能を活用しているだけの処理と比較しかねますが、これはデータの取得から解析までがかなりスムーズになったような印象を受けます。
  • 一方で、API機能のデータは限定的であることは知っておく必要があります(参考:http://www.e-stat.go.jp/api/api-data/
  • このサイトもAPIの中の構造を知る上で非常に役に立ちます。あまり、構造に詳しくない方はこちらもご参照ください(参考:http://www.e-stat.go.jp/api/sample2/tokeidb/


20160330
RF