一元线性回归案例:分析不良贷款形成的原因

前面我们学习了一元线性回归的原理,本节课用Python实现一元线性回归。

数据读取

首先,读取数据,数据在Excel文件中。

import pandas as pd

bank_data=pd.read_csv("../../data/BankData.csv",index_col="分行编号")
bank_data.head()

运行结果:

查看数据集的形状。

bank_data.shape

运行结果:

(25, 5)

说明:数据获取方式,关注微信公众号“笨鸟学数据分析”领取!

绘制散点图

前面的理论讲解部分,提到的散点图可以通过Python来绘制,代码如下。

from pylab import mpl
mpl.rcParams['font.sans-serif']=['FangSong'] #指定默认字体

from matplotlib import pyplot as plt

x=bank_data["各项贷款余额"]
y=bank_data["不良贷款(亿元)"]

plt.scatter(x,y,c='black')
plt.xlabel('各项贷款余额',fontsize=12)
plt.ylabel('不良贷款(亿元)',fontsize=12)
plt.show()

运行结果:

建模

在建模前,需要对数据做一下转换,因为直接通过列名获取到的数据是一维的,不符合sklearn中模型对于数据的要求,转换代码如下。

X=bank_data['各项贷款余额'].values.reshape(-1,1)
y=bank_data['不良贷款(亿元)'].values.reshape(-1,1)

这里.values表示转换为数组,reshape(-1,1)是一种固定写法,1代表列,-1表示不知道几行,这样,就将X和y转换为符合sklearn要求的数组形式。
接着,调用sklearn中的线性回归模型,代码如下。

from sklearn.linear_model import LinearRegression

slModel=LinearRegression()
slModel.fit(X,y)

运行结果:

LinearRegression()

获得判定系数

在线性回归,一般是判定系数来判断模型拟合效果的好坏,判定系数是一个介于0到1之间的数,越接近于1,拟合效果越好。

slModel.score(X,y)

运行结果:

0.7116126467669923

说明模型的拟合效果还算可以。

获得回归方程

接下来,我们获取参数wb的值,通过coef_属性可以获得w的值,通过intercept_属性可以获得b的值,代码如下。

print(slModel.coef_)
print(slModel.intercept_)

运行结果:

[0.03789471]
-0.8295206165462345

这样,写出回归方程为:
y=-0.83+0.038x
当然,可以调用predict方法给出预测值。

y_pred=slModel.predict(X)
print(y_pred)

运行结果:

[[ 1.72079316]
 [ 3.38816027]
 [ 5.72626369]
 [ 2.23237171]
 [ 6.73805236]
 [-0.21562636]
 [ 3.24037091]
 [ 6.19615805]
 [ 2.81216072]
 [ 1.92921405]
 [ 1.60331957]
 [ 4.18015964]
 [ 1.39110921]
 [ 5.78689522]
 [ 9.15573467]
 [ 2.17552965]
 [-0.26867895]
 [ 1.95574034]
 [ 0.10647865]
 [ 4.45300153]
 [13.12331049]
 [ 2.79700284]
 [ 3.32373927]
 [ 6.60542089]
 [ 3.04331843]]

这个预测值实际上是根据回归方程计算得到的,有了这个预测值,就可以在散点图中加上拟合直线了,代码如下。

fig,ax=plt.subplots()
ax.scatter(x,y,c='black',label="观测值")
ax.plot(x,y_pred,'black',label="回归直线")
plt.legend(loc="lower right")
plt.xlabel('x',fontsize=16)
plt.ylabel('y',fontsize=16)
plt.show()

运行结果:

以上就是用Python做一元线性回归。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注