Tratamento de Dados Nulos no Pandas: Uma Abordagem Completa e Detalhada
Tags: python, pandas, programming, datascience
Published: 2023-07-28 09:35:53

Os dados nulos, também conhecidos como valores ausentes ou missing values, são um desafio comum ao lidar com conjuntos de dados na análise de dados e na ciência de dados. Eles podem ocorrer por diversos motivos, como erros na coleta de dados, falhas de processamento ou informações que não estão disponíveis. Lidar corretamente com dados nulos é fundamental para garantir que suas análises sejam precisas e que seus modelos sejam robustos.

O Pandas é uma das bibliotecas mais populares em Python para manipulação e análise de dados. Ele oferece diversas funcionalidades para tratar dados nulos de forma eficiente. Neste artigo, vamos explorar as principais estratégias de tratamento de dados nulos no Pandas, acompanhadas de exemplos práticos para uma melhor compreensão.

## Índice

1. Introdução aos Dados Nulos
2. Identificação de Dados Nulos
3. Remoção de Dados Nulos
4. Preenchimento de Dados Nulos
   4.1 Preenchimento com Valor Específico
   4.2 Preenchimento com Estatísticas Descritivas
   4.3 Preenchimento com Interpolação
5. Imputação de Dados Nulos
   5.1 Imputação com Média e Mediana
   5.2 Imputação com Modelos de Aprendizado de Máquina
6. Funções Uteis
7. Considerações Finais

## 1. Introdução aos Dados Nulos

Os dados nulos são valores que não estão presentes em um conjunto de dados. Eles podem ser representados por "NaN" (Not a Number) no Pandas. A existência de dados nulos pode afetar diretamente as análises e modelagem de dados, pois algumas operações podem não ser realizadas adequadamente com valores ausentes.

## 2. Identificação de Dados Nulos

Antes de tratarmos os dados nulos, precisamos identificá-los no conjunto de dados. O Pandas possui a função `isnull()` que retorna uma matriz booleana com "True" para valores nulos e "False" para valores não nulos.

Exemplo:

```python
import pandas as pd

# Criando um DataFrame de exemplo com dados nulos
data = {'Nome': ['Alice', 'Bob', None, 'David'],
        'Idade': [25, None, 30, 22],
        'Salario': [5000, 6000, None, 4500]}

df = pd.DataFrame(data)
print(df.isnull())
```

Output:

```
    Nome  Idade  Salario
0  False  False    False
1  False   True    False
2   True  False     True
3  False  False    False
```

## 3. Remoção de Dados Nulos

A remoção de dados nulos é uma estratégia simples, mas deve ser utilizada com cautela, pois pode levar à perda de informações importantes. Essa abordagem é mais recomendada quando a quantidade de dados nulos é pequena em relação ao tamanho do conjunto de dados.

O Pandas oferece o método `dropna()` para remover linhas ou colunas que contêm dados nulos.

Exemplo:

```python
# Remover linhas que contenham pelo menos um valor nulo
df_sem_nulos_linha = df.dropna()

# Remover colunas que contenham pelo menos um valor nulo
df_sem_nulos_coluna = df.dropna(axis=1)
```

## 4. Preenchimento de Dados Nulos

Preencher os dados nulos é uma estratégia mais comum, pois permite manter a integridade do conjunto de dados, evitando a perda de informações. O Pandas oferece várias formas de preenchimento, dependendo do contexto dos dados.

### 4.1 Preenchimento com Valor Específico

Uma das formas mais simples de preencher dados nulos é usando um valor específico, como zero ou uma string vazia.

Exemplo:

```python
# Preencher valores nulos com um valor específico (por exemplo, zero)
df_preenchido_zero = df.fillna(0)

# Preencher valores nulos com uma string vazia
df_preenchido_vazio = df.fillna('')
```

### 4.2 Preenchimento com Estatísticas Descritivas

Outra abordagem comum é preencher os valores nulos com estatísticas descritivas, como a média ou mediana da coluna.

Exemplo:

```python
# Preencher valores nulos da coluna 'Idade' com a média da coluna
media_idade = df['Idade'].mean()
df_preenchido_media = df['Idade'].fillna(media_idade)

# Preencher valores nulos da coluna 'Salario' com a mediana da coluna
mediana_salario = df['Salario'].median()
df_preenchido_mediana = df['Salario'].fillna(mediana_salario)
```

### 4.3 Preenchimento com Interpolação

A interpolação é uma técnica útil quando os dados seguem uma tendência ou padrão. Ela preenche os dados nulos estimando os valores com base em outros dados próximos.

Exemplo:

```python
# Preencher valores nulos usando interpolação linear da coluna 'Idade'
df_interp_idade = df['Idade'].interpolate(method='linear')
```

## 5. Imputação de Dados Nulos

A imputação é uma abordagem mais avançada para preencher dados nulos, onde os valores são estimados com base em outras informações disponíveis no conjunto de dados. Isso é particularmente útil quando a quantidade de dados nulos é grande.

