Навіщо робастна статистика?
Стандартне відхилення є потужною мірою розкиду, але має критичну слабкість: надзвичайну чутливість до викидів. Одне екстремальне значення може різко збільшити СВ, даючи хибну картину типової варіації.
Робастна статистика надає міри розкиду, стійкі до впливу викидів, що робить їх незамінними для реальних даних, де помилки вимірювань, помилки введення даних або справжні екстремальні випадки є звичайними.
Приклад: вплив викиду
Точка зламу
Медіанне абсолютне відхилення (MAD)
MAD є найбільш робастною мірою розкиду. Воно обчислює медіану абсолютних відхилень від медіани:
MAD Formula
Знайти медіану
Обчислити відхилення
Знайти MAD
Масштабування MAD для оцінки σ: Для нормально розподілених даних MAD ≈ 0,6745 × σ. Щоб оцінити СВ із MAD, помножте на 1,4826:
SD Estimate from MAD
Чому 1,4826?
Міжквартильний розмах (IQR)
IQR вимірює розкид середніх 50% даних — діапазон між 25-м та 75-м перцентилями:
IQR Formula
IQR широко використовується завдяки своїй простоті для розуміння, легкості візуалізації у діаграмах розмаху та як основа поширеного “правила 1,5×IQR” для виявлення викидів.
Масштабування IQR для оцінки σ: Для нормальних даних IQR ≈ 1,35 × σ. Щоб оцінити СВ із IQR:
SD Estimate from IQR
Порівняння робастних мір
Стандартне відхилення
MAD
IQR
Коли використовувати робастну статистику
- Розвідувальний аналіз: коли невідомо, чи існують викиди, починайте з робастних мір
- Проблеми якості даних: коли дані можуть містити помилки або проблеми вимірювань
- Важкохвості розподіли: коли очікуються екстремальні значення (фінансові доходності, страхові виплати)
- Малі вибірки: коли викиди мають непропорційний вплив через малу кількість спостережень
- Виявлення викидів: використання СВ для виявлення викидів є замкненим колом; замість нього використовуйте IQR або MAD
Приклади реалізації
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}")