CSVの小さな罠が政策評価を殺す?─ 公共データの文字化け・数値化問題をコードでつぶす

IT政策の提案
CSVの小さな罠が政策評価を殺す?─ 公共データの文字化け・数値化問題をコードでつぶす

どうも〜おかむーです!今日はちょっとエンジニアっぽい話をしますよ〜

  • これ見てくださいよ:政府のCSV、一見便利だけど文字コード・全角数字・BOM・カンマ区切りで集計が壊れることがある
  • エンジニア的に言うと、パース前に正規化しないとKPI集計が嘘をつくんです!要するにデータ前処理の不備が政策評価を歪めるということです
  • 対処と改善案はシンプル:明示的なエンコーディング、スキーマ(CSVW/JSON Schema)、配信時のメタデータ、そして簡単な自動バリデーション

結論

政府・自治体が配るCSVは“ただのテキスト”じゃないんですよね。文字コード(SJIS/CP932/BOM)、全角数字や単位混入、カンマを千位区切りで使うなどの表記ゆれで、エンジニア側の集計は簡単に狂います。要するに、公開フォーマットにスキーマと機械判定ルールを組み込めば政策の再現性・検証性は格段に上がります!

レポート本文

なにが問題?——現場でよく見るトラップ

これ見てくださいよ:公開されているCSVの例としては

  • 総務系・通知系のCSV(例: https://notice.go.jp/docs/status_notice.csv)
  • 医療機関一覧のCSV(例: https://www.digital.go.jp/assets/.../xxxxxx_hospital.csv)

表面的にはCSVだけど、よくある罠はこんな感じです。

  • 文字コードがCP932(Windows-31J)で来てるのにUTF-8として扱うと文字化け
  • ファイル先頭にBOMがある/ないでパーサーが列名を読み間違う
  • 数値列に“1,234”のような千位区切りカンマや“1234”の全角数字、単位「円」が混入
  • 緯度経度の桁数がバラバラでジオジョインがズレる

これ、要するに「機械可読」ではなく「人間可読」優先で出している状態なんです。エンジニア的に言うと、API一本で解決する話なんですよね(ただし現実はファイル配布のまま)!

実例:数値列が文字列として読み込まれるとどうなるか

政策のKPI(例:デジタル田園都市交付金の支出実績など、https://www.chisou.go.jp/...)を自治体単位で合計するとします。もし金額列が全角数字や"円"付きで文字列扱いになっていたら、sum()できないですよね。集計結果が0やNULLになって政策目標と実績のギャップが誤認されるリスクあります。

エンジニア的な対処法(コード例)

実務でよく使うPython/pandasの読み込み+正規化例を載せます。コード書く人ならわかると思うんですけど、ポイントは「強制的に文字列で取り込んでから正規化」すること。

import pandas as pd

import re

from io import BytesIO

import requests

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

resp = requests.get(url)

文字コード判定の代わりにCP932を指定するケースが多い

raw = resp.content

pandasで読み込む(先にBOMや不正文字を取り除く)

text = raw.decode('cp932', errors='replace').lstrip('\ufeff')

df = pd.read_csv(BytesIO(text.encode('utf-8')), dtype=str)

数値正規化関数

def normalize_number(x):

if pd.isna(x):

return None

s = str(x).strip()

# 全角→半角変換(簡易)

s = s.translate(str.maketrans('0123456789.,','0123456789.,'))

# カンマや単位を除去

s = re.sub(r'[,\s\u3000円%%]', '', s)

s = re.sub(r'[^0-9.\-]', '', s)

try:

return float(s)

except:

return None

if '金額' in df.columns:

df['金額_norm'] = df['金額'].apply(normalize_number)

ポイントは「読み込み時点で落とし穴を避ける」こと。BOMの除去、明示的エンコーディング、全角→半角、単位除去はセットで考えるべきです。

高度な観点:座標精度と空間集計の誤差

緯度経度が文字列で桁数が不揃いだとジオジョインの結果が数百メートルずれることもあります。エンジニア的に言うと、緯度経度はWGS84で小数点以下6桁は欲しい。少なくともメタデータに精度(小数桁)を明記するだけで利用側の処理が安定します。

政策評価への直結:KPI集計の再現性が上がると議論が変わる

要するにデータの表記ゆれで“見かけ上”達成/未達が変わるケースがあるんです。政策の透明性を語るなら、まず数値がプログラムで再現できることを担保しないと話が始まらない。CSVの小さな整備で、監査や第三者検証が格段に楽になりますよね。

技術的改善提案(現場ですぐ使える)

  • 配布時にContent-Typeと文字コードを明示(UTF-8推奨)
  • CSVWやJSON-LDでスキーマを添付:列名、型、単位、例値を機械で読めるように
  • ダウンロードページに「このCSVはUTF-8/BOMなし、金額は整数(円)」みたいな簡易メタを表示
  • 軽いバリデーションスクリプトを公開リポジトリに置く(読み込みサンプルと変換例)
  • 緯度経度はWGS84で小数点以下6桁以上、またはEPSGコードを明記

簡易的なJSON Table Schema例:

{

"fields": [

{"name": "pref_code", "type": "integer"},

{"name": "city_name", "type": "string"},

{"name": "amount", "type": "number", "constraints": {"minimum": 0}}

]

}

こういうメタデータがあるだけで、解析パイプラインは1段階ラクになります!

まとめ

  • CSVは機械可読になるかどうかは配り方次第!文字コード、BOM、全角数字、千位区切りカンマ、単位混入が地味に政策検証を壊す
  • 簡単な前処理ルール(明示的エンコーディング→文字列で読み込み→正規化)でほとんど解決する
  • 政府・自治体はスキーマを添付して配るだけで、第三者によるKPI検証のハードルを劇的に下げられる

おかむーから一言

テクノロジーで社会をアップデートするって、結局こういう地味な整備が効くんですよね。エンジニア出身の人たち、役所のCSVをちょっと直すだけで政治の議論が変わりますよ!

シェアする