Dataset Original: Credit Score Classification (Kaggle)
A Data Girls Finance (uma fintech fictícia) tem como objetivo estratégico otimizar e automatizar a sua esteira de concessão de crédito. O propósito deste projeto é substituir a análise de risco manual por um modelo de inteligência artificial capaz de classificar de forma preditiva o score de crédito dos clientes em três categorias distintas — Poor (Ruim), Standard (Regular) ou Good (Bom) — a partir do seu comportamento financeiro e histórico de pagamentos.
O conjunto de dados original é composto por 100.000 registros distribuídos em 28 colunas, mapeando o histórico financeiro de até 8 meses para 12.500 clientes únicos (Customer_ID).
A análise e inspeção inicial identificaram inconsistências severas e ruidosas que mimetizam perfeitamente cenários de produção reais:
- Outliers Impossíveis: Registros na variável
Agecom idades negativas (ex:-500) ou centenárias inviáveis (ex:8698). - Campos Numéricos Corrompidos: Colunas puramente matemáticas como
Annual_Income,Outstanding_DebteMonthly_Balancecarregavam strings contendo caracteres especiais e sublinhados (ex:"40026.12_"ou"__10000__"). - Placeholders Mascarados: Valores ausentes preenchidos de forma oculta através de sequências de caracteres como
"_______","_"e"!@9#%8"nas colunas categóricas. - Formatos Inadequados: A variável temporal
Credit_History_Ageestruturada em formato de texto descritivo (ex:"22 Years and 1 Months") em vez de dados numéricos discretos.
Para garantir a robustez estatística e evitar o vazamento de dados (data leakage), o pipeline de pré-processamento aplicou as seguintes soluções ordenadas:
- Higienização Numérica por Expressão Regular (Regex): Extração cirúrgica de dígitos numéricos, separadores decimais e sinais negativos das colunas de texto corrompidas.
- Parsing Temporal: Conversão da string estruturada de
Credit_History_Agepara uma representação numérica contínua em quantidade de meses acumulados. - Filtros de Sanidade Lógica: Substituição de outliers fisicamente impossíveis (ex: idade fora da faixa de 18 a 100 anos, taxas de juros negativas ou número excessivo de cartões) por valores nulos (
NaN) para tratamento posterior. - Engenharia de Recursos (Feature Engineering): Criação da variável
Num_Loan_Typesextraída a partir da contagem de elementos descritos emType_of_Loan. - Imputação Avançada por Janela Agrupada (Moda e Mediana por Cliente): Como o dataset mapeia a evolução temporal de cada indivíduo, os dados faltantes de atributos fixos (como idade, renda anual e ocupação) foram primeiramente corrigidos usando a moda ou a mediana do próprio histórico daquele cliente. Somente após essa etapa foi aplicado um fallback com as medianas e modas globais da base, assegurando máxima fidelidade à identidade do usuário.
- Remoção de PII (Informações Pessoais Identificáveis): Exclusão das colunas
ID,NameeSSNpor critérios éticos de privacidade de dados e para evitar overfitting por identificação direta.
O projeto foi desenvolvido em ecossistema Python com foco em bibliotecas de análise de dados e Machine Learning:
- Pandas & NumPy: Manipulação matricial e limpeza.
- Matplotlib & Seaborn: Visualização de dados e Análise Exploratória (EDA).
- Scikit-Learn: Algoritmos de Machine Learning, divisão da base e avaliação de métricas (Regressão Logística, Random Forest).
- XGBoost: Modelagem preditiva baseada em Gradient Boosting de alta performance.
- SHAP (SHapley Additive exPlanations): Interpretabilidade de modelos do tipo "caixa-preta", permitindo explicações globais e locais das previsões de crédito.
O pipeline do projeto está dividido nos seguintes tópicos estruturados no arquivo principal:
- Leitura e exploração inicial dos dados.
- Limpeza e preparação avançada de dados corrompidos.
- Análise Exploratória (EDA) dos perfis de risco.
- Treinamento comparativo de modelos (Regressão Logística, Random Forest e XGBoost com busca de hiperparâmetros).
- Avaliação técnica multidimensional (Matrizes de Confusão, Feature Importance, F1-Score).
- Geração de relatórios com respostas às dores de negócio da fintech e recomendações práticas.
- Interpretabilidade do modelo através do framework SHAP (Explicações Globais e Locais).
No Random Forest, as variáveis mais relevantes incluem Outstanding_Debt, Credit_Mix, Interest_Rate, Delay_from_due_date, Credit_History_Age_Months e Changed_Credit_Limit.
No modelo campeão (XGBoost), Credit_Mix domina de forma ainda mais acentuada (~51% da importância total), seguida por Interest_Rate e Outstanding_Debt.
Ou seja, os dois modelos concordam no conjunto de variáveis mais relevantes, mas divergem bastante no peso relativo dado a cada uma.
O resultado reforça que o comportamento e o histórico de crédito fornecem sinais mais úteis do que a renda isoladamente.
A análise exploratória indica maior associação da classificação "Poor" com:
Credit_Mixdesfavorável;- maior utilização de crédito;
- maior quantidade de atrasos;
- taxas de juros mais elevadas;
- histórico de crédito mais curto.
3. Um modelo de Machine Learning consegue classificar o score de crédito dos clientes com boa performance?
Sim, porém com performance moderada.
Na execução realizada com divisão 80/20 por Customer_ID, o XGBoost tunado foi o modelo campeão, considerando o F1 Macro como métrica principal:
| Modelo | Accuracy | Precision Macro | Recall Macro | F1 Macro |
|---|---|---|---|---|
| XGBoost | 71,22% | 69,02% | 69,73% | 69,33% |
| Random Forest | 70,74% | 68,55% | 69,33% | 68,86% |
| Regressão Logística | 65,20% | 63,83% | 69,19% | 64,76% |
O XGBoost tunado apresentou o melhor resultado, com:
- Accuracy: 71,22%
- Precision Macro: 69,02%
- Recall Macro: 69,73%
- F1 Macro: 69,33%
O Random Forest tunado ficou muito próximo, com F1 Macro de 68,86% e Accuracy de 70,74%, enquanto a Regressão Logística tunada apresentou F1 Macro de 64,76%.
A diferença entre os três modelos tunados é relativamente pequena (menos de 5 pontos percentuais de F1 Macro entre o pior e o melhor). Isso indica que a fronteira de decisão entre as classes Poor, Standard e Good é genuinamente difícil com as variáveis disponíveis.
Portanto, o resultado sugere que a limitação não está apenas na escolha do algoritmo, mas também na quantidade e qualidade dos sinais presentes nos dados.
Os resultados podem apoiar a equipe de crédito em diferentes frentes:
Casos classificados com maior confiança podem ser priorizados, mantendo a revisão humana para casos de fronteira, nos quais o modelo apresenta maior incerteza.
Clientes classificados com maior probabilidade de pertencer à classe Poor podem receber uma análise mais detalhada.
Vale notar que, no modelo campeão, cerca de 30% dos clientes Poor reais ainda são classificados incorretamente como Standard ou Good. Esse volume relevante de falsos negativos de risco reforça a necessidade de revisão humana nos casos de fronteira.
A utilização de técnicas como SHAP pode auxiliar na identificação dos fatores que mais contribuíram para cada previsão, facilitando a auditoria e a comunicação dos resultados para a equipe de crédito.
A comparação final considera os três modelos tunados:
| Modelo | Accuracy | Precision Macro | Recall Macro | F1 Macro |
|---|---|---|---|---|
| XGBoost | 71,22% | 69,02% | 69,73% | 69,33% |
| Random Forest | 70,74% | 68,55% | 69,33% | 68,86% |
| Regressão Logística | 65,20% | 63,83% | 69,19% | 64,76% |
O XGBoost tunado foi o modelo campeão na execução registrada, superando o Random Forest por uma margem pequena (~0,5 p.p. de F1 Macro).
Os dois modelos baseados em árvores apresentam desempenho estatisticamente muito próximo e ambos superam a Regressão Logística.
A métrica principal utilizada é o F1 Macro, pois considera de forma equilibrada o desempenho das três classes: Poor, Standard e Good.
A seleção do modelo campeão é feita com base nos resultados efetivamente obtidos (results_df.iloc[0]), e não por uma escolha prévia de algoritmo.
Dessa forma, as seções de matriz de confusão, análise de falsos positivos e negativos e importância das variáveis também utilizam dinamicamente o modelo campeão, evitando que a análise apresente resultados de um algoritmo diferente daquele selecionado como melhor.
A análise de importância das variáveis é calculada dinamicamente sobre o modelo campeão, definido por results_df.iloc[0], e não fixada previamente em um algoritmo específico.
As variáveis:
Customer_IDNameSSNID
são removidas antes do treinamento e, portanto, não devem ser interpretadas como variáveis preditoras.
Na execução atual, o modelo campeão é o XGBoost. Os principais fatores observados em sua importância são:
Credit_Mix— apresenta peso muito superior às demais variáveis;Interest_Rate;Outstanding_Debt.
Esse resultado contrasta com o Random Forest, cuja importância é mais distribuída entre:
Outstanding_Debt;Credit_Mix;Interest_Rate;Delay_from_due_date;Credit_History_Age_Months.
Assim, os dois modelos concordam sobre o conjunto de variáveis relevantes, mas divergem quanto ao peso atribuído a cada uma.
Importante: a análise de importância das variáveis não substitui uma análise causal. Ela indica quais variáveis foram mais úteis para as previsões realizadas pelo modelo, mas não significa necessariamente que essas variáveis sejam as causas diretas do score de crédito.
Para mitigar o problema de "caixa-preta" dos modelos complexos e garantir a transparência exigida pelo setor financeiro, o projeto integra o framework SHAP (SHapley Additive exPlanations). Esta abordagem permite traduzir as decisões matemáticas em explicações compreensíveis para analistas de risco e clientes.
Para viabilizar a execução em ambientes de produção com restrição de tempo, a estratégia foi dividida em duas frentes:
- Análise Global Adaptativa: O cálculo da relevância geral das variáveis utiliza uma amostra controlada de 500 linhas do conjunto de teste (
X_test_shap), o que estabiliza as métricas de importância sem onerar o tempo de processamento. - Explicação Local em Tempo Real: A análise individual de um cliente é isolada e calculada sob demanda exatamente sobre a linha requisitada (
cliente_row), garantindo respostas instantâneas.
O pipeline identifica dinamicamente o algoritmo campeão (best_model) e adapta o interpretador adequado:
TreeExplainer: Para modelos baseados em árvores (RandomForestClassifierouXGBClassifier).LinearExplainer: Para modelos lineares (LogisticRegression), utilizando um background de 100 amostras do treino.Explainergenérico: Como fallback para outras arquiteturas.
- Gráfico de Barras Global (
summary_plot): Consolida o ranking das variáveis mais influentes nas previsões gerais do modelo através da média dos valores absolutos SHAP de forma multiclasse. - Summary Plot Visual: Demonstra a dispersão e a tendência de como valores altos ou baixos de uma determinada feature financeira impactam (positiva ou negativamente) a probabilidade de o cliente pertencer a cada classe de score de crédito.
- Waterfall Plot (Gráfico de Cascata Individual): Explica detalhadamente a jornada de decisão de um cliente específico. Ele exibe visualmente o valor base (base value) e como cada característica individual (ex: dívida atual, idade do histórico) empurrou a previsão para cima ou para baixo até chegar na probabilidade da classe final prevista (
Good,StandardouPoor).
Essa camada de interpretabilidade garante que a Data Girls Finance consiga cumprir regulações de crédito e justificar de forma clara o motivo da recusa ou aprovação de um limite financeiro.
Com base nos resultados obtidos, recomenda-se:
-
Utilizar o XGBoost tunado como candidato inicial, por ter apresentado o melhor F1 Macro na execução atual.
-
Manter o Random Forest como alternativa, pois apresentou desempenho muito próximo do XGBoost, com diferença de aproximadamente 0,5 ponto percentual de F1 Macro. Critérios de negócio, como custo computacional ou facilidade de explicação, podem influenciar essa escolha.
-
Manter a validação por cliente (
GroupShuffleSplit), evitando que diferentes registros do mesmo cliente apareçam simultaneamente nos conjuntos de treino e teste. -
Avaliar posteriormente uma validação cruzada por grupos, como
GroupKFold, para obter uma estimativa ainda mais robusta da capacidade de generalização do modelo. -
Criar uma faixa de revisão manual para previsões de baixa confiança, evitando decisões totalmente automatizadas em casos ambíguos.
-
Monitorar possíveis mudanças nos dados (data drift) e reavaliar periodicamente o modelo utilizando dados mais recentes.
-
Utilizar SHAP para explicabilidade, apoiando processos de auditoria e comunicação dos fatores associados às previsões.
-
Testar a robustez da variável
Credit_Mix, avaliando o impacto de sua remoção e treinando novamente o modelo para verificar quanto o desempenho depende dessa variável. -
Evitar o uso de identificadores como variáveis preditoras, mantendo
Customer_IDapenas para agrupamento e operações relacionadas ao histórico dos clientes.