Valores missing: O que são? Onde vivem? Do que se alimentam?

Como lidar com valores ausentes.
Valores missing: O que são? Onde vivem? Do que se alimentam?
  • Carregando índice...

Em minha última publicação, tivemos que deixar 2 pontos em aberto: tratamento de missing e tratamento de outliers. Não foi à toa: quis reservar um espaço dedicado para abordar mais profundamente pontos tão importantes.

E hoje nos debruçaremos sobre o primeiro desses pontos: como lidar com valores ausentes.

Para tanto, vamos utilizar um conjunto de dados públicos fornecido pela Organização Mundial de Saúde relacionado à expectativa de vida e fatores de saúde para 193 países.

Valores missing: O que são?

Dados ausentes, do inglês, missing values, são definidos como dados que não estão presentes para algumas variáveis no conjunto de dados fornecido.

Para termos um noção imagética do quanto o conjunto está esvaziado de valores, que tal usarmos a seguinte biblioteca:

Visualização de dados ausentes com a biblioteca missingno

Valores missing: Como são representados?

A imagem acima é bem interessante porque permite obter um panorama visual rápido da integridade dos dados. Mas, e a nível micro, como será que os valores nulos aparecem na tabela? Vejamos isso selecionando o atributo Population de exemplo, já que parece ter a maior ocorrência:

Exemplificação do valor nulo no atributo Population

Um detalhe é que, apesar de não termos um atributo de data em nosso dataset, para atributos do tipo datetime64[ns], o valor ausente é representado por NaT ao invés de NaN.

Valores missing: Checando a existência de valores missing

Em todo caso, ainda precisamos quantificar de forma mais precisa o quanto a integridade do dataset está comprometida por valores nulos.

Um código rápido é especialmente útil para descrever e para conferir essa exatidão:

A parte isna() detecta valores ausentes, retornando um valor booleano para cada elemento no dataframe. A parte sum() soma os valores, considerando True como 1 e False como 0.

Número de nulos por coluna

Valores missing: Por que existem dados ausentes?

Mas lembre-se: dados são tão somente uma abstração capturada para representar algo da realidade. E, se é assim, pode haver vários motivos na realidade para que um valor esteja ausente. Pense só:

  • Pode haver uma falha no registro dos valores devido a erro humano (por exemplo, por algum motivo, um valor deixou de ser imputado por simples esquecimento, cansaço, etc)
  • Ou, pelo contrário, o fornecedor do dado simplesmente optou intencionalmente por não fornecer determinado dado (quem nunca se negou a responder uma pesquisa?)
  • Ou, às vezes, o fornecedor do dado até se permitiu preencher o dado, mas não tudo, de forma que, para alguns itens, não há resposta
  • E, por fim, os dados podem estar corrompidos devido à manutenção inadequada.

Mas, afora todas essas possibilidades, ainda existe uma outra causa de não haver o dado: ele simplesmente nunca esteve apto a ser capturado, devido à ausência de qualquer processo de registro.

Valores missing: Existe algum viés?

Por curiosidade, aplicamos o seguinte código para agrupar, a nível do grau de desenvolvimento do país, a ocorrência de valores nulos para o atributo população. Será que em países subdesenvolvidos existe alguma maior dificuldade de catalogar dados em saúde?

Porcentagem de valores nulos por tipo de país

Ora, deve ter alguma tendência aí, não é verdade?

Nesse sentido, considerando o padrão de tendências dos nulos, podemos ter as seguintes situações que, como vieses, desviam a incidência de valores nulos:

  • Dados faltantes completamente ao acaso (do inglês, Missing Completely At Random - MCAROs): nesse caso, na verdade, não existe um viés direcionando o sentido dos valores nulos. Simplesmente, não há nenhum padrão entre os dados ausentes e quaisquer outras variáveis. Provavelmente, os valores ausentes se devem a erros esporádicos de registro, embora não se possa afirmar com certeza.
  • Dados faltantes ao acaso (do inglês, Missing At Random - MAR): apesar do nome, nesse caso, a omissão não é aleatória, e pode ser explicada pela relação com variáveis coletadas. Ou seja, a probabilidade da falta de dados depende da relação com variáveis existentes no conjunto de dados. O exemplo do nosso dataset se encaixa justamente aqui - existem mais valores ausentes para países subdesenvolvidos, não é verdade?
  • Dados faltantes não ao acaso (do inglês, Missing Not At Random - MNAR): nessa última categoria, encaixam-se os casos em que os valores ausentes dependem dos dados não observados. Isso pode acontecer devido à relutância das pessoas em fornecer as informações necessárias por algum motivo não captado diretamente pelos dados coletados. Um bom exemplo talvez sejam as pesquisas eleitorais para presidente na última eleição, onde parece ter havido, deliberadamente, uma abstenção de resposta por uma parte do eleitorado.

