公開CSVの正体を暴く:メタデータがないとデータは再利用できないよねって話

IT政策の提案
公開CSVの正体を暴く:メタデータがないとデータは再利用できないよねって話
  • これ見てくださいよ、政府系サイトにCSVは置いてあるけどメタデータがないケースが多すぎる!
  • エンジニア的に言うと、CSVは生データだけ渡されてもスキーマ不明で再現性ゼロなんですよね
  • 提案:自動でCSVを巡回してスキーマ・エンコーディング・サンプルを吐くパイプラインを国・自治体のカタログに繋ごう

結論

公開されたCSVに「機械可読なメタデータ(スキーマ、エンコーディング、更新日時、ライセンス)」が付いていれば、二度と“誰かが解釈して使う”ような泥臭い作業は不要になる。要するに、データはファイルだけで終わらせず、データカタログ(DCAT/JSON-LD)+JSON Schemaで配信してほしいって話です。

レポート本文

背景と問題意識

どうも〜おかむーです!ちょっと技術寄りなお話。政府や自治体のサイトを巡回すると、CSVが直接置いてあるケース(例:NOTICEのNICTERデータ https://notice.go.jp/docs/status_nicter.csv や各省のCSVリンク)が増えてます。これは素晴らしいんだけど、これ見てくださいよ、ヘッダはあるけど「この列は日付か?文字列か?」ってのが曖昧なんですよ。

エンジニア的に言うと、CSV単体はスキーマレスなBlobなので、最初にやるのは「推測」と「クレンジング」。これが現場コストを生む。

実際にやってみた(簡易調査)

  • 例:https://notice.go.jp/docs/status_nicter.csv をcurlで取る
curl -I https://notice.go.jp/docs/status_nicter.csv

-> Content-Type: text/csv; charset=Shift_JIS などが返る場合がある

  • Pythonでのテスト(エンコーディング判定→読み込み→スキーマ推定)
import chardet, requests, pandas as pd

r = requests.get(url)

enc = chardet.detect(r.content)['encoding']

df = pd.read_csv(io.BytesIO(r.content), encoding=enc)

推定スキーマ

for col in df.columns:

print(col, pd.api.types.infer_dtype(df[col], skipna=True))

要するに、手順は明確:encoding判定→ヘッダ抽出→型推定→NULL率やユニーク率を算出。ここまでを自動化できれば、利用者は「このCSVはこう使えばOK」とすぐ判断できる。

技術的課題

  • エンコーディング(Shift_JIS, UTF-8, EUC-JP)が混在する
  • 日付フォーマットが複数あり得る(YYYY/MM/DD、YYYY-MM-DD、Unix epochなど)
  • 欠損値・合成カラム(例:住所カラムにカンマが混入)でCSVパーサーがブレる
  • HTTPヘッダにメタデータがほとんど無い(Content-Type以外にスキーマや更新日時がない)

要するに、機械可読の『説明』が足りないんです!要するに〜ということです。

改善提案:自動メタデータ抽出パイプライン(プロトタイプ)

エンジニアとしてはこう作るのが良いと思う:

  • クロールフェーズ
  • - govドメイン(.go.jp, .lg.jp)を定期クロールしてCSV/JSON/PDFのリンクを抽出

  • 取得フェーズ
  • - HEADでContent-Type/Last-Modified/Content-Lengthを取得

    - GETでファイルをダウンロード(最大サンプル数で抑制)

  • 分析フェーズ
  • - encoding推定(chardet)

    - スキーマ推定(pandas + infer_dtype)

    - 基本統計(NULL率、ユニーク数、最小/最大など)

    - サンプル行の保存

  • 出力フェーズ
  • - DCATのDataset/DistributionにマッピングしてJSON-LDで公開

    - 列ごとにJSON Schemaを生成してリンク

    - 可能ならSwagger/OpenAPIのData Schemaとしても公開

    コード例(JSON Schemaを作るイメージ):

    # 簡易スニペット
    

    schema = {"type":"object","properties":{}}

    for col in df.columns:

    t = 'string'

    if pd.api.types.is_integer_dtype(df[col]): t='integer'

    elif pd.api.types.is_float_dtype(df[col]): t='number'

    schema['properties'][col] = {"type":t}

    実務での導入戦術

    • まずは中央(デジタル庁)でPoCをやる:週次でgovドメインのCSVを巡回して品質ダッシュボードを作る
    • 成果物:CSVごとの「利用しやすさスコア」、推定スキーマ、エンコーディング、サンプルCSV
    • 自治体側には「スキーマJSONを同梱して公開するテンプレート」を配布(GitHubでテンプレート公開)

    メリット:研究者やスタートアップが初期コストゼロでデータを利用開始できる。政策評価も自動化されやすくなる。

    まとめ

    • CSVだけ置いて終わりはもうやめよう。ファイルに説明(メタデータ)を付けるべき
    • 技術的には自動巡回→スキーマ推定→DCAT/JSON Schema化で十分実現可能
    • まずはデジタル庁や主要省庁からPoCを回すと効果が早く出る

    おかむーから一言

    テクノロジーは面倒くさい作業を自動化するためにあるんです。メタデータをちゃんとつければ、行政データはもっと民主化される。やろう、今日からできることを始めよう!

    シェアする