Detecção e tratamento de valores discrepantes
Identifique valores discrepantes com limites baseados no IQR e escores Z, decida se deve limitá-los, removê-los ou sinalizá-los e documente as decisões.
Detecção e tratamento de valores discrepantes é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Pandas & NumPy Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que é um valor atípico?
Um valor atípico é um ponto de dados que difere substancialmente do restante do conjunto de dados. Valores atípicos podem ser genuínos (um único cliente empresarial com um pedido de US$ 500.000 em um conjunto de dados cujos pedidos têm valor médio de US$ 100) ou estar incorretos (um preço negativo ou um erro de digitação que transformou 120 em 12.000). O primeiro passo no tratamento de valores atípicos é decidir se o valor extremo é real e relevante ou se é um problema de qualidade dos dados — o tratamento difere muito entre esses dois casos.
import pandas as pd
import numpy as np
df = pd.read_parquet('sales_clean.parquet')
print(df['revenue'].describe())Detecção visual de valores atípicos: gráfico de caixa
Um gráfico de caixa é a ferramenta visual mais rápida para identificar valores atípicos. A caixa abrange o intervalo interquartil (IQR, Q1–Q3), os bigodes se estendem até 1,5× IQR e os pontos fora dos bigodes são plotados individualmente como possíveis valores atípicos. Use df['revenue'].plot(kind='box') ou sns.boxplot() do Seaborn para visualizar imediatamente os valores atípicos, sem calcular os limites manualmente.
import matplotlib.pyplot as plt
import seaborn as sns
fig, ax = plt.subplots(figsize=(6, 4))
df['revenue'].plot(kind='box', ax=ax)
ax.set_title('Revenue Distribution — Box Plot')
plt.tight_layout()
plt.show()Método dos limites do IQR
O método dos limites do IQR calcula o intervalo interquartil e define os limites em Q1 − 1,5×IQR e Q3 + 1,5×IQR. Valores fora desses limites são sinalizados como atípicos. O multiplicador 1,5 é o padrão para valores atípicos moderados; use 3,0 somente para valores atípicos extremos. Esse método é robusto: ao contrário dos escores Z, não pressupõe uma distribuição normal.
Q1 = df['revenue'].quantile(0.25)
Q3 = df['revenue'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['revenue'] < lower) | (df['revenue'] > upper)]
print(f'Q1={Q1:.0f}, Q3={Q3:.0f}, IQR={IQR:.0f}')
print(f'Bounds: [{lower:.0f}, {upper:.0f}]')
print(f'Outliers: {len(outliers)}')Método do escore Z para detecção de valores atípicos
O escore Z mede quantos desvios padrão um valor está distante da média. Convencionalmente, um valor com |Z| > 3 é considerado atípico, abrangendo 99,7% dos dados normalmente distribuídos. No entanto, os escores Z são sensíveis aos próprios valores atípicos que tentam detectar — valores extremos deslocam a média e aumentam o desvio padrão, podendo ocultar outros valores atípicos.
mean = df['revenue'].mean()
std = df['revenue'].std()
df['revenue_z'] = (df['revenue'] - mean) / std
z_outliers = df[df['revenue_z'].abs() > 3]
print(f'Z-score outliers (|z|>3): {len(z_outliers)}')
print(z_outliers[['revenue', 'revenue_z']].head())Sinalizar versus remover valores atípicos
Nunca remova valores atípicos sem documentar e justificar a decisão. Em vez disso, primeiro sinalize-os com uma coluna booleana (is_outlier) e depois analise se eles compartilham algum padrão (mesma região, mesmo produto, mesmo dia). Se forem genuínos, mantenha-os e modele-os explicitamente. Se forem erros, remova-os e registre a quantidade removida no histórico de auditoria do pipeline.
df['is_revenue_outlier'] = (df['revenue'] < lower) | (df['revenue'] > upper)
print('Flagged rows:', df['is_revenue_outlier'].sum())
print(df.groupby('is_revenue_outlier')['revenue'].describe())Limitando valores atípicos (Winsorizing)
Limitar (ou aplicar winsorização) substitui os valores que ultrapassam os limites pelo próprio valor do limite, em vez de remover a linha. Isso preserva todas as linhas do conjunto de dados e reduz a distorção causada pelos valores atípicos em modelos lineares e estatísticas resumidas. Use clip(lower=, upper=) para aplicar os limites em uma única operação vetorizada.
df['revenue_capped'] = df['revenue'].clip(lower=lower, upper=upper)
print('Original max:', df['revenue'].max())
print('Capped max:', df['revenue_capped'].max())
print('Rows changed:', (df['revenue'] != df['revenue_capped']).sum())Transformação logarítmica para dados assimétricos à direita
As distribuições de receita e preço costumam ser assimétricas à direita, com uma cauda longa de valores altos. Aplicar uma transformação logarítmica com np.log1p() (logaritmo do valor + 1, para lidar com zeros) comprime a cauda e torna a distribuição mais simétrica. Muitos modelos estatísticos e visualizações pressupõem normalidade; por isso, aplicar uma transformação logarítmica à coluna de receita antes da modelagem costuma melhorar os resultados.
df['log_revenue'] = np.log1p(df['revenue'])
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
df['revenue'].hist(bins=50, ax=axes[0])
axes[0].set_title('Original Revenue')
df['log_revenue'].hist(bins=50, ax=axes[1])
axes[1].set_title('Log Revenue')
plt.tight_layout()
plt.show()Valores atípicos em várias colunas
Ao analisar muitas colunas de uma só vez, calcule programaticamente os limites de valores atípicos do IQR para todas as colunas numéricas. Percorra as colunas numéricas, calcule os limites e armazene os resultados em um dicionário. Assim, você pode gerar um relatório completo de valores atípicos em poucas linhas, em vez de repetir manualmente o cálculo do IQR para cada coluna.
numeric_cols = df.select_dtypes(include=['number']).columns
outlier_report = {}
for col in numeric_cols:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
n_out = ((df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)).sum()
outlier_report[col] = n_out
print(pd.Series(outlier_report).sort_values(ascending=False))Valores atípicos bivariados com gráficos de dispersão
Alguns pontos só são atípicos quando considerados em conjunto: um preço unitário de US$ 10 é normal, uma quantidade de 500 é incomum, mas não impossível; já um preço unitário de US$ 10 com uma quantidade de 500 para um item de luxo é suspeito. Valores atípicos bivariados aparecem como pontos isolados em gráficos de dispersão. Use df.plot.scatter('quantity', 'unit_price') para identificar pontos distantes do agrupamento principal.
fig, ax = plt.subplots(figsize=(8, 5))
df.plot.scatter(x='quantity', y='unit_price', alpha=0.3, ax=ax)
ax.set_title('Quantity vs. Unit Price — Bivariate Outliers')
plt.tight_layout()
plt.show()Documentando decisões sobre valores atípicos
Toda decisão sobre valores atípicos deve ser registrada: a coluna, o método de detecção, o limite usado, a quantidade de linhas sinalizadas e o tratamento aplicado (manter, limitar ou remover). Essa documentação protege o analista em revisões de código e auditorias. Armazene-a em um dicionário de registro de limpeza, salvo junto ao conjunto de dados de saída.
outlier_log = {
'column': 'revenue',
'method': 'IQR 1.5x',
'lower_bound': round(lower, 2),
'upper_bound': round(upper, 2),
'rows_flagged': int(df['is_revenue_outlier'].sum()),
'treatment': 'cap (winsorise)'
}
for k, v in outlier_log.items():
print(f'{k}: {v}')Salvando o conjunto de dados tratado
Depois de sinalizar e tratar os valores atípicos, salve o DataFrame atualizado. Mantenha a coluna de sinalização is_outlier na saída, para que os usuários posteriores possam optar por excluir as linhas sinalizadas em análises específicas. Salve a versão limitada em uma coluna com um sufixo claro (_capped) junto à original, para que a limpeza possa ser revertida.
cols_to_save = [c for c in df.columns if c not in ['revenue_z']]
df[cols_to_save].to_parquet('sales_treated.parquet', index=False)
print('Outlier-treated dataset saved:', df.shape)Verificação rápida
Teste sua compreensão dos conceitos de Análise de Dados desta lição.
Recapitulação da lição
Nesta lição, você aprendeu: detectar valores atípicos com os limites do IQR e escores Z, decidir se deve sinalizar, limitar ou remover valores atípicos e aplicar transformações logarítmicas a distribuições assimétricas à direita. A seguir, exploraremos a padronização de rótulos de categorias inconsistentes em colunas de texto.
Perguntas Frequentes
A aula “Detecção e tratamento de valores discrepantes” é grátis?
Sim — o texto completo de “Detecção e tratamento de valores discrepantes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Pandas & NumPy Academy, atualize para CoddyKit PRO. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que vou aprender em “Detecção e tratamento de valores discrepantes”?
Identifique valores discrepantes com limites baseados no IQR e escores Z, decida se deve limitá-los, removê-los ou sinalizá-los e documente as decisões. Você pratica Pandas & NumPy Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Pandas & NumPy Academy?
Nenhuma experiência prévia é necessária. Pandas & NumPy Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Detecção e tratamento de valores discrepantes”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Pandas & NumPy Academy?
Sim. Cada aula de Pandas & NumPy Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Detectando e removendo duplicatas
- Detecção e tratamento de valores discrepantes
- Padronizando categorias inconsistentes
- Validação de esquema e asserções