Valores missing: Por que seu tratamento é importante?

Ok, já sabemos o que é e como surgem os valores missing. Mas por que será eles são tão importantes assim?

  • O primeiro problema diz respeito à precisão da análise estatística. Por exemplo, é substancialmente diferente concluir sobre o percentual do todo, se no denominador estamos contando todas as entradas ou apenas as entradas não nulas. Desse modo, nossa conclusão pode não ser representativa da realidade.
  • Já quando falamos de algoritmos de aprendizado de máquina (coisa que, passado os conceitos basilares, passaremos a discutir), é importante ressaltar que podemos acabar criando um modelo bastante tendencioso se os valores ausentes não forem tratados adequadamente.

Valores missing: Como tratar?

Por falar em tratar, felizmente, é possível, de alguma forma, lidar com os valores nulos. Existem várias formas de fazer isso, vejam só:

a) Deleção: A forma mais fácil de limpar uma sujeira é jogá-la para debaixo do tapete, certo?

De fato, essa é a saída mais fácil. Você pode simplesmente aplicar algum dos seguintes códigos e seguir a vida:

  • Deleção de linhas:
  • Deleção de colunas com pelo menos um valor ausente:

No entanto, nem tudo é tão simples. Existem implicações de realizar a deleção, que devem ser consideradas.

  1. A mais óbvia delas é que, nesse bota-fora, você pode acabar excluindo informações que seriam valiosas. Como falamos anteriormente, insights potenciais podem ser encontrados até nos próprios valores ausentes. Ora, em alguns casos, a razão pela qual os dados estão faltando pode ser inclusive um componente importante do problema em questão.
  2. Outra perda que pode ser importante é a redução do tamanho da amostra, o que, consequentemente, pode diminuir o poder estatístico da análise.
  3. Se os valores ausentes não estiverem ausentes aleatoriamente (lembre-se dos conceitos de MAR e MNAR), excluí-los pode introduzir viés nos resultados.
  4. Por fim, em certos tipos de análise, como é o caso das séries temporais (um verdadeiro capítulo à parte), a exclusão de valores ausentes pode introduzir artefatos que podem influenciar os resultados.

Portanto, se é para "jogar a sujeira para debaixo do tapete", simplesmente dropando valores nulos, considere essa abordagem mais em cenários em que o número de valores ausentes é pequeno, de forma que a perda será praticamente insignificante. Além disso, observe se a ausência de valores é distribuída aleatoriamente no conjunto de dados, caso em que excluir os valores ausentes não introduzirá vieses.

b) Imputação:

Outra abordagem possível, é ir no sentido contrário: ao invés de jogar fora o dado, a ideia é tentar completá-lo de alguma maneira, inputando valores. Para tanto, existem diferentes métodos de fazer isso, dentre os quais vamos abordar os principais, veja só:

  • Imputar um valor arbitrário: vamos supor que você tem uma tabela de consultas e quer saber, para cada paciente de uma tabela cadastral, qual é o número de consultas. Ora, se você agregar a tabela de consultas por paciente para saber, para os pacientes que já foram consultados, o número de consultas que tiveram, e daí então, com a tabela de cadastro, fazer uma união (left join, falaremos sobre isso em algum momento) com a tabela agregada de atendimentos, para saber, para todos os pacientes cadastrados, o número de consultas que tiveram, é óbvio que os pacientes que não aparecerem na tabela de atendimentos terão valores nulos. Nesse caso, é razoável assumir que tais pacientes tiveram zero consultas, certo? Pois bem, esse é um exemplo de quando inputar um valor arbitrário como zero, coisa que pode ser feita da seguinte forma:
  • Imputação de medidas de tendência central: esse é o método mais comum de fazer imputação, pois, no frigir dos ovos, tal imputação provoca pouco distúrbio nos dados, já que não alteramos significativamente a estatística do conjunto. Decidir, entretanto, se vamos imputar a média ou mediana, não é uma escolha trivial. Ela depende da assimetria da distribuição dos dados (coisa que veremos quando formos abordar Outliers, em nosso próximo encontro). Em todo caso, em termos de código, é coisa fácil, veja só:

