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
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
# 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)
# 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)
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
# 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 ⭐)
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 leituraShape: (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 ⭐⭐)
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 leituraOriginal: [ 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 ⭐⭐)
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 leituraTotal: 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.genfromtxtcomdtype=Nonepara 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:
np.nanmean/np.wherepara tratamento de valores ausentesnp.percentilepara detecção de outliers baseada em IQR- Máscaras booleanas para filtragem
- Normalização vetorizada (broadcasting)
np.save/np.savetxtpara exportação
📝 Exercícios
-
Básico (Dificuldade ⭐): Modifique o multiplicador IQR para 3.0. Quantos outliers a menos são detectados?
-
Intermediário (Dificuldade ⭐⭐): Adicione uma coluna para 'timestamp' e filtre dados fora do horário comercial (9h - 17h).
-
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).