PROJETO: Previsão de Churn

churn

Um dos maiores problemas enfrentados pelas companhias é quando há uma perda de clientes e/ou receitas, este tipo de cancelamento pode ser medido através de uma métrica denominada churn rate.

Especialmente com o crescimento de modelos de negócios por assinatura, o Churn (ou índice de cancelamento de clientes) passou a ser mais conhecido.

Churn, numa definição mais generalista, é uma métrica que indica o número de clientes que cancelam em determinado período de tempo. Para calcular o churn, o que você precisa fazer é somar o número de clientes que cancelou seu produto/serviço no período analisado.

Para que uma empresa consiga fazer a expansão da sua base de clientes, é preciso que o número de novos clientes exceda o seu churn rate – a taxa de clientes cancelados.

Qual a taxa ideal de Churn?

A melhor resposta é: o mais baixo possível. Mas é claro que entender qual a taxa ideal de churn para um negócio depende de muitos fatores. É quase impossível estimar um valor que seja verdadeiro para todo tipo de negócio. Em segmentos específicos temos alguns benchmarks. Para SaaS, por exemplo, o sugerido é algo entre 5% a 7% ao ano.

Mas por que os clientes cancelam?

Alguns dos motivos que podem motivar seu cliente a cancelar, com base na nossa experiência, podem ser:

Identificar os principais motivos pelos quais os clientes cancelam, permite conhecer indicativos de uso do produto, qualidade do serviço, preço, competição de mercado, etc.

Sobre a base de dados

Esse conjunto de dados foi retirado do kaggle, podendo ser acessado por este link, Customer Churn Prediction 2020 tem o objetivo de prever se um cliente mudará de provedor de telecomunicações.

Há dois conjuntos de dados, um para treino com 4250 linhas e 20 colunas e outro para teste com 750 linhas e 19 colunas, os dados de treino já vem com o histórico de clientes que cancelaram e não cancelaram o contrato com o provedor atual, enquanto que os dados de teste não vem com esse resultado.

Depois de ter criado o modelo, treinado e validado eu o utilizei para realizar as predições nos dados de teste e submeti ao site para obter o resultado.

Sumário e Principais Resultados

Algoritmo Final Selecionado

Random Forest

Métricas de Avaliação

Acurária
Precision
Recall
f1-Score
Curva ROC
Curva PR
Matriz de confusão

Index

1. Importes
    1.1 Bibliotecas
    1.2 Conjunto de dados
2. Análise Exploratória dos dados
    2.1 Descrição dos dados
    2.2 Análise das Variáveis categóricas
    2.3 Análise das Variáveis numéricas
    2.4 Analisando os outliers
    2.5 Análise de correlação
3. Machine Learning
    3.1 Definindo a baseline
    3.2 Escolha do Modelo
    3.3 Ajustando o modelo
    3.4 Avaliando o modelo
    3.5 Variáveis importantes
4. Treinamento com todos os dados
5. Salvando o modelo
6. Prevendo nos dados de teste
7. Salvando os dados com as previsões
8. Conclusões
9. Referências


Conclusões e Resultados

BASELINE:
    Acurácia: 75.78%

MODELO FINAL:
    Acurácia com dados de validação:      95.06%
    Acurácia com dados de teste (Kaggle): 92.95%

1. Importes

1.1 Bibliotecas

1.2 Conjunto de dados

Dicionário das variáveis

2. Análise Exploratória dos dados

2.1 Descrição dos dados

Nesta seção conheceremos um pouco mais sobre os dados, suas dimensões e analisando algumas estatísticas descritivas.

Vamos dar uma olhada nas principais estatísticas descritivas do conjunto de treino, tanto para os conjuntos numéricos quanto nos categóricos, respectivamente:

2.2 Análise das Variáveis categóricas

Vamos criar uma função para extrair a proporção para churn, em cada variável, uma vez que os números absolutos individualmente não nos dizem muita coisa, mas relacionando com total de cada, você obtém a informação mais otimizada.

Na sequencia avaliaremos com um mapa os estados com maior churn, depois plotaremos os gráficos para análises.

2.3 Análise das Variáveis numéricas

Vamos plotar as distribuições de cada variável numérica e avaliar os comportamentos.

2.4 Analisando os outliers

Os outliers podem influenciar nas análises e no treinamento do modelo preditivo.

Para plotar o boxplot com o seaborn, precisamos utilizar o método melt do pandas para termos um dataframe de duas colunas, no qual a primeira será todas as variáveis e a segunda, seus respectivos valores.

Vou plotar e avaliar de forma separada, por churn (yes/no).

2.5 Análise de correlação

3. Machine Learning

Agora vamos começar a modelar para treinar o modelo para realizar as previsões de churn.

Como temos um dataset para teste no qual nem tocamos nele ainda e este servirá somente para o teste final, simulando dados em produção que nosso modelo nunca viu.

Teremos que fazer algumas transformações, então primeiro de tudo vamos criar uma cópia do dataset de treino original, caso precisamos voltar, não precisa ser do começo.

