Um breve estudo sobre outliers - Estudo de Caso
Continuação deste post
Nesta sessão vamos fazer análises mais complexas usando o algoritmo EllipticEnvelope do Sklearn para tentar entender análises de outliers em ambientes mais complexos e multidimensionais.
Lembrando que detalhes das análises e gráficos estão disponíveis aqui.
1. Criação de datasets
Para fazer análise de outliers vamos criar 1 dataset especfico para o que queremos. Detalhes da criação deste set de dados pode ser encontrada aqui.
Basicamente temos uma variável y (store_profit) que tem um hitograma de cauda longa:
Duas variáveis independentes distribuda em torno de um centróide (products in stock e product rating):
E mais uma variável categrica (business_type) e duas variáveis que são números internos, sem padrão de distribuição.
O Dataframe resultante:
Com essas características:
EllipticEnvelope em X e variáveis numéricas
Uma forma simples de identificar outliers é assumir que o dado tem uma determinada distribuição conhecida (por exemplo, Gaussiana). Uma vez que assumimos isso, podemos definir uma “forma” para o dado, e definir que observações que ficam longe desse formato como anomalias.
No Sklearn temos a técnica do covariance.EllipticEnvelope que estima uma covariância robusta ao dado, adaptando uma elipse na parte central da nuvem de dados e ignorando o fora desse centro.
Vamos usar o Elliptic Envelope para avaliar nossos dados considerando que temos 1% de contaminação. Para facilitar a compreensão, vamos utilizar apenas as variáveis products_ind_stock e product_rating como as variáveis no nosso X:
X = df[['products_in_stock', 'product_rating']]
y = df.store_profit
Agora vamos analisar nossos dados apenas considerando nossas variáveis independentes:
from sklearn.covariance import EllipticEnvelope
clf = EllipticEnvelope(contamination=0.01)
clf.fit(X)
inliers = clf.predict(X)
O resultado da análise é um vetor com o mesmo tamanho do nosso DataFrame contendo valores ou 1 ou -1. Todos as observações que tem valor de 1 no vetor foram consideradas pelo algoritmo como inliers, ou seja, valores que são coerentes com a distribuição, enquanto que valores -1 são observaçes consideradas outliers.
O resultado, quando observamos graficamente, é este:
Mas repare que não consideramos que os valor da nossa variável y nesse processo. Dessa forma, ao observamos as amostras em y que foram consideradas outliers elas estão distribudas quase aleatóriamente:
Muito legal hein?
EllipticEnvelope em Y
Agora vamos fazer a mesma análise. Mas, ao invés de passarmos minhas variáveis X para o algoritmo, vamos analisar a minha variável y. Qual resultado é esperado?
y = y.values.reshape(-1,1)
from sklearn.covariance import EllipticEnvelope
clf = EllipticEnvelope(contamination=0.01)
clf.fit(y)
inliers = clf.predict(y)
Na verdade, quando avaliamos uma variável só, especialmente quando ela tem uma longa cauda como observamos lá em cima, o algoritmo basicamente faz um “corte” da cauda.
Dessa forma, temos que o nosso gráfico de y vai aparecer com um “corte”, removendo valores muito extremos:
Agora, se olharmos o gráfico dos valores das variáveis independentes temos a aleatoriadade das amostras:
EllipticEnvelope em X e variáveis categóricas
E se, ao invés de usarmos apenas duas variáveis numéricas como vimos anteriormente, usássemos todas as variáveis que temos disponíveis? Categóricas ou não?
y = df.store_profit
X = df.drop('store_profit', axis=1) # pega todos os valores exceto a coluna do y
Bom, primeiro temos que fazer um encoding das variáveis categóricas para que o algoritmo as entenda:
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
X['business'] = encoder.fit_transform(X['business'])
Depois a análise fica exatamente do mesmo jeito que anteriormente:
from sklearn.covariance import EllipticEnvelope
clf = EllipticEnvelope(contamination=0.01)
clf.fit(X)
inliers = clf.predict(X)
O resultado é diferente daquele que encontramos anteriormente, considerando apenas duas variveis:
Entretanto, não tem como fazermos a avaliação visual de como isso se comporta no espaço, como fizemos no exemplo anterior :/
Reflexão
A análise de outliers depende muito do dado que você está vendo e o que você quer observar. Isso já é um senso-comum. Porém, ao se fazer uma análise, devemos sempre ter em mente que diferentes técnicas resultam em diferentes outliers, dependendo do enfoque que você der para ela ou da forma como ela faz a identificação. Muitas vezes, o melhor é tentar fazer diferentes técnicas para ver qual delas é mais eficiente.
Considerando os casos que apresentei, a conclusão que eu obtive é que existem 3 casos diferentes que podem ocorrer quando se tenta identificar um outlier para fazer análises preditivas a partir dos dados:
Caso 1: Temos uma anomalia em y
O primeiro caso teríamos a anomalia presente em y, como mostra a tabela abaixo:
Se fizermos a análise baseando-nos em y, temos a análise removendo corretamente o quinto elemento, que é claramente um outlier. Agora, se fizermos a análise baseando-nos em X, essa observação não será removida.
Caso 2: Temos uma anomalia em X
No segundo caso, a observação anômala ocorrem X. Dessa vez, a análise apenas de y pode não remover esse caso que é, claramente, um anômalo.
Caso 3: Temos anomalia em X e y
No terceiro caso temos a aparição de dados anômalos justamente em X e em y. A análise, de qualquer forma que se olhe, poderia nos dar uma impressão errada de um dado anômalo quando, na verdade, temos um comportamento relativamente fácil de prever. Quando X é grande, y será grande também.
Fim?
Por enquanto foram esses os tópicos que eu cheguei e as análises que fiz para tentar entender melhor o assunto. O tema é vasto, as técnicas são várias e tem muita coisa pela frente. Se você sabe de algo que não está aqui, por favor se sinta a vontade para comentar :)
Referências
Barnett, V. 1978. The study of Outliers: purpose and model. Appl. Statics, 27, no.3, pp.242-250.
Hawkis, D. M. 1980. Identification of Outliers. Monographs on applied probability and statistics. DOI: 10.1007/978-94-015-3994-4.
Rousseeuw, P. J.; Van Driessen, K.. A Fast Algorithm for the minimum covariance determinant estimator
Tukey, J.W., 1977. Exploratory Data Analysis. Addison-Wesley, Reading, MA.
http://www.dbs.ifi.lmu.de/~zimek/publications/SDM2010/sdm10-outlier-tutorial.pdf
❤ Abraço! Letícia