手把手教你用Python處理非平穩時間序列(附代碼)

作者:AISHWARYA SINGH

翻譯:陳之炎

校對:丁楠雅

本文約3600字,建議閱讀10分鐘

本文將重點介紹時間序列數據的平穩性檢驗方法。

簡介

預測一個家庭未來三個月的用電量,估計特定時期道路上的交通流量,預測一隻股票在紐約證券交易所交易的價格……這些問題都有什麼共同點?

它們都屬於時間序列數據的範疇!如果沒有“時間”成分,就無法準確地預測出結果。隨着我們周圍世界產生的數據越來越多,時間序列預測已成爲數據科學家必須掌握的一項越來越關鍵的技能。

然而,時間序列是一個複雜的話題,它具有多面性。

首先,要想使預測模型正常工作,就必須使時間序列保持平穩。爲什麼?因爲絕大部分原始數據都會有非平穩的趨勢。如果有很多不規則的尖峯,你怎麼能確保模型正常工作呢?

本文將重點介紹時間序列數據的平穩性檢驗方法。在此假設讀者已熟悉時間序列、ARIMA和平穩性的概念,以下是一些包含基礎內容的參考資料:

  • 時間序列建模完整教程
  • 給初學者的時間序列預測綜合指南

目錄

1. 平穩簡介

2. 加載數據

3. 檢驗平穩的方法

  • ADF檢驗
  • KPSS檢驗

4. 平穩的種類

  • 嚴格平穩
  • 趨勢平穩
  • 差分平穩

5. 時間序列平穩化

  • 差分
  • 季節性差分
  • 對數變換

1. 平穩簡介

“平穩”是處理時間序列數據時遇到的最重要的概念之一:平穩序列是指其特性-均值、方差和協方差不隨時間而變化的序列。

讓我們用一個直觀的例子來理解這一點。考慮以下三個圖形:

  • 在第一幅圖中,我們可以清楚地看到,均值隨時間而變化(增加),呈現上升的趨勢。因此,這是一個非平穩序列。平穩序列不應該呈現出隨時間變化的趨勢。
  • 第二幅圖顯然看不到序列的趨勢,但序列的變化是一個時間的函數。正如前面提到的,平穩序列的方差必須是一個常數。
  • 再來看第三幅圖,隨着時間的增加,序列傳播後變得更近,這意味着協方差是時間的函數。

上述三個例子均是非平穩時間序列。現在來看第四個圖:

在這張圖中,均值、方差和協方差都是常數,這就是平穩時間序列。

再想一想,上面的哪一幅圖預測未來會更容易呢?第四個圖,對吧?大多數統計模型都要求序列是平穩的,這樣才能進行有效和精確的預測。

因此,總的來說,平穩時間序列是一個不依賴時間變化 (即均值、方差和協方差不隨時間變化)的時間序列。在下一節中,我們將介紹各種檢測給定序列是否平穩的方法。

2. 加載數據

在本節和後續幾節中,將介紹檢測時間序列數據的平穩性的方法,以及如何處理非平穩序列。同時,本文還提供了相應的Python代碼。大家可以到:AirPassengers下載文中使用的數據集。

在繼續分析數據集之前,首先加載和預處理數據。

好了,看來可以繼續了!

3. 檢驗平穩的方法

下一步是確定給定的序列是否是平穩的,並對它做相應的處理。本節將介紹一些常見的方法,利用這些方法來檢測序列是否平穩。

目視檢驗

看一下我們在上一節中使用的圖形,僅需通過目測圖形,便能夠識別出序列的均值和方差是否隨時間變化。同樣,通過繪製數據圖形,便能確定該序列的屬性是否隨時間而變化。

顯然,通過作圖,可以看到序列的趨勢(變化的均值),然而,這種目視檢測方法得到的結果可能不準確。最好是用一些統計檢驗方法來驗證觀測結果。

統計檢驗

可以利用統計檢驗來代替目視檢驗:比如單位根平穩檢驗。單位根表名給定序列的統計特性(均值,方差和協方差)不是時間的常數,這是平穩時間序列的先決條件。下面是它的數學解釋:

