Analýza číslic pomocí Benfordova zákona

Detekce podvodů v R

Bart Baesens

Professor Data Science at KU Leuven

Úvod

  • Otevřete noviny na náhodné stránce a zapište první (nejlevější) číslici (1, 2, ..., 9) všech čísel.
  • Jaké jsou očekávané frekvence těchto číslic?

noviny s čísly

Detekce podvodů v R

Úvod

  • Otevřete noviny na náhodné stránce a zapište první (nejlevější) číslici (1, 2, ..., 9) všech čísel.
  • Jaké jsou očekávané frekvence těchto číslic?
  • Přirozený odhad bude přibližně 1/9 = 11 %

sloupcový graf náhodného rozdělení

Detekce podvodů v R

Úvod

  • Otevřete noviny na náhodné stránce a zapište první (nejlevější) číslici (1, 2, ..., 9) všech čísel.
  • Jaké jsou očekávané frekvence těchto číslic?
  • Přirozený odhad bude přibližně 1/9
  • Benfordův zákon: očekávané frekvence
    • číslice 1 $\approx$ 30 %
    • číslice 9 $\approx$ 4,6 %

sloupcový graf Benfordova zákona

Detekce podvodů v R

Newcomb a Benford

  • „Že se deset číslic nevyskytuje se stejnou frekvencí, musí být zřejmé každému, kdo hojně využívá logaritmické tabulky a všimne si, jak rychleji se opotřebovávají první stránky než poslední.“ (Newcomb, 1881)
  • Benford pozoroval první číslici čísel ve 20 různých datových sadách.

Newcomb a Benford

Detekce podvodů v R

Benfordův zákon pro první číslici

Datová sada splňuje Benfordův zákon pro první číslici, pokud pravděpodobnost, že první číslice $D_1$ se rovná $d_1$, je přibližně: $$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říklady

    • $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$
  • Pinkham zjistil, že Benfordův zákon je invariantní vůči změně měřítka.

Detekce podvodů v R

Benfordův zákon pro první číslici

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

sloupcový graf Benfordova zákona

Detekce podvodů v R

Generujeme prvních 1000 Fibonacciho čísel.

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

Generujeme také prvních 1000 mocnin čísla 2.

pow2 <- 2^(1:1000)
head(pow2)
2 4 8 16 32 64
Detekce podvodů v R

Funkce `benford` z balíčku benford.anaysis

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

Fibonacciho čísla

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

mocniny čísla 2

Detekce podvodů v R

Pojďme procvičovat!

Detekce podvodů v R

Preparing Video For Download...