Segmentando Clientes
Na MAPI empresa que trabalhei, tive a oportunidade de transitar em diversos atividades, começando por criar um produto para favorabilidade de empreedimentos residencial, tratamento de qualidade de dados, aprimoramento na captura de dados nos scripts de scraping. Por último estava no setor de marketing, criando um ebook da retrospectiva do mercado imobiliário em 2019. A área de marketing me interessou bastante, logo comecei a fazer os cursos da hubspot, para me aprimorar nas terminologias e funções.
No momento estou participando de discussões semanais dos notebooks no kaggle, selecionados por mais três amigos e colegas de profissão. Ao selectionar o notebook de análise de dados da olist me chamou atenção a prática de uma metodologia RFM para categorização de clientes.
O post tem o interesse de esclarecer a metodologia RFM para segmentação de clientes, uma revisão crítica sobre possibilidades estatísticas, funil de processos nas empresas, potenciais desdobramentos de análise.
Antes de mais nada, a olist conecta micro empreendedores de todo o Brasil para canais de vendas sem excesso de burocracia com apenas um único contrato. Esses vendedores estão habilitados para vender seus produtos por meio do Olist Store e entregar os produtos para os clientes usando os parceiros de logística do Olist. Para saber mais acesse o site
Os dados utilizados aqui no estudo, estão disponíveis no kaggle. Baixei todos os datasets disponiveís e importei para um sql local! As variáveis de cliente e vendedores estão representados por códigos por questões de sigilo. A base de dados contém informaçães de 100 mil pedidos entre 2016 e 2018 realizado por vários marketplaces no brasil. As características permitem analisar os pedidos em diversas camadas: Status do pedidos, preço, pagamento e performance do frete dado a localização do cliente. Os atributos de produto e as avaliaçãoes escritas pelos clientes.
Metodologia RFM
A metodologia RFM analisa o comportamento do cliente examinando por meio do histórico das transações, levando em consideração os seguintes critérios:
- Quão recente o cliente realizou a compra (Recency)
- Quão frequente o cliente compra (Frequency)
- Quanto o clientegastou (Monetary)
A metodologia ajuda a identificar clientes mais prováveis a responder promoções segmentado em diversas categorias. Essas categorias podem ser criadas de acordo com a regra de negócio da empresa.
O workflow de análise é precedido por coletar dados das transações do cliente. No caso do e-commerce é a realização da compra, sendo assim necessário:
- Dados: uma tabela com a identificação única dos clientes, com a informação da data da compra e o valor do produto.
- RFM tabela: é agregada a informação por cliente calculando a data da última compra, quantas compras foram feitas e o total gasto.
- RFM Score: Cada dimensão do RFM de cada cliente recebe um score de acordo com um critério intervalar adotado.
- Segmentos: A partir dos scores de cada dimensão é criado regras de negócios para caracterízação do cliente.
Dados
olist_clean %>% # Dataset estudo
head() %>%
kableExtra::kable(digits = 0)
customer_unique_id | order_date | revenue |
---|---|---|
3818d81c6709e39d06b2738a8d3a2474 | 2018-01-14 | 199 |
107e6259485efac66428a56f10801f4f | 2018-03-24 | 60 |
b32ff8caad5902c55fa167e7dc77cc69 | 2018-03-26 | 82 |
fbe6316a06058c651539cbf59ec5a0ef | 2017-05-18 | 103 |
fbe6316a06058c651539cbf59ec5a0ef | 2017-05-18 | 206 |
770c43f54c33cbf4bc49b7f2d6576891 | 2018-02-21 | 85 |
RFM tabela
Para calcular a diferença de dias da última transação do cliente é necessário definir uma data de referência. A data de referência que vou adotar é a data do cliente mais recente na base no caso 03/09/2018. O cálculo das métricas é bem simples, simplesmente a contagem de compras realizadas pelo cliente e total gasto nas compras.
date_analyse <- max(olist_clean$order_date); date_analyse
## [1] "2018-09-03"
rfm_table <-
rfm::rfm_table_order(data = olist_clean,
customer_id = customer_unique_id,
order_date = order_date,
revenue = revenue,
analysis_date = date_analyse)
customer_id | date_most_recent | recency_days | transaction_count |
---|---|---|---|
0000366f3b9a7992bf8c76cfdf3221e2 | 2018-05-10 | 116 | 1 |
0000b849f77a49e4a4ce2b2a4ca5be3f | 2018-05-07 | 119 | 1 |
0000f46a3911fa3c0805444483337064 | 2017-03-10 | 542 | 1 |
0000f6ccb0745a6a4b88665a16c9f078 | 2017-10-12 | 326 | 1 |
0004aac84e0df4da2b147fca70cf8255 | 2017-11-14 | 293 | 1 |
0004bd2a26a76fe21f786e4fbd80607f | 2018-04-05 | 151 | 1 |
Explorando cada atributo dos indicadores, todos são bem assimétricos a direita, exceto a diferença de dias um pouco menos. A maioria dos clientes fez 1 compra, e houve a até clientes que realizou 24 compras. Cerca de 80% dos clientes gastaram até 174 reais. Em média o tempo da última compra foi realizada a 8
RFM SCORE
O score de cada atributo é definido pelo critério de bins. O score recebe um valor de 1 a frequency_bin
. O bins é uma segmentação quantílica univariada, ou seja no caso, estamos compactando a variável na escala original para transformar em grupos de a 1 a 5.
rfm_score <-
rfm::rfm_table_order(data = olist_clean,
customer_id = customer_unique_id,
order_date = order_date,
revenue = revenue,
analysis_date = date_analyse,
frequency_bins = 5) # Definição de quantos grupos faremos
customer_id | recency_score | frequency_score | monetary_score | rfm_score |
---|---|---|---|---|
0000366f3b9a7992bf8c76cfdf3221e2 | 4 | 1 | 4 | 414 |
0000b849f77a49e4a4ce2b2a4ca5be3f | 4 | 1 | 1 | 411 |
0000f46a3911fa3c0805444483337064 | 1 | 1 | 2 | 112 |
0000f6ccb0745a6a4b88665a16c9f078 | 2 | 1 | 1 | 211 |
0004aac84e0df4da2b147fca70cf8255 | 2 | 1 | 4 | 214 |
0004bd2a26a76fe21f786e4fbd80607f | 4 | 1 | 4 | 414 |
O resultado de cada um indicador é calculado por quantis univariados. Manualmente abaixo disponho da tabela que referencia os valores de acordo o grupo. Por se tratar de variáveis com interpretações diferentes, quanto mais recente a compra maior o peso do grupo, em contrapartida o valor e a frequência quanto maior melhor. A tabela referencia cada grupo de resultado para cada score, repare que o indicador de level_frequency
só existem dois devido a dominância do grupo com 1 compra por cliente.
level_amount <- gtools::quantcut(rfm_score$rfm$amount, q = 5) %>% levels()
level_recency <- gtools::quantcut(rfm_score$rfm$recency_days, q = 5) %>% levels() %>% rev()
level_frequency <- gtools::quantcut(rfm_score$rfm$transaction_count, q = 5) %>% levels()
level_amount | level_recency | level_frequency | grupo_rfm_score |
---|---|---|---|
[0.85,39.9] | (389,729] | 1 | 1 |
(39.9,69.9] | (273,389] | 2 | |
(69.9,115] | (182,273] | 3 | |
(115,197] | (98,182] | 4 | |
(197,6.05e+04] | [0,98] | (1,24] | 5 |
O score no final das contas é baseado na seguinte cálculo:
RFM Score = recency_score
* 100 + frequency_score
* 10 + monetary_score
Tratar o resultado do score como contínuo não é recomendado pois o score é uma variável com valores pré-definidos pela quantidade de bins. Pelo histograma essa ideia fica mais nítida, o score não é continuamente presente entre 111 a 555. Repare nos espaços em branco entre as barras.
Segmentos
Dessa forma, estamos interessados em rotular os resultados de acordos os scores, esta parte do método torna flexível para criar regras de negócio de acordo com a corporação. No caso vou utilizar os rótulos da vinheta do pacote rfm, apenas traduzi os segmentos.
rfm_set <- priori_rfm() # Função que envelopa
rfm_set$table_segments %>%
knitr::kable(align = "c")
Segment | Description | R | F | M |
---|---|---|---|---|
Campeão | Compra recentemente, compra frequentemente e gasta muito | 4 - 5 | 4 - 5 | 4 - 5 |
Consumidor Leal | Gasta uma quantidade rasoável. Resposível para promoções | 2 - 5 | 3 - 5 | 3 - 5 |
Potencial Leal | Cliente recente, Gasta uma quantidade razoável, compra mais de uma vez | 3 - 5 | 1 - 3 | 1 - 3 |
Novos clientes | Comprou mais recentemente, mas não frequentemente | 4 - 5 | <= 1 | <= 1 |
Promissor | Compra recente, mas não gasta muito | 3 - 4 | <= 1 | <= 1 |
Precisa de Atenção | Acima da média em compras recentes, frequentes e valor | 2 - 3 | 2 - 3 | 2 - 3 |
Prestes a hibernar | Abaixo da média, em compras recentes, frequentes e valor | 2 - 3 | <= 2 | <= 2 |
Em risco | Gasta um bom dinheiro, compra frequentemente mas faz tempo que comprou | <= 2 | 2 - 5 | 2 - 5 |
Não pode perder | Gasta muito dinheiro, compra frequentemente mas faz um bom tempo que comprou | <= 1 | 4 - 5 | 4 - 5 |
Perdido | Gastam poucos, pouca frequência, e faz tempo que não compra | 1 - 2 | 1 - 2 | 1 - 2 |
segments_olist <-
rfm::rfm_segment(
rfm_score,
rfm_set$segment,
rfm_set$recency_lower, rfm_set$recency_upper,
rfm_set$frequency_lower, rfm_set$frequency_upper,
rfm_set$monetary_lower, rfm_set$monetary_upper)
Ao considerar a segmentação dos grupos, não há validade na classificação do Precisa de Atenção
e Prestes a Hibernar
, pois univariadamente a distribuição dos indicadores não possuem uma distribuição simétrica. OS dois gráficos abaixo relacionam a quantidade de clientes em cada grupo. Os grupos de lealdade e inatividade podem ser usados para comparação da jornada do cliente, para que possa explicar os motivos dos clientes perdidos. Curiosamente não há nenhum cliente como campeão, muito em função porque os dados que usei são de temáticas diferentes e consequetemente tem necessidades de compras e preços diferentes.
Além de disso podemos usar a informação para avaliar o tratamento que cada empresa tem sob o cliente ou o quanto se preocupa. Agora é uma análise inversa:
customer_id | seller_id | segment |
---|---|---|
de44ecdecadfbd5d7c4943889af1c915 | fc906263ca5083d09dce42fe02247800 | Lost |
40f3ad678e7faf0682800ca130302eb9 | fc906263ca5083d09dce42fe02247800 | Lost |
6ce08c3a8b69a46f5bd4f0acd2fa75da | fc906263ca5083d09dce42fe02247800 | Lost |
c8c4e5f83e41a1c32b287793785cf3f7 | fc906263ca5083d09dce42fe02247800 | Lost |
6b9b119304bd30a72e528d9288127022 | fc906263ca5083d09dce42fe02247800 | Lost |
f5de50704f1a1c6df7f9c6912c9a3678 | fc906263ca5083d09dce42fe02247800 | Lost |
Apresento a seguir a lista de empresa que mais foi rotulada com clientes perdidos proporcionalmente.
seller_id | segment | perc | n_seller |
---|---|---|---|
fc906263ca5083d09dce42fe02247800 | Lost | 84.87395 | 119 |
f4aba7c0bca51484c30ab7bdc34bcdd1 | Lost | 82.05128 | 117 |
3504c0cb71d7fa48d967e0e4c94d59d9 | Lost | 81.13208 | 53 |
cce6ab8d1682639fe45ab70234f1665f | Lost | 78.78788 | 66 |
9616352088dcf83a7c06637f4ebf1c80 | Lost | 68.36735 | 98 |
827f8f69dfa529c561901c4f2e0f332f | Lost | 67.30769 | 104 |
Das 116 compras realizadas na empresa fc906263ca5083d09dce42fe02247800
84 % dos clientes dificilmente vão retornar a comprar, quase 100 clientes dos 119 que compraram.
O resultado do rfm por empresa pode ser um novo serviço da olist: enviar qual o posicionamento da empresa perante os clientes dado a concorrência, ou seja quais empresas precisam rever ou se capacitar para o tratamento e acompanhamento do cliente. Por outro lado, a empresa que vende seus produtos no e-commerce poderia usar a segmentação do rfm para realizar testes a/b estraficada, com promoções, avisos de produtos. A segmentação dos grupos também poderia ser usada como fator de explicação, para o grau de dificuldade da jornada do cliente ou tempo de frente.
Resumo
A metodologia rfm é uma análise rápida e simples do comportamento dos clientes. O score não possue muita validade, mas sim as classificações de acordo com a regra de negócio da empresa, porém é necessário tomar cuidado com as descrições de cada grupo, pois no caso Prestes a hibernar
e Precisa de Atenção
não possuem validade, já que as distribuições dos indicadores são assimétricas. Como melhoria de análise seria melhor realizar o rfm para cada temática de produto, não ficando refem a valores extremos. Como resultado, é possível avaliar o cliente nas diversas categorias de produto e saber as suas preferências. Por fim, é de total estratégia realizar métricas períódicas com esta metodologia para acompanhamento de clientes na empresa.