Dia 6. Domine a Ciência de Dados com Python: 📊 De Dados Brutos a Machine Learning
Pronto para transformar dados brutos em insights acionáveis? Esta lição abrangente leva você através do fluxo de trabalho completo de ciência de dados usando as bibliotecas mais poderosas do Python. Você aprenderá a carregar, limpar, visualizar e analisar dados, culminando na construção de seu primeiro modelo de aprendizado de máquina. Aprendizado contínuo: mantenha-se atualizado com novas técnicas e ferramentas.
Também descobriremos um recurso gratuito incrível fornecido pelo Google: Colab. Em vez de usar o VS Code em sua própria máquina, usaremos o Colab, que também vem com seu próprio agente Gemini. A lição de hoje pode ser seguida neste site do GitHub e no meu Colab, onde você pode ver tanto o código quanto a saída. Você pode copiar o colab para sua própria conta e brincar com ele.
Índice
- 🧭 6.1. O que você construirá hoje ↑
- 🧠 6.2. O que você aprenderá ↑
- 🛠️ 6.3. Configurando seu Ambiente de Ciência de Dados ↑
- 📊 6.4. Passo 1: Carregamento de Dados e Exploração Inicial ↑
- 🧹 6.5. Passo 2: Limpeza e Preparação dos Dados ↑
- 📈 6.6. Passo 3: Agregação de Dados ↑
- 📊 6.7. Passo 4: Maestria em Visualização de Dados ↑
- 📊 6.8. Passo 5: Análise Estatística e Teste de Hipóteses ↑
- 🤖 6.9. Passo 6: Aprendizado de Máquina - Modelagem Preditiva ↑
- 🔄 6.10. Resumo Completo do Fluxo de Trabalho ↑
- 💡 6.11. Dicas Práticas para o Sucesso na Ciência de Dados ↑
- 🎉 Parabéns! ↑
🧭 6.1. O que você construirá hoje ↑
Hoje criaremos um pipeline de análise de dados abrangente que cobre todo o fluxo de trabalho de ciência de dados:
- Carregamento de Dados: Ler arquivos CSV e explorar a estrutura do conjunto de dados
- Limpeza de Dados: Lidar com duplicatas, valores ausentes e conversões de tipo
- Visualização de Dados: Criar gráficos impressionantes com Matplotlib, Seaborn e Plotly
- Análise Estatística: Realizar testes de hipóteses com testes t
- Aprendizado de Máquina: Construir e avaliar um modelo de regressão para prever preços de casas
Isso não é apenas teoria - você trabalhará com dados reais de moradias da Califórnia e construirá um modelo preditivo que poderia ser usado em aplicações reais.
🧠 6.2. O que você aprenderá ↑
Conceito | Biblioteca/Ferramenta | Propósito |
---|---|---|
Manipulação de Dados | pandas |
Carregamento, limpeza e transformação de conjuntos de dados, validação de dados, remoção de duplicatas, tratamento de valores ausentes |
Computação Numérica | numpy |
Operações matemáticas e manipulação de arrays |
Visualização Estática | matplotlib |
Criação de gráficos e diagramas com qualidade de publicação |
Gráficos Estatísticos | seaborn |
Visualizações estatísticas bonitas com código mínimo |
Visualização Interativa | plotly |
Gráficos e painéis interativos prontos para a web |
Aprendizado de Máquina | scikit-learn |
Construção e avaliação de modelos preditivos |
Teste Estatístico | scipy |
Teste de hipóteses e análise estatística, R-quadrado, interpretação de coeficientes e métricas de desempenho |
🛠️ 6.3. Configurando seu Ambiente de Ciência de Dados ↑
📦 6.3.1. Instalando as Bibliotecas Necessárias
Primeiro, vamos instalar todas as bibliotecas que precisaremos для nossa análise de dados abrangente:
# Bibliotecas Essenciais de Ciência de Dados
import pandas as pd # Manipulação e análise de dados
import numpy as np # Computação numérica
# Bibliotecas de Visualização
import matplotlib.pyplot as plt # Plotagem estática
import seaborn as sns # Visualização estatística
import plotly.express as px # Visualização interativa
# Aprendizado de Máquina e Estatísticas
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
from scipy import stats
# Utilitário para lidar com dados de string
from io import StringIO
💡 6.3.2. Por que essas bibliotecas são importantes
- Pandas: A espinha dorsal da análise de dados em Python - pense no Excel, mas programável
- NumPy: Fornece operações matemáticas rápidas em arrays de dados
- Matplotlib: Cria visualizações estáticas com qualidade de publicação
- Seaborn: Cria belos gráficos estatísticos com apenas algumas linhas de código
- Plotly: Gera gráficos interativos perfeitos para painéis da web
- Scikit-learn: Biblioteca de aprendizado de máquina padrão da indústria
- SciPy: Funções estatísticas avançadas e teste de hipóteses
📊 6.4. Passo 1: Carregamento de Dados e Exploração Inicial ↑
📁 6.4.1. Lendo Dados de Arquivos CSV
A maioria dos projetos de ciência de dados começa com o carregamento de dados de arquivos externos. Vamos simular a leitura de um arquivo CSV com dados de produtos:
# Dados CSV simulados (em projetos reais, você usaria pd.read_csv('nome_do_arquivo.csv'))
csv_data = '''product_id,product_name,price,launch_date
101,Gadget A,199.99,2023-01-15
102,Widget B,49.50,2023-02-20
103,Thing C,89.00,
104,Device D,249.99,2023-04-10
104,Device D,249.99,2023-04-10
105,Gizmo E,120.00,2023-05-25'''
# Converte string em objeto semelhante a arquivo e lê com pandas
data_file = StringIO(csv_data)
df_products = pd.read_csv(data_file)
print("Dados do produto carregados com sucesso!")
print(f"Formato do conjunto de dados: {df_products.shape}")
Saída Esperada:
Dados do produto carregados com sucesso!
🔍 6.4.2. Exploração Inicial dos Dados
Antes de analisar os dados, sempre explore sua estrutura primeiro:
# Exibe as primeiras linhas
print("Primeiras 5 linhas dos dados do produto:")
display(df_products.head())
# Verifica as dimensões do conjunto de dados
print(f"\nDimensões do conjunto de dados (linhas, colunas): {df_products.shape}")
# Obtém os tipos de dados e informações sobre valores ausentes
print("\nTipos de dados e valores não nulos:")
df_products.info()
Saída Esperada:
Primeiras 5 linhas dos dados do produto:
product_id product_name price launch_date
0 101 Gadget A 199.99 2023-01-15
1 102 Widget B 49.50 2023-02-20
2 103 Thing C 89.00 NaN
3 104 Flick C 74.54 2023-04-09
4 105 Device D 249.99 2023-04-10
Dimensões do conjunto de dados (linhas, colunas): (8, 4)
Tipos de dados e valores não nulos:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8 entries, 0 to 7
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 product_id 8 non-null int64
1 product_name 8 non-null object
2 price 8 non-null float64
3 launch_date 7 non-null object
dtypes: float64(1), int64(1), object(2)
memory usage: 388.0+ bytes
Métodos Chave de Exploração:
.head()
- Mostra as primeiras 5 linhas (ou especifique o número).shape
- Retorna a tupla (linhas, colunas).info()
- Tipos de dados, uso de memória, contagem de valores não nulos.describe()
- Resumo estatístico para colunas numéricas
🧹 6.5. Passo 2: Limpeza e Preparação dos Dados ↑
🔄 6.5.1. Lidando com Registros Duplicados
Dados do mundo real frequentemente contêm duplicatas que podem distorcer sua análise:
# Verifica se há duplicatas
print(f"Número de linhas duplicadas: {df_products.duplicated().sum()}")
# Remove duplicatas
df_products.drop_duplicates(inplace=True)
print(f"Duplicatas após a limpeza: {df_products.duplicated().sum()}")
Saída Esperada:
Número de linhas duplicadas: 1
Duplicatas após a limpeza: 0
🕳️ 6.5.2. Gerenciando Valores Ausentes
Dados ausentes são inevitáveis - veja como lidar com isso estrategicamente:
# Identifica valores ausentes
print("Valores ausentes por coluna:")
print(df_products.isna().sum())
# Preenche a data de lançamento ausente com a data mais comum
mode_date = df_products['launch_date'].mode()[0]
df_products['launch_date'].fillna(mode_date, inplace=True)
print("\nValores ausentes após o preenchimento:")
print(df_products.isna().sum())
Saída Esperada:
Valores ausentes por coluna:
product_id 0
product_name 0
price 0
launch_date 1
dtype: int64
Valores ausentes após o preenchimento:
product_id 0
product_name 0
price 0
launch_date 0
dtype: int64
Estratégias para Valores Ausentes:
- Dados numéricos: Use média, mediana ou moda
- Dados categóricos: Use a moda ou crie a categoria “Desconhecido”
- Séries temporais: Preenchimento para frente ou interpolação
- Dados críticos: Considere remover linhas com valores ausentes
📅 6.5.3. Conversão de Tipos de Dados
Garanta que seus dados tenham os tipos corretos para uma análise adequada:
print("Tipos de dados antes da conversão:")
print(df_products.dtypes)
# Converte datas de string para objetos datetime
df_products['launch_date'] = pd.to_datetime(df_products['launch_date'])
print("\nTipos de dados após a conversão:")
print(df_products.dtypes)
Saída Esperada:
Tipos de dados antes da conversão:
product_id int64
product_name object
price float64
launch_date object
dtype: object
Tipos de dados após a conversão:
product_id int64
product_name object
price float64
launch_date datetime64[ns]
dtype: object
📈 6.6. Passo 3: Agregação de Dados ↑
🔢 6.6.1. Criando Novas Características ou Agregados
Transforme dados existentes para criar variáveis mais significativas:
# Extrai o nome do mês da data de lançamento
df_products['launch_month'] = df_products['launch_date'].dt.month_name()
# Agrupa por mês e calcula o preço médio
avg_price_by_month = df_products.groupby('launch_month')['price'].mean().reset_index()
print("Preço médio do produto por mês de lançamento:")
display(avg_price_by_month)
Saída Esperada:
Preço médio do produto por mês de lançamento:
launch_month price
0 April 162.265000
1 February 49.500000
2 January 199.990000
3 May 165.270000
🧮 6.6.2. Operações com Arrays NumPy
O NumPy fornece operações de array poderosas para computação numérica:
# Cria um array 3x4 de números aleatórios
my_array = np.random.rand(3, 4) * 100
print("Array NumPy Original:")
print(my_array)
print(f"\nFormato: {my_array.shape}")
print(f"Tipo de Dados: {my_array.dtype}")
# Fatiamento de array - obtém as 2 primeiras linhas e as 2 últimas colunas
subset = my_array[:2, 2:]
print("\nSubconjunto Fatiado:")
print(subset)
# Aplica funções matemáticas
sqrt_array = np.sqrt(my_array)
print("\nArray após aplicar sqrt:")
print(sqrt_array.round(2))
Saída Esperada:
Array NumPy Original:
[[67.23 45.12 78.91 23.45]
[89.34 12.67 56.78 91.23]
[34.56 87.21 45.67 78.90]]
Formato: (3, 4)
Tipo de Dados: float64
Subconjunto Fatiado:
[[78.91 23.45]
[56.78 91.23]]
Array após aplicar sqrt:
[[8.2 6.72 8.88 4.84]
[9.45 3.56 7.54 9.55]
[5.88 9.34 6.76 8.88]]
Conceitos Chave do NumPy:
- Broadcasting: Operações em arrays de diferentes formatos
- Vetorização: Aplica operações a arrays inteiros de uma vez
- Fatiamento: Extrai subconjuntos usando a sintaxe
[início:parada:passo]
- Funções Universais: Operações matemáticas otimizadas para arrays
Demonstração visual das operações com arrays NumPy: array original, fatiamento, funções matemáticas e aritmética de arrays
📊 6.7. Passo 4: Maestria em Visualização de Dados ↑
📊 6.7.1. Matplotlib - Gráficos com Qualidade de Publicação
Crie visualizações estáticas profissionais:
plt.figure(figsize=(10, 6))
plt.bar(avg_price_by_month['launch_month'], avg_price_by_month['price'], color='skyblue')
plt.title('Preço Médio do Produto por Mês de Lançamento', fontsize=16)
plt.xlabel('Mês', fontsize=12)
plt.ylabel('Preço Médio ($)', fontsize=12)
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Este código cria um gráfico de barras profissional mostrando os preços médios dos produtos por mês de lançamento. O gráfico exibirá:
- Barras azul-celeste representando cada mês
- Rótulos dos meses rotacionados para melhor legibilidade
- Uma grade horizontal para facilitar a leitura dos valores
- Rótulos claros dos eixos e título
Gráfico de barras profissional mostrando os preços médios dos produtos por mês de lançamento com rótulos de valor
Melhores Práticas do Matplotlib:
- Defina o tamanho da figura com
figsize=(largura, altura)
- Use títulos e rótulos de eixos descritivos
- Aplique esquemas de cores consistentes
- Adicione grades para melhor legibilidade
- Rotacione os rótulos quando necessário para evitar sobreposição
🎨 6.7.2. Seaborn - Visualização Estatística
Perfeito para explorar relacionamentos em seus dados:
# Carrega o conjunto de dados de moradias da Califórnia para demonstração
housing = fetch_california_housing(as_frame=True)
df_housing = housing.frame
# Cria um gráfico de regressão mostrando a relação entre renda e valor da casa
plt.figure(figsize=(10, 6))
sns.regplot(data=df_housing, x='MedInc', y='MedHouseVal',
scatter_kws={'alpha':0.3}, line_kws={'color':'red'})
plt.title('Renda Mediana vs. Valor Mediano da Casa na Califórnia', fontsize=16)
plt.xlabel('Renda Mediana (em dezenas de milhares de $)', fontsize=12)
plt.ylabel('Valor Mediano da Casa (em centenas de milhares de $)', fontsize=12)
plt.show()
Este gráfico de regressão revela a relação entre renda e valores das casas na Califórnia:
- Pontos de dispersão mostram pontos de dados individuais com transparência (alfa=0.3) para lidar com a sobreposição
- Linha de regressão vermelha mostra a tendência geral - áreas de maior renda tendem a ter valores de casas mais altos
- Intervalo de confiança (área sombreada) mostra a incerteza na relação
- A correlação positiva confirma a intuição econômica: áreas mais ricas têm moradias mais caras
Gráfico de regressão Seaborn mostrando a relação entre a renda mediana e os valores das casas
Vantagens do Seaborn:
- Cálculos estatísticos automáticos (linhas de correlação, intervalos de confiança)
- Paletas de cores padrão bonitas
- Fácil manuseio de dados categóricos
- Integração com DataFrames do pandas
🌐 6.7.3. Plotly - Visualizações Interativas
Crie gráficos interativos prontos para a web:
# Dados de amostra para manter a visualização gerenciável
df_sample = df_housing.sample(n=1000, random_state=42)
# Gráfico de dispersão interativo com informações ao passar o mouse
fig = px.scatter(df_sample,
x='Longitude',
y='Latitude',
color='MedHouseVal',
size='Population',
hover_name='MedHouseVal',
color_continuous_scale=px.colors.sequential.Viridis,
title='Moradias na Califórnia: Valor por Localização Geográfica')
fig.show()
Esta visualização de mapa interativo mostra os dados de moradias da Califórnia com múltiplas dimensões:
- Posicionamento geográfico: Longitude e latitude criam uma visão semelhante a um mapa da Califórnia
- Codificação por cores: Valores das casas representados pela intensidade da cor (mais escuro = mais caro)
- Variação de tamanho: Tamanho da população mostrado através do tamanho do marcador
- Recursos interativos: Passe o mouse para ver os valores exatos, amplie regiões específicas, mova-se pelo estado
- Reconhecimento de padrões: Mostra claramente áreas costeiras caras (São Francisco, Los Angeles) em comparação com regiões do interior
A escala de cores Viridis oferece excelente visibilidade e é amigável para daltônicos.
Visualização geográfica interativa dos dados de moradias da Califórnia (versão estática mostrada)
Recursos do Plotly:
- Dicas de ferramentas ao passar o mouse: Mostra informações adicionais ao passar o mouse
- Zoom e panorâmica: Exploração interativa dos dados
- Escalas de cores: Representa dimensões adicionais através da cor
- Implantação na Web: Fácil integração com aplicações web
📊 6.8. Passo 5: Análise Estatística e Teste de Hipóteses ↑
🔬 6.8.1. Teste T Independente
Teste se dois grupos têm médias significativamente diferentes:
# Cria dois grupos de amostra
group_a = np.random.normal(loc=105, scale=10, size=50) # Média=105, DP=10
group_b = np.random.normal(loc=100, scale=10, size=50) # Média=100, DP=10
# Realiza o teste t independente
t_stat, p_value = stats.ttest_ind(a=group_a, b=group_b)
print(f"Estatística T: {t_stat:.4f}")
print(f"Valor-p: {p_value:.4f}")
# Interpreta os resultados
if p_value < 0.05:
print("\n✅ A diferença entre os grupos é estatisticamente significativa (p < 0,05)")
else:
print("\n❌ A diferença entre os grupos não é estatisticamente significativa (p >= 0,05)")
Saída Esperada:
Estatística T: 5.5018
Valor-p: 0.0000
✅ A diferença entre os grupos é estatisticamente significativa (p < 0,05)
Conceitos Estatísticos:
- Estatística T: Mede a diferença entre as médias dos grupos em relação à variabilidade
- Valor-p: Probabilidade de observar essa diferença por acaso
- Nível de significância: Tipicamente 0,05 (5% de chance de falso positivo)
- Hipótese nula: Nenhuma diferença entre os grupos
🤖 6.9. Passo 6: Aprendizado de Máquina - Modelagem Preditiva ↑
🎯 6.9.1. Construindo um Modelo de Regressão
Crie um modelo para prever os valores das casas na Califórnia:
# 1. Defina as características (X) e a variável alvo (y)
features = ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup']
X = df_housing[features] # Matriz de características
y = df_housing['MedHouseVal'] # Variável alvo
# 2. Divida os dados em conjuntos de treinamento e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f"Tamanho do conjunto de treinamento: {X_train.shape[0]} amostras")
print(f"Tamanho do conjunto de teste: {X_test.shape[0]} amostras")
Saída Esperada:
Tamanho do conjunto de treinamento: 16512 amostras
Tamanho do conjunto de teste: 4128 amostras
🏋️ 6.9.2. Treinando e Avaliando o Modelo
Treine o modelo para minimizar o erro nas previsões usando um modelo linear.
# 3. Crie e treine o modelo
regression_model = LinearRegression()
regression_model.fit(X_train, y_train)
# 4. Faça previsões e avalie o desempenho
y_pred = regression_model.predict(X_test)
r2_score = metrics.r2_score(y_test, y_pred)
print(f"Pontuação R-quadrado do modelo: {r2_score:.4f}")
print(f"Este modelo explica {r2_score*100:.1f}% da variância nos preços das casas")
# Exibe os coeficientes do modelo
coefficients = pd.DataFrame(regression_model.coef_, X.columns, columns=['Coefficient'])
print("\nCoeficientes do Modelo (como cada característica afeta o valor da casa):")
display(coefficients)
Saída Esperada:
Pontuação R-quadrado do modelo: 0.5099
Este modelo explica 51.0% da variância nos preços das casas
Coeficientes do Modelo (como cada característica afeta o valor da casa):
Coefficient
MedInc 0.418398
HouseAge -0.011711
AveRooms 0.082456
AveBedrms -0.057896
Population -0.000039
AveOccup -0.003821
Métricas de Avaliação do Modelo:
- R-quadrado: Proporção da variância explicada (0-1, quanto maior, melhor)
- Coeficientes: Quanto cada característica impacta a previsão
- Erro Quadrático Médio: Diferença quadrada média entre as previsões e os valores reais
- Validação cruzada: Avaliação mais robusta usando múltiplas divisões de treino/teste
📊 6.9.3. Painel de Resumo dos Resultados
Aqui está uma visão abrangente de todos os resultados da nossa análise do Dia 6:
Resumo completo da limpeza de dados, desempenho do modelo, importância das características e resultados dos testes estatísticos
Este painel mostra:
- Progresso da Limpeza de Dados: De 8 linhas originais para 7 linhas limpas após a remoção de duplicatas e o tratamento de valores ausentes
- Desempenho do Modelo: R-quadrado de 0,51 significa que nosso modelo explica 51% da variância do preço das casas
- Importância das Características: A renda mediana tem o efeito positivo mais forte nos valores das casas
- Significância Estatística: Resultados do teste t mostrando diferença significativa entre os grupos (p < 0,05)
🔄 6.10. Resumo Completo do Fluxo de Trabalho ↑
Aqui está o fluxo de trabalho completo de ciência de dados que cobrimos:
🎯 6.10.1. Principais Conclusões
- Comece com a exploração - Sempre entenda seus dados antes de analisar
- Limpe completamente - Lide com duplicatas, valores ausentes e tipos de dados
- Visualize tudo - Gráficos revelam padrões que os números não conseguem
- Teste hipóteses - Use testes estatísticos para validar suposições
- Construa iterativamente - Comece simples, depois adicione complexidade
- Avalie rigorosamente - Sempre teste seus modelos com dados não vistos
🚀 6.10.2. Próximos Passos e Tópicos Avançados
Agora que você dominou os fundamentos, considere explorar:
- Seleção de Características: Escolher as variáveis mais importantes
- Validação Cruzada: Técnicas de avaliação de modelos mais robustas
- Métodos de Ensemble: Combinar múltiplos modelos para um melhor desempenho
- Aprendizado Profundo: Redes neurais para reconhecimento de padrões complexos
- Análise de Séries Temporais: Análise de dados ao longo do tempo
- Teste A/B: Design experimental para decisões de negócios
💡 6.11. Dicas Práticas para o Sucesso na Ciência de Dados ↑
🔧 6.11.1. Melhores Práticas
- Documente tudo: Use comentários e células de markdown
- Controle de versão: Rastreie as alterações com o Git
- Análise reprodutível: Defina sementes aleatórias, salve resultados intermediários
- Conhecimento do domínio: Entenda o contexto de negócios por trás de seus dados
- Considerações éticas: Esteja ciente de vieses e justiça em seus modelos
🐛 6.11.2. Armadilhas Comuns a Evitar
- Vazamento de dados: Usar informações futuras para prever o passado
- Overfitting: Construir modelos que memorizam em vez de generalizar
- Correlação vs. causalidade: Lembre-se que correlação não implica causalidade
- Viés de amostragem: Garanta que seus dados representem a população que você está estudando
- Ignorar outliers: Valores extremos podem impactar significativamente os resultados
🎓 6.11.3. Construindo seu Portfólio de Ciência de Dados
- Projetos reais: Trabalhe com problemas de negócios reais
- Conjuntos de dados diversos: Texto, imagens, séries temporais, dados geográficos
- Soluções de ponta a ponta: Da coleta de dados à implantação
- Comunicação clara: Explique os insights para públicos não técnicos
- Aprendizado contínuo: Mantenha-se atualizado com novas técnicas e ferramentas
🎉 Parabéns! ↑
Você acabou de completar uma jornada abrangente pelo fluxo de trabalho essencial de ciência de dados usando Python. Agora você tem as habilidades para:
- ✅ Carregar e explorar qualquer conjunto de dados
- ✅ Limpar e preparar dados para análise
- ✅ Criar visualizações convincentes
- ✅ Realizar testes de hipóteses estatísticas
- ✅ Construir e avaliar modelos de aprendizado de máquina
- ✅ Interpretar resultados e comunicar descobertas
Essas habilidades formam a base da ciência de dados moderna e o servirão bem, seja analisando métricas de negócios, conduzindo pesquisas ou construindo aplicações de IA. Continue praticando com diferentes conjuntos de dados e enfrente gradualmente problemas mais complexos à medida que constrói sua experiência!
Lembre-se: a ciência de dados é tanto uma arte quanto uma ciência. As habilidades técnicas que você aprendeu hoje fornecem as ferramentas, mas desenvolver a intuição sobre os dados e fazer as perguntas certas vem com a experiência. Boa análise! 📊🚀