Previsão de Inadimplência no Mercado de Crédito

Leonardo Janes Carneiro
Somos Tera
Published in
11 min readApr 4, 2021

Um relato da evolução do aprendizado e absorção do conhecimento durante o bootcamp Data Science e Machine Learning da Tera. [Parte II]

Introdução

Da mesma forma como começamos o nosso primeiro artigo, continuamos vivendo num cenário de taxas de juros e de inflação baixas, com poucas alternativas atrativas de investimento e crises tanto econômica quanto sanitária. Esta última foi impulsionada pela pandemia de COVID-19 e desde o primeiro caso positivo registrado no ano passado temos visto um elevado número de demissões e falências em todo o Brasil.

Segundo pesquisa realizada pelo Sebrae, mais de 70% das empresas no Brasil já não relatavam situação financeira boa antes da eclosão da pandemia. Ainda de acordo com o estudo, 5,1 milhões de empresas já tentaram buscar auxílio financeiro por meio de empréstimos para se manterem em operação, mas apenas 567 mil foram atendidos, enquanto outros 1,5 milhão aguardam resposta.

Diante deste cenário, temos a FINTECH X (o nome verdadeiro será mantido em sigilo), empresa que alia finanças a tecnologia e se destaca no mercado por investir em crédito pessoal, que sempre teve amplo domínio de bancos tradicionais. Para manter os dados de seus clientes em sigilo e, mesmo assim, identificar o perfil de potenciais clientes entre bons e maus pagadores, a fintech constrói um questionário que busca avaliar diferentes aspectos psicológicos de seus clientes que podem estar associados a suas respectivas capacidades de honrar pagamentos.

Construindo a Solução

O modelo de previsão de inadimplência que a FINTECH X busca desenvolver para identificar o perfil de potenciais clientes utiliza como variáveis features as respostas às perguntas do questionário, que estão sendo coletadas inicialmente de clientes que já têm conta ativa. De um total de 15 questões, 10 são enviadas para cada cliente e suas respostas são, então, coletadas. Estas 15 questões fazem parte de um total de 10 construtos psicológicos:

  1. Intenção Maliciosa/Inocente;
  2. Significado do Dinheiro;
  3. Auto-eficácia;
  4. Locus de Controle;
  5. Auto-estima;
  6. Consumo Compulsivo/Comportamento de Consumo;
  7. Desconto de atraso (delay discounting);
  8. Impulsividade;
  9. Tríade escura/clara (Dark/Light Triad);
  10. Parâmetros de Risco Comportamental.

A partir das respostas coletadas, a fintech tem como objetivo principal desenvolver um modelo que identifique adequadamente clientes que tenham um perfil inadimplente. Caso a performance do modelo seja razoavelmente boa e, ao longo do processo de desenvolvimento do mesmo, sejam identificadas questões que revelem um maior ganho de informação a respeito do perfil dos clientes, seria interessante para a FINTECH X, também, utilizar estas questões que carregam maior poder preditivo como features do modelo a ser colocado em produção, com o intuito de se calcular a probabilidade de default associada a um determinado padrão de respostas a estas questões.

A ideia aqui é que o questionário composto pelas questões com melhor poder preditivo seja utilizado no processo de aprovação de crédito de um potencial cliente. Neste caso, a aprovação/rejeição do empréstimo será baseada na probabilidade de default gerada pelo modelo a partir das respostas às perguntas com maior poder preditivo, coletadas do potencial cliente.

Assim que recebemos o dataset da FINTECH X, salvo em um arquivo em formato .csv, iniciamos uma análise exploratória dos dados (EDA) utilizando diversas técnicas aprendidas durante o curso da Tera:

  1. Utilizamos um Jupyter notebook não só para realizar esta etapa de EDA, mas também para seleção de features do modelo.
  2. As principais bibliotecas utilizadas na etapa de EDA foram pandas, matplotlib e seaborn, para gerar dataframes e visualizações que nos auxiliaram a extrair insights e identificar problemas na coleta dos dados.
  3. Uma vez carregada a base de dados para o Jupyter notebook, iniciamos o processo de inspeção e limpeza dos dados com os métodos head, info, shape, isna, loc, drop.
  4. Usamos as funções countplot e boxplot, da biblioteca seaborn, para gerar visualizações das distribuições das respostas coletadas para cada uma das 15 perguntas do questionário aplicado pela FINTECH X.

Ao final do EDA, identificamos uma vasta quantidade de observações nulas presentes no dataset, que dificultaram o desenvolvimento do nosso modelo de Machine Learning para classificação de clientes. Mesmo assim, construímos uma métrica que nos auxiliou na seleção das melhores features para este modelo. Detalhamos abaixo a construção desta métrica.

Identificação das Melhores Features

No artigo publicado anteriormente, identificamos dois problemas que não nos permitiram treinar adequadamente um modelo de classificação de clientes:

  1. O dataset apresentou uma vasta quantidade de observações nulas (aproximadamente 85% das observações presentes no dataset correspondem a valores nulos).
  2. Havia um leve desbalanceamento na nossa variável de interesse: cerca de 21% das observações presentes no dataset correspondem à classe positiva (default) e 79% correspondem à classe negativa (no-default).

Diante destes problemas, não foi possível treinar adequadamente um modelo de classificação de clientes. Não obstante, fomos capazes de construir um método de seleção de features para se utilizar posteriormente, assim que for coletado um dataset mais robusto. Detalharemos abaixo a construção da métrica utilizada.

Seleção das Features

Ainda seguindo nosso artigo anterior, utilizamos o algoritmo de regressão logística com 2 valores distintos para o hiperparâmetro de class_weight:

  1. Dicionário com peso igual a 1 para a classe majoritária e peso 5 para a classe minoritária;
  2. 'balanced', que cria pesos inversamente proporcionais ao número de observações de cada classe

Com estes modelos, geramos matrizes de confusão para cada questão individualmente e examinar os valores calculados de True Positives (TP), False Negatives (FN) e False Positives (FP).

Tendo em vista que o objetivo da FINTECH X é prever inadimplência, é importante que o modelo consiga identificar corretamente os clientes pertencentes à classe default. Logo, buscamos maximizar os TP. Já a respeito dos FN e FP, queremos minimizar ambos, pois representam erros de identificação das classes.

No caso FN, ocorre quando o algoritmo não consegue prever corretamente o cliente do tipo bom pagador (no-default). É como se a FINTECH X concedesse empréstimo a um cliente mau pagador, por acreditar que se trata de um bom pagador. Neste caso, considerando uma larga escala, haverá um enorme prejuízo monetário associado ao valor do empréstimo e ao atraso no pagamento das parcelas do empréstimo concedido. Seria o "pior dos mundos" para a FINTECH X. Por isto, é importante minimizar a quantidade de FN.

Analogamente, para os FP, ocorre quando o algoritmo não consegue prever corretamente o cliente do tipo mau pagador (default). É como se a FINTECH X reprovasse uma concessão de empréstimo para um cliente que é bom pagador. Neste caso, a fintech está perdendo um cliente para a concorrência e, com isto, está perdendo mercado e deixando de faturar. Em aspectos monetários, o custo que a FINTECH X incorre neste caso é o chamado custo de oportunidade. Portanto, também queremos minimizar a quantidade de FP.

Logo, criamos a seguinte métrica, utilizada para rankear as 15 questões.

Critério de seleção de features

Aqui, o importante é maximizar esta relação. Se para aumentar o TP tivermos que aumentar os FP, ainda será melhor do que aumentar o FN.

Após treinados cada um dos modelos, obtivemos um total de 8 questões cujos valores calculados para as métricas tendem a infinito. Isto ocorreu, pois os valores de FN gerados foram iguais a zero. Isto é, o modelo identificou com perfeição as observações correspondentes a clientes do tipo default. Os algoritmos utilizados nestes casos em que o valor da métrica tendeu a infinito utilizaram como regra de balanceamento class_weight com peso 5 para a classe minoritária. Utilizamos como motivação para a escolha deste peso o custo anual associado ao denominador da razão acima.

Utilizamos como critérios de desempate no nosso ranking a quantidade de TP e a quantidade de FP: os modelos com maior número de TPs receberia um ranking maior e em caso de novo empate, os modelos com menor número de FPs seria favorecido. Com isto, identificamos a questão com melhor ranking e utilizamos no dataset correspondente a esta questão a técnica de balanceamento SMOTE.

Em seguida, utilizamos os algoritmos de LogisticRegression, XGBoost e GaussianNB para gerar novas matrizes de confusão, que servirão de base para comparação com o modelo de LogisticRegression utilizando class_weight com peso 5 para a classe minoritária.

Comparação de Técnicas de Balanceamento

De acordo com a configuração padrão do algoritmo SMOTE, este aplica reamostragem na classe minoritária (classe default, no nosso caso) por meio de interpolação. Criamos uma instância com hiperparâmetros conforme configuração padrão do algoritmo e utilizamos o método fit_resample no dataset de treino da questão mais bem rankeada, conforme codificação abaixo:

Implementação da técnica SMOTE

Para evitar um erro na utilização do método fit dos modelos em casos em que há apenas uma feature no dataset de treino, tivemos que aplicar o reshape da biblioteca numpy.

Em seguida, treinamos os 3 modelos especificados acima, conforme código abaixo:

Treinamento dos modelos

Alguns aprendizados importantes obtidos ao longo do curso da Tera a respeito destas partes do código:

  1. Para fins de reprodutibilidade, é importante configurar algum valor de random_state que não seja o padrão None. Com isto, evitamos de obter resultados diferentes todas as vezes que se rodar estas linhas de código.
  2. A fim de se evitar overfitting e underfitting em modelos que utilizam árvores de decisão, ou florestas aleatórias, é considerada uma boa prática utilizar valores baixos do hiperparâmetro max_depth. No nosso caso utilizamos 2, que é o valor intermediário entre 3 e 1 (comummente associados a casos de overfitting e underfitting, respectivamente).

Finalmente, geramos as matrizes de confusão para estes modelos e observamos que nenhum foi capaz de zerar a quantidade de FNs (canto inferior esquerdo da matriz), conforme ilustrado abaixo:

Matriz de confusão da regressão logística
Matriz de confusão do algoritmo de XGBoost
Matriz de confusão do algoritmo GaussianNB

Logo, o modelo de regressão logística com hiperparâmetro de class_weight com peso 5 para a classe minoritária aparenta ser o melhor para prever clientes do tipo default. Não podemos concluir de maneira assertiva devido ao número de observações utilizadas no dataset de treinamento, bem como o fato de utilizarmos uma única feature.

Por outro lado, parece haver questões no nosso questionário com poder preditivo maior do que outras. Podemos aproveitar o exercício realizado neste projeto para selecionar as questões mais bem rankeadas de acordo com a métrica definida acima e os critérios de desempate e, assim que dispusermos de uma base de dados mais sólida, testaremos diferentes combinações destas questões para se encontrar o melhor modelo para classificação de clientes.

Próximos Passos

As primeiras linhas do dataset bruto correspondem aos clientes que entraram para a base de dados mais recentemente. Para muitos deles, não há informação a respeito de default, principalmente nos primeiros dias, quando ainda não houve tempo suficiente para ser detectado pagamento (ou atraso) da primeira parcela. Logo, com o passar do tempo, as informações nulas encontradas no dataset atual a respeito da variável nossa variável de interesse tendem a ser substituídas por 0 ou 1 (conforme cada caso).

Ademais, a cada mês, temos também um número maior de pessoas respondendo o questionário a eles enviado, aumentando assim, o número de observações não nulas nas variáveis features. Não sabemos quanto tempo deve levar para obtermos um dataset sólido, com o qual possamos treinar adequadamente um modelo de classificação de clientes, mas este seria nosso primeiro passo no futuro.

