- 前言
- 一、用excel 做线性回归
- (一)Excel 数据分析选项设置
- (二)线性回归分析
- 二、用jupyter编程实现
- (一)借助skleran
- (二)不借助第三方库,用最小二乘法
- 总结
前言
本文用excel 中数据分析功能和jupyter 编程做线性回归练习。分别选取20、200、2000(或20000)组数据,进行练习。记录回归方程式、相关系数R2
一、用excel 做线性回归 (一)Excel 数据分析选项设置
- 我们首先打开excel 并新建一个空白工作薄
- Excel 默认下是没有数据分析选项的,所以需要添加数据分析选项。
- 点击【文件】。
- 点击【选项】。
- 在【加载项】中,选择
,再点击【转到(G)…】。
- 选中分析数据库和分析数据库-VBA,然后点击确定。
- 然后最右边就有了【数据分析】选项。
准备好 20 条身高-体重的数据,选中所有的数据,然后点击【数据分析】。
选择【回归】,然后点击【确定】。
点击图标。
选中 X,Y 值输入区域(这里我选择的是X: B2→B21, Y: C2→C21)
然后勾选【线性拟合图】并点击【确定】即可。
这样,数据分析就完成了,左侧的数据是一些分析记过,这个图就是线性拟合图。(20组数据)
200组数据的分析:
2000组数据的分析:
二、用jupyter编程实现 (一)借助skleran
- 先导入数据集文件
这里可以看见导入成功
- 先导入需要的包,做好数据准备工作。
import pandas as pd
import numpy as np
from numpy import array
from sklearn import linear_model
import matplotlib.pyplot as plt
import math
d=pd.read_excel('weights_heights.xlsx')
d.shape
3. 选取20组数据
#20个
x1 = array(d[['Height']].values[:20,:])
y1 = array(d[['Weight']].values[:20,:])
model = linear_model.LinearRegression()
model.fit(x1,y1)
#斜率
print(model.coef_)
#截距
print(model.intercept_)
a=model.intercept_
b=model.coef_
y_hate1=b*x1+a
print("线性回归方程为:y1=",b,"x1",a)
#计算R^2
model.score(x1,y1)
plt.figure()
plt.scatter(x1,y1)#散点图绘制初始数据
plt.plot(x1,y_hate1,color='r')#绘制直线
plt.show()
结果:
4. 选取200组数据
#200个
x2 = array(d[['Height']].values[:200,:])
y2 = array(d[['Weight']].values[:200,:])
model = linear_model.LinearRegression()
model.fit(x2,y2)
#斜率
print(model.coef_)
#截距
print(model.intercept_)
a=model.intercept_
b=model.coef_
y_hate2=b*x2+a
print("线性回归方程为:y2=",b,"x2",a)
#计算R^2
model.score(x2,y2)
plt.figure()
plt.scatter(x2,y2)#散点图绘制初始数据
plt.plot(x2,y_hate2,color='r')#绘制直线
plt.show()
结果:
5. 选取2000组数据
#2000个
x3 = array(d[['Height']].values[:2000,:])
y3 = array(d[['Weight']].values[:2000,:])
model = linear_model.LinearRegression()
model.fit(x3,y3)
#斜率
print(model.coef_)
#截距
print(model.intercept_)
a=model.intercept_
b=model.coef_
y_hate3=b*x3+a
print("线性回归方程为:y3=",b,"x3",a)
#计算R^2
model.score(x3,y3)
plt.figure()
plt.scatter(x3,y3)#散点图绘制初始数据
plt.plot(x3,y_hate3,color='r')#绘制直线
plt.show()
结果:
- 选取20组数据
#20个
#计算平均值
x1_mean=np.mean(x1)
y1_mean=np.mean(y1)
#计算a,b
num=0.0#分子
d=0.0#分母
m=0.0
for x1_i,y1_i in zip(x1,y1):
num+=(x1_i-x1_mean)*(y1_i-y1_mean)
d+=(x1_i-x1_mean)**2
m+=(y1_i-y1_mean)**2
a1=num/d
b1=y1_mean-a1*x1_mean
y_hate=a1*x1+b1
print("线性回归方程为:y1=",a1,"x1",b1)
#计算R^2
print("R^2:",((num/math.sqrt(d*m))**2))
plt.scatter(x1,y1)
plt.plot(x1,y_hate,color='g')#绘制直线
plt.show()
结果:
2. 选取200组数据
#计算平均值
#200个
x2_mean=np.mean(x2)
y2_mean=np.mean(y2)
#计算a,b
num=0.0#分子
d=0.0#分母
m=0.0
for x2_i,y2_i in zip(x2,y2):
num+=(x2_i-x2_mean)*(y2_i-y2_mean)
d+=(x2_i-x2_mean)**2
m+=(y2_i-y2_mean)**2
a2=num/d
b2=y2_mean-a2*x2_mean
y_hate=a2*x2+b2
print("线性回归方程为:y2=",a2,"x2",b2)
#计算R^2
print("R^2:",((num/math.sqrt(d*m))**2))
plt.scatter(x2,y2)
plt.plot(x2,y_hate,color='g')#绘制直线
plt.show()
结果:
3. 选取2000组数据
#2000个
#计算平均值
x3_mean=np.mean(x3)
y3_mean=np.mean(y3)
#计算a,b
num=0.0#分子
d=0.0#分母
m=0.0
for x3_i,y3_i in zip(x3,y3):
num+=(x3_i-x3_mean)*(y3_i-y3_mean)
d+=(x3_i-x3_mean)**2
m+=(y3_i-y3_mean)**2
a3=num/d
b3=y3_mean-a3*x3_mean
y_hate=a3*x3+b3
print("线性回归方程为:y3=",a3,"x3",b3)
#计算R^2
print("R^2:",((num/math.sqrt(d*m))**2))
plt.scatter(x3,y3)
plt.plot(x3,y_hate,color='g')#绘制直线
plt.show()
结果:
总结
由此可见,三种方式得出来的结果都相差不大,精度也只是略微有些差别。通过jupyter 编程可以看出,利用skleran 会比直接编写程序更加简便。而excel 的数据分析功能也是很全面、强大的。这三种方式各有优缺点,在不同的地方,我们可以选择不同的解决方式。



