Abbiamo avuto modo di esaminare, nel corso dei precedenti articoli, la distribuzione normale e le sue proprietà. E poi siamo andati avanti: abbiamo costruito intervalli di confidenza, condotto test delle ipotesi, calcolato margini di errore. In tutti questi passaggi, la distribuzione normale era lì, sempre presente, come un filo conduttore silenzioso.
Ma c’è una domanda che forse ci siamo posti senza trovare ancora una risposta soddisfacente: perché la distribuzione normale funziona così bene, anche quando i nostri dati non sono affatto normali? Chi ha detto che il traffico organico, i tassi di conversione o le durate delle sessioni seguano una distribuzione a campana? Nella maggior parte dei casi, non la seguono affatto.
La risposta sta in uno dei risultati più eleganti e potenti di tutta la matematica: il Teorema del Limite Centrale (in inglese Central Limit Theorem, spesso abbreviato in TLC o CLT). È il teorema che, in un certo senso, giustifica l’intera statistica inferenziale.
Di cosa parleremo
Cos’è il Teorema del Limite Centrale
Partiamo dall’enunciato, e poi lo tradurremo in parole semplici.
Il Teorema del Limite Centrale afferma che: se preleviamo campioni sufficientemente grandi da una qualsiasi popolazione con media \(\mu\) e deviazione standard \(\sigma\) finite, la distribuzione delle medie campionarie sarà approssimativamente normale, indipendentemente dalla forma della distribuzione originale.
Più precisamente, la distribuzione delle medie campionarie \(\bar{X}\) tende a:
\(\bar{X} \sim N\left(\mu, \, \frac{\sigma}{\sqrt{n}}\right) \\
\)
dove:
- \(\mu\) è la media della popolazione
- \(\sigma\) è la deviazione standard della popolazione
- \(n\) è la dimensione di ciascun campione
- \(\frac{\sigma}{\sqrt{n}}\) è l’errore standard della media
In termini più chiari e diretti: non importa quanto strana, asimmetrica o bizzarra sia la distribuzione dei nostri dati originali. Se prendiamo tanti campioni e calcoliamo la media di ciascuno, quelle medie si disporranno a formare una campana. Sempre.
Perché è così importante
Va sempre tenuto bene a mente questo punto, perché è la chiave di volta di tutto ciò che abbiamo fatto finora.
Quando calcoliamo un intervallo di confidenza o conduciamo un test delle ipotesi, non lavoriamo con i singoli dati: lavoriamo con le medie campionarie. E il TLC ci garantisce che quelle medie, purché il campione sia abbastanza grande, seguono una distribuzione normale (o approssimativamente tale).
Ecco perché possiamo usare la distribuzione normale e la distribuzione t anche quando i dati originali non sono normali. Non stiamo facendo un’assunzione azzardata: stiamo sfruttando un risultato matematico solido.
In pratica, il TLC è il motivo per cui:
- gli intervalli di confidenza funzionano
- i test delle ipotesi sono affidabili
- possiamo fare inferenza statistica su praticamente qualsiasi tipo di dato
Vediamolo con i nostri occhi: una simulazione in R
La teoria è bella, ma vedere il TLC in azione è un’altra cosa. Costruiamo una simulazione in R che mostra il teorema al lavoro.
Partiamo da una distribuzione decisamente non normale: una distribuzione esponenziale, che è fortemente asimmetrica a destra (pensate alla distribuzione dei tempi di permanenza su un sito: molte visite brevissime, poche molto lunghe).
Simuliamo in R il processo di campionamento ripetuto:
set.seed(42)
# Popolazione: distribuzione esponenziale (media = 1/lambda)
lambda <- 0.5
pop_mean <- 1 / lambda # media vera = 2
# Simuliamo 10000 campioni di dimensione n
n_campioni <- 10000
# Funzione per calcolare le medie campionarie
simula_medie <- function(n) {
replicate(n_campioni, mean(rexp(n, rate = lambda)))
}
# Proviamo con tre dimensioni campionarie diverse
medie_n5 <- simula_medie(5)
medie_n30 <- simula_medie(30)
medie_n100 <- simula_medie(100)
# Visualizziamo
par(mfrow = c(2, 2))
# La distribuzione originale (esponenziale)
hist(rexp(10000, rate = lambda), breaks = 50, probability = TRUE,
main = "Popolazione originale\n(esponenziale)",
col = "lightcoral", xlab = "Valore", ylab = "Densit\u00e0")
# Medie con n = 5
hist(medie_n5, breaks = 50, probability = TRUE,
main = "Medie campionarie (n = 5)",
col = "lightyellow", xlab = "Media", ylab = "Densit\u00e0")
curve(dnorm(x, mean = pop_mean, sd = pop_mean / sqrt(5)),
add = TRUE, col = "red", lwd = 2)
# Medie con n = 30
hist(medie_n30, breaks = 50, probability = TRUE,
main = "Medie campionarie (n = 30)",
col = "lightgreen", xlab = "Media", ylab = "Densit\u00e0")
curve(dnorm(x, mean = pop_mean, sd = pop_mean / sqrt(30)),
add = TRUE, col = "red", lwd = 2)
# Medie con n = 100
hist(medie_n100, breaks = 50, probability = TRUE,
main = "Medie campionarie (n = 100)",
col = "lightblue", xlab = "Media", ylab = "Densit\u00e0")
curve(dnorm(x, mean = pop_mean, sd = pop_mean / sqrt(100)),
add = TRUE, col = "red", lwd = 2)
Come si vede, il risultato è spettacolare. La popolazione di partenza è completamente asimmetrica (l’esponenziale non assomiglia neanche lontanamente a una campana), eppure:
- Con n = 5, le medie cominciano già a somigliare a una normale, anche se resta un po’ di asimmetria
- Con n = 30, la distribuzione delle medie è praticamente indistinguibile da una normale
- Con n = 100, la sovrapposizione con la curva teorica è quasi perfetta
Davvero un giochetto da ragazzi: basta aumentare la dimensione del campione e la normalità emerge da sola.
La regola pratica: quanto deve essere grande n?
Una domanda legittima: “sufficientemente grande” è un termine piuttosto vago. In pratica, quanto deve essere grande il campione perché il TLC faccia il suo lavoro?
La regola pratica più diffusa è n ≥ 30. Con 30 o più osservazioni, la distribuzione delle medie campionarie è generalmente ben approssimata dalla normale, anche se la distribuzione originale è moderatamente asimmetrica.
Ma attenzione: questa regola ha delle eccezioni.
- Se la distribuzione originale è già simmetrica (anche se non normale), bastano campioni più piccoli (anche n = 10-15 può essere sufficiente)
- Se la distribuzione originale è fortemente asimmetrica (come nel caso di dati con molti outlier, o distribuzioni esponenziali con parametri estremi), possono servire campioni più grandi (n = 50 o anche di più)
Nella pratica quotidiana della SEO e del marketing digitale, di solito lavoriamo con campioni ben superiori a 30 (centinaia o migliaia di sessioni, click, conversioni), quindi il TLC è quasi sempre dalla nostra parte.
Il TLC e l’errore standard
Il teorema ci dice anche qualcosa di prezioso sulla dispersione delle medie campionarie. La deviazione standard della distribuzione delle medie (cioè l’errore standard) è:
\(SE = \frac{\sigma}{\sqrt{n}} \\
\)
Questo ha due conseguenze pratiche importanti:
- All’aumentare di n, l’errore standard diminuisce. Più dati raccogliamo, più le nostre medie campionarie si concentrano attorno alla media vera. La relazione è con \(\sqrt{n}\), il che significa (come abbiamo già visto con gli intervalli di confidenza) che per dimezzare l’errore standard dobbiamo quadruplicare il campione.
- La variabilità della popolazione conta. Se i nostri dati sono molto dispersi (alto \(\sigma\)), servono campioni più grandi per ottenere stime precise. Un sito con traffico molto variabile richiede più giorni di osservazione per una stima affidabile della media giornaliera.
Verifichiamo in R che l’errore standard osservato corrisponda alla formula teorica:
# Errore standard teorico per n = 30
se_teorico <- pop_mean / sqrt(30)
# Errore standard osservato dalla simulazione
se_osservato <- sd(medie_n30)
cat("SE teorico:", round(se_teorico, 4), "\n")
cat("SE osservato:", round(se_osservato, 4), "\n")
cat("Differenza:", round(abs(se_teorico - se_osservato), 4), "\n")
La corrispondenza è notevole: i due valori praticamente coincidono. Il TLC funziona esattamente come promesso.
Un esempio pratico: il traffico organico giornaliero
Applichiamo il TLC a un caso concreto. Supponiamo di monitorare il traffico organico giornaliero di un sito per un anno (365 giorni). I dati di traffico non sono mai normali: sono asimmetrici a destra (giorni feriali vs weekend, picchi stagionali, anomalie).
Simuliamo in R una situazione realistica:
set.seed(123)
# Simuliamo 365 giorni di traffico (distribuzione log-normale, tipica del web)
traffico <- round(rlnorm(365, meanlog = 6, sdlog = 0.5))
cat("Media traffico giornaliero:", round(mean(traffico)), "visite\n")
cat("Mediana:", round(median(traffico)), "visite\n")
cat("Dev. standard:", round(sd(traffico)), "visite\n")
# Prendiamo campioni di 30 giorni e calcoliamo la media di ciascuno
medie_mensili <- replicate(5000, mean(sample(traffico, 30, replace = TRUE)))
par(mfrow = c(1, 2))
hist(traffico, breaks = 30, probability = TRUE,
main = "Traffico giornaliero\n(365 giorni)",
col = "lightcoral", xlab = "Visite", ylab = "Densit\u00e0")
hist(medie_mensili, breaks = 50, probability = TRUE,
main = "Medie di campioni\nda 30 giorni",
col = "lightblue", xlab = "Media visite", ylab = "Densit\u00e0")
curve(dnorm(x, mean = mean(traffico), sd = sd(traffico) / sqrt(30)),
add = TRUE, col = "red", lwd = 2)
# Test di normalit\u00e0 sulle medie
shapiro.test(sample(medie_mensili, 5000))
Il traffico giornaliero è chiaramente asimmetrico (la media è diversa dalla mediana, la distribuzione ha una coda lunga a destra). Ma le medie di campioni da 30 giorni? Perfettamente normali, come il TLC garantisce.
Questo è esattamente il motivo per cui possiamo costruire intervalli di confidenza affidabili per il traffico medio, anche se i singoli giorni hanno una distribuzione tutt’altro che normale.
Quando il TLC non basta
Sarebbe disonesto non menzionare i casi in cui il TLC ha dei limiti. Il teorema richiede che la popolazione abbia media e varianza finite. Ci sono distribuzioni (come la distribuzione di Cauchy) che non hanno una varianza finita, e per queste il TLC non vale.
Nella pratica della SEO e del marketing, questo è raramente un problema: i nostri dati hanno sempre media e varianza finite. Tuttavia, vale la pena ricordare che:
- Con distribuzioni fortemente asimmetriche e campioni piccoli (n < 20), l’approssimazione normale può essere insufficiente. In questi casi, meglio usare metodi non parametrici o tecniche di bootstrap
- Con proporzioni estreme (molto vicine a 0 o a 1), il TLC per le proporzioni richiede campioni più grandi perché l’approssimazione funzioni. Ne abbiamo già parlato nell’articolo sugli intervalli di confidenza
Prova tu
Un e-commerce registra i seguenti importi degli ordini (in euro) in un mese:
ordini <- c(12, 8, 45, 15, 22, 150, 9, 18, 35, 11,
14, 200, 7, 19, 28, 13, 55, 10, 16, 95,
8, 21, 42, 12, 17, 310, 9, 14, 25, 11)
- Calcola media e deviazione standard degli ordini. La distribuzione sembra normale?
- Usa
replicate()esample()per generare 5000 medie campionarie con n = 10 (campionando con reinserimento) - Disegna l’istogramma delle medie campionarie. Assomiglia a una normale?
- Calcola l’errore standard teorico (\(\frac{s}{\sqrt{n}}\)) e confrontalo con la deviazione standard delle medie simulate
Suggerimento: replicate(5000, mean(sample(ordini, 10, replace = TRUE))) fa quasi tutto il lavoro.
Abbiamo visto come il Teorema del Limite Centrale sia il fondamento nascosto di tutta la statistica inferenziale: è il motivo per cui possiamo costruire intervalli di confidenza, condurre test delle ipotesi e fare previsioni affidabili, anche quando i nostri dati non sono normali. Ma il TLC ci ha anche insegnato che la dimensione del campione è cruciale. Questo ci apre la strada a una domanda molto pratica: quanti dati ci servono? È il problema della dimensione campionaria e del campionamento, temi che affronteremo in un prossimo articolo.