De ce statistici robuste?
Deviația standard este o măsură puternică a dispersiei, dar are o slăbiciune critică: sensibilitate extremă la valori aberante. O singură valoare extremă poate umfla dramatic DS-ul, oferind o imagine înșelătoare a variației tipice.
Statisticile robuste oferă măsuri ale dispersiei care rezistă influenței valorilor aberante, fiind esențiale pentru datele din lumea reală, unde erorile de măsurare, greșelile de introducere a datelor sau cazurile extreme autentice sunt frecvente.
Exemplu: efectul valorii aberante
Punctul de rupere
Abaterea absolută mediană (MAD)
MAD este cea mai robustă măsură a dispersiei. Calculează mediana abaterilor absolute de la mediană:
MAD Formula
Determinarea medianei
Calculul abaterilor
Determinarea MAD
Scalarea MAD pentru estimarea σ: Pentru date distribuite normal, MAD ≈ 0,6745 × σ. Pentru a estima DS din MAD, se multiplică cu 1,4826:
SD Estimate from MAD
De ce 1,4826?
Intervalul intercuartilic (IQR)
IQR măsoară dispersia mijlocului de 50% din date — intervalul dintre percentilele 25 și 75:
IQR Formula
IQR este utilizat pe scară largă deoarece este simplu de înțeles, ușor de vizualizat în diagrame box plot și stă la baza regulii comune “1,5×IQR” pentru detectarea valorilor aberante.
Scalarea IQR pentru estimarea σ: Pentru date normale, IQR ≈ 1,35 × σ. Pentru a estima DS din IQR:
SD Estimate from IQR
Compararea măsurilor robuste
Deviația standard
MAD
IQR
Când să folosești statistici robuste
- Analiză exploratorie: Când nu știi dacă există valori aberante, începe cu măsuri robuste
- Probleme de calitate a datelor: Când datele pot conține erori sau probleme de măsurare
- Distribuții cu cozi grele: Când valorile extreme sunt așteptate (randamente financiare, despăgubiri de asigurare)
- Eșantioane mici: Când valorile aberante au un impact disproporționat din cauza numărului mic de observații
- Detectarea valorilor aberante: Utilizarea DS pentru a detecta valori aberante este circulară; folosește IQR sau MAD în schimb
Exemple de implementare
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}")