statistica

Effect size e power analysis: quanto è grande l’effetto (e quanti dati servono)

Abbiamo chiuso l’articolo sul calcolatore di significatività con una promessa. Dicevamo che il p-value risponde a una sola domanda — l’effetto esiste? — e che a quella domanda, da solo, non ne aggiunge nessun’altra. Non ci dice quanto è grande l’effetto, né se vale lo sforzo di portarlo in produzione. È il momento di mantenere quella promessa, perché sono proprio le due domande che il p-value lascia in sospeso a separare chi legge i dati con metodo da chi si ferma alla prima soglia che luccica.

Le due domande hanno un nome preciso. La prima — quanto è grande? — è l’effect size. La seconda — con i dati che ho, avrei potuto vederlo, un effetto del genere? — è la potenza del test, e il ragionamento che ci porta a rispondere si chiama power analysis. Le esaminiamo una alla volta, come sempre con un esempio sotto mano.

Significativo non vuol dire grande

Partiamo da una situazione che a chi gestisce test online capita più spesso di quanto vorrebbe. Mettiamo di aver provato due title tag su una pagina ad altissimo traffico, e di aver raccolto un milione di sessioni per variante. Il CTR della versione A è il 3,00%, quello della versione B il 3,05%: cinque centesimi di punto di differenza. Verifichiamo in R se lo scarto è statisticamente significativo:

# un milione di sessioni per variante, CTR 3,00% contro 3,05%
prop.test(c(30000, 30500), c(1000000, 1000000), correct = FALSE)$p.value
# [1] 0.03899

Il p-value è 0,039, sotto la soglia dello 0,05. Da manuale, dovremmo brindare: la differenza è “significativa”. Ma fermiamoci un attimo. Stiamo davvero per riscrivere i title di tutto il sito per guadagnare cinque centesimi di punto di CTR? Quel risultato significativo nasconde un effetto di dimensioni ridicole, reso rilevabile soltanto dalla mole spropositata di dati.

Questo è il punto da cui non si torna indietro: con un campione abbastanza grande, qualsiasi differenza diventa statisticamente significativa, anche la più trascurabile. Il p-value misura quanto siamo sicuri che l’effetto non sia zero; non misura quanto l’effetto sia grande. Sono due cose diverse, e confonderle è l’errore che porta a inseguire vittorie che sul fatturato non lasciano traccia. L’effect size esiste proprio per rimettere la grandezza al centro.

L’effect size: misurare il “quanto”

L’idea dell’effect size è semplice e, vista una volta, difficile da dimenticare: invece di chiederci solo se due gruppi differiscono, misuriamo di quanto differiscono, in una scala che non dipende dalla dimensione del campione. È la differenza tra dire “B è meglio di A” e dire “B è meglio di A di mezza deviazione standard”. La prima è una notizia; la seconda è un’informazione su cui si può decidere.

Di misure di effect size ne esistono diverse, ciascuna tagliata su un tipo di confronto. Ne vediamo a fondo due — una per le medie, una per le proporzioni — perché coprono il grosso del lavoro quotidiano; delle altre daremo un cenno alla fine, con i rimandi giusti.

Cohen’s d: l’effetto fra due medie

Quando confrontiamo due medie — il tempo medio sulla pagina di due varianti, la durata media di sessione di due segmenti — la misura di riferimento è il Cohen’s d. L’intuizione è questa: prendiamo la differenza tra le due medie e la esprimiamo in “unità di deviazione standard”, così da renderla confrontabile tra contesti diversi. Una differenza di tre secondi pesa molto se le sessioni durano tutte attorno a quel valore, pochissimo se variano di minuti.

In formula, il Cohen’s d è il rapporto tra la differenza delle medie e la deviazione standard combinata dei due gruppi:

\( d = \frac{\bar{x}_B – \bar{x}_A}{s_p} \\ \)

dove A e B sono le medie dei due gruppi e sp è la deviazione standard pooled, cioè una media ponderata delle due deviazioni standard, che mette insieme la variabilità interna di entrambi i gruppi:

\( s_p = \sqrt{\frac{(n_A – 1)\,s_A^2 + (n_B – 1)\,s_B^2}{n_A + n_B – 2}} \\ \)

