Churn Prediction para uma empresa de Telecomunicações: Aplicando o CRISP-DM para construção de modelos de Machine Learning

Neste artigo, irei discorrer sobre as principais ideias e resultados obtidos através do meu projeto de Churn Prediction. Caso tenha interesse em visualizar o projeto completo (Jupyter Notebook), com um conteúdo mais técnico, você pode acessá-lo aqui.

Churn Prediction significa detectar quais clientes provavelmente deixarão um serviço ou cancelarão uma assinatura de um serviço. É uma previsão de extrema relevância para muitas empresas, porque a aquisição de novos clientes geralmente custa mais do que reter os existentes. Depois de identificar os clientes que correm o risco de cancelar, você deve saber exatamente qual ação de marketing tomar para um cliente individual para maximizar as chances de que o cliente permaneça.

Churn Prediction é provavelmente uma das aplicações mais importantes da ciência de dados no setor comercial. O que o torna popular é que seus efeitos são mais tangíveis de compreender e desempenha um fator importante nos lucros gerais obtidos pelo negócio.

Churn é definido em termos comerciais como “quando um cliente cancela uma assinatura de um serviço que estava usando.” Um exemplo comum é o cancelamento de assinaturas do Spotify/Netflix. Portanto, o Churn Prediction está essencialmente prevendo quais clientes têm maior probabilidade de cancelar uma assinatura, ou seja, “deixar uma empresa” com base no uso do serviço.

Diferentes clientes exibem comportamentos e preferências diferentes, por isso cancelam suas assinaturas por vários motivos. É fundamental, portanto, comunicar-se proativamente com cada um deles para mantê-los em sua lista de clientes. Você precisa saber quais atividades de marketing serão mais eficazes para cada cliente e quando serão mais eficazes.

Porquê é tão importante?

A rotatividade de clientes é um problema comum em empresas de muitos setores. Se você quer crescer como empresa, precisa investir na conquista de novos clientes. Cada vez que um cliente sai, representa uma perda significativa de investimento. Tanto o tempo quanto o esforço precisam ser canalizados para substituí-los. Ser capaz de prever quando um cliente provavelmente sairá e oferecer incentivos para ficar pode oferecer grandes economias para uma empresa.

Como resultado, entender o que mantém os clientes engajados é um conhecimento extremamente valioso, pois pode ajudá-lo a desenvolver suas estratégias de retenção e implantar práticas operacionais destinadas a impedir que os clientes saiam pela porta.

Prever o churn é um fato da vida para qualquer negócio de assinatura, e mesmo pequenas flutuações no churn podem ter um impacto significativo em seus resultados. Precisamos saber: “Esse cliente vai nos deixar em X meses?” Sim ou não? É uma tarefa de classificação binária.

CRISP-DM

CRISP-DM é um modelo de processo de mineração de dados que descreve abordagens comumente usadas por especialistas em mineração de dados para atacar problemas.

Fases do processo:

  • Entender o Negócio: foca em entender o objetivo do projeto a partir de uma perspectiva de negócios, definindo um plano preliminar para atingir os objetivos.
  • Entender os Dados: recolhimento de dados e inicio de atividades para familiarização com os dados, identificando problemas ou conjuntos interessantes.
  • Preparação dos Dados: construção do conjunto de dados final a partir dos dados iniciais. Normalmente ocorre várias vezes no processo.
  • Modelagem: várias técnicas de modelagem são aplicadas, e seus parâmetros calibrados para otimização. Assim, é comum retornar à Preparação dos Dados durante essa fase.
  • Avaliação: é construído um modelo que parece ter grande qualidade de uma perspectiva de análise de dados. No entanto, é necessário verificar se o modelo atinge os objetivos do negócio.
  • Implantação: o conhecimento adquirido pelo modelo é organizado e apresentado de uma maneira que o cliente possa utilizar.

CRISP-DM neste Projeto

Fase 1 - Entendendo o negócio

Neste projeto, buscaremos prever se determinado cliente da empresa irá cancelar a contratação dos serviços da empresa. Tal previsão irá levar em considerações aspectos do cliente, como classe etária (idoso ou não), se possui companheiro(a), entre outros fatores.

Fase 2 - Entendendo os dados

O entendimento dos dados será realizado através dos tópicos de “Aquisição dos Dados” e “Dicionário de Variáveis”

Fase 3 - Preparação dos Dados

