0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

47都道府県 × 4条件の数字を、1つも手で書かない仕組みにした ― それでも1箇所だけ間違えた

0
Last updated at Posted at 2026-08-05

シリーズ「その数字、誰の話?」 ― 公的統計を47都道府県で確かめる

47都道府県ランキング(1位が条件次第で37位になった)
何年働けば「2000万円」が要らなくなるのか(26県は0年だった)
「地方は安い」は九州だけだった
★④ このシミュレーターの作り方(本記事)
⑤ 1人なのに2人より高い県(近日公開)
⑥ 持ち家か賃貸か、フェアに比べる(近日公開)
⑦ 倍率1位と金額1位は違う(近日公開)
⑧ 「2000万円」が当てはまるのは7.3%(近日公開)
⑨ 安い県ほど介護費の割合が高い(近日公開)
⑩ 年金の地域差(近日公開)
⑪ 月1万円の固定費削減は、生涯258万円だった(近日公開)

TL;DR

  • 47都道府県 × 4条件 = 188個の金額を、記事にもページにも1つも手で書かない仕組みにしました
  • 機械が出した188個は、1つも間違っていませんでした。 間違えたのは、唯一そこから手でコピペした1箇所だけです
  • 出典リンクも既定値も、「人間が覚えていればいい」と思っていた場所だけが事故になりました

作ったもの 👉 あなたの老後資金、HOW MUCH?(無料・登録不要)

これは精密な生活設計ではなく、条件を変えたときの影響を見るシミュレーターです。この記事は、その数字をどうやって「手打ちゼロ」にしたか、それでもどこで事故ったかの話です。

月1,000円の転記ミスが、258万円のズレになる

このアプリの計算式は、突き詰めるとこれだけです。

必要額 = 月の不足額 × 258ヶ月 + 800万円

258ヶ月は65歳時点の平均余命(男性19.5年)+標準シナリオの追加2年で、21.5年ぶん。月次の数字を1,000円間違えると、結果は258万円ずれます。 47県を並べているので、1箇所ずれれば順位まで変わる。「だいたい合っている」が通用しない構造でした。

なので、数字を手で書く場所を全部なくすところから始めました。

  • アプリは依存パッケージ0の静的サイト(npmもバンドラも使わず、GitHub Pagesにそのまま置いています)
  • データは data.js の定数が唯一の出どころ。e-Statから取ったCSVはここに展開して、画面もランキングページも配布CSVも全部これを読みます
  • Nodeスクリプトを用意して、データ生成・CSV生成・ページの計算検証・リンク検証を自動化しました

この状態で、記事に書く数字はすべてスクリプトの出力からコピーする運用にしました。そのコピーが事故ります。

機械が出した数字は全部正しかった。間違えたのは、人間がコピペした1箇所だけ

プロジェクト管理資料に「単身で2,000万円を超える県 11 / 47」と書いていました。正しくは 1 / 47 です(高知県の2,018万円だけ)。10倍以上ずれています。

面白いのは、どこが正しくてどこが間違っていたかでした。

  • 生成スクリプトの出力は、最初から 1/47 だった
  • 公開した第2回の本文も正しかった
  • 間違っていたのは、その出力を手で表に写した管理資料だけ

しかも「機械生成した数字を手で表に移すときが唯一の事故ポイント」と、自分でメモに書いた3日後の出来事です。手打ちを1箇所でも残すと、事故はきれいにそこへ集まります。

対策として、「ページ上の計算」と「配布CSV」を毎回突き合わせるチェッカーを書きました。ブラウザを開かずに、vm でページ内のインラインJSをそのまま評価して比べます。

const cases = [["couple", "own", 2], ["couple", "rent", 3], ["single", "own", 4], ["single", "rent", 5]];
cases.forEach(([h, t, col]) => {
  const rows = sandbox.__probe(h, t);   // ページ内の build() を実行して結果を取り出す
  const fromPage = new Map(rows.map((r) => [r.name, man(r.need)]));
  let bad = 0;
  csvRows.forEach((c) => { if (fromPage.get(c[1]) !== Number(c[col])) bad++; });
  if (bad) problems.push(`${h}/${t}: ページの計算とCSVが ${bad}/47 件不一致`);
  else ok.push(`${h}/${t}: 47県すべてCSVと一致`);
});

これで 188件すべての一致がコマンド1つで確認できるようになりました。同じ要領で、app.js が触るDOM idの実在もチェックしています。

URLでも事故った ― 数字だけ検証して満足していた

公開直前に指摘をもらって調べたら、出典リンクの1本が404でした。総務省「全国家計構造調査」のURLが移転していて、しかも同じURLを構造化データにも書いていたので、2箇所が同時に切れていました。

188個の数字は全件突合していたのに、リンクだけは目視で済ませていたわけです。

数字の検証を自動化したことで、逆に「検証済み」という感覚が生まれていたのだと思います。機械で潰す対象に、数字だけでなくURLも入れる。 チェッカーに外部リンクを叩く機能を足して、これは片付きました。