De posse de um dataset robusto, por outro lado, será interessante atualizarmos a etapa de EDA. Com mais informações disponíveis, será uma forma de validarmos nossos insights iniciais a respeito das variáveis features e, possivelmente, detectar novos padrões presentes nestes dados. No nosso artigo anterior, construímos uma matriz de correlação para examinar correlações nas respostas às questões, mas as observações nulas nos prejudicou um pouco nesta análise.

Com mais observações coletadas no futuro dataset, poderemos fortalecer a etapa de feature selection a partir da construção da matriz de correlação das questões e, possivelmente, eliminar aquelas que forem muito correlacionadas. Uma outra análise interessante, ainda, seria a separação do dataset por classe e examinar o padrão de respostas para cada uma delas. Se para uma determinada questão for detectado que cada grupo responde significativamente diferente em relação ao outro (valores concentrados nos dois extremos, por exemplo), poderá ser um indício de feature para se usar no modelo. Todas as hipóteses que surgirem nesta etapa deverão ser testadas posteriormente.

Foram sugeridas ao longo do curso da Tera outras técnicas de feature selection. Em algumas delas, no entanto, corremos o risco de perder interpretatibilidade das features. Como, o nosso objetivo principal é encontrar o modelo de classificação de clientes que obtenha as melhores métricas de avaliação de previsão, pode ser que seja necessário abrir mão da interpretatibilidade para que se encontre uma melhor versão do modelo. Porém, evitaremos estas técnicas, pois seria significativamente útil identificar questões que possam carregar um poder preditivo maior do que as outras. Trata-se de uma forma de otimizar as diferentes versões de questionário que já foram e estão sendo enviados no momento.

Para o treinamento do modelo, também foram sugeridas técnicas de pré-processamento de variáveis categóricas. Dado que as respostas para cada questão variam de 0 a 10, cada uma destas colunas do dataset representa uma variável numérica discreta ou uma variável categórica.

Como alternativa ao OneHot Encoding, fomos introduzidos a uma técnica chamada mean encoding. Trata-se de uma técnica que busca codificar variáveis categóricas por meio da média (ou outro valor estatístico) da respectiva variável. Trata-se de uma técnica que não estudamos durante o curso. Portanto, demandaria tempo para entendê-la apropriadamente e avaliar se pode se aplicar ao nosso caso, uma vez que se não utilizada com cuidado pode levar a overfitting dos dados.

Depois de treinado o modelo e validado-o com outros algoritmos candidatos, esperamos poder identificar aquele que obtenha a melhor métrica de avaliação de previsão. Em seguida, testaremos o melhor algoritmo com outros dados, ainda não utilizados, para checar overfitting. Apenas após concluídas todas estas etapas, teremos um modelo que estará pronto para ser utilizado pela FINTECH X para prever a probabilidade de default de um cliente em potencial e, com isto, decidir entre aprovar/reprovar um empréstimo a este potencial cliente.

Principais Aprendizados

  1. É importante conhecer a estrutura básica de um projeto de Ciência de Dados e entender a complexidade e a importância de cada uma de suas etapas;
  2. Inspecionar os dados, com a finalidade de entender seus diferentes tipos e saber com o que se está trabalhando é crucial para um projeto de Ciência de Dados;
  3. Os impactos causados pelas métricas de avaliação de modelos de previsão sobre as decisões de negócio diferem entre si. Devemos entender como elas podem ser utilizadas da melhor forma para auxiliar os tomadores de decisão;
  4. Estamos em constante aprendizado. O curso da Tera nos permitiu atualizar conhecimentos que já tínhamos e, ainda, aprender uma vasta diversidade de metodologias, técnicas e ferramentas que são as mais utilizadas no mercado. O que nos permitirá dar continuidade a este projeto e poderá nos impulsionar a desenvolver nossos próprios projetos no futuro.

Este é o último artigo da série cujo objetivo é relatar a evolução do aprendizado e absorção do conhecimento de Ciência de Dados durante o bootcamp da Tera, bem como sua aplicação no projeto realizado por Alexandre Doria, Miqueias Lima, Matteus Martins, Adams da Cruz e Leonardo Carneiro.

--

--

Leonardo Janes Carneiro
Somos Tera

Economist, aspiring data scientist. Looking for the right questions to ask.