VWork バイブコーディングフレームワーク

就労継続支援A型は本当に減ったのか——公開データの「増えている」を信じずに数えた

2026年9月21日

就労継続支援A型・B型の事業所を、住所から探せる道具を作りました。作る途中で、データの読み方をひとつ間違えかけました。その話を書きます。

国は、全事業所を機械が読める形で出している

WAM NET(独立行政法人福祉医療機構)が、障害福祉サービス等情報公表システムのオープンデータを配っています。29のサービス種別ごとにCSVで、半年ごとに更新されます。営利・非営利を問わず二次利用できると明記されています。

就労系の4サービスだけで、2026年3月末時点の収録はこうです。

サービス 事業所
就労継続支援B型 20,783
就労継続支援A型 4,650
就労移行支援 3,396
就労定着支援 2,038

住所・電話・営業時間・定員に加えて、緯度経度が全件入っています。これは大きくて、事業所側のジオコーディングが一切要りません。入力された住所だけ国土地理院で座標にすれば、あとは距離を計るだけです。

最初に間違えかけたこと

ダウンロードのリンクは sfkopendata_202603_46.zip のような名前で並んでいます。最新の時点を数えたら29本しかなく、しかも _23(愛知県のコード)がありません。「29都道府県ぶんしか公表されていない」と早合点しかけました。

中を開いたら違いました。_46 は三重県ではなく、サービス種別の46=就労継続支援B型でした。47都道府県が全部入った全国ファイルが、種別ごとに分かれていただけです。_60(就労移行支援)や _70(障害児相談支援)まであるのだから、都道府県コードでないことは並びを見れば分かったはずでした。

ファイル名の数字を、確かめずに意味づけしない。 中の1行を見れば5秒で分かることを、リンクの一覧だけ見て判断しかけました。

もうひとつ。CSVはUTF-8のBOM付きでした。cp932 でも decode 自体は例外を出さずに通ってしまい、列名が化けたまま動きます。化けた列名は KeyError で気づけますが、気づかない列があれば静かに空になります。BOMを見て決めるようにしました。

公表件数は「増えている」

さて本題です。就労継続支援B型の公表件数を並べると、こうなります。

4年半で +57%。A型も 3,682 → 4,650 で +26% です。

この数字だけ見れば「就労支援の事業所は増え続けている」と書けます。書けますが、実態ではありません。B型の事業所が4年半で1.5倍になった事実はなく、増えているのは自治体が公表システムに登録した件数です。この制度は登録が進行中で、母数そのものが動いています。

公開データの時系列は、しばしばこうなっています。増えたのは現象か、それとも観測か。 ここを分けないと、グラフは簡単に嘘をつきます。

だから作った画面では、全国の推移を「公表された件数」と書き、事業所数とは呼ばないことにしました。

では、何なら言えるのか

登録率の影響を受けにくい数え方があります。一度公表された事業所番号が、次の時点から載らなくなった数です。登録が進むほど母数は増えますが、「いったん載ったものが消える」のは別の出来事です。

数えました。

最後に公表された時点 消えたA型 その定員の合計
2024年3月末より後 889件 13,450人分
それ以前(2021年11月〜2023年9月の2年半) 342件 4,180人分

障害福祉サービスの報酬改定は2024年4月でした。その前後で、消える事業所が2.6倍になっています。合計事業所数が増え続けているのは、新しく開設した事業所が相殺しているからで、出ていった側だけを数えると動きが見えます

都道府県別では、大阪府115件、北海道66件、愛知県62件。増え方が激しいのは岐阜県(改定前3件→改定後40件)と沖縄県(5件→42件)です。市区町村では大阪市72件、札幌市38件、名古屋市31件でした。

それでも「廃止した」とは書かない

ここが設計の分かれ目でした。

消えた理由は公表されていません。 廃止したのか、指定を取り消されたのか、法人が変わって番号が付け替わったのか、単に登録が更新されなかったのか、このデータからは区別できません。

だから画面には「公表データから消えた」としか書いていません。「廃止」と書けば読みやすい見出しになりますが、それは分かっていないことを分かったように書くことです。定員も同じで、「13,450人分」とは書きますが「13,450人が職を失った」とは書きません。定員は最後に公表された枠であって、そこで働いていた人数ではありません。

空き状況も出していません。公表データに入っていないからです。「定員」と「空き」を同じ画面に並べると、読む人は定員を空きとして読みます。だから定員の下に「いま空いている人数ではありません」と毎回書いています。

この書き分けは、防災の道具で使ってきたものと同じです。「該当なし」「未収録」「取得できない」を混ぜない。分からない場所を、分かっている場所のように見せない。

設計でひとつ捨てたもの

最初は、全10時点の全レコードをそのままSQLiteに入れました。63MBになりました。共有サーバーに置いて、商品として配るには重すぎます。

中身を見ると、履歴テーブルとそのインデックスで46MBでした。そこで、過去の生レコードを持つのをやめました。画面が必要としているのは2つだけです。

  1. 時点 × 種別 × 市区町村の件数(推移のグラフ用)
  2. 消えた事業所番号と、最後に載った時点(差分の一覧用)

この2つに絞ったら22.8MBになりました。生データは手元の /mnt/data に置いたままで、製品には入れません。

「データを作る道具」と「データを見せる道具」を分ける、という前にも書いた話の続きです。見せる側は、見せるために必要な形だけを持つ。履歴をそのまま持ち歩くのは、たいてい設計をしていないだけです。

中身

PHP 1ファイルとSQLite(22.8MB)。データベースサーバーも常駐プロセスもポートも要りません。

議員事務所や自治体の方が「自分の市で何が起きたか」を事業所名まで示して説明できる形にしてあります。CSVはそのまま委員会の資料に使えます。


この仕組みは、事務所・自治体・会社の名前で公開できるオンプレミス版としてソースコード同梱で出しています。データは国の公開データだけ、判定は置いた場所で完結し、外部のAPIには何も送っていません。