データの「入口」を作れば活用は進む:公開CSVのランディングページUXを技術で直す話

IT政策の提案
データの「入口」を作れば活用は進む:公開CSVのランディングページUXを技術で直す話

どうも〜おかむーです!今日はちょっとエンジニア寄りの視点で、政府・自治体が公開しているCSVファイルの「入口(ランディングページ)」を見直す話をしますよ〜

  • これ見てくださいよ:notice.go.jpやenv.go.jp、mhlw.go.jp、soumu.go.jpにあるCSVは生データとしては使えるけど、"入口"が雑で掴みづらい
  • 要するに:機械可読のファイルだけ出して終わり、ではなく、スキーマやサンプル・ライセンスを揃えた“人と機械に優しい”ランディングページが必要です
  • 提案まとめ:Schema.org / CSVW / JSON-LDでメタデータを添え、自動生成スクリプトとチェックCIを回すだけで再利用性が劇的に上がります!

結論

CSVをただ置くだけの公開はまだ“半製品”なんですよね。エンジニア的に言うと、ファイルはAPIのレスポンスの一部に過ぎない。だからランディングページに最低限のメタ(スキーマ、サンプル、更新履歴、ライセンス、連絡先、バージョン、チェックサム)を機械可読で置くべきです。要するに、データの「説明責任」と「発見責任」をコードで担保しましょう、ということです。

レポート本文

今回確認した公開CSV(検索結果ベース)

  • NOTICE注意喚起: https://notice.go.jp/docs/status_notice.csv
  • 環境省(茨城県関連): https://www.env.go.jp/content/900398071.csv (CSV 463KB)
  • 国内移行データ一覧表2011: https://www.inpit.go.jp/content/100869372.csv
  • 救護施設(厚労省): https://www.mhlw.go.jp/content/001682075.csv (8KB)
  • 総務省 全国データ: https://www.soumu.go.jp/main_content/000323625.csv (104KB)

検索結果から分かること:ファイルは公開されている。サイズ表記があるものもある。でも「このCSVは何を表すのか」「スキーマは?」といった説明が各所でバラバラ、あるいは欠落しているケースが多い印象です。

技術的に困るポイント(エンジニア的視点)

  • スキーマ不明瞭
  • - 列名だけでは型(日時か文字列か)、単位、許容値がわからない

    - 要するに、使う前に手で推測や前処理が必要になるということです

  • メタデータ不在
  • - ライセンスや更新頻度、連絡先が見つからないと再利用できない

  • エンコーディングとMIME
  • - CSVのエンコーディング(UTF-8/Shift_JIS)とContent-Typeが一致していないケースが現場ではよくある

  • 取得のハードル
  • - HTMLのリンク直下にぽんと置いてあるだけでAPIや例示がないと使いにくい

    具体的にやるべきこと(短期〜中期)

    • ランディングページでの必須情報(テンプレ)
    - タイトル、概要(1〜2行)、発行機関、最終更新日、更新頻度、ライセンス(明記)、連絡先、ファイルサイズ、チェックサム、サンプル行(3行程度)、列ごとの説明(name/type/description/example)、推奨的利用方法
    • 機械可読化
    - ページにSchema.org/DatasetのJSON-LDを埋める

    - CSVにはCSVW(CSV on the Web)やJSON Schemaでスキーマを添付

    • 自動生成パイプライン
    - CSVを配置したらREADME.mdとdataset.json(JSON-LD)を自動生成するCIを回す
    • エンコーディングとCORS
    - UTF-8推奨、Content-Typeで明示。クロスドメイン利用を考えてCORSヘッダも付ける

    コードで語る(自動生成の最低限スクリプト例)

    エンジニア的に言うと、こういうスクリプトを用意しておけば初動がラクです。Pythonでヘッダ取得して簡単なスキーマ推定し、JSON-LDとCSVWの雛形を出す例。

    # pip install pandas requests python-magic
    

    import requests

    import pandas as pd

    from io import BytesIO

    url = 'https://notice.go.jp/docs/status_notice.csv'

    r = requests.get(url)

    r.raise_for_status()

    raw = BytesIO(r.content)

    encoding推定は実運用で追加

    df = pd.read_csv(raw)

    schema = []

    for col, dtype in df.dtypes.items():

    t = 'string'

    if pd.api.types.is_integer_dtype(dtype):

    t = 'integer'

    elif pd.api.types.is_float_dtype(dtype):

    t = 'number'

    elif pd.api.types.is_datetime64_any_dtype(dtype):

    t = 'date'

    schema.append({'name': col, 'type': t, 'example': df[col].dropna().astype(str).head(1).to_list()})

    jsonld = {

    "@context": "https://schema.org/",

    "@type": "Dataset",

    "name": "NOTICE status_notice",

    "url": url,

    "distribution": [{"@type": "DataDownload","encodingFormat": "text/csv","contentUrl": url}],

    "schema": schema

    }

    import json

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

    要するに、こうやって自動生成したJSON-LDやCSVWをファイルと一緒に公開すれば、検索エンジンや外部サービスが拾いやすくなるんですよね。

    政策との接続:数値目標と実績の“入口”を揃える

    政策のKPIや配布データ(たとえば総務省の全国データや環境省のCSV)を追うとき、最初に困るのは「この列が何だったか?」という単純なことなんです。データの説明が揃っていれば、政策目標との突合せが自動化できる。つまりランディングページ改善は単なるUX改善じゃなくて、政策検証のインフラ投資なんですよ。

    実装の優先度(プラクティカルなロードマップ)

  • 最低ライン:全CSVにREADME.md(列説明・ライセンス・連絡先)を用意
  • 次に:JSON-LD(Schema.org)を埋める
  • 中期的:CSVW/JSON Schemaでスキーマを厳密化、CIで検証
  • 余裕があれば:簡易APIエンドポイント(/dataset/{id}/schema)とイベント通知(Webhook)を追加
  • まとめ

    エンジニア的には、データは“説明付きのAPIレスポンス”のように扱うと再利用性が高まります。今回の例にあるgov.jp系CSVは素材として価値があるけど、入口を整えるだけで活用のハードルがぐっと下がるんですよね。要するに、ファイルを置いたら最後まで面倒を見てあげましょう、ってことです!

    おかむーから一言

    テクノロジーで社会をアップデートするのは堅い話に見えるけど、現場は小さな改善の積み重ねで変わります。まずはCSVのREADMEを作るところから始めてみませんか?僕も手伝いますよ〜

    シェアする