Clusterizando os clientes de uma loja de shopping utilizando o algoritmo K-Means


Neste trabalho, o script foi desenvolvido em linguagem R na IDE do RStudio

Ilustração por Jiaqi Wang.

Suponha que uma empresa deseja desenvolver campanhas de marketing junto aos seus clientes para alavancar seu faturamento. Essa é uma situação muito comum nas organizações, mas o sucesso de uma campanha está diretamente ligado ao direcionamento correto para um público alvo.

Neste trabalho desenvolvido em R e utilizando o algoritmo de Machine Learning K-Means, traço os perfis de clientes que uma loja de shopping possui, para que ela possa realizar ações de marketing que façam sentido para cada um de seus públicos.

1. Carregando as bibliotecas

Sem muito segredo, carregamos as bibliotecas comumente utilizadas nesse tipo de trabalho de clusterização não hierárquico. No código abaixo, cada linha é seguida de um comentário explicando ao que ela se refere.

library(tidyverse)  # pacote para manipulação de dados
library(cluster) # algoritmo de cluster
library(factoextra) # algoritmo de cluster e visualização
library(fpc) # algoritmo de cluster e visualização
library(gridExtra) # para a funcao grid arrange
library(readxl) # leitura dos dados

2. Importando os dados

Com as bibliotecas carregadas, importamos a base de dados “clientes” e a visualizei, verificando o número de variáveis e de observações.

Esse dataframe possui uma coluna “CustomerID” e as variáveis “Gender”, “Age”, “Annual Income” e “Spending Score”.

Mantivemos no dataframe apenas as colunas que iremos utilizar para o agrupamento, que serão “Annual Income” e “Spending Score”. Como o foco é definir perfis de consumo, não utilizaremos dados de gênero e idade. Ambas as colunas mantidas foram renomeadas para a tradução em português, para que ficasse mais intuitiva a visualização nos gráficos.

clientes <- read.table('Mall_Customers.csv',sep = ",", header = T, dec = ",")
rownames(clientes) <- clientes[,1]
clientes <- clientes[,-c(1,2,3)]clientes <- clientes %>% rename(salario.anual=Annual.Income..k..,
score=Spending.Score..1.100.
)clientes.padronizado <- scale(clientes)

Repare que na última linha do bloco anterior eu criei um novo dataframe “clientes.padronizado”, que recebe os dados de “clientes”, mas já com os dados convertidos em uma mesma escala.

3. Verificando o número de clusters e agrupando a base de dados

Na clusterização, um grande objetivo é manter a menor variância dentro dos grupos, os deixando mais homogêneos. Para definir o número de clusters a serem considerados, utilizando o “Elbow Method”, plotando os dados em um gráfico de linhas, onde no eixo X estão o número de clusters e no eixo Y, o somatório das variâncias.

fviz_nbclust(clientes.padronizado, FUN = hcut, method = "wss")

Repare que quanto mais eu aumento o número de clusters, mais eu diminuo a variância dentro deles. No entanto, após o número 5 a queda é menos acentuada, o que demonstra que a partir dali eu estou dividindo em grupos diferentes clientes que possuem perfis parecidos.

Em tradução, o “Elbow Method” significa “Método do Cotovelo”, pois consideramos o número de clusters aquele que aparece bem na volta da curva, como um cotovelo mesmo. Nesse caso, inicialmente o 5 parece ser o número ideal a ser utilizado.

Mas para fins de estudos, vamos testar os dados com clusters que vão de 3 a 6, e plotaremos em um gráfico para conseguirmos visualizar melhor a divisão.

clientes.k3 <- kmeans(clientes.padronizado,centers=3)
clientes.k4 <- kmeans(clientes.padronizado,centers=4)
clientes.k5 <- kmeans(clientes.padronizado,centers=5)
clientes.k6 <- kmeans(clientes.padronizado,centers=6)

Com meus dados divididos em clusters de 3 a 6, criamos os gráficos e logo em seguida utilizamos a função “grid.arrange” para visualizarmos e compararmos todos lado a lado.

G1 <- fviz_cluster(clientes.k3, geom="point", data=clientes.padronizado) + ggtitle("k=3")G2 <- fviz_cluster(clientes.k4, geom="point", data=clientes.padronizado) + ggtitle("k=4")G3 <- fviz_cluster(clientes.k5, geom="point", data=clientes.padronizado) + ggtitle("k=5")G4 <- fviz_cluster(clientes.k6, geom="point", data=clientes.padronizado) + ggtitle("k=6")grid.arrange(G1,G2,G3,G4, nrow=2)

Perceba como os dados que foram divididos em 3 e 4 clusters possuem grupos grandes, com clientes diferentes que claramente elevam a variância dentro de cada um deles. Já nos dados que foram divididos em 5 e 6 clusters os grupos estão abrangendo clientes que são parecidos entre si, em uma delimitação que faz mais sentido.

Aqui, seria possível utilizar 5 ou 6 clusters. No entanto, como verificamos com o “Elbow Method” que o somatório das variâncias de 5 para 6 cai muito pouco, escolhemos então utilizar 5 clusters.

4. Juntando os dados

Após decidir utilizar o agrupamento do “clientes.k5”, importamos novamente a base de dados inicial e concatenamos, criando uma nova coluna que se refere a qual grupo aquele cliente pertence.

clientes2 <- read.table('Mall_Customers.csv',sep = ",", header = T, dec = ",")
clientesfit <- data.frame(clientes.k5$cluster)clientes.final <- cbind(clientes2,clientesfit)

5. Análise descritiva dos grupos

Definido qual o grupo de cada cliente, podemos agora realizar uma análise descritiva dos grupos, para saber qual a média de salário anual e qual a média de consumo de cada um deles.

mediagrupo <- clientes.final %>% 
group_by(clientes.k5.cluster) %>%
summarise(n=n(),
salario.anual=mean(Annual.Income..k..),
score=mean(Spending.Score..1.100.)
)
mediagrupo

Como interpretamos os dados:

  • Grupo 1: Ganha pouco e gasta muito;
  • Grupo 2: Ganha muito e gasta muito;
  • Grupo 3: Ganha muito e gasta pouco;
  • Grupo 4: Ganha pouco e gasta pouco;
  • Grupo 5: Ganho intermediário e gasto também intermediário.

6. Salvando a nova base de dados com a coluna de cluster

Após interpretar os dados e verificar com a área de negócio se eles fazem sentido, exportamos a nova base de dados em um arquivo .csv.

write.csv(clientes.final,file = "clientesfinal.csv")

Gostou do post? O código e as bases de dados estão no meu Github. Dúvidas e sugestões, é só me mandar mensagem pelo Linkedin 😀

Link do post original: https://medium.com/jogandoosdados/clusterizando-os-clientes-de-uma-loja-de-shopping-utilizando-o-algoritmo-kmeans-91cf5b330204

LinkedIn do autor: https://www.linkedin.com/in/hernandesmjunior/

#analisedecluster #clusterizacao #aprendizadonaosupervisionado