Fase 1 — Fundamentos | Pré-requisitos: Aulas 0 a 6 | Tipo: projeto prático | Duração estimada: 3 a 5 horas


Introdução

Esta aula é diferente de todas as anteriores. Não há novo conteúdo teórico. O objetivo é aplicar tudo que foi aprendido nas aulas 1 a 6 num projeto completo de análise de dados, do início ao fim, com um dataset real.

Projetos existem porque há uma lacuna enorme entre saber como uma função funciona e saber quando usá-la, por quê, e o que fazer quando o resultado não é o esperado. Exercícios isolados treinam habilidades específicas. Projetos treinam julgamento analítico — a capacidade de tomar decisões encadeadas diante de dados reais e imperfeitos.

Esta aula funciona como um guia completo para o projeto: o que fazer, como fazer, critérios de qualidade, datasets sugeridos e um exemplo de estrutura de entrega. Ao final, como nas outras aulas, há cinco questões — aqui mais reflexivas e orientadas ao processo do que técnicas.


O que o projeto pede

Você vai escolher um dataset, formular pelo menos três perguntas analíticas sobre ele, e respondê-las com código Python documentado num Jupyter Notebook. O produto final é um notebook que conta uma história coerente: começa com contexto, passa pela análise e termina com conclusões claras.

Os requisitos mínimos são os seguintes.

O notebook deve ser executável do início ao fim com Kernel → Restart & Run All sem erros.

Deve conter pelo menos três perguntas analíticas formuladas antes da análise.

Deve incluir a inspeção inicial completa do dataset: shape, tipos, ausentes, estatísticas descritivas e frequências das colunas categóricas principais.

Deve documentar todas as decisões de limpeza tomadas: o que foi removido, o que foi imputado e por quê.

Deve ter pelo menos quatro visualizações, cada uma com título, rótulos de eixo e uma frase no markdown explicando o que ela mostra.

Deve terminar com uma seção de conclusões que responde as três perguntas formuladas no início, com as limitações da análise.


Escolhendo um dataset

A escolha do dataset é a primeira decisão analítica do projeto. Algumas orientações.

Escolha algo que te interessa genuinamente. Análise de dados exige horas de atenção. Um dataset sobre um tema que você acha entediante vai tornar o trabalho mais difícil do que precisa ser.

Escolha um dataset com pelo menos 500 linhas e pelo menos 6 colunas, incluindo pelo menos duas colunas numéricas e pelo menos uma coluna categórica. Datasets muito pequenos não deixam fazer análises interessantes. Datasets com uma única coluna numérica não permitem explorar relações.

Evite datasets já muito analisados como Titanic e Iris para este projeto. Eles têm dezenas de análises prontas online, o que torna a tentação de copiar muito grande e o aprendizado muito pequeno.

Fontes de datasets

Kaggle (kaggle.com/datasets) tem milhares de datasets gratuitos em praticamente qualquer tema. A qualidade varia muito, mas há muitos excelentes. Bons pontos de partida são as seções de "beginner" e os datasets com muitos votos positivos.

UCI Machine Learning Repository (archive.ics.uci.edu) tem datasets clássicos de pesquisa, bem documentados e limpos o suficiente para análise sem frustração excessiva.

IBGE (ibge.gov.br) disponibiliza dados brasileiros sobre população, economia, trabalho e muito mais. O SIDRA é o sistema de recuperação de dados agregados.

Portal Brasileiro de Dados Abertos (dados.gov.br) tem dados de órgãos federais: saúde, educação, segurança pública, transporte.

Our World in Data (ourworldindata.org) tem dados globais sobre saúde, desenvolvimento, meio ambiente e economia, bem documentados e com contexto.

Dados.MG, Dados.SP, Dados.Rio — portais estaduais e municipais de dados abertos com dados regionais brasileiros.

Datasets sugeridos para este projeto

Se você não tem um tema em mente, estes são bons pontos de partida por serem interessantes, suficientemente complexos e bem documentados:

