ベンフォードの法則と不正会計検知
自然界の数字の先頭はなぜか「1」が30%を占める。脱税・データ捏造を見破る数理
- 1
- 自然に発生する多桁の数値群では、先頭の桁 d (1〜9) の出現確率は に従う。
- 2
- 1から始まる割合は約30.1%、2は約17.6%、9はわずか4.6%と激減する。
- 3
- 人間が手作業で数字を捏造すると、無意識に1〜9を均等(約11%ずつ)に散らすため、ベンフォード分析にかけると一発でバレる。
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
一見するとランダムに見える自然界の数値(各国の人口、湖の面積、株価、企業の売上高、物理定数など)において、先頭の桁が「1」で始まる確率が約30.1%、「9」で始まる確率はわずか4.6%という偏りを示す法則です。監査法人や税務当局が「架空の領収書や捏造データ」をあぶり出すキラーアルゴリズムとして実務投入されています。
身につく武器・思考力
対数スケール(対数目盛)の直感的な意味やスケール不変性(単位に依存しない法則)を深く理解でき、データサイエンスにおける異常値検知の実務的感覚が身につきます。
実社会・ITでの活躍現場
- •公認会計士・税務署による粉飾決算・脱税・架空伝票の自動監査スクリーニング
- •選挙の開票データやコロナ感染者数の統計的改ざん検知
- •科学論文における実験数値データの不正・捏造チェック
Layer 1 — 直感・シミュレーター
データセット(フィボナッチ数列、2の累乗、世界都市人口、捏造データ)を切り替えてみてください。自然な成長データでは赤色の理論線に綺麗に一致する一方、人間がランダムに作った捏造データでは不自然な平坦さとなり、即座に異常値として検知される様子を確認できます。
先頭の数字は「1」が約30.1%を占め、「9」はわずか4.6%しかない
ベンフォードの法則によると、自然界の数値の先頭桁が「1」または「2」である確率は合計で約何%になるでしょうか?
Layer 2 — 定義・受験・証明
定義
ある数値データの集合において、先頭の有効数字が である確率 が次式で与えられる現象を**ベンフォードの法則(Benford's Law)**と呼びます。
公式・数理モデル
証明・導出
この法則の本質は**スケール不変性(Scale Invariance)**です。ある物理量や金額の分布が、単位(円とドル、キロメートルとマイルなど)の乗法的な変更に対して不変であると仮定すると、変数の確率密度関数は対数的に一様でなければなりません。すなわち となります。区間 で積分すると、 が自然に導出されます。
押さえておきたいポイント
- 理論値: 1(30.1%), 2(17.6%), 3(12.5%), 4(9.7%), 5(7.9%), 6(6.7%), 7(5.8%), 8(5.1%), 9(4.6%)
- 何桁にもわたって指数関数的・乗法的に広がるデータで成立しやすい
- 身長やテストの点数のように特定範囲に制約がある正規分布型データには適用できない
- エンロン事件の不正会計スクリーニングなどで一躍有名になった実務理論
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
ベンフォード適合度テストと不正データ自動検知スクリプト
会計帳簿や取引ログから先頭桁の出現頻度を集計し、カイ二乗検定(Chi-Square Test)により捏造・不正の疑惑スコアを自動判定するTypeScript実装です。
1export function detectBenfordAnomaly(numbers: number[]): {2 distribution: Record<number, number>;3 chiSquare: number;4 isSuspicious: boolean;5} {6 const counts: Record<number, number> = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0 };7 let validCount = 0;89 for (const n of numbers) {10 if (n <= 0) continue;11 const firstDigit = parseInt(Math.abs(n).toString()[0], 10);12 if (firstDigit >= 1 && firstDigit <= 9) {13 counts[firstDigit]++;14 validCount++;15 }16 }1718 // カイ二乗値の計算19 let chiSquare = 0;20 const distribution: Record<number, number> = {};2122 for (let d = 1; d <= 9; d++) {23 const observed = counts[d];24 const expectedRate = Math.log10(1 + 1 / d);25 const expected = validCount * expectedRate;26 distribution[d] = (observed / validCount) * 100;2728 chiSquare += Math.pow(observed - expected, 2) / expected;29 }3031 // 自由度8, 有意水準1%の臨界値は約 20.0932 const isSuspicious = chiSquare > 20.09;3334 return { distribution, chiSquare, isSuspicious };35}
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元