Introdução de ponta a ponta para lidar com valores ausentes

Nó Fonte: 1121996

Este artigo foi publicado como parte do Blogathon de Ciência de Dados

Visão geral

Os dados nos fornecem o poder de analisar e prever os eventos do futuro. A cada dia, mais e mais empresas adotam técnicas de ciência de dados, como previsão preditiva, clustering e assim por diante. Embora seja muito intrigante continuar aprendendo sobre algoritmos complexos de ML e DL, não se deve esquecer de dominar o essencial pré-processamento de dados. Uma das partes importantes do pré-processamento de dados é o tratamento de valores ausentes. Este é um guia completo sobre como lidar com diferentes tipos de dados ausentes.

Conteúdo

  1. Por que é importante lidar com valores ausentes?
  2. Razões por trás dos valores ausentes
  3. Tipos de valores ausentes
  4. Verifique se há valores ausentes no conjunto de dados
  5. Visualizando valores ausentes
  6. Eliminando linhas com valores ausentes
  7. Descartando colunas com valores ausentes
  8. Imputação para variáveis ​​contínuas
    1. Imputação com média
    2. Imputação com Mediana
  9. Prevendo os valores ausentes com regressão
  10. Valores ausentes em dados categóricos
  11. Valores ausentes em dados de série temporal
    1. Preencher valores ausentes
    2. Preencher valores ausentes para trás
    3. Interpolação linear
  12. Algoritmos robustos para valores ausentes
  13. Conclusão

Por que é importante lidar com dados ausentes?

Os dados do mundo real apresentam muitos dados ausentes na maioria dos casos. Pode haver diferentes razões pelas quais cada valor está faltando. Pode haver perda ou corrupção de dados, ou também pode haver motivos específicos. Os dados ausentes diminuirão o poder preditivo do seu modelo. Se você aplicar algoritmos com dados ausentes, haverá viés na estimativa dos parâmetros. Você não pode ter certeza sobre seus resultados se não lidar com os dados ausentes.

Razões por trás dos valores ausentes

Já se perguntou sobre os motivos da falta de dados em conjuntos de dados?

Algumas das possíveis razões por trás da falta de dados são:

  • As pessoas não fornecem informações sobre determinadas questões num inquérito de recolha de dados. Por exemplo, alguns podem não se sentir confortáveis ​​em partilhar informações sobre o seu salário, consumo de álcool e hábitos de fumar. Estes são deixados de lado intencionalmente pela população
  • Em alguns casos, os dados são acumulados a partir de vários registos anteriores disponíveis e não diretamente. Neste caso, a corrupção de dados é um problema importante. Devido à baixa manutenção, algumas partes dos dados são corrompidas, dando origem a dados perdidos
  • Imprecisões durante o processo de recolha de dados também contribuem para a falta de dados. Por exemplo, na entrada manual de dados, é difícil evitar completamente erros humanos
  • Inconsistências de equipamentos levando a medições incorretas, que por sua vez não podem ser utilizadas.

Tipos de valores ausentes

A falta de dados pode ocorrer por diversos motivos. Podemos categorizá-los em três grupos principais: Perdidos Completamente Aleatoriamente, Perdidos Aleatoriamente, Não Perdidos Aleatoriamente.

1. Completamente ausente aleatoriamente (MCAR)

Os dados faltantes não seguem nenhum padrão específico, são simplesmente aleatórios. A falta desses dados não está relacionada ou é independente das demais variáveis. Não é possível prever esses valores com o restante dos dados variáveis. Por exemplo, durante a coleta de dados, uma determinada amostra se perde por descuido. Este é um caso ideal, onde estatisticamente a análise não será tendenciosa. Mas você não deve presumir a presença de MCAR a menos que tenha certeza, pois é uma situação rara.

2. Desaparecido aleatoriamente (MAR)

Aqui, ao contrário do MCAR, os dados estão faltando em subconjuntos específicos. É possível prever se os dados estarão presentes/ausentes com a ajuda de outros recursos. Porém, você não pode prever os dados ausentes por si só.

