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())
注意:Logit模型的系数不能够直接进行影响程度的解释,需要计算边际影响
margeff = logit_results.get_margeff()
print(margeff.summary())
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,是显著的。
margeff_step = logit_results_step.get_margeff()
print(margeff_step.summary())
最终,计算出的编辑效应显示:年龄上升1单位可以使违约率提高约0.42%,而工龄上升1单位可以使违约率下降约3.34%,...。