Σ
SDCalc
IntermedioConceptos·12 min

Estadística Robusta: MAD, RIC 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 (RIC). Aprendé cuándo usar medidas de dispersión resistentes a valores atípicos con ejemplos y código Python.

¿Por qué estadística robusta?

El desvío estándar es una medida de dispersión muy útil, pero tiene una debilidad crítica: una sensibilidad extrema a los valores atípicos. Un solo valor extremo puede inflar drásticamente el DE, dando 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, lo que las hace esenciales para datos del mundo real donde los errores de medición, los errores de carga de datos o los casos genuinamente extremos son frecuentes.

Ejemplo: el efecto de un valor atípico

Datos: 10, 12, 11, 13, 12, 11, 100 (un valor atípico) Desvío estándar: 32,4 (dominado por el valor atípico) MAD: 1,0 (ignora el valor atípico) RIC: 1,5 (ignora el valor atípico)

Punto de quiebre

El “punto de quiebre” de un estadístico es la proporción de datos que puede ser extrema antes de que el estadístico pierda su sentido. El DE tiene un punto de quiebre del 0% (un solo valor atípico puede distorsionarlo). La MAD y el RIC tienen puntos de quiebre del 50%: la mitad de tus datos puede ser atípica y aun así 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:

MAD Formula

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

Encontrar la mediana

Calculá la mediana de tu conjunto de datos.
2

Calcular las desviaciones

Restá la mediana de cada valor y tomá los valores absolutos.
3

Encontrar la MAD

Calculá la mediana de estas desviaciones absolutas.

Escalado de MAD para estimar σ: Para datos distribuidos normalmente, MAD ≈ 0,6745 × σ. Para estimar el DE a partir de la MAD, multiplicá por 1,4826:

SD Estimate from MAD

σ̂ = 1.4826 × MAD

¿Por qué 1,4826?

Este factor de escala proviene de la relación entre la MAD y el DE para distribuciones normales. Asegura que la MAD escalada sea un estimador insesgado del desvío estándar verdadero cuando los datos son normales.

Rango Intercuartílico (RIC)

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

IQR Formula

IQR = Q3 - Q1 = 75th percentile - 25th percentile

El RIC es ampliamente utilizado porque es simple de entender, fácil de visualizar en diagramas de caja y constituye la base de la regla habitual de “1,5×RIC” para la detección de valores atípicos.

Escalado del RIC para estimar σ: Para datos normales, RIC ≈ 1,35 × σ. Para estimar el DE a partir del RIC:

SD Estimate from IQR

σ̂ = IQR / 1.35 ≈ 0.7413 × IQR

Comparación de medidas robustas

Desvío estándar

Usa todos los datos · Mayor eficiencia para datos normales · Muy sensible a valores atípicos · Punto de quiebre: 0%

MAD

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

RIC

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

Cuándo usar estadística robusta

  • Análisis exploratorio: cuando no sabés si existen valores atípicos, empezá 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, reclamos de seguros)
  • Muestras pequeñas: cuando los valores atípicos tienen un impacto desproporcionado debido a las pocas observaciones
  • Detección de valores atípicos: usar el DE para detectar valores atípicos es circular; usá el RIC o la 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}")