Segmentação de Clientes usando K-Means Clustering

Larissa Gomes
7 min readNov 29, 2023

--

🍟 Esta é a segunda parte do artigo sobre segmentação de clientes de um famoso app de delivery. Clique aqui para ver a primeira parte, em que eu explico o passo-a-passo da Análise RFM, que vai ser usada adiante para criar nossos clusters.

  1. O que é e por que usar Clustering?
  2. Análise da Assimetria da Segmentação e Escala
  3. K-Means e Método do Cotovelo (Elbow)
  4. Análise dos Resultados
  5. Considerações finais

O que é e por que usar Clustering?

Clustering é um tipo de aprendizado de máquina não supervisionada em que o algoritmo processa nossos dados e os divide em grupos com base em similaridades, os chamados “clusters”. A primeira parte da nossa segmentação foi feita com base no modelo RFM, agrupando quase que manualmente nossos clientes, entretanto esse modelo possui algumas limitações que um algoritmo conseguiria contornar de forma mais eficaz.

A segmentação adequada de clientes é crucial para o sucesso de qualquer negócio online. Como o comportamento do cliente muda frequentemente, convém realizar a segmentação baseada em cluster regularmente, em vez de apenas de vez em quando.

Idealmente, deve ser realizado diariamente usando os dados comportamentais e transacionais mais recentes do cliente. Para um marketing eficaz, é necessário identificar dezenas ou centenas de personas diferentes que podem ser direcionadas de forma independente.

No entanto, a segmentação manual por vezes é uma tarefa demorada. Para garantir a segmentação precisa de toda a base de clientes em personas relevantes todos os dias, um sistema automatizado pode ser empregado e é por causa dessa brecha que eu adicionei esse mini projeto de ML à nossa segmentação anterior.

Análise da Assimetria da Segmentação e Escala

Antes de aplicar K-Means aos nosso dados, analisei quão assimétricas são as nossas distribuições. Esse é um passo importante, uma vez que dados assimétricos vão gerar conclusões distorcidas.

Distribuições de recency, frequency e monetary, respectivamente.

As nossas distribuições parecem ser distorcidas, levantando dúvidas sobre a precisão da nossa análise. Para resolver esse problema, precisamos transformar os dados em uma forma mais simétrica. Alcançar isso requer o uso de métodos específicos para gerenciar a assimetria. Abaixo testei transformações de log, transformações de raiz quadrada e transformações box-cox para ver qual atende melhor às nossas necessidades.

A transformação de log é adequada para variáveis que possuem um grande intervalo de valores, pois compacta os dados na extremidade inferior do intervalo.

A transformação de raiz quadrada é ideal para variáveis com distribuição distorcida, pois reduz a assimetria e torna os dados mais simétricos.

A transformação Box-cox é uma ferramenta poderosa que pode lidar com uma ampla gama de transformações, ajustando o parâmetro de potência dos dados para obter uma distribuição mais simétrica. No entanto, é importante notar que essa transformação só é adequadas para variáveis que possuem valores positivos.

Os gráficos apresentados acima mostram que variáveis com transformação box-cox (canto inferior direito) apresentam uma forma mais simétrica em comparação com outras transformações. Porém, a variável recência já possui um coeficiente de assimetria baixo e, portanto, não pudemos observar nenhuma melhoria significativa. Assim, optei manter a sua forma atual. Para confirmar minhas descobertas, utilizei a função de inclinação para calcular cada variável.

⭐️ Os respectivos coeficientes foram detalhados no notebook, que pode ser acessado aqui.

Podemos usar esses dados transformados para atualizar a tabela RFM executando um script que incorpora os valores recém-transformados.

rfm_fixed = pd.DataFrame()
rfm_fixed['recency'] = rfm['recency']
rfm_fixed['frequency'] = stats.boxcox(rfm['frequency'])[0]
rfm_fixed['monetary'] = stats.boxcox(rfm['monetary'])[0]
rfm_fixed.tail()
tail()

As variáveis em nosso conjunto de dados têm médias e variâncias diferentes, então é necessário normalizá-las. Uma maneira de fazer isso é usando o objeto StandardScaler da biblioteca scikit-learn. Seguir esse passo nos ajudará a padronizar as variáveis e torná-las mais comparáveis.

scaler =  StandardScaler()
scaler.fit(rfm_fixed)
rfm_normalized = scaler.fit_transform(rfm_fixed)
print(rfm_normalized.mean(axis=0).round(2))
print(rfm_normalized.std(axis=0).round(2))

🥳 Nossas médias são iguais a zero e o desvio padrão é 1! Grande sucesso!

K-Means e Método do Cotovelo (Elbow)

