Parte II: Como aplicar Machine Learning para reduzir o Churn

Parte II: Como aplicar Machine Learning para reduzir o Churn
Empresas que têm a cultura data driven maximizam seus resultados através de informações extraídas dos dados. Ou seja, utilizam os dados para extrair informações e usam as informações para tomar as decisões.

“Seus clientes mais insatisfeitos são sua maior fonte de aprendizado” (Bill Gates).

A taxa de retenção de clientes é um bom indicativo de qualidade do seu produto/serviço. Se o produto/serviço não é de qualidade, você irá observar uma porcentagem alta de clientes deixando de comprar ou trocando de empresa, ou seja, uma alta taxa de Churn.  Mas quais são as características que leva um cliente a dar o Churn?

Para esse projeto de Data Science seguiremos essas etapas

  1. Entendimento do Problema
  2. Obtenção dos dados
  3. Análise Exploratória e Visualização dos dados
  4. Pré-processamento
  5. Modelos de Machine Learning
  6. Avaliação do modelo

Na parte I, desse tutorial, entendemos o problema de Churn e estabelecemos os objetivos,

  • Identificar o perfil dos clientes que deram Churn.
  • Identificar os clientes em risco de Churn.

Agora nessa parte II daremos continuidade a análise e para isso utilizaremos um conjunto de dados de uma agência bancária.

Se você tem dúvidas sobre o que é o Churn, corre lá para ler esse artigo. Ele te ajudará a entender a importância e o porquê estamos fazendo essas análises. Agora na Parte II, dessa série de artigos, vamos executar a etapa 2 e 3, ou seja, obter, explorar e visualizar os dados.

 Os dados utilizados aqui foram extraídos do Kaggle e são dados de clientes de uma agência bancária. Utilizaremos o Google Colab, o python na nuvem, para fazer as análises.

Permitindo o acesso do Google Colab ao Drive

Para importar os dados, que estão salvo no Google Drive, é necessário permitir o acesso do Colab. Para isso precisamos,
1. Rodar os comandos abaixo,
2. Clicar na URL que irá aparecer,
3.Permitir o acesso ao drive
4. Copiar e colar o código de acesso no Colab.
#Acesso ao drive 
from google.colab import drive 
drive.mount('/content/drive')

Importando o Conjunto de dados

Para fazer as análise é necessário ter um conjunto de dados, assim precisamos importar a biblioteca pandas para processar os dados.
#Importando a biblioteca pandas
import pandas as pd
##Importando o dataset
df= pd.read_csv('/content/drive/My Drive/kaggle_datasets/Churn_Modelling.csv') #importando um arquivo csv 
df.head(10) #visualizando as 10 primeiras linhas do dataset


No conjunto de dados temos as seguinte variáveis:

  • CustomerId: identificação do cliente;
  • Surname: sobrenome do cliente;
  • CreditScore: pontuação de credito, 0 alto risco de inadimplência e 1000 clientes com baixo risco de inadimplência;
  • Geography: país que o serviço é oferecido;
  • Gender: sexo do cliente;
  • Age: idade do cleinte;
  • Tenure: um indicativo de estabilidade no emprego, em que 0 significa pouca estabilidade e 10 muita estabilidade.
  • Balance: saldo da conta corrente;
  • NumOfProducts: número de produtos bancários adquiridos;
  • HasCrCard: se tem cartão de credito ou não, (Sim = 1 e Não = 0);
  • IsActiveMember: se é um cliente com conta ativa, (Ativo = 1) ;
  • EstimatedSalary: salário estimado;
  • Exited: cliente deixou de ser cliente do banco ou não (Churn = 1).

3. Análise Exploratória dos dados – Visão geral do conjunto de dados

Nessa etapa, iremos
  • Identificar o tipo de cada variável (numérica, categórica, temporal)
  • Identificar qual é a variável target (alvo) para o nosso problema
  • Exploração dos dados (medidas descritivas, distribuição das variáveis)
  • Visualizar os dados para identificar o perfil dos clientes que deram Churn

