Ir para o conteúdo

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:

# Verificar duplicatas
print(f"Duplicatas: {df.duplicated().sum()}")
df = df.drop_duplicates()

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())