通俗易懂學習:以簡單直觀的方式分解時間序列

點擊上方關注,All in AI中國

通俗易懂學習:以簡單直觀的方式分解時間序列

預測商店銷售

我們都曾與像ARIMA、指數平滑等傳統的時間序列模型做過鬥爭,這些模型不是那麼直觀,而且很難用純粹的統計術語來解釋。

鑑於基於時間的銷售數據,直覺上我們想到的是找出月度趨勢、逐年趨勢、日趨勢、每週峰值等模式。因此,這促使我設計出一種方法,該方法可以分解時間序列以輕鬆地找到所有這些參數,並且還使我們能夠以更簡單和直觀的方式對未來進行預測。

在這篇文章中,我們將使用Roseman Store Sales Kaggle Challenge從2013年1月到2015年6月的商店銷售數據,時間跨度約為2.5年。

通俗易懂學習:以簡單直觀的方式分解時間序列

表1:商店XYZ的銷售數據

創建流程

我們的目標是確定(分解)時間序列的不同組成部分,並將我們學到的知識轉化為一個更簡單、更直觀的模型。

  1. 數據分析(EDA)
  2. 功能創建和平均銷售計算
  3. 推導出模型的方程式
  4. 訓練模型
  5. 分解時間序列的不同組成部分
  6. 使用分解的組件創建更簡單直觀的模型
  7. 模型的權重分析並使用它來獲取其他有用的信息
  8. 結論

1.數據分析

讓我們開始我們的旅程吧。我們有特定日期的商店銷售,字段Open表示商店當天是否正常運作。商店XYZ週日仍然關閉。因此,只有當商店開放時,我們會考慮到這些日子。

商店銷售在該時間段內的圖形可視化。

通俗易懂學習:以簡單直觀的方式分解時間序列

用於可視化銷售的代碼

通俗易懂學習:以簡單直觀的方式分解時間序列

我們看到每年12月份都有明顯的高峰。除此之外,多年來的下降趨勢也是顯而易見的。 2014年和2015年顯示出類似的趨勢,但與2013年相比有明顯下降,一個好的方法應該能夠捕捉這些變化。

接下來,我們將執行EDA以瞭解一週內的銷售變化。

通俗易懂學習:以簡單直觀的方式分解時間序列

在一週內可視化銷售的代碼

通俗易懂學習:以簡單直觀的方式分解時間序列

在一週內的幾天內存儲的銷售額

因為商店關閉,所以週日沒有銷售。我們可以在週六和週一看到明顯的高峰。可能是由於週末的原因,週六增加了銷售。同樣,週日商店的非功能性可能導致週一銷售增加。一個好的方法應該能夠捕捉這些變化。

我們已經看到了12月份的銷售高峰,但讓我們用幾個月的類似EDA重新確認我們的假設,就像我們對一週內幾天的銷售所做的那樣。

通俗易懂學習:以簡單直觀的方式分解時間序列

代碼可以在幾個月內顯示銷售情況

通俗易懂學習:以簡單直觀的方式分解時間序列

門店月內銷售額

另一件事,我們可以調查的是一個月內的銷售模式。我有一種直覺,這不會是一個強有力的模式,一個月內幾個星期的銷售應該表現得相似。但是,為什麼不測試一下呢?世界充滿了驚喜,不是嗎?我們將分析一週中每天的平均銷售額。

通俗易懂學習:以簡單直觀的方式分解時間序列

在一個月內顯示銷售額的代碼

通俗易懂學習:以簡單直觀的方式分解時間序列

一個月內銷售數週

在一個月的第一週和最後一週,銷售額持續數天。一個隨機的猜測可能是月底的工資和更多的人購物。

2.特徵創建和平均銷售額

每個日期可以按年、月、周和日唯一標識。以這種方式表示日期的主要原因是找到每月、逐年、每日和每週趨勢。

保持週數的原因一般是確定銷售是否隨著月份的進展而增加、減少或者根本不會影響很多,我們將其稱為每週趨勢。

