Um dos problemas mais comuns que podemos enfrentar na limpeza e exploração de dados é lidar com os valores ausentes.
Em primeiro lugar, entenda que NÃO há uma boa maneira de lidar com dados faltantes. Eu encontrei diferentes soluções para imputação de dados dependendo do tipo de problema – Análise de séries temporais, ML, Regressão etc. e é difícil fornecer uma solução geral.
Vamos aqui então resumir os métodos mais usados e tentar encontrar uma solução estrutural.
Imputação vs Remoção de Dados
Antes de saltar para os métodos de imputação de dados, temos que entender o motivo pelo qual os dados desaparecem.
- Missing at Random (MAR): Faltar dados aleatoriamente significa que a propensão para um ponto de dados estar ausente não está relacionada aos dados ausentes, mas está relacionada a alguns dos dados observados.
- Missing Completely at Random (MCAR): O fato de que um certo valor está faltando não tem nada a ver com seu valor hipotético e com os valores de outras variáveis.
- Missing not at Random (MNAR): Duas razões possíveis são que o valor ausente depende do valor hipotético (por exemplo, pessoas com salários altos geralmente não querem revelar suas rendas em pesquisas) ou o valor ausente depende do valor de alguma outra variável (por exemplo Vamos supor que as mulheres geralmente não querem revelar suas idades! Aqui, o valor em falta na variável age é impactado pela variável gender)
Nos dois primeiros casos, é seguro remover os dados com valores ausentes dependendo de suas ocorrências, enquanto no terceiro caso, remover observações com valores ausentes pode produzir um viés no modelo.
Portanto, temos que ter muito cuidado antes de remover as observações. Observe que a imputação não fornece necessariamente melhores resultados.
Eliminação
- Listwise
Listwise deletion (análise de caso completo) remove todos os dados de uma observação que tenha um ou mais valores ausentes. Particularmente, se os dados faltantes forem limitados a um pequeno número de observações, você pode optar por eliminar esses casos da análise. No entanto, na maioria dos casos, muitas vezes é desvantajoso usar a exclusão Listwise. Isso ocorre porque as suposições do MCAR (Missing Completely at Random) são geralmente raras de serem suportadas. Como resultado, os métodos de exclusão de lista produzem parâmetros e estimativas com viés.
# No R novos_dados <- na.omit(dados) # No python dados.dropna(inplace=True)
- Pairwise
A exclusão por pares (Pairwise deletion) analisa todos os casos em que as variáveis de interesse estão presentes e, assim, maximiza todos os dados disponíveis por uma base de análise. Uma força para essa técnica é que ela aumenta o poder em sua análise, mas tem muitas desvantagens. Ele assume que os dados ausentes são MCAR. Se você excluir pairwise, você acabará com um número diferente de observações contribuindo para diferentes partes do seu modelo, o que pode dificultar a interpretação.
#Pairwise Deletion
ncovMatrix <- cov(mydata, use="pairwise.complete.obs")
#Listwise Deletion
ncovMatrix <- cov(mydata, use="complete.obs")
- Variáveis Descartáveis
Na minha opinião, é sempre melhor manter os dados do que descartá-los. Às vezes, você pode eliminar variáveis se os dados estiverem faltando para mais de 60% de observações, mas apenas se essa variável for insignificante. Dito isto, a imputação é sempre uma escolha preferida em vez de descartar variáveis
df <- subconjunto (mydata, select = -c (x, z)) df <- mydata [-c (1,3: 4)]
Em python
del mydata.column_name
mydata.drop('column_name', axis=1, inplace=True)
Métodos Específicos de Séries Temporais
- Última observação realizada (LOCF) e próxima observação levada para trás (NOCB)
Esta é uma abordagem estatística comum para a análise de dados longitudinais de medidas repetidas, onde algumas observações de acompanhamento podem estar faltando. Dados longitudinais rastreiam a mesma amostra em diferentes pontos no tempo. Ambos os métodos podem introduzir um viés na análise e um desempenho ruim quando os dados têm uma tendência visível - Interpolação linear
Esse método funciona bem para uma série temporal com alguma tendência, mas não é adequado para dados sazonais - Ajuste Sazonal + Interpolação Linear
Esse método funciona bem para dados com tendência e sazonalidade
library(imputeTS)
na.random(mydata) # Random Imputation na.locf(mydata, option = "locf") # Last Obs. Carried Forward na.locf(mydata, option = "nocb") # Next Obs. Carried Backward na.interpolation(mydata) # Linear Interpolation na.seadec(mydata, algorithm = "interpolation") # Seasonal Adjustment then Linear Interpolation
Média, Mediana e Moda
O cálculo da média geral, mediana ou moda é um método de imputação muito básico, é a única função testada que não aproveita as características da série temporal ou a relação entre as variáveis. É muito rápido, mas tem desvantagens claras. Uma desvantagem é que a imputação média reduz a variação no conjunto de dados
library(imputeTS)
na.mean(mydata, option = "mean") # Mean Imputation na.mean(mydata, option = "median") # Median Imputation na.mean(mydata, option = "mode") # Mode Imputation
In Python from sklearn.preprocessing import Imputer values = mydata.values imputer = Imputer(missing_values=’NaN’, strategy=’mean’) transformed_values = imputer.fit_transform(values)
# strategy can be changed to "median" and “most_frequent”
Regressão linear
Para começar, vários preditores da variável com valores omissos são identificados usando uma matriz de correlação. Os melhores preditores são selecionados e utilizados como variáveis independentes em uma equação de regressão. A variável com dados perdidos é usada como a variável dependente. Casos com dados completos para as variáveis preditoras são usados para gerar a equação de regressão; a equação é então usada para prever valores ausentes para casos incompletos. Em um processo iterativo, os valores da variável ausente são inseridos e, em seguida, todos os casos são usados para prever a variável dependente. Essas etapas são repetidas até que haja pouca diferença entre os valores previstos de um passo para o próximo, ou seja, eles convergem.
Ele “teoricamente” fornece boas estimativas para valores ausentes. No entanto, existem várias desvantagens desse modelo que tendem a superar as vantagens. Primeiro, porque os valores substituídos foram preditos a partir de outras variáveis, eles tendem a se encaixar “muito bem” e, portanto, o erro padrão é esvaziado. Deve-se também assumir que existe uma relação linear entre as variáveis usadas na equação de regressão quando pode não haver uma.
Imputação Múltipla
- Imputação : Impute as entradas ausentes dos conjuntos de dados incompletos m vezes ( m = 3 na figura). Observe que os valores imputados são extraídos de uma distribuição. A simulação de sorteios aleatórios não inclui a incerteza nos parâmetros do modelo. Melhor abordagem é usar a simulação de Markov Chain Monte Carlo (MCMC). Esta etapa resulta em conjuntos de dados completos.
- Análise : Analise cada um dos conjuntos de dados completos.
- Pooling : Integre os resultados da análise m em um resultado final
# We will be using mice library in r
library(mice)
# Deterministic regression imputation via mice
imp <- mice(mydata, method = "norm.predict", m = 1)
# Store data
data_imp <- complete(imp)
# Multiple Imputation imp <- mice(mydata, m = 5)
#build predictive model
fit <- with(data = imp, lm(y ~ x + z))
#combine results of all 5 models
combine <- pool(fit)
Este é, de longe, o método de imputação mais preferido pelas seguintes razões:
– Fácil de usar
– Sem preconceitos (se o modelo de imputação estiver correto)
Imputação de variáveis categóricas
- A imputação de modo é um método, mas com certeza introduzirá viés
- Os valores ausentes podem ser tratados como uma categoria separada por si só. Podemos criar outra categoria para os valores ausentes e usá-los como um nível diferente. Este é o método mais simples.
- Modelos de previsão: aqui, criamos um modelo preditivo para estimar valores que substituirão os dados ausentes. Nesse caso, dividimos nosso conjunto de dados em dois conjuntos: um conjunto sem valores ausentes para a variável (treinamento) e outro com valores omissos (teste).Podemos usar métodos como regressão logística e ANOVA para previsão
- Imputação Múltipla
KNN (K vizinhos mais próximos)
Existem outras técnicas de aprendizado de máquina como XGBoost e Random Forest para imputação de dados, mas discutiremos a KNN como ela é amplamente usada. Neste método, k vizinhos são escolhidos com base em alguma medida de distância e sua média é usada como uma estimativa de imputação. O método requer a seleção do número de vizinhos mais próximos e uma métrica de distância. O KNN pode prever tanto os atributos discretos (o valor mais frequente entre os k vizinhos mais próximos) quanto os atributos contínuos (a média entre os k vizinhos mais próximos)
A métrica da distância varia de acordo com o tipo de dados:
1. Dados Contínuos: As métricas de distância comumente usadas para dados contínuos são Euclidean, Manhattan e Cosine
2. Dados categóricos: a distância de Hamming é geralmente usada neste caso.Leva todos os atributos categóricos e, para cada um, conta um se o valor não for o mesmo entre dois pontos. A distância de Hamming é então igual ao número de atributos para os quais o valor foi diferente.
Uma das características mais atraentes do algoritmo KNN é que é simples de entender e fácil de implementar. A natureza não-paramétrica do KNN confere-lhe uma vantagem em certas configurações onde os dados podem ser altamente “incomuns”.
Uma das desvantagens óbvias do algoritmo KNN é que ele consome tempo ao analisar grandes conjuntos de dados porque ele procura instâncias semelhantes em todo o conjunto de dados. Além disso, a precisão do KNN pode ser severamente degradada com dados de alta dimensão, porque há pouca diferença entre o vizinho mais próximo e o mais distante.
library(DMwR)
knnOutput <- knnImputation(mydata)
In python
from fancyimpute import KNN
# Use 5 nearest rows which have a feature to fill in each row's missing features
knnOutput = KNN(k=5).complete(mydata)
Entre todos os métodos discutidos acima, a imputação múltipla e KNN são amplamente utilizados, e a imputação múltipla sendo mais simples é geralmente preferida.