A.Identificando as variáveis presentes no conjunto de dados

Nessa etapa, o interesse é obter algumas informações sobre as variáveis, para isso utilizamos o método
pd.DataFrame.info(df);

Temos 14 variáveis e 10000 observações no dataset, além disso, temos variáveis do tipo inteiro, reais e objeto. Os dados se enquadram em duas categorias:

  • Variáveis categóricas: sexo, país, cartão de crédito, clientes ativos e saída do cliente.
  • Variáveis numéricas: escore do cliente, idade, tenure, balance, número de produtos, salário estimado.

B. Identificando a variável alvo

Nosso interesse é identificar o perfil de clientes que cancelaram o serviço com agência bancária e tentar prever clientes em risco de Churn. Assim a variável ‘Exited’ é a variável adequada para alcançar os objetivos propostos.

C. Análise exploratória dos dados

O comando ‘describe()’ fornece algumas medidas descritivas das variáveis, como média, mediana (quartil 50%), máxima, mínimo, desvio padrão, quartis e a contagem
df.describe()

Os clientes, dessa agência bancária, têm em média 39 anos, sendo a idade mínima de 18 anos e máxima de 92 anos. A pontuação de crédito fica em torno de 650 pontos e o índice médio de estabilidade de emprego é 5.

Os clientes têm em média $76.000 mil dólares na conta e possuem em média 1,5 produtos do banco. O salário médio anual estimado é de $100.000 mil dólares, 70% dos clientes possuem cartão de crédito e apenas 51% são ativos no banco, ou seja, fazem movimentação bancária constantemente.

Analisando a variável de Churn (‘Exited’), observa-se que 20% dos clientes romperam seu contrato com a agência bancária.

Distribuição das variáveis

Plotar a distribuição de cada variável, dá uma visão geral da mesma e possíveis outilers (valores discrepantes).
df.hist(figsize=(12,10));

Pelos histogramas concluímos:

  • A variável Idade possui uma distribuição assimétrica a esquerda, ou seja, a maioria dos clientes têm entre 30 a 45 anos e poucos clientes têm idade superior a 60 anos.
  • A  distribuição da variável Balance (saldo bancário), mostra uma inflação de clientes que têm pouco dinheiro na conta bancária, isso pode ser um indicativo que esses clientes possuem outra conta bancária.
  • A distribuição da variável Score do Cliente mostra uma leve assimetria a direita, indicando que os clientes têm um escore elevado.
  • A distribuição da variável Salário Estimado mostra que os valores estão uniformemente distribuídos. Ou seja, temos frequência parecidas entre os salários dos clientes e existem clientes com salários baixo, médio e alto.
  • A distribuição da variável Tenure (índice de estabilidade de emprego), mostra uma alta frequência no índice 10, ou seja, muitos clientes têm uma estabilidade alta. E uma baixa frequência no índice 0, de baixa estabilidade.
  • A distribuição da variável Número de Produtos indica que a maioria dos clientes têm 1 ou 2 produtos e poucos clientes têm 3 ou mais produtos.
  • A distribuição da variável Cartão de Crédito, indica que a maioria dos clientes possuem cartão de crédito.
  • A distribuição da variável Membro Ativo, mostra que temos um equilíbrio entre os clientes que movimentam a conta e os clientes que não possuem esse hábito de movimentar a conta.
  • E para finalizar, observa-se que poucos clientes cancelaram sua conta bancária (variável Exited).

Viu quanta informação conseguimos extrair da distribuição de frequência das variáveis.

Variáveis Numéricas

Agora vamos observar as distribuições de cada variável numérica em relação à variável resposta (alvo). Podemos observar que:
  • A evasão de clientes (cor rosa) é maior em pessoas com mais idade e com baixo escore.
  • E quanto maior o número de produtos bancários, maior a taxa de evasão.
