統計學第十七週 時間序列預測實戰

統計學第十七週 時間序列預測實戰

一、目標:預測未來三期傳統汽車的銷量。
二、數據背景:
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章