既定値でも事故った ― 同じ県が520万円ずれていた

いちばん怖かったのはこれです。

年金の扱いには「全国一律」と「地域差を反映」の2モードがあります。連載記事もランキングページも全部「地域差」で計算していたのに、アプリの既定値だけ「全国一律」でした。同じ県で数百万円、大きいところで520万円動きます。必要額の1位すら入れ替わります。

これを防いでいたのは、「記事からのリンクに pm=region を付け忘れない」という運用ルールだけでした。付け忘れた瞬間、記事の数字とリンク先の画面が食い違う。連載の信用の核が、人間の記憶に依存していたことになります。

対応は既定値を揃えただけですが、要点は運用ルールをコードに置き換えたことです。「忘れないようにする」は仕組みではありません。

ついでに、変更前の予想も外れました。年金を全国一律にすれば地域差が消えて格差は縮むと思っていたのですが、実際は逆で、一律のほうが格差が広がりました。 生活費と年金には正の相関があり(生活費が高い県は年金も高い)、年金を固定するとその相殺が消えるためです。

数字が正しくても、文章は間違える ― 交通・通信費1位の京都を「車社会」と書いた

費目の解説文もデータから自動生成しています。「交通・通信が高い県は車社会」と書く、という素朴な実装でした。

ところが交通・通信費が47県で最も高いのは京都府(70,000円) です。京都を「車社会で交通費がかさむ傾向」と説明してしまう。

// 交通・通信が高い地域=車社会の注記(大都市圏は鉄道中心なので除外=京都等の誤判定を防ぐ)
const METRO = new Set(["東京都", "大阪府", "京都府", "神奈川県", "埼玉県", "千葉県", "愛知県", "兵庫県", "福岡県"]);
if (highs.some((h) => h.key === "traffic") && !METRO.has(pref.name)) s += `(車社会で交通費がかさむ傾向)`;

除外リストは負けを認めたような実装ですが、ここは負けておくべきところだと思っています。「データから文章を生成する処理」は、相関を因果として断言する装置です。値が正しくても、文章のほうが嘘になる。

教訓:壊れたのは、機械に任せなかった場所だけだった

4つの事故を並べると、共通点は1つでした。

事故 人間に残っていたもの
単身 11/47 の転記ミス 手でコピペする作業
出典リンクの404 何を検証対象にするかの判断
既定値のズレ リンクにパラメータを付け忘れない運用ルール
京都の「車社会」 例外を想定しきる責任

機械に任せた188個は、1つも間違いませんでした。 壊れたのは全部、「人間が覚えていればいい」ことにしていた場所です。

自動化の効果は「作業が速くなること」より、間違いうる場所が1箇所ずつ減っていくことのほうが大きい、というのが今回の実感でした。逆に言えば、手作業が1つ残っている限り、事故は必ずそこで起きます。

📊 この記事の数字は、元データをそのまま公開しています 👉 都道府県別 老後資金ランキング 2026年版

47都道府県 × 4条件(夫婦/単身 × 持ち家/賃貸)の一覧と CSV です。出典を明記いただければ、転載・引用は自由です(CC BY 4.0)。表を Markdown でコピーするボタンも置いてあります。

正直な注意点

  1. チェッカーは「自分が思いついた観点」しか見ません。 今回の404も、リンク切れを疑うまで検出できませんでした。網羅的なテストではなく、事故が起きた順に観点を足しているだけです。
  2. 消費支出ベースです。 税・社会保険料は簡略化していて、固定資産税は統計上そもそも消費支出に入りません(持ち家に有利に出ます)。
  3. 都道府県平均なので県内の差は反映していません。 その代わり費目を1円単位で編集できるようにしてあります。
  4. 単身の費目内訳は全国比率で按分した推計です。県別の実数ではありません。

次回

1人なのに2人より高い県が3県ありました。 単身と夫婦の差は世帯総額だと356万円しかないのに、1人あたりに直すと単身は1.60倍重い。次回はこの逆転を扱います。

よかったら教えてください

4つの事故は、どれも「機械に任せなかった1箇所」で起きました。

  • あなたのプロジェクトで、手作業が残っている最後の1箇所はどこですか?
  • 数字以外に機械でチェックしている対象はありますか?(今回はURLで火傷しました)
  • 「自動生成した文章が嘘をついた」経験、ありませんか

数字を触るプロジェクトほど、計算そのものより転記のほうが危ない、というのが今回の実感です。

30秒であなたの県を確認 👉 自分の県だけ開く

47都道府県 × 世帯 × 持ち家/賃貸 × 生活スタイルで必要額を計算して、何を変えると必要額がどれだけ変わるかを並べて表示します。無料・登録不要・金融商品の勧誘は一切ありません。


この記事は連載「その数字、誰の話?」の第4回です。全11回で、47都道府県のデータを使って老後にまつわる思い込みを1つずつ検証していきます。次回以降を読み逃したくない方は、フォローしていただけると届きます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?