本ポストはこちらの続きです。関数get_estat_listのコードはこちらで確認して下さい。

Rで自作関数:get_estat_list
関数名 : get_estat_listget_estat_list() は、政府統計の総合窓口 e-Stat のAPI(統計表情報取得、getStatsList)から、統計表の一覧を取得する関数です。目的の統計表の 統計表ID(stats...
関数名 : get_estat_meta
get_estat_meta() は、政府統計の総合窓口 e-Stat のAPI(メタ情報取得、getMetaInfo)から、指定した統計表のメタ情報を取得する関数です。
統計表にどのような項目・分類・地域・時点が含まれ、それぞれにどのコードが付いているかを、1つの表にまとめて返します。
APIを利用して統計表の内容(数値データ)を取得する getStatsData では、取得したい範囲をコードで絞り込みます。
その際、たとえば「総合」「全国」「前年同月比」のデータだけを取得するには、それぞれのコードを指定することになりますが、get_estat_meta() は、その コードを調べるための関数 です。
なお、e-Stat APIの利用には、アプリケーションIDが必要です。e-Statで利用登録をして取得してください。
また、補助関数attr_of()、call_estat() も同じ環境で実行してください。
関数の引数は以下のとおりです。
| 引数 | 内容 |
|---|---|
app_id | アプリケーションID(必須) |
stats_data_id | 統計表ID(必須)。10桁の文字列で、get_estat_list() の stats_data_id 列の値を渡します |
戻り値は以下のとおりの1行が、メタ情報を構成する1つの要素(項目、分類、地域、時点のどれか1つ)に当たるデータフレーム(tibble)です。
| 列名 | 内容 |
|---|---|
class_id | 事項の種類を表すID(下表) |
class_name | 事項の名称(例:「表章項目」「地域」) |
code | 要素のコード。getStatsData の絞り込みに指定する値 |
name | 要素の名称(例:「全国」「総合」) |
level | 階層レベル。階層のない事項は空になります |
unit | 単位。データがある要素のみ入り、ない場合は NA です |
class_id の種類は次のとおりです。
class_id | 事項 | getStatsData での絞り込み |
|---|---|---|
tab | 表章項目(何の値か。指数、前年同月比、世帯数など) | cdTab |
cat01 〜 cat15 | 分類事項(品目、年齢、産業など。表によって数が異なる) | cdCat01 〜 cdCat15 |
area | 地域(全国、都道府県など) | cdArea |
time | 時間軸(年、月、年度など) | cdTime |
どの class_id が含まれるかは、統計表によって異なります。
Tip
- 表章項目を確認する
-
class_id == "tab"の行を見ると、その表に含まれる数値の種類(指数、前月比、前年同月比など)がわかります。表章項目が複数ある表では、取得時にcdTabで指定しませんと、種類の異なる値が混在して返ってきます。
-
- コードを名称から探す
-
filter(grepl("総合", name))やfilter(name == "全国")のように、名称でコードを絞り込みます。
-
- 要素が多い事項に注意する
- 地域(市区町村まで含む表)や分類事項は、数千行になることがあります。
count(meta, class_id)で事項ごとの行数を確認してから、filter()で絞って見てください。
- 地域(市区町村まで含む表)や分類事項は、数千行になることがあります。
- 階層を使って絞り込む
-
levelを見ると階層の深さがわかります。getStatsDataでは、コードの代わりに階層レベルで絞り込むこともできます(lvCat01など)。
-
- 時間軸のコードの形式を確認する
-
class_id == "time"の行のcodeとnameを見ると、月次・年次などの時間コードの形式がわかります。
-
Note
- 取得は1回のリクエストで完了します。
- 解説情報は取得しません。応答を小さくするためです。
- 要素の親子関係(親コード)や追加情報は、戻り値に含めていません。
- APIがエラーを返した場合(アプリケーションIDの誤り、存在しない統計表IDなど)は、結果コードとエラーメッセージを表示して止まります。
- APIに送るUser-Agentは、関数内で固定しています。設定は不要です。
Rコード
library(dplyr)
library(httr2)
# 属性(@で始まる名前)を取り出す
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
}
# e-Stat API:統計表のメタ情報(表章項目・品目・地域などのコード一覧) ------------
get_estat_meta <- function(app_id, stats_data_id) {
if (!nzchar(app_id)) stop("環境変数 ESTAT_APP_ID が設定されていません")
x <- call_estat(
"getMetaInfo",
list(appId = app_id, statsDataId = stats_data_id, lang = "J", explanationGetFlg = "N"),
"GET_META_INFO"
)
objs <- x[["METADATA_INF"]][["CLASS_INF"]][["CLASS_OBJ"]]
if (!is.null(objs[["@id"]])) objs <- list(objs)
bind_rows(lapply(objs, function(o) {
items <- o[["CLASS"]]
if (!is.null(items[["@code"]])) items <- list(items)
tibble(
class_id = attr_of(o, "@id"),
class_name = attr_of(o, "@name"),
code = vapply(items, function(z) attr_of(z, "@code"), character(1)),
name = vapply(items, function(z) attr_of(z, "@name"), character(1)),
level = vapply(items, function(z) attr_of(z, "@level"), character(1)),
unit = vapply(items, function(z) attr_of(z, "@unit"), character(1))
)
}))
}利用例
引数 app_id には御自身のアプリケーションIDが事前に格納されているとします。
2025年基準の消費者物価指数のメタ情報を取得します。統計表IDは 0004052037 です。
# 表の中身(表章項目・地域・品目のコード)を確認する
meta <- get_estat_meta(app_id, "0004052037")
meta# A tibble: 1,660 × 6
class_id class_name code name level unit
<chr> <chr> <chr> <chr> <chr> <chr>
1 tab 表章項目 1 指数 "" <NA>
2 tab 表章項目 2 前月比・前年比・前年度比 "" %
3 tab 表章項目 3 前年同月比 "" %
4 cat01 2025年基準品目 0001 0001 総合 "1" <NA>
5 cat01 2025年基準品目 0002 0002 食料 "1" <NA>
6 cat01 2025年基準品目 0003 0003 穀類 "3" <NA>
7 cat01 2025年基準品目 0004 0004 米類 "5" <NA>
8 cat01 2025年基準品目 1001 1001 うるち米A "6" <NA>
9 cat01 2025年基準品目 1002 1002 うるち米B "6" <NA>
10 cat01 2025年基準品目 0005 0005 パン "5" <NA>
# ℹ 1,650 more rows以上です。
