Proč robustní statistika?
Směrodatná odchylka je výkonnou mírou rozptylu, ale má zásadní slabinu: extrémní citlivost na odlehlé hodnoty. Jediná extrémní hodnota může dramaticky nafouknout SO a poskytnout zavádějící obraz o typické variabilitě.
Robustní statistika nabízí míry rozptylu, které odolávají vlivu odlehlých hodnot, a jsou proto nezbytné pro reálná data, kde se běžně vyskytují chyby měření, překlepy při zadávání dat nebo skutečné extrémní případy.
Příklad: Vliv odlehlé hodnoty
Bod zhroucení
Medián absolutních odchylek (MAD)
MAD je nejrobustnější míra rozptylu. Počítá medián absolutních odchylek od mediánu:
MAD Formula
Najděte medián
Vypočítejte odchylky
Najděte MAD
Škálování MAD pro odhad σ: Pro normálně rozdělená data platí MAD ≈ 0,6745 × σ. Pro odhad SO z MAD vynásobte hodnotou 1,4826:
SD Estimate from MAD
Proč 1,4826?
Mezikvartilové rozpětí (IQR)
IQR měří rozptyl středních 50 % dat — rozpětí mezi 25. a 75. percentilem:
IQR Formula
IQR se široce používá, protože je snadno srozumitelné, dobře vizualizovatelné v krabicových grafech a tvoří základ běžného pravidla „1,5×IQR“ pro detekci odlehlých hodnot.
Škálování IQR pro odhad σ: Pro normální data platí IQR ≈ 1,35 × σ. Pro odhad SO z IQR:
SD Estimate from IQR
Porovnání robustních měr
Směrodatná odchylka
MAD
IQR
Kdy použít robustní statistiku
- Průzkumová analýza: Když nevíte, zda existují odlehlé hodnoty, začněte robustními mírami
- Problémy s kvalitou dat: Když data mohou obsahovat chyby nebo problémy s měřením
- Rozdělení s těžkými chvosty: Když se očekávají extrémní hodnoty (finanční výnosy, pojistné nároky)
- Malé výběry: Když mají odlehlé hodnoty nepřiměřený dopad kvůli malému počtu pozorování
- Detekce odlehlých hodnot: Používání SO k detekci odlehlých hodnot je kruhové; místo toho použijte IQR nebo MAD
Příklady implementace
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}")