con nA, nB le numerosità e sA, sB le deviazioni standard dei due gruppi. Il denominatore non è altro che il modo corretto di fondere due variabilità in una sola misura di riferimento.

Facciamo un esempio. Abbiamo misurato la durata di sessione (in secondi) su due versioni di una pagina, dodici sessioni per versione. Calcolo il Cohen’s d in R appoggiandomi al pacchetto effsize, che fa il conto e ci restituisce anche l’etichetta qualitativa:

A <- c(48, 55, 52, 60, 46, 58, 51, 57, 49, 54, 53, 50)  # versione A
B <- c(50, 58, 52, 62, 49, 57, 60, 53, 61, 51, 59, 54)  # versione B

library(effsize)
cohen.d(B, A)

# Cohen's d
#
# d estimate: 0.6254922 (medium)
# 95 percent confidence interval:
#      lower      upper
# -0.2416187  1.4926030

Il d stimato è 0,63, che effsize classifica come effetto medio. Le soglie convenzionali, proposte da Jacob Cohen, sono 0,2 per un effetto piccolo, 0,5 per uno medio, 0,8 per uno grande — ma vanno prese per quello che sono: convenzioni utili a orientarsi, non leggi di natura. Lo stesso Cohen raccomandava di interpretarle alla luce del proprio campo, non di applicarle a scatola chiusa. Nella pratica quotidiana della SEO, un d di 0,63 sul tempo di sessione è un cambiamento che ha senso prendere sul serio.

C’è però un dettaglio che vale tutto il resto dell’articolo, ed è già visibile qui sopra: l’intervallo di confidenza del d va da −0,24 a 1,49. Attraversa lo zero. In altri termini, con dodici sole sessioni per gruppo, l’effetto stimato è medio, ma i dati non bastano a escludere che quello vero sia nullo. E infatti, se sottoponiamo gli stessi numeri a un t-test, troviamo un p-value tutt’altro che rassicurante:

t.test(B, A)
#
#  Welch Two Sample t-test
# t = 1.5321, df = 21.9, p-value = 0.1398

Un effetto medio che il test dichiara non significativo. Non è una contraddizione: è esattamente il fenomeno che la potenza di un test serve a spiegare. Teniamolo a mente, ci torniamo tra poco.

L’effect size per le proporzioni (CTR e conversioni)

Il tempo sulla pagina è una media, ma il pane quotidiano di chi fa SEO sono le proporzioni: CTR, tasso di conversione, percentuale di rimbalzo. Qui il Cohen’s d non si applica direttamente, e la misura naturale di effect size è il Cohen’s h, costruito apposta per la differenza tra due proporzioni.

Il dettaglio tecnico che lo rende affidabile è una trasformazione — l’arcoseno della radice della proporzione — che serve a stabilizzare la variabilità (in una proporzione, la variabilità dipende dal valore stesso, ed è massima attorno al 50%). La formula è:

\( h = 2\arcsin\sqrt{p_2} – 2\arcsin\sqrt{p_1} \\ \)

dove p1 e p2 sono le due proporzioni a confronto. Non serve calcolarla a mano: ce la fornisce la funzione ES.h del pacchetto pwr. Ma prima di vederla all’opera conviene introdurre l’altra metà del discorso, perché è lì che il Cohen’s h dà il meglio di sé.

Prima però chiudiamo il capitolo effect size con un cenno onesto alle altre misure. Quando i gruppi a confronto sono più di due — il classico scenario dell’ANOVA — la misura tipica è l’eta quadro (η²), che dice quale frazione della variabilità totale è spiegata dal fattore che stiamo studiando; ne abbiamo gettato le basi parlando di analisi della varianza. Quando invece il risultato è binario — converte / non converte — l’effect size si esprime spesso come odds ratio, il rapporto tra le quote di successo, lo stesso oggetto che governa la regressione logistica. Strumenti diversi per domande diverse, ma l’idea di fondo non cambia: mettere un numero sulla grandezza, non solo sull’esistenza.

La potenza di un test: avremmo potuto vederlo?

