関数名 : 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"(範囲)の形式で指定します。指定した期間に更新された統計表に絞り込めます |
limit | 1回のリクエストで取得する件数(既定は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
- 結果が多すぎるとき
-
filter(cycle == "月次")やfilter(grepl("全国", title))で絞り込みます。検索条件を増やす場合は、ANDで結んだり、stats_codeやcollect_areaを指定したりすると、取得件数も減らせます。
-
- 同じ名前の表が複数あるとき
- 基準年が違う表(2015年基準、2020年基準など)や、地域別・品目別の表が並びます。
title、survey_date、updated_dateを見て、目的の表を選んでください。
- 基準年が違う表(2015年基準、2020年基準など)や、地域別・品目別の表が並びます。
- 取得データの大きさを知りたいとき
-
total_numberの列が、その表の全データ件数です。1回のデータ取得で一度に取れる件数には上限があるため、大きい表は絞り込み条件を付けて取得します。
-
Note
- 件数が
limitを超える場合は、続きを自動で取得します。サーバー負荷軽減のため、1回ごとに1秒待機します。 -
max_pagesに達しても続きがある場合は、警告を表示して止まります。検索条件を絞るか、max_pagesを増やしてください。 - 解説情報は取得しません。応答を小さくし、一覧の取得を速くするためです。
- APIがエラーを返した場合(アプリケーションIDの誤り、パラメータの値の誤りなど)は、結果コードとエラーメッセージを表示して止まります。
- 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以上です。