K-means é um algoritmo relativamente simples de aprendizado não supervisionado, sendo usado a partir da biblioteca scikit-learn.
A ideia do algoritmo é agrupar elementos semelhantes em k clusters (sendo k definido pelo usuário). Basicamente, cada cluster é representado por um centróide, que é o ponto central do grupo.

n_clusters = range(1, 11)
cluster_sse = []
for i in n_clusters:
kmeans = KMeans(n_clusters= i)
kmeans.fit(rfm_normalized_df)
cluster_sse.append(kmeans.inertia_)

plt.plot(n_clusters, cluster_sse, marker = "o")
plt.show()
Elbow method

Ao analisar a figura acima, tive dúvidas entre utilizar k=3 ou k=4. Pra ter um pouco mais de certeza na minha escolha, recorri ao método rápido do YellowBrick:

X, y = load_nfl()

# Use the quick method and immediately show the figure
kelbow_visualizer(KMeans(random_state=42), X, k=(2,10))
Gráfico gerado com YellowBrick

Vamos dar uma olhada nos nossos cluster quando k = 4. No meu notebook eu testei k = 3 também, entretanto não obtive uma visão tão detalhada dos clientes, decidindo então optar por 4.

model = KMeans(n_clusters=4, random_state=42)
model.fit(rfm_normalized_df)
model.labels_.shape

rfm["cluster"] = model.labels_
rfm.head()
rfm.groupby('cluster').agg({
'recency':'mean',
'frequency':'mean',
'monetary':['mean', 'count']}).round(1)
Resuminho dos nossos clusters

Análise dos Resultados

Agora que já temos nossos clusters definidos, vamos pensar com uma perspectiva de negócios como isso se reflete na nossa análise.

Antes de tudo, temos abaixo uma comparação visual entre a distribuição dos nossos segmentos e dos nossos clusters, lado a lado.

Antes e depois dos Clusters

Meu segundo passo foi descrever brevemente as características de cada agrupamento:

Olhando bem, parece que a maioria dos clientes é casual, com exceção do cluster 0 e parte do cluster 3. Vamos chamar os clusters 0 e 3 de clientes principais e os demais, clientes casuais.

Clientes Principais — os que têm a mente (e a carteira) aberta 💸

Temos então nesse conjunto de dados uma amostra de clientes em que 51% deles contribuiu para 89% do valor monetário de todas as transações durante o período de 1 ano. O gasto médio por compra não sugere restaurantes caros, sendo então o valor monetário atribuído à lealdade com que esses usuários fazem pedidos.

Esses clientes parecem abertos a experimentar uma variedade de restaurantes, então podemos investir em recompensas caso eles optem por fazer pedidos de restaurantes recomendados que ainda não testaram antes.

Clientes Casuais — aquele parente que só aparece no Natal e não se ouve mais falar 🎅

Nossos clientes casuais são quase como o Natal; só acontecem uma vez no ano. Sendo assim, vamos surpreendê-los com uma estratégia de “Christmas in July” 🎁

Eles podem ter aterrisado na plataforma como resultado de vouchers que ganharam. Seria interessante investir em medidas para cativá-los, nesse caso eu sugeriria oferecer um desconto na segunda ou terceira compra pra incentivar a interação.

Clientes casuais gastam por pedido valores similares aos dos Clientes principais

Considerações Finais

Wow! Começamos com mais de 11 mil clientes e chegamos a 4 grupos com tantas semelhanças! Espero que até aqui tenha ficado claro como a segmentação e clustering podem ser complexos, mas são ferramentas que trazem resultados de importância fundamental pra influenciar o crescimento de empresas e melhor a satisfação dos clientes.

Esta foi uma oportunidade interessante de explorar tantos conceitos novos pra mim. Ainda assim, gosto de refletir:

❤️ O que eu teria acrescentado a este projeto?

  • A análise começa na coleta de dados! Teria sido interessante obter uma amostra relevante de usuários de cada país do dataset, permitindo segmentar os clientes de cada país 🌎

Referências

  1. M.Y. Smaili, H. Hachimi, (2023). New RFM-D classification model for improving customer analysis and response prediction,
    https://www.sciencedirect.com/science/article/pii/S2090447923001430#b0005
  2. https://pandascouple.medium.com/clusteriza%C3%A7%C3%A3o-de-dados-segmenta%C3%A7%C3%A3o-de-clientes-347d4449ec84
  3. https://medium.com/programadores-ajudando-programadores/k-means-o-que-%C3%A9-como-funciona-aplica%C3%A7%C3%B5es-e-exemplo-em-python-6021df6e2572

Se você já aplicou conceitos similares, eu adoraria saber!

🪐 Conecta comigo no LinkedIn!

👏 Manda uns aplausos pra esse post!

--

--