df['Exited_cat']=df['Exited'].replace([0,1],['Não','Sim'])
x_cont=['CreditScore','Balance','Age','EstimatedSalary','Tenure', 'NumOfProducts']
fig, ax = plt.subplots(1, 6, figsize=(22, 6));
df[df.Exited_cat == "Não"][x_cont].hist( bins=30, color="blue", alpha=0.5, ax=ax);
df[df.Exited_cat == "Sim"][x_cont].hist( bins=30, color="red", alpha=0.5, ax=ax);

D. Visualização de Dados – Qual o perfil de clientes que cancelaram o contrato (Churn)?

Nessa etapa faremos a análise visual dos dados e mostraremos como as técnicas gráficas são úteis para identificar as características dos clientes que cancelaram o serviço. Para construir os gráficos no Python, precisamos importar algumas bibliotecas

import numpy as np #  pacote algebra linear;
import seaborn as sns #visualização de dados;
import matplotlib.pyplot as plt#visualização de dados;

Para facilitar a configuração das cores dos gráficos, defini uma paleta de cores. Você pode utilizar as cores default dos gráfico, mas eu prefiro definir algumas cores que são mais agradáveis, ao meu ver.

df['Exited']=df['Exited'].replace([0,1],['Não','Sim'])
sns.countplot(data=df,x='Exited',palette=cols);

Observe que 20% dos clientes dessa agência bancária abandonaram o serviço. Vale ressaltar que existe um desbalanceamento em relação a variável de interesse, Exited. E ignorar essa desproporção, entre as classes, pode impactar os resultados da previsão do modelo, que será assunto para o próximo artigo.

Variáveis Categóricas

Primeiro vamos analisar as variáveis categóricas em relação a variável de saída (Exited). Utilizaremos gráficos de barras para esse fim. E os códigos para gerar os gráficos são:

#Sexo em relação a variável churn
x =df_plot['Gender']
y=df_plot['Exited']
plt.bar(x,y,color=cols);
plt.title('Taxa de Churn em relação ao Sexo');
plt.xlabel('Sexo');
plt.ylabel('Taxa de Churn');
  •  

Observa-se que:

  • As mulheres têm um risco maior de Churn do que os homens.
  • A porcentagem de Churn na Alemanha é bastante elevada, onde 32% dos clientes encerraram a conta no banco.
  • Espanha e França têm uma taxa de Churn parecidas em torno de 16%.
  • O cliente ter ou não cartão de crédito parece não influenciar no Churn.
  • A taxa de Churn é maior entre os clientes que não são ativos do que os clientes ativos, tendo uma diferença de aproximadamente 12%.

Variáveis numéricas

Para as variáveis numéricas utilizaremos variáveis de barras para variáveis discretas e gráfico de dispersão e box-plot para as variáveis contínuas. Também analisaremos a matriz de correlação para ver a correlação entre as variáveis. Selecionamos, primeiramente, apenas as variáveis numéricas e depois analisamos as correlações entre essas variáveis.
df_cont=df[['Age','Balance','Tenure','NumOfProducts','EstimatedSalary']] 
sns.heatmap(df_cont.corr(),annot = True, cmap='Blues');
 Analisando a correlação entre as variáveis, observa-se que temos baixas correlações. A maior correlação é entre as variáveis Número de Produtos e Saldo Bancário (‘Balance’) e temos uma correlação negativa de – 0,3 entre elas. Ou seja, quando menor o Número de Produtos maior o Saldo Bancário.

Variáveis quantitativas discretas

Agora vamos construir os gráficos para as variáves quantitativas discretas, como, ‘NumOfProducts’ e ‘Tenure’.

#Número de produtos em relação a variável churn
x =df_plot['NumOfProducts']
y=df_plot['Exited']
plt.bar(x,y);
plt.title('Taxa de Churn em relação ao Número de Produtos');
plt.xlabel('Números de produtos');
plt.ylabel('Taxa de Churn');
plt.xticks(x, (1,2,3,4));