此外,我們將刪除商店保持關閉的數據點。週日,商店仍然會關閉。

執行功能創建和清理步驟後,數據看起來像

通俗易懂學習:以簡單直觀的方式分解時間序列

表2:數據概述

接下來,我們將執行年、月、日和周字段的單熱編碼。一種熱編碼是分類數據的二進制表示。作為此步驟的結果,我們將得到以下字段。

通俗易懂學習:以簡單直觀的方式分解時間序列

平均銷售額

我們將從計算平均銷售額開始。我們將用平均銷售額表示它,有2.5年的數據,即2013年、2014年和2015年中期。由於2015年全年數據不可用,如果用於平均銷售計算,則可能會增加噪音。我們僅使用2013年和2014年的銷售數據來計算平均銷售額。

通俗易懂學習:以簡單直觀的方式分解時間序列

avgSales 輸出 4825.98

3.推導出模型的方程式

主要想法是找到每月、逐年、每日和每週的趨勢。我們希望附加一個值,稱為索引。因此,我們希望得出每月、逐年、每日和每週趨勢指數。我們假設這些趨勢對一天內的銷售額負全部責任,超過我們上面計算的平均銷售額(avgSales)。

通俗易懂學習:以簡單直觀的方式分解時間序列

模型方程(1)

我們有一個熱門編碼輸入功能。一次只有一個月高或設置為1,一天、一週和一年。輸入將處理它。因此,我們的輸入方程被修改為:

通俗易懂學習:以簡單直觀的方式分解時間序列

模型方程(2)

讓我們看看2014年5月17日模型方程的形式。在這種情況下,年份將是2014年,月份將是5月,週數將是3日,日期將是星期六,其他所有輸入都是0,冪為0的係數為1。

通俗易懂學習:以簡單直觀的方式分解時間序列

模型的方程形式為2014年5月17日

我們將在兩側進行記錄,以簡化等式,並將其轉換為易於應用線性迴歸的形式。我們將應用無攔截迴歸並採用模型係數的反對數來獲得月度、年度、每日和每週趨勢指數。

通俗易懂學習:以簡單直觀的方式分解時間序列

應用迴歸的模型方程

4.訓練模型

這裡的因變量是ln(Sales)-ln(avgSales),我們將使用基數2來記錄。我們有一個商店的銷售數據,從2013年1月到2015年6月約為2.5年。我們不會使用上個月的數據以驗證模型的性能。

通俗易懂學習:以簡單直觀的方式分解時間序列

訓練模型

接下來,我們將採用模型係數的反對數來獲得相應的指數。

通俗易懂學習:以簡單直觀的方式分解時間序列

採用模型係數的反對數

通俗易懂學習:以簡單直觀的方式分解時間序列

年度指數

通俗易懂學習:以簡單直觀的方式分解時間序列

每月指數

通俗易懂學習:以簡單直觀的方式分解時間序列

日間指數

通俗易懂學習:以簡單直觀的方式分解時間序列

每週指數

5.從迴歸模型中學習以分解時間序列

年度趨勢

時間序列的一個重要組成部分是逐年趨勢。我們的模型所獲得的年度指數在2013年明顯高於2014年和2015年。捕獲的年度指數將幫助我們從時間序列數據中分解年度趨勢。讓我們想象一下結果。

通俗易懂學習:以簡單直觀的方式分解時間序列

年度指數

通俗易懂學習:以簡單直觀的方式分解時間序列

通俗易懂學習:以簡單直觀的方式分解時間序列

年度趨勢

多年來我們可以清楚地看到減少的趨勢。下降趨勢可能有很多原因,如商店質量下降或競爭對手商店開放等。需要進行更深入的分析才能找到,這將是一個有趣的發現。

每月趨勢

時間序列的另一個重要組成部分是月度趨勢,我們的模型所學的月度指數顯然在12月份呈現出更高的趨勢。它將幫助我們從時間序列數據中分解月度趨勢。讓我們想象一下結果。

