Σ
SDCalc
IntermediarConcepte·12 min

Statistici robuste: MAD, IQR și metode rezistente la valori aberante

Ghid complet despre statisticile robuste, incluzând Abaterea absolută mediană (MAD) și intervalul intercuartilic (IQR). Învață când să folosești măsuri de dispersie rezistente la valori aberante, cu exemple și cod Python.

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

Date: 10, 12, 11, 13, 12, 11, 100 (o valoare aberantă) Deviația standard: 32,4 (dominată de valoarea aberantă) MAD: 1,0 (ignoră valoarea aberantă) IQR: 1,5 (ignoră valoarea aberantă)

Punctul de rupere

“Punctul de rupere” al unei statistici este proporția de date care poate fi extremă înainte ca statistica să devină lipsită de sens. DS are un punct de rupere de 0% (o singură valoare aberantă o poate distruge). MAD și IQR au puncte de rupere de 50% — jumătate din date pot fi aberante și ele tot funcționează.

Abaterea absolută mediană (MAD)

MAD este cea mai robustă măsură a dispersiei. Calculează mediana abaterilor absolute de la mediană:

MAD Formula

MAD = median(|xᵢ - median(x)|)
1

Determinarea medianei

Calculează mediana setului de date.
2

Calculul abaterilor

Scade mediana din fiecare valoare și ia valoarea absolută.
3

Determinarea MAD

Calculează mediana acestor abateri absolute.

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

σ̂ = 1.4826 × MAD

De ce 1,4826?

Acest factor de scalare provine din relația dintre MAD și DS pentru distribuții normale. Asigură că MAD scalat este un estimator nebiased al deviației standard reale atunci când datele sunt normale.

Intervalul intercuartilic (IQR)

IQR măsoară dispersia mijlocului de 50% din date — intervalul dintre percentilele 25 și 75:

IQR Formula

IQR = Q3 - Q1 = 75th percentile - 25th percentile

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

σ̂ = IQR / 1.35 ≈ 0.7413 × IQR

Compararea măsurilor robuste

Deviația standard

Utilizează toate punctele de date · Cea mai eficientă pentru date normale · Foarte sensibilă la valori aberante · Punct de rupere: 0%

MAD

Cea mai robustă măsură · Folosește mediana (nu media) · Imună la orice valori aberante · Punct de rupere: 50%

IQR

Ușor de înțeles · Utilizat în diagrame box plot · Ignoră extremele de 50% · Punct de rupere: 25%

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

Python
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}")