Abbiamo due title tag in A/B test su una pagina prodotto. La variante A genera 127 clic su 4.000 impression (CTR 3,17%), la variante B 152 clic su 4.000 impression (CTR 3,80%). Una differenza di 25 clic in più. È un risultato reale o semplice rumore del campione?
Domande come questa — questa differenza è dovuta al caso? — nascono in continuazione in ogni attività basata su dati. Il test delle ipotesi è la procedura statistica che ci permette di rispondere con metodo, distinguendo i risultati dovuti a un fenomeno reale da quelli che sono soltanto effetto del caso.
Di cosa parleremo:
In sintesi: il test delle ipotesi è una procedura statistica che risponde a una domanda precisa: il risultato che osserviamo nel campione è dovuto al caso oppure a un fenomeno reale? Si parte dall’ipotesi nulla (non c’è effetto), si raccolgono i dati e si calcola il p-value. Se il p-value scende sotto la soglia prefissata, il caso non è una spiegazione plausibile e rifiutiamo l’ipotesi nulla.
Nella vita di tutti i giorni, dobbiamo spesso prendere decisioni basate su informazioni incomplete. Un nuovo title genera qualche clic in più: è il title a funzionare meglio, o è stata semplicemente una settimana fortunata?
Il test delle ipotesi è una procedura statistica che ci consente di porre un quesito sulla base di informazioni campionarie, al fine di raggiungere una decisione basata sui dati.
In termini più chiari e diretti: la mia scoperta sperimentale è dovuta al caso? Il test delle ipotesi è una procedura statistica per verificare se il caso sia una spiegazione plausibile di un risultato sperimentale.
La differenza tra probabilità e inferenza è il punto di partenza:
Nel test delle ipotesi abbiamo sempre da soppesare due ipotesi. Lo status quo è chiamato ipotesi nulla, simbolo H₀. È l’ipotesi che non ci sia effetto, che non ci sia differenza, che tutto sia dovuto al caso.
Quello che facciamo è testare l’ipotesi nulla contro un’ipotesi alternativa, simbolo Hₐ — che è, in genere, l’ipotesi a cui crediamo o che vogliamo dimostrare.
N.B. In molti contesti sperimentali l’ipotesi alternativa rappresenta l’effetto che stiamo cercando di verificare.
Scegliamo poi un livello di significatività o alpha level, indicato con α. Lo standard comune è α = 0,05, che corrisponde a un livello di confidenza del 95%. In base all’alpha level possiamo stabilire la o le regioni critiche: le zone della distribuzione campionaria in cui, se cade il nostro risultato, rifiutiamo l’ipotesi nulla.
Se il valore che otteniamo cade in una regione critica, abbiamo evidenze statistiche sufficienti per rifiutare H₀ a favore di H₁.
Il risultato del test, ovviamente, non costituisce una certezza. Possiamo incorrere in due tipi di errore:
Il modo più chiaro per visualizzare i due tipi di errore è questa tabella:
Il calcolo della probabilità di incorrere in un errore di II tipo non è diretto come quello dell’errore di I tipo. Lo affronteremo tra poco, quando parleremo di potenza del test.
Il test può essere a una coda, quando l’ipotesi alternativa è direzionale (ad esempio “la media è maggiore di” oppure “la media è minore di”), oppure a due code, quando l’ipotesi alternativa è semplicemente “diverso da”:
Nell’ipotesi a una coda, tutta la regione critica è concentrata su un lato della distribuzione. Nel test a due code, la regione critica è suddivisa in due code simmetriche, ciascuna con area α/2.
La scelta tra una coda e due code va fatta prima di raccogliere i dati, in base alla domanda di ricerca. Se vogliamo sapere solo se B è diverso da A, usiamo due code. Se vogliamo sapere se B è migliore di A, usiamo una coda (destra).
La sequenza operativa del test delle ipotesi si riassume in cinque passaggi:
La scelta tra distribuzione normale e t dipende da:
n.b. quando il campione diventa numeroso, la distribuzione t approssima sempre di più la normale. Per n > 30 la differenza è trascurabile.
Ripartiamo dall’esempio dell’inizio. Abbiamo messo in A/B test due title tag:
La differenza è di 25 clic, pari a 0,63 punti percentuali. È un effetto reale o rumore?
Seguiamo i cinque passaggi.
Fissiamo α = 0,05 (il livello standard).
Per proporzioni, la distribuzione campionaria della differenza sotto H₀ è approssimativamente normale (il TLC ci garantisce che con n = 4.000 possiamo stare tranquilli). Usiamo il test z per due proporzioni.
In R:
# Dati
n <- 4000
clic_A <- 127; clic_B <- 152
# Proporzione pooled sotto H0
p0 <- (clic_A + clic_B) / (2 * n) # 0.034875
# Errore standard della differenza
se <- sqrt(p0 * (1 - p0) * (1/n + 1/n)) # ~0.00410
# Z-score osservato
z_oss <- (clic_B/n - clic_A/n) / se # ~2.22
z_oss Output:
[1] 2.224 Il valore z osservato è 2,22, cioè la differenza tra i due CTR si trova a più di due deviazioni standard dal valore atteso sotto H₀ (zero). La figura mostra la posizione del valore osservato rispetto alla distribuzione campionaria:
L’area rossa a destra della linea blu tratteggiata è il p-value: la probabilità di osservare una differenza pari o superiore a quella ottenuta, assumendo che H₀ sia vera.
Il p-value è circa 0,013, inferiore alla soglia α = 0,05. Rifiutiamo l’ipotesi nulla: la differenza è statisticamente significativa. La variante B produce un CTR superiore alla variante A, e il caso non è una spiegazione plausibile del risultato.
# Calcolo del p-value (test a una coda destra)
p_val <- 1 - pnorm(z_oss)
p_val Output:
[1] 0.0131 Possiamo verificare il risultato anche con il comando built-in di R:
prop.test(c(127, 152), c(4000, 4000), alternative = "greater", correct = FALSE) Il p-value è la probabilità di ottenere un risultato uguale o più estremo di quello osservato, assumendo che l’ipotesi nulla sia vera. Un p-value piccolo indica che il risultato osservato è improbabile sotto H₀, e quindi ci porta a rifiutarla.
Valori critici di z per i livelli di significatività più comuni:
| Livello α | Una coda | Due code |
|---|---|---|
| 0,05 | ±1,645 | ±1,960 |
| 0,01 | ±2,326 | ±2,576 |
Attenzione: il p-value non è la probabilità che H₀ sia vera. È la probabilità dei dati dato H₀, non la probabilità di H₀ dati i dati. La differenza è sottile ma fondamentale — ed è la stessa che separa l’inferenza frequentista da quella bayesiana.
Il test delle ipotesi non dimostra che H₀ sia vera o falsa. Misura soltanto quanto i dati osservati siano compatibili con H₀. Un p-value piccolo ci dice che i dati sono improbabili sotto H₀ — non che H₀ sia improbabile. È una distinzione epistemologica che sembra un vezzo da statistici, ma è il punto esatto in cui l’inferenza scientifica si separa dal prendere i desideri per realtà.
Nel test delle ipotesi la potenza è la probabilità di rifiutare correttamente l’ipotesi nulla quando è falsa. In formula: potenza = 1 − β, dove β è la probabilità di errore di II tipo.
La potenza dipende da quattro fattori:
Riprendiamo l’esempio del test su CTR. Il nostro test con n = 4.000 per variante ha rilevato una differenza di circa 0,63 punti percentuali. Ma se l’effetto reale fosse più piccolo, diciamo 0,3 punti percentuali, quanta potenza avremmo avuto?
La curva mostra la potenza al variare del valore alternativo della proporzione (μₐ). Con n = 4.000 e α = 0,05, per rilevare una differenza corrispondente a μₐ = 4,5% (cioè una differenza di 1,5 punti percentuali), la potenza è circa il 76%. Per il nostro effetto osservato (3,80% ≈ 0,8 punti percentuali sopra il 3%), la potenza è più bassa, intorno al 50% — abbiamo cioè una probabilità su due di commettere un errore di II tipo.
Se vogliamo aumentare la potenza, dobbiamo aumentare il campione. Il calcolatore di sample size ci aiuta a determinare quanti dati servono:
# Potenza per diverse dimensioni campionarie
# Usando pwr package
library(pwr)
pwr.2p.test(h = ES.h(0.038, 0.0317), # effect size per proporzioni
n = 4000, sig.level = 0.05, alternative = "greater") Output:
Difference of proportion power calculation for binomial distribution
h = 0.0497
n = 4000
sig.level = 0.05
power = 0.5346
alternative = greater La potenza del nostro test è circa il 53%: poco sopra una moneta. Se l’effetto reale è di questa dimensione, abbiamo quasi una probabilità su due di non rilevarlo. Per arrivare all’80% di potenza (lo standard considerato accettabile), dovremmo quasi triplicare il campione.
Vedi l’articolo dedicato a effect size e power analysis per una trattazione completa.
Prima di lanciare un test, possiamo determinare la dimensione del campione necessaria specificando:
In R, usando pwr:
# Quante impression servono per rilevare una differenza
# da 3,2% a 3,8% con potenza 80%?
pwr.2p.test(h = ES.h(0.038, 0.032),
power = 0.80, sig.level = 0.05,
alternative = "greater") Output:
Difference of proportion power calculation
h = 0.0336
n = 13749.56
sig.level = 0.05
power = 0.80
alternative = greater Servono circa 13.750 impression per variante per avere l’80% di probabilità di rilevare una differenza di 0,6 punti percentuali di CTR. Questo è esattamente il tipo di analisi che va fatta prima di lanciare un test, non dopo aver visto i risultati. Puoi usare anche il nostro calcolatore di sample size per fare queste valutazioni in modo interattivo.
Il test delle ipotesi è una procedura statistica che verifica se il caso sia una spiegazione plausibile di un risultato osservato. Confrontiamo ciò che vediamo nel campione con ciò che ci aspetteremmo se l’ipotesi nulla fosse vera.
Un risultato è statisticamente significativo quando è poco probabile che sia dovuto al caso: in pratica, quando il p-value scende sotto il livello di significatività scelto, di solito α = 0,05. Attenzione però: la significatività statistica non misura l’importanza pratica del risultato.
L’ipotesi nulla (H₀) afferma che non c’è effetto: le due versioni si comportano allo stesso modo. L’ipotesi alternativa (H₁) afferma che c’è una differenza. Il test non dimostra la verità di un’ipotesi: decide se i dati bastano a rifiutare H₀.
Il livello di significatività α è la soglia che scegliamo in anticipo (di solito 0,05): è la probabilità massima di errore di I tipo che accettiamo. Il p-value è invece calcolato sui dati ed esprime la probabilità di osservare un risultato almeno così estremo, assumendo che H₀ sia vera. Rifiutiamo H₀ quando p-value ≤ α.
Per rilevare effetti piccoli, ottenere una potenza più alta (es. 90% invece di 80%) o ridurre il livello di significatività. Nell’esempio dell’articolo servono circa 13.750 impression per variante per rilevare un aumento di CTR da 3,2% a 3,8% con potenza 80%.
Sì, in due modi: l’errore di I tipo (rifiutare H₀ quando è vera) e l’errore di II tipo (non rifiutare H₀ quando è falsa). Il livello α controlla il primo; la potenza del test, che vorremmo attorno all’80%, è la probabilità di evitare il secondo.
Un test A/B su una landing page ha raccolto i seguenti dati:
prop.test).pwr.2p.test)Per una trattazione completa e rigorosa del test delle ipotesi, con esercizi e tutti i passaggi formali, il manuale di riferimento in italiano è Statistica di Newbold, Carlson e Thorne. Per un approccio più applicato e direttamente utilizzabile in ambito SEO, vedi anche Trustworthy Online Controlled Experiments di Kohavi, Tang e Xu.
Questo articolo fa parte del percorso «L’inferenza statistica», la guida ragionata agli articoli su test, intervalli di confidenza e presa di decisioni basate sui dati.
Capita spesso che si esporti l'elenco delle keyword da Search Console o da un tool,…
Chi passa le giornate dentro Search Console conosce bene una situazione di questo tipo: una…
Nell'articolo sul multi-armed bandit abbiamo usato Bayes per decidere fra varianti: spostare il traffico verso…
Nell'articolo sull'A/B test bayesiano abbiamo confrontato due varianti a campione fisso: si raccolgono i dati…
Abbiamo avuto modo di esaminare, nell'articolo sull'A/B testing classico, come confrontare due varianti con il…
Abbiamo avuto modo di esaminare, nell'articolo sulle fondamenta della statistica bayesiana, come l'aggiornamento bayesiano funzioni…