Limpeza de dados: Conceitos, Problemas e Tratamento

O que é Limpeza de dados?

A limpeza de dados, também conhecida como pré-processamento de dados, é uma etapa fundamental na ciência de dados. Envolve a identificação, correção e remoção de erros, inconsistências e ruídos nos dados coletados, a fim de obter um conjunto de dados limpo e confiável para análise.

Porque é necessária a Limpeza dos dados?

A limpeza de dados é necessária porque os conjuntos de dados geralmente contêm informações incompletas, imprecisas, duplicadas ou inconsistentes, o que pode levar a resultados imprecisos e conclusões errôneas se não for tratado corretamente. Além disso, os dados podem conter valores discrepantes (outliers) que são muito diferentes dos demais e podem distorcer as análises.

Como surgem os problemas nos dados?

1 - Banco de dados sem controle de entrada.
2 - Sistemas Legados.
3 - Falta de padronização na operação dos dados.
4 - Alterações e Erros no processo.

Quais os problemas mais comuns quando se faz a limpeza?

1 - Categorias sem nome ou nome incorreto.
2 - Falta de padrão nos valores categóricos.
3 - Valores numéricos que fogem do nosso domínio(Regra de negócio).
4 - Outliers.
5 - Valores nulos(NaN).
6 - Dados duplicados.

Tratamento com python:

No exemplo abaixo temos todos os problemas descritos, usaremos o dataset a seguir como teste para o nosso tratamento.

Importando as bibliotecas, nosso dataset e lendo seus cinco primeiros valores:

#Importar bibliotecas
import pandas as pd
import seaborn as srn
import statistics  as sts

#Importar dados
dataset = pd.read_csv("../Data/Clientes.csv", sep=",")

#Visualizar dados
dataset.head()

Saída:

1) Primeiro problema a resolver será renomear a coluna "?" pela identificação correta.

#Primeiro problema: Renomear a coluna = ?
dataset.rename(columns={"?":"Score"}, inplace=True)
dataset.head()

Saída:

2) Remover os Dados Nulos.

2.1) Verificar se existem e a quantidade presente:

#Verificar dados nulos e somar.
dataset.isnull().sum()

Saída:

2.2) Calcular a mediana e substituir os valores nulos pelo seu valor.

#Encontrando a mediana.
mediana = sts.median(dataset['Idade'])

#Substituindo os valores nulos pela mediana.
dataset['Idade'].fillna(mediana, inplace=True)

#Verificar se ainda há dados nulos.
dataset.isnull().sum()

Saída:

3) Remover valores numéricos que estão fora do nosso domínio.

3.1) Verificar se há idades fora do domínio(18 a 100):

#Visualizar os valores fora do domínio na idade.
#Dominio: 18 a 100 anos.
dataset.loc[(dataset['Idade'] <  18 ) | ( dataset['Idade'] >  100) ]

Saída:

3.2) Alterar as idades que estão fora do domínio pela mediana.

#Substituir os valores pela mediana.
dataset.loc[(dataset['Idade'] <  0 )  | ( dataset['Idade'] >  100), 'Idade'] = mediana

#Verificar se ainda há idades fora do domínio.
dataset.loc[(dataset['Idade'] <  18 ) | ( dataset['Idade'] >  100) ]

Saída:

É esperada uma tabela vazia!

4) Outliers.

4.1) Analisando os dados em busca de outliers.

#Gráfico de dispersão considerando o Score.
score = dataset['Score']
srn.scatterplot(data=score)

Saída:

4.2) Substituir os outliers pela mediana.

#Nesse caso vamos considerar os outliers como valores > 800.
dataset.loc[dataset['Score'] > 800 ]
#Calcular a mediana. 
mediana = sts.median(dataset['Score'])
#Substituir os outliers pela mediana.
dataset.loc[dataset['Score'] > 800, 'Score'] = mediana
#Verificar se ainda há outliers.
srn.scatterplot(data=score)

Saída:

5) Falta de padrão nos valores categóricos.

5.1) Verificando a coluna 'Sexo' a procura de valores que diferem do padrão(F e M):

#Explorando a coluna Sexo.
valores = dataset.groupby(['Sexo']).size()
valores

Saída:

5.2) Padronizar o valores categóricos, substituindo 'MAS', 'FEM' e 'Feminino' por 'M' e 'F':

#Padronizando os valores de Sexo.
dataset.loc[dataset['Sexo'] ==  'MAS', 'Sexo'] = "M"
dataset.loc[dataset['Sexo'].isin( ['FEM','Feminino']), 'Sexo'] = "F"
#Visualiza o resultado
valores = dataset.groupby(['Sexo']).size()
valores

Saída:

6) Remover dados duplicados.

6.1) Verificando se há clientes duplicados, para isso verificamos se há um ID duplicado:

#Dados duplicados, buscamos pelo ID(dado único)
dataset[dataset.duplicated(['Id'],keep=False)]

Saída:

6.2) Apagando as linhas duplicadas:

#Excluir os dados duplicados.
#keep = manter a primeira ocorrência e excluir as demais.
dataset.drop_duplicates(subset="Id", keep='first',inplace=True)

#Buscando se ainda há duplicados.
dataset[dataset.duplicated(['Id'],keep=False)]

Saída:

É esperada uma tabela vazia!

Segue o link para acessar o código na integra: Código

Essas são apenas algumas das tarefas comuns na limpeza de dados. O processo exato pode variar dependendo do conjunto de dados e do problema em questão. No entanto, o objetivo principal é garantir que os dados estejam corretos, completos e consistentes antes de prosseguir para as etapas de análise e modelagem na ciência de dados.

Comentários

Formulário de contato

Nome

E-mail *

Mensagem *

Minha foto
Gustavo Câmara
Olá, meu nome é Gustavo e sou Analista de Dados, Desenvolvedor, Estudante de Engenharia de Software e apaixonado por tecnologia.

Postagens mais visitadas