Projetos
Machine Learning · Recomendação · Desenvolvimento

Recomendação de Produtos — Como foi feito (explicado fácil)

Lembra do "Quem comprou isso também comprou…" da Amazon? É um modelo olhando milhões de carrinhos e aprendendo: quem leva âncora geralmente leva corda. Aqui fiz isso pro varejo náutico — cross-sell que vende sozinho.

Nível Intermediário Stack Python · Pandas · mlxtend (Apriori) Tipo Projeto técnico
Visão geral

O que é isso, em uma frase?

É um sistema que olha o histórico de carrinhos da LH Nautical e descobre combinações que vendem juntas. Quando alguém adiciona um produto ao carrinho, ele sugere os 2-3 que mais combinam com aquele — baseado no que outros clientes realmente compraram juntos.

Não tem IA fina nem rede neural. É um algoritmo clássico — Apriori (regras de associação) — que funciona desde os anos 90 porque resolve bem o problema: "se compra A, qual a chance de comprar B?".

Por que importa? Ticket médio sobe sem aumentar tráfego. Cliente já tá ali, só falta mostrar o item que ele provavelmente queria mas não lembrou. É a fila do mercado: o chiclete na altura do olho não tá ali por acaso.

Passo a passo

Como descobrir o que vende com o quê

1 · Montar os "carrinhos". Pego o histórico de pedidos e agrupo por order_id. Cada linha vira uma cesta — a lista de produtos comprados juntos naquele pedido.

import pandas as pd

cestas = (
    df.groupby("order_id")["produto"]
      .apply(list)
      .reset_index(name="itens")
)
# order_id  itens
# 001       [Âncora 6kg, Corda 10m, Mosquetão]
# 002       [Bóia, Salva-vidas]

2 · Transformar em "matriz de presença". O algoritmo precisa de uma tabela onde cada linha é um pedido e cada coluna é um produto: 1 se o item está, 0 se não está. É como uma planilha gigante de "0/1".

from mlxtend.preprocessing import TransactionEncoder

te = TransactionEncoder()
matriz = te.fit_transform(cestas["itens"])
df_bin = pd.DataFrame(matriz, columns=te.columns_).astype(int)
# pedido   ancora_6kg  corda_10m  mosquetao  boia ...
#   001         1          1          1       0
#   002         0          0          0       1

3 · Rodar o Apriori — achar combinações frequentes. O algoritmo varre a matriz e devolve os itemsets que aparecem em pelo menos X% dos pedidos (chamado suporte mínimo). Quem aparece pouco é cortado — não compensa recomendar coisa que ninguém compra.

from mlxtend.frequent_patterns import apriori

frequentes = apriori(
    df_bin,
    min_support=0.01,   # combinação aparece em >=1% dos pedidos
    use_colnames=True
)
# {Âncora, Corda} → suporte 3,2%
# {Bóia, Salva-vidas} → suporte 2,1%

4 · Gerar regras de associação com confidence e lift. Daí saem regras do tipo "quem compra âncora, leva corda" — mas com 3 números que dizem se vale a pena:

  • Support — em quantos % dos pedidos a regra aparece
  • Confidence — dos que compraram âncora, % que também levou corda
  • Lift — quantas vezes mais provável alguém comprar corda tendo comprado âncora vs. comprar corda aleatoriamente. Lift > 1 = associação real.
from mlxtend.frequent_patterns import association_rules

regras = association_rules(
    frequentes,
    metric="lift",
    min_threshold=1.5   # só regras 1,5x mais prováveis que aleatório
)
top = regras.sort_values("lift", ascending=False).head(10)
regra (exemplo)lift
Âncora → Corda4,2×
Salva-vidas → Bóia3,8×
Lanterna → Pilha3,1×

(números ilustrativos do dataset LH Nautical — os valores reais saem do notebook.)

5 · Usar no checkout. Quando um produto entra no carrinho, busco as regras onde ele é "antecedente" e pego os 3 consequentes com maior lift. Aparece como "Frequentemente comprados juntos".

Resultado

As combinações que mais aparecem

O que dá pra levar daqui

Em uma linha: o que esse projeto ensina

Que nem todo problema precisa de IA pesada. Apriori é simples, interpretável (cada regra é uma frase) e roda em segundos. Para cross-sell num catálogo médio, é mais robusto que rede neural — e o time comercial entende o porquê de cada sugestão.

Coisas técnicas que apareceram aqui: Market Basket Analysis, Apriori, suporte / confidence / lift, transação binária com TransactionEncoder, regras de associação, escolha de thresholds, biblioteca mlxtend.