R语言指数平滑法holt-winters分析谷歌Google Analytics博客用户访问时间序列数据
最近我們被客戶要求撰寫關于時間序列的研究報告,包括一些圖形和統計輸出。
在等距時間段內以一系列點獲得的數據通常稱為時間序列數據。月度零售銷售、每日天氣預報、失業數據、消費者情緒調查等都是時間序列數據的經典示例。事實上,自然界、科學、商業和許多其他應用中的大多數變量都依賴于可以在固定時間間隔內測量的數據。
分析時間序列數據的關鍵原因之一是了解過去并預測未來。科學家可以利用歷史氣候數據來預測未來的氣候變化。營銷經理可以查看某種產品的歷史銷售額并預測未來的需求。
在數字世界中,時間序列數據的一個很好的應用可以是分析特定網站/博客的訪問者,并預測該博客或頁面將來會吸引多少用戶。
在本文中,我們將查看與訪問此博客的用戶有關的時間序列數據集。我將在 R 中建立與 Google Analytics API 的連接,并將每日用戶引入。然后我們將創建一個預測來預測博客可能會吸引的用戶數量。我隨機選擇了日期范圍僅用于說明目的。
這里的想法是讓我們學習如何將 Google Analytics 中的數據查詢到 R 中以及如何創建時間序列預測。
讓我們首先設置我們的工作目錄并加載必要的庫:
# 設置工作目錄 setwd("/Users/")# 加載所需的軟件包。 library(ggplot2) # 用于繪制一些初始圖。 library(forecast) # 用于時間序列的預測。從 Google Analytics API 查詢博客用戶的每日時間序列數據。下面是設置我想要的參數的初始查詢。在這個例子中,我只是從 2017 年 1 月中旬到 2017 年 5 月中旬每天拉博客的用戶數據。
# 創建一個在谷歌分析查詢中使用的參數列表 listparam = Int(dinsns= "ga:date",mercs = "ga:users",sot = "ga:date",maresults = 10000,tae.id = "ga:99395442")設置了我的查詢參數列表,我就可以開始查詢 Google Analytics API:
# 存儲谷歌分析的查詢結果 es = QueyBlder(lit_pram)#通過查詢結果和oauth從Google Analytics獲得數據 df = GetRporData(rs, oaut_tken, splidawse = T) # 對結果重新排序 # 檢查前30天的用戶 head(df,30)從上面的 30 條記錄中可以看出,唯一使用的特征或變量是日期和用戶數量。這是一個非常簡單的數據集,但可以很好地說明時間序列預測示例。
時間序列分析中最重要的步驟之一是繪制數據并檢查它是否有序列中的任何模式和波動。讓我們在時間序列圖中繪制我們日常用戶的結果,以檢查趨勢或季節性,周末用S符號標識:
# 處理日期和繪制每日用戶 df$dte <- as.ate(dfdte, '%m%d') df$d = as. fator(weekays(dfdate)) ggplot( daa = df, as( dateusers )) + geom_line()用這個博客的每日用戶數據看上面的圖表,用戶似乎隨著時間的推移而增加。該序列從不到 100 名用戶開始,在一天內在給定的時間點增加到 400 多名用戶。用戶似乎普遍存在上升?趨勢?。我們還可以粗略地識別出系列中的波峰和波谷,或起伏。這種模式可能與?季節性變化有關。換句話說,每天訪問此博客的用戶數量似乎存在一定程度的季節性。我們可以按星期幾運行一個簡單的箱線圖,嘗試更好地可視化這種模式:
# 創建工作日作為因素并繪制它 df$wd = fator(df$kd) ggplot(df, aes(x=wd, y=srs)) + geom_boxplt()正如您在上圖中所看到的,周二到周四是訪客最多的日子。它吸引了很多用戶,在某些時候,某些工作日的用戶已經超過 400 人。事實上,與一周中的其他日子相比,周四似乎包含大量異常值。相反,與一周中的其他日子相比,周六、周日和周一吸引的用戶數量最少。
因此,當我們重新審視上面的時間序列圖時,我們現在可以說用戶傾向于在周內(星期四的高峰期)更多地訪問此博客,而在周末(星期日)則更少。這是我們之前觀察到的季節性變化。
在時間序列分析中,我們傾向于將觀察到的時間序列數據分解為三個基本組成部分:?趨勢、?季節性?和?不規則。
我們這樣做是為了觀察它的特性并將信號?與?噪聲分開?。我們分解時間序列識別模式、進行估計、對數據建模并提高我們了解正在發生的事情和預測未來行為的能力。分解時間序列使我們能夠在最能描述其行為的數據中擬合模型。
趨勢成分是時間序列的長期方向,反映了觀察到的潛在水平或模式。在我們的例子中,趨勢是向上的,這反映了越來越多的用戶訪問博客。
季節性成分包括在時間、幅度和方向上一致的數據中觀察到的一般效應。例如,在我們這里的例子中,我們看到用戶在周三到周四頻繁出現正峰值。季節性可能由許多因素驅動。在零售業,季節性發生在特定日期,例如長假、雙十一。在我們的博客示例中,似乎用戶在學習/工作周訪問更多,而在周末訪問更少。
不規則,或者也被稱為殘差,是我們去除趨勢和季節性成分后剩下的成分。它反映了序列中不可預知的波動。
在我們分解這個博客日常用戶的時間序列之前,我們需要將查詢的用戶數據框轉換為?R 中的時間序列對象?ts():
# 將數據框轉換成時間序列對象 dfts = ts(df$ers, freqny = 7)# 分解時間序列并繪制結果 dcmp = dompose(dfts, tye = "aditve") prit(dcmp)?
plot(decp)通常,時間序列分解采用加法?或?乘法的形式?。還有其他形式的分解,但我們不會在本例中涉及這些。
簡單地說,加法分解用于時間序列,其中序列的基礎水平波動但季節性的幅度保持相對穩定。隨著趨勢水平隨時間變化,季節性和不規則成分的幅度不會發生顯著變化。
另一方面,當季節性和不規則的幅度隨著趨勢的增加而增加時,使用乘法分解。
我們可以在上面的初始時間序列圖中觀察到,季節性的幅度在整個時間序列中基本保持穩定,這表明加法分解更有意義。
我們在這個練習中的目標之一也是嘗試和擬合一個模型,使我們能夠推斷數據并進行預測,預測本博客的未來用戶。很明顯,預測時間序列的一個關鍵假設是,目前的趨勢將繼續。也就是說,在沒有任何令人驚訝的變化或沖擊的情況下,總體趨勢在未來應該保持類似(至少在短期內)。我們也將不考慮觀察到的模式的任何潛在原因(例如,本博客的任何帖子在微信公眾號有很大的知名度,可能促使很多用戶來到博客頁面,等等)。
當我們在時間序列中進行預測時,我們的目的是在給定某個時間點的過去觀察歷史的情況下預測某個未來值。需要圍繞擬合時間序列模型所需的指數平滑形式進行許多考慮。為簡單起見,我們將在這里只涉及一種方法。
因此,考慮到我們的時間序列存在季節性并使用加法分解,適當的平滑方法是?Holt-Winters ?,它使用指數加權移動平均線來更新估計值。
讓我們在時間序列數據中擬合一個預測模型:
# 在時間序列中應用HoltWinters模型并檢查擬合情況 print(pred)從上面的模型擬合中可以看出,Holt-Winters 的平滑是使用三個參數完成的:? alpha、? beta?和?gamma。Alpha 估計趨勢(或水平)分量,β 估計趨勢分量的斜率,而 gamma 估計季節性分量。這些估計值基于系列中的最新時間點,這些值將用于預測。alpha、beta 和 gamma 的值范圍從 0 到 1,其中接近 0 的值表示最近的觀測值在估計中的權重很小。
從上面的結果中,我們可以看到 alpha 的平滑估計值為 0.4524278,beta 為 0.0211364,gamma 為 0.5593518。alpha 的值大約為 0.5,這表明短期的、近期的觀察和歷史的、更遠的觀察都在時間序列的趨勢估計中起作用。beta 值接近于零,這表明趨勢分量的斜率(從一個時間段到下一個時間段的水平變化)在整個序列中保持相對相似。gamma 的值與 alpha 相對相似,這表明季節性估計基于近期和遠距離觀測。
下面的模型擬合(紅色)和實際觀察值(黑色)的圖有助于說明結果:
# 繪制模型擬合圖 plot(pred)我們現在可以推斷模型來預測這個博客的未來用戶:
#對未來用戶的預測 forecast(pred, h=28)請注意上圖中,粗而亮的藍線表示用戶在下個月左右訪問此博客的預測。深藍色陰影區域代表 80% 的預測區間,淺藍色陰影區域代表 95% 的預測區間。正如我們所見,該模型通常說明了觀察到的模式,并且在估計此博客的未來用戶數量方面做得相對較好。
建議我們檢查預測模型準確性。首先讓我們看看?平方誤差總和 (SSE) ?,它衡量我們的模型與實際觀察數據的差距。執行平方是為了避免負值,并為較大的差異賦予更多權重。接近 0 的值總是更好。在我們的例子中,我們可以看到我們模型的 SSE 是 9.8937336 10^4。
檢查自相關也很重要。一般來說,自相關是用來評估時間序列和同一時間序列的時滯之間是否存在相關關系。這就像把該時間序列復制多次,并在每一步時間前粘貼,評估是否發現了一個模式。在時間序列誤差的背景下,自相關被用來嘗試和尋找存在于殘差中的模式。這就是下面的關系圖所要做的。
?
無需在 Correlogram 本身上花費太多時間,我們可以注意到,雖然模型運行得相對較好,但它在系列的早期階段并沒有像?acf() 函數的?自相關結果 (y軸)在滯后 2 和 3 處。
此外,我們可以從殘差的直方圖中看到,預測誤差在一定程度上呈正態分布,存在一些異常值,表明模型擬合相對較好。
總結
以上是生活随笔為你收集整理的R语言指数平滑法holt-winters分析谷歌Google Analytics博客用户访问时间序列数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谁说六月不能飞雪?
- 下一篇: 生活就是诗和远方,能走多远走多远。