Como tratar outliers sem excluí-los?
Para desenvolver modelos de aprendizagem de máquina (machine learning) é necessário o tratamento dos dados para que os algoritmos possam entender a informação.
Ao se realizar uma análise exploratória no conjunto de dados, podemos encontrar outliers nas variáveis. Dependendo do tipo do algoritmo, ele poderá ser enviesado por estes valores anormais.
Poderíamos excluí-los já que podem ser frutos de erros ou de qualquer forma estão atrapalhando nossos modelos.
Mas será que essa é de fato a melhor forma?
Nesse artigo irei abordar o que são, como identificar e tratar outliers sem excluí-los.
Bora lá?!
Sumário:
O que são outliers e por que existem?
Identificando outliers
Tratando outliers
O que são outliers e por que existem?
“O outlier é o valor significativamente distinto de um conjunto de observações, ou valor discrepante em relação aos restantes dos dados observados.” ¹
Ou seja, valores que fogem do padrão daquele conjunto de dados.
Por que eles existem?
Bom, vários os motivos podem dar sua origem:
- Erros de entrada/coleta dos dados (digitação errada, sistema com algum erro)
- Pessoas que mentiram em pesquisas (caso os dados venham de formulários)
- Erro de processamento dos dados
- Ou… Valores de fato “fora da curva”
Para erros comuns, como uma idade com valor 400 ou um tempo de trabalho de valor -1000 podemos facilmente visualizar e até mesmo excluir.
Eles também podem ser padrões específicos, que possuem um significado. Então investigue antes de qualquer ação severa como excluir.
Identificando outliers
Como forma inicial podemos olhar uma descrição estatística da distribuição dos dados, como um .describe()
E então podemos visualizar com gráficos, como o boxplot ou um histograma quando estamos analisando apenas uma variável (univariável).
Mas há outras formas de se identificar, principalmente manipulando mais os dados.
Esse artigo trás “4 Formas de Encontrar Outliers em Seus Dados” dentre as formas, destaco utilizando o z-score.
Se lembra dele lá do meu artigo de probabilidade?
Então ele que poderá ser a métrica para entendermos o ponto dentro de uma distribuição normal. O Z-Score de cada valor será:
x = valor
μ = média da distribuição
σ= desvio padrão da distribuição
Podemos visualizar com este gráfico:
Caso os limites considerados sejam de 95% da distribuição, os outliers serão os 2,5% acima e 2,5% abaixo ou 2 vezes o desvio padrão acima ou abaixo da média.
Podemos calcular com o norm do scipy os limites:
Então dentro desta distribuição, 99% dos dados estão entre 50.84… e 133.16…
Valores abaixo e acima deles serão outliers.
Outra forma é com o intervalo interquartil (IQR: interquartil range), que é usado pelo boxplot.
Onde apenas precisamos calcular cada valor do intervalo para verificar os limites.
Valores abaixo e acima destes serão outliers.
Tratamento de outliers
Como temos valores muito fora do “padrão”, como podemos suavizar este problema?
Vamos substituí-los com os valores limites.
Por exemplo com este código:
Defino o valor dos limites (5% e 95%) e substituo pelos valores onde se encontram acima ou abaixo deles.
Poderia verificar com os valores com o scipy para essa probabilidade de 90%:
Você pode verificar que os valores, são praticamente os mesmos (apenas alguns arredondamentos de de casas decimais.
Este artigo (em inglês): “Detecting and Treating Outliers | Treating the odd one out!” trouxe algumas destas formas de tratamento.
Outra forma é substituir eles pelo valor da mediana, pois ela é uma medida que não sofre com a variação dos outliers. Entretanto os dados não serão “suavizados”, mas sim colocados dentro da faixa central do conjunto, o que poderá enviesar o algoritmo também.
Podemos ainda transformar os dados em logaritmos ou ainda mesmo se houverem muitos outliers, separá-los para serem analisados sozinhos.
E você? Conhece outra forma de tratar outliers para ML? Compartilhe nos comentários e vamos trocar conhecimentos.
Se você chegou até aqui e curtiu, dê palmas, compartilhe e se inscreva para me acompanhar.
Ainda há muito a se explorar…
Referências
[1] Lima, L. F. M., Maroldi, A. M., & Silva, D. V. O. da. (2013). Outlier(s) nos cálculos bibliométricos: primeiras aproximações │ Outlier(s) in bibliometric calculations: preliminary approach. Liinc Em Revista, 9(1). https://doi.org/10.18617/liinc.v9i1.522