flowchart LR A["Pergunta"] --> B["Coleta"] B --> C["Limpeza"] C --> D["EDA"] D --> E["Modelagem"] E --> F["Comunicação"] D --> A D --> C
Aula 04 — Módulo 1: Análise Exploratória
Antes de resumir uma base, precisamos descobrir o que suas linhas realmente significam.
Brazilian E-Commerce Public Dataset by Olist
Como estrutura, prazo de entrega e experiência do cliente aparecem nos registros da plataforma?
Não tentaremos prever nem afirmar causalidade. O objetivo é aprender a transformar registros em evidência descritiva confiável.
orders
Uma linha = um pedido.
order_items
Uma linha = um item dentro do pedido.
payments
Uma linha = uma parcela ou forma de pagamento.
reviews
Uma linha = uma avaliação registrada.
| tabela | linhas na amostra | chave principal | ligação |
|---|---|---|---|
orders |
20.000 | order_id |
customer_id |
customers |
20.000 | customer_id |
pedido → cliente |
order_items |
22.735 | order_id + order_item_id |
item → pedido |
payments |
20.979 | order_id + payment_sequential |
pagamento → pedido |
reviews |
19.921 | review_id |
avaliação → pedido |
Há mais itens que pedidos e menos avaliações que pedidos. Essa diferença já revela granularidade e ausência.
Resultado: aproximadamente 97% dos pedidos estão marcados como entregues.
São Paulo responde por cerca de 42% dos pedidos da amostra.
John Tukey popularizou a análise exploratória como uma forma de descobrir estrutura antes de formalizar modelos.
Uma visualização é útil quando muda a próxima pergunta que fazemos aos dados.
Estrutura · como os registros se organizam?
Granularidade · o que representa uma linha?
Escopo · quem e o que ficaram de fora?
Temporalidade · quando cada variável foi registrada?
Corretude · os valores respeitam as regras do domínio?
flowchart LR A["Pergunta"] --> B["Coleta"] B --> C["Limpeza"] C --> D["EDA"] D --> E["Modelagem"] E --> F["Comunicação"] D --> A D --> C
A exploração frequentemente nos faz voltar à pergunta ou à limpeza.
Uma base pode chegar como:
O formato físico não define a unidade de observação nem garante qualidade.
Em uma tabela retangular:
Retangular é uma forma conveniente, não uma propriedade natural do fenômeno.
flowchart LR C["customers<br>customer_id"] --> O["orders<br>order_id"] O --> I["order_items<br>order_id + item"] O --> P["payments<br>order_id + sequência"] O --> R["reviews<br>review_id"]
Uma chave deve identificar linhas ou permitir uma ligação com cardinalidade conhecida.
order_id identifica pedidos em orders, mas se repete em order_items.
Na amostra, a mediana é um item e o máximo chega a 20 itens.
O resultado possui granularidade de item, não mais de pedido.
Somar pedidos depois desse merge contaria pedidos com vários itens mais de uma vez.
Resultado: 19.838 pedidos com itens, uma linha por order_id.
inner
Mantém apenas chaves presentes nos dois lados.
left
Preserva todas as linhas da tabela principal.
right
Preserva todas as linhas da tabela adicionada.
outer
Preserva todas as chaves dos dois lados.
Resultado: (20000, 12) — nenhum pedido foi perdido e cada customer_id encontrou no máximo um registro.
validate transforma uma suposição silenciosa em teste executável.
Resultado: analysis.shape → (20000, 20).
Cada linha continua representando um pedido.
A base registra pedidos:
Ela não representa automaticamente todo o comércio eletrônico brasileiro.
Datas posteriores ao pedido faltam mais frequentemente.
Pedidos cancelados, enviados ou indisponíveis frequentemente não possuem data de entrega — como esperado pelo processo.
Manter NaN
Quando a ausência tem significado e a análise aceita valores faltantes.
Remover linhas
Quando a unidade não serve à pergunta e a perda é explicitada.
Preencher
Quando existe uma regra defensável — nunca apenas para “sumir com o NaN”.
dropna() pode mudar a populaçãoO resultado mantém sobretudo pedidos entregues e elimina muitos pedidos interrompidos.
Limpar sem registrar a regra redefine silenciosamente o fenômeno estudado.
Testes simples capturam violações antes que entrem em gráficos e resumos.
Alguns pedidos possuem mais de uma avaliação. Precisamos agregar antes do merge por pedido.
Resultado: mediana de R$ 86,99; a média é maior por causa da cauda à direita.
Um valor extremo pode ser:
Investigue o registro e o processo antes de remover.
Resultado: compras registradas entre 04/09/2016 e 17/10/2018.
Datas como texto não permitem diferenças, ordenação temporal segura ou reamostragem.
Setembro e outubro de 2018 não devem ser comparados como meses completos.
Escolha a escala que corresponde à pergunta.
Resultado: mediana de 10,2 dias; a média é maior por causa de entregas longas.
Resultado: 8,1% dos pedidos entregues chegaram depois da estimativa.
Notas 5 são frequentes, mas nem todo pedido possui avaliação disponível.
No prazo: 4,28 · Atrasado: 2,58
A diferença é grande o suficiente para motivar novas perguntas sobre logística e satisfação.
Pedidos atrasados podem também:
EDA revela padrões e hipóteses; causalidade exige um desenho de estudo apropriado.
analysis = (
orders
.merge(customers, on="customer_id", validate="many_to_one")
.merge(item_agg, on="order_id", how="left", validate="one_to_one")
.merge(review_agg, on="order_id", how="left", validate="one_to_one")
.assign(
entrega_dias=lambda d: (
d.order_delivered_customer_date - d.order_purchase_timestamp
).dt.days
)
)Pergunta: pedidos com frete mais caro recebem notas piores?
validate e testes de domínio tornam a preparação verificável.Próxima aula: como transformar distribuições em comparações visuais honestas?
Na próxima aula, avançaremos de auditoria e preparação para princípios de visualização e descrição de distribuições.
ICD: Aula 04 — Análise exploratória de dadosvoltar para a Aula