代码说话的宣言:用数据与工程视角检验自治体的开放数据与系统

IT政策提案
代码说话的宣言:用数据与工程视角检验自治体的开放数据与系统

どうも〜おかむーです!今天要带大家用工程视角去看政府和自治体的数据发布与系统设计,轻松又不乏技术干货〜

  • 这篇文章检视了东京开放数据目录、地方CKAN实例与GovTech Tokyo的做法,从机器可读性、API可用性和数据治理角度出发
  • 结论是:目录与CSV/GeoJSON发布已经具备基础,但在API统一、模式化Schema、时效与可追溯性上还缺一套工程化流程
  • 我给出可执行的工程建议:标准化schema、CI化的数据质量检测、公开API与可复现的分析流水线

結論

总体来说,日本各级自治体在开放数据的“静态发布”上进步明显( Tokyo的catalog、各市町的CKAN、县级目录都有CSV/GeoJSON)。ただし、エンジニア的に言うと「データが落ちてるだけ」な状態が多く、API一本でデータライフサイクルを回せる仕組みや、ポリシー目標と実績を自動比較する仕組が不足している。要するに、公開はできているが“使いやすさと信頼性”をもう一段上げる必要があるということです。

レポート本文

現状の確認(ソース)

これ見てくださいよ:東京都のオープンデータカタログ(https://portal.data.metro.tokyo.lg.jp/ / https://catalog.data.metro.tokyo.lg.jp/dataset)や、大仙市のCKAN(https://www.city.daisen.lg.jp/open-data/dataset/)は、CSV/GeoJSONを直接置いている例が多い。GovTech東京(https://www.govtechtokyo.or.jp/)はダッシュボード共通化の取り組みを進めている。

  • 形式:CSV、GeoJSON、XLSXが中心。CSVとGeoJSONがあれば機械利用はしやすい
  • API:CKANならAPIが使える例もある(大仙市のCKANはAPI Keyの記載がある)
  • メタデータ:カタログに説明はあるが、スキーマ(カラム型定義)や更新履歴の粒度が不十分なことが多い

問題点を技術的に整理

  • 機械可読性の浅さ
  • - CSVはあるけど、スキーマ(型、単位、欠損ルール)が明示されていない。要するにデータを取り込むたびに「この列は何?」と人力確認が発生するんです

  • API/エンドポイントの一貫性不足
  • - CKANや個別APIが混在。API仕様が標準化されていないと、消費者側でスイッチングコストが高い

  • 更新履歴・時刻の欠如
  • - いつ更新されたか、どの値が改訂されたかのトレーサビリティがないことが多い。政策の実績追跡には致命的

  • KPIと実績を紐づける仕組み不足
  • - 政策の数値目標(例:保育所待機児童ゼロなど)と、実績を自動で照合するパイプラインがない

    具体的な技術案(工程視点で)

    1) スキーマ化とメタデータの強制

    - DCAT/JSON-LDやCSVW(CSV on the Web)でスキーマと単位を公開する

    - 例:dataset.csvw.json にカラムごとの型、許容値、単位、更新頻度を書く

    2) API 層の統一

    - CKAN + APIゲートウェイ(GraphQLを併用して使いやすさ向上)

    - エンジニア的に言うと、API一本で集約できればフロントも分析も楽になるんですよね

    3) CIによるデータ品質ゲート

    - Gitベースでデータ定義を管理、PR時に自動検証(pandera/pydanticを使ったスキーマ検証、重複チェック、時刻整合性チェック)

    4) 可視化と監査ログ

    - ダッシュボードは単なる可視化ではなく、データライン(ETLログ、更新者、差分)を表示

    コード例:CSVをAPIから取って基本検証する(Python)

    import requests
    

    import pandas as pd

    from io import StringIO

    url = 'https://catalog.data.metro.tokyo.lg.jp/dataset/example.csv' # 例

    r = requests.get(url, timeout=10)

    r.raise_for_status()

    df = pd.read_csv(StringIO(r.text))

    基本チェック

    assert 'date' in df.columns

    df['date'] = pd.to_datetime(df['date'], errors='coerce')

    print('欠損日数:', df['date'].isna().sum())

    KPI比率計算の例(政策目標と実績を比較)

    要するに: attainment_rate = actual / target

    targetは別テーブルから取得してマージする想定

    ※実運用ではこれをGitHub Actions等で定期実行して、差分が出たらPRやアラートを発生させるのがいいです。

    政策の数値目標と実績のギャップをどう見るか

    手順:

    • 目標(target)を構造化データとして公開する(例: target.csvに年度・指標・目標値)
    • 実績(actual)を同NAMESPACEで公開
    • 自動バッチでachieve_rate = actual / targetを算出し、閾値未達はアラート

    これで「目標は掲げたけど進捗が不明」っていう状態を防げます。重要なのは「目標もデータとして扱う」ことです。

    ガバナンスとライセンス

    • 明確なライセンス(CC0等)を付与すること。でないと利用が萎える
    • データカタログに連絡窓口、更新責任者、更新頻度を明記する

    まとめ

    • いいところ:各自治体がCSV/GeoJSONで公開する流れができている。CKANやGovTechの取り組みも追い風
    • 改善点:スキーマとメタデータの徹底、API統一、CIでの品質担保、政策目標とのデータ連携
    • 技術提案:CSVW/DCATでスキーマを公開、CKAN+APIゲートウェイ、GitOps的なデータパイプライン、定期CIで検証

    おかむーから一言

    作为创业过两次、做过前后端和GovTech的人,我想说:数据不是摆着给人看的装饰,而是要让政策自己“唱歌”。技术能把承诺变成可检测的事实,让政府的宣言真正可以被公众和工程师一起监督!