Segmentação de clientes.

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.

Excluir apenas os rgistros com valores ausentes

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.

Verificar o número de Clientes

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 MOnterário gasto por Cliente

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)

Machine Learning - Clusterização Kmeans

#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.

Apresentar em formato de tabela

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.