Usando z-scores para detecção de anomalias

Detecção de Anomalias em Python

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

O que são z-scores?

  • Z-scores indicam:
    • quantos DEs a partir da média

Exemplo:

  • Em uma distribuição com $\mu=10$ e $\sigma=3$:
    • $Z_{16.3}=(16.3-10) / 3=2.1$

A fórmula para calcular z-scores.

Detecção de Anomalias em Python

A Regra Empírica e outliers

A Regra Empírica:

  • 68% está a 1 DE
  • 95% está a 2 DEs
  • 99,7% está a 3 DEs

Outliers:

  • fora do limite de 3 DEs
  • vão para as caudas (áreas rosas nas laterais)

Imagem da Regra Empírica da Wikipédia mostrando uma distribuição normal com as partes de 68%, 95% e 99,7% anotadas.

1 Imagem da página "Empirical Rule" na Wikipédia
Detecção de Anomalias em Python

Z-scores no código

from scipy.stats import zscore


scores = zscore(sales) scores[:5]
0    0.910601
1   -1.018440
2   -0.049238
3    0.849103
4   -0.695373
Detecção de Anomalias em Python

Z-scores no código

is_over_3 = np.abs(scores) > 3

is_over_3[:5]
0    False
1    False
2    False
3    True
4    False
Detecção de Anomalias em Python

Z-scores no código

outliers = sales[is_over_3]

print(len(outliers))
90
Detecção de Anomalias em Python

Limitações dos z-scores

  • Funciona melhor com dados normalmente distribuídos
  • Média e DE sofrem grande influência de outliers
  • Desempenho cai com muitos outliers
Detecção de Anomalias em Python

Median Absolute Deviation (MAD)

  • Mede dispersão (variabilidade)
  • Mais resiliente a outliers
  • Usa a mediana como base

A fórmula para calcular o Median Absolute Deviation (MAD).

Detecção de Anomalias em Python

Pontuação MAD

from scipy.stats import median_abs_deviation

mad_score = median_abs_deviation(sales)

mad_score
1081.925
Detecção de Anomalias em Python

Introdução ao PyOD

  • Z-scores modificados com MAD estão no PyOD
  • PyOD - biblioteca Python Outlier Detection:
    • oferece mais de 40 algoritmos
    • todos têm sintaxe similar ao sklearn
Detecção de Anomalias em Python

Z-scores modificados no código

from pyod.models.mad import MAD

# threshold defaults to 3.5
mad = MAD(threshold=3.5)


# Reshape sales sales_reshaped = sales.values.reshape(-1, 1)
Detecção de Anomalias em Python

Z-scores modificados no código

labels = mad.fit_predict(sales_reshaped)

print(labels.sum())
83
Detecção de Anomalias em Python

Vamos praticar!

Detecção de Anomalias em Python

Preparing Video For Download...