Limpeza e preparação dos dados com Pandas

Fonte: https://unsplash.com/photos/oTvU7Zmteic

Sem dúvidas, um dos processos que podem levar mais tempo para um Cientista de Dados, é realizar a limpeza e a preparação das informações.

Esse processo pode ser custoso e demorado. É necessário identificar os dados que estão faltando e descobrir se existem possíveis valores que podem alterar o resultado. Sem o tratamento adequado, não é possível realizar uma análise concreta.

Nesse artigo, vamos abordar métodos para tratamento e limpeza das informações utilizando o Pandas, uma biblioteca da linguagem Python para manipulação de tabelas numéricas e séries temporais.

Recomendo a utilização do Jupyter Notebook para seguir os exemplos.

Sujeira nos meus dados?

Não só como se deparar com valores inconsistentes, dados não gravados e outliers. É importante conseguir “reformar” os dados para que possam ser utilizadas futuramente. Os dados que me refiro, são na maioria das vezes o DataFrame, que vamos manipular com a biblioteca Pandas.

Removendo colunas do DataFrame

Sempre que vamos analisar um dataset, nem todas as colunas que estão presentes são úteis. Por exemplo, temos algumas informações sobre os estudantes no Brasil (nome, série, notas e escola), mas queremos apenas focar nas notas dos estudantes.

Nesse caso, informações como série ou escola não são importantes e manter esses dados seria um gasto de processamento e memória desnecessário.

Por conta disso, a biblioteca Pandas disponibiliza o método drop() para remover linhas e colunas da tabela.

Primeiro, vamos importar a biblioteca Pandas.

import pandas as pd

Vamos criar um dicionário em Python e em seguida passar ele para um DataFrame.

dic = { 'A' : [1,2,3],
'B' : [4,5,6],
'C' : [7,8,9],
'D' : [10,11,12] }
data = pd.DataFrame(dic)
Imagem - 1

Certo, agora suponha que queremos excluir a coluna “D”, pois ela não tem mais utilidade.

Podemos excluir da seguinte forma:

data.drop('D', inplace=True, axis=1)
Imagem - 2

Passamos três parâmetros para o método drop(). O primeiro é a coluna que queremos excluir, o segundo informa que as alterações devem ser feitas no DataFrame original, sem criar cópias e o terceiro indica que a exclusão deve ser aplicada na coluna.

Lidando com dados ausentes

Dados ausentes são comuns em muitas aplicações. Para nós ajudar, o Pandas facilita o trabalho com elementos faltantes e deixa o mais funcional possível.

Valores numéricos inexistentes são representados pelo valor de ponto flutuante NaN, também conhecido como valor sentinela.

Vamos adicionar alguns valores ausentes ao nosso dataset.

dic = { 'A' : [1,2,np.nan],
'B' : [3,4,5],
'C' : [6,np.nan,8] }
data = pd.DataFrame(dic)

Observe, usamos o método np.nan() para criar valores vazios.

Podemos agora, identificar facilmente valores NaN com o método isnull().

data.isnull()
Imagem - 3

O método isnull() retorna True caso encontre valores do tipo NaN.

Uma melhor forma de visualizar esses dados é utilizando o método sum(), que retorna o total de valores vazios em cada coluna.

data.isnull().sum()
Imagem - 4

Filtrando valores nulos

Em situações onde não possa haver dados ausentes. Há algumas maneiras de filtrar essas informações. Com o método dropna(), é possível descartar qualquer linha contendo um valor ausente.

Veja o exemplo abaixo, temos o seguinte dataset.

Imagem - 5

Aplicando o método dropna().

Imagem - 6

Foi removido todas as linhas que possuíam algum valor nulo.

Passar com parâmetro o how=’all’ descartará apenas as colunas que contenham NaN.

Preenchendo valores nulos

Em contrapartida, talvez não pudéssemos descartar os dados ausentes. Uma outra forma de tratamento, seria preenchendo esses campos.

Podemos preencher de várias maneiras. Empregaremos o método fillna(). Chamar fillna() com qualquer valor, substitui dados nulos.

Siga o exemplo abaixo, temos um dataset com algumas informações.

Imagem - 7

Vamos preencher os valores nulos com a média.

data.fillna(data.mean(0))
Imagem - 8

Alterando o índice do DataFrame

A indexação do Pandas foi herdada da biblioteca NumPy para ganho de versatilidade no fatiamento e identificação de campos.

