使用 python 做线性回归,scipy,statsmodels,sklearn


使用 python 做线性回归分析有好几种方式,常要的是 scipy 包,statsmodels 包,以及 sklearn 包。但是, 这些包目前都不能处理共线性,即自动剔除部分共线性的变量,需要自己去编函数,这一点不如 spss 或 r 语言。

个人感觉 python 做线性回归最好的包是 statsmodels 包。

假设有下面的数据存储在 excel 文件里面:

不良贷款各项贷款余额本年累计应收贷款贷款项目个数本年固定资产投资额
0.967.36.8551.9
1.1111.319.81690.9
4.8173.07.71773.7
3.280.87.21014.5
7.8199.716.51963.2
2.716.22.212.2
1.6107.410.71720.2
12.5185.427.11843.8
1.096.11.71055.9
2.672.89.11464.3
0.364.22.11142.7
4.0132.211.22376.7
0.858.66.01422.8
3.5174.612.726117.1
10.2263.515.634146.7
3.079.38.91529.9
0.214.80.6242.1
0.473.55.91125.3
1.024.75.0413.4
6.8139.47.22864.3
11.6368.216.832163.9
1.695.73.81044.5
1.2109.610.31467.9
7.2196.215.81639.7
3.2102.212.01097.1

首先使用 pandas 读取 excel 数据:

import pandas as pd

# 读取 excel 数据,引号里面是 excel 文件在电脑的存储位置
datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') 

1. 用 scipy 包

scipy.stats 中的 linregress 函数可以做一元线性回归。假如因变量为 “不良贷款”,自变量为 “各项贷款余额”,全部 python 代码如下:

import scipy.stats as st
import pandas as pd

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置
y = datas.iloc[:, 1] # 因变量为第 2 列数据
x = datas.iloc[:, 2] # 自变量为第 3 列数据

# 线性拟合,可以返回斜率,截距,r 值,p 值,标准误差
slope, intercept, r_value, p_value, std_err = st.linregress(x, y)

print(slope)# 输出斜率
print(intercept) # 输出截距
print(r_value**2) # 输出 r^2

scipy 中的回归分析比较简单,目前只能做一元线性回归,也不能用来做预测。

2. 用 statsmodel 包

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

datas = pd.read_excel(r'datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置
y = datas.iloc[:, 0] # 因变量为第 1列数据
x = datas.iloc[:, 1] # 自变量为第 2 列数据
x = sm.add_constant(x) # 若模型中有截距,必须有这一步
model = sm.OLS(y, x, hasconst=1 ) # 构建最小二乘模型并拟合
results = model.fit()
print(results.summary()) # 输出回归结果

# 画图
# 这行代码使得 pyplot 画出的图形中可以显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # mac 系统下字体: 黑体 'Heiti SC', 宋体:'Songti SC'

predicts = results.predict() # 模型的预测值
x = datas.iloc[:, 1] # 自变量为第 3 列数据
plt.scatter(x, y, label='实际值') # 散点图
plt.plot(x, predicts, color = 'red', label='预测值')
plt.legend() # 显示图例,即每条线对应 label 中的内容
plt.show() # 显示图形

统计结果如下:
在这里插入图片描述

画出的实际值与预测值如下图:

在这里插入图片描述
注意:若导入包时使用命令 import statsmodels.formula.api as sm, 则在回归分析时不用添加截距 add_constant,但是必须使用统计语言给出模型信息,代码如下:

import pandas as pd
import statsmodels.formula.api as sm
import matplotlib.pyplot as plt

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置
model = sm.ols('不良贷款~各项贷款余额', datas).fit() # 构建最小二乘模型并拟合,
                               #此时不用单独输入 x,y了,而是将自变量与因变量用统计语言公式表示,将全部数据导入
print(model.summary()) # 输出回归结果


# 画图
# 这两行代码在画图时添加中文必须用
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

predicts = model.predict() # 模型的预测值
y = datas.iloc[:, 1] # 因变量为第 2 列数据
x = datas.iloc[:, 2] # 自变量为第 3 列数据
plt.scatter(x, y, label='实际值')
plt.plot(x, predicts, color = 'red', label='预测值')
plt.legend() # 显示图例,即每条线对应 label 中的内容
plt.show() # 显示图形

在多元回归中,只需把自变量改为多列数据即可,假如不良贷款为因变量,从第3列到第6列都是因变量,则使用 statsmodels 包的全部 python 代码如下:

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置
y = datas.iloc[:, 1] # 因变量为第 2 列数据
x = datas.iloc[:, 2:6] # 自变量为第 3 列到第 6 列数据
x = sm.add_constant(x) # 若模型中有截距,必须有这一步
model = sm.OLS(y, x).fit() # 构建最小二乘模型并拟合
print(model.summary()) # 输出回归结果

回归结果:
在这里插入图片描述

3. 用 sklearn 包

sklearn 包是机器学习中常见的 python 包,做统计分析时,它并不能像 statsmodels 那样生成非常详细的统计分析结果。默认自变量与因变量数据都是二维数据。一元回归时,自变量与因变量都需要处理下,总体上,sklearn 做线性回归有点麻烦。

对于上面同样的例子:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置
y = datas.iloc[:, 1] # 因变量为第 2 列数据
x = datas.iloc[:, 2] # 自变量为第 3 列数据

# 将 x,y 分别增加一个轴,以满足 sklearn 中回归模型认可的数据
x = x[:, np.newaxis]
y = y[:, np.newaxis]

model = LinearRegression() # 构建线性模型
model.fit(x, y) # 自变量在前,因变量在后
predicts = model.predict(x) # 预测值
R2 = model.score(x, y) # 拟合程度 R2
print('R2 = %.2f' % R2) # 输出 R2
coef = model.coef_ # 斜率
intercept = model.intercept_ # 截距
print(model.coef_, model.intercept_) # 输出斜率和截距

# 画图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

y = datas.iloc[:, 1] # 因变量为第 2 列数据
x = datas.iloc[:, 2] # 自变量为第 3 列数据
plt.scatter(x, y, label='实际值') # 散点图
plt.plot(x, predicts, color = 'red', label='预测值')
plt.legend() # 显示图例,即每条线对应 label 中的内容
plt.show() # 显示图形

用 sklearn 做多元回归时,自变量不需要单独处理了,全部代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置
y = datas.iloc[:, 1] # 因变量为第 2 列数据
x = datas.iloc[:, 2:6] # 自变量为第 3 列到第 6 列数据

# 将 y 分别增加一个轴,以满足 sklearn 中回归模型认可的数据
# 此时由于 x 是多元变量,则不用添加新的轴了
y = y[:, np.newaxis]

model = LinearRegression() # 构建线性模型
model.fit(x, y) # 自变量在前,因变量在后
predicts = model.predict(x) # 预测值
R2 = model.score(x, y) # 拟合程度 R2
print('R2 = %.3f' % R2) # 输出 R2
coef = model.coef_ # 斜率
intercept = model.intercept_ # 截距
print(model.coef_, model.intercept_) # 输出斜率和截距

转载于个人公众号:Python 统计分析与数据科学

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心态与习惯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值