Torniamo al nostro effetto medio dichiarato non significativo. Come è possibile che un d di 0,63 produca un p-value di 0,14? La risposta sta in un concetto che chiude il cerchio dell’inferenza: la potenza di un test.

Quando facciamo un test delle ipotesi rischiamo due tipi di errore. Il primo, l’errore di tipo I, è gridare a un effetto che non c’è: lo teniamo sotto controllo con la soglia α (di solito 0,05). Il secondo, l’errore di tipo II, è il suo opposto ed è molto più subdolo: non vedere un effetto che invece c’è. La probabilità di commetterlo si indica con β, e la potenza è il suo complemento:

\( \text{potenza} = 1 – \beta \\ \)

Detto in termini più chiari e diretti, la potenza è la probabilità di accorgersi di un effetto reale quando c’è davvero. Una potenza di 0,80 — lo standard a cui si punta — significa che, se l’effetto esiste delle dimensioni ipotizzate, il nostro test lo individua quattro volte su cinque.

Il punto cruciale è che potenza, soglia α, effect size e dimensione del campione non sono quattro manopole indipendenti: sono legate da un vincolo. Fissati tre di questi valori, il quarto è determinato. Questa è l’intera idea della power analysis, ed è ciò che la rende così utile: a seconda di quale incognita lasciamo libera, risponde a due domande operative diverse.

Ed ecco perché il nostro effetto medio è rimasto invisibile. Con dodici sessioni per gruppo la potenza del test era bassissima: il test era, semplicemente, cieco. Un risultato non significativo, in queste condizioni, non dice “l’effetto non c’è”; dice “non avevo occhi abbastanza buoni per vederlo”. Confondere le due cose è uno degli errori più costosi che si possano fare leggendo un A/B test.

Power analysis in R: quanti dati servono

La prima domanda che la power analysis sa risolvere è quella che ogni test dovrebbe affrontare prima di partire: quanti dati mi servono? Riprendiamo il nostro effetto medio. Se volessimo progettare un test capace di rilevare un d di 0,63 con potenza 0,80 e soglia 0,05, calcolo in R con il pacchetto pwr:

library(pwr)
pwr.t.test(d = 0.63, sig.level = 0.05, power = 0.80, type = "two.sample")
#
#      Two-sample t test power calculation
#               n = 40.53396
#               d = 0.63
#       sig.level = 0.05
#           power = 0.8
#     alternative = two.sided
# NOTE: n is number in *each* group

Servirebbero circa 41 sessioni per gruppo, non dodici. Ecco perché il nostro test era muto: stava cercando un effetto medio con un terzo dei dati necessari. La power analysis, fatta a monte, ci avrebbe risparmiato un test inconcludente — ed è esattamente il ragionamento che alimenta il calcolatore di sample size: dimensione del campione e potenza sono le due facce della stessa medaglia.

La seconda domanda è speculare e si pone a posteriori, quando il test l’abbiamo già fatto: con i dati che avevo, quanta potenza avevo davvero? Lo vediamo meglio su un caso concreto.

Un caso pratico: l’A/B test che “non ha funzionato”

Mettiamo di aver testato due landing page. La A ha convertito 60 visitatori su 1.500 (4,0%), la B ne ha convertiti 78 su 1.500 (5,2%). A occhio la B sembra nettamente migliore — un punto e due decimi di conversione in più non è poco. Verifichiamo in R se la differenza regge:

prop.test(c(60, 78), c(1500, 1500), correct = FALSE)
#
#  2-sample test for equality of proportions
# X-squared = 2.461, df = 1, p-value = 0.1167

Il p-value è 0,117: sopra lo 0,05. Verdetto da manuale: differenza non significativa, test fallito, si archivia. Ma noi adesso sappiamo di non fermarci qui. Calcoliamo la potenza che quel test aveva davvero, partendo dall’effect size osservato:

library(pwr)
h <- ES.h(0.052, 0.040)   # Cohen's h tra le due proporzioni
h
# [1] 0.0574024

pwr.2p.test(h = h, n = 1500, sig.level = 0.05)
#               power = 0.3492384

