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
Ponto de Ruptura
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
Encontrar a Mediana
Calcular os Desvios
Encontrar o MAD
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
Por que 1,4826?
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
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
Comparando Medidas Robustas
Desvio Padrão
MAD
IQR
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
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}")