Vamos começar separando as variáveis preditoras (X) da variável alvo, churn (y)

Então vamos separar o conjunto de treino em treino e validação.

Isso servirá para uma análise inicial com vários modelos inicialmente, analisando os resultados sem nenhum tipo de alteração.

Mas depois vamos utilizar o RandomizedSearchCV e análise dos hiperparâmetros.

3.1 Definindo a baseline

Ao invés de prever com um modelo simples, vamos utilizar esta métrica tirada desse artigo (recomendo a leitura para entendimento) de Classificador de taxa aleatória (estimativa ponderada), para ver qual seria nossa precisão se adivinhassemos as porcentagens ponderadas de cada classe.

Com base na variável churn, podemos extrair a porcentagem de cada classe e realizar o cálculo abaixo.

O valor de acurácia (em conjunto com outras métricas de classificação) deve "bater": 75.78%.

3.2 Escolha do Modelo

Sem qualquer tipo de modificação nos dados, vamos rodar alguns modelos e avaliar suas performances.

3.3 Ajustando o modelo

Com os resultados acima, podemos ver que o XGBoost teve um resultado um pouco superior que a Random Forest. Nesta versão de treinamento do modelo vamos utilizar a Random Forest, porque o resultado da XGB não foi tão superior e também porque a Random Forest é mais simples de ajustar os hiperparâmetros.

Temos duas opções, utilizar o GridSearchCV que fará todas as combinações possíveis dos hiperparâmetros do modelo ou RandomizedSearchCV que as combinações serão aleatórias.

Vamos optar pela segunda opção, pois a primeira opção podemorar muito e segundo estudos, não diferença significativa entre os dois métodos.

3.4 Avaliando o modelo

Agora vamos analisar mais duas métrica a curva ROC e a Precision Recall. Vamos criar um objeto Kfold, para separar o dataset em 5 partes e em seguida criar uma função para rodar o modelo com essas 5 partes amostrais do conjunto e analisar os resultados.

3.5 Variáveis importantes

Vamos dar uma olhada quais são as variáveis que mais influenciam o modelo, esse resultado pode nos auxiliar, caso precisar mexer em alguma variável posteriormente, com o objetivo de melhorar a performance do modelo.

Como utilizamos uma pipeline, vamos ter que extrair essas informações primeiro, pois neste modelo foi utilizado one-hot-encode e ele criou várias outras colunas, que não existe no dataset original.

Então faremos uso da biblioteca eli5 para extrair as importancias.

4. Treinamento com todos os dados

Nesta etapa, faremos um treinamento final com todos os dados de treino que temos. No caso, se tivemos, divididos o conjunto para treinar e validar para parametrizar o modelo, agora juntariamos tudo, realiza-se o treinamento completo e vamos agora testar naquele conjunto de dados que não utilizamos em momento algum.

Isso é o mais próximo, no ambiente de testes, de um modelo em produção, no qual você não conhece os dados que vão vir.

Nos dados de treino o modelo acertou 100%, agora precisamos analisar se não haverá muita diferença em um conjunto que o modelo não conhece, ou seja, a possibilidade de overfitting.

5. Salvando o modelo

Agora vamos salvar o modelo para utilizar futuramente utilizar em uma aplicação.

6. Prevendo nos dados de teste

Agora chegou o momento de analisar se o modelo realmente performa bem.

Vamos importar o conjunto de dados, manualmente remover as variáveis que removemos para treinar o modelo.

Realizar as predições.

7. Salvando os dados com as previsões

Como este conjunto de dados foi extraido do kaggle, o conjunto de testes não tem o resultado da classe churn para comparar.

Então vou submeter o meu resultado na plataforma para obter o resultado.

Assim como feito acima, no conjunto de testes vou inserir as probabilidades no conjunto de treino.

Também vou juntar os dois arquivos de treino e testes e salvar um arquivo único.

8. Conclusões

Chegamos ao final com um resultado satisfatório, batendo a baseline com um resultado bem superior. Embora tenha sido com dados publicos e eventualmentes já tratados, a realidade do dia-a-dia não é esta. Não conheço a precendencia de conjunto e pode ser que tenha um pouco de overfitting, mas comparando o resultado com os dados treino e com os de validação não houve tanta diferença.

Há ainda diversas coisas que podemos fazer para melhorar o modelo, mas como o resultado está bem superior da baseline, vou optar em não mexer por enquanto e vou explicar o que eu faria se estivessemos lidando com um problema real.

score

Espero que tenha curtido, qualquer crítica ou sugestão será muito bem vinda, segue meus contatos:

linkedin: https://www.linkedin.com/in/carlos-bonfim/
Site portfolio: https://carlosbonfim.com/

9. Referências

Resultados Digitais:
https://resultadosdigitais.com.br/blog/o-que-e-churn/

Documentação oficial Scikit-learn
https://scikit-learn.org/stable/auto_examples/compose/plot_column_transformer_mixed_types.html

Kaggle
https://www.kaggle.com/c/customer-churn-prediction-2020/data

Rocket Content
https://rockcontent.com/br/blog/churn-rate/