统计学第十七周 时间序列预测实战

统计学第十七周 时间序列预测实战

一、目标:预测未来三期传统汽车的销量。
二、数据背景:
03年到19年第一季度分季度的数据,13年之前只有传统汽车的销量,13年之后是传统汽车+新能源汽车的销量,需要预测未来三期传统汽车的销量~
ps:传统汽车的销量会受到新能源汽车的影响噢

三、数据
在这里插入图片描述
四、实战

  1. 首先对各个季度的传统汽车销售量进行绘图展示,以求能够发现相应趋势。
    在这里插入图片描述

    这里时间序列,能够发现一个增长的趋势,同时伴随有季节性的变化。同时在2013年之后增长趋势收到影响,而且此后也会受到新能源汽车的冲击,可能会有所下降。

    新能源汽车销售趋势:
    在这里插入图片描述
    从上图可以看出新能源汽车销量,从2013年开始逐年有上升趋势且在每年的四个季度里面明显带有季度性。

    下面看一下汽车整体的产量量:

在这里插入图片描述

  1. 因此分析传统汽车销售量趋势,可以利用整体汽车销售趋势进行预测,同时预测新能源汽车,最终传统汽车销售趋势=汽车整体销售趋势-新能源汽车趋势

    同时整体汽车销售趋势或新能源汽车销售趋势(从有开始销售)分别进行季节因素、趋势性分析。

    整体汽车销售趋势,这里讲传统汽车和新能源汽车销售数据合并,然后进行分析,利用时间序列分解预测法:
    在这里插入图片描述
    通过对传统汽车与新能源汽车销售数据合并,中心化移动平均值,Y/CMA,得到季节指数,最后得到消除季节指数后的数据:

在这里插入图片描述

在这里插入图片描述
对去季节指数后的数据进行拟合:

在这里插入图片描述
线性回归系数:截距:[52.06273598] 系数: [[11.46096406]]

三次多项式拟合:

f1 is :
[-6.20338405e-03 5.70248844e-01 -1.97978046e+00 1.12985262e+02]
p1 is :

-0.006203 x^3 + 0.5702 x^2 - 1.98 x + 113

可以通过均方误差和判断其拟合应该是有些问题,换用指数形式:(虚线)a*x**b+c

在这里插入图片描述
指数形式和线性回归比较接近,这里可以整体采用线性回归方式:y=11.46096406x+52.06273598

在这里插入图片描述
之后将季节指数乘以对应的数据:

在这里插入图片描述

#coding=utf-8
import numpy as  np
import pandas  as  pd
import  matplotlib.pyplot  as plt
import array
from sklearn.linear_model import LinearRegression
from  scipy.optimize import curve_fit

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

df = pd.read_excel(r'd:\excel\tj\时序数据2.xlsx',sheet_name='Sheet3')
x_parameter = []
y_parameter = []
a_para = []
b_para = []
for x, y in zip(df['no'],df['abc']):
    x_parameter.append([float(x)])
    y_parameter.append([float(y)])
    a_para.append(float(x))
    b_para.append(float(y))

#线性拟合
regr = LinearRegression()
regr.fit(x_parameter,y_parameter)

#predict_outcome = regr.predict()
predictions = {}
predictions['intercept'] = regr.intercept_
predictions['coefficient'] = regr.coef_

plt.scatter(x_parameter,y_parameter,color='blue')
plt.plot(x_parameter,regr.predict(x_parameter),color='red')
print(regr.intercept_,regr.coef_)
#plt.show()
#print(x_parameter[1:])
#三次拟合
f1 = np.polyfit(a_para,b_para,3)
print('f1 is :\n',f1)
p1 = np.poly1d(f1)
print('p1 is :\n',p1)

y_val = p1(a_para)
#plot1 = plt.plot(x_parameter,y_parameter,color='blue')
plot2 = plt.plot(a_para,y_val,color='yellow')

def  fund(x,a,b,c):
    return a*x**b+c
popt,pcov = curve_fit(fund,a_para,b_para)
y_cur = [fund(i,popt[0],popt[1],popt[2]) for i in a_para]
plt.plot(a_para,y_cur,'r--')
plt.show()

下面来预测新能源汽车销量,同样按照上述的步骤进行:
在这里插入图片描述
消除季节指数后,M列数据即是。
在这里插入图片描述
然后对消除季节后数据进行预测:
在这里插入图片描述
上图中a_para中为消除季节后的数据,针对其数据做出预测:

线性回归:

在这里插入图片描述

截距:[-71.95662021] 系数[[1.60073342]]

y=1.6007334x-71.95662021

三次多项式拟合:

f1 is :
 [ 2.35557293e-03 -2.94892759e-01  1.27889423e+01 -1.91410015e+02]
p1 is :
        
0.002356 x^3 - 0.2949 x^2 + 12.79 x - 191.4

在这里插入图片描述

这里可以采用拟合的三次多项式:
f(x)=0.002356 x^3 - 0.2949 x^2 + 12.79 x - 191.4
对应的是x>=41 ;x<41 f(x)=0

之后在将季节指数乘以该函数回归相应的预测数据:
在这里插入图片描述
新能源汽车销量预测=消除季节后预测*季节指数,
在这里插入图片描述

新能源汽车销量预测:从2013年开始有的销量:
在这里插入图片描述
因此传统汽车销量预测如下:
在这里插入图片描述
最终形成上面数据,然后进行绘图:

在这里插入图片描述
上表上线为传统汽车的销量预测,下面线为新能源汽车的销量预测。看到这样的结果感觉应该是哪里出现了问题,感觉好像要的不一样。

注:代码参考

  1. 线性回归:https://blog.csdn.net/qq_41799291/article/details/89640428
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值