Os dados serão preparados por meio do split de dados, análise exploratória à fim de verificar possíveis irregularidades no dataset, e por fim a criação do pipeline.

Fase 4 - Modelagem

Criação dos seguintes modelos:

  • Decision Tree
  • Stochastic Gradient Descent (SGD)
  • XGBoost
  • Regressão Logística
  • LightGBM

Apesar de o código ter sido desenvolvido, não foram utilizados os modelos:

  • Random-forest Classifier
  • Support Vector Classifier - SVC

Tais modelos levaram um tempo excessivo de treinamento, e, além disso, os resultados dos modelos anteriores foram bastante satisfatórios.

Fase 5 - Avaliação

Será realizada através da comparação do desempenho entre os modelos acima. Por se tratar de uma aplicação cuja abordagem é a aprendizagem supervisionada, a fase de avaliação não incorrerá em grandes problemas. A medida adotada será o “Recall”.

Fase 6 - Implantanção

Não será feito o deploy do modelo, pois este não se trata de um projeto com fins comerciais.

Como selecionar as métricas de avaliação? E qual o motivo de escolhermos o Recall?

Existe uma frase atribuída à William Thomson, o Lord Kelvin, físico irlandês que criou a escala Kelvin, muito importante na física. Esta frase diz: “Não se pode melhorar aquilo que não se aprende”.

Dentro do mundo da Ciência de Dados, não é diferente, precisamos medir o desempenho de nossos modelos de Machine Learning de forma a conseguirmos melhorá-los.

Como nosso problema é do tipo “Classificação”, usando a abordagem “Aprendizagem Supervisionada”, podemos optar por utilizar a acurácia, precisão, recall, ou f1-score, sendo esta última uma média harmônica da precisão e do recall.

Tipos de Erros

Para que seja possível entender os tipos de erros possíveis em uma tarefa de classificação por aprendizagem supervisionada, precisamos entendenr a matriz de confusão.

  • TP - True Positive: Quando o usuário não é churn e o modelo classifica como não sendo churn.
  • FP - False Positive: Quando o usuário não é churn e o modelo classifica como sendo churn.
  • FN - False Negative: Quando o usuário é churn e o sistema classifica como não sendo churn.
  • TN - True Negative: Quando o usuário é churn e o modelo classifica como churn.

Acurácia

Mostra-se bastante eficaz e verossímil quando utilizamos dados balanceados. Como veremos, este não é o caso.

Recall

Mostra a proporção dos positivos encontrados com sucesso. Para dados desbalanceados, é uma boa opção.

Aquisição dos Dados

Os dados utilizados neste projeto foram originalmente disponibilizados na plataforma de ensino da IBM Developer, e tratam de um problema típico de uma companhia de telecomunicações. O dataset completo pode ser encontrado neste link. Apesar de não haver informações explícitas disponíves, os nomes das colunas permitem um entendimento a respeito do problema.

Bibliotecas Utilizadas

  • Scikit-plot: Visualização de dados. Imprescindível para a criação de Matrizes de Confusão.
  • Scikit-learn: Modelos de Machine Learning que serão treinados.
  • MissingNo: Facilita a visualização de dados ausentes.
  • Imbalanced Learn: Utilizada em datasets com dados desbalanceados, pois permite a utilização da técnica de sampling, que será explicada mais adiante.
  • XGBoost: Lib que possibilita a implementação de algoritmos de Machine Learning baseados em Gradient Boosting.
  • Pandas: Manipulação e Análise de dados
  • Pandas Profiling: Permite uma ganho de produtividade na fase da análise exploratória
  • Numpy: Processamento de Arranjos multi-dimensionais e Matrizes, além de funções matemáticas
  • Matplotlib: Visualização de dados e criação de gráficos
  • Seaborn: Similar ao Matplotlib, mas com opções mais interessantes de personalização de gráficos

