Perché la statistica robusta?
La deviazione standard è una misura potente della dispersione, ma ha un punto debole critico: l’estrema sensibilità ai valori anomali. Un singolo valore estremo può gonfiare drammaticamente la DS, fornendo un quadro fuorviante della variazione tipica.
La statistica robusta offre misure di dispersione che resistono all’influenza degli outlier, rendendole essenziali per i dati del mondo reale dove errori di misurazione, errori di inserimento o casi genuinamente estremi sono comuni.
Esempio: L’effetto degli outlier
Punto di rottura
Deviazione mediana assoluta (MAD)
La MAD è la misura di dispersione più robusta. Calcola la mediana degli scarti assoluti dalla mediana:
Formula della MAD
Trovare la mediana
Calcolare gli scarti
Trovare la MAD
Scalare la MAD per stimare σ: Per dati con distribuzione normale, MAD ≈ 0,6745 × σ. Per stimare la DS dalla MAD, moltiplicare per 1,4826:
Stima della DS dalla MAD
Perché 1,4826?
Scarto interquartile (IQR)
L’IQR misura la dispersione del 50% centrale dei dati, ovvero l’intervallo tra il 25° e il 75° percentile:
Formula dell’IQR
L’IQR è ampiamente utilizzato perché è semplice da comprendere, facile da visualizzare nei diagrammi a scatola (box plot) e costituisce la base della comune “regola 1,5×IQR” per il rilevamento degli outlier.
Scalare l’IQR per stimare σ: Per dati normali, IQR ≈ 1,35 × σ. Per stimare la DS dall’IQR:
Stima della DS dall’IQR
Confronto tra misure robuste
Deviazione standard
MAD
IQR
Quando usare la statistica robusta
- Analisi esplorativa: Quando non si sa se ci sono outlier, iniziare con misure robuste
- Problemi di qualità dei dati: Quando i dati possono contenere errori o problemi di misurazione
- Distribuzioni a code pesanti: Quando sono attesi valori estremi (rendimenti finanziari, sinistri assicurativi)
- Piccoli campioni: Quando gli outlier hanno un impatto sproporzionato a causa del numero ridotto di osservazioni
- Rilevamento degli outlier: Usare la DS per rilevare gli outlier è circolare; usare IQR o MAD invece
Esempi di implementazione
import numpy as np
from scipy import stats
def mad(data):
"""Median Absolute Deviation"""
median = np.median(data)
return np.median(np.abs(data - median))
def scaled_mad(data):
"""MAD scaled to estimate SD (for normal data)"""
return 1.4826 * mad(data)
def iqr(data):
"""Interquartile Range"""
return np.percentile(data, 75) - np.percentile(data, 25)
# Compare on data with outlier
data = [10, 12, 11, 13, 12, 11, 100]
print(f"SD: {np.std(data, ddof=1):.2f}")
print(f"MAD: {mad(data):.2f}")
print(f"Scaled MAD: {scaled_mad(data):.2f}")
print(f"IQR: {iqr(data):.2f}")