コードで語るマニフェスト:政府CSVを読み解いて改善案を出す

IT 정책 제안
コードで語るマニフェスト:政府CSVを読み解いて改善案を出す
  • 이거 보세요: 정부가 공개한 CSV 파일들이 실제로 기계가 읽기 쉬운 상태인지 확인했어요!
  • 결론부터: CSV로 공개한 건 좋지만 메타데이터·인코딩·API 부재로 실사용성이 떨어집니다.
  • 제안: 스키마, 버전링, JSON/CSV 변환 API, Data Package로 공개하면 바로 활용 가능해집니다!

結論

공공 데이터가CSV로公開されているのはナイス。ただし、エンジニア的に言うと「ただ置いてあるだけ」の状態が多いです。要するに、エンドツーエンドで使えるデータにするためには、エンコーディングの明示、スキーマ(列説明+型)、安定したID、API層、そして機械可読なメタデータが必須です。

レポート本文

現状の観察 — これ見てくださいよ

検索結果に出てきたファイル群(例):

  • https://notice.go.jp/docs/status_notice.csv
  • https://www.env.go.jp/content/900398071.csv
  • https://www.inpit.go.jp/content/100869372.csv
  • https://www.mhlw.go.jp/content/001682075.csv
  • https://www.soumu.go.jp/main_content/000323625.csv

エンジニア的に言うと、これらは「公開はしているが設計されていない」データです。具体的に問題になるポイントを列挙します。

よくある技術的問題

  • エンコーディング未指定:日本の政府CSVはShift_JIS(CP932)であることが多く、UTF-8想定のツールで壊れることがある。
  • スキーマ欠如:列名はあるけど型や制約、説明が無く、日付フォーマットやNULL扱いが不明。
  • 一貫したIDがない:別テーブルとJOINするための固有キーがないケースが多い。
  • APIがない:CSV置き場への直リンクだけで、クエリ・フィルタ・ページングができない。
  • メタデータ不備:ライセンス、更新頻度、バージョン情報がファイル内にない。

要するに「データがあれば何でも作れる」は幻想なんですよね。データ設計が無いと再利用コストが高すぎるんです。

実践的なテクニカル検証法

エンジニアならコレをまずやるはず、という手順を紹介します。

  • エンコーディング検出
  • import chardet
    

    raw = open('status_notice.csv','rb').read()

    print(chardet.detect(raw))

    要するに、まずencodingをdetectしてから読み込むことです。多くは 'CP932' が返ります。

  • pandasで読み込んでスキーマ推定
  • import pandas as pd
    

    df = pd.read_csv('status_notice.csv', encoding='cp932')

    print(df.dtypes)

    print(df.isna().sum())

    日付列はparse_datesで正規化、数値は小数点やカンマの除去が必要になることが多いです。

  • IDが無いときは疑似キーを作る(最終手段)
  • df['row_id'] = (df.astype(str)).agg('-'.join, axis=1)

    でもこれ、ベストプラクティスではないです。公式にstable IDを出してほしい!

    ポリシー検証(数値目標と実績の結びつき)

    公開データを政策KPIと結びつけると“約束→実績”の検証ができます。やり方は単純で、以下を揃えるだけです:

    • 政策ごとの明確なID(policy_id)
    • 目標テーブル(policy_id, year, target_value)
    • 実績テーブル(policy_id, year, actual_value)

    技術的にはSQLでJOINして差分を出すだけ。

    SELECT p.policy_id, p.year, p.target_value, a.actual_value, (a.actual_value - p.target_value) AS gap
    

    FROM policy_targets p

    LEFT JOIN policy_actuals a USING (policy_id, year);

    これ見てくださいよ、現状は多くの公開CSVが policy_id を持っていないので、結合が難しいんです!

    改善提案(実装レベル)

    技術的に再利用しやすくするための具体案です。

  • データパッケージ化(Frictionless Data)
  • - datapackage.json を提供して列ごとの型・説明を明示する

  • 常時JSONエンドポイントの追加
  • - CSVをそのまま置くのではなく、/api/v1/resource.json のようなRESTを用意する

  • スキーマとバリデーション
  • - JSON Schemaでバリデーション、CIで公開前にチェック

  • バージョニングと変更ログ
  • - Semantic versioning または日時ベースのバージョンを付与

  • CORSとRate Limit、認証(読み取りは原則公開)
  • - ブラウザアプリから直接フェッチできるようにCORSを許可

  • サンプルコード・SDKの提供
  • - Python/R/JS の簡単な読み込み例を同梱

    運用面の提案

    • ファイル名に日付を入れない(常に最新は固定URL、過去はアーカイブ)
    • ライセンスはSPDXタグで明記(例: CC-BY-4.0)
    • メタデータページに更新履歴と責任部署を明示

    期待できる効果

    • データを直接使う市民・企業が増える。アプリや可視化が増えると行政の説明責任が向上します!
    • API化で二次利用が加速、スマートシティや災害対応のリアルタイム性が改善される

    実際の導入コスト感(ざっくり)

    • 短期: datapackage.json + encoding fix + README = 数人日
    • 中期: REST API + バリデーション = 数週間〜数ヶ月
    • 長期: 組織横断のID設計・カタログ化 = 組織改修レベルの投資

    具体的コード例(CSV→APIで使いやすいJSONへ)

    # 간단한 변환 스크립트
    

    import pandas as pd

    from flask import Flask, jsonify

    app = Flask(__name__)

    df = pd.read_csv('status_notice.csv', encoding='cp932')

    列名正規化

    df.columns = [c.strip().lower().replace(' ', '_') for c in df.columns]

    日付パース

    for col in df.columns:

    if 'date' in col:

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

    @app.route('/api/status_notice.json')

    def api():

    return jsonify(df.to_dict(orient='records'))

    これをコンテナ化してAPI化すればフロント側の作業が激減します。

    まとめ

    まとめ

    • CSVで公開してくれてるのはグッド。ただしそのままだと「人間が読むための公開」であり「機械が使う公開」ではない。
    • エンコーディング明示、スキーマ、stable ID、API化、メタデータが最低ライン。
    • 技術的対処は短期〜中期で可能。組織文化の改善(ID設計や運用ルール)は時間がかかるけど成果は大きいです!

    おかむーから一言

    어, 오카무ー입니다! テクノロジーで行政をアップデートするのはマジで近道ですよ。データ作りをプロダクト化して、市民が使えるAPIをどんどん作っていきましょう!

    공유하기