Rで自作関数:get_estat_list

関数名 : get_estat_list

get_estat_list() は、政府統計の総合窓口 e-Stat のAPI(統計表情報取得、getStatsList)から、統計表の一覧を取得する関数です。

目的の統計表の 統計表ID(statsDataId) を探すために利用します。

なお、e-Stat APIの利用には、アプリケーションIDが必要です。e-Statで利用登録をして取得してください。

また、次の補助関数も同じ環境で実行してください。

補助関数名役割
text_of() / attr_of()応答から文字列・属性を取り出す
call_estat()API呼び出しと、エラー時のメッセージ表示
table_inf_to_tibble()応答を表(tibble)に変換する

関数の引数は以下のとおりです。

引数設定
app_idアプリケーションID(必須)
search_word検索キーワード。表題やメタ情報に含まれる文字列を検索します。複数の語は AND、OR、NOT で結びます(例:東京 AND 人口、東京 OR 大阪)
stats_code政府統計コード。5桁は作成機関、8桁は政府統計コードで検索します
survey_years調査年月。"2020"(単年)、"202001"(単月)、"202001-202012"(範囲)の形式で指定します
open_years公開年月。survey_years と同じ形式です
stats_field統計分野。2桁は統計大分類、4桁は統計小分類で検索します
collect_area集計地域区分。1=全国、2=都道府県、3=市区町村
updated_date更新日付。"2026"(単年)、"202610"(単月)、"20261029"(単日)、"20261001-20261029"(範囲)の形式で指定します。指定した期間に更新された統計表に絞り込めます
limit1回のリクエストで取得する件数(既定は1000)
max_pages続きを取得する最大回数(既定は10)

指定しなかった検索条件は、リクエストに含まれません。条件を何も指定しない場合、すべての統計表が対象になり、limit × max_pages 件で打ち切られます。

戻り値は以下のとおりです。

1行が1つの統計表に当たるデータフレーム(tibble)になります。

列名内容
stats_data_id統計表ID
stats_code政府統計コード(8桁)
stat_name政府統計名
gov_org作成機関名
statistics_name提供統計名・提供分類名
table_no表番号
title表題
cycle提供周期(月次、年次など)
survey_date調査年月
open_date公開日
collect_area集計地域区分
main_category統計大分野名
sub_category統計小分野名
total_number絞り込み条件なしでの統計データの総件数。表の大きさの目安になります
updated_date統計データの最終更新日

該当する統計表がない場合は、「該当する統計表はありませんでした」と表示し、同じ列を持つ0行の表を返します。

Tip
  1. 結果が多すぎるとき

    • filter(cycle == "月次") や filter(grepl("全国", title)) で絞り込みます。検索条件を増やす場合は、AND で結んだり、stats_code や collect_area を指定したりすると、取得件数も減らせます。
  2. 同じ名前の表が複数あるとき

    • 基準年が違う表(2015年基準、2020年基準など)や、地域別・品目別の表が並びます。title、survey_date、updated_date を見て、目的の表を選んでください。
  3. 取得データの大きさを知りたいとき

    • total_number の列が、その表の全データ件数です。1回のデータ取得で一度に取れる件数には上限があるため、大きい表は絞り込み条件を付けて取得します。
Note
  1. 件数が limit を超える場合は、続きを自動で取得します。サーバー負荷軽減のため、1回ごとに1秒待機します。
  2. max_pages に達しても続きがある場合は、警告を表示して止まります。検索条件を絞るか、max_pages を増やしてください。
  3. 解説情報は取得しません。応答を小さくし、一覧の取得を速くするためです。
  4. APIがエラーを返した場合(アプリケーションIDの誤り、パラメータの値の誤りなど)は、結果コードとエラーメッセージを表示して止まります。
  5. APIに送るUser-Agentは関数内で固定しています。設定は不要です。

Rコード

library(dplyr)
library(httr2)

# 文字列、または「$」を持つ要素から文字列を取り出す
text_of <- function(z) {
  if (is.null(z)) {
    return(NA_character_)
  }
  if (is.list(z)) z <- z[["$"]]
  if (is.null(z)) NA_character_ else as.character(z)
}

# 属性(@で始まる名前)を取り出す
attr_of <- function(z, name) {
  if (is.list(z) && !is.null(z[[name]])) as.character(z[[name]]) else NA_character_
}

# e-Stat APIの呼び出し:エラー時は結果コードとメッセージを表示して停止する
call_estat <- function(api, params, root) {
  res <- request(paste0("https://api.e-stat.go.jp/rest/3.0/app/json/", api)) |>
    req_url_query(!!!params) |>
    req_user_agent("r-estat-client") |>
    req_retry(max_tries = 3) |>
    req_error(is_error = function(resp) FALSE) |>
    req_perform()
  body <- tryCatch(resp_body_json(res, check_type = FALSE), error = function(e) NULL)
  x <- body[[root]]
  if (is.null(x)) {
    stop(
      "e-Stat APIの応答を解釈できません(HTTP ", resp_status(res), "): ",
      substr(resp_body_string(res), 1, 300)
    )
  }
  status <- as.integer(x[["RESULT"]][["STATUS"]])
  if (status >= 100) {
    stop("e-Stat APIのエラー(結果コード ", status, "): ", x[["RESULT"]][["ERROR_MSG"]])
  }
  x
}