通俗易懂學習:以簡單直觀的方式分解時間序列

每月指數

通俗易懂學習:以簡單直觀的方式分解時間序列

可視化月度趨勢

通俗易懂學習:以簡單直觀的方式分解時間序列

每月趨勢

日趨勢

在EDA部分,我們分析了一週內的銷售天數。我們看到週六和週一的銷售額較高。模型學習的日期索引能夠捕獲這些模式。讓我們想象一下結果。

通俗易懂學習:以簡單直觀的方式分解時間序列

可視化日常趨勢

通俗易懂學習:以簡單直觀的方式分解時間序列

日趨勢

每週趨勢

在EDA部分,我們在一個月的第一週和最後一週看到了一個小峰值。模型學習的每週索引能夠捕獲這種模式。讓我們想象一下結果。

通俗易懂學習:以簡單直觀的方式分解時間序列

每週指數

通俗易懂學習:以簡單直觀的方式分解時間序列

可視化每週趨勢

通俗易懂學習:以簡單直觀的方式分解時間序列

每週趨勢

6.使用分解組件的簡單直觀模型

我們將使用上述學習設計一個新的、簡單直觀的模型,我們稱之為乘法模型。最終的模型方程將是:

通俗易懂學習:以簡單直觀的方式分解時間序列

模型方程(1)

將根據日期從計算表中使用annual_index,monthly_index,day_index和weekNbr_index。

通俗易懂學習:以簡單直觀的方式分解時間序列

係數表

使用上述模型對2015年9月21日進行預測。它將在2015年9月份的第3周進行

Sales = avgSales * Sep_index * 3rdWeek_index * 2015_index

= 4825.98 * 0.880 * 0.98 * 0.9425 = 3922.54

Prediction for Dec 31st, 2015? It falls on December month, 5th week and year 2015

Sales = avgSales * Dec_coefficient * 5thWeek_coefficient * 2015_index

= 4825.98 * 1.244 * 1.069 * 0.9425 = 6048.74

7.模型的質量分析,並使用它來獲取其他有用的信息

同時,還訓練了線性迴歸模型,其對特徵的截距或對數沒有任何約束。我們稱之為Model-1和我們的乘法模型Model-2。我們針對50多家商店的3個月的未見數據測試了這兩種模型。

大多數情況下,這兩個模型在均方根誤差方面表現同樣好,具有相似的RMSE值。然而在某些情況下,Model-2是一個明顯的贏家,與Model1相比,RMSE較低。一個可能的原因可能是域知識的提供,avgSales,不允許它過度擬合併且在看不見的數據上表現良好。

通俗易懂學習:以簡單直觀的方式分解時間序列

代碼比較兩個模型的性能

通俗易懂學習:以簡單直觀的方式分解時間序列

對於大多數情況,兩種模型都表現相似

乘法模型(模型-2),商店39,85和88的明顯贏家

通俗易懂學習:以簡單直觀的方式分解時間序列

乘法模型是勝利者

從Multipplicative模型中獲取其他有用信息

一些關鍵信息和樂趣事實可以從乘法模型中輕鬆推導出來。比如,如果企業問我們能說什麼,或者我們如何比較2014年5月和2014年11月的銷售額。我們需要使用每月、每年、每天和每週索引的價值來回答這些問題。

2014年5月= may_index * 2014_index = 1.02 * 0.9879 = 1.007

2014年11月= nov_index * 2014_index = 1.051 * 0.9879 = 1.038

與2014年5月相比,2014年11月的銷售額增加了多少

(1.038-1.007)/1.007 = 0.0307

因此,2014年11月的季節性比2014年5月多3.07%。我們可以對數年、數週、數天進行類似的比較,並從分解的預測模型中獲得更清晰的圖像。

8.結論

這篇博客文章的主要思想是調整傳統模型來分解時間序列,並創建一個更簡單直觀的模型。

通俗易懂學習:以簡單直觀的方式分解時間序列

編譯出品



分享到:


相關文章: