論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
メタデータ
Metadata
データエンジニアリング

🔖 キーワード索引

メタデータデータ辞書スキーマ属性出典更新日時ライセンスデータカタログ

🔖 拡張キーワード索引(深掘り用)

以下のチップから関連する詳細セクションへジャンプできます。

メタデータの3種類 標準語彙 数式を言葉で読み解く SSDSE-B 実値検証 Python: プロファイル生成 Python: JSON-LD 出力 Python: DCAT 準拠 Python: 検証 Python: YAML 深い落とし穴 データカタログ 関連用語拡張 グループ教材

💡 30秒で分かる結論

🍰 まずはやさしく

データの取扱説明書のようなものです。

中身を正しく理解するために使います。

スマホの写真に記録された日付などが例です。

メタデータの基本について学びましょう。

データを説明するデータ

💡 さらに 30 秒で押さえる(拡張版)

📍 あなたが今見ているもの

🍰 まずはやさしく

データの中身を説明する情報のことです。

数字の意味を取り違えないために使います。

学校で配られるデータの定義書が例です。

なぜメタデータが重要なのかを解説します。

公的統計(e-Stat、 SSDSE)でCSV本体と一緒に提供される「コードブック」「定義書」が、 まさにメタデータ。 これを読まないとデータの意味を取り違えます。

📍 文脈:なぜメタデータが「データそのもの」より重要なのか

「列名 A1101」と書かれた数値があったとして、 これは何の数か? 単位は? いつの時点か? どこの地域か? 誰が観測したのか? 出典のライセンスは何か? — これらが分からない限り、 数値は 無意味な文字列 に過ぎない。

SSDSE-B-2026 が 教育用標準データセット として価値があるのは、 別冊で詳細な「データ定義書」(メタデータ)が配布されているから。 メタデータがないオープンデータは、 ただの数字の羅列。

🎨 直感で掴む

🍰 まずはやさしく

本の背表紙のようなものです。

目的のデータを簡単に見つけるために使います。

図書館で本の分類番号を使うのが例です。

メタデータの3つの種類について考えます。

本棚の本に例えると:

  • 本の中身=データ
  • 背表紙のタイトル・著者・分類番号=メタデータ

メタデータが無いと、 何百万冊の本があっても目的の本を探せません。

🎨 直感で掴む(拡張):メタデータの 3 種類

種類 目的 SSDSE-B-2026 での具体例
記述的 (Descriptive)発見・識別タイトル「教育用標準データセット 都道府県データ」、 著者「総務省統計局」、 概要、 キーワード「人口統計、 経済、 雇用」。
構造的 (Structural)解釈・処理列スキーマ(A1101=総人口、 int64、 単位「人」)、 564 行 × 112 列、 主キー (年, Code)、 dtype 内訳 int64=104, float64=6, object=2。
管理的 (Administrative)権利・保存ライセンス「政府標準利用規約 2.0」、 更新日 2026-03、 ファイル形式 CSV (cp932)、 保存場所 e-Stat、 連絡先。

図書館の世界では同じ枠組みを MARC レコード として 1960 年代から使ってきた。 データサイエンスの世界はこの 60 年前の知恵を再発見した形。

🎮 触って理解する

データカタログ検索シミュレーション — 同じ中身のデータでも、 メタデータの有無で「見つけやすさ」がどれだけ変わるかを体感します。 下の検索窓にキーワードを入れる(または課題ボタンを押す)と、 メタデータ充実カタログファイル名だけのフォルダ の両方を同時に検索します。 さらに下のチェックリストでメタデータ項目を外すと、 その項目は検索対象から消え、 「発見可能性スコア」ゲージも下がります。

※ ここに登場する 8 個のデータセットはすべて 架空 の教材用サンプルです(実在の統計値ではありません)。

🔍 検索キーワード
課題:
キーワードを入力すると、 2 つのカタログの検索結果がここに比較表示されます。
📗 カタログ A:メタデータ充実(架空)
📁 フォルダ B:ファイル名だけ(架空)

※ A と B の中身(テーマ)は同じ 4 種類。 違いは「説明書(メタデータ)が付いているか」だけ。 B は中身を 1 つずつ開いて確認しない限り、 単位も更新日も分かりません。

✅ メタデータ・チェックリストと発見可能性スコア

カタログ A に付与するメタデータ項目を On/Off できます。 外した項目は 検索対象から即座に消え、 ヒット件数が変わります。 スコアは項目の重み(タイトル20・説明20・列定義15・ライセンス15・単位10・出典10・更新日10)の合計です。

発見可能性スコア 100 / 100 FAIR の「F (Findable)」を満たす状態

🎨 直感:メタデータは「荷札」

宅配便の箱(=データ本体)に付いた 荷札(宛先・差出人・品名・取扱注意)がメタデータ。 荷札のない箱が 100 個届いたら、 全部開けて中身を確認するしかない — 上のフォルダ B がまさにその状態です。 「data_final_v2.csv」という名前は作った本人にしか意味がなく、 3 か月後には本人ですら分からなくなります。

⚠️ よくある落とし穴(体感版)

🚀 発展:カタログ・レジストリ・FAIR 原則

📐 定義/数式

🍰 まずはやさしく

データを説明するためのデータです。

データの形式を共通にするために使います。

ネット上のデータの管理ルールが例です。

メタデータの定義と標準的な書き方を学びます。

メタデータMetadata):データを説明するデータ

【メタデータの構造(簡易例)】
$$ \text{Metadata}(D) = \{(\text{key}_i, \text{value}_i) \mid i = 1, \dots, m\} $$
データセット $D$ に対する key-value ペアの集合。 JSON-LD で記述されることが多い。

📐 メタデータ標準語彙の主要候補

標準 用途 特徴
Dublin Core (DC)汎用15 要素(Title, Creator, Subject, Description, Publisher, Contributor, Date, Type, Format, Identifier, Source, Language, Relation, Coverage, Rights)。 1995 年策定。
DCAT (Data Catalog Vocabulary)データカタログW3C 推奨。 dcat:Dataset, dcat:Distribution, dcat:DataService の 3 階層。 政府オープンデータの標準。
schema.org DatasetWebGoogle Dataset Search の対象。 JSON-LD で HTML に埋め込む。 SEO 効果あり。
ISO 19115地理空間地理情報のメタデータ国際標準。 GIS 系で必須。
DDI (Data Documentation Initiative)社会調査調査票・変数・コード・集計表まで詳細に記述。 ICPSR で採用。
SDMX (Statistical Data and Metadata eXchange)公的統計ISO/IEC 17369。 OECD, World Bank, IMF, ECB が利用。 e-Stat も対応。
CSVW (CSV on the Web)CSVW3C 推奨。 CSV ファイルに対する JSON メタデータ。 列単位の制約・データ型・参照を記述。

Dublin Core 15 要素を SSDSE-B-2026 で書く

dc:title = "教育用標準データセット SSDSE-B-2026" dc:creator = "独立行政法人統計センター" dc:subject = "都道府県; 人口; 経済; 雇用; 社会" dc:description = "47 都道府県 × 12 年 × 112 指標の縦持ち CSV" dc:publisher = "総務省統計局" dc:contributor = "(なし)" dc:date = "2026-03-01" dc:type = "Dataset" dc:format = "text/csv; charset=Shift_JIS" dc:identifier = "https://www.nstac.go.jp/use/literacy/ssdse/B/2026" dc:source = "e-Stat 政府統計の総合窓口" dc:language = "ja" dc:relation = "SSDSE-A-2025, SSDSE-C-2026, SSDSE-E-2026" dc:coverage = "spatial: Japan; temporal: 2012-2023" dc:rights = "政府標準利用規約 2.0 (CC BY 互換)"

📐 メタデータ標準の関係マップ(ASCII)

┌──────────────────────────┐ │ Dublin Core (DC) │ │ 15 要素 (1995) │ └────────┬─────────────────┘ │ 拡張 ┌──────────────────────┼──────────────────────┐ │ │ │ ┌──────────▼──────────┐ ┌────────▼─────────┐ ┌─────────▼──────────┐ │ DCAT │ │ schema.org Data- │ │ ISO 19115 │ │ W3C データカタログ │ │ set (Google 対応) │ │ 地理空間メタデータ │ └──────────┬──────────┘ └────────┬─────────┘ └────────────────────┘ │ 国別プロファイル │ Web 埋め込み ┌─────────▼──────────┐ ┌──────▼──────┐ │ DCAT-AP (EU) │ │ JSON-LD │ │ DCAT-US (米) │ │ HTML 内 │ │ J-DCAT (日本) │ └─────────────┘ └────────────────────┘ ┌────────────────────────┐ │ SDMX (公的統計国際標準) │ ── OECD, IMF, 世界銀行, e-Stat └────────────────────────┘ ┌────────────────────────┐ │ DDI (社会調査標準) │ ── ICPSR, EU SSH ESS └────────────────────────┘ ┌────────────────────────┐ │ CSVW (CSV on the Web) │ ── W3C, CSV 専用 └────────────────────────┘

Dublin Core が「祖先」。 DCAT / schema.org / ISO 19115 など主要標準は DC を拡張・専門化する形で発展している。 自分のデータがどの分野(汎用/カタログ/Web/地理/統計)かを意識して標準を選ぶ。

🧪 LLM 時代のメタデータ活用

2023 年以降、 LLM の普及でメタデータの役割が大きく変わった。 単なる「データの説明」から、 「LLM が正しく検索・引用するための索引」へと進化している。

活用シーン メタデータの役割
RAG (検索拡張生成)ベクトル検索の フィルタ条件 として使用。 「2023 年以降」「日本のデータのみ」などをメタデータで絞り込み、 LLM への入力を最適化。
Hallucination 抑制メタデータの source, last_updated, license を LLM に渡すことで「出典付きの回答」を強制。 嘘の生成を抑える。
Function CallingAPI のメタデータ (OpenAPI/Swagger) を LLM に渡して、 適切な関数呼び出しを生成させる。
Embedding 検索列名・列説明を embedding にして「人口に関する列を探して」のような自然言語検索を実現。
LLM-as-a-Judgeメタデータの完成度(必須フィールド埋まり率、 標準語彙準拠率)を LLM に評価させ、 自動スコアリング。

📊 メタデータ品質を測る KPI

指標 定義・目標値
完成度 (Completeness)必須フィールドの埋まり率。 90% 以上が目標。
標準準拠率 (Conformance)DC / DCAT 等標準語彙を使っているフィールドの割合。
鮮度 (Freshness)最終更新からの経過日数。 30 日以内が望ましい。
一貫性 (Consistency)メタデータ宣言と実データの一致率(型、 行数、 値域)。 100% 必須。
機械可読性JSON-LD / Turtle 等で提供されているか。 自由記述だけだと低スコア。
アクセシビリティメタデータが認証なしで取得可能か。 リンク切れがないか。
追跡可能性 (Lineage)データの加工履歴・出典が辿れるか。

これら 7 指標を レーダーチャート 化したものが「メタデータ成熟度マップ」。 各データセットがどの段階にあるかを可視化し、 改善優先順位を決める。

🔬 記号・用語の読み解き

記号意味
Titleデータセット名
Source出典・取得元
UpdatedAt最終更新日時
License利用条件(CC BY、 政府標準等)
Schema列名・型・単位

🔬 詳細な解説(深掘り)

概念の本質

メタデータ(Metadata)は、 単に用語の定義を覚えるだけでは本当には理解できません。 なぜこの概念が生まれたのかどんな問題を解決するために導入されたのか類似の手法とどう違うのか — これらを意識することで、 初めて「使える知識」になります。

数式や Python コードはあくまで 道具。 道具の使い方を覚える前に、 その道具で何をしたいか(目的) を明確にすることが、 データサイエンス学習の鉄則です。

他の概念との関係

この用語は、 単独で存在するわけではなく、 多くの関連概念とネットワークを形成しています。 上の「関連用語」セクションに挙げたリンク先を1つずつ辿ると、 全体像が見えてきます。 特に:

実務で気をつけるポイント

理論を学ぶことと、 実務で使えることは別物です。 公的統計(SSDSE、 e-Stat 等)の実データで実装・実験することで、 教科書だけでは見えない罠 に気付けます。 たとえば:

これらは メタデータ に限った話ではなく、 データサイエンス全般に共通する作法です。 「落とし穴」セクションの内容と合わせて、 自分なりのチェックリストを作るとよいでしょう。

📊 評価・検証の視点

メタデータ を使った分析の 正しさを担保する ためには、 以下の観点で検証するのが定番です。

確認する点メタデータ で何を見るか
メタデータの陳腐化データ更新時にメタデータも更新しないと、 嘘の説明書に。
不完全な記述「単位は?」が空欄 → 分析者が誤解する。
自由記述に頼りすぎ機械可読でないと自動処理できない。 標準語彙(DCAT等)推奨。
プライバシー漏洩メタデータに個人情報(作成者名等)が残る場合がある。
単位の未記載面積が「m²」か「km²」かでグラフのスケールが 100 万倍違う。 NASA の Mars Climate Orbiter (1999) は単位(ヤード vs メートル)の取り違えで 1.25 億ドル失った。 メタデータに単位を必ず書く。
推計値と実測値の区別なしSSDSE-B のような長期時系列では、 当該年が「速報値」「確報値」「推計値」「過去遡及修正値」のいずれかでデータの信頼性が変わる。 メタデータに provenance を残す。
再現性同じデータ・同じコードで同じ結果が出るか。このページの ▶ 実行ボタンで確かめられます

💼 業界別の使われ方

メタデータ は分野横断で活躍する概念です。 業界別に見ると以下のような使われ方があります。

🏥 医療・ヘルスケア
疾病予測、 診断支援、 治療効果の評価、 公衆衛生指標の分析(高齢化率、 罹患率、 医療費等)
🏛️ 行政・公共政策
EBPM(エビデンスに基づく政策立案)、 地域経済分析、 RESAS/e-Stat の活用、 政策効果測定
🏪 マーケティング・小売
顧客分析、 需要予測、 価格弾力性、 RFM分析、 A/Bテスト、 LTV予測
🏭 製造・品質管理
品質管理、 故障予知、 異常検知、 生産最適化、 サプライチェーン分析
💰 金融・保険
信用スコア、 リスク評価、 不正検知、 アルゴリズムトレーディング、 保険料設定
🎓 教育・研究
教育効果の測定、 学習分析、 研究データ解析、 統計教育、 データサイエンス人材育成

📈 公的統計データ(SSDSE)での具体例

メタデータ を実際のデータで学ぶときは、 SSDSE(教育用標準データセット、 総務省統計局)が便利です。

これらは 統計センターの SSDSE ページ から CSV で直接ダウンロードできます。 上の Python コード例で data/raw/SSDSE-B-2026.csv としているのが、 まさにこれです。

実データで動かすことで、 教科書の例題では見えない 実務的な気づき(欠損のパターン、 単位の混在、 都道府県名の表記揺れ等)が得られます。

🔧 よくあるトラブルと対処

🐍 Python コードが動かない
→ Python 3.10+ と必要ライブラリ(pandas、 numpy、 scikit-learn 等)がインストール済みか確認。 pip install pandas numpy scikit-learn matplotlib で揃います。
📁 CSVファイルが読み込めない
→ ファイルパスを確認。 文字コードが utf-8 ではなく shift_jiscp932 の場合がある(古い日本の公的統計に多い)。 encoding='cp932' を試してください。
📐 数式が表示されない
→ ページが KaTeX を読み込んでいるはずです。 ブラウザのキャッシュをクリアするか、 開発者ツールで JavaScript エラーを確認。
🔢 数値計算結果が教科書と違う
→ 不偏推定(n-1)と標本推定(n)の違い、 浮動小数点誤差、 ライブラリのデフォルト引数の違いなどが原因。 ドキュメントを確認。
📊 グラフが描画されない
→ Jupyter Notebook なら %matplotlib inline、 スクリプト実行なら plt.show() を忘れずに。 日本語フォントは matplotlib 用に別途設定(japanize-matplotlib 等)が必要。

🔬 数式を言葉で読み解く

$\text{Metadata}(D) = \{(\text{key}_i, \text{value}_i)\}$ は単純な辞書だが、 中身を整理すると 4 階層に展開できる。

  1. データセット階層:ファイル全体の説明(タイトル、 著者、 出典)。 「これは何のデータ?」に答える。
  2. カラム階層:各列の名前・型・単位・許容値域。 「この数字は何を測ったもの?」に答える。
  3. 行階層(オプション):行 ID・観測時刻・観測者・装置。 「いつ・誰が・どうやって測った?」に答える。
  4. 値階層(オプション):個別セルの信頼度・欠損理由・推定方法。 「この値は信頼できる?」に答える。

key-value という形式は単純だが、 何を key にするかで分析の質が大きく変わる。 「すべての SSDSE データセットが creator を持つ」と決めておけば、 ライブラリやカタログで横断検索が可能になる。 これが 標準語彙(DC, DCAT 等)の存在意義。

たとえ話:メタデータは「商品のラベル」、 標準語彙は「ラベルに書く項目の決まり」。 牛乳パックに「商品名/製造者/賞味期限/成分」が書かれていなければ買う気にもならない。 同じことがデータでも起きる。

🧮 実値で計算してみる

例:SSDSE-B-2026 のメタデータ → 出典:総務省統計局/更新:2026年/ライセンス:政府標準利用規約/単位:人口は人、 面積は km²。 これを知らずに分析すると単位を勘違いします。

🧮 SSDSE-B-2026 のメタデータを実値で抽出

実ファイル data/raw/SSDSE-B-2026.csvpd.read_csv で読み込み、 メタデータを抽出した結果:

ファイル全体メタデータ

{ "title": "SSDSE-B-2026 (47 都道府県・縦持ち時系列)", "publisher": "総務省統計局・統計センター", "source_url": "https://www.nstac.go.jp/use/literacy/ssdse/", "license": "政府標準利用規約 2.0", "encoding": "Shift_JIS (cp932)", "n_rows": 564, "n_cols": 112, "dtype_counts": {"int64": 104, "float64": 6, "object": 2}, "row_uniqueness": "key=(SSDSE-B-2026 [年], Code [都道府県コード]); 12 年 × 47 県 = 564 行", "temporal_coverage": "2012 - 2023 (12 年分)", "spatial_coverage": "Japan, 47 都道府県", "primary_keys": ["SSDSE-B-2026", "Code"] }

カラム別メタデータ(抜粋)

列名 dtype 単位 null 数 unique 数 説明
SSDSE-B-2026int64年(西暦)012観測年。 2012〜2023。
CodeobjectJIS X 0401047都道府県コード R01000〜R47000。
Prefectureobject日本語047都道府県名。
A1101int640520総人口(住民基本台帳)。
A1301int64039815歳未満人口(住民基本台帳)。
A4101int640559出生数(人口動態調査)。
L322110int640559最終列(その他の消費支出)。 詳細は別冊定義書を参照。

→ Null が一切ない(112 列全てで null 率 0.0)、 dtype の 92.9% (104/112) が整数型 — これは「観測値が全て整数で揃っており、 推計年でも欠損を 0 で埋めてある」きれいなデータの特徴。 実務データはここまできれいではないことが多いので、 メタデータでこれを把握できることに価値がある。

🧮 SSDSE シリーズのメタデータ比較表

