library(arules)
library(dplyr)
data(Groceries)6 Estratégias de Cross-Selling em Mercado
Como os supermercados e e-commerces decidem o layout das gôndolas ou as recomendações de “compre junto”? Vamos utilizar o algoritmo Apriori para minerar associações e entender o trade-off entre volume e especificidade. Em um mar de milhares de regras, como identificar aquelas que são estatisticamente robustas e comercialmente relevantes?
Terminologia de Regras de Associação
Ao trabalhar com arules, nosso foco está em três métricas que definem a qualidade da nossa “entrega”:
- Antecedente (\(X\)): O produto que já está no carrinho do cliente.
- Consequente (\(Y\)): O produto que queremos oferecer (o “próximo passo”).
- Suporte: Qual a penetração dessa combinação no faturamento total? (É um nicho ou é massa?)
- Confiança: Se o cliente comprou \(X\), qual a probabilidade real de ele aceitar \(Y\)?
- Lift: O quanto a oferta de \(X\) impulsiona \(Y\) para além da venda natural do produto?
6.1 O cenário e os dados
Vamos analisar o dataset Groceries. Imagine que você é o Category Manager de uma rede de supermercados e precisa decidir quais produtos colocar em promoção conjunta.
Diferente de modelos de regressão, aqui trabalhamos com objetos de classe transactions (matrizes esparsas), otimizados para grandes volumes de itens.
Diagnóstico da Operação
Antes de rodar o algoritmo, precisamos entender o comportamento da base:
summary(Groceries)transactions as itemMatrix in sparse format with
9835 rows (elements/itemsets/transactions) and
169 columns (items) and a density of 0.02609146
most frequent items:
whole milk other vegetables rolls/buns soda
2513 1903 1809 1715
yogurt (Other)
1372 34055
element (itemset/transaction) length distribution:
sizes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2159 1643 1299 1005 855 645 545 438 350 246 182 117 78 77 55 46
17 18 19 20 21 22 23 24 26 27 28 29 32
29 14 14 9 11 4 6 1 1 1 1 3 1
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 2.000 3.000 4.409 6.000 32.000
includes extended item information - examples:
labels level2 level1
1 frankfurter sausage meat and sausage
2 sausage sausage meat and sausage
3 liver loaf sausage meat and sausage
Note que, com 9.835 transações registradas e 169 itens distintos, podemos observar uma densidade de aproximadamente 0.026, indicando que o conjunto de dados é relativamente esparsamente povoado. Além disso, os itens mais frequentemente comprados incluem leite integral, vegetais diversos, pães, refrigerantes e iogurte, com quantidades significativamente maiores em comparação com outros itens. Também, a distribuição do comprimento dos itens mostra que a maioria das transações contém entre 1 e 6 itens, com uma mediana de 3 itens por transação. Isso sugere que os clientes geralmente compram um pequeno número de itens por vez.
Vender leite é fácil (alta frequência). O lucro real está em descobrir quais itens de nicho “puxam” outros itens de maior margem.
6.2 O algoritmo apriori
O algoritmo Apriori é um método popular para mineração de regras de associação em conjuntos de dados. Ele opera em duas etapas principais: primeiro, identifica todos os conjuntos de itens frequentes, ou seja, aqueles que aparecem com uma frequência maior que um limite pré-definido (suporte mínimo). Em seguida, com base nesses conjuntos frequentes, gera regras de associação, que são implicações do tipo “se \(X\), então \(Y\)”, onde \(X\) e \(Y\) são conjuntos de itens, calculando medidas como confiança e lift para avaliar a força das associações entre os itens.
A confiança de uma regra é a probabilidade condicional de que um item (ou conjunto de itens) \(Y\) seja comprado, dado que o item (ou conjunto de itens) \(X\) também foi comprado. Em outras palavras, é a proporção de transações que contêm tanto \(X\) quanto \(Y\), em relação ao número de transações que contêm \(X\). Uma alta confiança indica que o item \(Y\) é frequentemente comprado quando o item \(X\) é comprado, o que sugere uma forte associação entre eles.
O lift de uma regra é uma medida de quão mais frequentemente \(X\) e \(Y\) ocorrem juntos do que seria esperado se fossem independentes. Em termos simples, o lift é a razão entre a confiança da regra e a frequência absoluta de \(Y\). Um lift maior que 1 indica que a regra tem uma associação positiva (os itens ocorrem juntos com mais frequência do que o esperado ao acaso), enquanto um lift menor que 1 indica uma associação negativa (os itens ocorrem juntos com menos frequência do que o esperado ao acaso).
Não queremos todas as regras possíveis (seriam milhões). Precisamos filtrar aquelas que têm relevância estatística e potencial de negócio.
# Gerando regras: Queremos algo que aconteça em pelo menos 0.1% das vendas
# e que tenha pelo menos 80% de chance de acontecer (Confiança)
rules <- apriori(Groceries, parameter = list(sup = 0.001, conf = 0.8))Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen
0.8 0.1 1 none FALSE TRUE 5 0.001 1
maxlen target ext
10 rules TRUE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1 TRUE TRUE FALSE TRUE 2 TRUE
Absolute minimum support count: 9
set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [157 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 6 done [0.01s].
writing ... [410 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
O código abaixo exibe os cinco primeiros conjuntos de regras de associação descobertos pelo algoritmo Apriori. Ele mostra as associações entre os itens, juntamente com suas medidas de suporte, confiança e lift.
inspect(rules[1:5]) lhs rhs support confidence
[1] {liquor, red/blush wine} => {bottled beer} 0.001931876 0.9047619
[2] {curd, cereals} => {whole milk} 0.001016777 0.9090909
[3] {yogurt, cereals} => {whole milk} 0.001728521 0.8095238
[4] {butter, jam} => {whole milk} 0.001016777 0.8333333
[5] {soups, bottled beer} => {whole milk} 0.001118454 0.9166667
coverage lift count
[1] 0.002135231 11.235269 19
[2] 0.001118454 3.557863 10
[3] 0.002135231 3.168192 17
[4] 0.001220132 3.261374 10
[5] 0.001220132 3.587512 11
Cada regra é apresentada acima com os itens à esquerda (lhs) e os itens à direita (rhs), indicando a associação entre eles. A coluna “support” indica a frequência relativa da ocorrência da regra no conjunto de dados, enquanto a coluna “confidence” mostra a probabilidade condicional de que os itens à direita da regra sejam comprados, dado que os itens à esquerda foram comprados. O “lift” é uma medida da força da associação entre os itens, indicando quantas vezes mais provável é a compra dos itens à direita da regra em comparação com sua compra independente.
6.3 Visualizando o Dilema: Confiança vs. Lift
No negócio, existe um trade-off:
Regras de Alta Confiança: São óbvias (ex: quem compra pão, compra manteiga). O risco de errar é baixo, mas o valor agregado da sugestão também pode ser baixo.
Regras de Alto Lift: São as “minas de ouro”. Elas mostram associações surpreendentes que a intuição humana geralmente não percebe.
Top 5: As Regras “Certeiras” (Alta Confiança)
No código abaixo, estamos extraindo as cinco primeiras regras com base na confiança mais alta. Isso nos permite identificar as associações mais fortes entre os itens, onde a confiança é uma medida da probabilidade de que o item B seja comprado quando o item A é comprado. Todas as cinco regras apresentam uma confiança de 100%, o que indica que sempre que os itens à esquerda da regra são comprados, os itens à direita também são comprados. Isso sugere que essas combinações de itens são altamente associadas no conjunto de dados.
inspect(head(rules, n = 5, by = "confidence")) lhs rhs support confidence coverage lift count
[1] {rice,
sugar} => {whole milk} 0.001220132 1 0.001220132 3.913649 12
[2] {canned fish,
hygiene articles} => {whole milk} 0.001118454 1 0.001118454 3.913649 11
[3] {root vegetables,
butter,
rice} => {whole milk} 0.001016777 1 0.001016777 3.913649 10
[4] {root vegetables,
whipped/sour cream,
flour} => {whole milk} 0.001728521 1 0.001728521 3.913649 17
[5] {butter,
soft cheese,
domestic eggs} => {whole milk} 0.001016777 1 0.001016777 3.913649 10
Note que o whole milk aparece em quase todos os consequentes. Faz sentido gastar verba de marketing recomendando leite para quem já está comprando itens de café da manhã? Provavelmente não, ele já levaria o leite de qualquer forma.
Top 5: As Regras de “Impulso” (Alto Lift)
Agora, vamos extrair as cinco primeiras regras com base no lift mais alto. Ele nos diz quantas vezes o item B é mais provável de ser comprado quando o item A é comprado do que se eles fossem comprados independentemente.
inspect(head(rules, n = 5, by = "lift")) lhs rhs support confidence coverage lift count
[1] {liquor,
red/blush wine} => {bottled beer} 0.001931876 0.9047619 0.002135231 11.235269 19
[2] {citrus fruit,
other vegetables,
soda,
fruit/vegetable juice} => {root vegetables} 0.001016777 0.9090909 0.001118454 8.340400 10
[3] {tropical fruit,
other vegetables,
whole milk,
yogurt,
oil} => {root vegetables} 0.001016777 0.9090909 0.001118454 8.340400 10
[4] {citrus fruit,
grapes,
fruit/vegetable juice} => {tropical fruit} 0.001118454 0.8461538 0.001321810 8.063879 11
[5] {other vegetables,
whole milk,
yogurt,
rice} => {root vegetables} 0.001321810 0.8666667 0.001525165 7.951182 13
Aqui o cenário muda. O Lift de 11.24 para a regra {liquor, red/blush wine} => {bottled beer} indica uma oportunidade de cross-selling fortíssima que não é óbvia para quem olha apenas o volume de vendas isolado.
A segunda regra mostra que a compra de “citrus fruit”, “other vegetables”, “soda” e “fruit/vegetable juice” está 8.34 vezes mais associada à compra de “root vegetables” do que se fosse uma compra independente. E assim, sucessivamente.
6.4 Aplicação Prática: “Operação Cerveja”
Imagine que o estoque de bottled beer está alto. Onde devemos atuar?
# Filtrando regras onde a cerveja é o alvo
regras_cerveja <- subset(rules, subset = rhs %in% "bottled beer")
inspect(sort(regras_cerveja, by = "lift")) lhs rhs support confidence
[1] {liquor, red/blush wine} => {bottled beer} 0.001931876 0.9047619
coverage lift count
[1] 0.002135231 11.23527 19
Identificamos que clientes que compram licor e vinhos têm uma probabilidade de 90.4% de comprar cerveja de garrafa (um comportamento de “abastecimento de adega”). Portanto, uma ação recomendada seria: Em vez de dar desconto na cerveja para todo o mercado, crie um cupom de desconto em cervejas artesanais impresso no verso da nota fiscal apenas para quem comprar vinhos ou licores.
6.5 Conclusão
A análise de regras de associação através do algoritmo apriori nos permite compreender melhor o comportamento do consumidor e tomar decisões informadas para otimizar as estratégias de marketing.
A análise de associação nos permite compreender melhor o comportamento do consumidor. Entretanto, pode servir também para provocar novos comportamentos nos clientes:
Suporte Baixo + Lift Alto: Oportunidade de criar novos hábitos em nichos rentáveis.
Suporte Alto + Confiança Alta: Itens “âncora”. Não precisam de promoção, mas devem estar localizados no fundo da loja para o cliente percorrer outros corredores.