Todos os clientes de uma marca possuem um desejo em comum, afinal isso que faz todos tomarem a mesma decisão de compra.
Mas você já parou pra pensar no quão diferentes esses clientes podem ser?
Alguns produtos atingem nichos mais específicos, por exemplo: marca de skate, cursos de programação ou carros esportivos.
Já outros são extremamente abrangentes, como uma marca de tênis ou de paste de dente.
Mas, em cada um deles, o cliente final é uma pessoa que ficará mais satisfeita a medida que for tratada de forma mais individual.
E, claro, a satisfação do cliente se traduz em maior faturamento para uma empresa a médio e longo prazo.
Além disso, existem dois riscos para uma empresa quando ela vai oferecer um produto:
Oferecer excessivamente para um público que não precisa ou não tem interesse em comprar.
Não oferecer o produto para um público que precisa e estaria disposto a comprar.
No primeiro caso, a empresa pode prejudicar a sua imagem sendo insistente, por exemplo.
Já no segundo caso, ela está perdendo dinheiro e deixando de atender clientes que precisam e gostariam de adquirir seus produtos.
E é exatamente sobre esse dois pontos que a nossa análise vai tratar.
Mais especificamente na venda para clientes que já compraram da empresa.
O nosso case trará dados reais de uma empresa de varejo do Reino Unido durante 1 ano de vendas.
Os clientes serão segmentados de acordo com a técnica RFM, baseada em 3 variáveis:
Há quanto tempo foi a última compra - R (Recency)
Frequência de compras - F (Frequency)
Valor gasto - M (Monetary Value)
A técnica RFM tem como objetivo principal classificar os clientes, levando em conta os três fatores citados - Tempo da última compra, Frequência e Valor gasto.
Então, o melhor cliente possível é aquele que comprou recentemente, está sempre comprando e faz compras com valores elevados.
Como o RFM pode ser usado para aumentar as vendas de uma empresa?
As empresas usam a técnica para fidelizar ainda mais clientes assíduos da marca, os recompensando com benefícios exclusivos.
Por outro lado, os clientes que já não compram há algum tempo podem ser resgatados com uma campanha de marketing específica. Antes que acabem fidelizando à marca concorrente.
A técnica RFM irá classificar os clientes em relação aos 3 fatores aqui falados. Então, vamos colocar a mão na massa!
O projeto original e os dados utilizados podem ser encontrados clicando aqui.
library(data.table)
library(dplyr)
library(ggplot2)
library(tidyr)
library(knitr)
Os dados possuem registros de 541.909 compras durante o período de um ano no e-commerce de uma empresa Britânica.
As principais variáveis que vamos utilizar na análise são: id do cliente, data da compra e valor da compra.
df_data <- fread('data_segmentacao.csv')
glimpse(df_data)
## Rows: 541,909
## Columns: 8
## $ InvoiceNo <chr> "536365", "536365", "536365", "536365", "536365", "5363...
## $ StockCode <chr> "85123A", "71053", "84406B", "84029G", "84029E", "22752...
## $ Description <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL LANT...
## $ Quantity <int> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2, 3, ...
## $ InvoiceDate <chr> "12/1/2010 8:26", "12/1/2010 8:26", "12/1/2010 8:26", "...
## $ UnitPrice <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1.85, 1...
## $ CustomerID <int> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850,...
## $ Country <chr> "United Kingdom", "United Kingdom", "United Kingdom", "...
Caso tenha valores discrepantes que não façam sentido, iremos substituir por NA (not available).
df_data <- df_data %>%
mutate(Quantity = replace(Quantity, Quantity<=0, NA),
UnitPrice = replace(UnitPrice, UnitPrice<=0, NA))
df_data <- df_data %>%
drop_na()
Ajustando as variáveis para fazer a nossa análise.
df_data <- df_data %>%
mutate(InvoiceNo=as.factor(InvoiceNo), StockCode=as.factor(StockCode),
InvoiceDate=as.Date(InvoiceDate, '%m/%d/%Y %H:%M'), CustomerID=as.factor(CustomerID),
Country=as.factor(Country))
df_data <- df_data %>%
mutate(total_dolar = Quantity*UnitPrice)
glimpse(df_data)
## Rows: 397,884
## Columns: 9
## $ InvoiceNo <fct> 536365, 536365, 536365, 536365, 536365, 536365, 536365,...
## $ StockCode <fct> 85123A, 71053, 84406B, 84029G, 84029E, 22752, 21730, 22...
## $ Description <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL LANT...
## $ Quantity <int> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2, 3, ...
## $ InvoiceDate <date> 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-01, 2010-1...
## $ UnitPrice <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1.85, 1...
## $ CustomerID <fct> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850,...
## $ Country <fct> United Kingdom, United Kingdom, United Kingdom, United ...
## $ total_dolar <dbl> 15.30, 20.34, 22.00, 20.34, 20.34, 15.30, 25.50, 11.10,...
Primeiramente, vamos separar os cálculos pelo ID do cliente, já que toda a análise gira em torno do próprio consumidor.
A recência será calculada como a distância entre o dia mais recente do banco de dados e a última compra do cliente. Neste caso, o banco de dados mostra as compras até 1º de janeiro de 2012. Então a recência será o valor de dias que se passaram da última compra do cliente até o dia 01/01/2012.
A frequência é calculada pelo número de notas fiscais geradas para cada cliente.
O valor gasto é calculado pelo total gasto em todas as compras, dividido pela quantidade de compras. Ou seja, é o gasto médio do consumidor.
df_RFM <- df_data %>%
group_by(CustomerID) %>%
summarise(recency=as.numeric(as.Date("2012-01-01")-max(InvoiceDate)),
frequenci=n_distinct(InvoiceNo), monetary= sum(total_dolar)/n_distinct(InvoiceNo))
O resultado calculado acima mostra o valor de cada uma das três variáveis para cada cliente.
summary(df_RFM)
## CustomerID recency frequenci monetary
## 12346 : 1 Min. : 23.0 Min. : 1.000 Min. : 3.45
## 12347 : 1 1st Qu.: 40.0 1st Qu.: 1.000 1st Qu.: 178.62
## 12348 : 1 Median : 73.0 Median : 2.000 Median : 293.90
## 12349 : 1 Mean :115.1 Mean : 4.272 Mean : 419.17
## 12350 : 1 3rd Qu.:164.8 3rd Qu.: 5.000 3rd Qu.: 430.11
## 12352 : 1 Max. :396.0 Max. :209.000 Max. :84236.25
## (Other):4332
kable(head(df_RFM))
CustomerID | recency | frequenci | monetary |
---|---|---|---|
12346 | 348 | 1 | 77183.6000 |
12347 | 25 | 7 | 615.7143 |
12348 | 98 | 4 | 449.3100 |
12349 | 41 | 1 | 1757.5500 |
12350 | 333 | 1 | 334.4000 |
12352 | 59 | 8 | 313.2550 |
Os histogramas serão criados com o objetivo de avaliar a distribuição de cada variável e suas semelhanças com a distribuição normal.
hist(df_RFM$recency)
hist(df_RFM$frequenci, breaks = 50)
hist(df_RFM$monetary, breaks = 50)
Iremos transformar os valores da variável referente ao gasto usando a escala log.
Essa transformação é recomendada para reduzir a assimetria dos dados que iremos usar na análise de agrupamentos.
df_RFM$monetary <- log(df_RFM$monetary)
hist(df_RFM$monetary)
Nesse passo vamos agrupar os consumidores de acordo com as 3 variáveis em questão.
Antes de distribuir os grupos, calcula-se uma distância entre os consumidores baseada nas 3 variáveis em análise.
Consumidores parecidos terão uma distância pequena entre eles, enquanto consumidores com padrões diferentes terão uma distância grande entre eles.
# Atribuir o ID de cada usuário para o nome da linha
df_RFM2 <- df_RFM
row.names(df_RFM2) <- df_RFM2$CustomerID
df_RFM2$CustomerID <- NULL
# Padronizar cada uma das variáveis (normal padrão com média 0 e variância 1)
df_RFM2 <- scale(df_RFM2)
summary(df_RFM2)
## recency frequenci monetary
## Min. :-0.9205 Min. :-0.42505 Min. :-5.8832
## 1st Qu.:-0.7505 1st Qu.:-0.42505 1st Qu.:-0.6153
## Median :-0.4205 Median :-0.29514 Median : 0.0493
## Mean : 0.0000 Mean : 0.00000 Mean : 0.0000
## 3rd Qu.: 0.4968 3rd Qu.: 0.09457 3rd Qu.: 0.5576
## Max. : 2.8091 Max. :26.59496 Max. : 7.6012
#Cálculo da Matriz de Distância entre os consumidores
matriz_distancia <- dist(df_RFM2)
#Cálculo dos grupos
grupos <- hclust(matriz_distancia, method = 'ward.D2')
O dendograma é um gráfico muito utilizado para definir pontos de corte em uma análise de agrupamentos. É um método visual, porém muito importante.
O parte superior de um dendograma mostra todos os elementos (consumidores) em apenas dois grupos. A parte inferior do Dendograma representa todos os elementos como um grupo, ou seja, cada consumidor seria um grupo.
Nenhum dos extremos é interessante em nossa análise, então cabe ao especialista analisar quando há um grande salto de distância entre os nós de divisão dos grupos e aliar isso a um número de grupos próximo do desejado/viável.
plot(grupos)
members <- cutree(grupos,k = 6) #atribuir o grupo a cada consumidor
members[1:5]
## [1] 1 2 2 1 3
table(members) #quantidade de consumidores em cada grupo
## members
## 1 2 3 4 5 6
## 255 1878 772 1092 319 22
aggregate(df_RFM[,2:4], by=list(members), mean)
## Group.1 recency frequenci monetary
## 1 1 64.56078 5.729412 7.148281
## 2 2 90.12886 3.185304 5.944782
## 3 3 293.65674 1.396373 5.320760
## 4 4 68.29304 2.924908 4.974036
## 5 5 36.06897 16.028213 5.711702
## 6 6 28.09091 77.454545 6.601579
Podemos perceber que o grupo 6 compra com uma frequência muito superior quando comparados aos outros grupos. Além disso, é o grupo que fez compras mais recentemente.
Para esse grupo, imagino haver duas hipóteses:
Obviamente é necessário uma análise mais aprofundada para saber quem realmente são esses clientes e quais o tratamento adequado para esse grupo. Essa análise poderia ser feita com a posse completa dos dados das vendas.
Já o grupo 3 contém clientes que demandarão um esforço maior da empresa para que se tornem fiéis, afinal já não compram há muito tempo (valor alto para “recência”) e compraram, em média, uma única vez.
Faça parte do nosso grupo exclusivo e receba as novidades mais interessantes sobre Data Sciente e R em primeira mão.