引言
一元线性回归分析是统计学中的一种基本技术,用于研究一个自变量(解释变量)和一个因变量(响应变量)之间的关系。
一元线性回归模型可以表示为: y=β0+β1x+ϵ
y为因变量,x为自变量,β0为截距项,ϵ为误差项
一元线性回归分析在各个领域都有广泛的用途,主要用途包括:预测,趋势分析,决策制定等等
下面用利用python做一元线性分析
例题
研究用电高峰时居民家庭每小时的用电量与每月总用电量之间的关系
给出居民用电数据如下:
用户 | 每月总用电量X | 每小时用电量Y |
1 | 679 | 0.79 |
2 | 292 | 0.44 |
3 | 1012 | 0.56 |
4 | 493 | 0.79 |
5 | 582 | 2.70 |
6 | 1156 | 3.64 |
7 | 997 | 4.73 |
8 | 2189 | 9.50 |
9 | 1097 | 5.34 |
10 | 2078 | 6.85 |
11 | 1818 | 5.84 |
12 | 1700 | 5.21 |
13 | 747 | 3.25 |
14 | 2030 | 4.43 |
15 | 1643 | 3.16 |
16 | 414 | 0.50 |
17 | 354 | 0.17 |
18 | 1276 | 1.88 |
19 | 745 | 0.77 |
20 | 435 | 1.39 |
21 | 540 | 0.56 |
22 | 874 | 1.56 |
23 | 1543 | 5.28 |
24 | 1029 | 0.64 |
25 | 710 | 4.00 |
26 | 1434 | 0.31 |
27 | 837 | 4.20 |
28 | 1748 | 4.88 |
29 | 1381 | 3.48 |
30 | 1428 | 7.58 |
31 | 1255 | 2.63 |
32 | 1777 | 4.99 |
33 | 370 | 0.59 |
35 | 2316 | 8.19 |
35 | 1130 | 4.79 |
36 | 463 | 0.51 |
37 | 770 | 1.74 |
38 | 724 | 4.10 |
39 | 808 | 3.94 |
40 | 790 | 0.96 |
41 | 783 | 3.29 |
42 | 406 | 0.44 |
43 | 1242 | 3.24 |
44 | 658 | 2.14 |
45 | 1746 | 5.71 |
46 | 468 | 0.64 |
47 | 1114 | 1.90 |
48 | 413 | 0.51 |
49 | 1787 | 8.33 |
50 | 3560 | 14.94 |
51 | 1495 | 5.11 |
52 | 2221 | 3.85 |
53 | 1526 | 3.93 |
一:导入所用的库
#导入库分别的作用为:numpy(数值计算),pandas(数据处理),matplotlib(数据可视化),statsmodels(统计模型)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
#配置matplotlib参数
#rcParams 是一个字典,用于全局性地配置matplotlib的参数,
#font.sans-serif 是一个参数键,用于设置默认的无衬线字体
# ['SimHei'] 是一个列表,指定了字体名称为“SimHei”,黑体
# axes.unicode_minus 是另一个参数键,用于控制matplotlib是否使用Unicode字符来显示负号。
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = True
二:读取数据并作图
将数据复制到excel进行读取,如下
# iloc: 用于基于行和列的位置进行索引
iloc[1:, 2]表示第二行到结束,第三列的所有内容(索引从0开始数)
# .values: 将选中的列转换为NumPy数组
# np.mean(X):使用NumPy库的mean函数计算变量X的平均值
# plt.plot(X, Y, 'bo', label='原始值'):使用matplotlib.pyplot库的plot函数绘制X和Y之间的关系。
# 'bs':指定绘图样式,b表示蓝色,s表示正方形标记。
# label='原始值':为散点图添加标签,这个标签将用于图例(位于左上角)
data = pd.read_excel('月用电量x与小时用电量y关系.xlsx')
X = data.iloc[1:, 2].values
Y = data.iloc[1:, 1].values
print('X的平均值为:',np.mean(X))
print('Y的平均值为:',np.mean(Y))
plt.plot(X, Y, 'bs', label='原始值')
三:使用最小二乘法
# 创建了一个Pandas DataFrame对象,其中包含两列:'x'和'y'。'x'列包含变量X的值,'y'列包含变量Y的值
# 使用Statsmodels库进行普通最小二乘,线性回归分析,调用fit方法来拟合模型
# 打印回归结果的摘要
# 残差是实际观测值与模型预测值之间的差异。MSE是残差平方和的平均值,用于衡量模型的拟合优度。较小的MSE值通常表示模型拟合得更好
df = pd.DataFrame({'x': X, 'y': Y})
re = sm.formula.ols('y ~ x', data=df).fit()
print(re.summary())
print('残差的方差:', re.mse_resid)
四:ols表的解读:
R-squared越接近1,模型拟合得越好,本例中为0.705证明拟合较好
F-statistic: F统计量,用于检验模型中所有系数(除了截距项)是否同时为零。大的F值通常表示模型是显著的。通常结合下面p值判断
p-value (F-statistic): F统计量的p值,该例较小,明显小于0.05,故模型拟合显著
coef(Coefficients)系数:Y=0.0037x-0.8313
系数p值,表示在零假设(该系数为零,即自变量对因变量无影响)为真的情况下,观察到当前或更极端t值的概率。
五:绘制预测线:
# 使用线性回归模型(由re表示)来预测df['x']对应的y值。预测结果存储在变量yh中,再作出预测的线,颜色为红色
yh = re.predict(df['x'])
plt.plot(X, yh, marker='*', mec='r', mfc='w', markersize=6, label='预测值')
# plt.legend():显示图例,图例中包含了之前通过label参数指定的标签
# 设置横纵坐标及标题
plt.title('居民家庭每小时的用电量y与每月总用电量x')
plt.xlabel('每月总用电量x')
plt.ylabel('居民家庭每小时的用电量y')
plt.legend()
plt.savefig('居民家庭每小时的用电量y与每月总用电量x.png')
plt.show()
六完整代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = True
data = pd.read_excel('月用电量x与小时用电量y关系.xlsx')
X = data.iloc[1:, 2].values
Y = data.iloc[1:, 1].values
print('X的平均值为:',np.mean(X))
print('Y的平均值为:',np.mean(Y))
plt.plot(X, Y, 'bs', label='原始值')
df = pd.DataFrame({'x': X, 'y': Y})
re = sm.formula.ols('y ~ x', data=df).fit()
print(re.summary())
print('残差的方差:', re.mse_resid)
yh = re.predict(df['x'])
plt.plot(X, yh, marker='*', mec='r', mfc='w', markersize=6, label='预测值')
plt.title('居民家庭每小时的用电量y与每月总用电量x')
plt.xlabel('每月总用电量x')
plt.ylabel('居民家庭每小时的用电量y')
plt.legend()
plt.savefig('居民家庭每小时的用电量y与每月总用电量x.png')
plt.show()