Dicionário de Variáveis

  • customerID: identificação única do usuário na empresa.
  • gender: gênero do usuário.
  • SeniorCitizen: Se o cliente é idoso ou não.
  • Partner: Se o cliente possui acompanhante ou não.
  • Dependents: Se o cliente possui dependentes.
  • tenure: Período em que o cliente está na empresa.
  • PhoneService: Se o cliente optou por serviços telefônicos.
  • MultipleLines: Se o cliente possui múltiplas linhas de telefone.
  • InternetService: Se o cliente optou por serviços de internet.
  • OnlineSecurity: Se o cliente optou pelos serviços de segurança na internet.
  • OnlineBackup: Se o cliente optou por serviços de backup na internet.
  • DeviceProtection: Se o cliente optou por serviços de proteção de seu equipamento.
  • TechSupport: Se o cliente optou por serviços de ajuda técnica na internet.
  • StreamingTV: Se o cliente optou por serviços de streaming na TV.
  • StreamingMovies: Se o cliente optou por serviços de streaming para Filmes.
  • Contract: Tipo de contrato do cliente (mensal, anual ou de dois anos).
  • PaperlessBilling: Se o cliente optou pelo faturamento online.
  • PaymentMethod: Forma de pagamento (cheque eletrônico, transferência bancária e cartão de crédito).
  • MonthlyCharges: Recargas mensais.
  • TotalCharges: Recargas durante todo o período em que o cliente está na empresa.
  • Churn: Se o cliente abandonou a empresa.

Análise Exploratória

A Análise Exploratória é um primeiro contato com o dataset no qual estamos trabalhando. Para isso, faz-se necessário verificar como os dados estão dispostos, além de buscar possíveis tratamentos que devam ser feitos.

O uso do Pandas Profiling nos permiteu ganhar velocidade na análise exploratória dos dados. Foi possível visualizar que, para este dataset:

  • Existe uma ALTA CORRELAÇÃO entre tenure e TotalCharges, o que faz bastante sentido, pois quanto mais tempo um cliente está na empresa, mais terá remunerado a empresa pela prestação dos serviços
  • Existe uma ALTA CORRELAÇÃO entre Partner e Dependent, o que também faz sentido, uma vez que são fatores que, naturalmente, caminham juntos.
  • customerID possui uma distribuição uniforme, o que nos faz perceber que é um valor único utilizado para identificar unicamente cada usuário, bem como se encontra no dicionário de variáveis.

Tamanho do Dataset

Resumo Estatístico do Dataset

Balanceamento de Churn

  • Churn ‘Yes’ representam 26.5370% do total de entradas; e
  • Churn ‘No’ representam 73.4630% do total de entradas.

Através da observação do gráfico do balanceamento da feature Churn, podemos observar que há um desbalanceamento leve, mas que pode interferir no desempenho do nosso modelo de Machine Learning.

Valores Ausentes

TotalCharges        0.001562
customerID          0.000000
DeviceProtection    0.000000
MonthlyCharges      0.000000
PaymentMethod       0.000000
PaperlessBilling    0.000000
Contract            0.000000
StreamingMovies     0.000000
StreamingTV         0.000000
TechSupport         0.000000
OnlineBackup        0.000000
gender              0.000000
OnlineSecurity      0.000000
InternetService     0.000000
MultipleLines       0.000000
PhoneService        0.000000
tenure              0.000000
Dependents          0.000000
Partner             0.000000
SeniorCitizen       0.000000
Churn               0.000000

Observamos que há uma quantidade pequena de valores ausentes para a variável TotalCharges. Mas que, na verdade, são de usuários recém-chegados à empresa. Optaremos por manter estes valores.

Histogramas das variáveis numéricas SeniorCitizen, Tenure, MonthlyCharges e Total Charges

O histograma das classes numéricas nos permite observar que há uma relativa distribuição uniforme na clase ‘Tenure’, fora dos extremos.

No entanto, nos pontos extremos, cabe uma análise mais aprofundada, como:

  • Houve, recentemente, alguma estatégia massiva do setor de marketing de captação de novos clientes?

Caso sim, esta estratégia pode levar a uma alta no número de novos clientes, e consequentemente um valor mais alto de ‘Tenure’ no início. Caso negativo, pode indicar um Churn elevado nos primeiros meses, provavelmente ocasionado pela insatisfação dos clientes logo nos primeiros meses de contratação do serviço.

Interessante observar que há valores elevados, considerados como outlier para os casos onde houve desistência do serviço. Este pode ser um indicativo, talvez, de erros em cobrança que podem levar a um cliente desistir da empresa.

Gender - Count e Gender versus Churn

Para a feature Gender, os dados estão relativamente balanceados. Não há, portanto, um ganho de informação relevante.

SeniorCitizen - Count e SeniorCitizen versus Churn

Para a feature SeniorCitizen, temos algo interessante: Apesar do menor número de cidadãos considerados como idosos, estes são os que mais desistem da continuidade na contratação dos serviços. Caberia então uma ação de marketing direcionada à esses usuários, de forma a tentar reverter a tendência de Churn.

