Hvorfor robust statistik?
Standardafvigelse er et kraftfuldt spredningsmål, men den har en kritisk svaghed: ekstrem følsomhed over for outliere. En enkelt ekstrem værdi kan dramatisk oppuste SA og give et vildledende billede af den typiske variation.
Robust statistik giver spredningsmål, der modstår påvirkning fra outliere, hvilket gør dem uundværlige for data fra den virkelige verden, hvor målefejl, dataindtastningsfejl eller ægte ekstreme tilfælde er almindelige.
Eksempel: Outlier-effekten
Nedbrudspunkt
Median Absolute Deviation (MAD)
MAD er det mest robuste spredningsmål. Den beregner medianen af absolutte afvigelser fra medianen:
MAD Formula
Find medianen
Beregn afvigelserne
Find MAD
Skalering af MAD til estimering af σ: For normalfordelte data gælder MAD ≈ 0,6745 × σ. For at estimere SA fra MAD ganges med 1,4826:
SD Estimate from MAD
Hvorfor 1,4826?
Interkvartilbredde (IQR)
IQR måler spredningen af de midterste 50% af data – afstanden mellem 25. og 75. percentil:
IQR Formula
IQR er udbredt, fordi den er nem at forstå, let at visualisere i boksplot og danner grundlag for den almindelige “1,5×IQR-regel” til outlier-detektion.
Skalering af IQR til estimering af σ: For normalfordelte data gælder IQR ≈ 1,35 × σ. For at estimere SA fra IQR:
SD Estimate from IQR
Sammenligning af robuste mål
Standardafvigelse
MAD
IQR
Hvornår skal man bruge robust statistik
- Udforskende analyse: Når du ikke ved, om der findes outliere, start med robuste mål
- Datakvalitetsproblemer: Når data kan indeholde fejl eller måleproblemer
- Tunghalede fordelinger: Når ekstreme værdier er forventelige (finansielle afkast, forsikringskrav)
- Små stikprøver: Når outliere har uforholdsmæssig stor indflydelse på grund af få observationer
- Outlier-detektion: At bruge SA til at opdage outliere er cirkulært; brug IQR eller MAD i stedet
Implementeringseksempler
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}")