Por exemplo, consideremos uma pesquisa sobre o tempo gasto na internet, que possui uma seção sobre o tempo gasto em plataformas como Netflix, Amazon Prime. Observa-se que os idosos (acima de 45 anos) têm menor probabilidade de preenchê-lo do que os mais jovens. Este é um exemplo de MAR. Aqui, o parâmetro ‘Idade’ decide se os dados estarão faltando ou não. MAR ocorre muito comumente que MCAR.

3. Não faltando aleatoriamente (NMAR)

Esta é uma situação séria e complicada. Digamos que o objetivo da pesquisa seja medir o uso excessivo/vício em mídias sociais. Se as pessoas que usam excessivamente as redes sociais não preencherem a pesquisa intencionalmente, então temos um caso de NMAR. Isso provavelmente levará a um viés nos resultados. Os métodos usuais, como eliminar linhas/colunas e imputação, não funcionarão. Para resolver isso, seria necessário um conhecimento profundo do domínio.

Agora que vimos os diferentes tipos de dados faltantes, vamos avançar para as diversas formas de lidar com eles.

Verifique se há valores ausentes

Quando você tem um conjunto de dados, a primeira etapa é verificar quais colunas possuem dados ausentes e quantos. Vamos usar o conjunto de dados mais famoso entre os conhecimentos da ciência de dados, é claro, o sobrevivente do Titanic! Leia o conjunto de dados usando a função pandas read_csv conforme mostrado abaixo.

train=pd.read_csv('../input/titanic/train.csv') test=pd.read_csv('../input/titanic/test.csv') print('Forma dos dados de treinamento: ', train.shape ) print('Testando forma de dados: ', test.shape) train.head()

Dados de valores ausentes

Fonte: Imagem do caderno Kaggle do autor

Agora temos os quadros de dados de treinamento e teste dos dados do Titanic.

Como verificar quais colunas possuem dados faltantes e quantos?

A função “isnull()” é usada para isso. Quando você chama a função sum junto com isnull, a soma total dos dados ausentes em cada coluna é a saída.

valores_faltados=train.isnull().sum() imprimir(valores_missos)
PassengerId 0 Sobreviveu 0 Pclass 0 Nome 0 Sexo 0 Idade 177 SibSp 0 Parch 0 Passagem 0 Tarifa 0 Cabine 687 Embarcado 2 dtype: int64

Observe que 3 colunas possuem valores faltantes: Idade, Cabine, Embarcado

Embora saibamos quantos valores faltam em cada coluna, é fundamental saber a porcentagem deles em relação aos valores totais. Então, vamos calcular isso em uma única linha de código.

mis_value_percent = 100 * train.isnull().sum() / len(train) print(mis_value_percent)
PassengerId 0.000000 Sobreviveu 0.000000 Pclass 0.000000 Nome 0.000000 Sexo 0.000000 Idade 19.865320 SibSp 0.000000 Parch 0.000000 Passagem 0.000000 Tarifa 0.000000 Cabine 77.104377 0.224467 Embarcado 64 dtype: floatXNUMX

É claro que faltam 77% da Coluna 'Cabine', o que é uma percentagem muito significativa. A idade tem cerca de 19% de dados faltantes e o Embarked tem apenas 0.2% de falta. Esta é a análise quantitativa dos dados faltantes que temos. E qualitativo? Continue lendo!

Visualizando valores ausentes com Missingno

Adivinha? Temos um pacote python especialmente para visualizar e explorar os dados ausentes de um conjunto de dados. O pacote python “Missingno”. Vá em frente e instale-o rapidamente

pip instalar faltando não

Usando isso, podemos fazer visualizações na forma de mapas de calor, gráficos de barras e matrizes. Ao analisar como eles são distribuídos, você pode concluir em que categoria eles se enquadram em MCAR, MAR ou NMAR. Também podemos encontrar a correlação das colunas que contêm os ausentes com a coluna de destino

Comece fazendo um gráfico de barras para valores não nulos usando a função 'bar()' da biblioteca Missingno. Você passou o dataframe do pandas para esta função.

importar missingno como msno msno.bar (trem)

