📦 MÓDULO 1: "Qualidade dos Dados: Seu Modelo é Apenas Tão Bom Quanto Seus Dados"

Objetivo:

Entenda por que o pré-processamento não é opcional—é o núcleo de qualquer modelo ML bem-sucedido. Aprenda a diagnosticar a saúde do conjunto de dados antes de tocar em qualquer algoritmo.


1.1 Por que o Pré-processamento é 80% do Trabalho?

"Ciência de dados é 80% limpeza de dados, 20% reclamação sobre limpeza de dados." — Anônimo

No mundo real, os dados nunca chegam limpos, ordenados e prontos para uso. Eles chegam com:

  • Valores ausentes (NaN, None, "", ?)
  • Erros tipográficos ("Madird", "Barcelonaa")
  • Outliers extremos (um salário de 9999999 em uma pesquisa de rendas médias)
  • Formatos inconsistentes (datas como "2024/05/01", "01-May-2024", "1 de mayo")
  • Variáveis categóricas não padronizadas ("Sí", "si", "SI", "yes")

Consequência direta: Alimentar dados sujos em um modelo faz com que ele aprenda padrões incorretos. Lixo Dentro → Lixo Fora.


1.2 Diagnóstico Inicial do Conjunto de Dados

Antes de fazer qualquer coisa, explore seu conjunto de dados como um detetive.

Ferramentas-chave do Pandas:

import pandas as pd

# Carregar conjunto de dados
df = pd.read_csv("dados_fraude.csv")

# Visualização rápida
print(df.head())
print(df.info())  # Tipos de dados e contagens não nulas
print(df.describe())  # Estatísticas descritivas (apenas numéricas)

# Ver valores únicos em colunas categóricas
print(df['tipo_transacao'].unique())
print(df['pais'].value_counts())

# Verificar valores nulos
print(df.isnull().sum())

Visualização diagnóstica com Seaborn:

import seaborn as sns
import matplotlib.pyplot as plt

# Histograma de uma variável numérica
sns.histplot(df['valor_transacao'], bins=50, kde=True)
plt.title("Distribuição do Valor das Transações")
plt.show()

# Boxplot para detectar outliers
sns.boxplot(x=df['valor_transacao'])
plt.title("Boxplot: Encontrando Outliers nos Valores")
plt.show()

# Gráfico de barras para variáveis categóricas
sns.countplot(data=df, x='tipo_cartao')
plt.title("Distribuição dos Tipos de Cartão")
plt.xticks(rotation=45)
plt.show()

1.3 Tratando Valores Ausentes

O que fazer com NaNs?

Opção 1: Excluir linhas ou colunas

# Excluir linhas com qualquer NaN
df_clean = df.dropna()

# Excluir colunas com mais de 50% de NaN
df_clean = df.dropna(axis=1, thresh=len(df)*0.5)

⚠️ Cuidado: Apenas aconselhável se você perder poucos pontos de dados. Se você excluir 30% das suas linhas, seu modelo pode se tornar tendencioso.


Opção 2: Imputação (preencher com valores)

from sklearn.impute import SimpleImputer

# Imputar média para variáveis numéricas
imputer_num = SimpleImputer(strategy='mean')
df[['idade', 'valor_transacao']] = imputer_num.fit_transform(df[['idade', 'valor_transacao']])

# Imputar moda para variáveis categóricas
imputer_cat = SimpleImputer(strategy='most_frequent')
df[['tipo_cartao']] = imputer_cat.fit_transform(df[['tipo_cartao']])

Melhor prática: Use ColumnTransformer para aplicar diferentes estratégias a diferentes colunas (abordaremos isso em detalhes no Módulo 3).


1.4 Tratando Outliers

O que é um outlier?

Um valor que se desvia significativamente do resto dos dados. Pode ser:

  • Um erro de entrada (ex., idade = 999)
  • Um caso real mas extremo (ex., uma transação de $1.000.000 em um conjunto de dados de compras médias de $50)

Métodos de detecção:

  • Regra do IQR (Intervalo Interquartil):
Q1 = df['valor_transacao'].quantile(0.25)
Q3 = df['valor_transacao'].quantile(0.75)
IQR = Q3 - Q1

limite_inferior = Q1 - 1.5 * IQR
limite_superior = Q3 + 1.5 * IQR

outliers = df[(df['valor_transacao'] < limite_inferior) | (df['valor_transacao'] > limite_superior)]
print(f"Outliers detectados: {len(outliers)}")

O que fazer com eles?

  • Excluí-los (se claramente erros)
  • Capping: Substituir pelo limite superior/inferior
df['valor_transacao'] = df['valor_transacao'].clip(lower=limite_inferior, upper=limite_superior)
  • Transformação logarítmica (se a distribuição for altamente assimétrica)
df['log_valor'] = np.log1p(df['valor_transacao'])  # log(1+x) para evitar log(0)

📝 Exercício 1.1: Diagnóstico e Limpeza

Conjunto de dados sugerido: dados_fraude.csv (simulado, com colunas: id_usuario, valor, idade, pais, tipo_cartao, hora_dia, eh_fraude)

Tarefas:

  1. Carregue o conjunto de dados e exiba .info() e .describe().
  2. Identifique quais colunas têm valores ausentes e decida como imputá-los (justifique sua escolha).
  3. Use um boxplot para identificar outliers em valor. Aplique capping baseado em IQR.
  4. Verifique a distribuição de idade. Há valores impossíveis (ex., idade < 0 ou > 120)? Corrija-os.
  5. Salve o conjunto de dados limpo como fraude_limpo.csv.

💡 Notas Adicionais:

  • Nunca assuma que os dados estão limpos. Sempre explore primeiro.
  • Documente cada alteração. Use comentários ou células markdown para explicar por que você excluiu ou imputou algo.
  • Outliers nem sempre são ruins. Na detecção de fraudes, o outlier pode ser exatamente o que você está procurando!

Course Info

Course: AI-course1

Language: PT

Lesson: Module1