Partner - Count e Partner versus Churn

Apesar do relativo balanceamento nas quantidades de usuários que possuem parceiros, os que não possuem parceiros possuem uma tendência de 12% a mais de desistirem (churn).

Dependents - Count e Dependents versus Churn

Para a feature Dependent, os dados estão relativamente balanceados. Não há, portanto, um ganho de informação relevante.

phoneService - Count e PhoneService versus Churn

Na feature phoneService, temos uma densidade de Churn praticamente igual entre os que contratam serviço de telefone e os que não contratam.

InternetService - Count e InternetService versus Churn

A densidade de churn está praticamente condizente com as quantidades de usuários das classes. A priori, não há como dizer algo sobre a relação da variável InternetService com a feature Churn.

Contract - Count e Contract versus Churn

Há algo interessante a se ressaltar: Os usuários que contratam o serviço por dois anos, são em quantidade pouco maiores que os que contratam por um ano. No entanto, estes últimos representam aproximadamente o triplo daqueles que desistem da contratação dos serviços.

É algo que podemos julgar como natural, já que as pessoas que contratam um serviço por muito mais tempo (2 anos), possuem uma confiança no trabalho desenvolvido pela empresa e provavelmente um índice de satisfação mais elevado do que os outros.

Preparação dos Dados - Feature Engineering

Feature Engineering significa utilizar os dados para criar features novas para o dataset. Assim, há uma melhora na capacidade de previsão do modelo. Podemos nos valer de:

  • Discretizar variáveis contínuas
  • Decompor features (categóricas, data, tempo)
  • Aplicar transformações às variáveis
  • Agregar features para gerar novas

Buscando valores redundantes nas features

----- customerID -----
Valores únicos: 
['7590-VHVEG' '5575-GNVDE' '3668-QPYBK' ... '4801-JZAZL' '8361-LTMKD'
 '3186-AJIEK']

----- gender -----
Valores únicos: 
['Female' 'Male']

----- SeniorCitizen -----
Valores únicos: 
[0 1]

----- Partner -----
Valores únicos: 
['Yes' 'No']

----- Dependents -----
Valores únicos: 
['No' 'Yes']

----- tenure -----
Valores únicos: 
[ 1 34  2 45  8 22 10 28 62 13 16 58 49 25 69 52 71 21 12 30 47 72 17 27
  5 46 11 70 63 43 15 60 18 66  9  3 31 50 64 56  7 42 35 48 29 65 38 68
 32 55 37 36 41  6  4 33 67 23 57 61 14 20 53 40 59 24 44 19 54 51 26  0
 39]

----- PhoneService -----
Valores únicos: 
['No' 'Yes']

----- MultipleLines -----
Valores únicos: 
['No phone service' 'No' 'Yes']

----- InternetService -----
Valores únicos: 
['DSL' 'Fiber optic' 'No']

----- OnlineSecurity -----
Valores únicos: 
['No' 'Yes' 'No internet service']

----- OnlineBackup -----
Valores únicos: 
['Yes' 'No' 'No internet service']

----- DeviceProtection -----
Valores únicos: 
['No' 'Yes' 'No internet service']

----- TechSupport -----
Valores únicos: 
['No' 'Yes' 'No internet service']

----- StreamingTV -----
Valores únicos: 
['No' 'Yes' 'No internet service']

----- StreamingMovies -----
Valores únicos: 
['No' 'Yes' 'No internet service']

----- Contract -----
Valores únicos: 
['Month-to-month' 'One year' 'Two year']

----- PaperlessBilling -----
Valores únicos: 
['Yes' 'No']

----- PaymentMethod -----
Valores únicos: 
['Electronic check' 'Mailed check' 'Bank transfer (automatic)'
 'Credit card (automatic)']

----- MonthlyCharges -----
Valores únicos: 
[29.85 56.95 53.85 ... 63.1  44.2  78.7 ]

----- TotalCharges -----
Valores únicos: 
[  29.85 1889.5   108.15 ...  346.45  306.6  6844.5 ]

----- Churn -----
Valores únicos: 
[0 1]

No output acima, observamos que a feature MultipleLines, OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport, StreamingTV e StreamingMovies pode assumir os valores No, No phone/internet service e Yes. No entanto, o valor ‘No phone/internet service’ representa o mesmo que ‘No’. Desta forma, podemos efetuar o tratamento destas features.

