PDF地獄から政策検証へ:自治体PDF表をきれいに扱う実務パイプライン

IT政策の提案
PDF地獄から政策検証へ:自治体PDF表をきれいに扱う実務パイプライン

どうも〜おかむーです!今日はちょっとエンジニアっぽい話をしますよ〜。政府や自治体が出す資料、これ見てくださいよ、表がPDFに埋まってて再利用できないこと多くないですか?エンジニア的に言うと、データがピクセルでしか存在しないと検証も再現もできないんですよね!

  • PDFに埋められた表が再利用を阻んでいる現状を技術的に整理する
  • PDF→CSV変換の実務パイプラインと品質評価指標を示す
  • 行政向けの現実的な改善提案(メタデータ、API、ワークフロー)を提示する

結論

PDFでしか公開されていない政策データは「証拠の鎖」を切ってしまう。総務省やデジタル庁の機械可読ルールはあるけど(例: https://www.digital.go.jp/、https://www.soumu.go.jp/)、現場はまだPDF頼み。要するに、現実的な抽出パイプライン+品質検証+最低限の公開ルール(CSV添付、JSON-LDメタデータ、APIエンドポイント)があれば、政策目標と実績のギャップをコードで追えるということです。

レポート本文

問題の現状:PDFがなぜダメなのか

これ見てくださいよ。多くの自治体/中央省の報告書はPDFかPPTXで公開されていて、表が画像・埋め込みフォントで固定されている。デジタル庁の機械可読性案にもあるように(参照: https://www.digital.go.jp/assets/... )、レベル1〜3の要件が提示されているけど、現場でCSVやAPIが付くケースは限定的です。要するに、人がコピペして使う前提のデータ公開だと、検証ができないということです。

技術的アプローチ:実務パイプラインの提案

エンジニア的に言うと、PDF→構造化データのパイプラインは3段階で考えるとやりやすいです。

  • 取り込み(fetch): HTTP(S)でPDFを取得。PDFにopen dataのメタがあれば優先採用。
  • テーブル抽出(parse): テキスト抽出→テーブル検出→セル正規化
  • 検証・公開(validate & publish): 品質測定(後述)→CSV/JSON-LDで公開→APIで配信
  • ツール例とサンプル(概念コード):

    # 簡易パイプライン(例)
    

    import requests, pdfplumber, camelot, pandas as pd

    from pytesseract import image_to_string

    r = requests.get('https://example.go.jp/report.pdf')

    open('report.pdf','wb').write(r.content)

    テキストベースの抽出優先

    with pdfplumber.open('report.pdf') as pdf:

    pages = [p.extract_table() for p in pdf.pages]

    テーブル抽出のフォールバックに Camelot

    tables = camelot.read_pdf('report.pdf', pages='1-end', flavor='stream')

    dfs = [t.df for t in tables]

    正規化してCSV出力

    final = pd.concat(dfs)

    final.to_csv('report.csv', index=False)

    ※OCRが必要な場合は Tesseract + layout-parser などを組み合わせる。実務では複数手法を組み合わせてスコアリングするのがコツです。

    品質評価(どうやって「正しい」かを測るか)

    品質評価は「セル単位の正解率」を基本にします。手順の例:

    • 手作業でサンプルのゴールドデータ(ground truth)を作る(10〜30表)
    • 抽出結果と比較して、セル一致率、行列のずれ率、数値パースエラー率を算出
    • 指標: precision, recall, F1(セル単位) + 数値エラー率

    簡易評価コード例(概念):

    # pseudo: compare two pandas DataFrame cell-by-cell
    

    matches = (df_extracted.fillna('') == df_truth.fillna('')).sum().sum()

    total = df_truth.size

    precision = matches / total

    自動化と再現性

    エンジニア的に言うと、Git + CI(GitHub Actions)で「PDFのURLが変わったら自動で抽出して評価」するのが良いですよね。加えて、DVCやSWHで抽出結果のハッシュを管理すると、いつでも再現できます。

    政策検証への実践例

    想像してみてください。ある自治体が「子育て支援費を毎年10%増」とマニフェストで謳っているとします。公開されているのが年度報告のPDFだけなら、上のパイプラインで年度別支出表を抽出して時系列化すれば、実績が目標に届いているかを数値で示せます。

    例: pandasで年次比較

    df = pd.read_csv('budget_by_year.csv')
    

    df['yoy'] = df['支出'].pct_change()

    print(df)

    これで「目標10%増に対して実績は3%増に留まる」といった検証ができる。要するに、コードで語れば政策の“言った・やった”が可視化できるんです。

    行政向けの現実的改善提案

    現場で実現可能なステップを列挙します。

    • 公開ルール: PDFと同時にCSVを必須にする(CSVが不可なら理由説明を必須に)
    • メタデータ: schema.org/Dataset 準拠の JSON-LD をセットで置く(取得URL、更新日、スキーマ、署名)
    • PDFの中に機械可読の添付(Attachments)としてCSV/JSONを埋め込む
    • API: データポータルに小さくてもREST/GraphQLエンドポイントを作る
    • 品質チェック: CIで抽出→テスト(セル完全性、数値整合性)を回す

    GovTechやデジタル庁が提示する基準(例: https://www.digital.go.jp/ / https://www.soumu.go.jp/)を現場運用に落とすなら、まずは「CSVを同梱」するところから始めるのがコスパ最強です。

    まとめ

    • PDFだけの公開は政策検証性を著しく下げるんですよね。
    • 現場でできる実務パイプライン(pdfplumber/Camelot/Tesseract + 品質評価)で暫定的に可視化はできる
    • 長期的にはCSV/JSON-LD/APIの三点セットを標準化すると再利用性が劇的に上がる

    おかむーから一言

    技術で社会をアップデートするって言うと大げさだけど、まずはPDF1枚をCSVにする地味な勝利を積み重ねるのが大事だと思ってます!自分の手で政策の「やった/やってない」を可視化していきましょう!

    シェアする