假設我們有一個時間序列:

其中yt是t時刻的數據值,ε t 是誤差項。需要利用yt-1的值來計算yt,即:

如果利用所有的觀察值,yt 的值將是:

假設在上述方程中a的值爲1(單位),則預測值將等於yt-n 和從t-n到t的所有誤差之和,這意味着方差將隨着時間的推移而增大,這就是時間序列中的單位根。衆所周知,平穩時間序列的方差不能是時間的函數。單元根檢驗通過檢查a=1的值來檢查序列中是否存在單位根。以下是兩個最常用的單位根平穩檢測方法:

ADF(增補迪基-福勒)檢驗 The Dickey Fuller test is one of the most popular statistical tests. It can be used to determine the presence of unit root in the series, and hence help us understand if the series is stationary or not. The null and alternate hypothesis of this test are:

迪基-福勒(Dickey Fuller)檢驗是最流行的統計檢驗方法之一,可以用它來確定序列中單位根的存在,從而幫助判斷序列是否是平穩。這一檢驗的原假設與備擇假設如下:

原假設:序列有一個單位根(a=1的值)

備擇假設:該序列沒有單位根。

如果不能拒絕原假設,則該序列是非平穩的,這意味着序列可以是線性的,也可以是差分平穩的(將在下一節中更多地瞭解差分平穩)。

Python代碼:

ADF檢驗結果:ADF檢驗的統計量爲1%,p值爲5%,臨界值爲10%,置信區間爲10%。我們對本序列的檢驗結果如下:

平穩性檢驗:如果檢驗統計量小於臨界值,我們可以拒絕原假設(也就是序列是平穩的)。當檢驗統計量大於臨界值時,不能拒絕原假設(這意味着序列不是平穩的)。

在上面的例子中,檢驗統計量>臨界值,這意味着序列不是平穩的。這證實了我們最初在目視檢測中觀察的結果。

KPSS(科瓦特科夫斯·基菲利普·斯施密特·辛)檢驗 KPSS檢驗是另一種用於檢查時間序列的平穩性 (與迪基-福勒檢驗相比稍遜一籌) 的統計檢驗方法。KPSS檢驗的原假設與備擇假設與ADF檢驗的原假設與備擇假設相反,常造成混淆。

KPSS檢驗的作者將原假設定義爲趨勢平穩,並將備擇假設定義爲單位根序列。我們將在下一節詳細瞭解趨勢平穩。現在,來看一下KPSS檢驗的實現,並查看KPSS檢驗的結果。

原假設:序列是趨勢平穩的。

備擇假設:序列有一個單位根(序列是非平穩的)。

Python代碼:

KPSS檢驗結果:KPSS檢驗-檢驗統計量、p-值和臨界值和置信區間分別爲1%、2.5%、5%和10%。對於航空乘客數據集的檢驗結果如下:

平穩性檢驗:如果檢驗統計量大於臨界值,則拒絕原假設(序列不是平穩的)。如果檢驗統計量小於臨界值,則不能拒絕原假設(序列是平穩的)。對於航空乘客數據集來說,在所有置信區間,檢驗統計量的值都大於臨界值,因此可以說該序列是不平穩的。

在爲時間序列數據集準備模型之前,通常會同時進行兩種檢驗。有一次,這兩種檢驗顯示出相互矛盾的結果:其中一個檢驗結果表明該序列是平穩的,而另一個則表明該序列是非平穩的!我困惑了好幾個小時,想弄清楚這是怎麼回事。後來才知道,序列的平穩性有多種類型。

綜上所述,ADF檢驗有線性平穩或差分平穩的備擇假設,而KPSS檢驗則是識別序列的趨勢平穩。

4. 平穩的種類

