e-statをRでたたいてみる

Hijiyama.R #4

kazutan

2016年5月28日

今回のお話

今回の流れ

e-statへの登録とappId発行

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

データリストから必要なデータを探す

library(devtools)
# install_github("yutannihilation/estatapi")
library(estatapi)
StatsList <- estat_getStatsList(appId = myappId, searchWord = "社会生活基本調査")
str(StatsList)
## Classes 'tbl_df', 'tbl' and 'data.frame':    5265 obs. of  13 variables:
##  $ @id                 : chr  "0003005834" "0003005836" "0003005838" "0003070357" ...
##  $ STAT_NAME           : chr  "社会生活基本調査" "社会生活基本調査" "社会生活基本調査" "社会生活基本調査" ...
##  $ GOV_ORG             : chr  "総務省" "総務省" "総務省" "総務省" ...
##  $ STATISTICS_NAME     : chr  "平成18年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編" "平成18年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編" "平成18年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編" "平成23年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編" ...
##  $ TITLE               : chr  "男女,行動の種類(小分類,主行動),行動の種類(小分類,同時行動)別総平均時間(週全体)" "男女,行動の種類(小分類,主行動),行動の種類(小分類,同時行動)別行動者平均時間(週全体)" "男女,行動の種類(小分類,主行動),行動の種類(小分類,同時行動)別行動者率(週全体)" "男女,主行動の種類(小分類),同時行動の種類(小分類)別総平均時間-週全体" ...
##  $ 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" ...
##  $ MAIN_CATEGORY       : chr  "教育・文化・スポーツ・生活" "教育・文化・スポーツ・生活" "教育・文化・スポーツ・生活" "教育・文化・スポーツ・生活" ...
##  $ SUB_CATEGORY        : chr  "文化・スポーツ・生活" "文化・スポーツ・生活" "文化・スポーツ・生活" "文化・スポーツ・生活" ...
##  $ OVERALL_TOTAL_NUMBER: chr  "39675" "39675" "39675" "43200" ...
##  $ UPDATED_DATE        : chr  "2009-03-09" "2009-03-09" "2009-03-09" "2013-01-07" ...
head(StatsList)
## Source: local data frame [6 x 13]
## 
##          @id        STAT_NAME GOV_ORG
##        <chr>            <chr>   <chr>
## 1 0003005834 社会生活基本調査  総務省
## 2 0003005836 社会生活基本調査  総務省
## 3 0003005838 社会生活基本調査  総務省
## 4 0003070357 社会生活基本調査  総務省
## 5 0003070359 社会生活基本調査  総務省
## 6 0003070361 社会生活基本調査  総務省
##                                                                 STATISTICS_NAME
##                                                                           <chr>
## 1 平成18年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編
## 2 平成18年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編
## 3 平成18年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編
## 4 平成23年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編
## 5 平成23年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編
## 6 平成23年社会生活基本調査 調査票Bに基づく結果 生活時間に関する結果 生活時間編
## Variables not shown: TITLE <chr>, CYCLE <chr>, SURVEY_DATE <chr>,
##   OPEN_DATE <chr>, SMALL_AREA <chr>, MAIN_CATEGORY <chr>, SUB_CATEGORY
##   <chr>, OVERALL_TOTAL_NUMBER <chr>, UPDATED_DATE <chr>.
library(dplyr)
library(stringr)
x <- StatsList %>% 
  filter(stringr::str_detect(.$STATISTICS_NAME, "平成23.*A.*時間帯")) %>% 
  filter(.$"@id"=="0003066844")
str(x)
## Classes 'tbl_df', 'tbl' and 'data.frame':    1 obs. of  13 variables:
##  $ @id                 : chr "0003066844"
##  $ STAT_NAME           : chr "社会生活基本調査"
##  $ GOV_ORG             : chr "総務省"
##  $ STATISTICS_NAME     : chr "平成23年社会生活基本調査 調査票Aに基づく結果 生活時間に関する結果 時間帯編"
##  $ TITLE               : chr "曜日,男女,行動の種類,時間帯別行動者率-全国*,都道府県*,10大都市圏・10大都市圏以外,都市階級"
##  $ CYCLE               : chr "-"
##  $ SURVEY_DATE         : chr "201110"
##  $ OPEN_DATE           : chr "2012-09-26"
##  $ SMALL_AREA          : chr "0"
##  $ MAIN_CATEGORY       : chr "教育・文化・スポーツ・生活"
##  $ SUB_CATEGORY        : chr "文化・スポーツ・生活"
##  $ OVERALL_TOTAL_NUMBER: chr "2963520"
##  $ UPDATED_DATE        : chr "2012-09-25"
head(x)
## Source: local data frame [1 x 13]
## 
##          @id        STAT_NAME GOV_ORG
##        <chr>            <chr>   <chr>
## 1 0003066844 社会生活基本調査  総務省
##                                                               STATISTICS_NAME
##                                                                         <chr>
## 1 平成23年社会生活基本調査 調査票Aに基づく結果 生活時間に関する結果 時間帯編
## Variables not shown: TITLE <chr>, CYCLE <chr>, SURVEY_DATE <chr>,
##   OPEN_DATE <chr>, SMALL_AREA <chr>, MAIN_CATEGORY <chr>, SUB_CATEGORY
##   <chr>, OVERALL_TOTAL_NUMBER <chr>, UPDATED_DATE <chr>.

