TG2 0
TG2 0
TG2 0
Trabalho de Graduação
2020
Orientador
Prof. Dr Paulo André Lima de Castro (ITA)
ENGENHARIA ELETRÔNICA
2020
REFERÊNCIA BIBLIOGRÁFICA
Alencar, Rafael. Uso de Machine Learning em análise de Crédito. 2020. 16f. Trabalho de
Conclusão de Curso. (Graduação em Engenharia Eletrônica) – Instituto Tecnológico de
Aeronáutica, São José dos Campos.
CESSAO DE DIREITOS
Rua H8-A,141
12228460, Saojose dos Campos -SP
1V
Gzed=ededAb/£~rfe
Prof. Dr Paulo Andr6 Lima de Castro (ITA)
Orientador
Agradecimentos
Gostaria de agradecer a todas as pessosas incríveis que conheci no ITA, as
amizades que fiz para a vida toda e e obrigado a todo o suporte e ejuda que vocês me
deran nesses anos. Tenho certeza que não estaria hoje realizando esse sonho se não
fosse a ajuda de vocês.
Gostaria de agradecer a toda minha família, que sempre apoiou meu sonho de
cursar o ITA e que independente de quantos anos levei para passar e me formar,
sempre me apoiaram nessa caminhada. Gostaria de um agradecimento especial ao meu
pai, Francisco Euripedes (Xicão), aos meus Imaos, Thiago e Matheus, as minhas tias,
Selma e Ana, a minha avó, Selma, que sempre estiveram comigo em todas as
dificuldades. Agradeço também a minha noiva, Lisliane Medeiros, que trilhou esse
caminho junto de mim e sempre me deu o apoio necessário, principalmente nos
momentos de maior dificuldade, te amo nega.
Por fim gostaria de agradece a minha Mãe, Marcia Aires de Alencar Lima, que
tanto me ensinou e me moldou, infelizmente ela me foi tirada ainda cedo e não pode
me ver realizar esse sonho, mas tenho certeza que ela esta acompanhando meus passos
e sempre olhando por mim.
vi
Resumo
Esse trabalho tem por objetivo apresentar uma possível solução aos elevados juros
no Brasil. Através de técnicas de machine learning iremos desenvolver um modelo de
Scorecard para classificar os eventuais tomadores de empréstimo. Com isso temos por
objetivo reduzir o índice de inadimplência, o que resultaria em uma diminuição da
taxa de juros praticada pelos bancos para empréstimos pessoais. Outro benefício é a
automatização do processo, o que permitiria maior agilidade e transparência no
processo, permitindo que o requerente ao empréstimo fizesse a operação toda online.
vii
Abstract
This work has the objective of presenting a possible solution to the high interest
rates in Brasil. Through the tecniques of machine learning a scorecard model wil be
developed to classify the credit borrowers. With this tool we intend to lower the
default rates, and by doing this, lowering the interest rates on the Market. Other
benefit is the automation of the process, allowing greater speed and transparency in the
process, allowing credit approval to occour online and in real time.
viii
Sumário
1. Introdução ....................................................................................................................... 10
1.2. Motivação ................................................................................................................. 11
1.3. Objetivo .................................................................................................................... 12
2. Conceitos Teóricos .......................................................................................................... 13
2.2. Breve resumo sobre Machine Learning .................................................................... 13
2.3. Métodos de Machine Learning ................................................................................. 13
2.3.2. Aprendizagem supervisionada .................................................................................................. 13
2.3.3. Aprendizagem não-supervisionada .......................................................................................... 14
2.3.4. Aprendizagem por reforço ........................................................................................................ 15
2.4. Algoritmo a ser utilizado .......................................................................................... 15
2.4.2. Regressão logística .................................................................................................................... 15
2.5. Processamento de dados ........................................................................................... 16
2.5.2. Limpeza dos dados .................................................................................................................... 16
2.5.3. Característica selection ............................................................................................................. 17
2.5.4. Data Transformation ................................................................................................................. 17
2.5.5. Característica Engeneering ....................................................................................................... 17
2.6. Linguagem de programação utilizada....................................................................... 18
3. Predição de Score de crédito.......................................................................................... 19
3.2. Exploração preliminar e divisão dos dados .............................................................. 20
3.3. Identificando a variável alvo .................................................................................... 20
3.4. Divisão dos dados ..................................................................................................... 21
3.5. Limpeza dos dados ................................................................................................... 21
3.6. Seleção das Características ....................................................................................... 22
3.7. Codificação One-hot e atualização do dataset teste.................................................. 24
3.8. Agrupamento WoE e Característica Engeneering .................................................... 24
3.8.2. O que é WoE e IV ...................................................................................................................... 24
3.8.3. WoE ........................................................................................................................................... 25
3.8.4. IV ............................................................................................................................................... 26
3.8.5. Característica Engeneering com WoE e IV dos dados ............................................................... 26
3.9. Treinando o Modelo ................................................................................................. 28
3.10. Previsão .................................................................................................................... 29
3.11. Desenvolvimento do Scorecard ................................................................................ 29
3.12. Cálculo dos scores de crédito para dataset de teste .................................................. 30
3.13. Setando o limite para aprovação de crédito .............................................................. 31
4. Conclusão ........................................................................................................................ 32
4.2. Trabalhos Futuros ..................................................................................................... 32
ix
5. Apendices......................................................................................................................... 33
5.2. Apendice 1 ................................................................................................................ 33
5.3. Apendice 2 ................................................................................................................ 34
5.4. Apendice 3 ................................................................................................................ 35
5.5. Apendice 4 ................................................................................................................ 35
5.6. Apendice 5 ................................................................................................................ 40
5.7. Apendice 6 ................................................................................................................ 40
5.8. Apendice 7 ................................................................................................................ 41
10
1. Introdução
No Brasil, ao longo de sua história, o sistema financeiro sempre foi muito regulado
e restrito, o que culminou num oligopólio do mercado de crédito, especialmente para
pessoas físicas, no qual a quase totalidade do crédito legal seja concedido por apenas 5
bancos.
Devido a falta de concorrência e outros fatores, alguns relacionados a regulações
no mercado de crédito, os juros no Brasil, a muito, são motivo de grande reclamação
dos brasileiros. Para se ter uma idéia, de acordo com o site agenciabrasil.ebc a taxa
média de juros para pessoa física em março de 2020 ficou em 46.1% a.a.
Um dos motivos dessa taxa de juros tão alta é o chamado spread bancário, que
nada mais é do que a diferença entre as taxas pagas pelo banco quando a pessoa faz
um investimento financeiro e os juros cobrados pelo banco quando alguém toma um
empréstimo.
Segundo dados do Banco Mundial, em 2016 o Brasil tinha o segundo maior spread
bancário do mundo, como pode ser visto na figura 1.2.
Um dos motivos do spread bancário ser tão grande, no Brasil, é porque o país está
entre os piores em termos de recuperação judicial de crédito.
Segundo o Banco mundial, no Brasil apenas U$0.13 são recuperados de cada U$1
emprestado – a metodologia considera o valor recuperado quando há execução de
dívidas. A média mundial está em U$0.34 por U$1. Essa baixa recuperação explica,
em parte, porque o spread bancário no país é tão grande.
11
figura 1.1 - Mapa mundi do spread bancário em 2016, segundo o Banco Mundial
1.2. Motivação
Devido a recuperação judicial de crédito no Brasil ser tão baixa, as instituições
financeiras acabam aumentando os juros para que no geral não tenham prejuízo ao
conceder empréstimos. O que acontece no final das contas é que as pessoas que pagam
seus empréstimos corretamente acabam pagando juros maiores do que deveriam, para
compensar as pessoas inadimplentes.
As instituições financeiras não estão confortáveis nesse cenário, pois se elas
cobram juros muito altos, menos pessoas estarão dispostas a fazer um empréstimo, e
as que o fazem tem uma chance maior de não cumprirem com suas obrigações
comparado com o cenário de juros mais baixos.
Por esse motivo as instituições tentam diminuir a taxa de juros que irão cobrar.
Para isso elas fazem uma análise de crédito do requerente com base em diversos dados
que elas possuem dele, como histórico financeiro, quantidade de dinheiro que ele tem
na conta, quais as garantias que ele pode apresentar, tudo isso para tentar reduzir o
risco de elas perderem dinheiro no negócio.
Entretanto essa análise encontra alguns problemas e limitações, por exemplo se a
pessoa não for cliente de longa data do banco, não há histórico financeiro ou ele é
muito recente para gerar uma análise robusta que indique a chance de inadimplência
com elevado grau de certeza. Outro problema é que toda essa análise hoje em dia é
12
feita quase que manualmente, não existe uma automatização, o que acaba por tornar o
processo muito lento e uma experiência negativa para o cliente.
Vivemos hoje na era digital onde as pessoas tem acesso a praticamente qualquer
serviço e informação ao alcance de seus dedos de forma instantânea. Assim a
motivação para esse trabalho vem de modernizar e automatizar a forma como é feita a
anlise de crédito no brasil, para que ele possa ser feito de forma segura e online.
Outra motivação é que o banco central do brasil recentemente criou um banco de
dados, o SCR, em que ficam armazenadas as informações referentes as operações de
crédito por CPF ou CNPJ. Mediante a autorização do portador do CPF ou CNPJ, as
instituições financeiras podem fazer consultas a esse banco de dados, permitindo
assim, uma analise mais verossimil do crédito a ser concedido a uma pessoa, mesmo
ela não sendo um cliente de longa data da instituição.
1.3. Objetivo
Utilizar machine learnig para realizar análise de crédito, gerando um score que
possa ser interpretado de forma simples e intuitiva pelos funcionários da instituição
financeira e assim agilizar e tornar mais transparente o processo de concessão de
crédito.
13
2. Conceitos Teóricos
2.2. Breve resumo sobre Machine Learning
Tradicionalmente, os programadores sempre desenvolveram sistemas
especificando cada passo em código, de forma clara.
Machine Learning (ML) é um subcampo da inteligência artificial que visa resolver
problemas mais complexos, dos quais os programadores ainda não têm um
conhecimento tão amplo.
Também se aplica quando é inviável mapear todas as variáveis e possibilidades.
Para essa finalidade, os sistemas são estimulados a solucionar problemas de forma
autônoma, aprendendo sobre eles e propondo uma saída.
Nesse contexto, os algoritmos analisam dados de entrada, processam e preveem
saídas possíveis dentro de um intervalo definido. No processo, eles tentam diferentes
abordagens e otimizam sua capacidade de chegar ao resultado.
Os sistemas em machine learning passam por duas fases: treino e execução. Na
primeira, são alimentados por um conjunto de entrada para que sejam contextualizados
com a situação específica que envolve o problema. Então, na segunda fase, eles
começam a deduzir os caminhos a partir do que aprenderam na etapa anterior.
Ou seja, o software já sabe quais entradas estão associadas com quais saídas, mas
precisa aprender um meio de entender essa associação.
Nesse processo, ele tenta identificar padrões e estabelecer previsões que ajudam a
otimizar a abordagem. Esse modelo tem esse nome porque é como se o operador
humano estivesse sempre dando assistência ao sistema, ensinando-o de uma forma
direta.
Os resultados desse tipo de algoritmo são geralmente marcados como classificação
e regressão. O primeiro diz respeito a uma forma de mapear elementos iguais em
categorias específicas, como no exemplo acima, “spam” e “não spam”. Já o segundo
consiste em identificar uma tendência para os dados que permite, inclusive, predizer o
futuro com base em dados históricos.
Logo, em colunas com baixa variância se deve avaliar caso a caso as colunas e só
depois decidir pela exclusão.
Dados duplicados
Linhas duplicadas devem ser deletadas dos dados utilizados, dado que são
redundantes.
Por exemplo: Discretizar uma variável contínua, como uma que expresse o salário
de um indivíduo, por faixa.
O heat-map das correlações cruzadas das variáveis pode ser visto na figura 3.4.
3.8.3. WoE
A fórmula para calcular o WoE é a seguiente:
3.8.4. IV
IV é calculado da seguinte maneira:
3.10. Previsão
Tudo se resume a isso: aplique o modelo de regressão logística treinado para
predizer a probabilidade de inadimplência no dataset de teste, que ainda não foi usado
até o momento, exceto para data cleaning and característica selection.
Então, iremos desenhar a curva ROC, curva PR, e calcular AUROC and GINI.
Nosso teste AUROC resulta em 0.866 com GINI de 0.732, ambos sendo considerados
bons scores de avaliação. AS curvas ROC e PR podem ser vistas na figura 3.9
O cálculo da área sob a curva PR deu 0.97, o que é um ótimo resultado, quanto
mais próximo de 1 melhor.
O código para o que foi proposto nesta seção se encontra no apêndice 6
Com isso chegamos ao valor ideal de treshold de 0,187, que ao converter para
uma pontuação, chegamos à pontuação de 488. Esses valores correspondem a uma
taxa de aprovação de 92,6% e uma taxa de rejeição de 7,4% dos pedidos de credito.
O código para as partes 3.10, 3.11, 3.12 e 3.13 se encontra no apêndice 7
4. Conclusão
Esse tabalho fez uma breve análise do problema dos juros altos e propôs o uso de
machine learning com o objetivo de tentar diminuir as incertezas relacionados a
concessão de crédito e assim tentar melhorar um pouco o problema.
Foi mostrado o passo a passo do desenvolvimento de um modelo de machine
learning para análise de crédito e o desenvolvimento de um scorecard para permitir a
fácil interpretação e uso dos resultados por qualquer pessoa.
5. Apendices
5.2. Apendice 1
# importa os dados
loan_data = pd.read_csv('C:/Users/rafae/Jupyter/loan_data_2007_2014.csv')
# cria nova coluna baseado na loan_status que sera nossa variável alvo
loan_data['good_bad']= np.where(loan_data.loc[:,
'loan_status'].isin(['Charged Off', 'Default',
'Late (31-120 days)','Does not meet the credit policy. Status:Charged
Off']),
0, 1)
5.3. Apendice 2
# faz loop por cada coluna no dataset de treinamento para calcular o chi-
statico com a variável alvo
for column in X_train_cat:
chi, p, dof, ex = chi2_contingency(pd.crosstab(y_train,
X_train_cat[column]))
chi2_check.setdefault('Característica',[]).append(column)
chi2_check.setdefault('p-value',[]).append(round(p, 10))
5.4. Apendice 3
5.5. Apendice 4
X['purpose:moving']])
X_new['purpose:vacation__house__wedding__med__oth'] =
sum([X['purpose:vacation'], X['purpose:house'], X['purpose:wedding'],
X['purpose:medical'], X['purpose:other']])
X_new['term:36'] = np.where((X['term'] == 36), 1, 0)
X_new['term:60'] = np.where((X['term'] == 60), 1, 0)
X_new['int_rate:<7.071'] = np.where((X['int_rate'] <= 7.071), 1, 0)
X_new['int_rate:7.071-10.374'] = np.where((X['int_rate'] > 7.071) &
(X['int_rate'] <= 10.374), 1, 0)
X_new['int_rate:10.374-13.676'] = np.where((X['int_rate'] > 10.374)
& (X['int_rate'] <= 13.676), 1, 0)
X_new['int_rate:13.676-15.74'] = np.where((X['int_rate'] > 13.676)
& (X['int_rate'] <= 15.74), 1, 0)
X_new['int_rate:15.74-20.281'] = np.where((X['int_rate'] > 15.74) &
(X['int_rate'] <= 20.281), 1, 0)
X_new['int_rate:>20.281'] = np.where((X['int_rate'] > 20.281), 1,
0)
X_new['annual_inc:missing'] = np.where(X['annual_inc'].isnull(), 1,
0)
X_new['annual_inc:<28,555'] = np.where((X['annual_inc'] <= 28555),
1, 0)
X_new['annual_inc:28,555-37,440'] = np.where((X['annual_inc'] >
28555) & (X['annual_inc'] <= 37440), 1, 0)
X_new['annual_inc:37,440-61,137'] = np.where((X['annual_inc'] >
37440) & (X['annual_inc'] <= 61137), 1, 0)
X_new['annual_inc:61,137-81,872'] = np.where((X['annual_inc'] >
61137) & (X['annual_inc'] <= 81872), 1, 0)
X_new['annual_inc:81,872-102,606'] = np.where((X['annual_inc'] >
81872) & (X['annual_inc'] <= 102606), 1, 0)
X_new['annual_inc:102,606-120,379'] = np.where((X['annual_inc'] >
102606) & (X['annual_inc'] <= 120379), 1, 0)
X_new['annual_inc:120,379-150,000'] = np.where((X['annual_inc'] >
120379) & (X['annual_inc'] <= 150000), 1, 0)
X_new['annual_inc:>150K'] = np.where((X['annual_inc'] > 150000), 1,
0)
X_new['dti:<=1.6'] = np.where((X['dti'] <= 1.6), 1, 0)
X_new['dti:1.6-5.599'] = np.where((X['dti'] > 1.6) & (X['dti'] <=
5.599), 1, 0)
X_new['dti:5.599-10.397'] = np.where((X['dti'] > 5.599) & (X['dti']
<= 10.397), 1, 0)
X_new['dti:10.397-15.196'] = np.where((X['dti'] > 10.397) &
(X['dti'] <= 15.196), 1, 0)
X_new['dti:15.196-19.195'] = np.where((X['dti'] > 15.196) &
(X['dti'] <= 19.195), 1, 0)
X_new['dti:19.195-24.794'] = np.where((X['dti'] > 19.195) &
(X['dti'] <= 24.794), 1, 0)
X_new['dti:24.794-35.191'] = np.where((X['dti'] > 24.794) &
(X['dti'] <= 35.191), 1, 0)
38
X_new['mths_since_last_credit_pull_d:56-61'] =
np.where((X['mths_since_last_credit_pull_d'] > 56) &
(X['mths_since_last_credit_pull_d'] <= 61), 1, 0)
X_new['mths_since_last_credit_pull_d:61-75'] =
np.where((X['mths_since_last_credit_pull_d'] > 61) &
(X['mths_since_last_credit_pull_d'] <= 75), 1, 0)
X_new['mths_since_last_credit_pull_d:>75'] =
np.where((X['mths_since_last_credit_pull_d'] > 75), 1, 0)
X_new.drop(columns = ref_categories, inplace = True)
return X_new
5.6. Apendice 5
5.7. Apendice 6
y_test_temp = y_test.copy()
y_test_temp.reset_index(drop = True, inplace = True)
y_test_proba = pd.concat([y_test_temp, pd.DataFrame(y_hat_test_proba)],
axis = 1)
# renomeia as colunas
y_test_proba.columns = ['y_test_class_actual', 'y_hat_test_proba']
# Plota a curva PR
no_skill = len(y_test[y_test == 1]) / len(y)
plt.plot([0, 1], [no_skill, no_skill], linestyle='--', label='No Skill')
precision, recall, thresholds =
precision_recall_curve(y_test_proba['y_test_class_actual'],
y_test_proba['y_hat_test_proba'])
plt.plot(recall, precision, marker='.', label='Logistic')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.legend()
plt.title('PR curve');
5.8. Apendice 7
# reseta o index
df_scorecard.reset_index(inplace = True)
# cria uma coluna nova que com os score calculado nos coeficientes
df_scorecard['Score - Calculation'] = df_scorecard['Coefficients'] *
(max_score - min_score) / (
max_sum_coef - min_sum_coef)
df_scorecard.loc[0, 'Score - Calculation'] = (
(df_scorecard.loc[0,'Coefficients'] - min_sum_coef) /
(max_sum_coef - min_sum_coef
)) * (max_score - min_score) + min_score
df_scorecard['Score - Preliminary'] = df_scorecard['Score -
Calculation'].round()
# Ajusta para que mínimo emaximo scores esteja dentro da faixa desejada
pd.options.display.max_rows = 102
df_scorecard['Difference'] = df_scorecard['Score - Preliminary'] -
df_scorecard['Score - Calculation']
df_scorecard['Score - Final'] = df_scorecard['Score - Preliminary']
df_scorecard.loc[0, 'Score - Final'] = 598
def n_approved(p):
return np.where(y_test_proba['y_hat_test_proba'] >= p, 1, 0).sum()
df_cutoffs['N Rejected'] = y_test_proba['y_hat_test_proba'].shape[0] -
df_cutoffs['N Approved']
df_cutoffs['Approval Rate'] = df_cutoffs['N Approved'] /
y_test_proba['y_hat_test_proba'].shape[0]
df_cutoffs['Rejection Rate'] = 1 - df_cutoffs['Approval Rate']
df_cutoffs[df_cutoffs['thresholds'].between(0.18657, 0.18658)]
44
6. Referências
• Ng, Andrew. Coursera: Machine Learning, c2020. Curso online.
Disponível em: < >.
• Castro, Paulo André. Google classrom: CEMA-824 – inteligência artificial, c2020.
Curso online. Disponível em:
< https://classroom.google.com/u/2/c/NTY0NTA2MDg1NzNa>.
• HAN, Jiawei, KAMBER, Micheline. Data Mining: Concepts and Techniques. United
States of America: Morgan Kufmann, 2001.
• NORVIG, P. Inteligência Artificial: Uma abordagem moderna. 3ª. Ed. Rio de
janeiro: Elsevier Editora, 2009.