Luiz

Projeto final · coortes & testes de hipótese · 2026 · por Luiz Trajano

Recompra de Clientes na Olist (Projeto Final, parte 1)

O que, na primeira compra, separa o cliente que volta a comprar do que compra uma vez só? Na Olist quase todo cliente compra uma vez e não volta, e cada venda nova depende de atrair alguém novo.

Python · Pandas · SciPy · Seaborn · Tableau

Origem: projeto da trilha TripleTen Data Analyst (sprint 14). Briefing e dados fornecidos pelo curso; análise, código e conclusões meus.

Sprint 14 - 04 Projeto Final.ipynb — luiz19190/Sprint-14-Projeto-final (Olist, cohort of 58,139 first-time buyers, 01/01/2017–04/03/2018); rating split by delivery from sections 3.6/4.4, repurchase within 180 days from section 3.2; recomputed from dashboard/base_dashboard.csv

A pergunta

A Olist liga pequenos lojistas aos grandes marketplaces do Brasil. Na base pública de 2016 a 2018, quase ninguém volta a comprar, e isso custa caro: quem já comprou poderia voltar sem o custo de aquisição de um cliente novo. O projeto final da TripleTen tinha duas etapas: primeiro uma decomposição, o plano da análise, aprovado por um revisor; só depois a implementação, com notebook, dashboard e apresentação. A minha pergunta foi: o que acontece na primeira compra (entrega, nota, frete e região) que separa quem volta de quem não volta, e onde a Olist e os lojistas podem agir.

A última sprint teve ainda um teste A/B e uma análise em SQL, que estão na parte 2.

A decomposição: o plano antes da análise

Antes de qualquer teste, olhei os dados para fechar as definições de que todo número depende.

Quem é o cliente. Contando por customer_id, ninguém teria comprado duas vezes: cada pedido gera um cadastro novo. Contando pela pessoa (customer_unique_id), alguém chega a 17 pedidos e 2.997 pessoas (3,12%) fizeram mais de um. O cliente passou a ser a pessoa.

O que é recompra. Um novo pedido da mesma pessoa, em outro dia, até 180 dias depois da primeira compra. Pedido no mesmo dia não conta: 789 avaliações cobriam mais de um pedido e 94,80% delas juntavam pedidos do mesmo dia, ou seja, uma compra só, dividida. A janela de 180 dias cobre 76,04% das voltas, contra 55,61% com 90 dias.

Que meses comparar. As pontas da base estão quase vazias (setembro de 2016 tem 4 pedidos). De janeiro de 2017 a agosto de 2018 ficam 99.092 dos 99.441 pedidos (99,65%), em meses comparáveis.

A armadilha das junções. Juntar pedidos, itens e avaliações direto levava a base de 99.441 para 114.092 linhas (14,73% a mais): pedido com vários itens contaria várias vezes. O plano foi agregar cada tabela por pedido antes de juntar.

Cinco hipóteses, cada uma com teste e KPI escolhidos antes: o atraso (H1), a nota baixa (H2), o peso do frete (H3), o estado (H4) e se o atraso afasta o cliente por derrubar a nota (H5). Preço e frete são assimétricos (preço médio de R$ 120,65 contra mediana de R$ 74,99), então o plano já previa medianas e testes que não supõem distribuição normal.

O revisor aprovou a decomposição e deixou sete pontos para a implementação, como corrigir o fim do período útil para 31/08/2018. O notebook final registra o que fiz com cada um.

Os dados

Na implementação, os 99.441 pedidos viraram 96.096 pessoas. Para todo mundo ter os mesmos 180 dias para voltar, montei uma coorte só com quem fez a primeira compra entre 01/01/2017 e 04/03/2018: 58.139 pessoas. Dessas, só 1.167 voltaram (2,01%), a taxa de referência do projeto inteiro.

  • Agreguei itens e avaliações por pedido antes de cada junção e conferi a cada passo que nenhuma linha se multiplicou: a base final tem 58.139 linhas e 58.139 pessoas.
  • 3.955 das 56.154 primeiras compras entregues com data chegaram atrasadas (7,04%).
  • Estados com menos de 5% dos pedidos entraram juntos em "outros", para a taxa não ficar instável.

Método, e por que este método

A resposta é binária (voltou ou não), então usei o teste z de duas proporções, com o qui-quadrado primeiro quando havia mais de dois grupos e a correção de Holm nas comparações múltiplas. Para o frete, que é assimétrico, usei o Mann-Whitney. Fixei o ALFA em 5% antes de rodar qualquer teste e, além do p-valor, mostrei o intervalo de 95% da diferença e a menor diferença que cada teste consegue ver com 80% de poder: com 2% de recompra, um "não há diferença" pode ser só falta de tamanho.

Por fim, refiz H1 e H2 com janelas de 90 e 365 dias e sem quem fez vários pedidos no primeiro dia, e traduzi os efeitos em pessoas, porque ponto percentual sozinho esconde o tamanho real.

Achados

O atraso derruba a nota. Com atraso na primeira entrega, 75,63% das notas ficam entre 1 e 3, contra 18,17% no prazo (z = 82,95). É o resultado mais forte do projeto, e é o que o gráfico acima mostra.

Quem dá nota 1 volta menos. A recompra muda com a nota (qui-quadrado, p = 0,0291), e a diferença está na nota 1: 1,68% contra 2,10% da nota alta, com p de Holm 0,0398. A nota de 2 e 3 não se diferencia.

O atraso pesa, mas no limite. Quem teve atraso volta 1,57%, contra 2,05% no prazo (p = 0,0389, intervalo de −0,88 a −0,07 p.p.). A direção se mantém nas janelas de 90 e 365 dias, mas a significância não, então trato a H1 como um sinal e não como uma certeza. Com a nota igual, nenhum teste passa: os dados não têm tamanho para dizer se o atraso afasta o cliente só pela nota (H5).

O frete não separa quem volta, e o estado separa pouco. A mediana do peso do frete é 0,223 nos dois grupos (Mann-Whitney, p = 0,3747). Por estado, só SP fica acima do resto da coorte (2,25%) e "outros" abaixo (1,74%).

Em pessoas, o efeito é pequeno. Se quem teve atraso voltasse na taxa de quem recebeu no prazo, seriam cerca de 19 pessoas a mais em 180 dias (entre 3 e 35 pelo intervalo), 1,62% das 1.167 recompras.

A decisão que habilita

Entregar no prazo na primeira compra, mas pelo motivo certo: o ganho direto em recompra é pequeno, e o argumento forte é a experiência do cliente, que vê a nota ir de 18% para 76% de 1 a 3 com o atraso. Agir logo em quem dá nota 1, o grupo que o teste confirmou que volta menos. Abrir o grupo "outros" antes de investir por região, porque ele mistura estados diferentes. Não contar com cupom de frete para trazer o cliente de volta. E acompanhar dois KPIs de alerta, a taxa de atraso da primeira compra (7,04%) e a proporção de nota 1 (12,22%), repetindo a análise com mais meses de dados.

Os dados são observacionais: mostram o que anda junto com a recompra, não o que a causa. A entrega incluiu um dashboard no Tableau Public, que lê os mesmos números do notebook, e uma apresentação no formato CAR para quem decide. A decomposição e a implementação foram aprovadas pelo revisor da TripleTen, e com a sprint concluí o programa.

Links

Dashboard interativo no Tableau Public · Repositório · Parte 2: teste A/B e SQL