统计学第十七周 时间序列预测实战
一、目标:预测未来三期传统汽车的销量。
二、数据背景:
03年到19年第一季度分季度的数据,13年之前只有传统汽车的销量,13年之后是传统汽车+新能源汽车的销量,需要预测未来三期传统汽车的销量~
ps:传统汽车的销量会受到新能源汽车的影响噢
三、数据
四、实战
-
首先对各个季度的传统汽车销售量进行绘图展示,以求能够发现相应趋势。
这里时间序列,能够发现一个增长的趋势,同时伴随有季节性的变化。同时在2013年之后增长趋势收到影响,而且此后也会受到新能源汽车的冲击,可能会有所下降。
新能源汽车销售趋势:
从上图可以看出新能源汽车销量,从2013年开始逐年有上升趋势且在每年的四个季度里面明显带有季度性。下面看一下汽车整体的产量量:
-
因此分析传统汽车销售量趋势,可以利用整体汽车销售趋势进行预测,同时预测新能源汽车,最终传统汽车销售趋势=汽车整体销售趋势-新能源汽车趋势
同时整体汽车销售趋势或新能源汽车销售趋势(从有开始销售)分别进行季节因素、趋势性分析。
整体汽车销售趋势,这里讲传统汽车和新能源汽车销售数据合并,然后进行分析,利用时间序列分解预测法:
通过对传统汽车与新能源汽车销售数据合并,中心化移动平均值,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年开始有的销量:
因此传统汽车销量预测如下:
最终形成上面数据,然后进行绘图:
上表上线为传统汽车的销量预测,下面线为新能源汽车的销量预测。看到这样的结果感觉应该是哪里出现了问题,感觉好像要的不一样。
注:代码参考
- 线性回归:https://blog.csdn.net/qq_41799291/article/details/89640428