Introduzione: Dalla Sample alla Popolazione
La statistica inferenziale ci permette di trarre conclusioni su una popolazione intera osservando solo un campione. Nel ML, questo e fondamentale: addestriamo su un training set (campione) e vogliamo che il modello funzioni su dati mai visti (popolazione). I concetti di intervalli di confidenza, test di ipotesi e A/B testing sono strumenti indispensabili per ogni data scientist.
Cosa Imparerai
- Errore standard e distribuzione campionaria
- Intervalli di confidenza: cosa significano davvero
- Test di ipotesi: null hypothesis, p-value, errori di tipo I e II
- T-test e Chi-square test
- A/B testing: setup, power analysis, early stopping
- Effect size e perchè il p-value non basta
Distribuzione Campionaria e Errore Standard
La distribuzione campionaria della media descrive come varia la media di un campione se ripetiamo l'esperimento molte volte. Per il CLT:
L'errore standard (SE) e la deviazione standard della distribuzione campionaria:
dove s e la deviazione standard del campione. L'SE diminuisce con \\sqrt{n}: per dimezzare l'incertezza servono 4 volte più dati.
Intervalli di Confidenza
Un intervallo di confidenza al 95% per la media e:
Con campioni piccoli (n < 30), si usa la distribuzione t di Student al posto della normale:
Cosa significa realmente: un CI al 95% NON significa "c'e il 95% di probabilità che il vero valore sia nell'intervallo". Significa: se ripetessimo l'esperimento infinite volte, il 95% degli intervalli calcolati conterrebbe il vero valore. La differenza e sottile ma cruciale.
import numpy as np
from scipy import stats
# Campione di accuracies da 10 esperimenti
accuracies = np.array([0.92, 0.89, 0.91, 0.93, 0.90, 0.88, 0.91, 0.94, 0.90, 0.92])
n = len(accuracies)
mean = np.mean(accuracies)
se = stats.sem(accuracies) # Standard Error
# CI al 95% con distribuzione t
t_critical = stats.t.ppf(0.975, df=n-1)
ci_lower = mean - t_critical * se
ci_upper = mean + t_critical * se
print(f"Media: {mean:.4f}")
print(f"SE: {se:.4f}")
print(f"CI 95%: [{ci_lower:.4f}, {ci_upper:.4f}]")
# Metodo rapido con scipy
ci = stats.t.interval(0.95, df=n-1, loc=mean, scale=se)
print(f"CI 95% (scipy): [{ci[0]:.4f}, {ci[1]:.4f}]")
Test di Ipotesi
Un test di ipotesi valuta se i dati osservati sono compatibili con un'ipotesi:
- H_0 (null hypothesis): non c'è effetto (es. i due modelli hanno la stessa accuracy)
- H_1 (alternative hypothesis): c'è un effetto
La Statistica Test e il P-Value
Per confrontare la media di un campione con un valore noto, si calcola il t-statistic:
Il p-value e la probabilità di osservare un risultato cosi estremo (o più) se H_0 fosse vera. Se p < \\alpha (tipicamente 0.05), rifiutiamo H_0.
Errori di Tipo I e Tipo II
La potenza del test e 1 - \\beta: la probabilità di rilevare un effetto reale.
T-Test a Due Campioni
Per confrontare due modelli, si usa il t-test a due campioni indipendenti:
import numpy as np
from scipy import stats
# Modello A vs Modello B: accuracies su 15 run
np.random.seed(42)
model_a = np.array([0.92, 0.89, 0.91, 0.93, 0.90, 0.88, 0.91, 0.94,
0.90, 0.92, 0.91, 0.89, 0.93, 0.90, 0.91])
model_b = np.array([0.94, 0.93, 0.95, 0.92, 0.94, 0.91, 0.93, 0.95,
0.93, 0.94, 0.92, 0.93, 0.94, 0.93, 0.94])
# T-test a due campioni
t_stat, p_value = stats.ttest_ind(model_a, model_b)
print(f"Modello A: media={model_a.mean():.4f}, std={model_a.std():.4f}")
print(f"Modello B: media={model_b.mean():.4f}, std={model_b.std():.4f}")
print(f"t-statistic: {t_stat:.4f}")
print(f"p-value: {p_value:.6f}")
print(f"Significativo (alpha=0.05): {p_value < 0.05}")
Effect Size: Oltre il P-Value
Il p-value ci dice se un effetto e statisticamente significativo, ma non quanto e grande. L'effect size (Cohen's d) misura la grandezza dell'effetto:
Interpretazione: d \\approx 0.2 piccolo, d \\approx 0.5 medio, d \\approx 0.8 grande.
A/B Testing per ML
L'A/B testing confronta due varianti (A = controllo, B = trattamento) per determinare quale performa meglio. Il setup richiede:
- Definire la metrica: click-through rate, conversion, accuracy
- Calcolare il sample size necessario (power analysis)
- Randomizzare gli utenti nei gruppi
- Raccogliere dati per la durata prestabilita
- Analizzare con test statistico appropriato
Power Analysis: Quanti Campioni Servono?
La power analysis calcola il sample size necessario per rilevare un effetto di grandezza d con potenza 1-\\beta:
import numpy as np
from scipy import stats
def power_analysis(effect_size, alpha=0.05, power=0.8):
"""Calcola sample size necessario per gruppo."""
z_alpha = stats.norm.ppf(1 - alpha/2)
z_beta = stats.norm.ppf(power)
n = ((z_alpha + z_beta) / effect_size) ** 2
return int(np.ceil(n))
# Scenario: vogliamo rilevare un miglioramento del 2% nell'accuracy
# Accuracy base: 90%, target: 92%, std stimata: 5%
effect_size = 0.02 / 0.05 # Cohen's d = 0.4
n_per_group = power_analysis(effect_size)
print(f"Effect size (Cohen's d): {effect_size:.2f}")
print(f"Sample size per gruppo: {n_per_group}")
# A/B test simulato
np.random.seed(42)
n = n_per_group
group_a = np.random.normal(0.90, 0.05, n) # Controllo
group_b = np.random.normal(0.92, 0.05, n) # Trattamento
t_stat, p_value = stats.ttest_ind(group_a, group_b)
diff = group_b.mean() - group_a.mean()
s_pooled = np.sqrt((group_a.var() + group_b.var()) / 2)
cohens_d = diff / s_pooled
print(f"\nA/B Test Results:")
print(f" Gruppo A: {group_a.mean():.4f}")
print(f" Gruppo B: {group_b.mean():.4f}")
print(f" Differenza: {diff:.4f}")
print(f" p-value: {p_value:.6f}")
print(f" Cohen's d: {cohens_d:.4f}")
print(f" Significativo: {p_value < 0.05}")
Multiple Testing Correction
Quando eseguiamo molti test simultaneamente (es. confrontare 10 modelli), la probabilità di almeno un falso positivo aumenta. La correzione di Bonferroni divide il livello di significativita per il numero di test:
dove m e il numero di test. E conservativo; per un approccio meno severo si usa la procedura di Benjamini-Hochberg che controlla il False Discovery Rate (FDR).
Riepilogo
Punti Chiave da Ricordare
- Errore Standard: \\text{SE} = s / \\sqrt{n} - l'incertezza diminuisce con più dati
- CI 95%: \\bar{x} \\pm 1.96 \\cdot \\text{SE} - non e probabilità, e frequenza
- P-value: probabilità di dati cosi estremi se H_0 e vera
- Effect size (Cohen's d): misura la grandezza dell'effetto, non solo la significativita
- Power analysis: calcola quanti campioni servono prima di raccogliere dati
- Bonferroni: correggi \\alpha per test multipli
Nel Prossimo Articolo: esploreremo la matematica dei Transformer. Self-attention, scaled dot-product, multi-head attention, positional encoding: le formule che hanno rivoluzionato NLP e AI.







