Fala, galera! Tudo bem?! Hoje falaremos de um tópico avançado em DAX e que poderá te dar vários insights sobre sua carteira de clientes. Nosso objetivo será segmentar os clientes de acordo com a data de última compra, frequência e valor monetário.
Sabemos que a aquisição de novos clientes é importante para o crescimento de qualquer empresa. Entretanto, a manutenção dos clientes atuais tende a ser mais barata e mais rentável. Logo, gerenciar a carteira de clientes é fundamental.
Entre os oportunidades que mais gosto para a matriz RFV, temos:
- Categorizar melhor seus clientes;
- Entender pra onde o negócio está evoluindo;
- Identificar a frequência de compra dos clientes;
- Melhorar previsibilidade;
- Compor uma estratégia aderente de recorrência nas vendas;
- Categorizar a carteira de clientes conforme volume de compras – curva ABC;
- Estabelecer metas de vendas por cliente;
- Sugerir mix de compras para os clientes conforme seu histórico;
- Identificar a última data da compra para programar a próxima venda;
- Acompanhar a frequência que o cliente compra da empresa;
- Monitorar o valor médio de compra por cliente;
- Monetizar o cliente em todo o “ciclo de vida” na empresa;
- Estabelecer metas para os vendedores conforme estratégia, sazonalidade, estoque, lançamentos de produtos, etc;
- Maximizar as vendas para garantir previsibilidade orçamentária;
- Proteger a recorrência nas vendas backlog
Bom, acho que já te dei motivos suficientes para investir seu tempo na construção de uma matriz RFV, certo?!
RFV ou RFM
A sigla RFV significa Recência, Frequência e Valor. Veja as definições em detalhes:
Recência | É a data de última compra do seu cliente |
Frequência | É a quantidade de vezes que seu cliente comprou um determinado produto |
Valor | É o valor monetário de compra realizada por seu cliente neste mesmo determinado período |
Lá fora essa sigla se chama RFM (recency, frequency and monetary). Há uma referência bem bacana nesse link explicando alguns conceitos e formas de uso dessa tipo de análise.
Fazendo uma busca na internet com esse termo em Inglês é possível facilmente encontrar alguns exemplos da representação dessas variáveis em matrizes:
Podemos ler esses gráficos da seguinte forma: quanto maior a recência, ou seja, quanto mais recente foi a data de última compra, mais para a direita está posicionado o cliente (maior valor no Eixo X). E quanto maior for o valor da compra, mais alta será a sua posição no Eixo Y. Veja que a segmentação Champions está no canto superior direito e esse é o nosso “melhor cliente”. Observe também que um novo cliente será sempre exibido em (R5;F1).
Há um exemplo bem legal também que o Renan Rodrigues fez em Power BI e disponibilizou neste link aqui.
Quando procuramos pelo mesmo termo em Português, encontramos a matriz invertida em relação ao Eixo X. Ou seja, o “melhor cliente” estará posicionado no canto superior esquerdo. Nós iremos trabalhar com a versão americana, beleza?! Mas deixo aqui a matriz versão Português para vocês darem uma olhadinha também!
Há duas formas de realizar a segmentação com base no RFV: Percentil (quartil) ou Regras de negócio. Nós iremos trabalhar com a segunda opção.
Clique Aqui para se tornar um expert em DAX aprendendo na prática diversas análises avançadas.
Cenário
Vamos imaginar que a nossa base de dados é de uma empresa de produtos eletrônicos online. Teremos as seguintes tabelas fvendas, dCalendario, dCliente (aquelas tradicionais que sempre usamos), beleza?!
Definindo as Regras de Negócio
As regras (segmentos) você quem saberá definir para o seu negócio. Vamos definir as segmentações do nosso exemplo assim:
1) Recência
R1 | Entre 181 e 360 dias |
R2 | Entre 121 e 180 dias |
R3 | Entre 61 e 120 dias |
R4 | Entre 31 e 60 dias |
R5 | Últimos 30 dias |
2) Frequência (quantidade de compras nos últimos 12 Meses):
F1 | 1 vez |
F2 | Entre 2 e 5 vezes |
F3 | Entre 6 e 9 vezes |
F4 | Entre 10 e 11 vezes |
F5 | 12 vezes ou mais |
O mesmo pode ser feito para o item 3) Valor, ok?! Vamos fazer apenas 1 e 2 para fins de exemplo.
Segmentação estática
Vamos começar com um exemplo de segmentação estática.
O primeiro passo será criar uma medida DAX para nos retornar a data de última compra:
Última Compra =MAX ( fVendas[Data Venda] )
Vamos precisar também de uma medida para calcular a quantidade de vendas dos últimos 12 meses:
Qtd Vendas 12M =CALCULATE (
[Qtd Vendas];
DATESINPERIOD (
//Retorna todas as datas de 12 meses para trás
dCalendario[Data];
MAX ( dCalendario[Data] );
-12;
MONTH
)
)
Agora vamos classificar os clientes de acordo com aquelas regras de negócio que falamos. Para isso, adicionaremos uma coluna calculada na tabela dCliente. Perceba que vamos testar algumas variáveis que serão utilizadas na nossa coluna calculada para que você possa acompanhar o resultado de cada variável. Vamos por partes!
Calculando o número de dias desde a última compra:
Recência =VAR vToday =
MAX ( dCalendario[Data] )
VAR vdiasUltimaCompra =
DATEDIFF ( [Última compra]; vToday; DAY )
RETURN
vdiasUltimaCompra
Note que não utilizamos a fórmula TODAY( ) na variável vToday porque no nosso exemplo a base está ‘estática’ (só tem dados até 2018), beleza?!
Essa variável vDiasUltimaCompra retornará a quantidade de dias passados após a última compra de cada cliente. A função DATEDIFF utilizando como último argumento DAY retornará o intervalo de dias entre as duas datas especificadas. Lembre-se que o primeiro argumento é a ‘menor’ data (mais antiga) e o segundo argumento é a ‘maior’ (mais recente).
Repare que há linhas em branco na nossa coluna Recência porque há clientes na nossa base dClientes que nunca compraram. Um exemplo em que isso ocorre é quando nossa base possui prospects. Um prospect é um potencial cliente que deve se adequar a certos critérios. É como se o cliente ainda estivesse em fase de ‘negociação’.
Agora vamos usar a SWITCH pra classificar cada intervalo, veja:
Recência =VAR vToday =
MAX ( dCalendario[Data] )
VAR vDiasUltimaCompra =
DATEDIFF ( [Última Compra], vToday, DAY )
VAR vResult =
IF (
[Última Compra],
SWITCH (
TRUE (),
vDiasUltimaCompra <= 30, “R5”,
vDiasUltimaCompra <= 60, “R4”,
vDiasUltimaCompra <= 120, “R3”,
vDiasUltimaCompra <= 180, “R2”,
vDiasUltimaCompra <= 360, “R1”,
“R0”
),
“R0”
)
RETURN
vResult
Observe que há um IF antes do SWITCH porque precisamos levar em conta aqueles valores em branco que mencionamos, lembra?! Esse IF vai verificar se existe valor na medida Última Compra. Se existir, usaremos a função SWITCH, caso contrário retornaremos R0. Veja o resultado:
Vamos fazer exatamente o mesmo para calcular a Frequência, veja:
Frequência =VAR vQtdVendas12M = [Qtd Vendas 12M]
VAR vResult =
IF (
[Qtd Vendas 12M],
SWITCH (
TRUE (),
vQtdVendas12M = 1, “F1”,
vQtdVendas12M <= 5, “F2”,
vQtdVendas12M <= 9, “F3”,
vQtdVendas12M <= 11, “F4”,
vQtdVendas12M >= 12, “F5”,
BLANK ()
),
“F0”
)
RETURN
vResult
Vamos adicionar uma matriz para visualizar os dados que acabamos de construir. Basta selecionar a matriz e arrastar os campos conforme mostra a figura:
Note que se adicionarmos uma segmentação de data nessa página, a matriz não mudará seus valores porque estamos fazendo a segmentação estática, ok?!
Vamos fazer a segmentação dinâmica agora?!
Segmentação Dinâmica
Sabemos que não podemos adicionar medidas nos eixos dos gráficos, certo?! Então precisaremos criar duas tabelas auxiliares (para frequência e recência) e inserir aqueles valores que definimos anteriormente.
Tabelas Auxiliares
Vamos criar nossas tabelas auxiliares com base nas nossas regras de negócio (previamente definidas):
Faremos o mesmo para criar a tabela auxiliar de recência. As duas tabelas criadas (vRecencia e vFrequencia) ficaram assim:
Veja que, após adicionar essas duas tabelas no modelo, o Power BI vai automaticamente criar um relacionamento entre elas (porque há uma coluna em comum: id). Mas não queremos isso! Precisaremos então deletar esse relacionamento criado pois essas tabelas auxiliares não devem estar relacionadas com nenhuma das tabelas do nosso modelo.
Ao inserir um visual de tabela com ID Cliente, Frequencia, LimInf (Mínimo), LimSup (Máximo) e Qtd Vendas 12M notaremos que este último valor se repete em todos os segmentos (F1 a F5) mas o que queremos é que a quantidade apareça apenas no intervalo que definimos. Exemplo: quando a linha tiver Qquantidade igual a 5 , a coluna Frequencia deverá mostrar apenas Frequencia igual a F2. Bom, então precisaremos criar uma medida em DAX para corrigir isso, certo?!
Veja como ficou a medida:
Clientes RFV =VAR vToday =
MAX ( dCalendario[Data] )
VAR vResult =
CALCULATE (
[Clientes],
FILTER (
VALUES ( dCliente[ID Cliente] ),
[Qtd Vendas 12M] >= MIN ( vFrequencia[LimInf] )
&& [Qtd Vendas 12M] <= MAX ( vFrequencia[LimSup] )
&& DATEDIFF ( [Última Compra], vToday, DAY ) >= MIN ( vRecencia[LimInf] )
&& DATEDIFF ( [Última Compra], vToday, DAY ) <= MAX ( vRecencia[LimSup] )
)
)
RETURN
vResult
Como esta tabela sem relacionamento faz para interagir com o restante do gráfico?
Soares, Elizeu
Quando eu comparo essas medidas com as tabelas vFrequencia e vRecencia, o PBI faz por trás um relacionamento virtual.
Veja que para qualquer nova análise que eu precise de um determinado valor na visão segmentada, precisamos criar uma nova medida e utilizar esse relacionamento virtual como foi feito em Clientes RFV.
Exemplo: vamos imaginar que precisamos do Total Vendas segmentado e já possuímos a medida Total Vendas. A nossa medida Total Vendas RFV ficará assim:
Total Vendas RFV =VAR vToday =
MAX ( dCalendario[Data] )
VAR vResult =
CALCULATE (
[Total Vendas],
FILTER (
VALUES ( dCliente[ID Cliente] ),
[Qtd Vendas 12M] >= MIN ( vFrequencia[LimInf] )
&& [Qtd Vendas 12M] <= MAX ( vFrequencia[LimSup] )
&& DATEDIFF ( [Última Compra], vToday, DAY ) >= MIN ( vRecencia[LimInf] )
&& DATEDIFF ( [Última Compra], vToday, DAY ) <= MAX ( vRecencia[LimSup] )
)
)
RETURN
vResult
Observe que ela é idêntica a Clientes RFV e só muda o primeiro argumento da função CALCULATE.
Perceba que comparando essas duas formas de segmentação (estática e dinâmica) podemos ver que quando editamos o filtro Data, a matriz estática continua apresentando os mesmos valores enquanto a matriz dinâmica respeita esse filtro externo e altera corretamente seus valores.
Drill-through em botões
Agora vamos usar um recurso bem bacana que surgiu na última atualização do Power BI Desktop (botão que ativa o drill-through).
Vamos primeiro criar uma página para detalhar os clientes de acordo com a faixa selecionada. Veja:
Etapas: Crie uma nova página → Insira uma matriz de detalhamento de clientes → No painel Visualizações, arraste as colunas Frequencia e Recencia (das tabelas vFrequencia e vRecencia) → Renomeie essa página para "Detalhes"
Após adicionar as colunas Frequencia e Recencia em Drill-trhough automaticamente aparecerá um botão de Voltar.
Voltando na página que estávamos antes (com as matrizes), vamos adicionar um botão em branco.
Etapas: Inserir → Botões → Em branco → No painel Visualizações → Ative a opção Ação → Selecione o nome da página que acabamos de criar (Detalhes)
Após adicionar esse botão, basta formatá-lo:
Formatação: No painel Visualizações → Ative Texto do botão → Com Estado Padrão selecionado, mude o Texto do botão para "Detalhar Clientes" → Com Desabilitado selecionado, mude o Texto do Botão para "Selecione uma Faixa"
Qual a diferença entre drill-down e drill-through?
Matheus Lima
O Drill-through é quando queremos expandir mais detalhes em relação ao visual que temos (esse exemplo que fizemos mostra mais informações que aquelas que selecionamos na matriz). Já o Drill-down é quando você quer navegar de uma hierarquia para outra. Exemplo: você está numa visualização de ano e vai para uma visualização mensal. Veja:
Bom, pessoal, esse foi o conteúdo da nossa Live#23 ! Espero que tenham percebido a importância da segmentação de clientes e o leque de insights que passam a ficar disponíveis a partir da análise da matriz RFV.
Se ficou com alguma dúvida ou tem sugestão de um tema para a próxima Live deixa nos comentários.
Um abraço,
Leonardo.