σ Probabilità e statistica

Confronti multipli e p-hacking: troppi test, falsi risultati

Perché con 20 test un falso positivo è probabile al 64%, come agiscono le correzioni di Bonferroni, Holm e Benjamini-Hochberg e come evitare il p-hacking.

Un test A/B non mostra differenze sulla metrica principale. Allora si guardano le altre metriche: tempo sulla pagina, clic sul menu, iscrizioni alla newsletter. Poi i segmenti: utenti mobili, utenti da desktop, nuovi visitatori, visitatori di ritorno, singoli paesi. Alla fine, in qualche combinazione, compare un risultato «significativo». È una scoperta? Quasi sicuramente no. È il problema dei confronti multipli, una delle cause principali di risultati che non si replicano.

Il problema in un numero

Con un livello di significatività α = 0,05, ogni singolo test ha il 5% di probabilità di dare un falso positivo quando non c'è alcun effetto. Ma se si eseguono molti test indipendenti, la probabilità che almeno uno dia un falso positivo cresce rapidamente:

Numero di test P(almeno un falso positivo)
1 5%
5 circa 23%
10 circa 40%
20 circa 64%
50 circa 92%

Il calcolo è 1 − 0,95ᵏ, dove k è il numero di test. Con 10 metriche e 5 segmenti si hanno 50 confronti: anche se la modifica non ha alcun effetto, ci si aspettano in media circa 2,5 risultati significativi.

Il p-hacking

Il p-hacking è l'insieme di pratiche, spesso non intenzionali, che aumentano artificialmente la probabilità di ottenere un p-value sotto la soglia. Le forme più comuni sono:

  • provare molte metriche e riportare solo quella significativa;
  • dividere i dati in segmenti finché un segmento mostra un effetto;
  • fermare l'esperimento appena il risultato diventa significativo;
  • escludere valori anomali solo dopo aver visto che cambiano il risultato;
  • provare diverse trasformazioni o modelli e scegliere quello più favorevole;
  • cambiare l'ipotesi dopo aver visto i dati, presentando come prevista una scoperta casuale.

Ogni singola scelta può sembrare ragionevole. Il problema è che, quando le scelte dipendono dai dati, il p-value finale non ha più il significato dichiarato. Gli statistici Andrew Gelman ed Eric Loken hanno chiamato questa situazione il «giardino dei sentieri che si biforcano»: anche senza eseguire esplicitamente molti test, le tante decisioni possibili equivalgono a moltiplicare i confronti.

Le correzioni

Bonferroni

La correzione più semplice divide la soglia per il numero di test: con 20 test, si considera significativo solo un p-value sotto 0,05 / 20 = 0,0025. Così la probabilità di almeno un falso positivo resta sotto il 5%. È facile da applicare ma molto prudente: con molti test riduce fortemente la potenza e fa perdere effetti reali.

Holm

La procedura di Holm è una versione migliorata che controlla lo stesso errore con più potenza. Si ordinano i p-value dal più piccolo al più grande; il primo si confronta con α/k, il secondo con α/(k − 1), e così via, fermandosi al primo che non supera la soglia. Non ha svantaggi rispetto a Bonferroni e conviene preferirla.

Benjamini-Hochberg

Quando i test sono molti, come in genomica o nell'analisi di centinaia di metriche, controllare la probabilità di anche un solo falso positivo è troppo severo. La procedura di Benjamini-Hochberg controlla invece il false discovery rate, cioè la quota attesa di falsi positivi tra i risultati dichiarati significativi.

Funziona così: si ordinano i k p-value dal più piccolo, si confronta il p-value in posizione i con (i / k) · q, dove q è la quota di false scoperte accettata, per esempio 0,05 o 0,10, e si dichiarano significativi tutti i test fino all'ultimo che rispetta la condizione.

from statsmodels.stats.multitest import multipletests

pvalori = [0.001, 0.008, 0.039, 0.041, 0.042, 0.06, 0.07, 0.2, 0.5, 0.9]
for metodo in ("bonferroni", "holm", "fdr_bh"):
    rifiuta, *_ = multipletests(pvalori, alpha=0.05, method=metodo)
    print(metodo, rifiuta.sum())

Con questi valori, Bonferroni e Holm mantengono un solo risultato significativo, Benjamini-Hochberg due: i tre p-value tra 0,039 e 0,042, che singolarmente sembrerebbero interessanti, non sopravvivono a nessuna correzione.

Prevenire è meglio che correggere

Le correzioni aiutano, ma la soluzione più efficace è organizzare l'analisi in modo da non averne bisogno.

  1. Definisci in anticipo la metrica principale, i segmenti da analizzare e la durata del test, e mettili per iscritto. Nella ricerca scientifica questa pratica si chiama preregistrazione.
  2. Distingui l'analisi confermativa da quella esplorativa. Esplorare i dati è legittimo e utile, ma i risultati esplorativi vanno presentati come ipotesi da verificare, non come scoperte.
  3. Riporta tutti i test eseguiti, non solo quelli significativi. Un lettore che sa che sono stati fatti 50 confronti interpreta diversamente un singolo risultato positivo.
  4. Replica. Il modo più convincente di confermare un risultato inatteso è ripetere l'esperimento con dati nuovi, concentrandosi solo su quel risultato.
  5. Guarda la dimensione dell'effetto e la plausibilità. Un effetto enorme in un segmento piccolo e mai ipotizzato prima merita molto scetticismo.

In sintesi

  • Ogni test aggiuntivo aumenta la probabilità di almeno un falso positivo.
  • Con 20 test indipendenti senza effetti reali, quella probabilità è circa del 64%.
  • Il p-hacking nasce da scelte guidate dai dati, anche senza intenzione di ingannare.
  • Holm controlla l'errore complessivo meglio di Bonferroni; Benjamini-Hochberg controlla la quota di false scoperte.
  • Definire l'analisi in anticipo e replicare i risultati inattesi è la difesa più solida.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche