天天看點

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

Python時間序列實踐之奶牛産奶量預測

CSDN:http://blog.csdn.net/kicilove/article/

資料及完整示例代碼下載下傳(https://github.com/zhaohuicici/Time-Series-Model)

  • 前言
  • 資料介紹
  • 一所用庫的導入
  • 二使用pandas讀入資料整理資料
  • 三平穩性檢驗
  • 四資料進行平穩性處理
  • 五ARMAARIMA模型識别
  • 六模型拟合
  • 七模型診斷
  • 八預測

分析流程:

1. 使用pandas讀入資料、整理資料;

2. 檢驗資料的穩定性;

3. 資料進行平穩性處理;

4. 使用statsmodels庫中相關的時間序列函數進行時間序列模型AR、MA、ARIMA的識别;

5. 拟合模型;

6. 模型診斷;

7. 預測結果。

前言:

時間序列是時間間隔不變的情況下收集的時間點集合。這些集合被分析用來了解長期發展趨勢,為了預測未來或者表現分析的其他形式。每時刻的甲醛濃度變化、每日股票閉盤價格、共享單車每日租車數等等都可以看做一系列時間點上的觀測,在一系列時間點上觀測擷取的資料也就是我們俗稱的時間序列資料。文中使用matplotlib庫進行資料可視化,使用pandas進行資料整理,使用statsmodels庫中時間序列相關函數模組化分析。由于時間序列和時間相關連,不同的資料有不同的模組化方法,本文僅為了介紹時間序列常用的模組化流程,不會追求真正的精度,對于精益求精的同學可以嘗試使用不同模型和參數對比提高預測結果。

資料介紹

本文将使用一頭從1962年一月到1975年12月的每月産奶量的資料集,機關為:磅。

資料及完整示例代碼下載下傳(https://github.com/zhaohuicici/Time-Series-Model)

一.所用庫的導入

所需要的庫主要分為三部分:

資料處理:pandas

時間序列模組化:statsmodels

可視化:matplotlib

載入需要的庫

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

二.使用pandas讀入資料、整理資料

讀入所需要的奶牛産奶量資料集,并且可視化資料集,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

從上圖可以看出,資料呈現出明顯的整體上升趨勢,并且也有季節性的迹象。

為了友善處理,我們将資料進行重新索引,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

三.平穩性檢驗

資料處理完畢,下面進行資料的平穩性檢驗,其實從上面的可視化已經看出資料是不平穩的,但是為了闡述模組化流程的完整性,下面還是例行的進行平穩性的檢驗。首先,對資料進行滾動求均值,然後給出資料的标準差,并對資料進行一階差分處理,從這裡就進行差分是為了簡便後邊的處理步驟,之後在AIC和BIC标準下使用ADF來檢驗自回歸模型的機關根是否滿足平穩性要求,這裡以可視化的方式給出,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

圖像解釋:藍色的是原始的資料的可視化,紅色的線是滾動12階求平均後的可視化圖,可以看出确實資料呈現明顯的上升趨勢,黑色的線是标準差可視化,黃色的線是0位置的線,綠色的線是一階差分資料後的可視化,從綠色與黃色線的比對可以看出,一階差分後資料基本滿足了平穩性的要求。

從使用AIC為标準的ADF檢驗及使用BIC為标準的ADF檢驗的p值以及統計量與各臨界值分位數的對比可以看出,原始資料确實在自回歸模型下是不平穩的,是以下面我們嘗試對資料進行差分平穩性的檢驗。

補充:

這裡也可以嘗試對數變換、指數平滑等方法,請讀者自行實踐檢視效果。

四.資料進行平穩性處理:

從上面對原始資料的平穩性檢驗看出,資料不平穩,是以,下面我們使用一階差分後的資料進行平穩性的檢驗,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

圖像解釋:上面的圖像中,藍色線條是一階差分後的資料的可視化,綠色線條相當于對一階差分後的資料進行了又一次的差分,黃線是0 基準線,從這兩條差分的曲線可以看出,資料在一階差分下基本滿足了平穩性要求,沒有必要進行二次差分,雖然12階滾動均值還是有一點點的差,這個讀者也可以自行模組化效果,篇幅所限就不再展開了。

五.AR、MA、ARIMA模型識别

本文主要想采用ARIMA相關模型進行模組化,但是我們上文中提到過,可以看出資料有季節性的趨勢,是以我們順手做一個季節性的檢驗,從圖像中看看資料是否真的有季節性趨勢,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

圖像解釋:上圖中第一格圖是原始資料的圖像,第二格圖像是資料的趨勢圖像,可以看出明顯的上升趨勢,第三格圖是季節性的趨勢,可以看出圖像展現了我們的猜測,非正常矩的季節性趨勢擺在眼前,最後一格圖是殘差的部分,可以大體看出殘差也是有白噪聲的迹象。

下面言歸正傳,我們使用AIC。BIC。HQIC标準來看看,如果使用AR,MA,或者ARIMA需要怎樣的參數輸入,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

從上面的AIC,BIC,HQIC的輸出結果來看,我們大體上可以嘗試AR(1),MA(2),AR(2)

ARIMA(1,0,2)等幾個模型。

當我們決定使用AR 或者 MA模型的時候,可以使用ACF、PACF來判斷參數的取值。

六.模型拟合

首先嘗試模型AR(2),代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

從上面的AR(2)模型輸出結果可以看出,RSS值為139.9542。

下面嘗試MA(2)模型,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

從上面的MA(2)模型輸出結果可以看出,RSS值為43.9771。

下面我們使用ARIMA(1,0,2)來檢視資料的拟合效果,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

從上面的ARIMA(1,0,2)模型輸出結果可以看出,RSS值為8.2697。

對比AR(2),MA(2)的模型輸出結果RSS來看,ARIMA(1,0,2)的RSS值是最小的,看來把AR和MA模型組合起來模組化效果是有明顯改善的。

其中RSS的定義代碼中給出。

七.模型診斷

下面我們來看看關于模型ARIMA(1,0,2)的診斷結果,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

從上面的ACF及PACF來看,在低階處殘差已經不存在相關性,但是高階處還是有些問題。

下面看看D_W檢驗,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

D_W檢驗輸出結果為2.02,課件殘差已經不存在一階自相關。對于D_W輸出結果的檢視方法及代表意義,請讀者自行查找。

下面我們來看看殘差的QQ圖,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

從圖中可以看出,殘差還是有一丢丢問題,但是隻看右側還是不錯的。暫時不再嘗試其他模型的檢驗,感興趣的同學自行檢驗。

八.預測

對模型診斷完畢之後,因為診斷結果還算盡如人意,我們下面對資料進行預測,這裡輸出預測的結果與真實結果的比對,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

圖中是一階差分的資料和對一階差分資料的預測的可視化,其中綠色的圖像是原始資料一階差分的可視化,藍色的圖像是對綠色資料預測的結果的可視化。從圖中可以看出,預測結果基本抓住了資料的特點。

由于真正要得到的結果是原始資料的預測結果,現在對差分的資料進行還原操作,這一步好多的同學可能會忘記,特此提醒,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

下面代碼用于輸出我們對于原始資料的預測結果:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

下面代碼用來可視化原始資料預測結果的可視化:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

上面已經給出了原始資料與預測結果的可視化對比,下面進入模組化的最後一步,也就是我們最終的目的,就是對未來幾期的資料進行預測,這裡預測1976-1到1976-12一年奶牛産量的預測,并且給出可視化的結果,代碼如下:

Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測
Python時間序列案例分析實戰--奶牛産奶量預測前言:資料介紹一.所用庫的導入二.使用pandas讀入資料、整理資料三.平穩性檢驗四.資料進行平穩性處理:五.AR、MA、ARIMA模型識别六.模型拟合七.模型診斷八.預測

我的個天,終于寫完了,下面還是按照慣例總結一下。

總結:

本文主要介紹時間序列ARIMA相關模型的建立及診斷和預測過程。文章首先使用pandas讀入資料、整理資料;然後使用test_stationarity函數進行原始資料以及一階差分資料的平穩性檢驗,用于滿足後邊ARIMA模型對于平穩性的要求;之後對資料進行差分,使資料滿足平穩性;之後使用網格搜尋的方法對最優參數進行初步确定,之後使用statsmodels庫中相關的時間序列函數進行時間序列模型AR、MA、ARIMA的識别,拟合模型;對ARIMA(1,0,2)模型進行模型的診斷,主要包括自相關性、獨立性等的檢驗;基于此我們接着使用ARIMA(1,0,2)模型對一階差分資料進行了預測,并且對預測的資料進行了一階差分的還原,以此得到對于原始資料的預測結果;最後,我們預測得到1976-1到1976-12月奶牛産奶量的12期預測結果,至此完成了整個時間序列模型的全流程模組化過程。

資料及完整示例代碼下載下傳(https://github.com/zhaohuicici/Time-Series-Model)

CSDN:http://blog.csdn.net/kicilove/article/