Case: Consórcio (Classificação)
Totorial de como utilizar regressão logística com a biblioteca statsmodels.
Suponha que uma instituição financeira deseja estimar a probabilidade de um cliente contratou um consórcio de automóvel, p=P(Y=1). Variável resposta: 1 – contratou o consórcio e 0 – não contratou o consórcio.
import numpy as np
import pandas as pd
import statsmodels.formula.api as sm
import seaborn as sns
from sklearn.metrics import confusion_matrix, accuracy_score
from matplotlib import pyplot as plt
df = pd.read_excel("Consorcio.xlsx", sheet_name="BASE DE DADOS")
df.head()
(a) Faça a análise exploratória univariada e interprete todas as variáveis do banco de dados.
#Análise univariada
df.info()
df.describe()
Faça a análise bivariada das variáveis explicativas (covariáveis) vs. a variável resposta. Você acredita que:
- O Valor Investido no Fundo DI (variável DI) é menor, em geral, para quem contratou consórcio?
- O Valor do Financiamento Imobiliário (variável Financiamento) é maior, em geral, para quem contratou consórcio?
- O Valor Aplicado na Poupança (variável Poupança) é maior, em geral, para quem contratou consórcio?
- O Salário do Cliente (variável Salário) é maior, em geral, para quem contratou consórcio?
- O Gasto no Cartão de Crédito (variável CC) é menor, em geral, para quem contratou consórcio?
#Análise Bivariada
g = sns.PairGrid(data=df,
x_vars='Contratou',
y_vars=['DI','Financiamento','Poupança','Salário', 'CC'],
height=5)
g.map(sns.boxplot, )
O Valor Investido no Fundo DI (variável DI) é menor, em geral, para quem contratou consórcio? Sim
O Valor do Financiamento Imobiliário (variável Financiamento) é maior, em geral, para quem contratou consórcio? Sim
O Valor Aplicado na Poupança (variável Poupança) é maior, em geral, para quem contratou consórcio? Sim
O Salário do Cliente (variável Salário) é maior, em geral, para quem contratou consórcio? Sim
O Gasto no Cartão de Crédito (variável CC) é menor, em geral, para quem contratou consórcio? Sim
(c) Obtenha o modelo de regressão logística utilizando 90% de confiança.
log_reg = sm.logit("Contratou ~ DI + Financiamento + Poupança + Salário + CC",
data = df).fit()
print(log_reg.summary())
Como podemos perceber a variável CC não tem a garantia que ela será boa para realizarmos o modelo, portanto iremos retira-la.
log_reg = sm.logit("Contratou ~ DI + Financiamento + Poupança + Salário",
data = df).fit()
print(print(log_reg.summary()))
Iremos realizar o mesmo procedimento com a variável Financiamento.
log_reg = sm.logit("Contratou ~ DI + Poupança + Salário",
data = df).fit()
print(print(log_reg.summary()))
(d) Obtenha a probabilidade estimada.
x = [i for i in df.columns if i != 'Contratou']
df['contrata_prob'] = log_reg.predict(df[x])
df.head()
(e) Obtenha a tabela de classificação.
#Criando um ponto de corte igual a média da variável Contratou
df['contrata_pred'] = [ 1 if i >= 0.50 else 0 for i in df.contrata_prob ]
df.head()
#Matrix de confusão
cm1 = confusion_matrix(df.Contratou, df.contrata_pred)
plt.figure(figsize=(10,8))
sns.set_theme()
sns.heatmap(cm1, annot = True, cbar=False, fmt='d')
print("Acurácia: %.2f" % (accuracy_score(df.Contratou, df.contrata_pred)*100),'%')
print('Especificidade: %.2f' % (cm1[0,0]*100/(cm1[0,0]+ cm1[0,1])),'%')
print('Sensibilidade: %.2f' % (cm1[1,1]*100/(cm1[1,0]+ cm1[1,1])),'%')
Uma acurácia de 91% indica de a cada 100 clientes o modelo irá acertar 91 casos.
Uma sensibilidade de 89% mostra a capacidade do modelo de acertar os clientes que iriam contratar o consórcio.
A especificidade de 92% indica a eficácia em identificar os clientes que não irão contratar o consórcio.