PARTE 1
Introdução ao Conjunto de Dados
1 - Contexto de Negócio
Um gerente do banco está preocupado com o número crescente de clientes que estão deixando os serviços de cartão de crédito. Eles apreciariam muito se fosse possível prever quais clientes irão cancelar o serviço, para que possam agir de forma proativa, oferecendo um atendimento melhor e revertendo a decisão dos clientes.
Então, o gerente encontrou uma possível solução para o seu problema ao contratar Angel, um cientista de dados, para extrair insights a partir de um dataset por meio de análise exploratória de dados. Além disso, solicitou que Angel construísse um modelo de Machine Learning, capaz de prever, com base nos dados, se um cliente cancelaria ou não o cartão de crédito. e que entregasse também a precisão desse modelo.
2 - Dicionário de Dados
- CLIENTNUM: Número único de identificação do cliente que possui a conta.
- Attrition_Flag: Variável de evento interno (atividade do cliente
- Customer_Age: Variável demográfica - Idade do cliente em anos.
- Gender: Variável demográfica - Gênero do cliente
- Dependent_count: Variável demográfica - Número de dependentes.
- Education_Level: Variável demográfica - Grau de escolaridade do titular da conta
- Marital_Status: Variável demográfica - Estado civil
- Income_Category: Variável demográfica - Categoria de renda anual do titular da conta
- Card_Category: Variável de produto - Tipo de cartão (Blue, Silver, Gold, Platinum).
- Months_on_book: Período de relacionamento com o banco (em meses).
- Months_on_book: Período de relacionamento com o banco (em meses).
- Months_Inactive_12_mon: Número de meses inativos nos últimos 12 meses.
- Contacts_Count_12_mon: Número de contatos nos últimos 12 meses.
- Credit_Limit: Limite de crédito no cartão de crédito.
- Total_Revolving_Bal: Saldo rotativo total no cartão de crédito.
- Avg_Open_To_Buy: Linha de crédito disponível (média dos últimos 12 meses).
- Total_Amt_Chng_Q4_Q1: Mudança no valor das transações
- Total_Trans_Amt: Valor total das transações (nos últimos 12 meses).
- Total_Trans_Ct: Número total de transações (nos últimos 12 meses).
- Total_Ct_Chng_Q4_Q1: Mudança no número de transações
- Avg_Utilization_Ratio: Taxa média de utilização do cartão.
- Total_Relationship_Count: Total de produtos mantidos pelo cliente.
3 - Metodologia do Projeto
Neste projeto, optei por adotar uma metodologia de resolução de problemas de dados apresentada em um dos livros mais renomados sobre Machine Learning, o "Hands-On Machine Learning with Scikit-Learn & TensorFlow", de Aurélien Géron. Abaixo, estão os passos recomendados que seguirei durante a execução deste projeto:
- Olhe para a visão geral.
- Obtenha os dados.
- Descubra e visualize os dados para obter insights.
- Prepare os dados para algoritmos de Machine Learning.
- Selecione um modelo e treine-o.
- Ajuste seu modelo.
- Apresente sua solução.
- Lance, monitore e mantenha seu sistema.
4 - Requisitos de Solução do Projeto
Durante a conversa com o gerente, Angel perguntou quais eram as principais informações que ele gostaria de obter. Em resposta, o gerente definiu um conjunto de perguntas estratégicas relacionadas ao negócio, destacando aquelas que seriam essenciais para orientar as análises e decisões. Seguem as perguntas à serem respondidas:
- Qual é o perfil dos clientes com maior risco de cancelar o cartão?
- Como o gênero dos clientes afeta sua condição financeira e taxas de cancelamento?
- O nível de educação influencia a probabilidade de cancelamento do cartão?
- Clientes que usam mais o cartão recebem limites de crédito maiores ou menores?
- Clientes com salários altos estão mais propensos ao cancelamento de cartões?
- Quais comportamentos são comuns entre os clientes que cancelam seus cartões?
Além dessas perguntas, o gerente solicitou que Angel treinasse um modelo de Machine Learning com uma acurácia superior a 85%. Ele enfatizou a importância de escolher um modelo que seja facilmente interpretável, pois isso permitiria ao banco entender melhor o funcionamento do algoritmo e ter um maior controle sobre suas decisões.
- Desenvolver um modelo de Machine Learning com precisão superior a 85%.
- Identificar as principais características que influenciam o churn dos clientes.
- Garantir que o modelo seja facilmente interpretável (opcional)
5 - Informações Adicionais
Nessa página o projeto será tratada com uma visão de storytelling, caso seja melhor para o observador algo mais direto e detalhado, saiba que o notebook com qual este projeto foi completamente desenvolvido está contido no meu GitHub, que pode ser encontrado na parte inferior desse mesmo site, como todo outro projeto, com tudo isso dito, a próxima seção inicia a EDA (Exploratory Data Analysis), vamos mergulhar!
PARTE 2
Análise Exploratória de Dados
Nessa seção do projeto, realizamos uma análise exploratória de dados, focando em variáveis categóricas relacionadas ao comportamento dos clientes. Utilizamos visualizações gráficas para explorar padrões e correlações, permitindo uma melhor compreensão das dinâmicas de crédito e churn. Essas análises fornecem insights valiosos sobre o perfil dos clientes e suas interações com os produtos financeiros.
1 - Distribuição de Variáveis Categóricas
Esse código funciona criando 3 subplots que servirão como template para dois tipos de gráficos sobrepostos, um kdeplot e um histplot, ambos com matiz definida para o gênero do usuário, com uma paleta customizada, todos mostrando a densidade.
Idade dos Clientes: A média de idade dos clientes varia entre 30 e 60 anos.
Limite de Crédito: Os clientes, em média, possuem um limite de crédito entre 2.000 e 10.000 dólares. No entanto, destaca-se um número significativo de mulheres com limites de crédito na faixa de 2.000 a 5.000 dólares.
Tempo como Usuários: A distribuição do tempo de permanência dos clientes, em meses, apresenta uma tendência parabólica, com um notável aumento no número de clientes que possuem 37 meses de relacionamento.
2 - Relação entre Variáveis e Limite de Crédito
O código executa a agrupamento de cada uma das variáveis categóricas selecionadas em relação à média do limite de crédito, incorporando também a variável de churn para facilitar a análise na matiz futura. Para melhorar a visibilidade dos gráficos, estabeleci um limite arbitrário para o eixo y, baseado no menor valor de cada grupo, subtraindo 2000 do mínimo para uma melhor amostragem.
Dependentes: À medida que o número de dependentes aumenta, o limite de crédito tende a crescer.
Relacionamento: Clientes sem vínculos de relacionamento geralmente apresentam limites de crédito mais elevados.
Salário Médio: O limite de crédito aumenta quase linearmente com o salário do cliente.
Educação: Não há uma relação aparente entre o nível de educação do cliente e seu limite de crédito.
Produtos: Quanto menor a quantidade de produtos vinculados, maior tende a ser o limite de crédito.
Gênero: Homens possuem limites de crédito significativamente maiores em comparação às mulheres.
3 - Matriz de Correlação das Variáveis Numéricas
Este código seleciona apenas as variáveis numéricas e gera uma matriz de correlação utilizando o comando pandas.corr(). Com base nessa matriz, um heatmap é plotado utilizando a biblioteca Seaborn, onde cores mais escuras representam correlações positivas e cores claras indicam correlações negativas.
Months As Customer vs Age: Correlação forte (0.79); clientes mais velhos permanecem mais tempo.
Credit Limit vs Average Open To Buy: Correlação positiva (0.62); maior limite implica maior crédito disponível.
Total Transactions Amount vs Total Transactions Count: Correlação alta (0.81); mais transações geram maior valor total.
Average Utilization Ratio vs Credit Limit: Correlação negativa (-0.48); limites altos reduzem a utilização média.
Average Open To Buy vs Average Utilization Ratio: Correlação negativa (-0.54); maior crédito disponível reduz a utilização.
4 - Proporção das Categorias com Probabilidade de Churn
O código executa a agrupamento de cada uma das variáveis categóricas selecionadas em relação à média do limite de crédito, incorporando também a variável de churn para facilitar a análise na matiz futura. Para melhorar a visibilidade dos gráficos, estabeleci um limite arbitrário para o eixo y, baseado no menor valor de cada grupo, subtraindo 2000 do mínimo para uma melhor amostragem.
Relacionamento: A maioria dos clientes se divide entre solteiros e casados, com uma pequena porcentagem de divorciados. De modo geral, ser casado reduz a probabilidade de churn no cartão.
Salário Médio: Clientes com salários mais altos apresentam maior propensão ao churn.
Educação: Pessoas com níveis mais altos de educação tendem a ter maior probabilidade de churn.
Distribuição Geral: Para salário e educação, a proporção dos clientes segue o padrão esperado, alinhando-se com a distribuição natural desses fatores na população.
5 - Relação de Perfil do Cliente com Variáveis Financeiras
O código seleciona colunas financeiras relevantes, como limite de crédito, valor total de transações, e frequência de uso, com o objetivo de explorar a relação entre esses fatores e o perfil dos clientes, considerando idade e gênero. Para aprimorar a visualização, utilizamos uma paleta de cores personalizada que distingue gêneros de forma sutil.
Depois dos 30 anos, observa-se que as mulheres possuem um limite de crédito menor que o dos homens.
Em contrapartida, as mulheres fazem maior uso do cartão de crédito em comparação aos homens.
O valor médio das transações cresce progressivamente até os 50 anos, momento em que começa a declinar.
A utilização do cartão é estável entre as faixas etárias, com homens alcançando o nível das mulheres por volta dos 60 anos.
O número de transações se mantém constante até os 65 anos, a partir de quando começa a apresentar uma queda gradual.
6 - Relação do Tipo de Cartão com o Grau de Educação
Este código realiza uma análise visual da distribuição dos níveis de escolaridade em diferentes categorias de cartões, utilizando histogramas empilhados para cada tipo de cartão. Cada gráfico é refinado com uma paleta de tons de cinza e legendas organizadas, proporcionando uma visualização clara e comparativa.
A esmagadora maioria dos clientes possui cartão do tipo Blue, evidenciando sua popularidade entre os usuários.
Os níveis educacionais não apresentam uma influência significativa sobre a distribuição dos cartões Blue, Silver e Gold.
Proporção no Nível Platinum: No nível Platinum, observa-se um aumento considerável na proporção de membros com Doutorado e Pós-Doutorado, sugerindo que este cartão é mais comum entre clientes com formação avançada.
Educação Superior: A maioria dos clientes possui, pelo menos, um nível de educação superior, o que pode refletir um perfil de cliente mais qualificado e potencialmente mais propenso a utilizar cartões de crédito premium.
7 - Distribuição Estatística de Variáveis com Churn
Este código cria uma visualização abrangente da distribuição de variáveis-chave relacionadas ao churn de clientes, permitindo comparações visuais entre clientes que cancelaram e os que permaneceram com o serviço. Cada boxplot fornece informações sobre a mediana, a variabilidade e a presença de outliers em relação às variáveis analisadas.
A fidelidade dos clientes ao banco varia entre 20 e 55 meses, tanto entre cancelados quanto ativos.
Clientes que cancelaram fazem consideravelmente menos transações.
O outlier do grupo de cancelamento está dentro do IQR dos clientes ativos, destacando a diferença de comportamento.
Clientes ativos realizam transações de maior valor médio.
Apesar das diferenças, os limites de crédito são semelhantes, com os ativos tendo uma média ligeiramente superior.
PARTE 3
Tratamento do Conjunto de Dados
1 - Estratégias e Procedimentos
Tal como se faz uma limpeza em um quarto, ou uma sala, para realizar a limpeza num conjunto de dados é necessário ter um procedimento, você não pode começar passando a vassoura e depois jogando a água! Por isso, nesse e em outros projetos, costumeiramente eu sigo a seguinte ordem de ações: eliminação de colunas inúteis, identificação e remoção de valores nulos, identificação e remoção de outliers, criação de variáveis do tipo "dummies" e encodamento. Isso garante um dataset limpo e pronto para funcionar em uma modelo de ML.
2 - Tratamento de Valores Nulos
Conforme eu trabalhava com o dataset, percebi que não existiam valores "np.nan", que são os valores nulos que tradicionalmente trabalhamos, mas isso porque eles se apresentavam de outra forma, como "Unknown", por isso, eu criei uma função para trocar converter esses em "np.nan", facilitando o trabalho. Com isso, criei outras duas funções, uma que retornava um dataframe com a soma dos valores nulos para cada coluna e outra que gerava um gráfico de barras mostrando a porcentagem de valores faltantes por cada feature, isto é, coluna.
Perante esse gráfico, percebi que existiam poucas linhas com valores faltantes, porém como temos poucas linhas, não desejei dropar nenhuma linha com "np.nan", ao invés disso escolhi por preencher com o elemento da célula seguinte, e para ter maior taxa de acerto, antes ordenei pelo "Credit_Limit", para que as células estejam teoricamente mais próximas umas das outras, dito que essa coluna já se mostrou bem impactante.
3 - Tratamento de Outliers
Para realizar a identificação e remoção de outliers, utilizei o famoso método de John Tukey, que é o mesmo utilizado quando se cria um boxplot, para isso, criei uma função que retorna um dataframe já filtrado entre um limite inferior, e um limite superior, definidos pelo fator percentil da coluna que está lidando, selecionei as colunas que poderiam possui outliers, e apliquei o método à cada uma delas.
4 - Codificação de Variáveis Categóricas
Como última etapa, eu precisava fazer o "encoding" das variáveis categóricas para variáveis numéricas, mas como eu possuia consideravelmente poucas linhas, tentei utilizar o "pd.get_dummies" quão menos fosse possível, dito que ele cria colunas extras para cada tipo de célula, assim, fiz que apenas "Gênero" e "Status_de_Relacionamento" virassem dummies, criando 3 novas colunas, dito que "drop_first = True".
Em relação às outras categóricas, dito que havia uma ordem implícita de importância, isto é, é esperado que um cartão "Platinum" seja mais relevante que um cartão "Gold", eu estabeleci essa ordem em varias listas, e utilizei a função do sklearn.preprocessing para atribuir valores númericos para simular a ordem natural. Enfim, com o dataset completamente limpo, passamos para a criação dos modelos em ML.
PARTE 4
Previsões com Machine Learning
1 - Seleção Inicial de Modelo
Inicialmente, separei as variáveis em "features" e "prediction", no caso o "x" e o "y", usei um StandardScaler para garantir que a diferença entre as grandezas não afetaria o treinamento dos modelos, depois, escolhi alguns dos principais modelos de Machine Learning clássica para testar sua performance, tais como: DecisionTreeClassifier, RandomForest, XGBoost e outros que estão visíveis no código, e após realizar validação cruzada para garantir resultados certeiros, obtive isso:
Percebe-se que independente do modelo selecionado, os resultados se mostram positivos, com precisão acima de 87% em qualquer um dos modelos, porém, esses modelos foram criados com os hyperparameters padrões, que provavelmente não são os melhores para garantir a maior precisão, então decidi tunar 3 desses modelos, no caso XGBoost, pois é o modelo de maior precisão, também DecisionTreeClassifier e RandomForestClassifier, pois sua natureza permite uma melhor visão de como o algoritmo escolhe qual será o "y" de determinada linha, principalmente a DecisionTreeClassifier, então vamos tunar:
2 - Refinando a DecisionTreeClassifier
É importante ressaltar que nesse site apenas irei mostrar a tunagem de um dos modelos, dito que o processo é parecido e não seria interessante dizer as mesmas coisas 3 vezes seguidas, caso interesse, o código das outras está todo comentado no meu GitHub. Enfim, sobre a tunagem, utilizei o GridSearch para selecionar um dicionário de parâmetros para performar uma validação cruzada de 10 iterações, com uma conta simples, percebe-se que foram treinadas e avaliadas cerca de 50 mil árvores para achar os melhores parâmetros e garantir a maior precisão, oque provou-se um esforço ótimo, pois:
Nossa árvore de decisão saiu de 93.06% de precisão para 94.332%, oque pode parecer um salto pequeno, mas quando se trata de negócios, pode significar um aumento de milhares ou até milhões de dólares dependendo do tamanho e escopo de atendimento da empresa, por isso é fácil dizer que a tunagem foi um sucesso completo!
3 - Comparação entre Previsões
Constam aqui previsões em um conjunto de dados de teste que o modelo ainda não viu, utilizando os três modelos previamente otimizados, gerando arrays com os resultados. Em seguida, o código cria um dicionário para organizar e comparar essas previsões com os valores reais, que representam os rótulos verdadeiros do conjunto de teste. Enfim, o dicionário é convertido em um DataFrame para facilitar a visualização e a análise das diferenças.
Como indicaram os resultados da validação cruzada, as previsões estão alinhadas com a realidade, apresentando poucos erros. Nesta porção específica, o único erro ocorre na linha de index 3654, em que o DTC e o RFC previram que seria um cliente que não cancelaria o cartão, quando na realidade, como previu o XGB, era um cancelamento.
4 - Análise de Importância das Features
Utilizando a função feature_importances_, é possível determinar o grau de importância de cada coluna do dataset de treinamento, facilitando a identificação dos fatores mais relevantes a serem considerados. Essa análise pode orientar melhor a tomada de decisões pelos funcionários do banco. No código, são gerados três barplots horizontais usando uma combinação de enumerate e zip para obter, simultaneamente, o índice e iterar sobre ambas as listas.
Esses plots são interessantes para perceber como cada modelo possui seu próprio modo de entender as informações, contudo, existem alguns padrões claros, como a permanência de colunas como: "Average Open to Buy" e "Income Lvl", sempre no topo das análises, indicando que são colunas de extrema relevância, em contraponto existem outras que se encontram constantemente na base, como: "Education", "Dependents" e "Gender", oque demonstra que essas colunas são quase dispensáveis para a previsão do Churn de clientes, e provavelmente não alterariam o treinamento se removidas.
4 - Análise das Matrizes de Confusão
A matriz de confusão é essencial para avaliar o desempenho de modelos de classificação, pois fornece uma visão detalhada sobre verdadeiros positivos, falsos positivos, verdadeiros negativos e falsos negativos. Isso ajuda a identificar onde o modelo erra e como melhorar sua precisão. Este código plota as matrizes de confusão para três modelos de classificação: XGBoost, Decision Tree e Random Forest. Ele calcula cada matriz usando as previsões dos modelos e os rótulos verdadeiros, exibe-as em subplots e exibe cada figura com a paleta desejada e titúlo customizado com o nome do modelo.
Nas matrizes, é possível reparar resultados semelhantes, e também esperados baseado na acurácia dos modelos, com a DecisionTreeClassifier possuindo maior quantidade de falsos positivos e negativos, e o XGBoost possuindo a menor, isso explicita a importância supracitada das pequenas porcentagens, mesmo que o XGBoost possua poucos % de acurácia de vantagem, ele consegue evitar falsos positivos/negativos até 2.5x melhor que os outros, e assumindo em um chute baixo que um cliente do banco gere um lucro de $100, isso pode significar até $25.000 dólares de lucro extra.
5 - Visualização das Árvores de Decisão
O código visualiza as árvores de decisão de três modelos, utiliza "plot_tree" do Scikit-learn para DTC e um estimador aleatório de RFC, enquanto o XGBoost é visualizado com sua própria função. A figura é configurada com três subplots e os gráficos mostram a estrutura das árvores com um máximo de três níveis de profundidade, apresentando os nomes das features de forma legível, os gráficos completos estão disponíveis no GitHub.
6 - Insights e Conclusões do Estudo
Finalmente, após uma análise detalhada, reunimos uma ampla gama de insights que nos oferecem informações valiosas e abrangentes. Esses insights são mais do que suficientes para responder de maneira completa e fundamentada às questões que foram levantadas no início do projeto, e aqui constam as respostas:
Qual é o perfil dos clientes com maior risco de cancelar o cartão?
Clientes mais velhos, que realizam menos transações e têm limites de crédito semelhantes aos clientes ativos, apresentam maior risco de cancelamento.
Como o gênero dos clientes afeta sua condição financeira e taxas de cancelamento?
Mulheres costumam ter limites de crédito menores, mas utilizam seus cartões com mais frequência. Isso resulta em padrões de uso diferentes entre os gêneros.
O nível de educação influencia a probabilidade de cancelamento do cartão?
Pessoas com níveis de educação mais altos tendem a ter uma maior probabilidade de cancelamento de seus cartões
Clientes que usam mais o cartão recebem limites de crédito maiores ou menores?
Clientes que realizam mais transações frequentemente recebem limites de crédito maiores, pois o valor total de transações é diretamente relacionado ao limite.
Clientes com salários altos estão mais propensos ao cancelamento de cartões?
Clientes com salários mais altos mostram uma tendência maior ao cancelamento.
Quais comportamentos são comuns entre os clientes que cancelam seus cartões?
Clientes que cancelam tendem a fazer menos transações e têm um uso menos ativo do cartão em comparação aos que permanecem com o serviço.
Também cumprimos os requisitos para os modelos de Machine Learning, desenvolvendo três modelos que alcançaram uma precisão superior a 85%. Cada modelo vem acompanhado de uma análise detalhada das importâncias das características (features), o que possibilita identificar os principais fatores que influenciam as previsões de forma clara e eficaz.
Além disso, o modelo DecisionTreeClassifier atende ao requisito de alta interpretabilidade, destacando-se por sua estrutura simples, que permite visualização fácil, regras de decisão claras e diretas, utilizando apenas uma árvore. Diferente desses modelos mais complexos, como RandomForestClassifier e XGBoost, que utilizam múltiplas árvores de decisão (no caso do Random Forest) ou um conjunto de árvores com aprendizado adaptativo (no caso do XGBoost).