Σ
SDCalc
IntermediárioConceitos·12 min

Estatística Robusta: MAD, IQR e Métodos Resistentes a Outliers

Guia completo de estatística robusta incluindo Desvio Absoluto Mediano (MAD) e Intervalo Interquartil (IQR). Aprenda quando usar medidas de dispersão resistentes a outliers com exemplos e código Python.

Por que Estatística Robusta?

O desvio padrão é uma medida poderosa de dispersão, mas tem uma fraqueza crítica: extrema sensibilidade a outliers. Um único valor extremo pode inflar drasticamente o DP, dando uma impressão enganosa da variação típica.

A estatística robusta fornece medidas de dispersão que resistem à influência de outliers, sendo essenciais para dados do mundo real onde erros de medição, erros de digitação ou casos genuinamente extremos são comuns.

Exemplo: O Efeito de um Outlier

Dados: 10, 12, 11, 13, 12, 11, 100 (um outlier) Desvio Padrão: 32,4 (dominado pelo outlier) MAD: 1,0 (ignora o outlier) IQR: 1,5 (ignora o outlier)

Ponto de Ruptura

O “ponto de ruptura” de uma estatística é a proporção de dados que pode ser extrema antes que a estatística perca o sentido. O DP tem ponto de ruptura de 0% (um único outlier pode destruí-lo). MAD e IQR têm pontos de ruptura de 50% — metade dos seus dados pode ser outlier e eles ainda funcionam.

Desvio Absoluto Mediano (MAD)

O MAD é a medida de dispersão mais robusta. Ele calcula a mediana dos desvios absolutos em relação à mediana:

Fórmula do MAD

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

Encontrar a Mediana

Calcule a mediana do seu conjunto de dados.
2

Calcular os Desvios

Subtraia a mediana de cada valor e tome os valores absolutos.
3

Encontrar o MAD

Calcule a mediana desses desvios absolutos.

Escalando o MAD para estimar σ: Para dados com distribuição normal, MAD ≈ 0,6745 × σ. Para estimar o DP a partir do MAD, multiplique por 1,4826:

Estimativa de DP a partir do MAD

σ̂ = 1.4826 × MAD

Por que 1,4826?

Esse fator de escala vem da relação entre MAD e DP para distribuições normais. Ele garante que o MAD escalonado seja um estimador não enviesado do verdadeiro desvio padrão quando os dados são normais.

Intervalo Interquartil (IQR)

O IQR mede a dispersão dos 50% centrais dos dados — o intervalo entre os percentis 25 e 75:

Fórmula do IQR

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

O IQR é amplamente utilizado porque é simples de entender, fácil de visualizar em box plots e forma a base da conhecida “regra do 1,5×IQR” para detecção de outliers.

Escalando o IQR para estimar σ: Para dados normais, IQR ≈ 1,35 × σ. Para estimar o DP a partir do IQR:

Estimativa de DP a partir do IQR

σ̂ = IQR / 1.35 ≈ 0.7413 × IQR

Comparando Medidas Robustas

Desvio Padrão

Usa todos os pontos de dados · Mais eficiente para dados normais · Muito sensível a outliers · Ponto de ruptura: 0%

MAD

Medida mais robusta · Usa mediana (não média) · Imune a qualquer outlier · Ponto de ruptura: 50%

IQR

Fácil de entender · Usado em box plots · Ignora 50% extremos · Ponto de ruptura: 25%

Quando Usar Estatística Robusta

  • Análise exploratória: Quando você não sabe se existem outliers, comece com medidas robustas
  • Problemas de qualidade dos dados: Quando os dados podem conter erros ou problemas de medição
  • Distribuições de caudas pesadas: Quando valores extremos são esperados (retornos financeiros, sinistros de seguros)
  • Amostras pequenas: Quando outliers têm impacto desproporcional devido a poucas observações
  • Detecção de outliers: Usar DP para detectar outliers é circular; use IQR ou MAD em vez disso

Exemplos de Implementação

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