Pré-processamento de Dados com Python: Limpeza e Transformação Avançada
Neste artigo, vamos explorar as técnicas avançadas de limpeza e transformação de dados em Python, utilizando bibliotecas poderosas como Pandas, NumPy e Scikit-learn.
1. A importância do pré-processamento
“Garbage in, garbage out” (lixo entra, lixo sai) é uma regra fundamental em ciência de dados.
Se os dados não forem tratados adequadamente, mesmo o melhor algoritmo de Machine Learning pode falhar. O pré-processamento garante que:
Valores faltantes não prejudiquem os cálculos.
Escalas diferentes não distorçam o modelo.
Outliers não gerem vieses indesejados.
Dados categóricos sejam representados numericamente de forma consistente.
2. Carregando e inspecionando os dados
import pandas as pd
# Exemplo: carregando dados fictícios de clientes
data = pd.read_csv("clientes.csv")
print(data.head())
print(data.info())
print(data.describe())
A inspeção inicial ajuda a identificar valores nulos, outliers, colunas irrelevantes e inconsistências.
3. Tratamento de valores ausentes
Dados faltantes podem ocorrer por falhas de coleta, erros de sistema ou omissões humanas. Existem várias estratégias para lidar com eles:
3.1 Remoção de valores nulos
# Remover linhas com valores nulos
data.dropna(inplace=True)
# Remover colunas com muitos nulos
data.dropna(axis=1, thresh=0.7*len(data), inplace=True) # mantém colunas com pelo menos 70% de dados
3.2 Imputação de valores
Média/mediana/moda para valores numéricos.
Categoria mais frequente para dados categóricos.
from sklearn.impute import SimpleImputer
# Imputando valores numéricos com a média
imputer = SimpleImputer(strategy="mean")
data["idade"] = imputer.fit_transform(data[["idade"]])
3.3 Imputação avançada com KNN
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=3)
data_filled = imputer.fit_transform(data.select_dtypes(include=['float64','int64']))
4. Tratamento de outliers
Outliers podem distorcer estatísticas e comprometer modelos.
4.1 Detecção por Z-Score
import numpy as np
z_scores = (data["renda"] - data["renda"].mean()) / data["renda"].std()
outliers = data[z_scores > 3]
4.2 Detecção por IQR (Intervalo Interquartil)
Q1 = data["renda"].quantile(0.25)
Q3 = data["renda"].quantile(0.75)
IQR = Q3 - Q1
outliers = data[(data["renda"] < Q1 - 1.5*IQR) | (data["renda"] > Q3 + 1.5*IQR)]
4.3 Estratégias de tratamento
Remover os outliers.
Transformar os dados (ex: log, raiz quadrada).
Substituir por limites definidos (winsorização).
5. Transformação de variáveis categóricas
Modelos de ML trabalham com números, logo variáveis categóricas precisam ser transformadas.
5.1 One-Hot Encoding
data = pd.get_dummies(data, columns=["genero"], drop_first=True)
5.2 Label Encoding
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data["cidade"] = le.fit_transform(data["cidade"])
5.3 Encoding avançado (Target Encoding, Frequency Encoding)
# Target Encoding: substitui categorias pela média da variável alvo
data["cidade_encoded"] = data.groupby("cidade")["renda"].transform("mean")
6. Escalonamento e normalização
Diferentes escalas podem prejudicar algoritmos baseados em distância (KNN, SVM, Redes Neurais).
6.1 Min-Max Scaling
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data[["idade", "renda"]] = scaler.fit_transform(data[["idade", "renda"]])
6.2 Padronização (Z-Score Scaling)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data[["idade", "renda"]] = scaler.fit_transform(data[["idade", "renda"]])
7. Redução de dimensionalidade
Quando há muitas variáveis, reduzir dimensões pode melhorar a performance do modelo.
7.1 PCA (Análise de Componentes Principais)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
principal_components = pca.fit_transform(data.select_dtypes(include=['float64','int64']))
7.2 Seleção de características por importância
from sklearn.ensemble import RandomForestClassifier
X = data.drop("target", axis=1)
y = data["target"]
model = RandomForestClassifier()
model.fit(X, y)
importances = pd.Series(model.feature_importances_, index=X.columns)
print(importances.sort_values(ascending=False))
8. Pipelines para automação do pré-processamento
É comum precisar aplicar várias etapas de transformação de forma sequencial. O Scikit-learn oferece os pipelines para organizar o fluxo.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
pipeline = Pipeline([
("imputer", SimpleImputer(strategy="mean")),
("scaler", StandardScaler()),
("model", LogisticRegression())
])
pipeline.fit(X, y)
9. Boas práticas no pré-processamento
Entenda os dados antes de transformá-los: visualize distribuições e correlações.
Evite vazamento de dados: sempre ajuste os transformadores apenas no conjunto de treino.
Escolha métodos de imputação condizentes com o contexto.
Documente o fluxo de pré-processamento para garantir reprodutibilidade.
Automatize com pipelines para escalabilidade.
10. Conclusão
O pré-processamento é a espinha dorsal da ciência de dados. Técnicas como tratamento de valores ausentes, remoção de outliers, codificação de variáveis categóricas, normalização e redução de dimensionalidade garantem que os modelos recebam dados consistentes e expressivos.
Em projetos reais, muitas vezes o pré-processamento leva mais tempo que o próprio treinamento do modelo, mas é ele que define o sucesso da análise.
Com Python e ferramentas como Pandas, Scikit-learn e NumPy, conseguimos criar fluxos de limpeza e transformação de dados eficientes, reproduzíveis e escaláveis.

Comentários
Postar um comentário