Analiza cyfr przy użyciu prawa Benforda

Wykrywanie oszustw w R

Bart Baesens

Professor Data Science at KU Leuven

Wprowadzenie

  • Otwórz gazetę na losowej stronie i zapisz pierwszą (lewą) cyfrę (1, 2, ..., 9) wszystkich liczb.
  • Jakich częstotliwości tych cyfr należy się spodziewać?

gazeta

Wykrywanie oszustw w R

Wprowadzenie

  • Otwórz gazetę na losowej stronie i zapisz pierwszą (lewą) cyfrę (1, 2, ..., 9) wszystkich liczb.
  • Jakich częstotliwości tych cyfr należy się spodziewać?
  • Naturalne przypuszczenie to ok. 1/9 = 11%

wykres słupkowy losowy

Wykrywanie oszustw w R

Wprowadzenie

  • Otwórz gazetę na losowej stronie i zapisz pierwszą (lewą) cyfrę (1, 2, ..., 9) wszystkich liczb.
  • Jakich częstotliwości tych cyfr należy się spodziewać?
  • Naturalne przypuszczenie to ok. 1/9
  • Prawo Benforda: oczekiwane częstotliwości
    • cyfra 1 $\approx$ 30%
    • cyfra 9 $\approx$ 4,6%

wykres słupkowy prawa Benforda

Wykrywanie oszustw w R

Newcomb i Benford

  • „Że dziesięć cyfr nie występuje z równą częstotliwością, musi być oczywiste dla każdego, kto często korzysta z tablic logarytmicznych i zauważa, jak szybciej zużywają się pierwsze strony niż ostatnie." (Newcomb, 1881)
  • Benford zaobserwował pierwszą cyfrę liczb w 20 różnych zbiorach danych.

Newcomb i Benford

Wykrywanie oszustw w R

Prawo Benforda dla pierwszej cyfry

Zbiór danych spełnia prawo Benforda dla pierwszej cyfry, jeśli prawdopodobieństwo, że pierwsza cyfra $D_1$ wynosi $d_1$, jest w przybliżeniu równe: $$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$$

  • Przykłady

    • $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 odkrył, że prawo Benforda jest niezmiennicze względem skalowania.

Wykrywanie oszustw w R

Prawo Benforda dla pierwszej cyfry

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

wykres słupkowy prawa Benforda

Wykrywanie oszustw w R

Generujemy pierwsze 1000 liczb Fibonacciego.

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

Generujemy również pierwsze 1000 potęg liczby 2.

pow2 <- 2^(1:1000)
head(pow2)
2 4 8 16 32 64
Wykrywanie oszustw w R

Funkcja `benford` z pakietu 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

Wykrywanie oszustw w R

Czas na ćwiczenia!

Wykrywanie oszustw w R

Preparing Video For Download...