Embora a segmentação possa ser feita com atributos dos clientes (como idade, renda mensal ou estado civil), vamos primeiro aplicar Análise RFM (Recência, Frequência e Valor Monetário) e a partir desta análise segmentar e agrupar os clientes por similaridade, ajudando assim a área de Marketing ou Vendas a personalizar a experiência de compra dos clientes.
Função para carregar os dados da planilha em Excel
Executar a Função
dados <- carrega_dados()
Dimensão dos Dados
dim(dados)
## [1] 1067371 8
head(dados)
## # A tibble: 6 x 8
## Invoice StockCode Description Quantity InvoiceDate Price `Customer ID`
## <chr> <chr> <chr> <dbl> <dttm> <dbl> <dbl>
## 1 489434 85048 "15CM CHRI~ 12 2009-12-01 07:45:00 6.95 13085
## 2 489434 79323P "PINK CHER~ 12 2009-12-01 07:45:00 6.75 13085
## 3 489434 79323W "WHITE CHE~ 12 2009-12-01 07:45:00 6.75 13085
## 4 489434 22041 "RECORD FR~ 48 2009-12-01 07:45:00 2.1 13085
## 5 489434 21232 "STRAWBERR~ 24 2009-12-01 07:45:00 1.25 13085
## 6 489434 22064 "PINK DOUG~ 24 2009-12-01 07:45:00 1.65 13085
## # ... with 1 more variable: Country <chr>
View(dados)
O objetivo é separa a base de dados por clientes com similaridade.
Função Para checar valores ausentes
verifica_missing <- function(x)
{
return(colSums(is.na(x)))
}
Executar a Função par aver os dados
verifica_missing(dados)
## Invoice StockCode Description Quantity InvoiceDate Price
## 0 0 4382 0 0 0
## Customer ID Country
## 243007 0
Existe valores ausente na coluna Description e CustomerID Temos que ver qual a melhor opção para preencher os dados, talvez uma imputação utilizando a estatistica para fazer a imputação com o teorema do limite central.
Criar uma função par alimpar e pré-processar os dados
# Função para limpar e pré-processar os dados
preprocessa_dados <- function(data1)
{
# Criando uma coluna chamada TotalPrice
data1$TotalPrice <- data1$Quantity * data1$Price
# Remove registros com valores ausentes
data1 <- na.omit(data1)
# Removemos as linhas da coluna Invoice que contém a letra C (o que significa que este pedido foi cancelado)
data1 <- data1[!grepl("C",data1$Invoice),]
return(data1)
}
#Foi cirando uma coluna mostrando o gasto de cada cliente(TotalPrice)
Executar a Função
dataset <- preprocessa_dados(dados)
Visualizar o Novo Dataset
head(dataset)
## # A tibble: 6 x 9
## Invoice StockCode Description Quantity InvoiceDate Price `Customer ID`
## <chr> <chr> <chr> <dbl> <dttm> <dbl> <dbl>
## 1 489434 85048 "15CM CHRI~ 12 2009-12-01 07:45:00 6.95 13085
## 2 489434 79323P "PINK CHER~ 12 2009-12-01 07:45:00 6.75 13085
## 3 489434 79323W "WHITE CHE~ 12 2009-12-01 07:45:00 6.75 13085
## 4 489434 22041 "RECORD FR~ 48 2009-12-01 07:45:00 2.1 13085
## 5 489434 21232 "STRAWBERR~ 24 2009-12-01 07:45:00 1.25 13085
## 6 489434 22064 "PINK DOUG~ 24 2009-12-01 07:45:00 1.65 13085
## # ... with 2 more variables: Country <chr>, TotalPrice <dbl>
Verificando a Distribuição da Variável Total Price
ggplot(dataset,
aes(x = TotalPrice)) +
geom_density(fill = "#69b3a2", color = "#e9ecef", alpha = 3.5)+
labs(title = 'Distribuição da Variável TotalPrice')
Estams usando uma escala do gráfico muito alta, então os dados estão bem
próximo do zero.
length(dataset$"Customer ID")#Lenngth mostra o cumprimeto, quando estiver espaço nas colunas é obrigatorio utilizar os " "
## [1] 805620
length(unique(dataset$"Customer ID"))
## [1] 5881
Temos 508620 registros dentro do dataset do Total temos 5881 clientes cadastrados dentro do dataset.
total_gasto <- dataset %>%
group_by(`Customer ID`) %>%
summarise(Sum = sum(TotalPrice))
head(total_gasto)
## # A tibble: 6 x 2
## `Customer ID` Sum
## <dbl> <dbl>
## 1 12346 77556.
## 2 12347 5633.
## 3 12348 2019.
## 4 12349 4429.
## 5 12350 334.
## 6 12351 301.
View(total_gasto)
Criando uma data customizada (Natal de 2011) Vai ser usada o calculo a recência
max(dataset$InvoiceDate)
## [1] "2011-12-09 12:50:00 UTC"
date1 <- as.Date.character("25/12/2011", "%d/%m/%y")
Função para converter as datas do formato POISxt para o formato Date
converte_data <- function(x)
{
options(digits.secs = 3)
return(as.Date(as.POSIXct(x$InvoiceDate, 'GMT')))
}
Execuar a função para mudar a data
dataset$InvoiceDate <- converte_data(dataset)
head(dataset)
## # A tibble: 6 x 9
## Invoice StockCode Description Quantity InvoiceDate Price `Customer ID` Country
## <chr> <chr> <chr> <dbl> <date> <dbl> <dbl> <chr>
## 1 489434 85048 "15CM CHRI~ 12 2009-12-01 6.95 13085 United~
## 2 489434 79323P "PINK CHER~ 12 2009-12-01 6.75 13085 United~
## 3 489434 79323W "WHITE CHE~ 12 2009-12-01 6.75 13085 United~
## 4 489434 22041 "RECORD FR~ 48 2009-12-01 2.1 13085 United~
## 5 489434 21232 "STRAWBERR~ 24 2009-12-01 1.25 13085 United~
## 6 489434 22064 "PINK DOUG~ 24 2009-12-01 1.65 13085 United~
## # ... with 1 more variable: TotalPrice <dbl>
View(dataset)
Função para calcular a recencia, frequência e valor monetario
calcula_rfm <- function(x){
z <- x %>% group_by(`Customer ID`) %>%
summarise(Recency = as.numeric(date1 - max(InvoiceDate)),
Frequency = n(),
Monetary = sum(TotalPrice),
primeira_compra = min(InvoiceDate))
# Removendo transações com valores acima do 3º Quartil e abaixo do Quartil 1 (removendo outliers)
Q1 <- quantile(z$Monetary, .25)
Q3 <- quantile(z$Monetary, .75)
IQR <- IQR(z$Monetary)
z <- subset(z, z$Monetary >= (Q1 - 1.5*IQR) & z$Monetary <= (Q3 + 1.5*IQR))
return(z)
}
Executando a Função
valores_rfm <- calcula_rfm(dataset)
head(valores_rfm)
## # A tibble: 6 x 5
## `Customer ID` Recency Frequency Monetary primeira_compra
## <dbl> <dbl> <int> <dbl> <date>
## 1 12348 3379 51 2019. 2010-09-27
## 2 12349 3322 175 4429. 2010-04-29
## 3 12350 3614 17 334. 2011-02-02
## 4 12351 3679 21 301. 2010-11-29
## 5 12352 3340 103 2850. 2010-11-12
## 6 12353 3508 24 407. 2010-10-27
Agora temos o padrão de compras do cliente, exemplo na linha 12348 temos um cliente que fez um gasto de 2019.40 na data 2010-09-27
View(valores_rfm)
#seet seed
set.seed(1029)
Função para segmentação de clientes com base nos valores RFM
segmenta_cliente <- function(rfm)
{
#cria uma lista
resultados <- list()
#Obtem os valores RFM
dados_rfm <- select(rfm, c("Recency", "Frequency", "Monetary"))
#Criar o modelo
modelo_kmeans <- kmeans(dados_rfm, centers = 5, iter.max = 50)
# Plot do modelo
resultados$plot <- fviz_cluster(modelo_kmeans,
data = dados_rfm,
geom = c('point'),
ellipse.type = 'euclid')
# Organiza os dados
dados_rfm$`Customer ID` <- rfm$`Customer ID`
dados_rfm$clusters <- modelo_kmeans$cluster
resultados$data <- dados_rfm
return(resultados)
}
Executando a Função
grafico <- segmenta_cliente(valores_rfm)[1]
grafico
## $plot
Temos 5 grupos, foi dividido por similaridade, temos sobreposição exemplo do azul e verde. Temos que fazer outrs testes para ver o motivo das sobreposiçções. O grupo azul e verde tem a maior concentração de clientes.
tabela_rfm <- segmenta_cliente(valores_rfm)[2]
head(as.data.frame(tabela_rfm))
## data.Recency data.Frequency data.Monetary data.Customer.ID data.clusters
## 1 3379 51 2019.40 12348 4
## 2 3322 175 4428.69 12349 1
## 3 3614 17 334.40 12350 2
## 4 3679 21 300.93 12351 2
## 5 3340 103 2849.84 12352 5
## 6 3508 24 406.76 12353 2
View(as.data.frame(tabela_rfm))
Temos o resultado final. Foi identificado 5 grupos por similariedade. Agora é so fazer o trabalho com os grupos. Serviço feito com o pessoal de vendas ou marketing.
A segmentação de clientes é a divisão de clientes e potenciais clientes de uma empresa em grupos que possuem características e dores semelhantes. Essa divisão contribui para a criação de campanhas direcionadas de marketing e vendas.
A segmentação de clientes torna a comunicação com leads, prospects e clientes, mais personalizada e eficiente. A segmentação de clientes é, basicamente, separá-los em grupos menores, usando aspectos comuns entre eles.
O objetivo disso é oferecer uma comunicação mais assertiva e personalizada aos clientes, melhorando sua experiência e entregando valor relevante para eles.
A segmentação oferece uma maneira simples de organizar e gerenciar os relacionamentos da empresa com os clientes.
Esse processo também facilita adaptar e personalizar os esforços de marketing, vendas e pós-vendas para as necessidades de grupos específicos. Isso ajuda a aumentar a fidelidade e as conversões do cliente.