e-Stat🤝R

Tokyo.R #108

UchidaMizuki

2023-09-02

e-Statとは❓

  • 日本の政府統計ポータルサイト
  • 多くの統計データを検索・閲覧・取得可能👍

画像出典:e-Stat

e-Statの使い方📌

1. データベースを検索🔎

画像出典:e-Stat

e-Statの使い方📌

2. データベースを選択👆

画像出典:e-Stat

e-Statの使い方📌

2. データベースを選択👆

画像出典:e-Stat

e-Statの使い方📌

3. データ項目を選択✅

画像出典:e-Stat

e-Statの使い方📌

4. データをダウンロード💾

画像出典:e-Stat

e-Stat🤝R

Rでもe-Statの機能を利用したい❗

e-Stat API

Rでもe-Statの機能を利用できる⏩estatapi📦も

  1. データベースを検索🔎
  2. データベースを選択👆
  3. データ項目を選択✅
  4. データをダウンロード💾

e-Stat🤝R

e-Stat API

ただしWeb版と比べてStep 3~が煩雑になりがち😖

  1. データ項目を選択✅
  2. データをダウンロード💾

jpstat📦

  • 効率的な統計データ抽出・取得・整形に特化👍
  • dplyr📦とパイプ(|>, %>%)を利用可能👍

jpstat📦の使い方📌

1. アプリケーションIDを設定

# パッケージのインストール(必要なら)・読み込み
if (!require("tidyverse")) install.packages("tidyverse")
if (!require("jpstat")) install.packages("jpstat")

library(tidyverse)
library(jpstat)

# グローバル変数にアプリケーションIDを追加
Sys.setenv(ESTAT_API_KEY = "あなたのアプリケーションID")

jpstat📦の使い方📌

2. データ項目を取得1

2023年家計調査データベースを対象2

estat(statsDataId = "0003343671") # statsDataId: URL等に記載されている統計表ID
# ☐ tab:   表章項目               [1] <code, name, level>
# ☐ cat01: 品目分類(2020年改定) [690] <code, name, level, unit, parentCode>
# ☐ cat02: 世帯区分               [4] <code, name, level>
# ☐ area:  地域区分               [53] <code, name, level>
# ☐ time:  時間軸(月次)         [462] <code, name, level>
# 
# Please `activate()`.

jpstat📦の使い方📌

3. データ項目を抽出

activate(), filter()でチョコレート関連品目を抽出

estat(statsDataId = "0003343671") |> 
  activate(cat01) |> 
  filter(str_detect(name, "チョコレート"))
# ☐ tab:   表章項目               [1] <code, name, level>
# ☒ cat01: 品目分類(2020年改定) [2] <code, name, level, unit, parentCode>
# ☐ cat02: 世帯区分               [4] <code, name, level>
# ☐ area:  地域区分               [53] <code, name, level>
# ☐ time:  時間軸(月次)         [462] <code, name, level>
# 
# A tibble: 2 × 5
  code      name                 level unit  parentCode
  <chr>     <chr>                <chr> <chr> <chr>     
1 010800130 352 チョコレート     5     円    010800000 
2 010800140 353 チョコレート菓子 5     円    010800000 

jpstat📦の使い方📌

3. データ項目を抽出

他の抽出処理をパイプ(|>, %>%)でつなげられる

estat(statsDataId = "0003343671") |> 
  activate(cat01) |> 
  filter(str_detect(name, "チョコレート")) |> 
  
  activate(area) |> 
  filter(name == "全国") |> 
  
  activate(time) |> 
  filter(str_detect(name, "2023年[1-3]月"))

jpstat📦の使い方📌

4. データをダウンロード

collect()で統計データをダウンロード

chocolate <- estat(statsDataId = "0003343671") |> 
  activate(cat01) |> 
  filter(str_detect(name, "チョコレート")) |> 
  
  activate(area) |> 
  filter(name == "全国") |> 
  
  activate(time) |> 
  filter(str_detect(name, "2023年[1-3]月")) |> 
  
  collect(n = "金額") # `n`で収集データの列名を指定
