Legge di Benford e Data Science: la matematica che smaschera le frodi nei dati

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Legge di Benford e Data Science: come scoprire anomalie e falsificazioni con Python

C’è qualcosa di sorprendente nei numeri del mondo reale.

Se analizzi milioni di transazioni finanziarie, bilanci aziendali, dati fiscali o persino la popolazione dei comuni italiani, emerge un pattern tanto invisibile quanto potente:

la cifra 1 compare come prima cifra molto più spesso del previsto.

Molto più spesso.

La nostra intuizione suggerirebbe una distribuzione uniforme: ogni cifra da 1 a 9 dovrebbe apparire circa l’11% delle volte. E invece no.

Nel mondo reale:

  • il numero 1 compare circa il 30% delle volte;
  • il 2 quasi il 18%;
  • il 9 meno del 5%.

Sembra assurdo.

Ma è uno dei fenomeni statistici più affascinanti e utili della Data Science moderna: la Legge di Benford.

Una regolarità matematica utilizzata per:

  • individuare frodi finanziarie;
  • rilevare anomalie nei dataset;
  • fare auditing automatico;
  • identificare manipolazioni contabili;
  • costruire sistemi di fraud analytics.

La parte più sorprendente? Molte persone che inventano numeri falsi finiscono inconsapevolmente per violarla.

Ed è qui che la statistica smette di essere teoria e diventa investigazione.

Cos’è la Legge di Benford?

La Legge di Benford descrive la distribuzione della prima cifra significativa in grandi insiemi di dati naturali.

La probabilità che un numero inizi con una determinata cifra non è uniforme.

Segue invece una distribuzione logaritmica.

La formula è:

[math]P(d)=\log_{10}\left(1+\frac{1}{d}\right)[/math]

dove:

[math]d \in \{1,2,\dots,9\}[/math]

e [math]P(d)[/math] rappresenta la probabilità che la prima cifra sia [math]d[/math].

La distribuzione teorica è questa:

Prima cifra Probabilità
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%

La prima volta che si vede questa tabella si pensa quasi sempre la stessa cosa: “Impossibile.”

Eppure funziona sorprendentemente bene.

Perché succede? La logica nascosta della crescita

Per capire Benford bisogna cambiare prospettiva.

Immagina il fatturato di un’azienda che cresce nel tempo.

Passare da:

  • 1 milione → 2 milioni

richiede un incremento del 100%.

Passare invece da:

  • 8 milioni → 9 milioni
Forse potrebbe interessarti anche:  La distribuzione multinomiale

richiede solo un aumento del 12.5%.

In pratica, i valori trascorrono più “tempo statistico” iniziando con cifre piccole.

Questo comportamento emerge naturalmente in fenomeni che si sviluppano tramite:

  • crescita esponenziale;
  • moltiplicazioni;
  • variazioni percentuali;
  • aggregazioni economiche.

Ed è proprio per questo che Benford compare in:

  • redditi;
  • fatturati;
  • bilanci;
  • prezzi di mercato;
  • popolazioni;
  • dati energetici;
  • misurazioni scientifiche.

Quando un dataset copre più ordini di grandezza, la distribuzione tende spontaneamente verso Benford.

Psicologia della probabilità: perché i falsari sbagliano

Qui entra in gioco un aspetto sorprendente: la psicologia cognitiva.

Quando gli esseri umani provano a inventare numeri casuali, commettono quasi sempre lo stesso errore.

Distribuiscono le cifre troppo uniformemente.

Per il cervello umano:

“casuale” significa spesso equilibrato.

Ma il vero caos statistico non è equilibrato.

È irregolare.

Asimmetrico.

Pieno di pattern nascosti.

Un falsario che inventa ricevute o transazioni tende inconsciamente a produrre qualcosa del tipo:

  • 1 → 12%
  • 2 → 10%
  • 3 → 11%
  • 4 → 9%
  • 9 → 11%

Un dataset reale, invece, dovrebbe essere molto più sbilanciato.

Ed è proprio questa discrepanza che rende Benford così utile nelle investigazioni.

La matematica che smaschera le frodi

La Legge di Benford è ampiamente utilizzata nella forensic analytics.

Un revisore può analizzare migliaia di fatture e chiedersi:

“La distribuzione delle cifre iniziali sembra naturale?”

Se il dataset devia troppo dal comportamento atteso, potrebbe esserci:

  • manipolazione contabile;
  • gonfiamento di spese;
  • dati sintetici;
  • inserimento artificiale di valori.

Importante:

Benford non dimostra una frode.

Segnala un’anomalia statistica. È un sistema di allerta.

Un po’ come una TAC per i dati: non formula automaticamente la diagnosi, ma evidenzia dove guardare meglio.

Per questo viene utilizzata in:

  • auditing fiscale;
  • controllo interno aziendale;
  • banche;
  • assicurazioni;
  • cybersecurity finanziaria;
  • anti-money laundering.

Quando Benford funziona davvero?

Uno degli errori più comuni è applicarla ovunque.

La Legge di Benford non è universale.

Funziona bene solo quando i dati hanno certe caratteristiche.

Forse potrebbe interessarti anche:  Vettorializzazione e Broadcasting in NumPy: Guida Pratica con Esercizi

Dataset ideali

✅ dati numerici naturali

✅ grandi dimensioni

✅ più ordini di grandezza

✅ assenza di limiti artificiali

