Skip to main content
12 June 2019
Follow Us

Clustering com o algoritmo Partitioning Around Medoids (PAM) e o Power BI

Nesta segunda parte da nossa série dedicada à segmentação de clientes com R e Power BI, vamos analisar um conjunto de dados com transações de uma empresa de distribuição para agrupar os clientes de acordo com características comuns. Como referido no artigo anterior, este trabalho permitir-nos-á conhecer melhor o cliente e desenvolver estratégias de marketing diferenciadas para cada segmento (cluster). No entanto, desta vez, vamos recorrer não só a variáveis numéricas, mas também a variáveis categóricas.

O nosso trabalho começa com a importação dos dados de um ficheiro CSV para o Power BI. Com o Power Query, o trabalho de edição e limpeza dos dados é relativamente facilitado: tudo o que é necessário fazer é reconhecer a vírgula como separador de colunas e o ponto como separador de decimais.

Analisando os dados, numa primeira abordagem, verificamos que o mesmo contém 38.008 registos e 6 variáveis:

  • A identificação de cada cliente, através da sua chave primária
  • O valor gasto durante o período de dois anos, coluna “monetary”
  • O número de transações realizadas por cada cliente no período, coluna “frequency”
  • O número de dias desde a última compra, coluna “recency”
  • A idade, na coluna “age”
  • O género do agregado familiar, será predominantemente masculino, feminino, contendo ambos os géneros ou desconhecido.

Note-se que esta última variável é categórica, o que impede a utilização de médias como critério de afetação de clientes a clusters.

No Power Query, vamos aplicar uma transformação a este conjunto de dados utilizando um script do R. Recordo que, para que este script funcione corretamente, será necessário instalar o R e um editor, como por exemplo, o R Studio.

Este script será necessário para eliminar as colunas “id” e “CUSTOMER_ID”, que não serão objeto da nossa análise e para retirar uma amostra aleatória de 1.000 observações deste conjunto de dados, uma vez que o método que utilizaremos é bastante pesado em termos computacionais e o algoritmo não consegue processar todas as 38.000 observações num tempo razoável.

Nesta fase, os dados apresentam-se da seguinte forma:

PAM1

E no editor do R Script, teremos o código abaixo, que executa as seguintes tarefas, por ordem de linha:

  1. Carrega a biblioteca “dplyr”, que contém um conjunto de ferramentas que facilitam a redação e compreensão do código
  2. Carrega a biblioteca “cluster”, que fará o trabalho pesado de segmentação
  3. Retira uma amostra aleatória de 1.000 registos ao “dataset” original e afeta-a ao dataframe “df”, que será o conjunto de dados utilizado na segmentação
  4. Guarda a identificação do cliente no objeto “clienteID”, para que seja novamente introduzido após a segmentação
  5. Retira as colunas “id” e “Customer_id” ao dataframe “df”.

PAM2

Para resolver o problema de segmentação num conjunto de dados que combina variáveis numéricas e categóricas, vamos recorrer à distância de Gower, uma técnica de medição de distâncias entre observações em conjuntos de dados com variáveis mistas. Estas distâncias são representadas numa matriz, no nosso caso, uma matriz com 1.000 linhas por 1.000 colunas, com valores entre 0 e 1, consoante as observações estejam mais próximas ou distantes entre si, respetivamente.

Com esta matriz criada, vamos começar a analisar os resultados, por enquanto ainda de uma forma superficial, mas que nos permite já aferir quanto à validade do método, criando duas variáveis:

  1. Que clientes são mais diferentes entre si?
  2. Que clientes são mais idênticos?

Assim, ao código acima acrescentamos o seguinte, conforme imagem abaixo:

PAM3

Como última etapa do processo de segmentação, vamos tentar dividir os clientes em 3 clusters. A escolha do número de clusters é importante e existem diversas formas de chegar a um número ótimo (este trabalho de otimização foi realizado previamente no R e recorreu a diversos testes de resultados).

Voltamos novamente ao editor do script R para acrescentar o código que permite realizar esta parte do trabalho, acrescentando o seguinte:

PAM4