Limpeza dos Dados

Nesta etapa, consertaremos ou removeremos outliers. Caso seja optado por preencher os valores faltantes, podemos utilizar os seguintes valores:

  • Zero
  • Média
  • Mediana
  • Frequência

No entanto, optamos por não tratar os outliers presentes na variável ‘TotalCharges’.

Seleção de Atributos

Trata-se da etapa onde há a eliminação dos atributos (features) que não contêm informações úteis

Feature Scaling

Total Features: 				21
Total de Features no processo de encoding: 	18
Features excluídas do processo de encoding: 	['customerID', 'SeniorCitizen', 'Churn']

Normalização e Balanceamento

Como visto anteriormente, existia um moderado desbalanceamento entre as classes, o que poderia comprometer a métrica de avaliação de desempenho do nosso modelo de ML. Desta forma, fazia-se necessário o balanceamento dos dados, obtido por meio de under-sampling.

Seleção do Melhor Modelo da Etapa de Validação

Conforme visto na classificação dos modelos, obtivemos uma grande diferença de desempenho entre o XGBoost e Decision Tree Classifier. O XGBoost nos forneceu uma métrica de 87% de recall, sendo considerado extremamente satisfatório.

Conclusão

  • O modelo XGBClassifier mostrou-se vencendor na escala de desempenho dos algoritmos, sendo capaz de prever corretamente 87% dos usuários verdadeiramente ‘Churn’, objetivo deste projeto.
  • Mais uma vez, o balanceamento dos dados e utilização de técnicas avançadas de Machine Learning nos mostra que, apesar de adicionarem etapas a mais no projeto, levam a um ganho satisfatório de desempenho
  • A utilização de dados de qualidade possibilitou um ganho na produtividade do projeto, apesar do desbalanceamento natural da feature ‘Churn’.

Por fim, convido você a conhecer um pouco mais do meu trabalho sobre Data Science no Medium e Linkedin.

REFERÊNCIAS

Luis Eduardo, Como Criar um Modelo para Predição de Churn. Disponível em: https://medium.com/neuronio-br/como-criar-um-modelo-para-predi%C3%A7%C3%A3o-de-churn-aa11b9feb8a6. Acesso em 28 de fevereiro de 2022.

Soham Naik, Churn Prediction - Commercial use of Data Science. Disponível em: https://www.analyticsvidhya.com/blog/2021/08/churn-prediction-commercial-use-of-data-science/. Acesso em 28 de fevereiro de 2022.

Adam Votava, Churn Prediction Model. Disponível em: https://towardsdatascience.com/churn-prediction-model-8a3f669cc760. Acesso em 28 de fevereiro de 2022.

Shearer C. The CRISP-DM model: the new blueprint for data mining. Disponível em: https://web.archive.org/web/20060624054212/http://www.crisp-dm.org/News/86605.pdf. Acesso em 28 de fevereiro de 2022.

VISHNU. Optimal Parameters for SVC using Gridsearch. Disponível em: https://www.kaggle.com/viznrvn/optimal-parameters-for-svc-using-gridsearch. Acesso em 10 de março de 2022.

Grid search with LightGBM example. Disponível em: https://stackoverflow.com/questions/50686645/grid-search-with-lightgbm-example. Acesso em 10 de março de 2022.

PATLOLLA, Vinay. How to make SGD Classifier perform as well as Logistic Regression using parfit. Disponível em: https://towardsdatascience.com/how-to-make-sgd-classifier-perform-as-well-as-logistic-regression-using-parfit-cc10bca2d3c4. Acesso em 10 de março de 2022.

TAVISH. Tuning the parameters of your Random Forest model. Disponível em: https://www.analyticsvidhya.com/blog/2015/06/tuning-random-forest-model/. Acesso em 10 de março de 2022.

KOEHRSEN, Will. Hyperparameter Tuning the Random Forest in Python. Disponível em: https://towardsdatascience.com/hyperparameter-tuning-the-random-forest-in-python-using-scikit-learn-28d2aa77dd74. Acesso em 10 de março de 2022.

PROVOST, Foster; FAWCETT, Tom. Data Science para Negócios: O que você Precisa Saber Sobre Mineração e Pensamento Analítico de Dados. 1. ed. Rio de Janeiro: Alta Books, 2016. 408 p. v. 1. ISBN 978–85–7608–972–8.