Este relatório apresenta uma análise exploratória e modelagem
preditiva usando o conjunto de dados clientes.csv. As
principais etapas incluem:
Objetivo:
Este trabalho tem como objetivo desenvolver um modelo de crédito capaz
de liberar crédito automático para os clientes de um banco digital,
informando o limite pré-aprovado.
Amostra de clientes:
A base de clientes é fictícia e faz referência a uma base de dados de um
banco digital: - 100.000 classificadas como clientes. -
2.221 classificadas como novos clientes.
options(encoding = "UTF-8") #configuração de codificação dos caracteres
options(scipen = 999) #desliga a notação científica
rm(list = ls()) #limpa o environment (ambiente)
# Pacotes necessários
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(caTools)
library(class)
library(ggplot2)
library(caret)
## Carregando pacotes exigidos: lattice
library(skimr)
# Importando dados – ajuste o endereço de onde a planilha está no seu computador
df <- read.csv("clientes.csv")
# Estrutura dos dados (visualização)
str(df)
## 'data.frame': 100000 obs. of 25 variables:
## $ id_cliente : int 3392 3392 3392 3392 3392 3392 3392 3392 8625 8625 ...
## $ mes : int 1 2 3 4 5 6 7 8 1 2 ...
## $ idade : num 23 23 23 23 23 23 23 23 28 28 ...
## $ profissao : chr "cientista" "cientista" "cientista" "cientista" ...
## $ salario_anual : num 19114 19114 19114 19114 19114 ...
## $ num_contas : num 3 3 3 3 3 3 3 3 2 2 ...
## $ num_cartoes : num 4 4 4 4 4 4 4 4 4 4 ...
## $ juros_emprestimo : num 3 3 3 3 3 3 3 3 6 6 ...
## $ num_emprestimos : num 4 4 4 4 4 4 4 4 1 1 ...
## $ dias_atraso : num 3 3 3 5 6 8 3 3 3 7 ...
## $ num_pagamentos_atrasados: num 7 4 7 4 4 4 8 6 4 1 ...
## $ num_verificacoes_credito: num 4 4 4 4 4 4 4 4 2 2 ...
## $ mix_credito : chr "Bom" "Bom" "Bom" "Bom" ...
## $ divida_total : num 810 810 810 810 810 ...
## $ taxa_uso_credito : num 26.8 31.9 28.6 31.4 24.8 ...
## $ idade_historico_credito : num 265 266 267 268 269 270 271 272 319 320 ...
## $ investimento_mensal : num 21.5 21.5 21.5 21.5 21.5 ...
## $ comportamento_pagamento : chr "alto_gasto_pagamento_baixos" "baixo_gasto_pagamento_alto" "baixo_gasto_pagamento_medio" "baixo_gasto_pagamento_baixo" ...
## $ saldo_final_mes : num 312 285 331 223 341 ...
## $ score_credito : chr "Good" "Good" "Good" "Good" ...
## $ emprestimo_carro : int 1 1 1 1 1 1 1 1 0 0 ...
## $ emprestimo_casa : int 1 1 1 1 1 1 1 1 0 0 ...
## $ emprestimo_pessoal : int 1 1 1 1 1 1 1 1 0 0 ...
## $ emprestimo_credito : int 1 1 1 1 1 1 1 1 1 1 ...
## $ emprestimo_estudantil : int 0 0 0 0 0 0 0 0 0 0 ...
# Visualização inicial e sumário estatístico
summary(df)
## id_cliente mes idade profissao
## Min. : 1006 Min. :1.00 Min. :14.00 Length:100000
## 1st Qu.:13664 1st Qu.:2.75 1st Qu.:24.00 Class :character
## Median :25777 Median :4.50 Median :33.00 Mode :character
## Mean :25983 Mean :4.50 Mean :33.32
## 3rd Qu.:38385 3rd Qu.:6.25 3rd Qu.:42.00
## Max. :50999 Max. :8.00 Max. :56.00
## salario_anual num_contas num_cartoes juros_emprestimo
## Min. : 7006 Min. : 0.000 Min. : 0.000 Min. : 1.00
## 1st Qu.: 19343 1st Qu.: 3.000 1st Qu.: 4.000 1st Qu.: 7.00
## Median : 37000 Median : 5.000 Median : 5.000 Median :13.00
## Mean : 50505 Mean : 5.369 Mean : 5.534 Mean :14.53
## 3rd Qu.: 71683 3rd Qu.: 7.000 3rd Qu.: 7.000 3rd Qu.:20.00
## Max. :179987 Max. :11.000 Max. :11.000 Max. :34.00
## num_emprestimos dias_atraso num_pagamentos_atrasados
## Min. :0.000 Min. : 0.00 Min. : 0.00
## 1st Qu.:2.000 1st Qu.:10.00 1st Qu.: 9.00
## Median :3.000 Median :18.00 Median :14.00
## Mean :3.533 Mean :21.08 Mean :13.31
## 3rd Qu.:5.000 3rd Qu.:28.00 3rd Qu.:18.00
## Max. :9.000 Max. :62.00 Max. :25.00
## num_verificacoes_credito mix_credito divida_total taxa_uso_credito
## Min. : 0.000 Length:100000 Min. : 0.23 Min. :20.00
## 1st Qu.: 3.000 Class :character 1st Qu.: 566.07 1st Qu.:28.05
## Median : 5.000 Mode :character Median :1166.15 Median :32.31
## Mean : 5.798 Mean :1426.22 Mean :32.29
## 3rd Qu.: 8.000 3rd Qu.:1945.96 3rd Qu.:36.50
## Max. :17.000 Max. :4998.07 Max. :50.00
## idade_historico_credito investimento_mensal comportamento_pagamento
## Min. : 1.0 Min. : 0.00 Length:100000
## 1st Qu.:144.0 1st Qu.: 27.96 Class :character
## Median :219.0 Median : 45.16 Mode :character
## Mean :221.2 Mean : 55.10
## 3rd Qu.:302.0 3rd Qu.: 71.30
## Max. :404.0 Max. :434.19
## saldo_final_mes score_credito emprestimo_carro emprestimo_casa
## Min. : 0.0078 Length:100000 Min. :0.0000 Min. :0.0000
## 1st Qu.: 267.6160 Class :character 1st Qu.:0.0000 1st Qu.:0.0000
## Median : 333.8654 Mode :character Median :0.0000 Median :1.0000
## Mean : 392.6976 Mean :0.3056 Mean :0.5118
## 3rd Qu.: 463.2157 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :1183.9307 Max. :1.0000 Max. :1.0000
## emprestimo_pessoal emprestimo_credito emprestimo_estudantil
## Min. :0.000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.000 Median :0.0000 Median :0.0000
## Mean :0.311 Mean :0.3173 Mean :0.3104
## 3rd Qu.:1.000 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :1.000 Max. :1.0000 Max. :1.0000
skimr::skim(df)
| Name | df |
| Number of rows | 100000 |
| Number of columns | 25 |
| _______________________ | |
| Column type frequency: | |
| character | 4 |
| numeric | 21 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| profissao | 0 | 1 | 6 | 13 | 0 | 15 | 0 |
| mix_credito | 0 | 1 | 3 | 6 | 0 | 3 | 0 |
| comportamento_pagamento | 0 | 1 | 25 | 27 | 0 | 6 | 0 |
| score_credito | 0 | 1 | 4 | 8 | 0 | 3 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| id_cliente | 0 | 1 | 25982.67 | 14340.54 | 1006.00 | 13664.50 | 25777.00 | 38385.00 | 50999.00 | ▇▇▇▇▇ |
| mes | 0 | 1 | 4.50 | 2.29 | 1.00 | 2.75 | 4.50 | 6.25 | 8.00 | ▇▃▇▃▇ |
| idade | 0 | 1 | 33.32 | 10.76 | 14.00 | 24.00 | 33.00 | 42.00 | 56.00 | ▆▇▇▆▃ |
| salario_anual | 0 | 1 | 50505.12 | 38299.42 | 7005.93 | 19342.97 | 36999.71 | 71683.47 | 179987.28 | ▇▃▂▁▁ |
| num_contas | 0 | 1 | 5.37 | 2.59 | 0.00 | 3.00 | 5.00 | 7.00 | 11.00 | ▅▇▇▇▃ |
| num_cartoes | 0 | 1 | 5.53 | 2.07 | 0.00 | 4.00 | 5.00 | 7.00 | 11.00 | ▁▆▇▅▂ |
| juros_emprestimo | 0 | 1 | 14.53 | 8.74 | 1.00 | 7.00 | 13.00 | 20.00 | 34.00 | ▇▇▇▃▃ |
| num_emprestimos | 0 | 1 | 3.53 | 2.45 | 0.00 | 2.00 | 3.00 | 5.00 | 9.00 | ▆▇▆▅▂ |
| dias_atraso | 0 | 1 | 21.08 | 14.80 | 0.00 | 10.00 | 18.00 | 28.00 | 62.00 | ▇▇▅▂▂ |
| num_pagamentos_atrasados | 0 | 1 | 13.31 | 6.24 | 0.00 | 9.00 | 14.00 | 18.00 | 25.00 | ▃▆▇▇▃ |
| num_verificacoes_credito | 0 | 1 | 5.80 | 3.87 | 0.00 | 3.00 | 5.00 | 8.00 | 17.00 | ▇▆▇▃▁ |
| divida_total | 0 | 1 | 1426.22 | 1155.13 | 0.23 | 566.07 | 1166.15 | 1945.96 | 4998.07 | ▇▆▂▁▁ |
| taxa_uso_credito | 0 | 1 | 32.29 | 5.12 | 20.00 | 28.05 | 32.31 | 36.50 | 50.00 | ▃▇▇▃▁ |
| idade_historico_credito | 0 | 1 | 221.22 | 99.68 | 1.00 | 144.00 | 219.00 | 302.00 | 404.00 | ▂▆▇▆▅ |
| investimento_mensal | 0 | 1 | 55.10 | 39.01 | 0.00 | 27.96 | 45.16 | 71.30 | 434.19 | ▇▂▁▁▁ |
| saldo_final_mes | 0 | 1 | 392.70 | 201.65 | 0.01 | 267.62 | 333.87 | 463.22 | 1183.93 | ▂▇▂▁▁ |
| emprestimo_carro | 0 | 1 | 0.31 | 0.46 | 0.00 | 0.00 | 0.00 | 1.00 | 1.00 | ▇▁▁▁▃ |
| emprestimo_casa | 0 | 1 | 0.51 | 0.50 | 0.00 | 0.00 | 1.00 | 1.00 | 1.00 | ▇▁▁▁▇ |
| emprestimo_pessoal | 0 | 1 | 0.31 | 0.46 | 0.00 | 0.00 | 0.00 | 1.00 | 1.00 | ▇▁▁▁▃ |
| emprestimo_credito | 0 | 1 | 0.32 | 0.47 | 0.00 | 0.00 | 0.00 | 1.00 | 1.00 | ▇▁▁▁▃ |
| emprestimo_estudantil | 0 | 1 | 0.31 | 0.46 | 0.00 | 0.00 | 0.00 | 1.00 | 1.00 | ▇▁▁▁▃ |
análise exploratória fornece uma visão inicial da base de dados
clientes.csv, contendo 100.000 observações
e 25 variáveis, com predominância de variáveis
numéricas. Segue um resumo dos principais insights:
idade,
profissao), financeiras (e.g., salario_anual,
divida_total), e comportamentais (e.g.,
comportamento_pagamento).A análise de distribuições indica: - Salário Anual e
Dívida Total possuem assimetria positiva, sugerindo a
presença de poucos clientes com valores elevados. - A maioria das
variáveis categóricas (e.g., mix_credito,
comportamento_pagamento) possui menos de 10 categorias
únicas.
A visualização inicial, com histogramas e sumários estatísticos, demonstra que: - Mix de Crédito e Comportamento de Pagamento são fatores importantes para análise e modelagem. - Há um bom balanceamento nas variáveis numéricas, mas algumas apresentam outliers significativos.
Esse resumo da base estabelece a fundação para identificar padrões e criar modelos preditivos robustos.
A ideia será criar dois modelos, um para aprovação determinística do crédito e outro para determinação de um pré-limite ao cliente.
Nota Importante:
O modelo deve ser conservador, pois trata-se de um sistema de aprovação
de crédito automático.
O modelo determinístico utilizará o método de Árvore de Decisão para classificar clientes como bons ou maus pagadores, baseando-se no comportamento de pagamento registrado na base de dados.
#proxy que define bons pagadores conservadora
df$bom_pagador <- ifelse(df$comportamento_pagamento %in%
c("alto_gasto_pagamento_alto", "baixo_gasto_pagamento_alto"),
1, 0)
# Convertendo a variável criada em fator
df$bom_pagador <- as.factor(df$bom_pagador)
#Visualizar dados
glimpse(df)
## Rows: 100,000
## Columns: 26
## $ id_cliente <int> 3392, 3392, 3392, 3392, 3392, 3392, 3392, 339…
## $ mes <int> 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, …
## $ idade <dbl> 23, 23, 23, 23, 23, 23, 23, 23, 28, 28, 28, 2…
## $ profissao <chr> "cientista", "cientista", "cientista", "cient…
## $ salario_anual <dbl> 19114.12, 19114.12, 19114.12, 19114.12, 19114…
## $ num_contas <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, …
## $ num_cartoes <dbl> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, …
## $ juros_emprestimo <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, …
## $ num_emprestimos <dbl> 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, …
## $ dias_atraso <dbl> 3, 3, 3, 5, 6, 8, 3, 3, 3, 7, 3, 3, 3, 3, 3, …
## $ num_pagamentos_atrasados <dbl> 7, 4, 7, 4, 4, 4, 8, 6, 4, 1, 1, 3, 1, 0, 4, …
## $ num_verificacoes_credito <dbl> 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, …
## $ mix_credito <chr> "Bom", "Bom", "Bom", "Bom", "Bom", "Bom", "Bo…
## $ divida_total <dbl> 809.98, 809.98, 809.98, 809.98, 809.98, 809.9…
## $ taxa_uso_credito <dbl> 26.82262, 31.94496, 28.60935, 31.37786, 24.79…
## $ idade_historico_credito <dbl> 265, 266, 267, 268, 269, 270, 271, 272, 319, …
## $ investimento_mensal <dbl> 21.46538, 21.46538, 21.46538, 21.46538, 21.46…
## $ comportamento_pagamento <chr> "alto_gasto_pagamento_baixos", "baixo_gasto_p…
## $ saldo_final_mes <dbl> 312.4941, 284.6292, 331.2099, 223.4513, 341.4…
## $ score_credito <chr> "Good", "Good", "Good", "Good", "Good", "Good…
## $ emprestimo_carro <int> 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, …
## $ emprestimo_casa <int> 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, …
## $ emprestimo_pessoal <int> 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, …
## $ emprestimo_credito <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ emprestimo_estudantil <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ bom_pagador <fct> 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, …
str(df)
## 'data.frame': 100000 obs. of 26 variables:
## $ id_cliente : int 3392 3392 3392 3392 3392 3392 3392 3392 8625 8625 ...
## $ mes : int 1 2 3 4 5 6 7 8 1 2 ...
## $ idade : num 23 23 23 23 23 23 23 23 28 28 ...
## $ profissao : chr "cientista" "cientista" "cientista" "cientista" ...
## $ salario_anual : num 19114 19114 19114 19114 19114 ...
## $ num_contas : num 3 3 3 3 3 3 3 3 2 2 ...
## $ num_cartoes : num 4 4 4 4 4 4 4 4 4 4 ...
## $ juros_emprestimo : num 3 3 3 3 3 3 3 3 6 6 ...
## $ num_emprestimos : num 4 4 4 4 4 4 4 4 1 1 ...
## $ dias_atraso : num 3 3 3 5 6 8 3 3 3 7 ...
## $ num_pagamentos_atrasados: num 7 4 7 4 4 4 8 6 4 1 ...
## $ num_verificacoes_credito: num 4 4 4 4 4 4 4 4 2 2 ...
## $ mix_credito : chr "Bom" "Bom" "Bom" "Bom" ...
## $ divida_total : num 810 810 810 810 810 ...
## $ taxa_uso_credito : num 26.8 31.9 28.6 31.4 24.8 ...
## $ idade_historico_credito : num 265 266 267 268 269 270 271 272 319 320 ...
## $ investimento_mensal : num 21.5 21.5 21.5 21.5 21.5 ...
## $ comportamento_pagamento : chr "alto_gasto_pagamento_baixos" "baixo_gasto_pagamento_alto" "baixo_gasto_pagamento_medio" "baixo_gasto_pagamento_baixo" ...
## $ saldo_final_mes : num 312 285 331 223 341 ...
## $ score_credito : chr "Good" "Good" "Good" "Good" ...
## $ emprestimo_carro : int 1 1 1 1 1 1 1 1 0 0 ...
## $ emprestimo_casa : int 1 1 1 1 1 1 1 1 0 0 ...
## $ emprestimo_pessoal : int 1 1 1 1 1 1 1 1 0 0 ...
## $ emprestimo_credito : int 1 1 1 1 1 1 1 1 1 1 ...
## $ emprestimo_estudantil : int 0 0 0 0 0 0 0 0 0 0 ...
## $ bom_pagador : Factor w/ 2 levels "0","1": 1 2 1 1 1 1 1 1 1 2 ...
#seed_aleatoria <- sample(1:10000, 1) #esta comentado pois estou usando uma seed fixa para replicar os resultados
#seed fixa
seed_aleatoria <- 3
# Fixar a seed aleatória gerada
set.seed(seed_aleatoria)
Treinamento dos Modelos
#Modelo deterministico: (Liberar ou Não Credito)
## rodar para Decision Tree
library(rpart)
library(rpart.plot)
Modelo Preditivo descriminante modelo preditivo de 5 camadas de árvore de decisão importante: saldo e número de empréstimos que tem.
divisao <- sample.split(df$emprestimo_credito, SplitRatio = 0.75)
DT1_treinamento <- subset(df, divisao == TRUE) #treinamento
DT1_teste <- subset(df, divisao == FALSE) #teste
model_pred <- rpart(as.factor(bom_pagador) ~ idade + profissao + salario_anual +
num_contas + num_cartoes + juros_emprestimo + num_emprestimos +
dias_atraso + num_pagamentos_atrasados + num_verificacoes_credito +
mix_credito + divida_total + taxa_uso_credito + idade_historico_credito +
investimento_mensal + saldo_final_mes,
data = DT1_treinamento, maxdepth = 5)
rpart.plot(model_pred, type = 2)
#principais
summary(model_pred)
## Call:
## rpart(formula = as.factor(bom_pagador) ~ idade + profissao +
## salario_anual + num_contas + num_cartoes + juros_emprestimo +
## num_emprestimos + dias_atraso + num_pagamentos_atrasados +
## num_verificacoes_credito + mix_credito + divida_total + taxa_uso_credito +
## idade_historico_credito + investimento_mensal + saldo_final_mes,
## data = DT1_treinamento, maxdepth = 5)
## n= 75000
##
## CP nsplit rel error xerror xstd
## 1 0.01923481 0 1.0000000 1.0000000 0.006262651
## 2 0.01266555 2 0.9615304 0.9615304 0.006181034
## 3 0.01000000 3 0.9488648 0.9568005 0.006170704
##
## Variable importance
## saldo_final_mes salario_anual num_emprestimos taxa_uso_credito
## 70 17 5 4
## investimento_mensal
## 2
##
## Node number 1: 75000 observations, complexity param=0.01923481
## predicted class=0 expected loss=0.2537067 P(node) =1
## class counts: 55972 19028
## probabilities: 0.746 0.254
## left son=2 (64932 obs) right son=3 (10068 obs)
## Primary splits:
## saldo_final_mes < 613.9694 to the left, improve=1489.2910, (0 missing)
## salario_anual < 70786.28 to the left, improve=1071.1410, (0 missing)
## investimento_mensal < 53.50581 to the left, improve= 350.1393, (0 missing)
## taxa_uso_credito < 41.09714 to the left, improve= 224.8246, (0 missing)
## divida_total < 1488.585 to the right, improve= 167.1049, (0 missing)
## Surrogate splits:
## salario_anual < 86906.88 to the left, agree=0.896, adj=0.228, (0 split)
## taxa_uso_credito < 41.49761 to the left, agree=0.874, adj=0.062, (0 split)
## investimento_mensal < 161.5447 to the left, agree=0.869, adj=0.022, (0 split)
##
## Node number 2: 64932 observations
## predicted class=0 expected loss=0.2144705 P(node) =0.86576
## class counts: 51006 13926
## probabilities: 0.786 0.214
##
## Node number 3: 10068 observations, complexity param=0.01923481
## predicted class=1 expected loss=0.4932459 P(node) =0.13424
## class counts: 4966 5102
## probabilities: 0.493 0.507
## left son=6 (5302 obs) right son=7 (4766 obs)
## Primary splits:
## saldo_final_mes < 788.4297 to the left, improve=88.79293, (0 missing)
## num_emprestimos < 2.5 to the left, improve=79.37222, (0 missing)
## investimento_mensal < 109.6339 to the right, improve=78.36963, (0 missing)
## salario_anual < 126296.4 to the right, improve=51.82884, (0 missing)
## idade_historico_credito < 181.5 to the right, improve=11.17817, (0 missing)
## Surrogate splits:
## salario_anual < 105379 to the left, agree=0.732, adj=0.434, (0 split)
## investimento_mensal < 95.35607 to the left, agree=0.630, adj=0.218, (0 split)
## num_emprestimos < 1.5 to the right, agree=0.581, adj=0.114, (0 split)
## mix_credito splits as RLL, agree=0.572, adj=0.096, (0 split)
## taxa_uso_credito < 40.79136 to the left, agree=0.572, adj=0.096, (0 split)
##
## Node number 6: 5302 observations, complexity param=0.01266555
## predicted class=0 expected loss=0.4437948 P(node) =0.07069333
## class counts: 2949 2353
## probabilities: 0.556 0.444
## left son=12 (3145 obs) right son=13 (2157 obs)
## Primary splits:
## num_emprestimos < 2.5 to the left, improve=91.34329, (0 missing)
## salario_anual < 98731.95 to the right, improve=82.55529, (0 missing)
## investimento_mensal < 67.10573 to the right, improve=54.00902, (0 missing)
## idade_historico_credito < 181.5 to the right, improve=15.71589, (0 missing)
## num_verificacoes_credito < 5.5 to the left, improve=13.06523, (0 missing)
## Surrogate splits:
## salario_anual < 89776.84 to the left, agree=0.653, adj=0.147, (0 split)
## idade_historico_credito < 181.5 to the right, agree=0.612, adj=0.046, (0 split)
## num_verificacoes_credito < 8.5 to the left, agree=0.598, adj=0.012, (0 split)
## mix_credito splits as LLR, agree=0.597, adj=0.009, (0 split)
## num_cartoes < 7.5 to the left, agree=0.597, adj=0.008, (0 split)
##
## Node number 7: 4766 observations
## predicted class=1 expected loss=0.423206 P(node) =0.06354667
## class counts: 2017 2749
## probabilities: 0.423 0.577
##
## Node number 12: 3145 observations
## predicted class=0 expected loss=0.3669316 P(node) =0.04193333
## class counts: 1991 1154
## probabilities: 0.633 0.367
##
## Node number 13: 2157 observations
## predicted class=1 expected loss=0.4441354 P(node) =0.02876
## class counts: 958 1199
## probabilities: 0.444 0.556
predictTrain <- predict(model_pred, type = "class", newdata = DT1_teste)
CM.DT <- table(DT1_teste$emprestimo_credito, predictTrain)
confusionMatrix(CM.DT)
## Confusion Matrix and Statistics
##
## predictTrain
## 0 1
## 0 15177 1891
## 1 7422 510
##
## Accuracy : 0.6275
## 95% CI : (0.6215, 0.6335)
## No Information Rate : 0.904
## P-Value [Acc > NIR] : 1
##
## Kappa : -0.0572
##
## Mcnemar's Test P-Value : <0.0000000000000002
##
## Sensitivity : 0.6716
## Specificity : 0.2124
## Pos Pred Value : 0.8892
## Neg Pred Value : 0.0643
## Prevalence : 0.9040
## Detection Rate : 0.6071
## Detection Prevalence : 0.6827
## Balanced Accuracy : 0.4420
##
## 'Positive' Class : 0
##
Após a execução do modelo de árvore de decisão, os principais
resultados observados foram:
saldo_final_mes, com o
primeiro nó separando os clientes com saldo abaixo de
614 como maus pagadores.salario_anual e
num_emprestimos também desempenharam papéis importantes nas
divisões secundárias.
#### Foco no Conservadorismo - A alta sensibilidade é
consistente com o objetivo do modelo, que prioriza a detecção de bons
pagadores.
- Contudo, a baixa especificidade sugere que alguns maus
pagadores podem ser incorretamente classificados como bons.
#### Interpretação dos Nós - Clientes com saldo abaixo de
614 têm alta probabilidade de serem maus pagadores.
- Para clientes com saldo acima deste valor, variáveis como
num_emprestimos (< 3) e salario_anual (>
78.000) ajudam a refinar a decisão.
#### Aplicação
Prática - O modelo é robusto para um cenário inicial e serve como uma
base interpretável para aprovação automatizada de crédito.
#Construção do modelo para determinar o valor do credito pre aprovado
#Modelo de regressão Multipla (carregar todas as vezes)
library(caTools)
library(stargazer)
##
## Please cite as:
## Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
## R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
library(lmtest)
## Carregando pacotes exigidos: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
# Filtrando apenas os bons pagadores
df_bons_pagadores <- subset(df, bom_pagador == 1)
# Divisão em treinamento e teste
divisao <- sample.split(df_bons_pagadores$divida_total, SplitRatio = 0.75)
treinamento <- subset(df_bons_pagadores, divisao == TRUE)
teste <- subset(df_bons_pagadores, divisao == FALSE)
# Modelo de Regressão Linear
model_valor <- lm(divida_total ~ num_contas + num_cartoes +
num_verificacoes_credito + idade + taxa_uso_credito + idade_historico_credito +
investimento_mensal + mix_credito,
data = treinamento)
# Resumo do Modelo
summary(model_valor)
##
## Call:
## lm(formula = divida_total ~ num_contas + num_cartoes + num_verificacoes_credito +
## idade + taxa_uso_credito + idade_historico_credito + investimento_mensal +
## mix_credito, data = treinamento)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1974.89 -459.29 -18.89 428.98 2222.96
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1199.83084 42.45814 28.259 < 0.0000000000000002 ***
## num_contas 11.84814 2.56407 4.621 0.000003845 ***
## num_cartoes 36.51426 2.74484 13.303 < 0.0000000000000002 ***
## num_verificacoes_credito 32.09933 1.72511 18.607 < 0.0000000000000002 ***
## idade -1.51977 0.43809 -3.469 0.000523 ***
## taxa_uso_credito -0.59983 0.89401 -0.671 0.502263
## idade_historico_credito -2.10173 0.06341 -33.145 < 0.0000000000000002 ***
## investimento_mensal -0.60273 0.12012 -5.018 0.000000527 ***
## mix_creditoNormal -26.59611 13.46768 -1.975 0.048303 *
## mix_creditoRuim 1444.38521 23.23862 62.155 < 0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 661.1 on 20973 degrees of freedom
## Multiple R-squared: 0.639, Adjusted R-squared: 0.6389
## F-statistic: 4125 on 9 and 20973 DF, p-value: < 0.00000000000000022
# Apresentação dos resultados - forma mais bonita de apresentação
stargazer(model_valor, type = "text", title = "Modelo de Regressão para Crédito Pré-Aprovado",
dep.var.labels = "Valor do Crédito Pré-Aprovado (divida_total)",
covariate.labels = c("Numero de Contas", "Numero de Cartões",
"Num Verificações de Crédito", "Idade", "Taxa de Uso Crédito",
"Idade Histórico Crédito", "Investimento Mensal",
"Mix de Crédito: Normal", "Mix de Crédito: Ruim"),
omit.stat = c("f", "ser"), ci = TRUE, single.row = TRUE)
##
## Modelo de Regressão para Crédito Pré-Aprovado
## =================================================================
## Dependent variable:
## -------------------------------------
## Valor do Crédito Pré-Aprovado (divida
## -----------------------------------------------------------------
## Numero de Contas 11.848*** (6.823, 16.874)
## Numero de Cartões 36.514*** (31.134, 41.894)
## Num Verificações de Crédito 32.099*** (28.718, 35.480)
## Idade -1.520*** (-2.378, -0.661)
## Taxa de Uso Crédito -0.600 (-2.352, 1.152)
## Idade Histórico Crédito -2.102*** (-2.226, -1.977)
## Investimento Mensal -0.603*** (-0.838, -0.367)
## Mix de Crédito: Normal -26.596** (-52.992, -0.200)
## Mix de Crédito: Ruim 1,444.385*** (1,398.838, 1,489.932)
## Constant 1,199.831*** (1,116.614, 1,283.047)
## -----------------------------------------------------------------
## Observations 20,983
## R2 0.639
## Adjusted R2 0.639
## =================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
# Criar dataframe de comparação entre valores reais e preditos - exibição do gráfico
comparacao <- data.frame(
Real = teste$divida_total, # Valores reais da variável dependente
Predito = predict(model_valor, teste) # Valores preditos pelo modelo no conjunto de teste
)
#Grafico do modelo - verificação por gráfico da eficiência do modelo
ggplot(comparacao, aes(x = Real, y = Predito)) +
geom_point(color = "blue", alpha = 0.6) +
geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed") +
labs(title = "Valores Reais vs. Preditos", x = "Valor Real", y = "Valor Predito") +
theme_minimal()
# Resíduos vs Valores Ajustados - Analise para homocedasticidade dos erros
ggplot(data.frame(Fitted = model_valor$fitted.values, Residuals = model_valor$residuals),
aes(x = Fitted, y = Residuals)) +
geom_point(color = "darkgreen", alpha = 0.6) +
geom_hline(yintercept = 0, color = "red", linetype = "dashed") +
labs(title = "Resíduos vs Valores Ajustados", x = "Valores Ajustados", y = "Resíduos") +
theme_minimal()
#Teste de Heterocedasticidade de breush-pagan
bptest(model_valor)
##
## studentized Breusch-Pagan test
##
## data: model_valor
## BP = 4985, df = 9, p-value < 0.00000000000000022
Como podemos ver nos resultados apresentados, os dados não são
continuos e o modelo de regressão não é adequado para prever o valor do
crédito
Por isso vamos tentar outra abordagem
O modelo Random Forest é um método de aprendizado supervisionado usado para classificação e regressão que se baseia na criação de múltiplas árvores de decisão para fazer previsões. Diferente de uma única árvore de decisão, o Random Forest construi várias árvores utilizando subconjuntos aleatórios dos dados e variáveis, combinando suas previsões por meio de votação (para classificação) ou média (para regressão). Isso aumenta a precisão do modelo e reduz o risco de overfitting, que é comum em árvores individuais. O método utiliza o bootstrap sampling (amostras com reposição) e a seleção aleatória de variáveis em cada divisão para garantir diversidade entre as árvores. Por ser robusto e flexível, o Random Forest é amplamente aplicado em áreas como diagnósticos médicos, previsão financeira, análise de comportamento do consumidor e outras aplicações que exigem alta acurácia e estabilidade.
#O modelo de regressao linear nao vai ser bom. Vamos testar outro metodo
#-------------------------------------------------------------------
#Tentar o modelo de random Forest
library(ranger)
# Modelo de Random Forest com ranger - modelo em si (model rf)
model_rf <- ranger(
formula = divida_total ~ num_contas + num_cartoes + num_verificacoes_credito + idade +
taxa_uso_credito + idade_historico_credito + investimento_mensal + mix_credito,
data = treinamento,
num.trees = 500, # Número de árvores
importance = "impurity" # Calcula importância das variáveis
)
# Predições no conjunto de teste
pred_teste_rf <- predict(model_rf, data = teste)$predictions
# Avaliação do Modelo - desvio medio absoluto
library(Metrics)
##
## Attaching package: 'Metrics'
## The following objects are masked from 'package:caret':
##
## precision, recall
mae_rf <- mae(teste$divida_total, pred_teste_rf)
rmse_rf <- rmse(teste$divida_total, pred_teste_rf)
print(paste("MAE:", mae_rf))
## [1] "MAE: 287.522497846018"
print(paste("RMSE:", rmse_rf))
## [1] "RMSE: 375.239649108641"
# Importância das variáveis - importancia das variaveis para prever a divida
model_rf$variable.importance
## num_contas num_cartoes num_verificacoes_credito
## 1930972728 2172212020 2890716942
## idade taxa_uso_credito idade_historico_credito
## 1298679267 1141119859 5723479967
## investimento_mensal mix_credito
## 1689412061 7366286106
# Dataframe de comparação
comparacao_rf <- data.frame(
Real = teste$divida_total,
Predito = pred_teste_rf
)
# Gráfico de Valores Reais vs Preditos
ggplot(comparacao_rf, aes(x = Real, y = Predito)) +
geom_point(color = "blue", alpha = 0.6) +
geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed") +
labs(title = "Valores Reais vs. Preditos - Random Forest",
x = "Valor Real", y = "Valor Predito") +
theme_minimal()
# Cálculo dos resíduos
residuos_rf <- teste$divida_total - pred_teste_rf
# Gráfico de Resíduos vs Preditos
ggplot(data.frame(Predito = pred_teste_rf, Residuos = residuos_rf), aes(x = Predito, y = Residuos)) +
geom_point(color = "darkgreen", alpha = 0.6) +
geom_hline(yintercept = 0, color = "red", linetype = "dashed") +
labs(title = "Resíduos vs. Valores Preditos - Random Forest",
x = "Valores Preditos", y = "Resíduos") +
theme_minimal()
# Histograma dos Resíduos - segue a gaussiana
ggplot(data.frame(Residuos = residuos_rf), aes(x = Residuos)) +
geom_histogram(binwidth = 50, fill = "blue", color = "black", alpha = 0.7) +
labs(title = "Distribuição dos Resíduos - Random Forest",
x = "Resíduos", y = "Frequência") +
theme_minimal()
# Adicionar os valores preditos no conjunto de teste
teste$Predito <- pred_teste_rf
# Boxplot de Predições por Categoria de Mix de Crédito
ggplot(teste, aes(x = mix_credito, y = Predito, fill = mix_credito)) +
geom_boxplot() +
labs(title = "Predições por Mix de Crédito - Random Forest",
x = "Mix de Crédito", y = "Valor Predito") +
theme_minimal()
# Transformar a importância em um dataframe
importancia_rf <- data.frame(
Variavel = names(model_rf$variable.importance),
Importancia = model_rf$variable.importance
)
# Criar o gráfico com ggplot2 - mix_credito é o que mais importa
library(ggplot2)
ggplot(importancia_rf, aes(x = reorder(Variavel, Importancia), y = Importancia)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
labs(title = "Importância das Variáveis - Random Forest (Ranger)",
x = "Variáveis", y = "Importância") +
theme_minimal()
divida_total.As variáveis mais relevantes para o modelo foram: - mix_credito (73.66% da importância relativa): Representa a diversificação do portfólio de crédito do cliente. - idade_historico_credito (57.23%): Indica o tempo total de histórico de crédito, um fator crucial para avaliar o risco. - num_verificacoes_credito (28.91%): Mostra a frequência com que o cliente foi avaliado por instituições financeiras. - num_cartoes e num_contas (21.72% e 19.31%, respectivamente): Contribuem para a avaliação de quão diversificado é o perfil financeiro do cliente.
divida_total.num.trees ou no método de
seleção de variáveis podem melhorar o desempenho.quantile regression forests.###6 Aplicação prática dos modelos - Vamos classificar novos clientes e ceder limite de crédito a eles. - Observação: Os modelos preveem a divida total do cliente e os novos clientes já possuem divida. Assim o valor aprovado será \(max( 0; Valor Previsto - Divida Atual)\)
library(readxl) # Para carregar o arquivo Excel
# 1. Carregar a base de novos clientes
novos_clientes <- read_excel("Novos_clientes.xlsx")
# Transformando colunas categóricas em fatores
novos_clientes <- novos_clientes %>%
mutate(
profissao = as.factor(profissao),
mix_credito = as.factor(mix_credito),
score_credito = as.factor(score_credito),
emprestimo_carro = as.factor(emprestimo_carro),
emprestimo_casa = as.factor(emprestimo_casa),
emprestimo_pessoal= as.factor(emprestimo_pessoal),
emprestimo_credito = as.factor(emprestimo_credito),
emprestimo_estudantil = as.factor(emprestimo_estudantil)
)
#Visualizar estrutura dos dados
str(novos_clientes)
## tibble [2,222 × 24] (S3: tbl_df/tbl/data.frame)
## $ id_cliente : chr [1:2222] "3392" "36507" "41781" "29152" ...
## $ mes : num [1:2222] 1 1 1 1 1 1 1 1 1 1 ...
## $ idade : num [1:2222] 23 15 21 28 18 53 55 22 25 36 ...
## $ profissao : Factor w/ 15 levels "advogado","arquiteto",..: 3 6 2 12 5 7 14 15 11 2 ...
## $ salario_anual : num [1:2222] 19114 55830 66105 15399 27070 ...
## $ num_contas : num [1:2222] 3 10 6 1 7 3 3 2 4 6 ...
## $ num_cartoes : num [1:2222] 4 10 8 7 3 5 3 1 3 5 ...
## $ juros_emprestimo : num [1:2222] 3 18 31 5 11 6 18 4 6 7 ...
## $ num_emprestimos : num [1:2222] 4 8 5 4 4 0 0 0 1 0 ...
## $ dias_atraso : num [1:2222] 3 30 26 1 12 5 17 14 22 14 ...
## $ num_pagamentos_atrasados: num [1:2222] 7 20 22 2 15 9 18 11 18 17 ...
## $ num_verificacoes_credito: num [1:2222] 4 11 9 3 1 2 3 2 5 5 ...
## $ mix_credito : Factor w/ 3 levels "Bom","Normal",..: 1 3 3 1 2 1 2 1 2 2 ...
## $ divida_total : num [1:2222] 810 3422 1550 344 920 ...
## $ taxa_uso_credito : num [1:2222] 26.8 27.1 30.1 36.7 28.6 ...
## $ idade_historico_credito : num [1:2222] 265 126 134 339 350 227 239 242 364 343 ...
## $ investimento_mensal : num [1:2222] 21.5 79.9 41.3 45.4 17.7 ...
## $ saldo_final_mes : num [1:2222] 312.5 63.2 431.2 298.3 362.3 ...
## $ score_credito : Factor w/ 3 levels "Good","Poor",..: 1 3 3 3 3 2 3 1 3 3 ...
## $ emprestimo_carro : Factor w/ 2 levels "0","1": 2 1 2 1 1 1 1 1 1 1 ...
## $ emprestimo_casa : Factor w/ 2 levels "0","1": 2 2 2 2 2 1 1 1 1 1 ...
## $ emprestimo_pessoal : Factor w/ 2 levels "0","1": 2 2 1 1 2 1 1 1 1 1 ...
## $ emprestimo_credito : Factor w/ 2 levels "0","1": 2 1 1 1 2 1 1 1 1 1 ...
## $ emprestimo_estudantil : Factor w/ 2 levels "0","1": 1 2 2 2 2 1 1 1 2 1 ...
# 3. Aplicar o modelo Decision Tree para prever `bom_pagador`
novos_clientes$bom_pagador <- predict(model_pred, novos_clientes, type = "class")
#Visualizar estrutura dos dados - preveu certinho
str(novos_clientes)
## tibble [2,222 × 25] (S3: tbl_df/tbl/data.frame)
## $ id_cliente : chr [1:2222] "3392" "36507" "41781" "29152" ...
## $ mes : num [1:2222] 1 1 1 1 1 1 1 1 1 1 ...
## $ idade : num [1:2222] 23 15 21 28 18 53 55 22 25 36 ...
## $ profissao : Factor w/ 15 levels "advogado","arquiteto",..: 3 6 2 12 5 7 14 15 11 2 ...
## $ salario_anual : num [1:2222] 19114 55830 66105 15399 27070 ...
## $ num_contas : num [1:2222] 3 10 6 1 7 3 3 2 4 6 ...
## $ num_cartoes : num [1:2222] 4 10 8 7 3 5 3 1 3 5 ...
## $ juros_emprestimo : num [1:2222] 3 18 31 5 11 6 18 4 6 7 ...
## $ num_emprestimos : num [1:2222] 4 8 5 4 4 0 0 0 1 0 ...
## $ dias_atraso : num [1:2222] 3 30 26 1 12 5 17 14 22 14 ...
## $ num_pagamentos_atrasados: num [1:2222] 7 20 22 2 15 9 18 11 18 17 ...
## $ num_verificacoes_credito: num [1:2222] 4 11 9 3 1 2 3 2 5 5 ...
## $ mix_credito : Factor w/ 3 levels "Bom","Normal",..: 1 3 3 1 2 1 2 1 2 2 ...
## $ divida_total : num [1:2222] 810 3422 1550 344 920 ...
## $ taxa_uso_credito : num [1:2222] 26.8 27.1 30.1 36.7 28.6 ...
## $ idade_historico_credito : num [1:2222] 265 126 134 339 350 227 239 242 364 343 ...
## $ investimento_mensal : num [1:2222] 21.5 79.9 41.3 45.4 17.7 ...
## $ saldo_final_mes : num [1:2222] 312.5 63.2 431.2 298.3 362.3 ...
## $ score_credito : Factor w/ 3 levels "Good","Poor",..: 1 3 3 3 3 2 3 1 3 3 ...
## $ emprestimo_carro : Factor w/ 2 levels "0","1": 2 1 2 1 1 1 1 1 1 1 ...
## $ emprestimo_casa : Factor w/ 2 levels "0","1": 2 2 2 2 2 1 1 1 1 1 ...
## $ emprestimo_pessoal : Factor w/ 2 levels "0","1": 2 2 1 1 2 1 1 1 1 1 ...
## $ emprestimo_credito : Factor w/ 2 levels "0","1": 2 1 1 1 2 1 1 1 1 1 ...
## $ emprestimo_estudantil : Factor w/ 2 levels "0","1": 1 2 2 2 2 1 1 1 2 1 ...
## $ bom_pagador : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 2 1 1 1 ...
## ..- attr(*, "names")= chr [1:2222] "1" "2" "3" "4" ...
glimpse(novos_clientes)
## Rows: 2,222
## Columns: 25
## $ id_cliente <chr> "3392", "36507", "41781", "29152", "19184", "…
## $ mes <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ idade <dbl> 23, 15, 21, 28, 18, 53, 55, 22, 25, 36, 33, 2…
## $ profissao <fct> cientista, empresario, arquiteto, mecanico, d…
## $ salario_anual <dbl> 19114.12, 55829.79, 66105.40, 15398.95, 27070…
## $ num_contas <dbl> 3, 10, 6, 1, 7, 3, 3, 2, 4, 6, 7, 9, 5, 3, 3,…
## $ num_cartoes <dbl> 4, 10, 8, 7, 3, 5, 3, 1, 3, 5, 10, 9, 6, 4, 6…
## $ juros_emprestimo <dbl> 3, 18, 31, 5, 11, 6, 18, 4, 6, 7, 21, 18, 12,…
## $ num_emprestimos <dbl> 4, 8, 5, 4, 4, 0, 0, 0, 1, 0, 8, 5, 2, 4, 4, …
## $ dias_atraso <dbl> 3, 30, 26, 1, 12, 5, 17, 14, 22, 14, 33, 26, …
## $ num_pagamentos_atrasados <dbl> 7, 20, 22, 2, 15, 9, 18, 11, 18, 17, 18, 15, …
## $ num_verificacoes_credito <dbl> 4, 11, 9, 3, 1, 2, 3, 2, 5, 5, 12, 10, 1, 2, …
## $ mix_credito <fct> Bom, Ruim, Ruim, Bom, Normal, Bom, Normal, Bo…
## $ divida_total <dbl> 809.98, 3422.49, 1549.56, 343.84, 919.76, 565…
## $ taxa_uso_credito <dbl> 26.82262, 27.07054, 30.11104, 36.74315, 28.55…
## $ idade_historico_credito <dbl> 265, 126, 134, 339, 350, 227, 239, 242, 364, …
## $ investimento_mensal <dbl> 21.46538, 79.93897, 41.29275, 45.39013, 17.68…
## $ saldo_final_mes <dbl> 312.49409, 63.24698, 431.15936, 298.33251, 36…
## $ score_credito <fct> Good, Standard, Standard, Standard, Standard,…
## $ emprestimo_carro <fct> 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, …
## $ emprestimo_casa <fct> 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, …
## $ emprestimo_pessoal <fct> 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, …
## $ emprestimo_credito <fct> 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, …
## $ emprestimo_estudantil <fct> 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, …
## $ bom_pagador <fct> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, …
#Estatistica descritiva dos dados - dar créditos apenas a bons pagadores
summary(novos_clientes)
## id_cliente mes idade profissao
## Length:2222 Min. :1 Min. :14.00 contador : 168
## Class :character 1st Qu.:1 1st Qu.:24.00 gerente_midia: 162
## Mode :character Median :1 Median :32.00 cientista : 161
## Mean :1 Mean :32.99 arquiteto : 159
## 3rd Qu.:1 3rd Qu.:41.00 jornalista : 156
## Max. :1 Max. :56.00 advogado : 148
## (Other) :1268
## salario_anual num_contas num_cartoes juros_emprestimo
## Min. : 7081 Min. : 0.000 Min. : 1.000 Min. : 1.00
## 1st Qu.: 19444 1st Qu.: 4.000 1st Qu.: 4.000 1st Qu.: 8.00
## Median : 36976 Median : 5.000 Median : 5.000 Median :13.00
## Mean : 50423 Mean : 5.373 Mean : 5.535 Mean :14.64
## 3rd Qu.: 70381 3rd Qu.: 7.000 3rd Qu.: 7.000 3rd Qu.:20.00
## Max. :179825 Max. :10.000 Max. :10.000 Max. :34.00
##
## num_emprestimos dias_atraso num_pagamentos_atrasados
## Min. :0.000 Min. : 0.00 Min. : 0.00
## 1st Qu.:2.000 1st Qu.:10.00 1st Qu.: 9.00
## Median :3.000 Median :18.00 Median :14.00
## Mean :3.549 Mean :21.03 Mean :13.34
## 3rd Qu.:5.000 3rd Qu.:28.00 3rd Qu.:18.00
## Max. :9.000 Max. :62.00 Max. :25.00
##
## num_verificacoes_credito mix_credito divida_total taxa_uso_credito
## Min. : 0.000 Bom : 669 Min. : 0.54 Min. :21.71
## 1st Qu.: 2.000 Normal:1019 1st Qu.: 554.41 1st Qu.:28.20
## Median : 4.000 Ruim : 534 Median :1124.61 Median :32.14
## Mean : 4.897 Mean :1409.43 Mean :32.32
## 3rd Qu.: 8.000 3rd Qu.:1948.44 3rd Qu.:36.47
## Max. :15.000 Max. :4997.05 Max. :49.56
##
## idade_historico_credito investimento_mensal saldo_final_mes score_credito
## Min. : 2.0 Min. : 0.00 Min. : 4.557 Good : 354
## 1st Qu.:137.0 1st Qu.: 27.55 1st Qu.: 271.290 Poor : 641
## Median :217.0 Median : 45.47 Median : 338.349 Standard:1227
## Mean :217.1 Mean : 54.76 Mean : 400.809
## 3rd Qu.:299.0 3rd Qu.: 70.55 3rd Qu.: 468.935
## Max. :397.0 Max. :266.87 Max. :1182.007
##
## emprestimo_carro emprestimo_casa emprestimo_pessoal emprestimo_credito
## 0:1533 0:1084 0:1528 0:1508
## 1: 689 1:1138 1: 694 1: 714
##
##
##
##
##
## emprestimo_estudantil bom_pagador
## 0:1525 0:1996
## 1: 697 1: 226
##
##
##
##
##
skim(novos_clientes)
| Name | novos_clientes |
| Number of rows | 2222 |
| Number of columns | 25 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| factor | 9 |
| numeric | 15 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| id_cliente | 0 | 1 | 4 | 5 | 0 | 2222 | 0 |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| profissao | 0 | 1 | FALSE | 15 | con: 168, ger: 162, cie: 161, arq: 159 |
| mix_credito | 0 | 1 | FALSE | 3 | Nor: 1019, Bom: 669, Rui: 534 |
| score_credito | 0 | 1 | FALSE | 3 | Sta: 1227, Poo: 641, Goo: 354 |
| emprestimo_carro | 0 | 1 | FALSE | 2 | 0: 1533, 1: 689 |
| emprestimo_casa | 0 | 1 | FALSE | 2 | 1: 1138, 0: 1084 |
| emprestimo_pessoal | 0 | 1 | FALSE | 2 | 0: 1528, 1: 694 |
| emprestimo_credito | 0 | 1 | FALSE | 2 | 0: 1508, 1: 714 |
| emprestimo_estudantil | 0 | 1 | FALSE | 2 | 0: 1525, 1: 697 |
| bom_pagador | 0 | 1 | FALSE | 2 | 0: 1996, 1: 226 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| mes | 0 | 1 | 1.00 | 0.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | ▁▁▇▁▁ |
| idade | 0 | 1 | 32.99 | 10.99 | 14.00 | 24.00 | 32.00 | 41.00 | 56.00 | ▇▇▇▆▃ |
| salario_anual | 0 | 1 | 50422.93 | 38245.92 | 7080.70 | 19444.41 | 36975.76 | 70380.69 | 179825.36 | ▇▃▂▁▁ |
| num_contas | 0 | 1 | 5.37 | 2.56 | 0.00 | 4.00 | 5.00 | 7.00 | 10.00 | ▃▇▇▇▃ |
| num_cartoes | 0 | 1 | 5.53 | 2.08 | 1.00 | 4.00 | 5.00 | 7.00 | 10.00 | ▁▆▇▅▂ |
| juros_emprestimo | 0 | 1 | 14.64 | 8.69 | 1.00 | 8.00 | 13.00 | 20.00 | 34.00 | ▆▇▆▃▃ |
| num_emprestimos | 0 | 1 | 3.55 | 2.46 | 0.00 | 2.00 | 3.00 | 5.00 | 9.00 | ▆▇▆▅▂ |
| dias_atraso | 0 | 1 | 21.03 | 14.94 | 0.00 | 10.00 | 18.00 | 28.00 | 62.00 | ▇▇▅▂▂ |
| num_pagamentos_atrasados | 0 | 1 | 13.34 | 6.23 | 0.00 | 9.00 | 14.00 | 18.00 | 25.00 | ▃▆▇▇▃ |
| num_verificacoes_credito | 0 | 1 | 4.90 | 3.55 | 0.00 | 2.00 | 4.00 | 8.00 | 15.00 | ▇▅▅▂▁ |
| divida_total | 0 | 1 | 1409.43 | 1139.55 | 0.54 | 554.41 | 1124.61 | 1948.45 | 4997.05 | ▇▆▂▁▁ |
| taxa_uso_credito | 0 | 1 | 32.32 | 5.07 | 21.71 | 28.20 | 32.14 | 36.47 | 49.56 | ▅▇▇▃▁ |
| idade_historico_credito | 0 | 1 | 217.08 | 101.56 | 2.00 | 137.00 | 217.00 | 299.00 | 397.00 | ▃▆▇▆▆ |
| investimento_mensal | 0 | 1 | 54.76 | 38.41 | 0.00 | 27.55 | 45.47 | 70.55 | 266.87 | ▇▃▁▁▁ |
| saldo_final_mes | 0 | 1 | 400.81 | 206.95 | 4.56 | 271.29 | 338.35 | 468.93 | 1182.01 | ▂▇▂▁▁ |
# 4. Filtrar apenas os bons pagadores
bons_pagadores <- novos_clientes %>%
filter(bom_pagador == 1)
#Visualizar estrutura dos dados
str(bons_pagadores)
## tibble [226 × 25] (S3: tbl_df/tbl/data.frame)
## $ id_cliente : chr [1:226] "9229" "25286" "32209" "32274" ...
## $ mes : num [1:226] 1 1 1 1 1 1 1 1 1 1 ...
## $ idade : num [1:226] 55 20 47 24 27 52 37 46 49 32 ...
## $ profissao : Factor w/ 15 levels "advogado","arquiteto",..: 14 8 5 7 7 1 10 9 6 13 ...
## $ salario_anual : num [1:226] 139354 144882 179825 169107 114262 ...
## $ num_contas : num [1:226] 3 3 5 4 3 7 3 5 5 7 ...
## $ num_cartoes : num [1:226] 3 4 6 5 7 3 3 1 4 5 ...
## $ juros_emprestimo : num [1:226] 18 15 2 12 1 20 3 7 8 9 ...
## $ num_emprestimos : num [1:226] 0 4 4 4 1 4 2 0 3 5 ...
## $ dias_atraso : num [1:226] 17 6 6 14 17 11 18 0 11 23 ...
## $ num_pagamentos_atrasados: num [1:226] 18 13 5 8 14 16 0 9 0 17 ...
## $ num_verificacoes_credito: num [1:226] 3 2 0 4 0 0 3 4 0 6 ...
## $ mix_credito : Factor w/ 3 levels "Bom","Normal",..: 2 2 1 1 1 2 1 1 1 2 ...
## $ divida_total : num [1:226] 519 405 486 254 338 ...
## $ taxa_uso_credito : num [1:226] 32.7 33.9 34.7 42.2 37.3 ...
## $ idade_historico_credito : num [1:226] 239 309 223 211 190 392 216 296 357 100 ...
## $ investimento_mensal : num [1:226] 156.9 227.5 144.5 91 72.8 ...
## $ saldo_final_mes : num [1:226] 1031 738 1020 969 949 ...
## $ score_credito : Factor w/ 3 levels "Good","Poor",..: 3 3 3 1 1 3 2 1 2 3 ...
## $ emprestimo_carro : Factor w/ 2 levels "0","1": 1 1 2 1 1 2 1 1 1 1 ...
## $ emprestimo_casa : Factor w/ 2 levels "0","1": 1 2 1 1 1 1 2 1 2 2 ...
## $ emprestimo_pessoal : Factor w/ 2 levels "0","1": 1 1 1 1 2 2 1 1 2 1 ...
## $ emprestimo_credito : Factor w/ 2 levels "0","1": 1 2 1 2 1 2 1 1 1 1 ...
## $ emprestimo_estudantil : Factor w/ 2 levels "0","1": 1 2 2 2 1 1 2 1 1 1 ...
## $ bom_pagador : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
## ..- attr(*, "names")= chr [1:226] "7" "14" "19" "33" ...
summary(bons_pagadores)
## id_cliente mes idade profissao
## Length:226 Min. :1 Min. :14.00 professor : 23
## Class :character 1st Qu.:1 1st Qu.:26.25 gerente_midia: 22
## Mode :character Median :1 Median :35.00 arquiteto : 20
## Mean :1 Mean :35.77 cientista : 19
## 3rd Qu.:1 3rd Qu.:45.00 engenheiro : 19
## Max. :1 Max. :55.00 empresario : 14
## (Other) :109
## salario_anual num_contas num_cartoes juros_emprestimo
## Min. : 61783 Min. :0.000 Min. :1.000 Min. : 1.00
## 1st Qu.:100689 1st Qu.:2.000 1st Qu.:4.000 1st Qu.: 5.00
## Median :118880 Median :4.000 Median :4.000 Median : 9.00
## Mean :118503 Mean :3.907 Mean :4.624 Mean : 9.15
## 3rd Qu.:134504 3rd Qu.:5.000 3rd Qu.:6.000 3rd Qu.:12.00
## Max. :179825 Max. :9.000 Max. :9.000 Max. :32.00
##
## num_emprestimos dias_atraso num_pagamentos_atrasados
## Min. :0.00 Min. : 0.00 Min. : 0.000
## 1st Qu.:1.00 1st Qu.: 7.00 1st Qu.: 5.000
## Median :2.00 Median :11.00 Median :10.000
## Mean :2.15 Mean :12.85 Mean : 9.832
## 3rd Qu.:3.00 3rd Qu.:18.00 3rd Qu.:14.000
## Max. :6.00 Max. :36.00 Max. :20.000
##
## num_verificacoes_credito mix_credito divida_total taxa_uso_credito
## Min. : 0.000 Bom :128 Min. : 3.31 Min. :25.05
## 1st Qu.: 1.000 Normal: 97 1st Qu.: 402.81 1st Qu.:30.81
## Median : 2.000 Ruim : 1 Median : 722.08 Median :34.58
## Mean : 2.549 Mean : 759.37 Mean :34.96
## 3rd Qu.: 4.000 3rd Qu.:1131.65 3rd Qu.:39.12
## Max. :11.000 Max. :2613.85 Max. :44.97
##
## idade_historico_credito investimento_mensal saldo_final_mes score_credito
## Min. : 65.0 Min. : 42.18 Min. : 615.6 Good : 67
## 1st Qu.:219.0 1st Qu.: 75.32 1st Qu.: 772.5 Poor : 21
## Median :279.5 Median : 97.39 Median : 860.0 Standard:138
## Mean :275.2 Mean :106.87 Mean : 868.1
## 3rd Qu.:337.0 3rd Qu.:129.06 3rd Qu.: 963.0
## Max. :394.0 Max. :266.87 Max. :1182.0
##
## emprestimo_carro emprestimo_casa emprestimo_pessoal emprestimo_credito
## 0:175 0:142 0:173 0:176
## 1: 51 1: 84 1: 53 1: 50
##
##
##
##
##
## emprestimo_estudantil bom_pagador
## 0:175 0: 0
## 1: 51 1:226
##
##
##
##
##
# 5. Aplicar o modelo Random Forest para prever `divida_total`
bons_pagadores$divida_total_Prev <- predict(model_rf, data = bons_pagadores)$predictions
# 6. Consolidar e calcular o limite pré-aprovado - divida total - divida total prevista
resultado_final <- bons_pagadores %>%
mutate(
# Calcular o limite pré-aprovado
limite_pre_aprovado = pmax(0, divida_total_Prev - divida_total)
) %>%
select(id_cliente, bom_pagador, divida_total, divida_total_Prev, limite_pre_aprovado)
# Visualizar as primeiras linhas do resultado
print(resultado_final, n = 250)
## # A tibble: 226 × 5
## id_cliente bom_pagador divida_total divida_total_Prev limite_pre_aprovado
## <chr> <fct> <dbl> <dbl> <dbl>
## 1 9229 1 519. 623. 104.
## 2 25286 1 405. 477. 72.9
## 3 32209 1 486. 667. 181.
## 4 32274 1 254. 606. 351.
## 5 18938 1 338. 567. 230.
## 6 11948 1 116. 673. 557.
## 7 50983 1 579. 651. 72.2
## 8 21183 1 1133. 612. 0
## 9 28385 1 528. 618. 89.5
## 10 14461 1 959. 1075. 116.
## 11 20150 1 402. 602. 200.
## 12 50930 1 60.2 513. 453.
## 13 22542 1 138. 541. 404.
## 14 25566 1 322. 549. 228.
## 15 46822 1 1439. 989. 0
## 16 26123 1 374. 511. 136.
## 17 45922 1 642. 1250. 608.
## 18 47363 1 658. 1237. 579.
## 19 20292 1 520. 689. 169.
## 20 7605 1 1531. 1969. 438.
## 21 48907 1 367. 538. 171.
## 22 17951 1 1366. 762. 0
## 23 30225 1 462. 637. 175.
## 24 31533 1 354. 763. 409.
## 25 18596 1 892. 872. 0
## 26 1190 1 705. 691. 0
## 27 9938 1 1049. 891. 0
## 28 20759 1 551. 630. 79.8
## 29 10920 1 473. 609. 136.
## 30 29367 1 199. 561. 362.
## 31 25521 1 91.9 235. 144.
## 32 19982 1 779. 675. 0
## 33 20266 1 1152. 741. 0
## 34 47060 1 102. 593. 492.
## 35 37071 1 939. 864. 0
## 36 35465 1 228. 691. 462.
## 37 40630 1 865. 826. 0
## 38 20741 1 1453. 1152. 0
## 39 11316 1 270. 515. 245.
## 40 34195 1 875. 788. 0
## 41 50534 1 853. 825. 0
## 42 4275 1 260. 643. 382.
## 43 31095 1 1338. 1106. 0
## 44 4640 1 722. 743. 20.5
## 45 14859 1 576. 757. 181.
## 46 3805 1 1137. 1026. 0
## 47 13493 1 1132. 927. 0
## 48 41805 1 632. 910. 278.
## 49 16501 1 249. 586. 336.
## 50 8695 1 650. 699. 48.4
## 51 36057 1 1084. 938. 0
## 52 26377 1 465. 545. 80.4
## 53 26769 1 554. 634. 80.2
## 54 27740 1 360. 528. 168.
## 55 8851 1 631. 751. 119.
## 56 17306 1 791. 691. 0
## 57 34358 1 828. 802. 0
## 58 16911 1 758. 865. 108.
## 59 12234 1 394. 594. 200.
## 60 28775 1 1076. 781. 0
## 61 20418 1 1280. 1054. 0
## 62 15973 1 939. 862. 0
## 63 21692 1 325. 600. 276.
## 64 35576 1 755. 792. 37.0
## 65 39138 1 1283. 1040. 0
## 66 18526 1 1246. 1120. 0
## 67 24105 1 533. 726. 193.
## 68 13730 1 1176. 1085. 0
## 69 48942 1 844. 724. 0
## 70 33266 1 1032. 858. 0
## 71 25091 1 1177. 949. 0
## 72 12728 1 1219. 1112. 0
## 73 3317 1 563. 606. 43.4
## 74 46051 1 1351. 1136. 0
## 75 7745 1 1291. 696. 0
## 76 7151 1 984. 902. 0
## 77 32069 1 680. 670. 0
## 78 44158 1 226. 437. 210.
## 79 34279 1 911. 688. 0
## 80 50273 1 1280. 1077. 0
## 81 21044 1 230. 650. 420.
## 82 2354 1 103. 415. 311.
## 83 26604 1 1252. 769. 0
## 84 34851 1 681. 740. 59.1
## 85 45057 1 131. 551. 421.
## 86 32374 1 526. 603. 77.2
## 87 20417 1 524. 625. 101.
## 88 38923 1 1205. 970. 0
## 89 12088 1 1279. 951. 0
## 90 11251 1 211. 446. 235.
## 91 19465 1 834. 768. 0
## 92 43318 1 1024. 947. 0
## 93 38546 1 597. 606. 9.42
## 94 23436 1 791 754. 0
## 95 14960 1 620. 695. 75.4
## 96 25780 1 301. 724. 422.
## 97 31023 1 9.35 259. 250.
## 98 33061 1 175. 523. 347.
## 99 1130 1 716. 774. 57.7
## 100 38815 1 1160. 1059. 0
## 101 4889 1 769. 705. 0
## 102 37237 1 798. 782. 0
## 103 21332 1 1465. 1197. 0
## 104 37198 1 1041. 915. 0
## 105 46239 1 1204. 886. 0
## 106 28929 1 115. 410. 294.
## 107 38697 1 831. 794. 0
## 108 19531 1 651. 785. 134.
## 109 25704 1 16.4 433. 417.
## 110 36109 1 252. 521. 269.
## 111 15277 1 932. 697. 0
## 112 34067 1 670. 733. 62.4
## 113 17889 1 342. 462. 120.
## 114 30550 1 704. 691. 0
## 115 44414 1 1231. 954. 0
## 116 28652 1 694. 681. 0
## 117 25198 1 722. 771. 48.9
## 118 34757 1 829. 819. 0
## 119 26662 1 1134. 998. 0
## 120 45360 1 1385. 1026. 0
## 121 33399 1 1275. 1123. 0
## 122 9193 1 1380. 1174. 0
## 123 36111 1 1318. 866. 0
## 124 19122 1 820. 808. 0
## 125 26804 1 1052 908. 0
## 126 34631 1 623. 726. 103.
## 127 14552 1 1190. 1199. 8.69
## 128 10677 1 488. 589. 102.
## 129 22325 1 716. 655. 0
## 130 50891 1 804. 842. 38.1
## 131 22346 1 959. 867. 0
## 132 49863 1 265. 597. 332.
## 133 36245 1 617. 643. 25.6
## 134 13740 1 1190. 935. 0
## 135 45066 1 1231. 848. 0
## 136 14907 1 305. 501. 196.
## 137 49478 1 881. 829. 0
## 138 7918 1 641. 694. 52.7
## 139 32707 1 716. 759. 43.0
## 140 5490 1 2614. 2090. 0
## 141 31929 1 633. 623. 0
## 142 22053 1 50.8 621. 570.
## 143 4931 1 1388. 1116. 0
## 144 24664 1 241. 423. 183.
## 145 23029 1 1445. 1232. 0
## 146 19177 1 339. 463. 124.
## 147 49135 1 724. 719. 0
## 148 28888 1 115. 348. 233.
## 149 12986 1 1283. 1038. 0
## 150 44459 1 1123. 828. 0
## 151 24239 1 848. 770. 0
## 152 32067 1 226. 470. 243.
## 153 12066 1 335. 502. 167.
## 154 32582 1 276. 398. 122.
## 155 26647 1 530. 1288. 758.
## 156 20199 1 1423. 974. 0
## 157 33246 1 487. 546. 58.4
## 158 18293 1 594. 1003. 409.
## 159 15594 1 504. 646. 142.
## 160 48842 1 788. 677. 0
## 161 18578 1 318. 553. 235.
## 162 38429 1 78.3 240. 162.
## 163 31072 1 1344. 825. 0
## 164 50698 1 331. 420. 88.8
## 165 7505 1 165. 522. 357.
## 166 42995 1 293. 549. 256.
## 167 34184 1 1099. 921. 0
## 168 32044 1 1151. 1117. 0
## 169 31661 1 813. 786. 0
## 170 12819 1 885. 813. 0
## 171 45147 1 1488. 1119. 0
## 172 9284 1 681. 761. 80.7
## 173 26670 1 1263. 1170. 0
## 174 49302 1 348. 506. 159.
## 175 4007 1 561. 632. 70.4
## 176 26106 1 870. 789. 0
## 177 44956 1 1246. 1012. 0
## 178 1681 1 1283. 1087. 0
## 179 46210 1 1370. 998. 0
## 180 47946 1 421. 486. 65.0
## 181 45760 1 441. 522. 81.7
## 182 40735 1 304. 467. 163.
## 183 47932 1 881. 823. 0
## 184 42412 1 2312. 1890. 0
## 185 37586 1 1159. 1061. 0
## 186 35423 1 832. 768. 0
## 187 28309 1 1223. 820. 0
## 188 46013 1 64.7 332. 267.
## 189 45346 1 869. 855. 0
## 190 25056 1 1115 914. 0
## 191 2258 1 836. 825. 0
## 192 23666 1 460. 600. 140.
## 193 47800 1 172. 402. 230.
## 194 12209 1 689. 759. 69.4
## 195 2309 1 327. 551. 224.
## 196 18450 1 679. 712. 33.8
## 197 37332 1 1481. 985. 0
## 198 17244 1 1630. 1520. 0
## 199 14869 1 824. 794. 0
## 200 43743 1 1440. 1215. 0
## 201 11944 1 551. 693. 142.
## 202 26268 1 108. 751. 643.
## 203 5475 1 1082. 944. 0
## 204 37999 1 1130. 931. 0
## 205 11255 1 831. 788. 0
## 206 50558 1 1149. 1051. 0
## 207 20785 1 1181. 947. 0
## 208 10328 1 738. 574. 0
## 209 11389 1 1243. 835. 0
## 210 39124 1 412. 598. 186.
## 211 30168 1 211. 551. 340.
## 212 17404 1 496. 614. 118.
## 213 40239 1 368. 609. 241.
## 214 6302 1 670. 772. 102.
## 215 11381 1 464. 653. 190.
## 216 33335 1 1273. 1079. 0
## 217 10984 1 828. 771. 0
## 218 43295 1 1078. 740. 0
## 219 32757 1 1387. 1127. 0
## 220 11438 1 1426. 1144. 0
## 221 40539 1 157. 783. 626.
## 222 18194 1 137. 638. 501.
## 223 48459 1 858. 749. 0
## 224 14543 1 3.31 362. 359.
## 225 7138 1 782. 830. 48.2
## 226 43399 1 550. 776. 226.
Este relatório documenta as principais etapas do desenvolvimento de um modelo preditivo para análise de crédito, abordando desde a exploração inicial dos dados até a aplicação prática dos modelos. A seguir, destacam-se os principais pontos e resultados obtidos:
saldo_final_mes,
idade_historico_credito e mix_credito.divida_total de bons pagadores, com
MAE de 287.52 e RMSE de 375.24. As
variáveis mix_credito e
idade_historico_credito foram as mais relevantes para essa
predição.Gradient Boosting
ou Quantile Regression Forests.Com base nos resultados apresentados, o trabalho mostra-se como um primeiro passo importante na construção de sistemas preditivos de crédito, abrindo espaço para futuras melhorias e refinamentos.