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
Ponto de Rutura
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
Encontrar a Mediana
Calcular os Desvios
Encontrar o MAD
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
Porquê 1,4826?
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
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
Comparar Medidas Robustas
Desvio-Padrão
MAD
IQR
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
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}")