通過了解不同類型的平穩,來解釋上述檢驗的結果。

  • 嚴格平穩:嚴格平穩序列滿足平穩過程的數學定義。嚴格平穩序列的均值、方差和協方差均不是時間的函數。我們的目標是將一個非平穩序列轉化爲一個嚴格平穩序列,然後對它進行預測。
  • 趨勢平穩:沒有單位根但顯示出趨勢的序列被稱爲趨勢平穩序列。一旦去除趨勢之後,產生的序列將是嚴格平穩的。在沒有單位根的情況下,KPSS檢測將該序列歸類爲平穩。這意味着序列可以是嚴格平穩的,也可以是趨勢平穩的。
  • 差分平穩:通過差分可以使時間序列成爲嚴格平穩的時間序列。ADF檢驗也稱爲差分平穩性檢驗。

應用兩種檢驗總會更優些,通過兩種檢驗之後,可以確定這個序列是否是平穩的。下面,來看一下應用兩種平穩檢驗後的可能結果:

  • 結果1:兩種檢驗均得出結論:序列是非平穩的->序列是非平穩的
  • 結果2:兩種檢驗均得出結論:序列是平穩的->序列是平穩的
  • 結果3:KPSS =平穩;ADF =非平穩->趨勢平穩,去除趨勢後序列嚴格平穩
  • 結果4:KPSS =非平穩;ADF =平穩->差分平穩,利用差分可使序列平穩。

5. 時間序列的平穩化

在熟悉了平穩性的概念及其不同的類型之後,接下來可以對序列進行平穩化操作。請記住,爲了建立時間序列預測模型,必須首先將任何非平穩序列轉換爲平穩序列。

差分化

在該方法中,計算序列中連續項的差值。執行差分操作通常是爲了消除均值的變化。從數學角度,差分可以寫成:

yt‘ = yt – y(t-1)

其中yt 是t時刻的數值。

對序列差分化後,繪製出結果:

季節性差分

在季節性差分中,不計算連續值之間的差異,而是計算觀察值與同一季節的先前觀察值之間的差異。例如,星期一的觀察值將與上星期一的觀察值相減。從數學角度,它可以寫成:

yt‘ = yt – y(t-n)

變換

變換用於對方差爲非常數的序列進行平穩化。常用的變換方法包括冪變換、平方根變換和對數變換。對飛機乘客數據集進行快速對數轉換和差分:

可以看出,這個圖形比先前的圖形有了很大的改善。通過對這個序列進行平方根或冪變換,看看是否得出了更好的結果。歡迎在下面的評論裏分享你的發現!

尾註

本文介紹了檢驗時間序列平穩性的不同方法。但並不止步於此,下一步是對得到的序列應用一個預測模型。可以參考以下文章來構建這樣的模型:給初學者的時間序列預測綜合指南(Beginner’s Guide to Time Series Forecast)。

如果對本文有任何問題或反饋,可以在下面的評論部分與我聯繫。

還可以在Analytics Vidhya的Android應用程序上閱讀這篇文章

作者簡介:艾什瓦雅·辛格

Aishwarya Singh

一個熱衷於探索無休止的數據科學和人工智能世界的讀者。被ML(機器學習)和AI(人工智能)的無限應用所吸引,渴望在數據科學領域進行學習、探索和深入發掘。

原文鏈接:

https://www.analyticsvidhya.com/blog/2018/09/non-stationary-time-series-python/

原文標題:

A Gentle Introduction to Handling a Non-Stationary Time Series in Python

譯者簡介

陳之炎,北京交通大學通信與控制工程專業畢業,獲得工學碩士學位,歷任長城計算機軟件與系統公司工程師,大唐微電子公司工程師,現任北京吾譯超羣科技有限公司技術支持。目前從事智能化翻譯教學系統的運營和維護,在人工智能深度學習和自然語言處理(NLP)方面積累有一定的經驗。業餘時間喜愛翻譯創作,翻譯作品主要有:IEC-ISO 7816、伊拉克石油工程項目、新財稅主義宣言等等,其中中譯英作品“新財稅主義宣言”在GLOBAL TIMES正式發表。能夠利用業餘時間加入到THU 數據派平臺的翻譯志願者小組,希望能和大家一起交流分享,共同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章