faltando não | valores ausentesFonte: Imagem do caderno Kaggle do autor

A seguir, podemos traçar a visualização da matriz. Isso nos ajuda a saber como os dados faltantes estão distribuídos pelos dados, ou seja, se estão localizados ou distribuídos uniformemente, ou se existe algum padrão e muitas dessas questões.

msno.matrix(trem)
barra de padrão

No gráfico da matriz, você verá linhas em branco para cada dado ausente. Observe que a coluna 'Embarcado' possui apenas dois dados perdidos aleatórios, que não seguem nenhum padrão. Eles provavelmente foram perdidos durante a aquisição de dados. Portanto, isso pode ser classificado como Ausente completamente ao acaso.

As colunas de idade e cabine poderiam ser MAR. Mas queremos garantir que não haja correlações entre eles.

Como fazer isso?

Para nossa sorte, o pacote missingno também fornece a função ‘heatmap’. Usando isso, podemos descobrir se há alguma correlação entre os dados ausentes de colunas diferentes.

msno.heatmap(trem)

A saída é mostrada!

mapa de calor | valor ausente

O mapa de calor mostra que não existe uma correlação tão forte entre os dados ausentes da coluna Idade e Cabine. Assim, os dados faltantes dessas colunas podem ser classificados como MAR ou Missing at Random.

Espero que você tenha claro como analisar valores ausentes. A seguir, passarei a discutir as diferentes maneiras de lidar com esses dados ausentes.

Eliminando linhas com valores ausentes

É um método simples, onde eliminamos todas as linhas que possuem valores ausentes pertencentes a uma determinada coluna. Por mais fácil que seja, traz uma enorme desvantagem. Você pode acabar perdendo uma grande parte dos seus dados. Isso reduzirá o tamanho do seu conjunto de dados e tornará as previsões do seu modelo tendenciosas. Você deve usar isso somente quando o número de valores ausentes for muito menor.

Por exemplo, a coluna 'Embarcado' possui apenas 2 valores ausentes. Portanto, podemos eliminar as linhas onde esta coluna está faltando. Siga o trecho de código abaixo.

print('Conjunto de dados antes:', len(train)) train.dropna(subset=['Embarked'],how='any',inplace=True) print('Conjunto de dados depois:', len(train)) print( 'valores ausentes:',train['Embarked'].isnull().sum())
Conjunto de dados antes: 891 Conjunto de dados depois: 889 valores ausentes: 0

Imagine se você fizesse o mesmo para a coluna ‘Idade’. Você perderia cerca de 77% dos seus dados!

Colunas caindo

Quando uma coluna tem grandes valores ausentes, não faz sentido imputar os valores com os dados verdadeiros menos disponíveis que temos. Portanto, quando qualquer coluna tiver mais de 80% de valores ausentes, você pode simplesmente retirar essa coluna da sua análise. No nosso caso, 'Cabin' tem 77% de dados faltantes, então você pode optar por descartar esta coluna.

Certifique-se de que a coluna eliminada não seja crucial para sua análise. Nesse caso, você deve tentar obter mais dados e então imputar os valores ausentes.

Imputação para variável contínua

treinar['Idade'][:10]
0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 5 NaN 6 54.0 7 2.0 8 27.0 9 14.0 Nome: Idade, dtype: float64
trem['Idade']=trem['Idade'].replace(np.NaN,train['Idade'].mean()) trem['Idade'][:10]
0 22.000000 1 38.000000 2 26.000000 3 35.000000 4 35.000000 5 29.699118 6 54.000000 7 2.000000 8 27.000000 9 14.000000 Nome: Idade , dtype: float64

Você pode ver que 'NaN' foi substituído por 29.699 (a média calculada).

A imputação média tem certas desvantagens. Se os dados tiverem uma distribuição muito desigual, com muitos valores discrepantes, a Média não refletirá a distribuição real dos dados. A média é muito afetada por valores extremos ou discrepantes. Portanto, se os dados não tiverem muitos valores discrepantes e seguirem uma distribuição quase normal, use a imputação média

Imputação com Mediana

