Churn prediction de uma empresa de telecomunicações
Churn rate, ou simplesmente churn, representa a taxa de evasão da sua base de clientes. Em serviços como Spotify ou Netflix, ela representaria a taxa de cancelamento de assinaturas.
Ela é de extrema importância para a administração e sua análise ao longo do tempo pode mostrar que existe algum problema que deve ser atacado.
Churn também pode ser usado para identificar potenciais cancelamentos, com um tempo de antecedência, e promover ações direcionadas para tentar reter tais clientes. Essa métrica deve receber atenção pelo fato de que o Custo de Aquisição de Cliente (CAC) é normalmente mais alto que o custo para mantê-los. Ou seja, um alto valor para o churn rate é o que não desejamos.
Coleta 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.
Dicionário de variáveis
Análise exploratória dos dados
O dataset possui 7.043 dados e 21 variáveis. A primeira abordagem que iremos fazer é em relação a estrutura dos dados. Esta etapa é importante para entendermos os tipos das variáveis, se o conjunto de dados possui algum valor ausente e etc.
Vale destacar que não será considerado a variável customerID, porque não agrega valor no modelo de machine learning e na análise exploratória, já que serve para identificar um consumidor de forma individual.
A partir do dataframe gerado pelas informações das features do dataset, podemos notar que:
- Maior parte das features são do tipo categórica. É importante ressaltar que a variável binária também é do tipo categórica. Portanto, estas variáveis deverão passar por um tratamento para serem convertidas em valores numéricos antes de aplicar o modelo de machine learning;
- Podemos converter os valores “No internet service” e “No phone service” em “No”, transformando as variáveis em binárias, já que a partir de outras variáveis é possível transmitir a mesma informação;
- Não temos valores ausentes, o que é um ponto positivo;
- A variável TotalCharges está classificada como string ao invés de float e podemos notar que seu valor mínimo está com aspas vazias (“ “). Portanto, vamos ter que avaliar uma forma de substituir estes valores com aspas por numéricos e converter esta variável para float;
- A variável SeniorCitizen, apesar de estar classificada como inteiro, pode ser considerada como categórica, já que está tratada e possui dois valores numéricos para representar se o consumidor está aposentado (1) ou não (0);
- Churn é a variável alvo que queremos predizer através do modelo de machine learning.
Diante destas informações, foram realizados os ajustes para converter os valores do “No internet service” e “No phone service” em “No”. Além disso, foi verificado que existia uma relação entre a variável tenure e TotalCharges em que os valores vazios (“ “) estavam associados a tenure igual a zero (0), portanto, estes valores foram substituídos por 0 e a variável convertida para float.
Vamos plotar o gráfico de barra das variáveis categóricas em relação a variável que iremos prever (churn). Vale destacar que para fins de análises, foram considerados os dados originais, ou seja, sem a transformação do “No phone service” e “No internet service” em “No”.
A partir dos gráficos, podemos concluir que:
- O gênero dos consumidores estão balanceados tanto em termos de quantidade de homens e mulheres quanto em quantidade de churn;
- Clientes que não são casados e não possuem dependentes tem maior probabilidade de abandonar os serviços;
- O pacote oferecido de internet gera uma maior probabilidade de clientes abandonarem o serviço. Como podermos observar, cliente que não possuem internet tendem a permanecer mais tempo com a empresa. Vale destacar também que os clientes buscam sempre pacotes que ofereçam o melhor custo benefício, por isso, quanto menor o benefício oferecido (backup online, suporte técnico, streaming e etc) menor as chances de reter o cliente;
- A qualidade do serviço deve ser considerada na estratégia de reter o cliente, pois podemos observar uma taxa de churn considerável para os consumidores que possuem streaming e internet de fibra ótica;
- Contratos de serviço mais arriscados (month-to-month) tendem a gerar uma taxa de churn maior;
- A forma de pagamento do tipo eletrônico check e cobrança de pagamento que não utilizam papel tende a aumentar a probabilidade de clientes abandonarem o serviço.
Vamos avaliar o histograma das variáveis numéricas com intuito de extrair alguns insights.
A partir dos histogramas, podemos notar que:
- As variáveis tenure e TotalCharges estão relacionadas indiretamente e transmitem o mesmo insight. Portanto, estas variáveis representam a fidelização do cliente, ou seja, quanto mais tempo uma pessoa for consumidora da empresa, maior a taxa de retenção do cliente;
- Quanto mais caro for a mensalidade pelo serviço, maior a chance de perder o cliente. Como havíamos comentado na análise das variáveis categóricas, os consumidores irão buscar sempre um serviço/produto que tenha o melhor custo e benefício.
O próximo passo é avaliarmos se os dados estão balanceados em relação a variável alvo (churn).
Como mostrado no gráfico, os dados relacionados com a variável alvo churn está desbalanceada, visto que apenas 26,54% dos dados totais estão relacionados com consumidores que cancelaram o serviço.
Isto gera um problema durante a predição do modelo de machine learning, porque é mais cômodo para o algoritmo classificar a maioria dos casos como no churn. Diante disto, será necessário balancear amostra. Este passo será mostrado e explicado durante a fase de preparação dos dados.
Modelo de machine learning
Antes de iniciarmos qualquer processo para avaliar o melhor modelo de machine learning para o problema envolvendo churn prediction, temos que realizar uma preparação dos dados.
Preparação dos dados
Nesta fase iremos preparar os dados para permitir que possamos aplicar os variados modelos de machine learning. Portanto, o primeiro passo é transformar as variáveis categóricas em valores numéricos.
Para isso, utilizaremos LabelEncoder da biblioteca do Scikit-Learn para transformar as variáveis binárias em valores de 0 e 1. Enquanto, para as variáveis que são categóricas e não binárias, utilizaremos o método get_dummies do Pandas que funciona de forma similar ao OneHotEncoder do Scikit-Learn com algumas facilidades para agilizar o processo.
O próximo passo é dividirmos a base de dados entre treino e teste. Este passo é importante para ajustarmos os modelos de machine learning com base no dataset de treino, fazer todas as otimizações necessárias, escolher o melhor modelo com base na sua performance para que no final possamos validar o nível de generalização do modelo com base em dados desconhecidos (teste).
Além disso, para podermos dividir os dados em treino e teste, precisamos definir os valores de X (variáveis independentes) e y (Churn — variável alvo).
Vale destacar que a variável customerID, como mencionado anteriormente, não agrega valor para o modelo. Portanto, iremos retirar do dataset.
O próximo passo é balancear os dados para evitar que a predição fique enviesada e limite a capacidade do modelo em generalizar.
Esta etapa pode ser feita por duas maneiras, conforme indicado por Carlos Melo:
Over-sampling: cria novas observações da classe minoritária a partir das informações contidas nos dados originais. Essa geração de novas entradas pode ser feita aleatoriamente com o auxílio de técnicas de clustering ou sinteticamente.
Under-sampling: reduz o desbalanceamento do dataset focando na classe majoritária. Ou seja, elimina aleatoriamente entradas da classe com maior número de ocorrências.
Utilizaremos como base a técnica de under-sampling, devido a possibilidade de mantermos integralmente os dados originais associados a churn.
Vale destacar que é recomendado padronizar as variáveis numéricas para trazer os valores para uma escala padrão, já que alguns modelos de machine learning baseados em distância e gradiente não funcionam de forma adequada para valores com escalas muitos diferentes, podendo gerar um erro na predição. Portanto, estas variáveis passaram por este processo.
Escolha do modelo
Com as preparações dos dados, é possível aplicar os variados modelos de machine learning em busca daquele que atende a melhor métrica de avaliação para este problema.
Portanto, a métrica de avaliação escolhida para definir a melhor modelo de acordo com a performance no dataset de validação é o recall, porque para este problema queremos que o modelo seja capaz de maximizar os acertos de usuários possíveis de churn, independente do erro.
Utilizaremos os seguintes modelos para ajuste e análise:
- Regressão Logística
- Random Forest
- SVC
- KNN
- XGBoost
Estes modelos passaram por um processo de otimização dos hiperparâmetros através da aplicação do algoritmo GridSearchCV do Scikit-Learn que visa escolher o melhor conjunto de hiperparâmetros a partir de uma validação cruzada.
Após a otimização dos hiperparâmetros dos modelos escolhidos, vamos avaliar o melhor modelo com base na métrica recall obtida a partir do algoritmo de cross-validation do Scikit-learn.
A partir da validação cruzada, podemos notar que o modelo que melhor responde a métrica recall para o problema de churn é o SVC. Porém, vamos testar mais um modelo que é resultante de uma combinação entre mais de um estimador.
Este modelo é chamado de ensemble e para possibilitar melhor utilização, temos que considerar modelos que se baseiam em técnicas diferentes para predizer a variável alvo. Portanto, iremos usar como base os seguintes modelos:
- Regressão logística — Gradiente descendente;
- SVC — Encontra um hiperplano de separação entre as classes da variável alvo;
- KNN — Distância;
- XGBoost — Árvore de decisão.
Mesmo com a adição do método ensemble, o modelo SVC ainda continua sendo o melhor modelo com base na métrica recall. Portanto, o próximo passo é aplicarmos no dataset de teste para avaliarmos a capacidade de predição do modelo frente à dados desconhecidos.
Avaliação do modelo escolhido nos dados de teste
O próximo passo é avaliarmos a performance do modelo escolhido em relação aos dados de teste.
Conclusão
O modelo de machine learning escolhido se baseou na métrica recall com o intuito de acertar o máximo de churn em clientes que realmente cancelaram o serviço com a empresa de telecomunicações.
Diante disto, o modelo que melhor se adequou foi o SVC, alcançando um recall na validação cruzada de 91%. Vale destacar também que seu resultado no dataset de teste (96%) foi próximo ao de validação.
É importante ressaltar que o projeto tem margem para melhoria com feature engineering, feature selection e aplicações de outros modelos preditivos.
Com estas informações, é possível a empresa prever dentre aos novos dados de consumidores quais podem cancelar o serviço e buscar estratégias que antecipem e contribuam para reter e fidelizar o cliente.
Para maior detalhamento, este projeto se encontra em meu portfólio no github.
Siga-me para acompanhar novos artigos sobre data science e análise de dados. Até breve!
Fabio Ceruti