ターゲットのデータを読み込む

meta_info <- estat_getMetaInfo(appId = myappId, statsDataId = x$"@id")
names(meta_info)
## [1] "cat01" "cat02" "cat03" "cat04" "area"  "time"
str(meta_info)
## List of 6
##  $ cat01:Classes 'tbl_df', 'tbl' and 'data.frame':   21 obs. of  3 variables:
##   ..$ @code : chr [1:21] "001" "002" "003" "004" ...
##   ..$ @name : chr [1:21] "総数" "睡眠" "身の回りの用事" "食事" ...
##   ..$ @level: chr [1:21] "1" "1" "1" "1" ...
##  $ cat02:Classes 'tbl_df', 'tbl' and 'data.frame':   3 obs. of  4 variables:
##   ..$ @code      : chr [1:3] "001" "002" "003"
##   ..$ @name      : chr [1:3] "総数" "男" "女"
##   ..$ @level     : chr [1:3] "1" "2" "2"
##   ..$ @parentCode: chr [1:3] NA "001" "001"
##  $ cat03:Classes 'tbl_df', 'tbl' and 'data.frame':   98 obs. of  4 variables:
##   ..$ @code : chr [1:98] "001" "099" "003" "004" ...
##   ..$ @name : chr [1:98] "標本数" "10歳以上推定人口" "行動者率(0:00-0:15)" "行動者率(0:15-0:30)" ...
##   ..$ @level: chr [1:98] "1" "1" "1" "1" ...
##   ..$ @unit : chr [1:98] NA "千人" "%" "%" ...
##  $ cat04:Classes 'tbl_df', 'tbl' and 'data.frame':   3 obs. of  3 variables:
##   ..$ @code : chr [1:3] "00100" "00200" "00300"
##   ..$ @name : chr [1:3] "平日" "土曜日" "日曜日"
##   ..$ @level: chr [1:3] "1" "1" "1"
##  $ area :Classes 'tbl_df', 'tbl' and 'data.frame':   160 obs. of  3 variables:
##   ..$ @code : chr [1:160] "00000" "01000" "02000" "03000" ...
##   ..$ @name : chr [1:160] "全国" "北海道" "青森県" "岩手県" ...
##   ..$ @level: chr [1:160] "1" "2" "2" "2" ...
##  $ time :Classes 'tbl_df', 'tbl' and 'data.frame':   1 obs. of  3 variables:
##   ..$ @code : chr "2011000000"
##   ..$ @name : chr "2011年"
##   ..$ @level: chr "1"
head(meta_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
df <- estat_getStatsData(
  appId = myappId,
  statsDataId = x$"@id",
  cdCat01 = "002",
  cdArea = "00000")
str(df)
## Classes 'tbl_df', 'tbl' and 'data.frame':    882 obs. of  15 variables:
##  $ @cat01    : chr  "002" "002" "002" "002" ...
##  $ @cat02    : chr  "001" "001" "001" "001" ...
##  $ @cat03    : chr  "001" "001" "001" "099" ...
##  $ @cat04    : chr  "00100" "00200" "00300" "00100" ...
##  $ @area     : chr  "00000" "00000" "00000" "00000" ...
##  $ @time     : chr  "2011000000" "2011000000" "2011000000" "2011000000" ...
##  $ $         : chr  "-" "-" "-" "-" ...
##  $ @unit     : chr  NA NA NA "千人" ...
##  $ value     : num  0 0 0 0 0 ...
##  $ cat01_info: chr  "睡眠" "睡眠" "睡眠" "睡眠" ...
##  $ cat02_info: chr  "総数" "総数" "総数" "総数" ...
##  $ cat03_info: chr  "標本数" "標本数" "標本数" "10歳以上推定人口" ...
##  $ cat04_info: chr  "平日" "土曜日" "日曜日" "平日" ...
##  $ area_info : chr  "全国" "全国" "全国" "全国" ...
##  $ time_info : chr  "2011年" "2011年" "2011年" "2011年" ...
meta_info$cat01 %>% 
  filter(.$"@name"=="睡眠")
## Source: local data frame [1 x 3]
## 
##   @code @name @level
##   <chr> <chr>  <chr>
## 1   002  睡眠      1

データの整形と可視化

str(df)
## Classes 'tbl_df', 'tbl' and 'data.frame':    882 obs. of  15 variables:
##  $ @cat01    : chr  "002" "002" "002" "002" ...
##  $ @cat02    : chr  "001" "001" "001" "001" ...
##  $ @cat03    : chr  "001" "001" "001" "099" ...
##  $ @cat04    : chr  "00100" "00200" "00300" "00100" ...
##  $ @area     : chr  "00000" "00000" "00000" "00000" ...
##  $ @time     : chr  "2011000000" "2011000000" "2011000000" "2011000000" ...
##  $ $         : chr  "-" "-" "-" "-" ...
##  $ @unit     : chr  NA NA NA "千人" ...
##  $ value     : num  0 0 0 0 0 ...
##  $ cat01_info: chr  "睡眠" "睡眠" "睡眠" "睡眠" ...
##  $ cat02_info: chr  "総数" "総数" "総数" "総数" ...
##  $ cat03_info: chr  "標本数" "標本数" "標本数" "10歳以上推定人口" ...
##  $ cat04_info: chr  "平日" "土曜日" "日曜日" "平日" ...
##  $ area_info : chr  "全国" "全国" "全国" "全国" ...
##  $ time_info : chr  "2011年" "2011年" "2011年" "2011年" ...
head(df,10)
## Source: local data frame [10 x 15]
## 
##    @cat01 @cat02 @cat03 @cat04 @area      @time     $ @unit value
##     <chr>  <chr>  <chr>  <chr> <chr>      <chr> <chr> <chr> <dbl>
## 1     002    001    001  00100 00000 2011000000     -  <NA>  0.00
## 2     002    001    001  00200 00000 2011000000     -  <NA>  0.00
## 3     002    001    001  00300 00000 2011000000     -  <NA>  0.00
## 4     002    001    099  00100 00000 2011000000     -  千人  0.00
## 5     002    001    099  00200 00000 2011000000     -  千人  0.00
## 6     002    001    099  00300 00000 2011000000     -  千人  0.00
## 7     002    001    003  00100 00000 2011000000 82.93    % 82.93
## 8     002    001    003  00200 00000 2011000000 82.12    % 82.12
## 9     002    001    003  00300 00000 2011000000 80.86    % 80.86
## 10    002    001    004  00100 00000 2011000000 83.61    % 83.61
## Variables not shown: cat01_info <chr>, cat02_info <chr>, cat03_info <chr>,
##   cat04_info <chr>, area_info <chr>, time_info <chr>.
library(lubridate)
kosaki <- df %>% 
  filter(stringr::str_detect(.$cat03_info, "^行動者率")) %>%  #データじゃない部分を削除
  select(sex=cat02_info,time=cat03_info,weekday=cat04_info, value) %>% #変数選択
  mutate(sex=as.factor(sex)) %>%  #性別をfactorに変換
  mutate(weekday=as.factor(weekday)) %>% #曜日をfactorに変換
  mutate(time=stringr::str_extract(.$time,"\\d{1,2}:\\d{1,2}")) %>% #timeの最初の時刻だけ切り出す
  mutate(time=parse_date_time2(.$time, "H:M")) #時間に変換
str(kosaki)
## Classes 'tbl_df', 'tbl' and 'data.frame':    864 obs. of  4 variables:
##  $ sex    : Factor w/ 3 levels "女","男","総数": 3 3 3 3 3 3 3 3 3 3 ...
##  $ time   : POSIXct, format: "-1-12-31 00:00:00" "-1-12-31 00:00:00" ...
##  $ weekday: Factor w/ 3 levels "土曜日","平日",..: 2 1 3 2 1 3 2 1 3 2 ...
##  $ value  : num  82.9 82.1 80.9 83.6 82.7 ...
head(kosaki,10)
## Source: local data frame [10 x 4]
## 
##       sex              time weekday value
##    <fctr>            <time>  <fctr> <dbl>
## 1    総数 -1-12-31 00:00:00    平日 82.93
## 2    総数 -1-12-31 00:00:00  土曜日 82.12
## 3    総数 -1-12-31 00:00:00  日曜日 80.86
## 4    総数 -1-12-31 00:15:00    平日 83.61
## 5    総数 -1-12-31 00:15:00  土曜日 82.67
## 6    総数 -1-12-31 00:15:00  日曜日 81.50
## 7    総数 -1-12-31 00:30:00    平日 86.23
## 8    総数 -1-12-31 00:30:00  土曜日 84.83
## 9    総数 -1-12-31 00:30:00  日曜日 83.70
## 10   総数 -1-12-31 00:45:00    平日 86.90

ggplot2による可視化

library(ggplot2)
kosaki_weekday <- kosaki %>% 
  group_by(time,weekday) %>% 
  summarise(value=mean(value))
ggplot(kosaki_weekday, aes(x=time, y=value, color=weekday)) +
  geom_line() +
  labs(title="各時間帯における睡眠率(土・日・平日別)", y="睡眠率")

kosaki_fm <- kosaki %>% 
  group_by(time,sex) %>% 
  summarise(value=mean(value))
ggplot(kosaki_fm, aes(x=time, y=value, color=sex)) + 
  geom_line() +
  labs(title="各時間帯における睡眠率(性別)", y="睡眠率")

Enjoy!

参考資料