Os valores ausentes de um recurso contínuo podem ser preenchidos com a mediana dos valores não nulos restantes. A vantagem da mediana é que ela não é afetada pelos valores discrepantes, ao contrário da média. Vamos implementá-lo aqui.

trem['Idade']=treinar['Idade'].replace(np.NaN,train['Idade'].median()) trem['Idade'][:10]

imputação com média

Você pode observar que o valor mediano (28.0) foi preenchido no lugar dos valores NaN.

Da mesma forma, você também pode realizar a imputação de modo. Geralmente, a imputação com o modo é popular para valores faltantes categóricos. Abordarei isso em detalhes em uma seção posterior

Prevendo os valores ausentes com regressão

Em vez de preencher um único valor médio ou mediano em todos os lugares, e se pudéssemos prevê-los com a ajuda de outras variáveis ​​que temos?

Sim! Podemos usar os recursos com valores não nulos para prever os valores ausentes. Um modelo de regressão ou classificação pode ser construído para a previsão de valores faltantes. Vamos implementar isso para a coluna 'Idade' do nosso conjunto de dados titânico.

Podemos processar os dados para construir o modelo. O recurso “Idade” será a variável de destino.

x_trem: As linhas do conjunto de dados que possuem o valor “Idade” presente são filtradas. A 'Idade' é o alvo x_teste: É a coluna “Idade” com valores não nulos

A y_train terá os dados com valores de idade ausentes, que serão previstos (y_pred)

importar pandas como pd data=pd.read_csv('../input/titanic/train.csv') data = data[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Tarifa ", "Idade"]] dados["Sexo"] = [1 se x=="masculino" else 0 para x em dados["Sexo"]] test_data = dados[dados["Idade"].isnull()] data.dropna(inplace=True) x_train = data.drop("Idade", eixo=1) x_test = test_data.drop("Idade", eixo=1) y_train = dados["Idade"]

Vamos ajustar um modelo de regressão linear a esses dados. Usarei a biblioteca sklearn aqui.

de sklearn.linear_model importar modelo LinearRegression = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test)

Agora, temos os valores nulos da coluna Idade previstos em y_pred.

Imprimirei alguns exemplos da entrada do teste e da saída prevista para sua melhor compreensão.

imprimir(x_teste[:10])
Sobreviveu Pclass Sex SibSp Parch Fare 5 0 3 1 0 0 8.4583 17 1 2 1 0 0 13.0000 19 1 3 0 0 0 7.2250 26 0 3 1 0 0 7.2250 28 1 3 0 0 0 7.8792 29 0 3 1 0 0 7.8958 31 1 1 0 1 0 146.5208 32 1 3 0 0 0 7.7500 36 1 3 1 0 0 7.2292 42 0 3 1 0 0 7.8958

É assim que as entradas são passadas para o modelo de regressão. Vejamos os valores de idade previstos.

imprimir(y_pred[:10])
[29.07080066 30.10833306 22.44685065 29.08927347 22.43705181 29.07922599 32.43692984 22.43898701 22.15615704 29.07922599]

Viva! Conseguimos os valores.

Valores ausentes em dados categóricos

Até agora, vimos como lidar com dados numéricos ausentes. E se faltarem dados no caso de um recurso categórico? Por exemplo, o recurso “Cabin” do conjunto de dados do Titanic é categórico. Aqui, não podemos calcular média e mediana. Assim, podemos preencher os valores ausentes com a moda ou classe/categoria que ocorre com mais frequência.

trem['Cabin']=trem['Cabin'].fillna(train['Cabin'].value_counts().index[0])

Quando a percentagem de valores omissos for menor, este método é preferido. Não causa uma grande perda de dados e é estatisticamente relevante.

Mas se você tiver muitos valores ausentes, não faz sentido imputar a classe mais frequente. Em vez disso, vamos criar uma categoria separada para valores ausentes, como “Desconhecido” ou “Indisponível”. O número de aulas será aumentado em uma.

Quando os valores ausentes são de colunas categóricas (string ou numéricas), os valores ausentes podem ser substituídos pela categoria mais frequente. Se o número de valores ausentes for muito grande, ele poderá ser substituído por uma nova categoria.