Por exemplo, temos um dataset com dados de livros, como, título, autor, gênero e código.

Imagem - 9

Queremos substituir o índice pela coluna Código. O método set_index() permite realizar modificação.

data.set_index('Código', inplace=True)
Imagem - 10

Agora podemos acessar cada registro de maneira direta usando o loc[]. Ele nos permite fazer uma indexação baseada em rótulos, que é a rotulagem de uma linha ou registro.

data.loc['001']

Corrigindo dados divergentes

Nesta seção, vamos introduzir a correção de dados, usando expressões regulares.

Aqui temos um exemplo contendo algumas informações de valores do Bitcoin em determinadas datas.

Imagem - 11

Veja que a coluna close possui alguns valores discrepantes, como, [14729–15236] em que não sabemos se o valor de fechamento foi 14729 ou 15236.

Uma forma eficiente de filtrar e remover o que não for necessário é utilizando expressões regulares. Não entraremos em detalhes sobre a utilização dessas funções.

Expressões regulares são utilizadas para encontrarmos uma sequência de caracteres que define um padrão de pesquisa, principalmente para encontrar padrões em uma string.

Primeiro, vamos remover os colchetes dos campos.

reg = data['Close'].str.extract('\[(.*?)\]', expand=False)

A expressão "\[(.*?)\]" informa para manter apenas os valores numéricos, removendo os colchetes.

Em seguida, vamos deixar apenas o primeiro valor de fechamento.

extr = reg.str.extract('(\d{5})', expand=False)

'(\d{5})' mantém apenas os primeiros 5 números.

Por fim, vamos adicionar a coluna formatada ao DataFrame.

data['Close'] = pd.to_numeric(extr)
Imagem - 12

Removendo valores duplicados

Valores duplicados são encontrados com frequência e dependendo da análise que será feita, esses valores podem alterar o resultado final.

O método duplicated() devolve uma Series booleana informando se possui algum valor duplicado.

Veja o exemplo.

Imagem - 13
data.duplicated()
Imagem - 14

Referente a isso, entramos com o drop_duplicates(), que remove todos os valores repetidos.

data.drop_duplicates()
Imagem - 15

Combatendo os outliers

Outliers são valores atípicos dentro do nosso conjunto de dados.

Saber identificar outliers é fundamental em qualquer análise de dados, pois podem apresentar anormalidades no resultado. Em alguns casos, o outlier pode ser justamente o valor que você pode estar procurando.

Uma das maneiras mais fáceis de identificar outliers, é por meio do gráfico de dispersão.

Imagem - 16

Caso não seja possível identificar pelo gráfico, podemos encontrar com um simples algoritmo em Python.

Para encontrarmos outliers, usamos a regra 1,5xFIQ.

Veja o exemplo abaixo, data_pandas será nosso DataFrame.

data_pandas = pd.DataFrame([0.1,0.3,5,2,3,4,5,44,6,7,8,99])

Antes, é necessário colocar os dados em ordem.

data_pandas.sort_values(by=[0])

Precisamos identificar o tamanho, primeiro quartil e terceiro quartil.

tamanho = len(data_pandas)
primeiro_quatil = data_pandas.quantile(q=0.25, axis=0, numeric_only=True, interpolation='linear')
terceiro_quartil = data_pandas.quantile(q=0.75, axis=0, numeric_only=True, interpolation='linear')

Vamos calcular o limite inferior e superior.

inicio = round(int(tamanho / primeiro_quatil))
final = int(tamanho - inicio)

Com os limites encontradas, podemos pegar o valor da linha, que corresponde as variáveis de inicio e final.

linha_inicio = data_pandas.loc[inicio]
linha_final = data_pandas.loc[final]

Agora vem uma das partes mais importantes, vamos usar a regra 1,5xFIQ.

menor = (int(linha_final - linha_inicio) * 1.5) - inicio
maior = (int(linha_final - linha_inicio) * 1.5) + final

De acordo com o resultado, a variável menor corresponde a 0.5, portanto, qualquer valor abaixo será um outlier. Já a variável maior corresponde a 12.5, da mesma forma, qualquer valor acima será um outlier.

data_pandas[(data_pandas[0] < menor)]

Os valores 0.1 e 0.3 são outliers.

data_pandas[(data_pandas[0] > maior)]

Os valores 44 e 99 são outliers.


Agora você já tem uma ideia básica de como limpar seus dados! Caso tenha alguma sugestão para tratamento de dados, deixe aqui nos comentários.

Até a próxima!