Σ
SDCalc
IntermedioConceptos·12 min

Estadística robusta: MAD, IQR y métodos resistentes a valores atípicos

Guía completa de estadística robusta incluyendo la desviación absoluta mediana (MAD) y el rango intercuartílico (IQR). Aprenda cuándo usar medidas de dispersión resistentes a valores atípicos con ejemplos y código en Python.

¿Por qué estadística robusta?

La desviación estándar es una medida de dispersión poderosa, pero tiene una debilidad crítica: sensibilidad extrema a los valores atípicos. Un solo valor extremo puede incrementar drásticamente la DE, proporcionando una imagen engañosa de la variación típica.

La estadística robusta proporciona medidas de dispersión que resisten la influencia de los valores atípicos, siendo esenciales para datos del mundo real donde los errores de medición, los errores de ingreso de datos o los casos genuinamente extremos son habituales.

Ejemplo: El efecto de los valores atípicos

Datos: 10, 12, 11, 13, 12, 11, 100 (un valor atípico) Desviación estándar: 32.4 (dominada por el valor atípico) MAD: 1.0 (ignora el valor atípico) IQR: 1.5 (ignora el valor atípico)

Punto de ruptura

El "punto de ruptura" de un estadístico es la proporción de datos que pueden ser extremos antes de que el estadístico pierda significado. La DE tiene un punto de ruptura del 0% (un solo valor atípico puede invalidarla). La MAD y el IQR tienen puntos de ruptura del 50%: la mitad de sus datos pueden ser atípicos y aún funcionan.

Desviación absoluta mediana (MAD)

La MAD es la medida de dispersión más robusta. Calcula la mediana de las desviaciones absolutas respecto a la mediana:

Fórmula de la MAD

MAD = median(|xᵢ - median(x)|)
1

Calcular la mediana

Obtenga la mediana de su conjunto de datos.
2

Calcular las desviaciones

Reste la mediana de cada valor y tome los valores absolutos.
3

Obtener la MAD

Calcule la mediana de estas desviaciones absolutas.

Escalar la MAD para estimar σ: Para datos con distribución normal, MAD ≈ 0.6745 × σ. Para estimar la DE a partir de la MAD, multiplique por 1.4826:

Estimación de DE a partir de MAD

σ̂ = 1.4826 × MAD

¿Por qué 1.4826?

Este factor de escala proviene de la relación entre la MAD y la DE para distribuciones normales. Asegura que la MAD escalada sea un estimador insesgado de la verdadera desviación estándar cuando los datos son normales.

Rango intercuartílico (IQR)

El IQR mide la dispersión del 50% central de los datos: el rango entre los percentiles 25 y 75:

Fórmula del IQR

IQR = Q3 - Q1 = percentil 75 - percentil 25

El IQR se utiliza ampliamente porque es simple de entender, fácil de visualizar en diagramas de caja y constituye la base de la regla común "1.5×IQR" para la detección de valores atípicos.

Escalar el IQR para estimar σ: Para datos normales, IQR ≈ 1.35 × σ. Para estimar la DE a partir del IQR:

Estimación de DE a partir de IQR

σ̂ = IQR / 1.35 ≈ 0.7413 × IQR

Comparación de medidas robustas

Desviación estándar

Utiliza todos los datos · Más eficiente para datos normales · Muy sensible a valores atípicos · Punto de ruptura: 0%

MAD

Medida más robusta · Usa la mediana (no la media) · Inmune a cualquier valor atípico · Punto de ruptura: 50%

IQR

Fácil de entender · Se usa en diagramas de caja · Ignora el 50% extremo · Punto de ruptura: 25%

Cuándo usar estadística robusta

  • Análisis exploratorio: Cuando no se sabe si existen valores atípicos, comience con medidas robustas
  • Problemas de calidad de datos: Cuando los datos pueden contener errores o problemas de medición
  • Distribuciones de colas pesadas: Cuando se esperan valores extremos (rendimientos financieros, reclamaciones de seguros)
  • Muestras pequeñas: Cuando los valores atípicos tienen un impacto desproporcionado debido al escaso número de observaciones
  • Detección de valores atípicos: Usar la DE para detectar valores atípicos es circular; utilice IQR o MAD en su lugar

Ejemplos de implementación

Python
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}")