iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
1
AI & Data

飛哥與小博的30天-統計與機器學習成長日記系列 第 18

[DAY 18] 章節2-12: 找出流感的規律-時間序列平穩性,acf,pacf(2/3) (R+解說)

  • 分享至 

  • xImage
  •  

2-12 找出流感的規律

飛哥打開電腦,用熟悉的R程式分析了手上的資料,一邊盯著螢幕思考著。

「飛哥,你之前不是都用Python嗎?怎麼這次用R進行分析了啊?」小博有些疑惑,畢竟平常看飛哥用Python用得風生水起,一時換了方法還挺意外的。

飛哥搔了搔腦袋說道:「因為時間序列這個方法在統計上已經被使用很久了,而R語言又是統計分析時常用的軟體,因此時間序列的相關套件也被寫得很完善;Python是近幾年來的當紅程式語言,主要是因機器學習與深度學習的興起有關,時間序列的套件就相對的比較少。所以說我做時間序列時,反而比較常用R語言呢!」。

「不提這個了,你看螢幕,我們做時間序列分析時,第一步是 看序列是否平穩 ,如果不平穩,就會利用『差分(由後一項數字減去前一項數字)』來平緩遞增遞減的趨勢,以維持數列的穩定性,像疾管署給的這筆資料很平穩,我就不打算進行差分了。」飛哥指著電腦螢幕說著。

https://ithelp.ithome.com.tw/upload/images/20201003/20130640zIIvHvGptZ.png

「這邊用Augmented Dickey–Fuller Test,虛無假設是『該序列有單根』,可以想像序列經線性回歸後,若跟x軸相切則表示有單根;也就是說若P-value< 0.05,則回歸後的預測線是與x軸水平,間接表示這個序列是平穩的,不會有遞增向上或向下的趨勢出現。」飛哥詳細的介紹簡單的平穩性測試方法。

「再來就是很多人看不懂的 ACFPACF 圖形啦!這兩個是用來檢測資料自身的相關性,分別是 自我相關係數偏自我相關係數 。」飛哥指著這些一條條突起的線。
https://ithelp.ithome.com.tw/upload/images/20201003/20130640Fhv47YUG9L.png
並接著解釋說:「左邊的ACF圖中線的高低代表的是 資料經過t個時間平移後,未平移資料與平移資料的相關係數,所以看到第一條線t=0(未平移)時相關係數一定等於1,因為平移0次的資料長的跟原始資料一模一樣;右邊PACF圖中從左邊數來第t個值代表的是 排除掉第1到第t-1秒對原始資料造成的影響後,剩餘第t秒與原始資料的相關係數 ,因此這指標看的是單一秒數對原始資料的相關程度高低。所以說就上述定義而言,ACF與PACF在第1秒的數值一定相同,都是在算平移1秒後資料與原資料的相關係數。」

「好神奇喔!我以為相關係數只能計算不同個體間的數值,沒想到還可以自己跟自己比。」小博聽完飛哥的解說後嘖嘖稱奇。

「就是因為資料有 重現性 ,所以經過一定時間後,狀態會再重現,在這個時間點,自己跟t秒前的自己是很相似的,所以相關係數也會高,也就符合資料具有自相關的這個特徵了。」飛哥耐心的說明著,畢竟第一次認識這個指標的人多半聽不太懂。

「待會再跟你說說時間序列模型怎麼建吧!我先去喝杯茶。」說完,飛哥拿起櫃子上他最愛的菊花與普洱茶包。


R程式時間

#建立資料
x=c(154,123,79,87,63,54,32,13,28,69,86,75,
    112,100,89,82,76,56,48,21,22,38,73,85,
    139,130,93,90,73,60,44,21,26,47,59,69,
    132,110,99,72,74,52,43,28,29,48,63,75,
    135,120,93,90,66,67,47,31,25,47,69,59)

year=c('2015','2016','2017','2018','2019')
month=c('01','02','03','04','05','06','07','08','09','10','11','12')

k=c('') #設定資料串時間
for (i in c(1:length(year))){
	for (j in c(1:length(month))){
		data=paste(year[i], month[j], sep="-")
		k=c(k,data)}}
k=k[-1]
k

plot.ts(x) #畫出時序圖

influenza_people <- ts(x, frequency=12, start=c(2015,1))
plot.ts(influenza_people) #畫出時序圖+時間

acf(x, lag.max=30) #自我相關
pacf(x, lag.max=30) #偏自我相關

install.packages("tseries") #安裝套件
library(tseries)
adf.test(x) #檢測平穩性


後記:檢測平穩性的方法不只一種,這邊提飛哥最常用的一種,第一次接觸時間序列的時候也是想了很久啊,後來接觸許多專案才慢慢搞懂它的操作原理。

資料參考:
http://finzi.psych.upenn.edu/R/library/tseries/html/adf.test.html
https://a-little-book-of-r-for-time-series.readthedocs.io/en/latest/src/timeseries.html
https://online.stat.psu.edu/stat510/lesson/2/2.2


上一篇
[DAY 17] 章節2-11: 流感再現-時間序列分析(1/3)
下一篇
[DAY 19] 章節2-13: 流感模型選擇-時間序列ARIMA(3/3) (R+解說)
系列文
飛哥與小博的30天-統計與機器學習成長日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言