BANCO GAMER
Banco mundialmente conhecido por realizar empréstimo para pessoas apaixonadas por video video games de diversas programs sociais.
Este projeto tem como objetivo definir a variável objective de acordo com as políticas e requisitos definidas pelos diretores e gerentes do banco, ou seja definir quais são os perfis que o banco tem interesse em emprestar recursos financeiros e fazer com que os modelos de classificação e random forest estudem os perfis para 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 45 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 objective = 1
Purpose = 1 (Cliente onde iremos aprovar crédito) e Purpose = 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 45 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(keep="first", inplace=True)
# Aplicar as políticas do banco para obter a variavel objective# 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 objectivedataset_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.decide(figsize=(10,10))
sns.heatmap(info=correlacoes, annot=True)
plt.current()
# Separando as variaveis Y (y = variavel objective)# converter a variavel objective 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.score(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.score(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)
Após uma densa análise do dataset pude vivenciar uma experiência que simula atividade de um cientista de dados, estou buscando vivenciar esses desafios para que eu possa estar compatível com os requisitos de uma posição de cientista de dados, executar este estudo para mim foi importante pois puder passar por diversas etapas chegando até a etapa mais gloriosa, sendo o momento de teste e aferir as effectivity dos modelos que selecionei, no meu exemplo ambos os modelos tiveram resultados semelhantes, caso contrario o modelo a ser selecionado para implantar em produção com certeza é o que apresenta as melhores métricas, é importante que destacar que avaliar diversos modelos é importante para que se obtenha a melhor effectivity.