A limpeza que apaga o sinal
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.
- 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
# 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 linhasAs 187 linhas removidas eram os pedidos corporativos — 34% do faturamento. A análise passou a descrever um negócio que não existe.
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 minutoDois 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ência | Exemplo | Tratamento |
|---|---|---|
| Não se aplica | data_cancelamento de quem não cancelou | Nulo é a informação — não preencha |
| Não coletado no período | uf antes de 2024 | Excluir o período ou analisar separado |
| Falha de sistema | lote perdido em uma janela | Excluir a janela, documentar |
| Ausência informativa | renda não declarada | Criar categoria "não informado" — a ausência é sinal |
| Aleatória e pequena | <1% sem padrão | Aí 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.
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)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.
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.
- 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ê.
- 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 GoogleAinda não há comentários nesta aula.