La potenza era 0,35. In altri termini: anche se la B fosse stata davvero migliore di quel tanto, avevamo poco più di una probabilità su tre di accorgercene. Il test non ha “dimostrato che le due pagine sono uguali”: era semplicemente troppo debole per pronunciarsi. E quanti dati sarebbero serviti per arrivare a una potenza decente?

pwr.2p.test(h = h, power = 0.80, sig.level = 0.05)
#               n = 4764.053

Quasi 4.800 visitatori per variante, contro i 1.500 che avevamo. La differenza tra un test che “non ha funzionato” e un test mai realmente in condizione di funzionare è tutta qui — e si vede solo se all’effect size affianchiamo la potenza. Attenzione dunque a derubricare un risultato non significativo a “nessun effetto”: quasi sempre stiamo solo guardando un test sottodimensionato.

Prova tu

Per fissare il meccanismo, ecco un esercizio con dati verosimili. Stiamo progettando un A/B test su un modulo di contatto. Il tasso di conversione attuale (baseline) è il 2,5%, e considereremmo un successo portarlo al 3,0%: mezzo punto di miglioramento. Vogliamo un test con potenza 0,80 e soglia 0,05.

Il compito: calcolare l’effect size con ES.h(0.030, 0.025), passarlo a pwr.2p.test fissando power = 0.80, e leggere quanti visitatori per variante servono. Poi, come controprova, calcolare la potenza che avremmo se ci fermassimo a 3.000 visitatori per variante con pwr.2p.test(h = ..., n = 3000, ...).

Per controllare i conti: l’effect size è h = 0,031, servono circa 16.759 visitatori per variante per avere una potenza dello 0,80, e con soli 3.000 la potenza crollerebbe a 0,22. La morale è quella che ormai conosciamo: più l’effetto che cerchiamo è piccolo, più dati servono per vederlo: dimezzare la differenza minima rilevabile non raddoppia il campione necessario, lo quadruplica.


Effect size e potenza completano la triade che il p-value, da solo, lasciava monca: non più soltanto l’effetto esiste?, ma anche quanto è grande? e avrei potuto vederlo?. Sono le tre domande che trasformano un test da rito propiziatorio in uno strumento di decisione. E tutte e tre, a ben guardare, dipendono da una scelta che viene prima del test: quanti dati raccogliere, e come. È il terreno del disegno sperimentale e del campionamento — il punto in cui la statistica smette di limitarsi a giudicare i numeri che le mettiamo davanti e comincia a dirci quali numeri andare a cercare.


Per approfondire

Sull’uso rigoroso di effect size, potenza e dimensionamento nel contesto degli esperimenti online, il riferimento più completo resta Trustworthy Online Controlled Experiments di Ron Kohavi, Diane Tang e Ya Xu: i capitoli su come dimensionare un test e interpretarne i risultati valgono da soli l’acquisto. Per i fondamenti statistici alle spalle di questi concetti — errori di tipo I e II, potenza, inferenza — un buon manuale italiano di riferimento è Statistica di Newbold, Carlson e Thorne.

Paolo Gironi

Recent Posts

Calcolatore di Significatività per A/B Test

Il nostro A/B test è arrivato alla fine: la variante B mostra un tasso di…

6 giorni ago

La biblioteca di Statistica e SEO: i libri che consiglio (e perché)

C'è una domanda che torna, puntuale, ogni volta che pubblico un articolo di questo percorso:…

1 settimana ago

Il Paradosso di Simpson nella SEO: quando i dati aggregati possono mentire

È l'ultimo giorno del mese. Stiamo preparando il report SEO per il cliente principale. Apriamo…

3 settimane ago

Campionamento e Dimensione Campionaria: Quanti Dati Servono?

In questo articolo: Come scegliere chi misurare: i tipi di campionamento La dimensione campionaria: la…

1 mese ago

Calcolatore Sample Size per A/B Test

Una delle domande più ricorrenti quando si progetta un A/B test è: quanti utenti mi…

4 mesi ago

Anomaly detection: come identificare valori anomali nei dati

Tre metodi statistici per identificare valori anomali nei dati: z-score, IQR di Tukey e test…

4 mesi ago