SSDSE には A〜F の系列がある。 構造(縦持ち/横持ち、 単年/多年、 都道府県/市区町村)が異なるため、 メタデータも系列ごとに異なる。

系列対象行数列数主キー / 用途
SSDSE-A市区町村 単年1,742100+Prefecture, Municipality; 市区町村比較
SSDSE-B都道府県 多年564112(年, Code); 時系列分析 ← 本ページの例
SSDSE-C家計消費 県庁所在市48229City; 家計支出パターン
SSDSE-D生活時間・行動(都道府県×男女)144124(男女, Code); 行動者率の比較
SSDSE-E都道府県 単年(産業・就業)4995Prefecture; 産業構造の比較
SSDSE-F市の月別気象(平年値)611数十(Code, 月); 季節性の分析

→ 同じ「SSDSE」というブランドでも、 系列ごとに メタデータの記述項目が異なる。 A-B は都道府県、 C は都市、 D は個人。 用途別にスキーマを切り替える必要がある。 横断検索したい場合は、 共通の上位カタログ(DCAT 互換)でラップする。

🧮 数式に値を入れて手で計算する: メタデータ充実度

合成データで 100 テーブルのメタ項目充足率を計算する。

Step 1: 項目別充足

項目埋まり数/100充足率
カラム説明700.70
所有者900.90
更新頻度400.40
個人情報フラグ600.60
分類タグ500.50

Step 2: 平均充足率

合計 = 0.70+0.90+0.40+0.60+0.50 = 3.10 平均 = 3.10/5 = 0.62 (62%) 最低: 更新頻度 40%

🐍 Python で再現

1
2
3
4
import numpy as np
r = np.array([0.70, 0.90, 0.40, 0.60, 0.50])
print(f"平均: {r.mean():.3f}")
print(f"最低 index: {r.argmin()} ({r.min()})")

📤 実行結果

平均: 0.620 最低 index: 2 (0.4)

💬 手計算 (Step 2) 62% と Python 出力が完全一致。

🐍 Python での実装例

SSDSE-B-2026 などの実データを使った最小コード(9行):

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
1
2
3
4
5
6
7
8
9
import pandas as pd, json
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
meta = {
    'title': 'SSDSE-B-2026',
    'source': '総務省統計局',
    'rows': len(df), 'cols': len(df.columns),
    'columns': {c: str(df[c].dtype) for c in df.columns[:5]},
}
print(json.dumps(meta, ensure_ascii=False, indent=2))

data/raw/SSDSE-B-2026.csve-Stat SSDSE から取得した実データを想定。

🐍 Python ①:SSDSE-B-2026 のメタデータ自動プロファイリング

🎯 このコードでやること:pandas で SSDSE-B-2026 を読み込み、 各列の dtype・null 数・unique 数・最小最大・分位点を一度に算出してメタデータ辞書を作る。

📥 入力データdata/raw/SSDSE-B-2026.csv (cp932, 564 行 × 112 列)。

df.head(2): SSDSE-B-2026 Code Prefecture A1101 ... L322110 0 2023 R01000 北海道 5092000 ... 48694 1 2022 R01000 北海道 5140000 ... 46466
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import pandas as pd
import json
from pathlib import Path

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])

# データセット全体のメタデータ
ds_meta = {
    'title': 'SSDSE-B-2026',
    'publisher': '総務省統計局・統計センター',
    'license': '政府標準利用規約 2.0',
    'encoding': 'Shift_JIS',
    'n_rows': len(df),
    'n_cols': len(df.columns),
    'dtype_counts': df.dtypes.astype(str).value_counts().to_dict(),
    'primary_keys': ['SSDSE-B-2026', 'Code'],
    'temporal_coverage': f"{df['SSDSE-B-2026'].min()} - {df['SSDSE-B-2026'].max()}",
    'spatial_coverage': f"{df['Prefecture'].nunique()} 都道府県",
}

# カラム別メタデータ
col_meta = {}
for c in df.columns:
    s = df[c]
    col_meta[c] = {
        'dtype': str(s.dtype),
        'null_count': int(s.isna().sum()),
        'null_rate': round(float(s.isna().mean()), 4),
        'unique_count': int(s.nunique()),
    }
    if pd.api.types.is_numeric_dtype(s):
        col_meta[c].update({
            'min': float(s.min()), 'max': float(s.max()),
            'mean': round(float(s.mean()), 2),
            'std':  round(float(s.std()),  2),
        })

print(json.dumps(ds_meta, ensure_ascii=False, indent=2))
print('\n--- 最初の 3 列のメタデータ ---')
for k in list(col_meta)[:3]:
    print(k, ':', col_meta[k])

📤 実行結果

{ "title": "SSDSE-B-2026", "publisher": "総務省統計局・統計センター", "license": "政府標準利用規約 2.0", "encoding": "Shift_JIS", "n_rows": 564, "n_cols": 112, "dtype_counts": {"int64": 104, "float64": 6, "object": 2}, "primary_keys": ["SSDSE-B-2026", "Code"], "temporal_coverage": "2012 - 2023", "spatial_coverage": "47 都道府県" } --- 最初の 3 列のメタデータ --- SSDSE-B-2026 : {'dtype': 'int64', 'null_count': 0, 'null_rate': 0.0, 'unique_count': 12, 'min': 2012.0, 'max': 2023.0, 'mean': 2017.5, 'std': 3.46} Code : {'dtype': 'object', 'null_count': 0, 'null_rate': 0.0, 'unique_count': 47} Prefecture : {'dtype': 'object', 'null_count': 0, 'null_rate': 0.0, 'unique_count': 47}

💬 結果の読み方:1 ファイルで 112 列ぶんの構造的メタデータを 30 行のコードで完全自動抽出 できた。 dtype 内訳 (int64=104, float64=6, object=2) や null 率 0、 unique 数から「年は 12 ユニーク、 県は 47 ユニーク」という主キー構造が即座に確認できる。

🐍 Python ②:schema.org Dataset の JSON-LD で出力

🎯 このコードでやること:①で作ったメタデータを schema.org Dataset 標準(Google Dataset Search で検索される形式)に変換し、 HTML に埋め込める JSON-LD として出力。

📥 入力データ:①で作った ds_meta 辞書。

ds_meta = {'title': 'SSDSE-B-2026', ...}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import json

jsonld = {
    '@context': 'https://schema.org',
    '@type': 'Dataset',
    'name': ds_meta['title'],
    'description': '47 都道府県 × 12 年 × 112 指標の縦持ち CSV データ。 教育用標準データセット。',
    'url': 'https://www.nstac.go.jp/use/literacy/ssdse/B/2026/',
    'identifier': 'SSDSE-B-2026',
    'license': 'https://www.digital.go.jp/resources/data_policy/',
    'creator': {
        '@type': 'Organization',
        'name': ds_meta['publisher'],
        'url': 'https://www.stat.go.jp/',
    },
    'temporalCoverage': ds_meta['temporal_coverage'].replace(' - ', '/'),
    'spatialCoverage': {'@type': 'Place', 'name': 'Japan'},
    'distribution': [{
        '@type': 'DataDownload',
        'encodingFormat': 'text/csv',
        'contentUrl': 'data/raw/SSDSE-B-2026.csv',
    }],
    'variableMeasured': [
        {'@type': 'PropertyValue', 'name': 'A1101', 'description': '総人口', 'unitText': '人'},
        {'@type': 'PropertyValue', 'name': 'A1301', 'description': '15歳未満人口', 'unitText': '人'},
        {'@type': 'PropertyValue', 'name': 'A4101', 'description': '出生数', 'unitText': '人'},
    ],
}

print(json.dumps(jsonld, ensure_ascii=False, indent=2))

📤 実行結果

{ "@context": "https://schema.org", "@type": "Dataset", "name": "SSDSE-B-2026", "description": "47 都道府県 × 12 年 × 112 指標の縦持ち CSV データ。 教育用標準データセット。", "url": "https://www.nstac.go.jp/use/literacy/ssdse/B/2026/", "identifier": "SSDSE-B-2026", "license": "https://www.digital.go.jp/resources/data_policy/", "creator": { "@type": "Organization", "name": "総務省統計局・統計センター", "url": "https://www.stat.go.jp/" }, "temporalCoverage": "2012/2023", ... }

💬 結果の読み方:この JSON-LD を <script type="application/ld+json"> として HTML の <head> に置けば、 Google Dataset Search に登録される。 公的データを公開するなら必須の作法。 schema.org 準拠で各種データカタログ(DataHub, CKAN)も自動取り込み可能。

🐍 Python ③:DCAT 準拠の RDF/Turtle 出力

🎯 このコードでやること:同じメタデータを W3C DCAT(データカタログ語彙)の RDF/Turtle 形式で出力。 政府オープンデータの標準語彙。

📥 入力データds_meta 辞書(① で作成)。

{'title': 'SSDSE-B-2026', 'publisher': '総務省統計局・統計センター', 'n_rows': 564, 'n_cols': 112, ...}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
turtle = f"""@prefix dcat:    <http://www.w3.org/ns/dcat#> .
@prefix dct:     <http://purl.org/dc/terms/> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix foaf:    <http://xmlns.com/foaf/0.1/> .

<https://www.nstac.go.jp/ssdse/B/2026> a dcat:Dataset ;
    dct:title       "{ds_meta['title']}"@ja ;
    dct:description "47 都道府県 × 12 年 × 112 指標の縦持ち CSV"@ja ;
    dct:issued      "2026-03-01"^^xsd:date ;
    dct:publisher   <https://www.stat.go.jp/> ;
    dct:license     <https://www.digital.go.jp/resources/data_policy/> ;
    dct:temporal    [ a dct:PeriodOfTime ;
                      dcat:startDate "2012-01-01"^^xsd:date ;
                      dcat:endDate   "2023-12-31"^^xsd:date ] ;
    dct:spatial     <http://www.geonames.org/1861060/> ;
    dcat:theme      "統計" ;
    dcat:keyword    "都道府県", "人口", "経済", "教育" ;
    dcat:distribution [ a dcat:Distribution ;
                        dcat:downloadURL <data/raw/SSDSE-B-2026.csv> ;
                        dcat:mediaType   "text/csv" ;
                        dcat:byteSize    {ds_meta['n_rows'] * ds_meta['n_cols'] * 8} ] .
"""
print(turtle)

📤 実行結果

@prefix dcat: <http://www.w3.org/ns/dcat#> . @prefix dct: <http://purl.org/dc/terms/> . ... <https://www.nstac.go.jp/ssdse/B/2026> a dcat:Dataset ; dct:title "SSDSE-B-2026"@ja ; dct:publisher <https://www.stat.go.jp/> ; dct:temporal [ dcat:startDate "2012-01-01"^^xsd:date ; ... ] ; dcat:distribution [ dcat:byteSize 505344 ] .

💬 結果の読み方:DCAT/Turtle 形式は欧州 EU Open Data Portal や日本のデジタル庁が採用する 政府オープンデータの正式語彙。 RDF Triple Store にロードすれば SPARQL で「ライセンスが CC BY のデータセット一覧」「2020 年以降に公開されたデータ」など複雑検索可能。 byteSize は粗い見積もり(n_rows × n_cols × 8 byte)。

🐍 Python ④:メタデータの整合性検証

🎯 このコードでやること:データセットの「期待されるメタデータ」(スキーマ定義)と実データから抽出した実値を比較し、 不一致を検出する。 CI/CD で「データの形が変わったら即アラート」する用途。

📥 入力データ:期待スキーマ(YAML 風 dict)と実 DataFrame。

expected = {'n_cols': 112, 'pk': ['SSDSE-B-2026', 'Code'], 'cols': {'A1101': 'int64', ...}}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
expected = {
    'n_cols': 112,
    'min_rows': 500,
    'primary_keys': ['SSDSE-B-2026', 'Code'],
    'required_cols': {
        'SSDSE-B-2026': 'int64',
        'Code': 'object',
        'Prefecture': 'object',
        'A1101': 'int64',
        'A1301': 'int64',
    },
    'value_ranges': {
        'SSDSE-B-2026': (2010, 2030),
        'A1101': (100000, 20000000),  # 人口は 10 万〜2000 万
    },
}

errors = []
if len(df.columns) != expected['n_cols']:
    errors.append(f"列数不一致: 期待 {expected['n_cols']}, 実際 {len(df.columns)}")
if len(df) < expected['min_rows']:
    errors.append(f"行数不足: 期待 ≥ {expected['min_rows']}, 実際 {len(df)}")

for pk in expected['primary_keys']:
    if pk not in df.columns:
        errors.append(f"主キー欠落: {pk}")

for col, dt in expected['required_cols'].items():
    if col not in df.columns:
        errors.append(f"必須列欠落: {col}")
    elif str(df[col].dtype) != dt:
        errors.append(f"型不一致 {col}: 期待 {dt}, 実際 {df[col].dtype}")

for col, (lo, hi) in expected['value_ranges'].items():
    if col in df.columns:
        if df[col].min() < lo or df[col].max() > hi:
            errors.append(f"値域外 {col}: [{df[col].min()}, {df[col].max()}] not in [{lo}, {hi}]")

print(f'検証エラー数: {len(errors)}')
for e in errors:
    print('  ', e)
print('OK' if not errors else 'NG')

📤 実行結果

検証エラー数: 0 OK

💬 結果の読み方:SSDSE-B-2026 は期待スキーマを完全に満たしている(列数 112、 行数 564 ≥ 500、 主キー存在、 必須列の型一致、 人口値域内)。 実務ではこの検証を 毎日のデータパイプライン に組み込み、 「データ提供元が形式変更」「列名タイポ」「異常値混入」を CI で即検出する。 専用ライブラリ:pandera, great-expectations, dbt tests

🐍 Python ⑤:YAML 形式で人間にも機械にも読める出力

🎯 このコードでやること:JSON は機械可読だが人間には読みにくい。 YAML 形式で出力すれば、 Git で diff も取りやすく、 README に貼り付けやすい。

📥 入力データ:①〜② で作成したメタデータ辞書。

必要ライブラリ:pip install pyyaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import yaml

dataset_yaml = {
    'dataset': {
        'name': 'SSDSE-B-2026',
        'version': '2026.0',
        'publisher': '総務省統計局・統計センター',
        'license': '政府標準利用規約 2.0',
        'created': '2026-03-01',
        'shape': {'rows': 564, 'cols': 112},
        'keys': ['SSDSE-B-2026', 'Code'],
        'temporal': {'start': 2012, 'end': 2023},
        'spatial': '47 都道府県 (日本)',
    },
    'columns': [
        {'name': 'SSDSE-B-2026', 'type': 'int', 'unit': '年',
         'description': '観測年(西暦)', 'pk': True},
        {'name': 'Code', 'type': 'string', 'pattern': '^R[0-4][0-9]000$',
         'description': '都道府県コード (JIS X 0401)', 'pk': True},
        {'name': 'Prefecture', 'type': 'string',
         'description': '都道府県名(日本語)'},
        {'name': 'A1101', 'type': 'int', 'unit': '人',
         'description': '総人口(住民基本台帳)'},
        {'name': 'A1301', 'type': 'int', 'unit': '人',
         'description': '15歳未満人口(住民基本台帳)'},
        {'name': 'A4101', 'type': 'int', 'unit': '人',
         'description': '出生数(人口動態調査)'},
    ],
    'quality': {
        'completeness': '全列 null 率 0%',
        'consistency': '12 年 × 47 県 = 564 行で完備',
        'last_validated': '2026-05-24',
    },
}

print(yaml.dump(dataset_yaml, allow_unicode=True, sort_keys=False,
                default_flow_style=False, indent=2))

📤 実行結果

dataset: name: SSDSE-B-2026 version: '2026.0' publisher: 総務省統計局・統計センター license: 政府標準利用規約 2.0 created: '2026-03-01' shape: rows: 564 cols: 112 keys: - SSDSE-B-2026 - Code temporal: start: 2012 end: 2023 columns: - name: SSDSE-B-2026 type: int unit: 年 description: 観測年(西暦) pk: true - name: A1101 type: int unit: 人 description: 総人口(住民基本台帳) quality: completeness: 全列 null 率 0% last_validated: '2026-05-24'

💬 結果の読み方:YAML は dbt, great-expectations, OpenAPI, Kubernetes など多くのモダンツールで採用される設定形式。 git で行単位 diff が取れるため、 「いつ・誰が・どの列定義を変えたか」が履歴で追跡できる。 メタデータ管理 ≒ コードレビューになる。

🐍 Python ⑥:ydata-profiling 相当の自動レポート

🎯 このコードでやること:ydata-profiling と同じ「自動データプロファイル HTML レポート生成」を、 標準ライブラリだけで簡易再現。 各列の分布、 欠損、 警告を一気に出す。

📥 入力データ:DataFrame df (564 行 × 112 列)。

df.shape = (564, 112)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import pandas as pd

def profile(df, name='Dataset'):
    report = [f'# Data Profile Report: {name}']
    report.append(f'- shape: {df.shape}')
    report.append(f'- memory: {df.memory_usage(deep=True).sum() / 1024:.1f} KB')

    # 警告
    warnings = []
    for c in df.columns:
        s = df[c]
        if s.isna().mean() > 0.1:
            warnings.append(f'{c}: 欠損率 {s.isna().mean():.0%}')
        if pd.api.types.is_numeric_dtype(s) and s.nunique() == 1:
            warnings.append(f'{c}: 定数列(unique=1)')
        if pd.api.types.is_object_dtype(s) and s.nunique() == len(df):
            warnings.append(f'{c}: 全てユニーク(ID 列?)')

    report.append(f'\n## 警告 ({len(warnings)} 件)')
    for w in warnings[:5]:
        report.append(f'  - {w}')

    # 数値列サマリ
    num_cols = df.select_dtypes(include='number').columns
    report.append(f'\n## 数値列 ({len(num_cols)} 列) サマリ')
    desc = df[num_cols].describe().T[['mean','std','min','max']]
    report.append(desc.head(5).round(2).to_string())

    return '\n'.join(report)

print(profile(df, 'SSDSE-B-2026'))

📤 実行結果

# Data Profile Report: SSDSE-B-2026 - shape: (564, 112) - memory: 554.8 KB ## 警告 (0 件) ## 数値列 (110 列) サマリ mean std min max SSDSE-B-2026 2017.50 3.46 2012.0 2023.0 A1101 2690687.67 2730951.06 537000.0 14086000.0 A110101 1308956.24 1345905.41 257000.0 6914000.0 A110102 1381722.56 1385859.97 280000.0 7172000.0 A1102 2637010.74 2646599.51 532000.0 13459000.0

💬 結果の読み方:警告 0 件 = データ品質が極めて高い(欠損なし・定数列なし・ID 重複なし)。 これは SSDSE が「教育用」として整備された結果。 実務データではこのレポートで 30〜100 件の警告が出るのが普通で、 各警告をひとつずつ潰すのが前処理の第一歩。

📊 メタデータの粒度 4 階層

同じ「メタデータ」でも、 対象とする粒度で 4 階層に分けて整理すると見通しが良くなる。

階層 主なフィールド SSDSE-B-2026 例
① データセットtitle, publisher, license, versionSSDSE-B-2026, 統計センター, 政府標準利用規約 2.0
② カラムname, dtype, unit, descriptionA1101, int64, 人, 総人口
③ 行 (オプション)row_id, observation_date2023, R13000, 東京都
④ セル値 (オプション)imputed, source_method, confidence14086000(速報値 or 確報値)

①〜② は 必須。 ③〜④ は「データの素性まで追跡したい」場合に追加する。 公的統計や医療データでは ④ まで揃えるのが理想。

📜 セルフテスト:メタデータ理解度

  1. メタデータの 3 種類は?(答:記述的、 構造的、 管理的)
  2. Dublin Core の要素数は?(答:15)
  3. FAIR 原則の 4 つを挙げる(答:Findable, Accessible, Interoperable, Reusable)
  4. schema.org Dataset を HTML に埋め込む形式は?(答:JSON-LD)
  5. 政府オープンデータの標準語彙は?(答:DCAT)
  6. 地理空間メタデータの ISO 標準は?(答:ISO 19115)
  7. OSS データカタログを 3 つ挙げる(答:DataHub, OpenMetadata, Amundsen, Atlas, CKAN ほか)
  8. Python でメタデータ自動生成するライブラリは?(答:ydata-profiling, pandera, great-expectations)
  9. SSDSE-B-2026 のエンコーディングは?(答:Shift_JIS = cp932)
  10. メタデータの「陳腐化」を防ぐ仕組みは?(答:自動更新パイプライン、 CI 検証)

10 問中 7 問以上を即答できれば、 メタデータの基礎は確実に身についている。 残りは関連用語ページで補完できる。

📊 公的統計データ別メタデータ整備状況

データセット 提供形式 メタデータ語彙 特徴
e-StatCSV, JSON, XML, APISDMX, 独自日本最大の公的統計ポータル。 統計表検索 API でメタデータ取得。
SSDSECSV (cp932)別冊定義書 (PDF)教育用に整備、 メタデータが充実。 縦持ち形式。
RESASAPI (JSON)OpenAPI地域経済分析、 API で動的取得。 swagger.json でスキーマ提供。
気象庁データCSV, GRIB, NetCDFISO 19115地理空間メタデータ標準。 NetCDF はメタデータ内包。
OECD.StatSDMX, CSVSDMX国際機関共通標準。 多言語対応。
World Bank DataAPI, CSVDDI, SDMX200+ 国家、 1500+ 指標。 メタデータ JSON で配信。
米国 data.gov多種DCAT-USCKAN ベース。 30 万データセット。 DCAT 米国プロファイル。

→ 「データ取得 → メタデータ確認」の手順は 必ず必要。 e-Stat や OECD はメタデータ API が整備されているので、 データ取得時にメタデータも併取得するスクリプトを書くのが定石。

🛠 メタデータ運用ベストプラクティス 10 選

  1. 1 リポ 1 データセット 1 README:データの隣に必ずメタデータ README を置く。 Git で履歴管理。
  2. 標準語彙を採用:自作辞書ではなく Dublin Core / DCAT / schema.org を使う。 横断検索可能になる。
  3. 自動生成を優先:手書きメタデータは陳腐化する。 ydata-profiling 等で「データから自動抽出」する部分を最大化。
  4. CI に検証を組み込む:great-expectations でスキーマ検証、 メタデータ不整合は PR 段階で検知。
  5. 意味的メタデータは人手:「この列が何を意味するか」は自動化できない。 ドメイン専門家が記述。
  6. ライセンスは必ず明記:データ自身のライセンスと、 メタデータのライセンスを別建てで明記(CC0 推奨)。
  7. 言語タグを使う:多言語の場合は "title"@ja, "title"@en のように IETF BCP 47 タグ。
  8. バージョニング:データもメタデータも SemVer。 破壊的変更(列削除等)はメジャー番号上げ。
  9. リネージ追跡:データ A → 加工 → データ B の系譜を記録。 dbt, DataHub が自動化。
  10. 定期的に「メタデータ棚卸し」:四半期に一度、 全データセットのメタデータを点検。 古いものは削除 or アーカイブ。

⚠️ よくある落とし穴

❌ メタデータの陳腐化
データ更新時にメタデータも更新しないと、 嘘の説明書に。
❌ 不完全な記述
「単位は?」が空欄 → 分析者が誤解する。
❌ 自由記述に頼りすぎ
機械可読でないと自動処理できない。 標準語彙(DCAT等)推奨。
❌ プライバシー漏洩
メタデータに個人情報(作成者名等)が残る場合がある。

⚠️ 深いメタデータの落とし穴

❌ 単位の未記載
面積が「m²」か「km²」かでグラフのスケールが 100 万倍違う。 NASA の Mars Climate Orbiter (1999) は単位(ヤード vs メートル)の取り違えで 1.25 億ドル失った。 メタデータに単位を必ず書く。
❌ 推計値と実測値の区別なし
SSDSE-B のような長期時系列では、 当該年が「速報値」「確報値」「推計値」「過去遡及修正値」のいずれかでデータの信頼性が変わる。 メタデータに provenance を残す。
❌ コードの意味ドリフト
「A1101」が 2024 年版で「総人口(住民基本台帳)」、 2026 年版で「総人口(国勢調査)」に変わる場合、 表面上は同じ列名でも値の意味が変質。 メタデータに methodology 履歴。
❌ ライセンスの未明記
「自由に使えると思って論文に引用したら商用ライセンスだった」事故。 政府オープンデータでも「再配布禁止」「クレジット必須」など条件多様。 必ず dc:rights を明記。
❌ 文字コード混在
SSDSE は cp932 (Shift_JIS)、 e-Stat の一部は UTF-8、 RESAS は UTF-8 BOM 付き。 メタデータに encoding を明記しないと文字化けで分析停止。
❌ メタデータ自身の更新忘れ
データを更新したが、 メタデータの n_rowsupdated_at が古いまま → 嘘の取扱説明書。 自動更新(パイプライン組み込み)が必須。
❌ プライバシー漏洩
Word/Excel/PDF のメタデータには作成者名・組織・GPS(写真)・編集履歴が残る。 公開前に exiftool 等で除去。

🗺 概念マップ

メタデータを中心に、 記述メタ (説明文)・構造メタ (スキーマ)・管理メタ (所有者・更新日時)・統計メタ (列分布) の 4 区分と、 データカタログ・データリネージを整理した概念マップ。

メタデータ データエンジニアリング データカタログ メタデータ データリネージ スキーマ / 統計プロファイル 記述メタ (説明文・タイトル)

SSDSE-B-2026 のメタデータは「変数名表」(総人口 A1101 / 年少人口 A1301 / 出生数 A4101 / 消費支出 L3221 など多数の指標) と「年次」「単位」のセットで構成される。 列名と単位の対応を辞書として保持すれば、 後続の集計で誤った単位混合を防げる。