Brazilian E-Commerce Public Dataset (Olist) — disponível no Kaggle. Dados de pedidos, produtos, avaliações e vendedores de um marketplace brasileiro real. Ótimo para perguntas sobre satisfação de clientes, categorias mais vendidas e tempos de entrega.

ENEM — os microdados do ENEM são disponibilizados pelo INEP (gov.br/inep). São muito grandes (5 milhões de linhas), então use nrows para carregar uma amostra. Ótimo para perguntas sobre desempenho por região, tipo de escola e dados socioeconômicos.

Campeonato Brasileiro de Futebol — disponível no Kaggle com dados de partidas, gols e placares desde 2006. Ótimo para quem tem interesse em esportes.

COVID-19 no Brasil — disponível no brasil.io com dados históricos de casos e óbitos por município. Ótimo para séries temporais e análise regional.

World Happiness Report — disponível no Kaggle com indicadores de felicidade por país ao longo dos anos. Ótimo para correlações e comparações internacionais.


Formulando boas perguntas analíticas

Antes de escrever qualquer código, formule suas perguntas. Revisando os critérios da Aula 1: uma boa pergunta analítica é específica, respondível com os dados disponíveis, relevante e formulada antes de explorar os dados.

Perguntas fracas e suas versões melhoradas:

"Como são as vendas?" → "As vendas da categoria Eletrônicos cresceram no segundo semestre de 2023 em relação ao primeiro semestre?"

"Quem compra mais?" → "Clientes de quais estados têm o maior ticket médio por pedido, e essa diferença se mantém quando controlamos pela categoria do produto?"

"Há outliers?" → "Há pedidos com valor acima de três desvios padrão da média, e esses pedidos se concentram em alguma categoria ou período específico?"

Uma boa estrutura para formulação é a pergunta de dois níveis: o primeiro nível é descritivo (o quê?) e o segundo é relacional (como se relaciona com quê?). Por exemplo: "Qual é a distribuição das notas de avaliação dos clientes (nível 1), e essa distribuição varia entre diferentes categorias de produto (nível 2)?"


Estrutura recomendada do notebook

Um notebook bem estruturado para este projeto tem as seguintes seções em markdown, com o código correspondente em cada uma.

Seção 1: contexto e perguntas

Comece com um bloco markdown apresentando o dataset: de onde vem, o que representa, quantas linhas e colunas tem, qual o período de tempo coberto se aplicável, e quais as limitações conhecidas antes mesmo de começar.

Em seguida, liste suas três perguntas analíticas de forma numerada. Elas vão orientar toda a análise.

# Análise do dataset de e-commerce brasileiro (Olist)

## Contexto
O dataset Olist contém dados de pedidos realizados em um marketplace
brasileiro entre 2016 e 2018. Inclui informações sobre pedidos,
produtos, avaliações de clientes, vendedores e dados de entrega.

**Fonte:** Kaggle — Brazilian E-Commerce Public Dataset by Olist
**Período:** setembro de 2016 a agosto de 2018
**Tamanho:** ~100.000 pedidos, múltiplas tabelas relacionadas

## Perguntas analíticas
1. Quais categorias de produto têm maior volume de vendas e como
   isso variou ao longo do período analisado?
2. Há relação entre o tempo de entrega e a nota de avaliação
   do cliente?
3. Quais estados brasileiros têm o maior número de vendedores
   ativos e como isso se correlaciona com o volume de pedidos
   recebidos?

Seção 2: imports e configuração

Todos os imports numa única célula de código, seguidos de qualquer configuração global (estilo de gráficos, opções do pandas, seed aleatória).

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Configurações
pd.set_option('display.max_columns', None)    # mostrar todas as colunas
pd.set_option('display.float_format', '{:.2f}'.format)  # 2 casas decimais
plt.style.use('seaborn-v0_8-whitegrid')       # estilo de gráfico consistente

Seção 3: carregamento dos dados

