top of page

Machine Learning for Prediction of Credit Card Churn 

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.

​

codetoimg-snippet (75).png
output.png

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.

codetoimg-snippet (76).png

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.

codetoimg-snippet (77).png

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".

codetoimg-snippet (78).png

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: 

codetoimg-snippet (79).png
obrabo.png

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:

codetoimg-snippet (80).png
codetoimg-snippet (81).png

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.

Captura de tela 2024-10-19 191356.png

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.

codetoimg-snippet (82).png

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.

Decision Tree_feature_importances.png
Random Forest_feature_importances.png
XGBoost_feature_importances.png

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.

codetoimg-snippet (84).png

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.

matriz_confusao_Decision Tree.png
matriz_confusao_Random Forest.png
matriz_confusao_XGBoost.png

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. 

codetoimg-snippet (83).png

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).

bottom of page