Varför robust statistik?
Standardavvikelse är ett kraftfullt spridningsmått, men den har en kritisk svaghet: extrem känslighet för avvikande värden. Ett enda extremvärde kan dramatiskt blåsa upp SA:en och ge en missvisande bild av den typiska variationen.
Robust statistik tillhandahåller spridningsmått som motstår inflytandet från avvikande värden, vilket gör dem oumbärliga för verkliga data där mätfel, datainmatningsmisstag eller genuint extrema fall är vanliga.
Exempel: Effekten av avvikande värden
Bristningspunkt
Median Absolute Deviation (MAD)
MAD är det mest robusta spridningsmåttet. Den beräknar medianen av absolutavvikelserna från medianen:
MAD Formula
Hitta medianen
Beräkna avvikelserna
Hitta MAD
Skalning av MAD för att skatta σ: För normalfördelade data gäller MAD ≈ 0,6745 × σ. För att skatta SA från MAD, multiplicera med 1,4826:
SD Estimate from MAD
Varför 1,4826?
Kvartilavstånd (IQR)
IQR mäter spridningen av de mittersta 50 % av data – intervallet mellan 25:e och 75:e percentilen:
IQR Formula
IQR används flitigt eftersom den är enkel att förstå, lätt att visualisera i låddiagram och utgör grunden för den vanliga “1,5×IQR-regeln” för att identifiera avvikande värden.
Skalning av IQR för att skatta σ: För normalfördelade data gäller IQR ≈ 1,35 × σ. För att skatta SA från IQR:
SD Estimate from IQR
Jämförelse av robusta mått
Standardavvikelse
MAD
IQR
När ska robust statistik användas
- Explorativ analys: När du inte vet om avvikande värden finns, börja med robusta mått
- Datakvalitetsproblem: När data kan innehålla fel eller mätproblem
- Tungsvansade fördelningar: När extremvärden förväntas (finansiell avkastning, försäkringskrav)
- Små stickprov: När avvikare har oproportionerlig påverkan på grund av få observationer
- Avvikelsedetektering: Att använda SA för att upptäcka avvikare är cirkulärt; använd IQR eller MAD istället
Implementeringsexempel
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}")