BANCO GAMER
Banco mundialmente conhecido por realizar empréstimo para pessoas apaixonadas por video games de diversas courses sociais.
Este projeto tem como objetivo definir a variavel goal de acordo com as políticas e requisitos definidas pelos diretores e gerentes do banco e estudar os modelos de classificação e random forest na análise de crédito.
# importacação de bibliotecasimport pandas as pd #dataframe
import seaborn as sns
import matplotlib.pyplot as plt #graficos
import numpy as np #modelagem
from sklearn.ensemble import RandomForestClassifier #modelo random forest
from xgboost import XGBClassifier #modelo de classificação
from sklearn.preprocessing import LabelEncoder #transformar string para inteiros
from sklearn.model_selection import train_test_split #separar o dataset de treino e teste
from sklearn.metrics import confusion_matrix #medir métrica
from sklearn.metrics import classification_report #medir métrica
from sklearn.metrics import accuracy_score #medir métrica
# Importação do arquivoimport pandas as pd
file_path = "credit_risk_dataset_original.csv"
dataset_credit_risk = pd.read_csv(file_path)
print(sort(dataset_credit_risk))
dataset_credit_risk.head(5)
"""Dicionario dos dados"""# person_age - Idade (X = Caracteristicas)
# person_income - Renda Anual (X = Caracteristicas)
# person_home_ownership - Casa própria (X = Caracteristicas)
# person_emp_length - Duração do emprego (em anos) (X = Caracteristicas)
# loan_intent - Intenção de empréstimo (X = Caracteristicas)
# loan_amnt - Valor do empréstimo (X = Caracteristicas)
# loan_percent_income - Percentual de renda (X = Caracteristicas)
# cb_person_default_on_file - Inadimplência histórica (X = Caracteristicas)
# Verifica registros invalidos que possuem campos sem informacao contagem = dataset_credit_risk.isnull().sum()
contagem
# Verifica registros duplicadosvalidacao_de_duplicados = dataset_credit_risk.duplicated().sum()
if validacao_de_duplicados == 0:
print("ótimo, Nao existem registros duplicados")
else:
print("Existem registros duplicados")
# Avaliando os tipos das minhas variaveisdataset_credit_risk.information()
#Analisando como está a aleatoriedade de pedidos de crédito para para atingir um
#grupo de pessoas onde a possuo pouco aleatoriedade atingindo a massavalores_unicos = dataset_credit_risk["loan_amnt"]
valores_unicos = pd.DataFrame(valores_unicos, columns=["loan_amnt"])
valores_unicos = valores_unicos.describe().spherical(2)
valores_unicos = valores_unicos.rename(columns={'loan_amnt':'estatísticas descritivas'})
valores_unicos
#Plotando as estatísticas descritivasfig = plt.boxplot(valores_unicos)
fig
– Com o gráfico é possível analisar que não possuímos quase nenhum outlier, facilitando o trabalhar de identificar a massa que
será concentrado a política de crédito, ou seja o banco assumiu como estratégia realizar empréstimo para um grupo
onde se concentra a maioria dos pedidos, não tem muita aleatoridade. De acordo com o boxplot entre o primeiro quartil e o terceiro quartia as solicitações de crédito estão concentradas a maiorias das
massas.
# Avaliando a distribuição dos dados e entender se existe possíveis viessesidade = dataset_credit_risk["person_age"]
idade.describe().spherical(2)
fig = plt.boxplot(idade)
fig
#Filtrando pessoas com idade inferior a forty five anosidade = dataset_credit_risk["person_age"][dataset_credit_risk["person_age"] <= 45]
idade = pd.DataFrame(idade)
idade.head()
#Plotando a visualizaçãofig = plt.boxplot(idade)
fig
* Após alterar a idade reduzindo a visualização para demonstrar o gráfico até idade 45 anos é possivel avaliar que a quantidade
de outliers diminuiu de forma considerável
#Avaliando o percentual de endividamento por conta do empréstimoendividamento = dataset_credit_risk["loan_percent_income"]
endividamento = pd.DataFrame(endividamento)
#Estatisticas descritivas
endividamento.describe().spherical(2)
#Plotando a visualizaçãofig = plt.boxplot(endividamento)
#Avaliando a distribuição com percentual de 40%endividamento = dataset_credit_risk[dataset_credit_risk["loan_percent_income"] < 0.40 ]
endividamento = endividamento["loan_percent_income"]
fig = plt.boxplot(endividamento)
* É possivel avaliar que abaixo de 40% de renda comprometido não existe mais outliers, por definição do banco acredito que seja mais seguro oferta empréstimo para cliente não comprometa sua renda por completo.
Objetivo é definir o perfil de pessoa onde irei aprovar um crédito ou não, Após análise exploratória os diretores e gerente do banco chegaram nas seguintes políticas:
Todos os requisitos precisam ser satisfeitos para possuirem a variavel goal = 1
Goal = 1 (Cliente onde iremos aprovar crédito) e Goal = 0 (Cliente onde não possui o perfil desejado pelo banco)
A — Limite de crédito:
Minimo R$ 8.000,00 e Máximo R$ 12.200,00 (mais público entre Q2 — Q3)
B — Inadimplência passada
Clientes que tem registro de inadimplência anterior não terá crédito aprovado
se cb_person_default_on_file = Y então o crédito será negado, caso contrario o crédito ser
C — Emprego
Possuir emprego fixo por 1 ano seguidos
D — Idades
Possuir idade igual ou inferior a forty five anos
E — Percentual de renda
Não será aprovado empréstimo que comprometa mais que 24% da renda anual
# Remover registros duplicadosdataset_credit_risk.drop_duplicates(maintain="first", inplace=True)
# Aplicar as políticas do banco para obter a variavel goal# A - Limite de crédito
dataset_credit_risk["credit"] = np.the place((dataset_credit_risk["loan_amnt"] >= 8000) & (dataset_credit_risk["loan_amnt"] <= 12000), 1, 0)
dataset_credit_risk.head()
# B - inadimplencia anterior
dataset_credit_risk["inadimplencia"] = np.the place((dataset_credit_risk["cb_person_default_on_file"] == "Y"), 0, 1)
dataset_credit_risk.head()
# C - Emprego
dataset_credit_risk["emprego"] = np.the place((dataset_credit_risk["person_emp_length"] >= 1.0), 1, 0)
dataset_credit_risk.head()
# D - Idade
dataset_credit_risk["idade"] = np.the place((dataset_credit_risk["person_age"] <= 45), 1, 0)
dataset_credit_risk.head()
# E - Percentual de renda
dataset_credit_risk["renda"] = np.the place((dataset_credit_risk["loan_percent_income"] <= 0.24), 1, 0)
dataset_credit_risk.head()
# Definição da variavel goaldataset_credit_risk["target"] = np.the place((dataset_credit_risk["credit"] == 1) & (dataset_credit_risk["emprego"] == 1)
& (dataset_credit_risk["inadimplencia"] == 1) & (dataset_credit_risk["idade"] == 1) & (dataset_credit_risk["renda"] == 1), 1, 0)
dataset_credit_risk.head()
#Removendo as colunas auxiliaresdataset_credit_risk = dataset_credit_risk[["person_age", "person_income", "person_home_ownership", "person_emp_length",
"loan_intent", "loan_amnt", "loan_percent_income", "cb_person_default_on_file","target"]]
# Converter campos strings para numéricos para que o algoritmo possa calcularfor label in ["person_age", "person_income", "person_home_ownership", "person_emp_length",
"loan_intent", "loan_amnt", "loan_percent_income", "cb_person_default_on_file","target"]:
dataset_credit_risk[label] = LabelEncoder().fit_transform(dataset_credit_risk[label])
dataset_credit_risk.information()
# Separando as variaveis X (x = caracteristicas)x = dataset_credit_risk[["person_age", "person_income", "person_home_ownership", "person_emp_length",
"loan_intent", "loan_amnt", "loan_percent_income", "cb_person_default_on_file"]]
x.head()
# Calculando as correlacoescorrelacoes = x.corr()
# plotando a correlacao
plt.determine(figsize=(10,10))
sns.heatmap(information=correlacoes, annot=True)
plt.present()
# Separando as variaveis Y (y = variavel goal)# converter a variavel goal um array e criar a coluna Y
y = dataset_credit_risk["target"].values.tolist()
sort(y)
# Separando o dataset em treino e teste# Vamos seperar em 30%, ou seja 70% sera uma usada para testar
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
Será criado um modelo de classificação e random forest e comparar os seus desempenhos
# Criando os Modelos de MLmodel_RF = RandomForestClassifier(n_estimators=1000) #1000 arvores de decisao
model_XCB = XGBClassifier(n_estimators=1000, learning_rate=0.01)
# Treinando os modelos com os dadosmodel_RF = model_RF.match(x_train, y_train)
print(model_RF)
model_XCB = model_XCB.match(x_train, y_train)
print(model_XCB)
# avaliando a acurácia dos Modelos de MLaccuracy_score_RF = model_RF.rating(x_test, y_test)
accuracy_score_RF = float(accuracy_score_RF)
print("Acurácia de Random Forest:", spherical(accuracy_score_RF * 100,10))
accuracy_score_XCB = model_XCB.rating(x_test, y_test)
accuracy_score_XCB = float(accuracy_score_XCB)
print("Acurácia de XGBoost:", spherical(accuracy_score_RF * 100,10))
# Avaliando a confusion Matrix e o classification Report#RandomForest
mod_RF = model_RF.predict(x_test)
cm_RF = confusion_matrix(mod_RF, y_test)
print(cm_RF)
cr_RM = classification_report(mod_RF, y_test)
print(cr_RM)
# Avaliando a confusion Matrix e o classification Report#XGBoost
mod_XCB = model_XCB.predict(x_test)
cm_XCB = confusion_matrix(mod_XCB, y_test)
print(cm_XCB)
cr_XCB = classification_report(mod_XCB, y_test)
print(cr_XCB)