The total number of data is 12.

jpstat📦の使い方📌

4. データをダウンロード

列名が難解で列数が多い😖⏩データ整形したい❗

head(chocolate)
# A tibble: 6 × 18
  tab_code tab_name tab_level cat01_code cat01_name       cat01_level cat01_unit
  <chr>    <chr>    <chr>     <chr>      <chr>            <chr>       <chr>     
1 01       金額     ""        010800130  352 チョコレート 5           円        
2 01       金額     ""        010800130  352 チョコレート 5           円        
3 01       金額     ""        010800130  352 チョコレート 5           円        
4 01       金額     ""        010800130  352 チョコレート 5           円        
5 01       金額     ""        010800130  352 チョコレート 5           円        
6 01       金額     ""        010800130  352 チョコレート 5           円        
# ℹ 11 more variables: cat01_parentCode <chr>, cat02_code <chr>,
#   cat02_name <chr>, cat02_level <chr>, area_code <chr>, area_name <chr>,
#   area_level <chr>, time_code <chr>, time_name <chr>, time_level <chr>,
#   金額 <chr>

jpstat📦の使い方📌

5. データを整形

rekey(), select()で収集データの列を指定できる

chocolate <- estat(statsDataId = "0003343671") |> 
  activate(tab) |> select() |> # 何も`select()`しない場合は列が消える
    
  activate(cat01) |> rekey("品目分類") |> select(name) |> 
  filter(str_detect(name, "チョコレート")) |> 
  
  activate(cat02) |> rekey("世帯区分") |> select(name) |>
  
  activate(area) |> rekey("地域区分") |> select(name) |>
  filter(name == "全国") |> 
  
  activate(time) |> rekey("月次") |> select(name) |>
  filter(str_detect(name, "2023年[1-3]月")) |> 
  
  collect(n = "金額")
The total number of data is 12.

jpstat📦の使い方📌

5. データを整形

列名がわかりやすくなり不要な列が消えた👍

head(chocolate)
# A tibble: 6 × 5
  品目分類_name    世帯区分_name                   地域区分_name 月次_name 金額 
  <chr>            <chr>                           <chr>         <chr>     <chr>
1 352 チョコレート 二人以上の世帯(2000年~)      全国          2023年1月 869  
2 352 チョコレート 二人以上の世帯(2000年~)      全国          2023年2月 1307 
3 352 チョコレート 二人以上の世帯(2000年~)      全国          2023年3月 656  
4 352 チョコレート 二人以上の世帯のうち勤労者世帯… 全国          2023年1月 998  
5 352 チョコレート 二人以上の世帯のうち勤労者世帯… 全国          2023年2月 1491 
6 352 チョコレート 二人以上の世帯のうち勤労者世帯… 全国          2023年3月 749  

まとめ📋

  • jpstat📦で統計データ収集が楽しく簡単に
  • e-Stat以外の統計APIにも対応するかも
    • 現在,実験的にRESAS APIなどに対応
  • 要望やバグ報告はUchidaMizuki/jpstat/issuesまで

Enjoy🍫

余談:2月はチョコレート消費が増えることがわかった!

Code
chocolate |> 
  mutate(世帯区分_name = 世帯区分_name |> 
           str_remove("(2000年~)$") |> 
           as_factor(),
         金額 = parse_number(金額)) |> 
  ggplot(aes(月次_name, 金額,
             fill = 世帯区分_name)) +
  geom_col(position = "dodge") +
  scale_x_discrete(NULL) +
  scale_y_continuous("1世帯あたり金額[円]",
                     labels = scales::label_comma()) +
  scale_fill_brewer("世帯区分",
                    palette = "Paired") +
  facet_wrap(~ 品目分類_name)