Vamos criar o dataframe “pam_fit” utilizando a função “pam” da biblioteca “cluster” que carregámos no início. Esta função aceita no primeiro argumento a matriz de dissimilaridade “gower_dist” construída anteriormente, no segundo argumento “diss=TRUE” indica isso mesmo, que se trata de uma matriz de dissimilaridade e o terceiro argumento, 3, corresponde ao número de clusters.

No último conjunto de instruções criamos o dataframe “clusters” que junta os resultados obtidos com a identificação de cada cliente.

O código completo deste script é o seguinte:

# 'dataset' contém os dados de entrada neste script
library(dplyr)
library(cluster)

df<- dataset[sample(nrow(dataset), 1000),]
clienteID<- df[2]
df<- df[-c(1:2)]

gower_dist <- daisy(df, metric = "gower")
gower_mat <- as.matrix(gower_dist)

# que clientes são mais parecidos e mais diferentes?
diferentes<- df[which(gower_mat == max(gower_mat[gower_mat != max(gower_mat)]), arr.ind = TRUE)[1, ], ]
identicos <- df[which(gower_mat == min(gower_mat[gower_mat != min(gower_mat)]), arr.ind = TRUE)[1, ], ]

# sumário para 3 clusters
pam_fit <- pam(gower_dist, diss = TRUE, 3)
clusters <- df %>%
mutate(cluster = pam_fit$clustering) %>%
cbind(clienteID)

Como este código gera cinco dataframes distintos, o Power Query vai resumi-los numa tabela com cinco linhas. Esta não é ainda a tabela que utilizaremos para analisar os resultados, mas podemos usá-la para a construção de três tabelas distintas:

  • Identificação dos dois clientes mais similares
  • Identificação dos dois clientes mais distintos
  • Tabela com todas as variáveis e o cluster a que pertence cada cliente

Portanto, nesta fase, o Power Query deve mostrar-nos a seguinte tabela:

PAM5

Não vamos carregar esta tabela no modelo de dados, mas vamos expandir as três tabelas que nos interessam, acima identificadas. O preview da tabela “clusters” seria por exemplo o seguinte:

PAM6

Como vemos, cada cliente tem agora uma identificação com o cluster a que pertence.

A tabela com os clientes mais idênticos contém agora o seguinte:

PAM7

E a tabela com os dois clientes mais diferentes o seguinte:

PAM8

Como prova de conceito, estas duas tabelas sugerem que o algoritmo parece ter funcionado bastante bem, lidando com precisão nas variáveis numéricas e na variável categórica referente ao género!

Depois de carregadas as tabelas para o modelo de dados, estaremos de volta ao Power BI e nele podemos tirar partido de todas as funcionalidades de visualização de dados, recorrendo a gráficos, cartões, mapas, matrizes, boxplots, entre muitas outras.

Com a dimensão que acabámos de criar, enriquecemos o modelo de dados e dispomos agora de uma poderosa ferramenta de gestão, que nos permite conhecer melhor os clientes, caracterizando-os, e desenvolver estratégias diferenciadas que permitam lidar com as suas diferenças.

Vejamos os resultados numa matriz, que contém nas colunas a identificação dos 3 clusters e nas linhas o cálculo de médias para as variáveis numéricas e a contagem para a variável referente ao género:

PAM9

Parece que o algoritmo realizou uma separação clara dos clusters com base no género e lidou bastante bem com as variáveis numéricas, sendo a idade a única exceção, dado que todos os três clusters apresentam resultados muito parecidos.

Dos 3 clusters, o terceiro será provavelmente o mais interessante do ponto de vista do negócio: é aquele que contém ambos os géneros no agregado familiar (285 observações num total de 288), o valor monetário médio é de 2.291,25 euros, o maior de todos, o número médio de dias desde a última compra é o mais baixo (119) e em média os clientes deste cluster realizaram 57 transações no período em análise – o valor mais elevado dos 3 clusters.

Analisando estes dados com mais detalhe não seria difícil descobrir mais informação valiosa do ponto de vista da gestão e do marketing.

Agradeço o vosso feedback sobre esta série de dois artigos em que combinámos a versatilidade dos algoritmos do R com a facilidade de análise do Power BI, sem dúvida esta é uma combinação interessante.


Assine a nossa newsletter e receba o nosso conteúdo diretamente no seu email