学习记录1-一元线性回归模型(附上python代码)

我们上应用回归分析(R语言版)这门课,老师每讲完一章就会带我们一起写这一章模型的代码,由于我们班同学大多会python不会R语言(包括我~~),所以代码都用python写。

这次写此书第二章.一元线性回归课后习题2.15的一些代码:

题目:一家保险公司十分关心其总公司营业部加班的程度,决定认真调查一下现状。经过10周时间,收集了每周加班时间的数据和签发的新保单数目, x 为每周签发的新保单数目, y 为每周加班时间(小时),数据见表-练习2.15

求:

(1)画散点图。

(2) x 与 y 之间是否大致呈线性关系?
(3)用最小二乘估计求出回归方程。 
(4)求回归标准误差
(5)给出的置信度为95%的区间估计。
(6)计算:x与 y 的决定系数。 
(7)对回归方程做方差分析。
(8)做回归系数β1的显著性检验
(9)做相关系数的显著性检验。
(10)对回归方程做残差图并做相应的分析。
(11)该公司预计下一周签发新保单 x0 =1000张,需要的加班时间是多少?
(12)给出 y0 的置信度为95%的精确预测区间和近似预测区间。
(13)给出 E ( y0 )的置信度为95%的区间估计

用到的数据表-练习2.15

 代码部分:

# -*- coding: UTF-8 -*-
#首先导入我们需要的库,我用的是pycharm,在pycharm事先安装好这些库
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import pandas as pd
from patsy import dmatrices
from statsmodels.stats.api import anova_lm
import scipy

 # Load data
df = pd.read_csv('‪C:\Users\joyyiyi\Desktop\练习2.15.csv')

#(1)   画散点图代码:
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(df['x'], df['y'], 'o', label='data')
ax.legend(loc='best')
plt.show()

#(3)OLS建模求出回归方程:
#=========第一种建模方======================================
y,X = dmatrices('y~x', data=df, return_type = 'dataframe')
mod = sm.OLS(y,X)
result = mod.fit()
print(result.summary())
#==========第二种建模方式(类R语言方式)======================================
result1 = smf.ols('y~x',data=df).fit()
# print(result1.params),这种只输出回归系数结果
print(result1.summary())
#(4)求回归标准误差 
print(result.scale) #result.scale是σ²,回归标准误差是σ,要开根号np.sqrt(result.scale)

#(5)(6)(8)答案在问题(3)结果已经给出

#问题(5): 的置信度为95%的区间估计分别为:[-0.701,0.937],[0.003,0.005]

#问题(6):R方=0.9

#问题(8):的P值=0.000

#(7)方差分析
table = anova_lm(result, typ=2)
print(table)

#(9)相关系数的显著性检验
#pearson相关系数检验
cortest = scipy.stats.pearsonr(df['x'],df['y'])
print(cortest)
#(10) 计算残差
eres = result.resid
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(eres, 'o', label='resid')
plt.show()
#我们老师还教了标准化残差和学生化残差的代码
# 标准化残差
stand_eres = eres / np.sqrt(result.scale)  # eres.std()
print(stand_eres)

# 学生化残差
infl = result.get_influence()
# studentied_eres = infl.summary_table()
studentied_eres = infl.resid_studentized_internal
print(studentied_eres)
# 问题(11)单值预测,当x0=1000
print("单值预测\n\n")
predictvalues = result.predict(pd.DataFrame({'x': [1000]}))
print(predictvalues)
print("\n\n")

#问题(11)得到y0=3.703

#问题(12)和(13)代码:
predictions = result.get_prediction(pd.DataFrame({'x': [1000]}))
print("E(Y0)区间估计以及y0的精确预测区间:\n\n")
print(predictions.summary_frame(alpha=0.05))
print("\n\n")
print("y0的近似预测区间:\n")#手动公式计算
ylow=3.703-2*np.sqrt(result.scale)
yup=3.703+2*np.sqrt(result.scale)
print(ylow,yup)
问题(1)画散点图:

 建模结果: 

问题(7)对回归方程做方差分析结果:

问题(9)相关系数的显著性检验:

问题(10)残差图:

分析(比较简单哈):残差值正常且分布均匀

问题(12): y0 的置信度为95%的精确预测区间:[2.519,4.887]和近似预测区间:[2.743,4.663]。
问题(13): E ( y0 )的置信度为95%的区间估计:[3.284,4.123]

代码整理(完整版):

​
# -*- coding: UTF-8 -*-
#首先导入我们需要的库,我用的是pycharm,在pycharm事先安装好这些库
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import pandas as pd
from patsy import dmatrices
from statsmodels.stats.api import anova_lm
import scipy
 # Load data
df = pd.read_csv('‪C:\Users\joyyiyi\Desktop\练习2.15.csv')

#(1)   画散点图代码:
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(df['x'], df['y'], 'o', label='data')
ax.legend(loc='best')
plt.show()

#(3)OLS建模求出回归方程:
#=========第一种建模方======================================
y,X = dmatrices('y~x', data=df, return_type = 'dataframe')
mod = sm.OLS(y,X)
result = mod.fit()
print(result.summary())
#==========第二种建模方式(类R语言方式)======================================
result1 = smf.ols('y~x',data=df).fit()
# print(result1.params),这种只输出回归系数结果
print(result1.summary())
#(4)求回归标准误差 
print(result.scale) #result.scale是σ²,回归标准误差是σ,要开根号np.sqrt(result.scale)
#(5)(6)(8)答案在问题(3)结果已经给出

#问题(5): 与的置信度为95%的区间估计分别为:[-0.701,0.937],[0.003,0.005]

#问题(6):R方=0.9

#问题(8):的P值=0.000

#(7)方差分析
table = anova_lm(result, typ=2)
print(table)

#(9)相关系数的显著性检验
#pearson相关系数检验
cortest = scipy.stats.pearsonr(df['x'],df['y'])
print(cortest)
#(10) 计算残差
eres = result.resid
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(eres, 'o', label='resid')
plt.show()
#我们老师还教了标准化残差和学生化残差的代码
# 标准化残差
stand_eres = eres / np.sqrt(result.scale)  # eres.std()
print(stand_eres)

# 学生化残差
infl = result.get_influence()
# studentied_eres = infl.summary_table()
studentied_eres = infl.resid_studentized_internal
print(studentied_eres)
# 问题(11)单值预测,当x0=1000
print("单值预测\n\n")
predictvalues = result.predict(pd.DataFrame({'x': [1000]}))
print(predictvalues)
print("\n\n")
#问题(11)得到y0=3.703

#问题(12)和(13)代码:
predictions = result.get_prediction(pd.DataFrame({'x': [1000]}))
print("E(Y0)区间估计以及y0的精确预测区间:\n\n")
print(predictions.summary_frame(alpha=0.05))
print("\n\n")
print("y0的近似预测区间:\n")#手动公式计算
ylow=3.703-2*np.sqrt(result.scale)
yup=3.703+2*np.sqrt(result.scale)
print(ylow,yup)
​

第一篇学习笔记,排版可能不太ok,会继续努力,有错误地方请指出~谢谢大家~有问题欢迎交流~

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值