R - 時間序列分析:初學者指南
你好,未來的數據法師們!我很興奮能帶你們踏上一段令人興奮的旅程,進入使用R進行時間序列分析的領域。作為一個教計算機科學多年的老師(我們就說我記得當軟盤真的還是軟的時候吧),我見過無數學生從完全的初學者蛻變成自信的分析師。所以,如果你對編程還是新手,別擔心——我們會從最基本的開始,一起逐步學習。
時間序列分析是什麼?
在我們深入研究R語言的代碼之前,讓我們先來聊聊時間序列分析到底是什麼。想像你在一年內每天跟蹤你附近商店賣出的冰淇淋蛋筒數量。那就是一個時間序列!它簡單地是一系列隨時間測量的數據點。時間序列分析幫助我們理解模式、趨勢,並基於這些歷史數據進行預測。
現在,讓我們來動手寫一些R代碼!
開始使用R
首先,我們需要安裝R和RStudio。把R想像成引擎,RStudio則是讓駕駛變得更容易的豪華儀表板。一旦你安裝了這兩個,打開RStudio,我們開始吧!
# 這是R中的註釋。它不會影響代碼,但幫助我們這些人類理解發生了什麼!
# 我們來創建一個簡單的時間序列
sales <- c(100, 120, 140, 160, 180)
dates <- as.Date(c("2023-01-01", "2023-01-02", "2023-01-03", "2023-01-04", "2023-01-05"))
# 現在我們把它們組合成一個時間序列對象
ts_data <- ts(sales, start = c(2023, 1), frequency = 365)
# 我們來看看我們創造了什麼
print(ts_data)
在這個例子中,我們創建了一個非常簡單的每日銷售數據的時間序列。c()
函數用於創建一個值向量(可以把它當作一個列表)。然後我們使用ts()
函數來創建一個時間序列對象,指定它從何時開始以及我們的測量頻率(在這個例子中是每天)。
不同的時間間隔
現在,讓我們來聊聊不同的時間間隔。時間序列數據可以是每天的、每月的、每季的,或者是任何你可以想像的間隔。R足夠靈活以應對所有這些。讓我們看看一些例子:
# 每月數據
monthly_data <- ts(1:24, start = c(2022, 1), frequency = 12)
# 每季數據
quarterly_data <- ts(1:8, start = c(2022, 1), frequency = 4)
# 每年數據
yearly_data <- ts(1:10, start = 2013)
# 我們來打印它們
print(monthly_data)
print(quarterly_data)
print(yearly_data)
在這些例子中,我們創建了不同頻率的時間序列。對於每月數據,我們使用frequency = 12
(一年有12個月),對於每季數據是frequency = 4
(一年有4個季度),對於每年數據,我們不需要指定頻率。
繪製時間序列
有句話說得好,一幅圖畫等於一千個文字,在數據分析中這句話再正確不過了。讓我們來視覺化我們的時間序列:
# 首先,我們來創建一個更有趣的數據集
set.seed(123) # 這樣可以確保我們所有人都得到相同的"隨機"數字
sales <- 100 + cumsum(rnorm(100)) # 隨機數字的累計和
dates <- seq(as.Date("2023-01-01"), by = "day", length.out = 100)
ts_data <- ts(sales, start = c(2023, 1), frequency = 365)
# 現在我們來繪製它
plot(ts_data, main = "每日銷售", xlab = "日期", ylab = "銷售量")
這段代碼創建了一個看起來更真實的銷售數據集,並添加了一些隨機性,然後將其繪製出來。plot()
函數是一種快速且簡單的方式來視覺化你的時間序列。
多個時間序列
在現實世界中,我們通常需要一起分析多個時間序列。讓我們來創建並視覺化多個序列:
# 創建兩個時間序列
set.seed(123)
sales_A <- 100 + cumsum(rnorm(100))
sales_B <- 120 + cumsum(rnorm(100))
# 將它們組合成一個多個時間序列
multi_ts <- ts(cbind(sales_A, sales_B), start = c(2023, 1), frequency = 365)
# 繪製兩個序列
plot(multi_ts, main = "銷售對比", xlab = "日期", ylab = "銷售量", col = c("blue", "red"))
legend("topleft", legend = c("產品A", "產品B"), col = c("blue", "red"), lty = 1)
在這裡,我們創建了兩個序列,並使用cbind()
將它們組合起來。然後我們一起繪製它們,使用不同的顏色來區分序列。
常見的時間序列分析方法
現在我們已經介紹了基礎知識,讓我們來看看一些常見的時間序列分析方法。這裡有一個總結這些方法的表格:
方法 | 描述 | R函數 |
---|---|---|
移動平均 | 平滑短期波動 |
ma() 來自forecast 套件 |
指數平滑 | 對最近觀測給予更多權重 |
ets() 來自forecast 套件 |
ARIMA | 自回归积分滑动平均 |
arima() 或auto.arima()
|
分解 | 將序列分解為趨勢、季節性和殘差成分 |
decompose() 或stl()
|
讓我們試試其中一種方法 - 分解:
# 分解我們的時間序列
decomposed <- decompose(ts_data)
# 繪製分解結果
plot(decomposed)
這個分解將我們的時間序列分為三個部分:趨勢、季節性和隨機成分。這是一種理解數據中潛在模式的好方法。
結論
恭喜你們!你們剛剛踏入了R語言時間序列分析這個迷人領域的第一步。我們已經介紹了創建、視覺化和分析時間序列數據的基礎。記住,就像學習任何新技能一樣,熟練需要練習。不要害怕嘗試不同的數據集和方法。
在我多年的教學經驗中,我發現那些表現出色的學生都是帶著好奇心和堅持心態來解決每個問題的人。所以,請持續探索,持續提問,最重要的是,持續編程!
Credits: Image by storyset