Identificando quando um cliente está parando de comprar na empresa

Nesse artigo, vamos aprender como podemos usar a matemática para entender o comportamento dos clientes.

Matheus da Rocha
Data Hackers
5 min readMar 28, 2021

--

SPhoto by rupixen.com on Unsplash

Em um mundo online extremamente competitivo, identificar que um cliente está comprando menos e se afastando da empresa é extremamente eficaz no processo de retenção e fidelização.

Se você pesquisar sobre previsão de churn pela internet, de fato vai cair em diversas literaturas abordando esse tema em Ciência de Dados. Porém, praticamente todas são sobre churn em modelos de negócio recorrentes, ou seja, onde a utilização do produto é dependente de uma mensalidade, o que força a existência de registros de tempos em tempos.

Replicar tal modelagem no varejo tradicional não é tão trivial, pois diferentemente do modelo de recorrência, no varejo, um cliente pode simplesmente deixar de comprar com você sem de fato cancelar a sua conta.

Mas claro, que todo problema é resolvível, e um modelo probabilístico nesse caso cairia bem, mas talvez apenas em lojas que possuem um volume muito elevado de dados, o que não é escalável para qualquer uma.

Então podemos abusar de uma ferramenta que é a base para todas as outras: a nossa querida matemática.

Linha de tendência

Nesse exemplo, vamos carregar um conjunto de dados real (de um cliente meu, dado sua autorização), porém anonimizado, sem que haja nenhum dado pessoal, e com os ID’s sortidos também.

Estrutura do dataframe que iremos utilizar.

Para saber se um cliente vem deixando de comprar com a empresa, podemos calcular uma linha de tendência simples.

Regressão linear simples

Tendo em mente que a fórmula da regressão linear retorna uma reta, então podemos achar a reta de inclinação (ou linha de tendência de compra) do cliente. A é o intercepto da função, enquanto B é a inclinação.

Não quero trabalhar com datas no eixo X, então vou transformar cada data em um índice. O eixo Y contém os valores de compras, assim analisamos além da frequência, também o valor gasto em cada compra. Afinal, se um cliente comprava 10 reais por ano, e passou a comprar 8, 6, 4, mesmo que ele continue comprando todos os anos, ele claramente está diminuindo seu ticket-médio, o que não é bom para a empresa.

> Nesse pedaço de código, eu agrupo as vendas por mês (no meu cenário, as vendas avulsas não haviam ficado visualmente agradáveis, e você pode alterar para outras métricas também, como semestrais ou anuais, por exemplo);
> Pego a quantidade de dias sem compras (data_max é uma constante criada previamente contendo a data de hoje, pode ser a maior data do dataset também);
> Crio o eixo X com índices começando de 1, onde cada índice reflete um mês;
> Crio o eixo Y, onde possui o valor das compras.
> Pego o slope, que é um valor númerico, mais para frente, teremos uma fórmula que explica o slope. Mas basicamente, é a linha de tendência da função linregress do pacote stats.

Notem que nos dois eixos, eu adiciono a quantidade de meses sem compras do cliente, pois o tempo ocioso dele impacta diretamente no modelo de negócio.

Primeiros resultados

Pronto, temos a linha de tendência definida, mas será que resolvemos nosso problema? No meu data-set, se pegarmos o min() e o max() da tendência, temos os seguintes valores: -54531.6 e 4057.20.

Vamos usar como exemplo esse cliente.

Analisando o cliente acima, podemos concluir visualmente, que é claro que ele está deixando de comprar na empresa, além das compras estarem sendo com um valor menor ao decorrer do tempo, também há um período de ociosidade. O slope retornado dessa função foi de -45.72.

Se a gente pré-definir que caso o slope seja menor que 0 o cliente estará deixando de comprar na empresa, podemos parar por aqui, mas essa seria uma resposta muito preguiçosa e não se encaixaria em todos os casos, podendo gerar viéses na análise.

Mas como definirmos um threshold quando o menor valor é -54 mil? Como disse previamente, é hora de sumonar a matemática.

E se ao invés do slope, a gente ter o ângulo dessa reta?

Melhorando nossa abordagem

Vamos atrás da angulação da nossa reta, simbolizado por θ. Mas antes, vamos dar uma olhadinha nas seguintes fórmulas matemáticas.

Fórmula da tangente

Para se conseguir a angulação da reta θ, necessitamos da tangente inversa do triângulo, que representa a fórmula acima. O output dessa equação, é o valor já calculamos antes, o slope.

Fórmula da tangente inversa (arctan)

Agora fica fácil, o NumPy nos dá uma função para calcular a tangente inversa de um slope.

Com apenas uma linha, temos o ângulo da reta pronta, e mais outra para converter o ângulo para graus. Embora seja muito simples você chamar a função, dá uma olhada nesse vídeo onde é explicado como achar o ângulo de um triângulo com a mesma teoria aplicada aqui.

Ok, vamos dar uma olhada no ângulo retornado do mesmo cliente usado anteriormente.

Hum… O ângulo desse cliente deu -88.75°, mas olhando para essa reta, claramente não é uma reta de quase 90°.

O problema é que o eixo Y está na casa dos milhares, enquanto o eixo X está na casa das dezenas, fazendo com que a reta fique extremamente inclinada quando o eixo X é preenchido até o maior valor de Y. Todos valores que passarem da casa dos milhares ficarão perto de 90° (positivo ou negativo).

Para resolver isso, normalizei entre 0 e 1, para que ambos os eixos ficassem na mesma escala, e booom, agora temos um ângulo de -23.59°, o que condiz bastante com a reta plotada visualmente!

Portanto, o código final fica o seguinte:

Agora fica muito mais fácil definir um threshold junto ao time de negócios para saber quando um cliente começa a se afastar da empresa, já que o menor valor é 90, ao invés dos 50 mil de antes. Quem disse que nunca usaria trigonometria na vida, hein?

Gostaria de creditar também minha amiga Bruna Kushikawa, que atualmente é Desenvolvedora de Machine Learning na Smart Hint, e estava junto comigo durante esse estudo de caso.

Para me contatar, é só mandar uma mensagem no meu LinkedIN. :)

--

--