Como lidar com problemas quando os dados estão incompletos
Às vezes você abre uma planilha e percebe que metade das células está em branco. Não é um erro de formatação, não é um bug no script. As informações simplesmente não existem. Isso acontece mais do que parece, especialmente em projetos que envolvem dados de origem pública ou migrações legadas. Quando me deparei com isso pela primeira vez, em 2019, estava trabalhando num projeto de análise de séries temporais para uma prefeitura. O banco de dados tinha registros desde 2010, mas os campos de data de validade dos instrumentos estavam truncados em cerca de 40% dos casos. O problema era que os registros que faltavam não eram aleatórios. Eles concentravam-se em um período específico entre 2014 e 2015, quando houve mudança de sistema. Se eu simplesmente removesse as linhas com datas incompletas, estava eliminando um chunk inteiro de dados por um gap administrativo, não por uma ausência real do fenômeno.
A solução que funcionou foi simples e quase óbvia depois. Eu mapeei os intervalos conhecidos mais próximos e interpolei as datas faltantes usando como referência o ciclo anual do instrumento. Em vez de tratar cada registro isoladamente, Agrupei por unidade administrativa e apliquei uma interpolação linear dentro de cada grupo. O resultado foi que os filtros que eu aplicava deixavam de gerar viés de seleção. Os dados que eu usava para treinar o modelo passavam a representar o comportamento real, não apenas os períodos em que o sistema funcionou corretamente.
O que eram as questões fundamentais nesse tipo de situação
Quando você está navegando por dados incompletos, acaba percebendo que a maior parte do trabalho não é técnica. É conceitual. A pergunta errada te leva para o caminho errado. Tratavam-se de questões fundamentais sobre o que estava faltando e por quê. Era preciso distinguir entre dados que não existem (o registro nunca foi coletado) e dados que não foram registrados (a coleta aconteceu, mas o sistema falhou). Isso faz diferença na hora de escolher o método de preenchimento. Se os dados não existem porque a coleta foi intencionalmente interrompida, interpolá-los é introduzir ruído. Se os dados não foram registrados porque o sistema falhou, há uma base real para estimação. A diferença parece sutil, mas no campo ela é tudo.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Um detalhe que pouca gente menciona: às vezes o gap nos dados carrega informação. No projeto da prefeitura, percebi que os registros ausentes coincidiam com mudanças de gestão. Isso não era ruído. Era um sinal. Quando você trata lacunas como problemas a serem resolvidos, perde essa leitura. A lacuna em si pode ser um dado. Outro ponto prático que ninguém ensina: valide seus métodos de preenchimento com holdout intencional. Pegue 10% dos dados que você sabe que existem, simulate a falta deles e veja se seu método de interpolação recupera valores próximos do real. Fiz isso com uma amostra de 500 registros e a média absoluta do erro ficou em torno de 12 dias. Para o propósito do modelo, isso era aceitável. Para outro tipo de análise, talvez não fosse. O limiar depende do que você está tentando responder.
Existe também um problema que surge com frequência e causa dor de cabeça desnecessária. Alguns frameworks de machine learning tratam valores ausentes de formas diferentes. O scikit-learn não permite dados NaN em muitos classificadores. O pandas tenta ser flexível, mas isso gera comportamentos inesperados em operações de agrupamento. No meu caso, tive um bug em que um merge entre dois DataFrames estava descartando linhas porque um dos campos tinha tipos diferentes em cada tabela. Um estava como object, o outro como string. Parecia besteira, mas levou três horas para identificar. Se você está começando a lidar com esse tipo de problema, sugiro duas coisas. Primeiro, documente tudo. Cada decisão de preenchimento, cada intervalo interpolado, cada suposição. Daqui a seis meses você vai precisar justificar seu trabalho para alguém e não vai lembrar dos detalhes. Segundo, não confie cegamente em autofill ou imputação automática. Essas ferramentas são práticas, mas elas escondem pressupostos que podem distorcer seus resultados sem você perceber.
Na prática, o que funciona é entender a estrutura dos dados antes de tocar em qualquer algoritmo. Passe tempo olhando os gaps. Mapeie padrões. Conversa com quem produziu aqueles dados quando possível. Muitas vezes a pessoa que cadastrou os registros sabe exatamente por que certos campos ficaram em branco e isso resolve 80% do problema antes de você abrir um notebook. Tem situação em que nada disso funciona. Dados genuinamente ausentes, sem padrão identificável, sem fonte alternativa para cross-reference. Nesses casos, não adianta forçar preenchimento. O honesto é documentar a limitação e prosseguir com os dados disponíveis, deixando claro onde estão as lacunas. Modelos treinados com dados parcialmente preenchidos tendem a superestimar performance em validação cruzada. Você vê acurácia boa e só depois percebe que o modelo estava memorizando padrões artificiais criados pela imputação.
A maioria dos tutoriais sobre o assunto mostra exemplos limpos, com datasets sintéticos e gaps triviais. A realidade é mais bagunçada. O importante é saber identificar quando os dados estão te dizendo algo, mesmo quando parecem estar faltando.