赞
踩
我们上应用回归分析(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,会继续努力,有错误地方请指出~谢谢大家~有问题欢迎交流~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。