Un report dice che il tempo medio di caricamento di una pagina è 820 millisecondi. Ma quel numero viene da 50 misure: se ne avessimo prese altre 50, avremmo ottenuto lo stesso valore? Quasi certamente no. Una stima puntuale senza indicazione dell'incertezza è un'informazione a metà. L'intervallo di confidenza è lo strumento che aggiunge la parte mancante: un insieme di valori plausibili per il parametro che stiamo stimando.
L'idea di fondo
Ogni stima calcolata su un campione varia da campione a campione. Il teorema del limite centrale ci dice che, per campioni abbastanza grandi, la media campionaria si distribuisce in modo approssimativamente normale intorno alla media vera, con deviazione standard pari all'errore standard. Da qui la forma generale:
stima ± valore critico × errore standard
Per un livello di confidenza del 95% e campioni grandi il valore critico è circa 1,96.
Esempio 1: una media
Misuriamo il tempo di caricamento di una pagina 50 volte. Otteniamo una media di 820 ms e una deviazione standard campionaria di 150 ms.
- Errore standard: 150 / √50 ≈ 21,2 ms.
- Poiché la deviazione standard è stimata dal campione, si usa la distribuzione t di Student con 49 gradi di libertà, il cui valore critico al 95% è circa 2,01.
- Margine: 2,01 × 21,2 ≈ 42,6 ms.
- Intervallo: da circa 777 a 863 ms.
Con campioni piccoli la differenza tra 1,96 e il valore della t diventa importante; con campioni grandi è trascurabile.
Esempio 2: una proporzione
Su 400 visitatori di una pagina, 120 si iscrivono alla newsletter. La proporzione stimata è 0,30.
- Errore standard: √(0,30 × 0,70 / 400) ≈ 0,0229.
- Margine al 95%: 1,96 × 0,0229 ≈ 0,045.
- Intervallo: da circa 25,5% a 34,5%.
Questa formula semplice funziona male quando la proporzione è vicina a 0 o a 1 o i conteggi sono piccoli: con 2 successi su 50 può produrre un limite inferiore negativo, che è privo di senso. In questi casi si usano metodi più accurati, come l'intervallo di Wilson, disponibili in tutte le librerie statistiche.
Cosa significa davvero «95%»
È il punto più frainteso. L'interpretazione corretta riguarda il metodo, non il singolo intervallo: se ripetessimo l'esperimento moltissime volte e calcolassimo ogni volta l'intervallo nello stesso modo, circa il 95% di quegli intervalli conterrebbe il valore vero.
Nell'approccio classico il valore vero è fisso e l'intervallo è casuale. Una volta calcolato un intervallo specifico, come 777–863 ms, il valore vero o ci sta dentro o no. Dire «c'è il 95% di probabilità che la media vera sia tra 777 e 863» è, a rigore, un'affermazione di tipo bayesiano che richiederebbe un'impostazione diversa, anche se in molti casi pratici i numeri risultano simili.
Altre letture sbagliate
- «Il 95% dei dati cade nell'intervallo»: no. L'intervallo riguarda la media, non i singoli valori. I singoli tempi di caricamento sono molto più dispersi.
- «Un campione più grande dà un intervallo che contiene più spesso il valore vero»: no, il livello resta 95%; l'intervallo diventa però più stretto.
- «Se due intervalli si sovrappongono, la differenza non è significativa»: non necessariamente. Due intervalli possono sovrapporsi in parte anche quando la differenza tra le medie è statisticamente significativa. Per confrontare due gruppi bisogna calcolare l'intervallo della differenza.
Cosa rende l'intervallo più stretto
L'ampiezza dipende da tre fattori:
- la variabilità dei dati: più sono dispersi, più l'intervallo è largo;
- la dimensione del campione: l'ampiezza diminuisce con √n, quindi per dimezzarla serve un campione quattro volte più grande;
- il livello di confidenza: un intervallo al 99% è più largo di uno al 95%, perché per «catturare» più spesso il valore vero deve coprire più valori.
Il bootstrap
Quando la formula teorica non è disponibile o le ipotesi sono dubbie, per esempio per una mediana o un percentile, si può usare il bootstrap: si estraggono dal campione, con reinserimento, migliaia di nuovi campioni della stessa dimensione, si calcola la statistica su ciascuno e si prendono i percentili 2,5 e 97,5 dei risultati.
import numpy as np
rng = np.random.default_rng(0)
tempi = np.array([...]) # le misure raccolte
stime = [np.median(rng.choice(tempi, len(tempi))) for _ in range(10_000)]
print(np.percentile(stime, [2.5, 97.5]))
È un metodo semplice e molto generale, ma non fa miracoli: con campioni piccoli o distorti, il bootstrap riproduce fedelmente gli stessi limiti.
Come riportarli
Un buon report scrive «820 ms (IC 95%: 777–863)», indica il metodo usato e la dimensione del campione. Nel mio lavoro preferisco gli intervalli ai soli test di significatività, perché mostrano insieme la direzione dell'effetto, la sua grandezza e l'incertezza che lo accompagna.
In sintesi
- Un intervallo di confidenza aggiunge alla stima l'incertezza dovuta al campionamento.
- La forma generale è stima ± valore critico × errore standard.
- Il 95% si riferisce al metodo: il 95% degli intervalli costruiti così contiene il valore vero.
- L'intervallo riguarda il parametro, non i singoli dati, e si restringe con √n.
- Per statistiche complesse il bootstrap offre un'alternativa pratica alle formule.