Usando IA para Diminuir a Evasão de Clientes — Churn Prediction

Atualizado: 8 de abr.

Neste artigo, irei apresentar uma solução para o problema da evasão. Vou apresentar o passo a passo para que você veja que inteligência artificial e aprendizado de máquina pode ser útil para qualquer empresa, inclusive as menores… basta ter a matéria prima necessária, os dados.


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 ao longo do tempo sua análise 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 os manter. Ou seja, um alto valor para o churn rate é o que não desejamos.


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íveis, os nomes das colunas permitem um entendimento a respeito do problema.


Porém para facilitar o entendimento eu montei um dicionário das variáveis utilizando apenas os nomes de forma intuitiva.


Dicionário de Variáveis

  • customerID: ID do cliente

  • gender: Gênero do cliente

  • SeniorCitizen: Indicador da “melhor idade”

  • Partner: Possui algum parceiro

  • Dependents: Possui algum dependente

  • tenure: Tempo de permanência na empresa

  • PhoneService: Possui serviço de telefone

  • MultipleLines: Possui múltiplas linhas de telefone

  • InternetService: Qual tipo de serviço de internet possui

  • OnlineSecurity: Possui serviço de antivírus

  • OnlineBackup: Possui serviço de backup online

  • DeviceProtection: Possui serviço de proteção

  • TechSupport: Possui serviço de suporte

  • StreamingTV: Possui serviço de streaming de TV

  • StreamingMovies: Possui serviço de streaming de Filmes

  • Contract: Tipo do contrato

  • PaperlessBilling: Fatura impressa em casa

  • PaymentMethod: Forma de pagamento

  • MonthlyCharges: Valor da mensalidade

  • TotalCharges: Mensalidades totais pagas (Mensalidade * Tempo de Permanência)

  • Churn -> Status se o cliente cancelou o serviço no final de seu contrato (YES) ou ainda está na empresa (NO)


Análise Exploratória

Antes de mais nada, vamos conhecer um pouco do conjunto de dados. Saber a quantidade de entradas (linhas) e a quantidade de variáveis (Colunas) do conjunto de dados analisado é muito importante para planejar os próximos passos.


Agora, outra parte importante é verificar se o conjunto está completo ou se possui muitos dados faltantes. Abaixo podemos verificar que não temos nenhuma coluna sem dados… será mesmo?


Para ter certeza verifiquei o tipo de dado de cada coluna. Vejam que a maioria dos dados é do tipo “object”, porém, se olharmos mais os detalhes e compararmos os dados abaixo com os dados do dicionário no início deste artigo, podemos ver que a coluna “TotalCharges” possui dados numéricos do tipo float e não object.



Ao invés de tentar transformar essa coluna em float logo de primeira, vou fazer uma verificação para tentar descobrir o motivo dessa coluna não ser um float.


Agora sim, podemos ver acima que o menor valor é simplesmente um espaço em branco entre aspas. Para corrigir isso eu criei uma função que facilita a transformação de outas colunas com situações semelhantes.

Antes de aplicar a função na coluna TotalCharges, achei melhor criar um dataset “df_clean” para fazer todos os tratamentos necessários e preservar o conjunto de dados original.


Agora sim podemos ver a quantidade de entradas NaN encontradas na coluna TotalCharges.


Agora iremos verificar a distribuição da variável alvo (Churn). Abaixo podemos observar que temos um certo desbalanceamento, onde valores “no” são significativamente maiores do que “yes”. Isso também precisa ser tratado, pois futuramente pode prejudicar o modelo.


Faremos o mesmo processo para a variável “gender”. Neste caso é possível verificar que os dados estão bem distribuídos.


Para visualizar melhor as outras variáveis numéricas do dataset é muito útil plotar alguns gráficos de distribuição (Histogramas).


Com eles é possível observar que o TotalCharges (MonthlyCharges * Tenure) diminui com o tempo devido à baixa retenção dos clientes.


Outra variável interessante de ser analisada é a “tenure”, que significa o tempo que os clientes ficam com o serviço contratado. Logo de cara, podemos ver que a quantidade de clientes com 1 mês de serviço é bem significativa, porém essa quantidade cai drasticamente ao longo do tempo. Ou seja, realmente os novos clientes não estão ficando.


