← Curso IA na prática para Analistas de Dados: do pedido vago ao número que se sustenta 20 aulas
Consultar e transformar com conferência

A limpeza que apaga o sinal

Armadilha 9 min de leitura

Remover outlier, preencher nulo e deduplicar são as três operações que a IA sugere primeiro — e as três que mais destroem informação.

Peça ajuda para "limpar os dados" e vem uma receita padrão: remover outliers acima de 3 desvios, preencher nulos com a média, remover duplicatas. As três operações são defensáveis em algum contexto e destrutivas na maioria.

Ao final desta aula você consegue
  • Tratar outlier como informação antes de tratá-lo como ruído.
  • Escolher tratamento de nulo a partir do motivo da ausência.
  • Deduplicar sabendo qual linha manter e por quê.

1. O outlier costuma ser o assunto

A limpeza automática
# remove outliers
q1, q3 = df.valor.quantile([0.25, 0.75])
iqr = q3 - q1
df = df[(df.valor >= q1 - 1.5*iqr) & (df.valor <= q3 + 1.5*iqr)]

print(f"removidas {removidas} linhas")  # removidas 187 linhas

As 187 linhas removidas eram os pedidos corporativos — 34% do faturamento. A análise passou a descrever um negócio que não existe.

Olhar antes de remover
extremos = df[df.valor > df.valor.quantile(0.99)]

print(extremos.groupby('segmento').agg(
    n=('valor','size'),
    total=('valor','sum'),
    pct_receita=('valor', lambda s: s.sum()/df.valor.sum()*100)
))

# segmento     n   total        pct_receita
# corporativo  184 R$ 718.400   34,1
# erro_import    3 R$  90.000    4,3   ← valor 1000x, mesmo minuto

Dois grupos completamente diferentes dentro dos "outliers": 184 clientes reais e 3 erros de importação. Só o segundo grupo deve sair.

A diferença: Outlier estatístico não é sinônimo de erro. Em receita, uso e tempo de resposta, os extremos costumam ser exatamente o fenômeno de interesse. A pergunta é sempre: este valor é impossível, ou apenas incomum?

O extremo é...Ação
Impossível (idade 300, valor negativo em campo positivo)Corrigir na origem ou excluir, documentando
Erro conhecido (importação, teste, bot)Excluir com filtro nomeado, não por desvio-padrão
Real e raro (cliente corporativo, pico de Black Friday)Manter — e reportar mediana ao lado da média
Real e frequente demais para ser "outlier"Sua distribuição é assimétrica; troque a estatística, não o dado

2. Nulo tem motivo

Preencher nulo com a média é o conselho mais dado e o mais perigoso, porque ele inventa dado com aparência de dado. Antes de escolher o tratamento, descubra por que está faltando:

Motivo da ausênciaExemploTratamento
Não se aplicadata_cancelamento de quem não cancelouNulo é a informação — não preencha
Não coletado no períodouf antes de 2024Excluir o período ou analisar separado
Falha de sistemalote perdido em uma janelaExcluir a janela, documentar
Ausência informativarenda não declaradaCriar categoria "não informado" — a ausência é sinal
Aleatória e pequena<1% sem padrãoAí sim dá para ignorar ou imputar, declarando

A quarta linha é a mais sutil: quem não informa renda difere sistematicamente de quem informa. Imputar a média apaga esse sinal e ainda estreita artificialmente a variância.

Diagnóstico antes de qualquer tratamentopython
def diagnostico_nulos(df):
    for col in df.columns:
        n = df[col].isna().sum()
        if n == 0:
            continue
        pct = n / len(df) * 100
        print(f"\n{col}: {n} nulos ({pct:.1f}%)")

        # A ausência está concentrada em algum grupo? Se sim, não é aleatória.
        for dim in ['ano', 'canal', 'segmento']:
            if dim in df.columns:
                taxa = df.groupby(dim)[col].apply(lambda s: s.isna().mean() * 100)
                if taxa.max() - taxa.min() > 20:
                    print(f"  ⚠ concentrado em {dim}:")
                    print(taxa.round(1).to_string())

diagnostico_nulos(df_pedidos)
O alerta de concentração é o que importa: nulo espalhado por igual pode ser ignorado; nulo concentrado em um ano, canal ou segmento vai enviesar qualquer comparação entre eles.

3. Deduplicar sem decidir é perder dado

drop_duplicates() mantém a primeira ocorrência. Isso é uma decisão — quase sempre tomada por acidente. Se as linhas diferem em alguma coluna (data de atualização, status, valor), você acabou de escolher a versão mais antiga do registro sem perceber.

A pergunta correta é a mesma da aula do caso: qual das N linhas eu quero? A mais recente? A de maior valor? A do status final? Responder isso é análise; drop_duplicates() é sorteio.

Pedido de limpeza que não destrói
Preciso preparar estes dados para: [a análise específica]

Estrutura: [colunas e tipos]
Diagnóstico que já rodei:
- Nulos: [coluna: n (%) e se está concentrado em algum grupo]
- Extremos: [o que existe acima do p99, e o que são]
- Duplicatas: [quantas, e em que colunas diferem]

Para CADA tratamento que você propuser, responda antes de aplicar:
1) Quantas linhas isso remove ou altera, e que fração da métrica elas representam
2) Que informação real pode estar sendo apagada
3) Como a análise mudaria se eu NÃO fizesse esse tratamento
4) Existe alternativa que preserva o dado (categoria "não informado",
   estatística robusta, análise em separado)?

Não proponha remover outlier por desvio-padrão sem antes eu te dizer
o que aqueles valores são.

O item 3 é o mais revelador: se a análise não muda sem o tratamento, o tratamento era desnecessário e só adicionou risco.

Checagem antes de seguir
  • Olhei o que são os extremos antes de removê-los.
  • Exclusões usam filtro nomeado, não desvio-padrão.
  • O motivo de cada nulo foi investigado antes do tratamento.
  • Verifiquei se os nulos estão concentrados em algum grupo.
  • Toda deduplicação define qual linha manter e por quê.
  • O relatório declara quantas linhas foram removidas e por quê.
Em uma frase
  • Outlier estatístico não é sinônimo de erro — pergunte se o valor é impossível ou apenas incomum.

Comentários e dúvidas

Inscreva-se grátis para comentar, tirar dúvidas, marcar seu progresso e emitir o certificado ao fim do curso.

Inscrever-se grátis com Google

Ainda não há comentários nesta aula.