当前位置:   article > 正文

学习记录1-一元线性回归模型(附上python代码)_python计算y0的预测区间

python计算y0的预测区间

我们上应用回归分析(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]

代码整理(完整版):

  1. # -*- coding: UTF-8 -*-
  2. #首先导入我们需要的库,我用的是pycharm,在pycharm事先安装好这些库
  3. import numpy as np
  4. import statsmodels.api as sm
  5. import statsmodels.formula.api as smf
  6. import matplotlib.pyplot as plt
  7. import pandas as pd
  8. from patsy import dmatrices
  9. from statsmodels.stats.api import anova_lm
  10. import scipy
  11.  # Load data
  12. df = pd.read_csv('‪C:\Users\joyyiyi\Desktop\练习2.15.csv')
  13. #(1) 画散点图代码:
  14. fig, ax = plt.subplots(figsize=(8, 6))
  15. ax.plot(df['x'], df['y'], 'o', label='data')
  16. ax.legend(loc='best')
  17. plt.show()
  18. #(3)OLS建模求出回归方程:
  19. #=========第一种建模方======================================
  20. y,X = dmatrices('y~x', data=df, return_type = 'dataframe')
  21. mod = sm.OLS(y,X)
  22. result = mod.fit()
  23. print(result.summary())
  24. #==========第二种建模方式(类R语言方式)======================================
  25. result1 = smf.ols('y~x',data=df).fit()
  26. # print(result1.params),这种只输出回归系数结果
  27. print(result1.summary())
  28. #(4)求回归标准误差
  29. print(result.scale) #result.scale是σ²,回归标准误差是σ,要开根号np.sqrt(result.scale)
  30. #(5)(6)(8)答案在问题(3)结果已经给出
  31. #问题(5): 与的置信度为95%的区间估计分别为:[-0.701,0.937],[0.003,0.005]
  32. #问题(6):R方=0.9
  33. #问题(8):的P值=0.000
  34. #(7)方差分析
  35. table = anova_lm(result, typ=2)
  36. print(table)
  37. #(9)相关系数的显著性检验
  38. #pearson相关系数检验
  39. cortest = scipy.stats.pearsonr(df['x'],df['y'])
  40. print(cortest)
  41. #(10) 计算残差
  42. eres = result.resid
  43. fig, ax = plt.subplots(figsize=(8, 6))
  44. ax.plot(eres, 'o', label='resid')
  45. plt.show()
  46. #我们老师还教了标准化残差和学生化残差的代码
  47. # 标准化残差
  48. stand_eres = eres / np.sqrt(result.scale) # eres.std()
  49. print(stand_eres)
  50. # 学生化残差
  51. infl = result.get_influence()
  52. # studentied_eres = infl.summary_table()
  53. studentied_eres = infl.resid_studentized_internal
  54. print(studentied_eres)
  55. # 问题(11)单值预测,当x0=1000
  56. print("单值预测\n\n")
  57. predictvalues = result.predict(pd.DataFrame({'x': [1000]}))
  58. print(predictvalues)
  59. print("\n\n")
  60. #问题(11)得到y0=3.703
  61. #问题(12)和(13)代码:
  62. predictions = result.get_prediction(pd.DataFrame({'x': [1000]}))
  63. print("E(Y0)区间估计以及y0的精确预测区间:\n\n")
  64. print(predictions.summary_frame(alpha=0.05))
  65. print("\n\n")
  66. print("y0的近似预测区间:\n")#手动公式计算
  67. ylow=3.703-2*np.sqrt(result.scale)
  68. yup=3.703+2*np.sqrt(result.scale)
  69. print(ylow,yup)

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/683696
推荐阅读
相关标签
  

闽ICP备14008679号