Preparação dos Dados


Após uma breve análise exploratória para conseguirmos entender um pouco dos dados, o que precisa ser tratado e tudo o mais, chegou a hora de começar a preparação do conjunto de dados para receber o modelo e fazer algumas previsões posteriormente.


Como vimos no início deste artigo, o conjunto de dados usado possui muitas variáveis categóricas, inclusive a variável alvo (Churn). A maioria dos modelos para classificação aceitam somente dados numéricos, por isso se faz necessário fazer essa transformação para que o modelo escolhido possa receber os dados corretamente.


Abaixo fiz primeiro a transformação da variável alvo, Churn, de No e Yes para 0 e 1.


Se repararmos bem nas descrições das variáveis, é possível identificar que a maioria delas são binarias (no e yes ou 0 e 1). Mas temos algumas dessas variáveis com valores redundantes. Por exemplo, a coluna MultipleLines que possui 3 valores, sendo um deles “No internet service” que pode ser agrupado com o valor “no”, tendo como resultado final 2 classes apenas, ”yes” e “no”.


Outro detalhe legal a ser considerado, é a variável tenure. Se ela representa o tempo que cada cliente está consumindo o serviço da empresa, os clientes com tenure 0 não passaram nem 30 dias com o serviço e cancelaram. Neste caso, irei remover esses clientes para que o modelo possa considerar somente aqueles que passaram mais de 30 dias com o serviço.


Agora iremos separar as variáveis numéricas e as categóricas. Além disso, iremos remover algumas outras variáveis que não fazem sentido e não agregam para a análise.


Nesta etapa irei tratar as variáveis categóricas através do ecoding, e fazer uma padronização nas variáveis numéricas.


Modelos de Machine Learning


Após fazer todas as preparações dos dados chegou a hora de dividir nosso conjunto de dados entre treino e teste, para assim fazer a aplicação dos modelos.


No começo do artigo, na análise exploratória, vimos que a nossa variável alvo estava bem desbalanceada, e aqui iremos aplicar o processo de balanceamento.


Dados Balanceados!! Vamos partir para a próxima etapa, que é a definição dos parâmetros. Essa fase melhora consideravelmente a performance dos modelos… e falando em modelos o primeiro que irei testar será o DecisionTree.


DecisionTree — Arvore de Decisão


E para avaliar, abaixo temos o resultado da performance que foi de 0,81 com os seguintes parâmetros:

  • classifier__criterion’: ‘entropy’

  • classifier__max_depth’: 4


XGBoost


Agora iremos aplicar o mesmo processo só que usando o modelo XGBoost


Agora, tivemos um resultado bem melhor, 0,87. Os melhores parâmetros encontrados foram:

  • classifier__gamma’: 0

  • classifier__learning_rate’: 0.005

  • classifier__max_depth’: 2

  • classifier__n_estimators’: 100

  • classifier__subsample’: 0.5


LogisticRegression


E por último o modelo de regressão.


Que teve um resultado de 0,80 com os seguintes parâmetros:

‘classifier__C’: 1.0


Conclusão


O que podemos concluir desse pequeno estudo?


De 3 modelos que utilizamos para prever o Churn, o melhor em termos de performance foi o XGBoost com 87%. Isso significa que a cada 100 clientes com pretensões de cancelar o contrato o modelo previu 87 corretamente.


Antes disso, vimos também que outros processos são necessários e fundamentais em projetos de Machine Learning, que a limpeza e preparação da base de dados antes de receber qualquer tipo de algoritmo/modelo ajuda o processo.



E o mais importante, viu como não é nada monstruoso utilizar a inteligência artificial para solucionar um problema de negócio? Obviamente, cada empresa possui um cenário diferente da outra, alguns cenários mais simples, como este projeto, e outros mais complexos, mas o principal toda empresa tem: os dados.

Tomara que este artigo tenha ajudado de alguma forma! Se gostou deixe um comentário contando sobre suas dúvidas e sugestões, e leia mais artigos do Gabriel aqui mesmo no Gestão com dados. Até a próxima!💜🔎💻