curso
Pré-processamento de dados: Um guia completo com exemplos em Python
A qualidade dos seus dados afeta diretamente a precisão da sua análise e o desempenho do modelo. Por quê? Porque os dados brutos geralmente contêm inconsistências, erros e informações irrelevantes que podem distorcer os resultados e levar a insights falhos. O pré-processamento de dados é uma forma de atenuar esse problema. Ou seja, é o processo de transformação de dados brutos em um formato limpo e estruturado.
Nesta postagem do blog, abordarei o assunto:
- O que é pré-processamento de dados?
- Etapas do pré-processamento de dados
- Técnicas de pré-processamento de dados com exemplos
- Ferramentas para pré-processamento de dados
- Práticas recomendadas para o pré-processamento de dados
Vamos lá!
O que é pré-processamento de dados?
O pré-processamento de dados é um aspecto fundamental da preparação de dados. Refere-se a qualquer processamento aplicado a dados brutos para prepará-los para outras análises ou tarefas de processamento.
Tradicionalmente, o pré-processamento de dados tem sido uma etapa preliminar essencial na análise de dados. No entanto, mais recentemente, essas técnicas foram adaptadas para treinar modelos de aprendizado de máquina e IA e fazer inferências a partir deles.
Assim, o pré-processamento de dados pode ser definido como o processo de conversão de dados brutos em um formato que pode ser processado com mais eficiência e precisão em tarefas como:
- Análise de dados
- Aprendizado de máquina
- Ciência de dados
- AI
Torne-se um engenheiro de dados
Etapas do pré-processamento de dados
O pré-processamento de dados envolve várias etapas, cada uma abordando desafios específicos relacionados à qualidade, à estrutura e à relevância dos dados.
Vamos dar uma olhada nessas etapas principais, que geralmente seguem a seguinte ordem:
Etapa 1: Limpeza de dados
A limpeza de dados é o processo de identificação e correção de erros ou inconsistências nos dados para garantir que eles sejam precisos e completos. O objetivo é abordar problemas que podem distorcer a análise ou o desempenho do modelo.
Por exemplo:
- Tratamento de valores ausentes: Usar estratégias como imputação média/modo, exclusão ou modelos preditivos para preencher ou remover dados ausentes.
- Remoção de duplicatas: Eliminação de registros duplicados para garantir que cada entrada seja única e relevante.
- Correção de formatos inconsistentes: Padronização de formatos (por exemplo, formatos de data, casos de string) para manter a consistência.
Veja como fica em Python:
# Creating a manual dataset
data = pd.DataFrame({
'name': ['John', 'Jane', 'Jack', 'John', None],
'age': [28, 34, None, 28, 22],
'purchase_amount': [100.5, None, 85.3, 100.5, 50.0],
'date_of_purchase': ['2023/12/01', '2023/12/02', '2023/12/01', '2023/12/01', '2023/12/03']
})
# Handling missing values using mean imputation for 'age' and 'purchase_amount'
imputer = SimpleImputer(strategy='mean')
data[['age', 'purchase_amount']] = imputer.fit_transform(data[['age', 'purchase_amount']])
# Removing duplicate rows
data = data.drop_duplicates()
# Correcting inconsistent date formats
data['date_of_purchase'] = pd.to_datetime(data['date_of_purchase'], errors='coerce')
print(data)
Saída do código acima
Etapa 2: Integração de dados
A integração de dados envolve a combinação de dados de várias fontes para criar um conjunto de dados unificado. Isso geralmente é necessário quando os dados são coletados de diferentes sistemas de origem.
Algumas técnicas usadas na integração de dados incluem:
- Correspondência de esquemas: Alinhamento de campos e estruturas de dados de diferentes fontes para garantir a consistência.
- Desduplicação de dados: Identificação e remoção de entradas duplicadas em vários conjuntos de dados.
Por exemplo, digamos que você tenha dados de clientes de vários bancos de dados. Veja como você poderia mesclá-los em uma única exibição:
# Creating two manual datasets
data1 = pd.DataFrame({
'customer_id': [1, 2, 3],
'name': ['John', 'Jane', 'Jack'],
'age': [28, 34, 29]
})
data2 = pd.DataFrame({
'customer_id': [1, 3, 4],
'purchase_amount': [100.5, 85.3, 45.0],
'purchase_date': ['2023-12-01', '2023-12-02', '2023-12-03']
})
# Merging datasets on a common key 'customer_id'
merged_data = pd.merge(data1, data2, on='customer_id', how='inner')
print(merged_data)
Saída do código acima
Etapa 3: Transformação de dados
A transformação de dados converte os dados em formatos adequados para análise, aprendizado de máquina ou mineração.
Por exemplo:
- Dimensionamento e normalização: O ajuste de valores numéricos a uma escala comum é frequentemente necessário para algoritmos que dependem de métricas de distância.
- Codificação de variáveis categóricas: Conversão de dados categóricos em valores numéricos usando técnicas de codificação de um ponto ou de rótulo.
- Engenharia e extração de recursos: Criação de novos recursos ou seleção de recursos importantes para melhorar o desempenho do modelo.
Veja como fica em Python, usando o scikit-learn:
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# Creating a manual dataset
data = pd.DataFrame({
'category': ['A', 'B', 'A', 'C', 'B'],
'numeric_column': [10, 15, 10, 20, 15]
})
# Scaling numeric data
scaler = StandardScaler()
data['scaled_numeric_column'] = scaler.fit_transform(data[['numeric_column']])
# Encoding categorical variables using one-hot encoding
encoder = OneHotEncoder(sparse_output=False)
encoded_data = pd.DataFrame(encoder.fit_transform(data[['category']]),
columns=encoder.get_feature_names_out(['category']))
# Concatenating the encoded data with the original dataset
data = pd.concat([data, encoded_data], axis=1)
print(data)
Saída do código acima
Etapa 4: Redução de dados
A redução de dados simplifica o conjunto de dados, reduzindo o número de recursos ou registros e preservando as informações essenciais. Isso ajuda a acelerar a análise e o treinamento de modelos sem sacrificar a precisão.
As técnicas de redução de dados incluem:
- Seleção de recursos: Escolher os recursos mais importantes que contribuem para o desempenho da análise ou do modelo.
- Análise de componentes principais (PCA): Umatécnica de redução de dimensionalidade que transforma os dados em um espaço de dimensão inferior.
- Métodos de amostragem: A redução do tamanho do conjunto de dados por meio da seleção de amostras representativas é útil para lidar com grandes conjuntos de dados.
E aqui está como implementamos a redução de dimensionalidade em Python:
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest, chi2
# Creating a manual dataset
data = pd.DataFrame({
'feature1': [10, 20, 30, 40, 50],
'feature2': [1, 2, 3, 4, 5],
'feature3': [100, 200, 300, 400, 500],
'target': [0, 1, 0, 1, 0]
})
# Feature selection using SelectKBest
selector = SelectKBest(chi2, k=2)
selected_features = selector.fit_transform(data[['feature1', 'feature2', 'feature3']], data['target'])
# Printing selected features
print("Selected features (SelectKBest):")
print(selected_features)
# Dimensionality reduction using PCA
pca = PCA(n_components=2)
pca_data = pca.fit_transform(data[['feature1', 'feature2', 'feature3']])
# Printing PCA results
print("PCA reduced data:")
print(pca_data)
Saída do código acima
Técnicas comuns de pré-processamento de dados com exemplos
Já estabelecemos que o pré-processamento de dados brutos é essencial para garantir que eles sejam adequados para análise ou modelos de aprendizado de máquina. Também abordamos as etapas envolvidas no processo.
Nesta seção, exploraremos várias técnicas para lidar com problemas comuns durante a fase de pré-processamento. Além disso, exploraremos o aumento de dados, uma técnica útil para criar dados sintéticos em contextos específicos, como conjuntos de dados de imagem ou texto.
Tratamento de dados ausentes
A falta de dados pode afetar negativamente o desempenho de um modelo ou análise de aprendizado de máquina. Há várias estratégias para lidar com valores ausentes de forma eficaz:
- Imputação: Essa técnica envolve o preenchimento dos valores ausentes com uma estimativa calculada, como a média, a mediana ou a moda dos dados disponíveis. Os métodos avançados incluem modelagem preditiva, em que os valores ausentes são previstos com base nas relações entre os dados.
# Note: This is dummy code and not expected to run on its own
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean') # Replace 'mean' with 'median' or 'most_frequent' if needed
data['column_with_missing'] = imputer.fit_transform(data[['column_with_missing']])
- Exclusão: A remoção de linhas ou colunas com valores ausentes é uma solução simples. No entanto, ele deve ser usado com cautela, pois pode levar à perda de dados valiosos, especialmente se muitas entradas estiverem faltando.
data.dropna(inplace=True) # Removes rows with any missing values
- Modelagem de valores ausentes: Nos casos em que o padrão de dados ausentes é mais complexo, os modelos de aprendizado de máquina podem prever os valores ausentes com base no restante do conjunto de dados. Isso pode melhorar a precisão ao incorporar relações entre diferentes variáveis.
Detecção e remoção de outliers
Os outliers são valores extremos que se desviam significativamente do restante dos dados e que, assim como os valores ausentes, podem distorcer a análise e o desempenho do modelo. Várias técnicas podem ser usadas para detectar e lidar com outliers:
- Método Z-Score: Essa abordagem mede o número de desvios padrão de um ponto de dados em relação à média. Os pontos de dados além de um determinado limite (por exemplo, ±3 desvios padrão) podem ser considerados discrepantes.
# Note: this is dummy code.
# It won’t work unless a data with a column named “column” is imported
from scipy import stats
z_scores = stats.zscore(data['column']) outliers = abs(z_scores) > 3 # Identifying outliers
- Intervalo interquartil (IQR): IQR é o intervalo entre o primeiro quartil (Q1) e o terceiro quartil (Q3). Os valores além de 1,5 vezes o IQR acima de Q3 ou abaixo de Q1 são considerados discrepantes.
Q1 = data['column'].quantile(0.25)
Q3 = data['column'].quantile(0.75)
IQR = Q3 - Q1
outliers = (data['column'] < (Q1 - 1.5 * IQR)) | (data['column'] > (Q3 + 1.5 * IQR))
- Técnicas visuais: Os métodos de visualização, como gráficos de caixa, gráficos de dispersão ou histogramas, podem ajudar a detectar exceções em um conjunto de dados. Uma vez identificados, os valores discrepantes podem ser removidos ou transformados, dependendo de sua influência na análise.
Codificação de dados
Ao trabalhar com dados categóricos, a codificação é necessária para converter categorias em representações numéricas que os algoritmos de aprendizado de máquina possam processar. As técnicas comuns de codificação incluem:
- Codificação de um ponto: Como mencionado anteriormente, esse método cria colunas binárias para cada categoria.
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(sparse_output=False)
encoded_data = encoder.fit_transform(data[['categorical_column']])
- Codificação de rótulos: A codificação de rótulos atribui um valor numérico exclusivo a cada categoria. No entanto, esse método pode introduzir uma relação ordinal não intencional entre as categorias se elas não tiverem uma ordem natural.
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data['encoded_column'] = le.fit_transform(data['categorical_column'])
- Codificação ordinal: A codificação ordinal é usada quando as variáveis categóricas têm uma ordem inerente, como baixa, média e alta. Cada categoria é mapeada para um valor inteiro correspondente que reflete sua classificação.
from sklearn.preprocessing import OrdinalEncoder
oe = OrdinalEncoder(categories=[['low', 'medium', 'high']])
data['ordinal_column'] = oe.fit_transform(data[['ordinal_column']])
Dimensionamento e normalização de dados
O escalonamento e a normalização garantem que os recursos numéricos estejam em uma escala semelhante, o que é particularmente importante para algoritmos que dependem de métricas de distância (por exemplo, k-nearest neighbors, SVMs).
- Dimensionamento mínimo-máximo: Essa técnica dimensiona os dados para um intervalo especificado, normalmente de 0 a 1. É útil quando todos os recursos precisam ter a mesma escala.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data[['scaled_column']] = scaler.fit_transform(data[['numeric_column']])
- Padronização (normalização do escore Z): Esse método dimensiona os dados de forma que a média se torne 0 e o desvio padrão se torne 1, o que ajuda os modelos a terem melhor desempenho com recursos normalmente distribuídos.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data[['standardized_column']] = scaler.fit_transform(data[['numeric_column']])
Aumento de dados
O aumento de dados é uma técnica para aumentar artificialmente o tamanho de um conjunto de dados por meio da criação de novos exemplos sintéticos. Isso é especialmente útil para conjuntos de dados de imagem ou texto em modelos de aprendizagem profunda, em que grandes quantidades de dados são necessárias para um desempenho robusto do modelo.
- Aumento de imagem: Técnicas como girar, inverter, dimensionar ou adicionar ruído às imagens ajudam a criar variações que melhoram a generalização do modelo.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
augmented_images = datagen.flow_from_directory('image_directory', target_size=(150, 150))
- Aumento de texto: Para dados de texto, os métodos de aumento incluem substituição de sinônimos, inserção aleatória e retrotradução, em que uma frase é traduzida para outro idioma e, em seguida, volta para o idioma original, introduzindo variações.
import nlpaug.augmenter.word as naw
# install nlpaug here: https://github.com/makcedward/nlpaug
aug = naw.SynonymAug(aug_src='wordnet')
augmented_text = aug.augment("This is a sample text for augmentation.")
Ferramentas para pré-processamento de dados
Embora você possa implementar o processamento de dados usando código Python puro, foram desenvolvidas ferramentas poderosas para lidar com várias tarefas e tornar o processo geral mais eficiente. Aqui estão alguns exemplos:
Bibliotecas Python
Existem várias bibliotecas especializadas para pré-processamento de dados em Python. Aqui estão três dos mais populares:
- Pandas: A biblioteca mais usada do Python para manipulação e limpeza de dados. Ele oferece estruturas de dados flexíveis, principalmente DataFrame e Series, que permitem que você trate e manipule dados estruturados com eficiência. O Pandas oferece suporte a operações como tratamento de dados ausentes, fusão de conjuntos de dados, filtragem de dados e remodelagem.
import pandas as pd
# Load a sample dataset
data = pd.DataFrame({
'name': ['John', 'Jane', 'Jack'],
'age': [28, 31, 34]
})
print(data)
Saída do código acima
- NumPy: Uma biblioteca fundamental para cálculos numéricos. Ele suportas grandes matrizes multidimensionais e matrizes e funções matemáticas para operar nessas matrizes. O NumPy costuma ser a base para muitas bibliotecas de processamento de dados de nível superior, como o Pandas.
import numpy as np
# Create an array and perform element-wise operations
array = np.array([1, 2, 3, 4])
squared_array = np.square(array)
print(squared_array)
Saída do código acima
- Scikit-learn: Amplamente usado para tarefas de aprendizado de máquina, mas também oferece vários utilitários de pré-processamento, como dimensionamento, codificação e transformação de dados. Seu módulo de pré-processamento contém ferramentas para lidar com dados categóricos, dimensionamento de dados numéricos, extração de recursos e muito mais.
from sklearn.preprocessing import StandardScaler
# Standardize data
data = [[10, 2], [15, 5], [20, 3]]
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
print(scaled_data)
Saída do código acima
Plataformas de nuvem
Os sistemas locais podem não ser capazes de lidar com grandes conjuntos de dados de forma eficaz. Nessas situações, as plataformas de nuvem oferecem soluções dimensionáveis e eficientes que permitem que você processe grandes quantidades de dados em sistemas distribuídos.
Algumas ferramentas da plataforma de nuvem que você deve considerar incluem:
- Cola AWS: Um serviço ETL totalmente gerenciado pela AmazonWeb Services. Ele descobre e organiza automaticamente os dados e os prepara para a análise. O Glue oferece suporte à catalogação de dados e pode se conectar a serviços do AWS, como S3 e Redshift.
- Azure Data Factory: Um serviço de integração de dados baseado em nuvem da Microsoft. Ele oferece suporte à criação de pipelines de ETL e ELT para dados em grande escala. O Azure Data Factory permite que os usuários movam dados entre vários serviços, pré-processem-nos usando transformações e orquestrem fluxos de trabalho usando uma interface visual.
Ferramentas de automação
Automatizar as etapas repetitivas do pré-processamento de dados pode economizar tempo e reduzir erros, especialmente quando você lida com modelos de aprendizado de máquina e grandes conjuntos de dados. Aqui estão algumas ferramentas que oferecem pipelines de pré-processamento integrados:
- Plataformas AutoML: AutoML é a abreviação de Automated Machine Learning (aprendizado automático de máquina) (e significa o que está escrito na lata). Em outras palavras, essas plataformas automatizam vários estágios do fluxo de trabalho de aprendizado de máquina. Plataformas comoke Google's AutoML, Microsoft's Azure AutoML e H2O.ai's AutoML fornecem pipelines automatizados que lidam com tarefas como seleção de recursos, transformação de dados e seleção de modelos com intervenção mínima do usuário.
- Pipelines de pré-processamento no scikit-learn: O Scikit-learn fornecea classe Pipeline, que ajuda você a organizar e automatizar as etapas de pré-processamento. Ele permite que você agrupe várias operações de pré-processamento em um único fluxo de trabalho executável, garantindo que as tarefas de pré-processamento sejam aplicadas de forma consistente:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
# Example Pipeline combining different preprocessing tasks
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('encoder', OneHotEncoder())
])
preprocessor = ColumnTransformer(transformers=[
('num', numeric_transformer, ['age']),
('cat', categorical_transformer, ['category'])
])
preprocessed_data = preprocessor.fit_transform(data)
Práticas recomendadas para o pré-processamento de dados
É essencial seguir as práticas recomendadas para maximizar a eficácia de seus esforços de pré-processamento. Dito isso, abaixo estão algumas práticas que eu incentivaria você a considerar:
Entenda os dados
Antes de você se aprofundar no pré-processamento, é importante entender completamente o conjunto de dados. Realizar análise exploratória de dados para identificar a estrutura dos dados em questão. O que você deseja entender especificamente é:
- Principais recursos
- Anomalias em potencial
- Relacionamentos
Sem antes entender as características do conjunto de dados, é bem provável que você aplique métodos de pré-processamento incorretos, o que distorcerá os dados.
Automatize etapas repetitivas
O pré-processamento geralmente envolve tarefas repetitivas. A automação dessas tarefas por meio da criação de pipelines garante consistência e eficiência e reduz as chances de erros manuais. Para otimizar os fluxos de trabalho, aproveite os pipelines em ferramentas como o scikit-learn ou plataformas baseadas em nuvem.
Etapas de pré-processamento de documentos
A documentação clara ajuda a atingir dois objetivos:
- Reprodutibilidade
- Compreensão (para você mesmo em uma data posterior ou para outras pessoas da sua equipe).
Cada decisão, transformação ou etapa de filtragem deve ser registrada, incluindo o raciocínio. Isso aumentará significativamente a colaboração entre os membros da equipe e o ajudará a retomar os projetos de onde você parou.
Melhorias iterativas
O pré-processamento de dados não é uma tarefa única - deve ser um processo iterativo. À medida que os modelos evoluem e fornecem feedback sobre seu desempenho, use essas informações para revisitar e refinar as etapas de pré-processamento, pois isso pode levar a melhores resultados. Por exemplo, a engenharia de recursos pode revelar novos recursos úteis ou o ajuste do tratamento de outliers pode melhorar a precisão do modelo - use esse feedback para atualizar as etapas de pré-processamento.
Conclusão
O pré-processamento de dados desempenha um papel fundamental no sucesso de qualquer projeto de dados. O pré-processamento adequado garante que os dados brutos sejam transformados em um formato limpo e estruturado, o que ajuda os modelos e as análises a produzir percepções mais precisas e significativas.
Neste artigo, compartilhei várias técnicas para ajudar a implementar o pré-processamento de dados. Ainda assim, o mais importante a ser observado é que esse processo não é um esforço único, mas um processo iterativo! O refinamento contínuo leva a um melhor desempenho do modelo e a uma melhor tomada de decisões. Um conjunto de dados bem preparado estabelece a base para qualquer iniciativa de IA de dados bem-sucedida.
Para continuar seu aprendizado, recomendo que você consulte os excelentes recursos a seguir:
Torne-se um cientista de ML

Saiba mais sobre engenharia de dados com estes cursos!
curso
ETL and ELT in Python
curso
End-to-End Machine Learning
tutorial
Tutorial de manipulação de dados categóricos de aprendizado de máquina com Python
tutorial
Desenvolvimento de back-end em Python: Um guia completo para iniciantes

Oluseye Jeremiah
26 min
tutorial
21 ferramentas essenciais do Python
tutorial
Entendendo a classificação de textos em Python
tutorial