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.
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:
\(dove:
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.
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:
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:
Davvero un giochetto da ragazzi: basta aumentare la dimensione del campione e la normalità emerge da sola.
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.
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 teorema ci dice anche qualcosa di prezioso sulla dispersione delle medie campionarie. La deviazione standard della distribuzione delle medie (cioè l’errore standard) è:
\(Questo ha due conseguenze pratiche importanti:
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.
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.
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:
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) replicate() e sample() per generare 5000 medie campionarie con n = 10 (campionando con reinserimento)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.
Abbiamo avuto modo di esaminare, nel corso dei precedenti articoli, come funziona il test delle…
L'Analisi delle Componenti Principali (PCA) è una tecnica statistica ampiamente utilizzata per ridurre la complessità…
I test statistici sono strumenti fondamentali per l’analisi dei dati e la presa di decisioni informate. Scegliere…
Gli Alberi Decisionali sono un tipo di algoritmo di apprendimento automatico che utilizza una struttura…
Immaginiamo di voler trovare il percorso più veloce per raggiungere una destinazione in auto. Si…
Nel 1847, il matematico francese Augustin-Louis Cauchy stava lavorando su calcoli astronomici, quando ideò un…