Logistic回归

Reads: 2115 Edit

1 数据说明

“bankloan.xlsx”数据中包含了银行客户身份信息和是否违约数据,我们将根据该数据建立客户身份指标对是否违约影响的多元Logistic回归模型。

2 初步回归

# 引入模块
import numpy as np
import pandas as pd
import statsmodels.api as sm


# 读取外部数据
data = pd.read_excel('D:\\Desktop\\bankloan.xlsx', sheet_name='Sheet1', na_values='n/a')
data_balance = data.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
y=data_balance.loc[:, '违约']
X=data_balance.loc[:,'年龄':'其他负债']
X=sm.add_constant(X)
logit_model = sm.Logit(y, X)
logit_results = logit_model.fit()
print(logit_results.summary())

pyt-88

注意:Logit模型的系数不能够直接进行影响程度的解释,需要计算边际影响

margeff = logit_results.get_margeff()
print(margeff.summary())

pyt-89

3 逐步回归

statsmodels没有可以直接调用的逐步回归方法,这里简单根据系数的显著性水平是否大于0.1来进行逐步回归。一般来说,在多元线性回归中,即使常数项也不显著,也应该加入模型中。代码如下:

X_step = X
pv_var = pd.DataFrame()
pv_var['index'] = X_step.columns
pv_var['pv'] = pd.Index(logit_results.pvalues)

while (pv_var['pv'] > 0.1).any():
    remove = pv_var.sort_values(by='pv',ascending=False)['index'][:1].values[0]
    X_step.drop(remove,axis=1,inplace=True)
    logit_model_step = sm.Logit(y, X_step)
    logit_results_step = logit_model_step.fit()
    pv_var = pd.DataFrame()
    pv_var['index'] = X_step.columns
    pv_var['pv'] = pd.Index(logit_results_step.pvalues)

if 'const' not in X_step.columns:
    X_step = sm.add_constant(X_step)
logit_model_step = sm.Logit(y, X_step)
logit_results_step = logit_model_step.fit()
print(logit_results_step.summary())

最终逐步回归选择了年龄、工龄、地址、负债率和信用卡负债这5个指标,其这5个指标的P值均小于0.1,是显著的。

pyt-90

margeff_step = logit_results_step.get_margeff()
print(margeff_step.summary())

最终,计算出的编辑效应显示:年龄上升1单位可以使违约率提高约0.42%,而工龄上升1单位可以使违约率下降约3.34%,...。

pyt-91



获取案例数据和源代码,请关注微信公众号并回复:Python_dt8


Comments

Make a comment