Carregue os dados e documente no markdown quais arquivos foram carregados, o que cada um contém e quais joins foram feitos se o dataset tem múltiplas tabelas.

# Carregar as tabelas principais
pedidos = pd.read_csv('olist_orders_dataset.csv', parse_dates=['order_purchase_timestamp'])
itens = pd.read_csv('olist_order_items_dataset.csv')
avaliacoes = pd.read_csv('olist_order_reviews_dataset.csv')
produtos = pd.read_csv('olist_products_dataset.csv')

# Juntar em um DataFrame principal
df = (pedidos
      .merge(itens, on='order_id', how='left')
      .merge(avaliacoes[['order_id', 'review_score']], on='order_id', how='left')
      .merge(produtos[['product_id', 'product_category_name']], on='product_id', how='left')
)

print(f"Shape após joins: {df.shape}")

Seção 4: inspeção inicial

Execute o fluxo completo de inspeção da Aula 3. Documente no markdown o que você encontrou — não apenas rode o código mas interprete os resultados.

print("Shape:", df.shape)
df.info()
print(df.describe())
print("\nValores ausentes:")
print(df.isnull().sum())

Depois do código, escreva uma célula markdown resumindo as descobertas:

### Observações da inspeção inicial
- A coluna `review_score` tem 12% de valores ausentes — pedidos
  cancelados antes da entrega não geram avaliação.
- `product_category_name` tem 2.4% de ausentes — itens sem
  categoria cadastrada.
- Há 775 pedidos duplicados no join (pedidos com múltiplos itens
  geraram múltiplas linhas). Será necessário agregar por pedido
  para análises de valor total.
- Datas estão corretamente parseadas como datetime.

Seção 5: limpeza de dados

Documente e execute cada decisão de limpeza. Para cada ação, explique no markdown o que foi feito e por quê.

df_limpo = (df
    # Remover pedidos cancelados (não têm informação de entrega ou avaliação)
    .query("order_status == 'delivered'")
    # Remover linhas sem avaliação para análises de satisfação
    # (mantemos o df_limpo completo para análises de volume)
    .assign(product_category_name = lambda x:
            x['product_category_name'].fillna('sem_categoria'))
)

print(f"Linhas após limpeza: {len(df_limpo)} (removidas: {len(df) - len(df_limpo)})")

Seção 6: análise e visualizações

Esta é a maior seção. Organize em subseções, uma para cada pergunta analítica. Em cada subseção: explique no markdown o que você vai investigar, execute o código de análise, crie a visualização, e conclua com uma frase no markdown respondendo o que foi encontrado.

Exemplo para a pergunta 2:

# Calcular tempo de entrega em dias
df_entrega = df_limpo.copy()
df_entrega['tempo_entrega'] = (
    pd.to_datetime(df_entrega['order_delivered_customer_date']) -
    pd.to_datetime(df_entrega['order_purchase_timestamp'])
).dt.days

# Remover tempos negativos ou impossíveis (erro de dados)
df_entrega = df_entrega[df_entrega['tempo_entrega'].between(0, 120)]

# Média de tempo de entrega por nota de avaliação
tempo_por_nota = (df_entrega
    .groupby('review_score')['tempo_entrega']
    .agg(['mean', 'median', 'count'])
    .round(1)
    .reset_index()
)

print(tempo_por_nota)

# Visualização
tempo_por_nota.plot(
    kind='bar',
    x='review_score',
    y='mean',
    color='steelblue',
    edgecolor='white',
    figsize=(8, 4),
    legend=False
)
plt.title('Tempo médio de entrega por nota de avaliação')
plt.xlabel('Nota do cliente (1-5)')
plt.ylabel('Tempo médio de entrega (dias)')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()

Seção 7: conclusões

A seção final responde as três perguntas formuladas no início, com linguagem clara e sem jargão técnico. Inclui também as limitações da análise.

## Conclusões