### 5.1 Imputação com Média e Mediana

Uma das formas mais simples de imputação é substituir os valores nulos pela média ou mediana da coluna correspondente.

Exemplo:

```python
from sklearn.impute import SimpleImputer

# Criar um objeto imputador com a estratégia da média
imputador_media = SimpleImputer(strategy='mean')

# Imputar os valores nulos da coluna 'Idade' com a média da coluna
df_imputado_media = pd.DataFrame(imputador_media.fit_transform(df[['Idade']]), columns=['Idade'])
```


### 5.2 Imputação com Modelos de Aprendizado de Máquina

Outra abordagem avançada é utilizar modelos de aprendizado de máquina para prever os valores nulos com base nos outros atributos disponíveis. Essa técnica é mais complexa, mas pode fornecer imputações mais precisas, especialmente quando a correlação entre os atributos é significativa.

Vamos exemplificar essa abordagem usando a biblioteca `scikit-learn`, que fornece o estimador `KNeighborsRegressor` para imputação baseada em vizinhos mais próximos.

Exemplo:

```python
from sklearn.impute import KNNImputer

# Criar um objeto imputador usando KNeighborsRegressor
imputador_knn = KNNImputer(n_neighbors=2)

# Imputar os valores nulos das colunas 'Idade' e 'Salario' usando KNN
df_imputado_knn = pd.DataFrame(imputador_knn.fit_transform(df[['Idade', 'Salario']]), columns=['Idade', 'Salario'])
```

## 6. Funções uteis

### 6.1 `isnull()` 
Essa função retorna um DataFrame de valores booleanos, onde cada célula do DataFrame original é substituída por True caso o valor seja nulo (NaN) e False caso o valor seja válido. É uma ferramenta útil para identificar os valores ausentes em um conjunto de dados.

Exemplo:

```python
import pandas as pd

data = {'A': [1, 2, None, 4, None],
        'B': [5, None, 7, 8, 9]}

df = pd.DataFrame(data)

print(df.isnull())
```

Resultado:

```
       A      B
0  False  False
1  False   True
2   True  False
3  False  False
4   True  False
```

### 6.2 `notnull()`
Essa função é o inverso da função `isnull()`. Ela retorna um DataFrame de valores booleanos, onde cada célula do DataFrame original é substituída por True se o valor for válido e False caso o valor seja nulo (NaN).

Exemplo:

```python
import pandas as pd

data = {'A': [1, 2, None, 4, None],
        'B': [5, None, 7, 8, 9]}

df = pd.DataFrame(data)

print(df.notnull())
```

Resultado:

```
       A      B
0   True   True
1   True  False
2  False   True
3   True   True
4  False   True
```

### 6.3 `isna()`
Essa função é sinônimo de `isnull()`. Ela também retorna um DataFrame de valores booleanos, onde cada célula do DataFrame original é substituída por True caso o valor seja nulo (NaN) e False caso o valor seja válido.

### 6.4 `notna()` 
Essa função é sinônimo de `notnull()`. Ela também retorna um DataFrame de valores booleanos, onde cada célula do DataFrame original é substituída por True se o valor for válido e False caso o valor seja nulo (NaN).

Essas funções são extremamente úteis para identificar e lidar com valores ausentes em um conjunto de dados, permitindo que os analistas de dados tomem decisões informadas sobre como tratar esses valores em suas análises e modelagens.

Você pode utilizar essas funções como parte de um processo de limpeza e preparação de dados, como por exemplo, ao remover linhas ou colunas com muitos valores nulos, preenchendo valores ausentes com médias ou valores padrão, ou simplesmente realizando uma análise descritiva para entender o impacto dos valores nulos nos seus dados.



## 7. Considerações Finais

Lidar com dados nulos é uma etapa crítica na análise e no pré-processamento de dados. O Pandas oferece diversas técnicas para tratar esses dados, incluindo remoção, preenchimento e imputação. A escolha da estratégia correta depende do contexto dos dados e da quantidade de valores nulos presente no conjunto de dados.

Aqui estão algumas considerações finais importantes:

- Sempre analise o contexto dos dados e avalie o impacto das diferentes estratégias de tratamento de dados nulos em suas análises e resultados.
- A remoção de dados nulos pode levar à perda de informações valiosas, portanto, use-a com cautela.
- O preenchimento com estatísticas descritivas, como média e mediana, é uma abordagem simples, mas pode introduzir distorções em alguns casos.
- A interpolação é útil quando os dados seguem uma tendência ou padrão.
- A imputação com modelos de aprendizado de máquina pode ser mais precisa, mas requer mais complexidade e cuidado na escolha do modelo.

Ao aplicar as técnicas adequadas para tratar dados nulos, você pode garantir a qualidade e a precisão de suas análises, permitindo que seus modelos e resultados sejam mais confiáveis e úteis para tomada de decisões. Lembre-se sempre de considerar o contexto dos dados e a quantidade de dados nulos presentes para escolher a abordagem mais apropriada para o seu cenário específico.