Data Quality
Qualidade dos Dados
Dados do mundo real são bagunçados. Antes de treinar qualquer modelo, você deve entender a qualidade dos seus dados, identificar problemas e decidir como abordá-los. Má qualidade de dados frequentemente é mais difícil de corrigir do que uma má escolha de modelo.
"Cientistas de dados passam 60–80% do tempo limpando e preparando dados." — Estimativa comum da indústria
Valores Faltantes
Dados faltantes (NaN, NULL, None) são o problema de qualidade de dados mais comum. Mas nem todos os dados faltantes são iguais — o mecanismo do valor faltante determina a estratégia correta.
| Mecanismo | Definição | Exemplo | Estratégia |
|---|---|---|---|
| MCAR — Faltando Completamente ao Acaso | Faltando independentemente do valor | Falha aleatória do sensor | Qualquer imputação ou deleção é segura |
| MAR — Faltando ao Acaso | Faltando depende de outras variáveis observadas | Renda não reportada com mais frequência por pessoas mais jovens | Imputar usando outras features |
| MNAR — Faltando Não ao Acaso | Faltando depende do próprio valor faltante | Pessoas de alta renda menos propensas a reportar renda | Muito difícil; pode precisar de conhecimento de domínio |
Detectando Valores Faltantes
import pandas as pd
# Contar valores faltantes
print(df.isnull().sum())
print(df.isnull().mean() * 100) # como percentual
# Heatmap de padrões faltantes
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(df.isnull(), cbar=False, yticklabels=False, cmap='viridis')
Estratégias de Imputação
from sklearn.impute import SimpleImputer, KNNImputer
# Imputação por média
imp = SimpleImputer(strategy='mean')
X_train = imp.fit_transform(X_train)
X_test = imp.transform(X_test) # use as estatísticas do treino!
# Imputação KNN (mais precisa, mais lenta)
imp = KNNImputer(n_neighbors=5)
X_train = imp.fit_transform(X_train)
X_test = imp.transform(X_test)
Outliers
Outliers são pontos de dados que se desviam significativamente do restante. Podem ser:
- Genuínos: observações extremas, mas válidas (ex: um bilionário em um dataset de renda)
- Erros: erros de medição, erros de entrada de dados
Métodos de Detecção
import numpy as np
# Método Z-score
z_scores = np.abs((df - df.mean()) / df.std())
outliers = (z_scores > 3).any(axis=1)
# Método IQR (mais robusto)
Q1, Q3 = df.quantile(0.25), df.quantile(0.75)
IQR = Q3 - Q1
outliers = ((df < Q1 - 1.5*IQR) | (df > Q3 + 1.5*IQR)).any(axis=1)
print(f"Outliers: {outliers.sum()} / {len(df)} ({outliers.mean()*100:.1f}%)")
Estratégias de Tratamento
| Estratégia | Quando usar |
|---|---|
| Remover | Erros claros de medição, pequena porcentagem |
| Limitar/Winsorizar | Manter valor, mas truncar para percentil |
| Transformar (log, raiz) | Dados assimétricos à direita com muitos outliers altos |
| Manter | Valores extremos genuínos relevantes para a tarefa |
Duplicatas e Ruído
Duplicatas — linhas idênticas ou quase idênticas — inflam contagens de treinamento e podem causar overfitting:
Ruído — erros aleatórios nos valores de features ou rótulos — é mais difícil de detectar. Estratégias:
- Suavização de rótulos (alvos suaves em vez de 0/1 rígido)
- Aumento de dados
- Métodos ensemble (média sobre o ruído)
- Aprendizado confiante (identificar amostras provavelmente mal rotuladas)
Checklist de Auditoria de Qualidade de Dados
def relatorio_qualidade_dados(df, col_alvo=None):
print("=== Relatório de Qualidade de Dados ===")
print(f"Forma: {df.shape}")
print(f"\nValores faltantes:")
print(df.isnull().sum()[df.isnull().sum() > 0])
print(f"\nDuplicatas: {df.duplicated().sum()}")
print(f"\nTipos de dados:\n{df.dtypes}")
if col_alvo:
print(f"\nDistribuição de classes:\n{df[col_alvo].value_counts(normalize=True)}")
print(f"\nResumo numérico:")
print(df.describe())