ベンフォードの法則を使った数字分析

Rで学ぶ不正検知

Bart Baesens

Professor Data Science at KU Leuven

はじめに

  • 新聞をランダムなページで開き、すべての数値の先頭桁(1, 2, ..., 9)を書き出す。
  • これらの数字の期待頻度はどのくらいか?

数字が載った新聞

Rで学ぶ不正検知

はじめに

  • 新聞をランダムなページで開き、すべての数値の先頭桁(1, 2, ..., 9)を書き出す。
  • これらの数字の期待頻度はどのくらいか?
  • 直感的には約 1/9 = 11% と考えられる。

先頭桁の一様分布の棒グラフ

Rで学ぶ不正検知

はじめに

  • 新聞をランダムなページで開き、すべての数値の先頭桁(1, 2, ..., 9)を書き出す。
  • これらの数字の期待頻度はどのくらいか?
  • 直感的には約 1/9 と考えられる。
  • ベンフォードの法則: 期待頻度
    • 数字 1 $\approx$ 30%
    • 数字 9 $\approx$ 4.6%

ベンフォード分布の棒グラフ

Rで学ぶ不正検知

ニューカムとベンフォード

  • 「10個の数字が等しい頻度で現れないことは、対数表を多用する者なら誰でも気づくはずである。最初のページが最後のページよりずっと早く擦り切れることからも明らかだ。」(Newcomb, 1881)
  • ベンフォードは20種類のデータセットで先頭桁を観察した。

ニューカムとベンフォードの写真

Rで学ぶ不正検知

先頭桁のベンフォードの法則

先頭桁 $D_1$ が $d_1$ となる確率が次の式で近似されるとき、データセットはベンフォードの法則を満たす: $$P(D_1=d_1)=\log(d_1+1)-\log(d_1)=\log\left(1+\frac{1}{d_1}\right) \qquad d_1=1,\ldots,9$$

    • $P(D_1=1)=\log\left(1+\frac{1}{1}\right)=\log(2)=0.3010300$
    • $P(D_1=2)=\log\left(1+\frac{1}{2}\right)=\log(1.5)=0.1760913$
    • $P(D_1=9)=\log\left(1+\frac{1}{9}\right)=\log(1.111111)=0.04575749$
  • ピンカムはベンフォードの法則がスケーリングに対して不変であることを発見した。

Rで学ぶ不正検知

先頭桁のベンフォードの法則

benlaw <- function(d) log10(1 + 1 / d)
benlaw(1)
0.30103

先頭桁の棒グラフ

Rで学ぶ不正検知

フィボナッチ数の最初の1000個を生成する。

fibnum <- numeric(1000)
fibnum[1] <- fibnum[2] <- 1
for (i in 3:1000) { fibnum[i] <- fibnum[i-1] + fibnum[i-2] } 
head(fibnum)
1 1 2 3 5 8

2の冪乗の最初の1000個も生成する。

pow2 <- 2^(1:1000)
head(pow2)
2 4 8 16 32 64
Rで学ぶ不正検知

benford.analysisパッケージの`benford`関数

library(benford.analysis)
bfd.fib <- benford(fibnum,
                   number.of.digits = 1)
plot(bfd.fib)

フィボナッチ数のベンフォード分析

library(benford.analysis)
bfd.pow2 <- benford(pow2,
                    number.of.digits = 1)
plot(bfd.pow2)

2の冪乗のベンフォード分析

Rで学ぶ不正検知

練習しましょう!

Rで学ぶ不正検知

Preparing Video For Download...