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.

library(arules)
library(dplyr)

data(Groceries)

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.

DicaO Desafio

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
DicaImpactos práticos

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.