🔗 隣接手法への橋渡し

メタデータは単独で扱う対象ではなく、 上流のデータカタログ (Data Catalog) 構築、 並列のスキーマ管理 + データリネージ、 下流のデータ品質モニタリングと組み合わせて、 データガバナンスの骨格を形成する。

SSDSE-B-2026 で言えば、 ファイル名 (SSDSE-B-2026.csv)・更新日 (2026-04)・列数 (35)・行数 (47)・各列の単位・出典 (各種統計年鑑) などをメタデータとして JSON-LD / Datasheets for Datasets 形式で記述するのが現場の標準。

🌳 手法選択フロー

メタデータ管理の手法選択は、 (1) スキーマが固定か変動か、 (2) 規模 (テーブル数) が大規模か、 (3) 規制要件 (GDPR / 個人情報) が厳しいか、 で決まる。 固定スキーマなら DB の COMMENT、 大規模なら DataHub / Amundsen / Apache Atlas。

  1. 対象は構造化データか? はい → RDB のスキーマ・列コメント、 いいえ → JSON Schema / Avro
  2. リネージ追跡が必要か? はい → OpenLineage / DataHub、 いいえ → README + dictionary
  3. 機微情報を含むか? はい → 機密度タグ付け + IAM、 いいえ → 公開メタデータ

実務ではメタデータ自動生成 (テーブル名・型) + 手動補強 (説明文・所有者) のハイブリッドが定石で、 SSDSE-B-2026 のような単一 CSV なら README.md + datasheet.json で十分。

🧩 解説深化:単位という「見えないメタデータ」

このページ上部の「発見可能性(見つけられるか)」とは別角度で、 見つけた後に正しく計算できるか という切り口でメタデータを掘り下げる。 使用データは data/raw/SSDSE-B-2026.csv(2023 年・47 都道府県)の実測値。

🎨 直感:データは「ラベルの剥がれた缶詰」

棚に並んだ缶詰は、 中身が違ってもブリキの円筒としては見分けがつかない。 ラベルだけが「これはコーンスープ / これは塗料」を教える。 数表のセルも同じで、 中の数字だけ見ても意味は決まらない。 意味を与えるのがメタデータだ。

SSDSE-B-2026 から東京都・2023 年の 2 セルを取り出すと、 どちらも「ただの数値」に見える:

列コード 値(東京都・2023) コードブック(=メタデータ)が明かす正体
A110114,086,000総人口 / 単位:
B410117.6年平均気温 / 単位:

A1101B4101 という文字列自体は暗号で、 CSV 本体のどこにも「人」「℃」とは書いていない。 単位・調査年・出典は、 数値の外側に置かれたメタデータとしてしか存在しない。 これが無ければ 14086000 が「人」か「千人」か「世帯」かすら確定しない。

⚠️ 落とし穴(重要)

① 単位をまたいだ「無意味な集計」。 df.select_dtypes('number').mean() のような一括統計は、 メタデータを見ないと平然と実行できてしまう。 だが 2023 年の全国総人口は実測 124,353,000 人、 年平均気温は実測で 11.0℃(北海道)〜23.8℃(沖縄県)。 桁も単位も無関係な両者を同じ mean() に混ぜた瞬間、 出力は数学的には成立しても意味の上では破綻している。 スケールを揃えてよいか否かを判断する材料が、まさに単位メタデータだ。

② 「年」が測定値に化ける罠。 先頭列の見出しは SSDSE-B-2026 で、 中身は 2012〜2023 の年。 これは観測値ではなく時点を表すキーだが、 列名に「年」と書いていないため、 メタデータ無しでは 2012 を身長や金額のような測定値として numeric 列に巻き込みかねない。 実測の全国総人口はこの 12 年で 127,589,000 人(2012)→ 124,353,000 人(2023) と約 324 万人減っており、 時点キーを誤って値扱いすると、 この減少トレンドの解釈ごと壊れる。

③ コード名だけでは「列どうしの関係」が読めない。 A110101(男)+A110102(女)=A1101(総)という合計制約は、 コードブックが定義するもので数値の並びからは自明でない。 東京都 2023 で検算すると 6,914,000 + 7,172,000 = 14,086,000(実測・一致)。 全国でも男女計 124,353,000 人が総人口と一致する。 この「足すと親になる」構造メタデータを知らずに 3 列を独立変数として回帰に放り込むと、 完全な多重共線に陥る。

📖 「コードブックを剥がすと何が起きるか」を 30 秒で体験する(クリックで開く)

次の 4 つの数字だけを渡されたと想像してほしい:14086000 / 17.6 / 2023 / 537000。 単位も列名も無い。 このうち何が「人」で何が「℃」で何が「年」か、 数字を睨んでも決められない(537000 は実測で鳥取県の総人口=全国最少)。 コードブックという 1 枚のラベルを添えるだけで、 同じ数字列が突然「読める」データに変わる ── これがメタデータの正体だ。

🚀 発展:コード体系そのものがメタデータである

SSDSE の列コードは無作為な記号ではなく、 先頭アルファベットが分野を表す統制語彙(controlled vocabulary)になっている。 実データの見出し行を引くと ── A1101=総人口、 B4101=年平均気温、 C3801=旅館営業施設数(ホテルを含む)。 A=人口・世帯、 B=自然環境、 C=経済基盤…… というように、 コードの構造自体が「どの統計分野か」という構造的メタデータを内包している。 だからコードブックさえあれば、 startswith('A') の列だけ抜き出して人口系サブテーブルを機械的に構成できる。

さらに一歩進めると、 列メタデータに単位を機械可読で埋めておく(例:{"A1101": {"unit": "人"}, "B4101": {"unit": "degC"}})ことで、 pint のような単位ライブラリが「人 + ℃」を実行前にエラーとして弾く。 落とし穴①を人間の注意ではなく型システムで防ぐ、 という発想がメタデータ駆動分析の到達点だ。 上流の DCAT / schema.org 標準(本ページ上部で詳述)は、 この「単位・分野・関係」を組織横断で共有可能にするための語彙にほかならない。

🔗 関連ページ

数値は data/raw/SSDSE-B-2026.csvpd.read_csv(encoding='cp932', skiprows=[1]) で読み、 df[df['SSDSE-B-2026']==2023](および 2012–2023 の年次集計)から算出した実測値。 14086000 / 17.6 等は東京都、 気温レンジ・全国計は 47 都道府県の実値。