Outra medida de tendência central frequentemente utilizada para imputação, sobretudo para variáveis categóricas (ainda estou devendo uma explicação maior sobre esses conceitos), é introduzir a moda, ou seja, o valor que mais frequentemente aparece.

Para variáveis categóricas, outra estratégia para driblar os valores nulos é simplesmente passando a chamá-los de "Outros", criando uma nova categoria "Garbage".

  • Inputação pelos valores próximos (do inglês, backward e forward): essa é uma forma de inputação comum para o caso de séries temporais (um capítulo à parte sobre o qual, em algum momento, vamos nos debruçar). Por exemplo, vamos supor que você tem uma série de pesos coletados de pacientes, mas, por algum motivo, a série é quebrada, pois em algumas consultas não foi coletado o peso. Ora, que tal completarmos os valores ausentes pelo peso imediatamente próximo? Para isso, aplique os seguintes códigos:

Bem, essas são algumas das estratégias mais simples de imputação. Mas saiba que existem muitas outras mais, que pela complexidade, preferimos abordar em seção à parte. Dentre essas estratégias mais complexas, podemos listar o uso da interpolação e o uso de algoritmos para prever o valor nulo.

Em algum momento, depois de galgar os conceitos mais basilares, chegaremos lá. Mas, por ora, nos diga - e aí, o que você faria para lidar com os valores nulos do nosso conjunto de dados?

Posteriormente, deixo no Github o que preferi adotar, veja só: https://github.com/gregrodrigues22/python_blog

Valores missing: Resumindo

Como vimos, a falta de dados é um problema que inevitavelmente todos nós enfrentaremos ao lidarmos com cenários da vida real. Ainda mais na saúde, os sistemas de input (vide prontuários) são bastante problemáticos quando o assunto é prevenir valores nulos (afora as estratégias humanas de "colocar qualquer coisa para completar campos" ou intencionalmente colocar códigos mais "interessantes", situação conhecida como upcoding).

Como esse fenômeno pode afetar decisivamente a qualidade e a precisão de nossos resultados, precisamos compreender os diferentes tipos de valores de dados ausentes e seu impacto potencial na análise, a fim de que consideremos a melhor forma de lidar com os valores ausentes.

Naturalmente, cada método tem suas vantagens e desvantagens e a escolha de um ou outro método vai depender do problema de negócio que estamos enfrentando.

Mas, como cientista de dados, o mais importante ao se tomar uma decisão (sim, é uma decisão que, ao final das contas, cabe a você) é ter uma explicação plausível e demonstrável para justificar o caminho que você optou tomar, seja qual for ele.

Gostou? Compartilhe!

Artigos relacionados

Outliers: os pontos fora da curva

Outliers: os pontos fora da curva

As vezes os outliers são desconcertantes e a existência atrapalha as conclusões (porem usarmos eles como exceção ajuda confirmar a regra)

Inovação
16
 minutos de leitura
3 dicas para o seu RH reduzir custos usando tecnologia

3 dicas para o seu RH reduzir custos usando tecnologia

Saiba tudo o que a tecnologia pode fazer por você quando o tempo é curto, os dados são muitos e os recursos são escassos

Inovação
11
 minutos de leitura
Rastreamento populacional: O que os dados nos contam

Rastreamento populacional: O que os dados nos contam

O coeficiente de rastreamento populacional para as principais linhas de cuidado é baixo, confira a analise de dados de milhões de pacientes:

Inovação
20
 minutos de leitura

Assine nossa Newsletter!

Receba informações valiosas sobre a saúde corporativa da sua empresa e dê as boas-vindas à nova era do cuidado

Apenas E-mails corporativos
Verifique o campo de e-mail. Somente serão aceitos e-mails corporativos.
Agradecemos o seu interesse!
A nossa newsletter é publicada semanalmente e enviada para o seu e-mail.
Ops! Algo deu errado ao enviar o formulário.
close
Mulher de braços cruzados
Espero que goste desse artigo. A 3778 pode ajudar a transformar a Saúde da sua empresa. Faça um orçamento para Saúde Ocupacional, Gestão Ambulatorial ou Terceirização em Saúde.