Σ
SDCalc
IntermédioConceitos·12 min

Estatísticas Robustas: MAD, IQR e Métodos Resistentes a Outliers

Guia completo de estatísticas robustas incluindo o Desvio Absoluto Mediano (MAD) e a Amplitude Interquartil (IQR). Aprende quando utilizar medidas de dispersão resistentes a outliers com exemplos e código Python.

Porquê Estatísticas Robustas?

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

As estatísticas robustas proporcionam medidas de dispersão que resistem à influência dos outliers, sendo essenciais para dados do mundo real onde erros de medição, erros na introdução de dados ou casos genuinamente extremos são comuns.

Exemplo: O Efeito dos Outliers

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 Rutura

O “ponto de rutura” de uma estatística é a proporção de dados que pode ser extrema antes de a estatística se tornar sem significado. O DP tem um ponto de rutura de 0% (um outlier pode destruí-lo). O MAD e o IQR têm pontos de rutura de 50% — metade dos teus dados pode ser outliers e eles continuam a funcionar.

Desvio Absoluto Mediano (MAD)

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

Fórmula do MAD

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

Encontrar a Mediana

Calcular a mediana do conjunto de dados.
2

Calcular os Desvios

Subtrair a mediana de cada valor e calcular os valores absolutos.
3

Encontrar o MAD

Calcular a mediana destes desvios absolutos.

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

Estimativa do DP a partir do MAD

σ̂ = 1.4826 × MAD

Porquê 1,4826?

Este fator de escala provém da relação entre o MAD e o DP para distribuições normais. Garante que o MAD escalado é um estimador não enviesado do verdadeiro desvio-padrão quando os dados são normais.

Amplitude Interquartil (IQR)

O IQR mede a dispersão dos 50% centrais dos dados — a amplitude entre o percentil 25 e o percentil 75:

Fórmula do IQR

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

O IQR é amplamente utilizado porque é simples de compreender, fácil de visualizar em diagramas de caixa e forma a base da regra comum “1,5×IQR” para deteção de outliers.

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

Estimativa do DP a partir do IQR

σ̂ = IQR / 1.35 ≈ 0.7413 × IQR

Comparar Medidas Robustas

Desvio-Padrão

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

MAD

Medida mais robusta · Utiliza a mediana (não a média) · Imune a quaisquer outliers · Ponto de rutura: 50%

IQR

Fácil de compreender · Utilizado em diagramas de caixa · Ignora os 50% extremos · Ponto de rutura: 25%

Quando Utilizar Estatísticas Robustas

  • Análise exploratória: Quando não sabes se existem outliers, começa com medidas robustas
  • Problemas de qualidade dos dados: Quando os dados podem conter erros ou problemas de medição
  • Distribuições com caudas pesadas: Quando valores extremos são esperados (retornos financeiros, sinistros de seguros)
  • Amostras pequenas: Quando os outliers têm impacto desproporcionado devido a poucas observações
  • Deteção de outliers: Utilizar o DP para detetar outliers é circular; utiliza o IQR ou o MAD em alternativa

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