NumPy: Projeto — Limpeza de Dados

Última atualização: 2026-08-26

1. Projeto: Limpeza de Dados com NumPy

(1) Cenário

Você é um analista de dados. Você recebe um arquivo CSV com 10.000 linhas de dados de sensores — mas está bagunçado: valores ausentes, outliers, escalas inconsistentes e linhas duplicadas.

(2) Tarefas

1. Carregar e Inspecionar

PYTHON
import numpy as np

# Carregar dados (simulados)
rng = np.random.default_rng(42)
n = 10000

# Gerar dados limpos
temperature = rng.normal(25, 5, n)  # média 25°C, desvio 5°C
humidity = rng.uniform(30, 80, n)    # 30-80%
pressure = rng.normal(1013, 10, n)   # média 1013 hPa

# Adicionar alguns valores NaN
temperature[0:50] = np.nan
humidity[200:250] = np.nan

# Adicionar outliers
temperature[1000:1010] = 100  # temperatura impossível
pressure[2000:2005] = 0       # pressão impossível

# Empilhar em array estruturado
data = np.column_stack([temperature, humidity, pressure])
print(f"Shape: {data.shape}")
print(f"Contagem de NaN: {np.sum(np.isnan(data), axis=0)}")

2. Tratar Valores Ausentes

PYTHON
# Substituir NaN pela média da coluna
col_mean = np.nanmean(data, axis=0)
data_clean = np.where(np.isnan(data), col_mean, data)

3. Remover Outliers (método IQR)

PYTHON
# Remoção de outliers baseada em IQR
Q1 = np.percentile(data_clean, 25, axis=0)
Q3 = np.percentile(data_clean, 75, axis=0)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

# Filtrar linhas que estão dentro dos limites para todas as colunas
mask = np.all((data_clean >= lower) & (data_clean <= upper), axis=1)
data_filtered = data_clean[mask]
print(f"Linhas antes: {len(data_clean)}, depois: {len(data_filtered)}")

4. Normalizar Colunas (Z-score)

PYTHON
mean = data_filtered.mean(axis=0)
std = data_filtered.std(axis=0)
data_normalized = (data_filtered - mean) / std
print(f"Média normalizada: {data_normalized.mean(axis=0).round(6)}")
print(f"Desvio normalizado:  {data_normalized.std(axis=0).round(6)}")

5. Exportar Dados Limpos

PYTHON
# Salvar dados limpos
np.save('sensor_data_clean.npy', data_filtered)
np.savetxt('sensor_data_clean.csv', data_filtered, delimiter=',',
           header='temperature,humidity,pressure', comments='')
print("Dados limpos exportados.")

▶ Exemplo: Carregando e inspecionando dados (Dificuldade ⭐)

PYTHON
import numpy as np

rng = np.random.default_rng(42)
data = rng.normal(25, 5, size=(1000, 3))
print("Shape:", data.shape)
print("Primeiras 5 linhas:\n", data[:5])
print("Contagem de NaN:", np.sum(np.isnan(data)))
print("Média:", data.mean(axis=0))
print("Desvio:", data.std(axis=0))

Output:

TEXT 📖 Somente leitura
Shape: (1000, 3)
Primeiras 5 linhas:
 [[28.698 20.884 28.847]
 [24.899 25.891 29.574]
 [27.198 28.793 25.009]
 [24.694 25.771 25.929]
 [26.676 25.174 23.938]]
Contagem de NaN: 0
Média: [25.045 24.908 25.039]
Desvio: [5.019 5.045 5.030]

▶ Exemplo: Tratando valores ausentes com np.where (Dificuldade ⭐⭐)

PYTHON
import numpy as np

data = np.array([1.0, 2.0, np.nan, 4.0, np.nan, 6.0, 7.0])

# Substituir NaN pela média da coluna
col_mean = np.nanmean(data)
clean = np.where(np.isnan(data), col_mean, data)
print("Original:", data)
print("Limpo:", clean)
print("Média após:", clean.mean())

Output:

TEXT 📖 Somente leitura
Original: [ 1.  2. nan  4. nan  6.  7.]
Limpo: [1.  2.  4.  4.  4.  6.  7.]
Média após: 4.0

▶ Exemplo: Remoção de outliers com IQR (Dificuldade ⭐⭐)

PYTHON
import numpy as np

rng = np.random.default_rng(42)
data = np.concatenate([rng.normal(50, 10, 95), [200, -50, 300, -80, 150]])

Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

filtered = data[(data >= lower) & (data <= upper)]
print(f"Total: {len(data)}, Outliers: {len(data) - len(filtered)}")
print(f"Antes: média={data.mean():.1f}, Depois: média={filtered.mean():.1f}")

Output:

TEXT 📖 Somente leitura
Total: 100, Outliers: 5
Antes: média=56.8, Depois: média=49.1


❓ Perguntas Frequentes

P: E se meus dados têm colunas de string? R: O loadtxt do NumPy não consegue lidar com tipos mistos. Use np.genfromtxt com dtype=None para dados mistos, ou use Pandas para arquivos CSV complexos.

P: Como sei qual multiplicador IQR usar? R: 1.5 é o padrão para outliers "moderados", 3.0 para outliers "extremos". Estes vêm da distribuição normal padrão onde 1.5×IQR ≈ ±2.7σ.

P: Devo normalizar antes ou depois de remover outliers? R: Depois. Outliers distorcem a média e o desvio, tornando a normalização menos eficaz. Sempre limpe os dados primeiro, depois normalize.


📖 Resumo

Neste projeto você aplicou:


📝 Exercícios

  1. Básico (Dificuldade ⭐): Modifique o multiplicador IQR para 3.0. Quantos outliers a menos são detectados?

  2. Intermediário (Dificuldade ⭐⭐): Adicione uma coluna para 'timestamp' e filtre dados fora do horário comercial (9h - 17h).

  3. Desafio (Dificuldade ⭐⭐⭐): Implemente uma janela móvel para detecção de outliers — marque um ponto como outlier apenas se estiver fora do IQR de sua vizinhança local (100 pontos circundantes).

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%