trem['Cabin']=trem['Cabin'].fillna('Desconhecido') trem['Cabin'][:10]

FILA DE CABINE | preencher

Funciona bem com um pequeno conjunto de dados. Também anula a perda de dados adicionando uma categoria exclusiva.

Como lidar com valores ausentes em dados de série temporal?

Os conjuntos de dados onde as informações são coletadas juntamente com carimbos de data/hora de maneira ordenada são denotados como dados de série temporal. Se houver valores ausentes nos dados de série temporal, obviamente você pode tentar qualquer um dos métodos discutidos acima. Mas também existem alguns métodos específicos que podem ser usados ​​aqui.

Para se ter uma ideia, criarei um conjunto de dados fictício simples.

time= pd.date_range("1/01/2021", períodos=10, freq="W") df = pd.DataFrame(index=time); df["Unidades vendidas"] = [5.0,4.0,np.nan,np.nan,1.0,np.nan,3.0,6.0,np.nan,2.0]; imprimir (df)

unidades vendidas

Vamos passar para os métodos

Preencher valores ausentes

O valor da próxima linha será usado para preencher o valor ausente. 'ffill' significa 'preenchimento direto'. É muito fácil de implementar. Basta passar o parâmetro “método” como “ffill” na função fillna().

forward_filled = df.fillna (método = 'ffill') imprimir (forward_filled)

para frente preenchido

Preencher valores ausentes para trás

Aqui, usamos o valor da linha anterior para preencher o valor ausente. 'bfill' significa preenchimento reverso. Aqui, você precisa passar 'bfill' como parâmetro do método.

backward_filled = df.fillna (método = 'bfill') imprimir (backward_filled)

backeard preenchido

Espero que você consiga identificar a diferença em ambos os casos com as imagens acima.

Interpolação linear

Os dados de série temporal têm muitas variações. Os métodos de imputação acima usando backfill e forward fill não são a melhor solução possível. Interpolação Linear para o resgate!

Aqui, os valores são preenchidos com valores crescentes ou decrescentes. É uma espécie de técnica de imputação, que tenta traçar uma relação linear entre os pontos de dados. Ele usa os valores não nulos disponíveis para calcular os pontos ausentes.

interpolado = df.interpolate (limit_direction = "ambos") imprimir (interpolado)

Interpolação linear de valores ausentes

Compare esses valores com o preenchimento para frente e para trás e verifique por si mesmo o que é bom!

Estas são algumas maneiras básicas de lidar com valores ausentes em dados de série temporal

Algoritmos robustos para valores ausentes

Existem alguns casos em que nenhuma das opções acima funciona bem. No entanto, você precisa fazer uma análise. Então, você deve optar por algoritmos que suportem valores ausentes. KNN (K vizinhos mais próximos) é um desses algoritmos. Ele considerará os valores ausentes tomando a maioria dos K ​​valores mais próximos. A floresta aleatória também é robusta para dados categóricos com valores ausentes. Muitos algoritmos baseados em árvore de decisão, como XGBoost e Catboost, suportam dados com valores ausentes.

Conclusão

Para resumir, o primeiro passo é explorar os dados e descobrir quais variáveis ​​possuem dados faltantes, qual é a porcentagem e a que categoria ela pertence. Depois disso, você terá uma ideia estratégica de quais métodos pode tentar. Uma dica útil é tentar o algoritmo de imputação com K vizinho mais próximo, além de um modelo de regressão linear. Existem alguns métodos mais recentes que você pode consultar, como usar os métodos Datawig ou Hot-Deck Imputation, se os métodos acima não funcionarem.

Espero que você tenha gostado da leitura.

Você pode se conectar comigo em: [email protegido]

Linkedin: pré-processamento de dados

As mídias mostradas neste artigo não são propriedade da Analytics Vidhya e são usadas a critério do autor.

Fonte: https://www.analyticsvidhya.com/blog/2021/10/end-to-end-introduction-to-handling-missing-values/

Carimbo de hora:

Mais de Análise Vidhya