# 統計表情報(getStatsList)の応答を表にする
table_inf_to_tibble <- function(tbl) {
  col <- function(f) vapply(tbl, f, character(1))
  tibble(
    stats_data_id = col(function(z) attr_of(z, "@id")),
    stats_code = col(function(z) attr_of(z[["STAT_NAME"]], "@code")),
    stat_name = col(function(z) text_of(z[["STAT_NAME"]])),
    gov_org = col(function(z) text_of(z[["GOV_ORG"]])),
    statistics_name = col(function(z) text_of(z[["STATISTICS_NAME"]])),
    table_no = col(function(z) attr_of(z[["TITLE"]], "@no")),
    title = col(function(z) text_of(z[["TITLE"]])),
    cycle = col(function(z) text_of(z[["CYCLE"]])),
    survey_date = col(function(z) text_of(z[["SURVEY_DATE"]])),
    open_date = col(function(z) text_of(z[["OPEN_DATE"]])),
    collect_area = col(function(z) text_of(z[["COLLECT_AREA"]])),
    main_category = col(function(z) text_of(z[["MAIN_CATEGORY"]])),
    sub_category = col(function(z) text_of(z[["SUB_CATEGORY"]])),
    total_number = suppressWarnings(
      as.numeric(col(function(z) text_of(z[["OVERALL_TOTAL_NUMBER"]])))
    ),
    updated_date = col(function(z) text_of(z[["UPDATED_DATE"]]))
  )
}

# e-Stat API:統計表の一覧を取得(statsDataIdを探す) ---------------------------
get_estat_list <- function(app_id, search_word = NULL, stats_code = NULL,
                           survey_years = NULL, open_years = NULL,
                           stats_field = NULL, collect_area = NULL,
                           updated_date = NULL, limit = 1000, max_pages = 10) {
  if (!nzchar(app_id)) stop("御自身のアプリケーションIDを設定して下さい")
  opt <- list(
    searchWord = search_word, statsCode = stats_code,
    surveyYears = survey_years, openYears = open_years,
    statsField = stats_field, collectArea = collect_area,
    updatedDate = updated_date
  )
  p <- c(
    list(appId = app_id, lang = "J", limit = limit, explanationGetFlg = "N"),
    Filter(Negate(is.null), opt)
  )
  out <- list()
  for (i in seq_len(max_pages)) {
    x <- call_estat("getStatsList", p, "GET_STATS_LIST")
    inf <- x[["DATALIST_INF"]]
    tbl <- inf[["TABLE_INF"]]
    if (is.null(tbl)) break
    # 1件だけのときは配列ではなく単独の要素で返るため、リストに包む
    if (!is.null(tbl[["@id"]])) tbl <- list(tbl)
    out[[i]] <- table_inf_to_tibble(tbl)
    next_key <- inf[["RESULT_INF"]][["NEXT_KEY"]]
    if (is.null(next_key)) break
    if (i == max_pages) {
      warning("max_pagesに達しました。続きがあります(NEXT_KEY=", next_key, ")")
    }
    p$startPosition <- next_key
    Sys.sleep(1) # サーバー負荷軽減のため待機
  }
  if (length(out) == 0) {
    message("該当する統計表はありませんでした")
    return(table_inf_to_tibble(list()))
  }
  bind_rows(out)
}

利用例

引数 app_id には御自身のアプリケーションIDが事前に格納されているとします。

2025年基準の消費者物価指数

2025年基準の消費者物価指数の統計表IDを取得します。

# キーワードで探す
lst <- get_estat_list(app_id, search_word = "消費者物価指数 AND 2025年基準")

# 一覧を見やすく表示する
lst |>
  select(stats_data_id, title, cycle)
# A tibble: 1 × 3
  stats_data_id title                        cycle
  <chr>         <chr>                        <chr>
1 0004052037    消費者物価指数(2025年基準) -    

完全失業率

lst <- get_estat_list(app_id, search_word = "完全失業率")

lst %>%
  select(stats_data_id, title, cycle)
# A tibble: 33 × 3
   stats_data_id title                                                                     cycle 
   <chr>         <chr>                                                                     <chr> 
 1 0000010206    F 労働                                                                  年度次
 2 0000010206    F 労働                                                                  年度次
 3 0003005865    労働力人口比率,就業率及び完全失業率(2000年1月~)                       月次  
 4 0002060004    年齢階級別労働力人口比率,就業率及び完全失業率(1968年1月~)             月次  
 5 0002060006    世帯主との続き柄別労働力人口比率,就業率及び完全失業率(1985年1月~)     月次  
 6 0003005867    配偶関係,年齢階級別労働力人口比率,就業率及び完全失業率(2000年1月~)   月次  
 7 0003006300    世帯の種類別労働力人口比率,就業率及び完全失業率(2000年1月~)           月次  
 8 0003009146    労働力人口比率,就業率及び完全失業率(2000年1-3月期~)                   四半期
 9 0002060019    年齢階級別労働力人口比率,就業率及び完全失業率(1985年1-3月期~)         四半期
10 0002060021    世帯主との続き柄別労働力人口比率,就業率及び完全失業率(1985年1-3月期~) 四半期
# ℹ 23 more rows

以上です。