### Pergunta 1
As três categorias com maior volume de vendas foram cama/mesa/banho,
beleza/saúde e esportes/lazer, responsáveis por 28% do total de pedidos.
O volume cresceu consistentemente de 2016 a 2018, com pico em novembro
(Black Friday) em ambos os anos.

### Pergunta 2
Há uma relação clara entre tempo de entrega e satisfação: pedidos
avaliados com nota 5 tiveram tempo médio de entrega de 10.2 dias,
enquanto pedidos com nota 1 tiveram tempo médio de 21.4 dias — mais
do que o dobro. Pedidos entregues antes do prazo prometido tiveram
nota média de 4.3; pedidos entregues depois do prazo tiveram nota
média de 2.6.

### Pergunta 3
São Paulo concentra 69% dos vendedores cadastrados e responde por
52% do volume de pedidos. Há correlação de 0.91 entre número de
vendedores por estado e volume de pedidos recebidos, o que é esperado
dado que vendedores tendem a estar próximos de seus compradores.

## Limitações
- O dataset cobre apenas 2016-2018, um período de crescimento
  acelerado do e-commerce brasileiro. As tendências podem não
  se manter no período atual.
- Dados de devolução e cancelamento pós-entrega não estão
  disponíveis, o que pode distorcer análises de satisfação.
- A relação entre tempo de entrega e nota não implica causalidade —
  pode haver fatores como qualidade do produto que afetam ambos.

Critérios de qualidade

Para avaliar seu próprio projeto antes de considerar concluído, passe pelo checklist abaixo.

O notebook executa sem erros com Restart & Run All? Se não, não está pronto.

As três perguntas analíticas estão formuladas antes de qualquer código de análise?

Cada decisão de limpeza está documentada com uma justificativa?

Cada visualização tem título, rótulos de eixo e uma frase de interpretação?

As conclusões respondem as perguntas originais com dados específicos, não com generalidades?

As limitações da análise estão mencionadas?

O código está organizado em seções com titles markdown?

Não há células de debug deixadas com outputs irrelevantes?

Se você respondeu sim a todas as perguntas, o projeto está em boa forma.


Erros comuns a evitar

Analisar antes de formular perguntas. Explorar os dados livremente e depois criar perguntas que você já sabe a resposta. Isso parece análise mas é HARKing. Escreva as perguntas primeiro, mesmo que sejam provisórias.

Limpeza sem documentação. Remover outliers ou preencher ausentes sem registrar por quê. Semanas depois você não vai lembrar, e ninguém mais vai entender.

Visualizações sem contexto. Um gráfico sem título, sem rótulos de eixo e sem uma frase explicando o que ele mostra é um gráfico ilegível. Sempre contextualize.

Conclusões vagas. "As vendas cresceram bastante" não é uma conclusão analítica. "As vendas cresceram 34% no segundo semestre em relação ao primeiro, puxadas principalmente pela categoria Eletrônicos que cresceu 58%" é.

Confundir correlação com causalidade. Se você encontrar uma correlação, descreva-a como correlação. Não diga que A causa B a menos que você tenha evidência causal.

Não testar o notebook do início ao fim. O notebook que funciona na sua sessão ativa pode não funcionar para mais ninguém. Restart & Run All é obrigatório antes de considerar qualquer notebook entregue.


Resumo

O Projeto 1 consolida as habilidades da Fase 1: processo analítico, Jupyter, pandas, NumPy, estatísticas descritivas e visualizações básicas. A entrega é um Jupyter Notebook completo que vai do carregamento dos dados às conclusões, documentado em markdown, com código limpo e executável. A qualidade é medida não apenas pelo código técnico mas pela coerência analítica: as perguntas foram boas, a limpeza foi justificada, as visualizações são informativas e as conclusões são específicas e honestas sobre as limitações.