Quanto maior o número de produtos maior a taxa de Churn.  O nível de estabilidade do emprego parece não influenciar a taxa de Churn. Porém, observa-se uma taxa de Churn um pouco mais elevada em clientes com índice de estabilidade 0 e 1.
Observação: Para alterar o eixo do gráfico utilize a função plt.xticks

Variáveis quantitativas contínuas

Para as variáveis quantitativas numéricas iremos construir box-plot, no box-plot conseguimos comparar os grupos e identificar observações discrepantes.

sns.boxplot(x="Exited", y="Balance", data=df,palette=cols);
plt.title('Box-plot da variável Saldo bancário');
plt.xlabel('Variável Churn');
plt.ylabel('Saldo Bancário');
df.groupby(['Exited'])['Balance'].mean()

  •  Clientes que cancelaram os serviços bancários possui um saldo bancários maior do que aqueles clientes que não cancelaram o serviço.
  • O salário estimado parece não influenciar no cancelamento ou não do serviço bancário.
  • Clientes que cancelaram o serviço têm uma idade maior do que os clientes que não cancelaram o serviço. E  observa-se a presença de outliers (pontos discrepantes).
  • A variável pontuação de crédito no geral não possui grandes diferença em relação ao Churn de clientes.
  • O box-plot dos clientes que cancelaram o serviço, possuí observações outliers na parte inferior e um limite inferior menor do que o boxplot dos clientes que não cancelaram o contrato. Indicando assim, que clientes que cancelaram o serviço possuem um score menor do que os clientes que não cancelaram o serviço.

Nas variáveis quantitativas contínuas podemos construir gráficos de dispersão para analisar a relação entre a taxa de Churn e as variáveis contínuas. Quando observamos o gráfico de dispersão da taxa de Churn em relação a pontuação de crédito, essa evidência fica mais clara, a taxa de Churn é maior entre os clientes com baixo escore de crédito. Ou seja, clientes com alto risco de serem inadimplentes também tem uma propensão maior de Churn.

Pelo gráfico de dispersão, entre a taxa de Churn e a idade, observa-se que pessoas entre 50 e 60 anos tem uma alta taxa de Churn e clientes com mais de 75 anos tem risco quase zero de abandonar os serviços bancários.

#Número de produtos em relação a variável churn
df_plot = df.groupby ('CreditScore'). Exited.mean (). reset_index () 
x =df_plot['CreditScore']
y=df_plot['Exited']
plt.scatter(x,y)
plt.title('Taxa de Churn em relação ao Score de Crédito')
plt.xlabel('Score de Crédito')
plt.ylabel('Taxa de Churn')

Conclusão Parte II – Visualização de Dados

Analisando o histórico de clientes, observamos algumas características entre os clientes que cancelaram o serviço.

Observa-se que os clientes com uma alta taxa de Churn são aqueles clientes

  • Da Alemanha,
  • Do sexo feminino,
  • Que não são membro ativo,
  • Com alto número de produtos,
  • Com score de crédito baixo,
  • Com saldo bancário elevado,
  • Com idade entre 50 e 60 anos.

Assim, clientes com essas características possui um risco maior de cancelarem o serviço bancário.

Nessa parte II, analisamos o perfil dos clientes que deram o Churn. A análise exploratória dos dados se mostrou extremamente útil para identificar o perfil de clientes que cancelaram os serviços.

Na parte III, dessa série de artigos, iremos implementar um modelo de Churn para prever os clientes com um alto risco de Churn.

Se ficou com alguma dúvida, deixe seu comentário e não se esqueça de rodar os códigos na sua máquina e começar a desenvolver na prática um projeto de Data Science.

O código completo se encontra aqui.

Tags: | |

Sobre o Autor

Juliana Scudilio
Juliana Scudilio

Doutora e Mestre em Estatística pelo ICMC-USP. Bacharel em Estatística pela UFSCAR. Founder e Data Scientist da flai. Apaixonada por dados e por ensinar.

0 Comentários

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *