通過Python 代碼實現時間序列數據的統計學預測模型

2020-12-25 deephub

在本篇中,我們將展式使用 Python 統計學模型進行時間序列數據分析。

** 問題描述 **

目標:根據兩年以上的每日廣告支出歷史數據,提前預測兩個月的廣告支出金額。

原始數據:2017-01-01 到 2019-09-23 期間的每日廣告支出。

數據準備:劃分訓練集和測試集。

df1 = data[['Date','Spend']].set_index('Date')train = df1.iloc[:933,:]test = df1.iloc[933:,:]test.shape,train.shape

測試集大小:(63,1);訓練集大小:(933,1)。

本文目錄

綜述時間序列分析常用統計模型單變量時間序列數據建模的關鍵要素ARIMAACF 和 PACFSARIMA案例:通過 SARIMA 預測廣告支出ETSETSHolt-Winter 季節性預測算法案例:通過 Holt-Winter 季節性預測算法預測廣告支出算法對比結束語綜述

時間序列分析常用統計模型

單變量時間序列統計學模型,如:平均方法、平滑方法、有/無季節性條件的 ARIMA 模型。多變量時間序列統計學模型,如:外生回歸變量、VAR。附加或組件模型,如:Facebook Prophet、ETS。結構化時間序列模型,如:貝葉斯結構化時間序列模型、分層時間序列模型。在本篇文章中,我們主要關注 SARIMA 和 Holt-winters 方法。

單變量時間序列統計學模型的關鍵要素

如果我們想要對時間序列數據進行上述統計學模型分析,需要進行一系列處理使得:(1)數據均值(2)數據方差 (3)數據自協方差 這三個指標不依賴於時間項。即時間序列數據具有平穩性。

如何明確時間序列數據是否具有平穩性?可以從兩個特徵進行判斷。(1) 趨勢,即均值隨時間變化;(2) 季節性,即方差隨時間變化、自協方差隨時間變化。若滿足以上兩個條件,則時間序列數據不符合平穩性要求。

可以通過以下方法消除上述問題:

變換,如:取對數、取平方等。平滑處理,如:移動平均等。差分。分解。多項式擬合,如:擬合回歸。ARIMA

Autoregressive Integrated Moving Average model (ARIMA),差分整合移動平均自回歸模型。ARIMA(p,d,q)主要包含三項:

p:AR項,即自回歸項(autoregression),將時間序列下一階段描述為前一階段數據的線性映射。 d項,即積分項(integration),時間序列的差分預處理步驟,使其滿足平穩性要求 q:MA項,即移動平均項(moving average),將時間序列下一階段描述為前一階段數據平均過程中的殘留誤差的線性映射。

該模型需要指定 p d q 三項參數,並按照順序執行。ARIMA 模型也可以用於開發 AR, MA 和 ARMA 模型。

ACF 和 PACF 圖

自相關函數,autocorrelation function(ACF),描述了時間序列數據與其之後版本的相關性(如:Y(t) 與 Y(t-1) 之間的相關性)。

偏自相關函數,partial autocorrelation function(PACF),描述了各個序列的相關性。

通過 PACF 圖可以確定 p通過 ACF 圖可以確定 qSARIMA

季節性差分自回歸滑動平均模型,seasonal autoregressive integrated moving averaging(SARIMA),在 ARIMA 模型的基礎上進行了季節性調節。

其形式為:SARIMA(p,d,q)(P,D,Q)s,其中P,D,Q為季節參數,s為時間序列周期。

案例:通過 SARIMA 預測廣告支出

首先,我們建立 test_stationarity 來檢查時間序列數據的平穩性。

from statsmodels.tsa.stattools import adfullerdf1=df.resample('D', how=np.mean)def test_stationarity(timeseries):rolmean = timeseries.rolling(window=30).mean() rolstd = timeseries.rolling(window=30).std() plt.figure(figsize=(14,5)) sns.despine(left=True) orig = plt.plot(timeseries, color='blue',label='Original') mean = plt.plot(rolmean, color='red', label='Rolling Mean') std = plt.plot(rolstd, color='black', label = 'Rolling Std') plt.legend(loc='best'); plt.title('Rolling Mean & Standard Deviation') plt.show() print ('<Results of Dickey-Fuller Test>') dftest = adfuller(timeseries, autolag='AIC') dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used']) for key,value in dftest[4].items(): dfoutput['Critical Value (%s)'%key] = value print(dfoutput)test_stationarity(df1.Spend.dropna())

通過 test_stationarity 函數,可以繪製移動平均值以及標準差,並且通過 Augmented Dickey-Fuller test 輸出 P 值。

對比臨界值(critical value)可以看到,時間序列數據時非平穩的。

首先我們試試對數變換,能不能使數據達到平穩性要求。

可以看到,利用對數變換df1[『log_Spend』]=np.log(df1[『Spend』]),時間序列在閾值為5%時滿足平穩性要求。

接下來,我們試試差分操作:test_stationarity(df1[『Spend』].diff(1).dropna())。

顯然,通過差分操作後,效果更好,時間序列在閾值為1%時滿足平穩性要求。

然後,我們就可以建立 SARIMA 模型,並且預測 2019-07-23 到 2019-09-23 這兩個月間每天的廣告指出。

import statsmodels.api as smfit1 = sm.tsa.statespace.SARIMAX(train.Spend, order=(7, 1, 2), seasonal_order=(0, 1, 2, 7)).fit(use_boxcox=True)test['SARIMA'] = fit1.predict(start="2019-07-23", end="2019-09-23", dynamic=True)plt.figure(figsize=(16, 8))plt.plot(train['Spend'], label='Train')plt.plot(test['Spend'], label='Test')plt.plot(test['SARIMA'], label='SARIMA')plt.legend(loc='best')plt.show()

現在,讓我們通過從sklearn.metrics包導入mean_squared_error,mean_absolute_error函數計算mse和mae來檢查這個模型的性能。結果如下:

進行數據可視化:

從 mse、mae 以及預測曲線可以看出,SARIMA 模型成功預測了時間序列變化趨勢和季節性特徵。但是在峰值處的表現仍舊有待提高。

ETS

ETS,Exponential Smoothing

由於時間序列數據隨時間變化但具有一定的隨機性,我們通常希望對數據進行平滑處理。為此,我們將使用 ETS 技術,通過指數方法為過去的數據分配較少的權重。同時將時間序列數據分解為趨勢(T)、季節(S)和誤差(E)分量。

三種常用 ETS 方法如下:

Linear:雙指數平滑;Additive:三指數平滑;Multiplicative:三指數平滑。

Holt-Winter 季節性預測算法

Holt-winter 季節性預測算法是一種三指數平滑方法。它包含三個主要部分:水平、趨勢、季節性分量。

案例:通過 Holt-Winter 季節性預測算法預測廣告支出

通過 Holt-winter 季節性預測算法預測 2019-07-23 到 2019-09-23 期間的每日廣告支出,代碼如下:

from statsmodels.tsa.api import ExponentialSmoothingfit1 = ExponentialSmoothing(np.asarray(train['Spend']) ,seasonal_periods=7 ,trend='add', seasonal='add').fit(use_boxcox=True)test['Holt_Winter'] = fit1.forecast(len(test))plt.figure(figsize=(16,8))plt.plot( train['Spend'], label='Train')plt.plot(test['Spend'], label='Test')plt.plot(test['Holt_Winter'], label='Holt_Winter')plt.legend(loc='best')plt.show()

同樣,我們通過 mean_squared_error,mean_absolute_error 函數查看 mse 和 mae。

可以看到,H-W 模型同樣能夠預測時間序列變化趨勢和季節性特徵。

算法對比

通過將兩種算法的預測結果進行對比,可以評價哪種方法預測能力更好。

從圖中可以看出,在MSE和MAE均較低的情況下,SARIMA模型的性能略優於Holt-Winter模型。儘管這兩種模式都無法完美地抓住峰谷特徵,但它們仍然對企業有用。根據數據,平均每月廣告支出為2百萬美元以上。而這兩種算法的MAE大約在6000左右。換言之,對於一家平均每月廣告支出為2百萬美元的企業,兩個月的廣告支出預測誤差只在6000美元左右,這是相當可觀的。

結束語

在本文中,單變量預測方法在廣告支出數據上表現良好。但這些方法難以組合/合併新的信號(如事件、天氣)。同時這些方法對丟失數據也非常敏感,通常不能很好地預測很長一段時間。

而在下一篇文章中,我們將展示如何使用深度學習技術來預測同一數據集上的時間序列!

相關焦點

  • 獨家|手把手教你用Python進行時間序列分解和預測
    需要進行預測的頻率是什麼?在開始預測未來值的詳細工作之前,與將要使用你的預測結果的人談一談也不失為一個好主意。 如何在PYTHON中繪製時間序列數據? 可視化時間序列數據是數據科學家了解數據模式,時變性,異常值,離群值以及查看不同變量之間的關系所要做的第一件事。
  • python 預測股票專題及常見問題 - CSDN
    ,通常用來預測相關時間序列系統和研究隨機擾動項對變量系統的動態影響。VAR模型類似聯立方程,將多個變量包含在一個統一的模型中,共同利用多個變量信息,比起僅使用單一時間序列的ARIMA等模型,其涵蓋的信息更加豐富,能更好地模擬現實經濟體,因而用於預測時能夠提供更加貼近現實的預測值。此處擬基於貴州茅臺股票數據,建立VAR的預測模型。使用後30天的數據作為驗證集,剩餘的數據用於建立預測模型。
  • 時間序列數據建模流程範例
    我們將分別以titanic生存預測問題,cifar2圖片分類問題,imdb電影評論分類問題,國內新冠疫情結束時間預測問題為例,演示應用Pytorch對這四類數據的建模方法。2020年發生的新冠肺炎疫情災難給各國人民的生活造成了諸多方面的影響。
  • Python實現固定效應回歸模型實現因果關係推斷
    然後,我將介紹可以提供有效解決方案的固定效應(FE)模型。 之後,我將使用兩套數據分析示例向您展示如何在python中進行操作。 我希望本文能夠通過良好的設計和令人信服的結果增強您對因果關係的理解。相關可以表示因果關係 — 僅在滿足某些條件時讓我們給出因果關係的正式定義。 因果關係是x導致y。
  • arma python 檢驗專題及常見問題 - CSDN
    假如某個觀察值序列通過序列預處理可以判定為平穩非白噪聲序列,就可以利用ARMA模型對該序列進行建模。建模的基本步驟如下:(1)求出該觀察值序列的樣本自相關係數(ACF)和樣本偏自相關係數(PACF)的值。(2)根據樣本自相關係數和偏自相關係數的性質,選擇適當的ARMA(p,q)模型進行擬合。(3)估計模型中位置參數的值。
  • python平穩性檢驗專題及常見問題 - CSDN
    一、平穩序列建模步驟假如某個觀察值序列通過序列預處理可以判定為平穩非白噪聲序列,就可以利用ARMA模型對該序列進行建模。建模的基本步驟如下:(1)求出該觀察值序列的樣本自相關係數(ACF)和樣本偏自相關係數(PACF)的值。(2)根據樣本自相關係數和偏自相關係數的性質,選擇適當的ARMA(p,q)模型進行擬合。
  • 在 Python 中使用線性回歸預測數據
    安裝博客文章中所有的包,再次運行你的代碼。這次希望你不會遇到任何問題。我們得到預測的價格值為21915.4255——意味著我們已經把預測房子價格的工作做完了!為了驗證,我們需要看看我們的數據怎麼擬合線性回歸。所以我們需要寫一個函數,輸入為X_parameters和Y_parameters,顯示出數據擬合的直線。
  • 統計學最常用的「數據分析方法」清單(二)
    時間序列預測法的應用 系統描述:根據對系統進行觀測得到的時間序列數據,用曲線擬合方法對系統進行客觀的描述; 系統分析:當觀測值取自兩個以上變量時,可用一個時間序列中的變化去說明另一個時間序列中的變化,從而深入了解給定時間序列產生的機理; 預測未來:一般用ARMA模型擬合時間序列
  • 序列比對在biopython中的處理
    序列比對是生物信息學分析中的常見任務,包含局部比對和全局比對兩大算法,局部比對最經典的代表是blast, 全局比對則用於多序列比對。在biopython中,支持對序列比對的結果進行讀寫,解析,以及運行序列比對的程序。
  • 如何在python語言代碼實現間隔加減法
    >pythondjango在使用python語言時,除了可以實現常規的功能之外,還可以用於數學計算。有這麼一個場景:0到100範圍,當是偶數時,就相加;若為奇數,就相減0-1+2-3+4-5+6-7+8-9+10……+98-99+100下面利用實例實現這個場景:操作步驟:1、打開Visual Studio工具,新建
  • 數據清洗在新能源功率預測中的研究綜述和展望
    結果顯示四分位法只剔除了6.65%的異常值,SVMR剔除了7.99%的異常值,而組合模型法的剔除率達到了10.2%。由此證明使用單一的清洗方法有一定的局限性,組合模型法可以將算法的優勢進行互補,進而實現較好的清洗效果。
  • 原理+代碼|Python實戰多元線性回歸模型
    其中多元共線性這個問題將貫穿所有的機器學習模型,所以本文會「將原理知識穿插於代碼段中」,爭取以不一樣的視角來敘述和講解「如何更好的構建和優化多元線性回歸模型」。原理其實非常簡單,將無法直接用於建模的名義變量轉換成可放入模型的虛擬變量的核心就短短八個字:「四散拆開,非此即彼」。下面用一個只有 4 行的微型數據集輔以說明。
  • 為什麼LSTM看起來那麼複雜,如何避免時序數據的處理差異和混亂
    LSTM(long short term memory,長短期記憶網絡)是預測時間序列最常用的神經網絡模型之一。但是這種神經網絡模型相當複雜,需要特定的結構、數據前期處理等操作。當在網上搜尋要學習的代碼時,很難將另一個程式設計師的代碼合併到當前開展的項目中。
  • 一文教你全面掌握用Python實現線性回歸
    本文首先會深入挖掘線性回歸理論,理解其內在的工作機制,然後利用Python實現該算法,為商業問題建模。理論線性回歸或許是學習統計學最簡單的方法。在學習更高級的方法之前,這是一個很好的入門方法。事實上,許多更高級的方法可被視為線性回歸的延伸。因此,理解好這一簡單模型將為將來更複雜的學習打下良好基礎。
  • 手把手教你用Python爬中國電影票房數據
    )>>>劉強東章澤天周杰倫昆凌因為dict的存儲不是按照list的方式順序排列,所以,迭代出的結果順序很可能不是每次都一樣。我們要做的是,遍歷每一個日期下的網址,用Python代碼把數據爬下來。
  • Metaflow:Netflix 的 Python / R數據科學框架
    在過去的兩年裡,他們內部數據科學團隊迅速地應用它,使得許多項目能夠縮短生產時間。修復代碼中的錯誤後,希望可以從工作流失敗、或停止的地方重新啟動工作流。· 混合運行:希望在本地運行工作流中的一個步驟,可能是數據加載步驟,因為數據集下載文件夾中;但是希望在雲上運行另一個計算密集步驟:模型訓練。
  • 《基地》三部曲與時間序列分析
    用書中哈裡謝頓自己的話說,稱之為「社會心理學」更為恰當一些,其核心思想在於通過對銀河帝國12000年發展中的重大歷史事件和社會群體的行為模式的分析,通過一系列數學公式的推導,來對某一個社會群體甚至於整個人類種群的發展路徑進行預測。數學的推導來源於對群體的心理學的模型化抽象,在某一種社會情境下,我們有多大的把握認為這個種群將會作出某一種行為,來對種群的利益進行最優化的選擇。
  • 通過深度學習來創作自己的音樂(附代碼)
    在一個語言模型中,給定一個單詞序列,該模型試圖預測下一個單詞:與WaveNet中的語言模型類似,給定一個樣本序列,它嘗試預測下一個樣本。原始音頻波是指波在時間序列域中的表示。在時間序列域中,音頻波以振幅值的形式表示,振幅值記錄在不同的時間間隔內:波形網輸出:給定振幅值的序列,WaveNet嘗試預測連續的振幅值。讓我們通過一個例子來理解這一點。
  • Python 實現抖音上的「人像動漫化」特效,原來這麼簡單!
    本文轉載自【微信公眾號:數據分析與統計學之美 ,ID:gh_21c25c7e71d0】作者黃偉呢數據分析與統計學之美主要用於分享自己在數據分析、統計學領域的心得體會!我心想:python既然這麼強大,是不是也可以使用python程序來實現這樣一個操作呢?哈哈!我自己當然是沒有這個本事編寫這樣一個牛逼的程序出來,但是百度可以呀,並且還很好用。百度AI開放平臺給我們提供了完整的接口,甚至貼心的將代碼都給我們寫好了。這些接口還支持很多主流語言都呢,像Java、Python、PHP、C#等,我們做的就是直接調用它即可。
  • 如何用PYTHON代碼寫出音樂
    我一直在做這樣的嘗試,就是通過人工智慧算法實現機器自動的作詞和編曲(在這裡預告下,通過深度學習寫歌詞已經實現了,之後會分享給大家),本文我們主要聊下如何寫曲。說到用代碼寫曲子,有一個東西大家一定要了解就是MIDI。MIDI是一種樂器數字接口,是編曲界最廣泛的音樂標準格式。MIDI並不是真正意義上的音樂文件,大家可以把它理解成樂譜,需要有環境編譯MIDI文件,才可以生成音樂。