Exercícios

  1. Por que um projeto de análise de dados é uma forma de avaliação mais completa do que uma prova de múltipla escolha sobre pandas e NumPy?

    ✓ Resposta:

    Uma prova de múltipla escolha avalia reconhecimento: você identifica a função correta entre opções, sabe o nome dos parâmetros, reconhece o output de um trecho de código. É uma medida de familiaridade com a sintaxe.

    Um projeto avalia julgamento analítico, que é fundamentalmente diferente. Num projeto você precisa decidir qual pergunta fazer, o que é uma decisão de domínio que exige entender o contexto dos dados. Você precisa decidir o que fazer com valores ausentes, o que não tem resposta única. Você precisa escolher qual visualização comunica melhor, o que envolve estética, cognição e conhecimento do público. Você precisa interpretar os resultados e decidir se são suficientemente robustos para sustentar uma conclusão.

    Essas decisões não têm resposta correta única e não aparecem em múltipla escolha. São exatamente o que um analista faz no trabalho todos os dias. Um projeto ruim com código tecnicamente correto — análise sem coerência, perguntas vagas, conclusões sem suporte — revela mais sobre as lacunas de um analista do que uma prova reprovada.

  2. Você carregou um dataset de vendas e percebeu, durante a inspeção inicial, que 35% dos valores da coluna valor_total estão ausentes. Quais são as possíveis causas desse problema e como você decidiria o que fazer antes de avançar com a análise?

    ✓ Resposta:

    35% de ausentes em uma coluna central é um problema sério que precisa ser investigado antes de qualquer decisão técnica.

    As causas possíveis são diversas. Pode ser que pedidos cancelados ou em rascunho não tenham valor calculado — nesse caso o ausente é informativo e esses registros podem precisar ser filtrados. Pode ser um problema de integração entre sistemas, onde algumas fontes não preencheram esse campo. Pode ser que valores zero foram deixados em branco por convenção interna do sistema. Pode ser que o campo foi adicionado recentemente e registros antigos não o têm.

    A investigação correta começa examinando as outras colunas das linhas com ausente: elas têm padrão? Pertencem a uma data específica, uma loja específica, um status de pedido específico? Isso vai revelar se o ausente é aleatório ou sistemático.

    # Comparar os registros com e sem valor_total
    df_ausente = df[df['valor_total'].isnull()]
    df_presente = df[df['valor_total'].notnull()]
    
    print(df_ausente['status_pedido'].value_counts())
    print(df_ausente['data'].min(), df_ausente['data'].max())
    

    Com esse entendimento, as opções são: filtrar as linhas ausentes se elas representam registros não relevantes para a pergunta analítica, imputar se o padrão de ausência é aleatório e há uma estratégia razoável, ou redefinir a pergunta analítica para trabalhar apenas com os registros completos e documentar a limitação.

  3. Qual a diferença entre uma análise exploratória e uma análise para apresentação? Como essa diferença deve se refletir nos gráficos que você produz para cada finalidade?

    ✓ Resposta:

    A diferença é de audiência e propósito. A análise exploratória é para você — é o processo de entender os dados, testar hipóteses, descobrir padrões. Os gráficos exploratórios precisam ser rápidos de produzir e informativos o suficiente para guiar a próxima decisão. Não precisam ser bonitos. Um histograma sem título gerado com uma linha de pandas em 10 segundos é suficiente se ele responde a sua pergunta imediata.

    A análise para apresentação é para outros — stakeholders, colegas, clientes. Os gráficos precisam ser autoexplicativos: qualquer pessoa que veja o gráfico sem você explicando deve entender o que ele mostra. Isso exige título claro, rótulos de eixo, escala adequada, legendas quando necessário, e uma escolha de tipo de gráfico que comunica a mensagem pretendida sem ambiguidade.

    Na prática, você produz dezenas de gráficos exploratórios durante a análise e seleciona três ou quatro para polir e apresentar. A habilidade de selecionar quais merecem polish e como comunicar a mensagem deles claramente é o que distingue um bom analista de alguém que apenas sabe usar pandas. A Fase 3 deste curso cobre exatamente essa transformação do exploratório para o explicativo.

  4. Um colega analisou um dataset de saúde pública e concluiu: "estados com mais hospitais têm mais mortes por doenças cardíacas — portanto, hospitais causam mortes". O que há de errado com essa conclusão e como você explicaria o erro para alguém sem formação em estatística?

    ✓ Resposta:

    O erro é clássico: confundir correlação com causalidade, agravado pela ignorância de uma variável de confusão óbvia.

    A correlação provavelmente existe porque estados com mais hospitais também têm populações maiores e mais envelhecidas. Populações maiores têm mais mortes em termos absolutos. Populações mais velhas têm mais doenças cardíacas porque idade é o principal fator de risco. Os hospitais não causam as mortes — eles existem onde há mais pessoas que precisam de atendimento, e essas pessoas morrem de doenças que a idade traz.

    Para explicar para alguém sem formação estatística, uma analogia ajuda: "Cidades com mais bombeiros têm mais incêndios grandes. Isso significa que bombeiros causam incêndios? Não — cidades maiores têm mais bombeiros porque têm mais incêndios. A causa dos incêndios é o tamanho da cidade, não os bombeiros."

    A forma correta de analisar a questão seria comparar taxas — mortes por 100.000 habitantes, controlando por idade — e não números absolutos. Ou comparar o que aconteceu em regiões específicas antes e depois da construção de novos hospitais, o que se aproxima mais de um estudo causal.

  5. Após terminar seu projeto, você percebe que uma das suas três perguntas analíticas não pôde ser respondida adequadamente com os dados disponíveis. Como você deve lidar com isso na seção de conclusões?

    ✓ Resposta:

    Isso é completamente normal e a resposta honesta é a única adequada: documentar a limitação claramente na seção de conclusões, explicar por que a pergunta não pôde ser respondida e, se possível, indicar que dados adicionais seriam necessários para respondê-la.

    Analistas iniciantes têm a tendência de ou fingir que a pergunta foi respondida com evidência insuficiente, ou simplesmente omitir a pergunta da conclusão. As duas abordagens são problemáticas. A primeira é desonestidade intelectual — você está induzindo o leitor a acreditar em uma conclusão sem suporte. A segunda é incompletude — o leitor não sabe por que uma das perguntas originais sumiu.

    A abordagem correta soa assim na prática: "A pergunta 3 buscava entender a relação entre localização geográfica do vendedor e prazo de entrega. Os dados disponíveis contêm o estado do vendedor e o CEP de entrega, mas não as coordenadas precisas nem a transportadora utilizada. Sem essas informações, não é possível isolar o efeito da distância de outros fatores logísticos. Para responder esta pergunta adequadamente, seria necessário cruzar os dados com informações de frete das transportadoras parceiras."

    Reconhecer limitações não enfraquece uma análise — fortalece a credibilidade de quem a fez.

Referências

  • Leek, Jeff; Peng, Roger. "What is the question?" Science, 2015. Artigo curto e essencial sobre os diferentes tipos de perguntas em ciência de dados e por que confundi-los é a principal fonte de conclusões incorretas.
  • Peng, Roger; Matsui, Elizabeth. The Art of Data Science. Leanpub, 2015. Disponível gratuitamente em leanpub.com/artofdatascience Guia prático do processo completo de análise de dados, com foco em julgamento analítico.
  • Wickham, Hadley. "Tidy Data". Journal of Statistical Software, 2014. O artigo que formalizou princípios de organização de dados que tornam a análise mais fácil e reproduzível.
  • Wilson, Greg et al. "Good Enough Practices in Scientific Computing". PLOS Computational Biology, 2017. Dez recomendações práticas para tornar projetos de análise organizados, reproduzíveis e compartilháveis. Disponível em journals.plos.org.
  • Dataset Olist no Kaggle: kaggle.com/datasets/olistbr/brazilian-ecommerce O dataset de e-commerce brasileiro mencionado como sugestão, com boa documentação e vários notebooks de referência.
  • Portal Brasileiro de Dados Abertos: dados.gov.br. Ponto de entrada para dados públicos federais brasileiros.