Miért robusztus statisztika?
A szórás hatékony szóródási mutató, de van egy kritikus gyengesége: rendkívül érzékeny a kiugró értékekre. Egyetlen szélsőséges érték drasztikusan megnövelheti a szórást, félrevezető képet adva a tipikus változékonyságról.
A robusztus statisztikák olyan szóródási mutatókat kínálnak, amelyek ellenállnak a kiugró értékek hatásának, így nélkülözhetetlenek a valós adatokhoz, ahol a mérési hibák, adatbeviteli tévedések vagy valódi szélsőséges esetek gyakoriak.
Példa: A kiugró érték hatása
Törési pont
Medián abszolút eltérés (MAD)
A MAD a legrobusztusabb szóródási mutató. A mediántól való abszolút eltérések mediánját számítja ki:
MAD Formula
Medián meghatározása
Eltérések kiszámítása
MAD meghatározása
A MAD skálázása σ becsléséhez: Normális eloszlású adatoknál MAD ≈ 0,6745 × σ. A szórás MAD-ból történő becsléséhez szorozd meg 1,4826-tal:
SD Estimate from MAD
Miért 1,4826?
Interkvartilis terjedelem (IQR)
Az IQR az adatok középső 50%-ának szóródását méri – a 25. és 75. percentilis közötti terjedelmet:
IQR Formula
Az IQR széles körben használatos, mert könnyen érthető, egyszerűen vizualizálható dobozdiagramokon, és az általános „1,5×IQR szabály” alapját képezi a kiugró értékek felismeréséhez.
Az IQR skálázása σ becsléséhez: Normális adatoknál IQR ≈ 1,35 × σ. A szórás IQR-ből történő becsléséhez:
SD Estimate from IQR
Robusztus mutatók összehasonlítása
Szórás
MAD
IQR
Mikor használjunk robusztus statisztikát?
- Feltáró elemzés: Ha nem tudod, hogy vannak-e kiugró értékek, kezdj robusztus mutatókkal
- Adatminőségi problémák: Ha az adatok hibákat vagy mérési problémákat tartalmazhatnak
- Vastag szélű eloszlások: Ha szélsőséges értékek várhatók (pénzügyi hozamok, biztosítási kárigények)
- Kis minták: Ha a kiugró értékek aránytalanul nagy hatással bírnak a kevés megfigyelés miatt
- Kiugróérték-felismerés: A szórás használata kiugró értékek felismerésére körkörös érvelés; használd helyette az IQR-t vagy a MAD-ot
Implementációs példák
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}")