Esempi ottimi:

  • fatturati;
  • redditi;
  • prezzi;
  • transazioni;
  • bilanci;
  • popolazioni.

Dataset inadatti

❌ numeri assegnati artificialmente

❌ intervalli troppo piccoli

❌ dati uniformemente limitati

Esempi pessimi:

  • CAP;
  • numeri di telefono;
  • codici fiscali;
  • età di studenti;
  • voti scolastici.

Se analizzi i punteggi di un compito in classe con Benford, il risultato sarà probabilmente privo di significato.

Non perché la matematica fallisca. Ma perché il dataset è sbagliato.

Data Science e anomaly detection: Benford come sensore statistico

Nella Data Science moderna, Benford non lavora quasi mai da sola.

Viene integrata dentro pipeline più sofisticate di:

  • anomaly detection;
  • machine learning;
  • fraud scoring;
  • risk analytics.

L’idea è semplice.

Prima si usa Benford per identificare pattern sospetti.

Poi intervengono modelli più complessi per verificare il rischio reale.

Per esempio:

una banca potrebbe usare la Legge di Benford come filtro preliminare automatico su milioni di transazioni.

Le osservazioni sospette vengono poi passate a:

  • modelli predittivi;
  • reti neurali;
  • analisi comportamentali;
  • sistemi antifrode.

In pratica:

Benford diventa una sorta di radar statistico.

👉 Dalla Teoria alla Trincea: come la Legge di Benford ha rivelato anomalie da Enron alle elezioni iraniane

Python: analizziamo un dataset con la Legge di Benford

Passiamo ora alla parte pratica.

Creiamo uno script Python che:

  • legge un dataset CSV;
  • estrae la prima cifra significativa di ogni valore;
  • confronta la distribuzione osservata con quella teorica della Legge di Benford;
  • visualizza il risultato tramite un grafico.

Il codice seguente è pensato per essere semplice, robusto e facilmente riutilizzabile anche su dataset reali come bilanci aziendali, dati economici o transazioni finanziarie.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from collections import Counter

# ==========================================
# 1. Caricamento del dataset
# ==========================================

# Sostituisci "dataset.csv"
# con il nome del tuo file CSV
df = pd.read_csv("dataset.csv")

# Sostituisci "valore"
# con il nome della colonna numerica
numeri = df["valore"].dropna()


# ==========================================
# 2. Funzione per estrarre
# la prima cifra significativa
# ==========================================

def prima_cifra_significativa(numero):

    numero = abs(numero)

    # Ignora gli zeri
    if numero == 0:
        return None

    # Gestisce numeri decimali minori di 1
    while numero < 1:
        numero *= 10

    # Restituisce la prima cifra significativa
    return int(str(numero)[0])


# ==========================================
# 3. Estrazione delle prime cifre
# ==========================================

prime_cifre = []

for numero in numeri:

    cifra = prima_cifra_significativa(numero)

    if cifra is not None:
        prime_cifre.append(cifra)


# ==========================================
# 4. Calcolo frequenze osservate
# ==========================================

conteggio = Counter(prime_cifre)

frequenze_osservate = np.array([
    conteggio.get(i, 0)
    for i in range(1, 10)
])

# Normalizzazione in percentuale
frequenze_osservate = (
    frequenze_osservate /
    frequenze_osservate.sum()
)


# ==========================================
# 5. Distribuzione teorica di Benford
# ==========================================

frequenze_benford = np.array([
    np.log10(1 + 1 / i)
    for i in range(1, 10)
])


# ==========================================
# 6. Visualizzazione grafica
# ==========================================

plt.figure(figsize=(10, 6))

# Barre delle frequenze osservate
plt.bar(
    range(1, 10),
    frequenze_osservate,
    label="Distribuzione osservata"
)

# Curva teorica di Benford
plt.plot(
    range(1, 10),
    frequenze_benford,
    marker="o",
    linewidth=2,
    label="Legge di Benford"
)

# Etichette grafico
plt.xticks(range(1, 10))
plt.xlabel("Prima cifra significativa")
plt.ylabel("Frequenza")
plt.title("Confronto con la Legge di Benford")

plt.legend()

# Mostra il grafico
plt.show()

Proviamolo con un dataset simulato:

import numpy as np
import pandas as pd

# ==========================================
# Generazione dataset simulato per Legge di Benford
# ==========================================

np.random.seed(42)  # Per riproducibilità

# Numero di campioni
n = 10000

# Generazione di numeri che seguono approssimativamente Benford
# Metodo: distribuzione log-uniforme
mantissa = np.random.uniform(0, 1, n)
esponenti = np.random.randint(0, 6, n)  # da 10^0 a 10^5

valori = 10 ** (mantissa + esponenti)

# Aggiunta di un po' di variazione realistica
valori = valori * np.random.uniform(0.95, 1.05, n)

# Creazione DataFrame
df = pd.DataFrame({'valore': valori})

# Salvataggio in CSV
df.to_csv('dataset.csv', index=False)

print(f"✅ Dataset simulato creato con successo!")
print(f"   → {n} righe generate")
print(f"   → File salvato come 'dataset.csv'")
print(f"   → Range valori: da {valori.min():.2f} a {valori.max():.2f}")

In questo caso l’output è:

Forse potrebbe interessarti anche:  PyMC: Guida Pratica all'Inferenza Bayesiana e alla Modellazione Probabilistica con Python

 

Pubblicità