Rで自作関数:get_estat_meta

本ポストはこちらの続きです。関数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

以上です。