Analisi delle cifre con la legge di Benford

Rilevamento delle frodi in R

Bart Baesens

Professor Data Science at KU Leuven

Introduzione

  • Prendi un giornale a una pagina a caso e annota la prima cifra a sinistra (1,2,...,9) di tutti i numeri.
  • Quali sono le frequenze attese di queste cifre?

giornale

Rilevamento delle frodi in R

Introduzione

  • Prendi un giornale a una pagina a caso e annota la prima cifra a sinistra (1,2,...,9) di tutti i numeri.
  • Quali sono le frequenze attese di queste cifre?
  • Ipotesi naturale: circa 1/9 = 11%

barplotrnd

Rilevamento delle frodi in R

Introduzione

  • Prendi un giornale a una pagina a caso e annota la prima cifra a sinistra (1,2,...,9) di tutti i numeri.
  • Quali sono le frequenze attese di queste cifre?
  • Ipotesi naturale: circa 1/9
  • Legge di Benford: frequenze attese
    • cifra 1 $\approx$ 30%
    • cifra 9 $\approx$ 4,6%

barplotbf

Rilevamento delle frodi in R

Newcomb e Benford

  • «Che le dieci cifre non compaiano con uguale frequenza è evidente a chiunque usi spesso le tavole logaritmiche e noti come le prime pagine si consumino molto più in fretta delle ultime.» (Newcomb, 1881)
  • Benford osservò la prima cifra dei numeri in 20 diversi insiemi di dati.

newben

Rilevamento delle frodi in R

Legge di Benford per la prima cifra

Un insieme di dati soddisfa la legge di Benford per la prima cifra se la probabilità che la prima cifra $D_1$ sia uguale a $d_1$ è approssimativamente: $$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$$

  • Esempi

    • $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 scoprì che la legge di Benford è invariante per scalatura.

Rilevamento delle frodi in R

Legge di Benford per la prima cifra

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

barplotbf

Rilevamento delle frodi in R

Generiamo i primi 1000 numeri di Fibonacci.

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

Generiamo anche le prime 1000 potenze di 2.

pow2 <- 2^(1:1000)
head(pow2)
2 4 8 16 32 64
Rilevamento delle frodi in R

Funzione `benford` dal pacchetto benford.anaysis

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

fibonacci

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

pow2

Rilevamento delle frodi in R

Esercitiamoci!

Rilevamento delle frodi in R

Preparing Video For Download...