🗾

R で e-Stat のデータを取得する方法

2023/08/16に公開

記事の内容

R の {estatapi} パッケージを利用して e-Stat から公的統計を取得する方法をまとめています。e-Stat とは日本の統計を閲覧するためのポータルサイトです。

estatapi とは

このパッケージを利用すると R から e-Stat の API にアクセスすることができます。{estatapi} の詳細はこちらを、e-Stat API についてはこちらをご覧ください。

記事で扱う範囲

上記リンクの公式文書では以下の 4 つが紹介されていますが、ここではどのデータを取得したいかは決まっており、メタ情報と統計データの 2 つを取得したい状況を想定します。つまり以下のうち、2 と 3 についてまとめています。

  1. 統計表情報取得
  2. メタ情報取得
  3. 統計データ取得
  4. データカタログ情報取得

使い方

労働力調査の統計データを取得して、性別ごとの正規雇用者、非正規雇用者の人数に関する時系列グラフを作成してみます。

事前準備

e-Stat の API を利用するにはユーザ登録やアプリケーション ID の取得が必要です。詳しくは利用ガイドをご覧ください。この登録作業は短い時間で簡単に済んだ記憶があります。

メタ情報取得

パッケージの取得です。CRAN に登録されているので install.packages() でインストールできます。{estatapi} の他に、後から作図で使う別のパッケージも取得しています。

R
pacman::p_load(tidyverse, estatapi, ggrepel)

アプリケーション ID を appId としておきます。

R
appId <- "ここに取得したアプリケーション ID を入力します。"

メタデータを取得する際に、statsDataId という引数を指定する必要があります。今回は労働力調査から、1-1-4 農林業・非農林業,雇用形態別雇用者数(2013年~) というデータを使用します。このリンク内にある統計表表示 ID が上記の引数に与える数値になります。

R
meta <- estat_getMetaInfo(appId = appId,
                          statsDataId = "0003078094")

メタ情報の中身は以下のようになっています。cat* はデータに含まれる属性を、time はデータの時間軸を指しています。

R
> names(meta)

[1] "tab"    "cat01"  "cat02"  "cat03"  "area"   "time"   ".names"

具体的に、cat02 の中身は以下のとおりです。実際の分析では 03 「正規の職員・従業員」と 10 「非正規の職員・従業員」を使います。

R
> meta$cat02

# A tibble: 11 × 4
   `@code` `@name`                    `@level` `@parentCode`
   <chr>   <chr>                      <chr>    <chr>        
 1 00      雇用者                     1        NA           
 2 02      役員を除く雇用者           2        NA           
 3 03      正規の職員・従業員         3        NA           
 4 10      非正規の職員・従業員       3        NA           
 5 04      パート・アルバイト         4        10           
 6 05      パート                     5        04           
 7 06      アルバイト                 5        04           
 8 07      労働者派遣事業所の派遣社員 4        10           
 9 11      契約社員                   4        10           
10 12      嘱託                       4        10           
11 09      その他                     4        10           

データを取得します。最後に不要な列を除外しています。

R
dat <- estat_getStatsData(appId = appId,
                          statsDataId = "0003078094",
                          cdCat01 = "00", # 全産業
                          cdCat02 = c("03", "10"), # 正規の職員・従業員、非正規の職員・従業員 
                          cdCat03 = c("1", "2") # 男、女
                          ) %>% 
  select(!c(tab_code, cat01_code, cat02_code, cat03_code, 
            area_code, time_code))

取得したデータの中身は以下のとおりです。

R
> head(dat)

# A tibble: 6 × 9
  表章項目   産業分類 雇用形態           性別  地域  時間軸…¹ unit  value annot…²
  <chr>      <chr>    <chr>              <chr> <chr> <chr>    <chr> <dbl> <chr>  
1 実数(人口) 全産業   正規の職員・従業員 男    全国  2013年   万人   2275 NA     
2 実数(人口) 全産業   正規の職員・従業員 男    全国  2014年   万人   2267 NA     
3 実数(人口) 全産業   正規の職員・従業員 男    全国  2015年   万人   2270 NA     
4 実数(人口) 全産業   正規の職員・従業員 男    全国  2016年   万人   2286 NA     
5 実数(人口) 全産業   正規の職員・従業員 男    全国  2017年   万人   2318 NA     
6 実数(人口) 全産業   正規の職員・従業員 男    全国  2018年   万人   2347 NA    

このデータで時系列グラフを作成します。ggplot の書き方がスマートでないかもしれませんが、、以下のようなコードでグラフを作成できます。

R
windowsFonts(meiryo = "Meiryo UI") # フォント変更用

dat %>% 
  mutate(性別 = fct_relevel(性別, "男", "女")) %>% 
  ggplot(data = ., 
         mapping = aes(x = `時間軸(年次)`, y = value, 
                       color = 雇用形態)) + 
  theme_classic() +
  geom_point() + 
  geom_line(mapping = aes(group = 雇用形態), show.legend = FALSE) + 
  geom_text_repel(mapping = aes(label = value), 
                  size = 3, family = "meiryo", 
                  show.legend = FALSE) + 
  coord_cartesian(ylim = c(0, 2500)) + 
  scale_y_continuous(limits = c(0, 2500), 
                     breaks = seq(0, 2500, by = 250)) +
  labs(x = "年", y = "人数(単位: 万人)", 
       title = "雇用形態・性別の人数推移") + 
  theme(text = element_text(family = "meiryo"), 
        axis.text.x = element_text(angle = -45, size = 8), 
        axis.text.y = element_text(size = 8), 
        title = element_text(size = 10, face = "bold"),
        axis.title.x = element_text(vjust = -1.5, size = 9, face = "bold"),
        axis.title.y = element_text(vjust = 1.5, size = 9, face = "bold"), 
        legend.position = "bottom") + 
  facet_wrap(~ 性別, scales = "free")

できあがったグラフは以下のとおりです。

注意点

e-Stat にあるデータベースは、必ずしも最新版の調査まで公開されていないことがあります。e-Stat を直接確認しながらご利用されることをおすすめします。

GitHubで編集を提案

Discussion