上周翻出老家气象站2015–2023年的月均温ref="/tag/426/" style="color:#B2A89E;font-weight:bold;">数据,想看看夏天是不是真的一年比一年热。没打开Excel,直接开了RStudio——几行代码跑完,趋势线、季节图、ARIMA预测全出来了。R做时间序列分析,真没那么玄乎。
先让数据“认得清自己”
R不认得“时间”,得手动告诉它哪列是时间、频率是多少。比如读入一个CSV,第一列是日期(格式为2015-01),第二列是气温:
library(readr)
library(zoo)
data <- read_csv("temp_monthly.csv")
# 转成zoo对象,按月频次设定
ts_data <- zoo(data$temperature, order.by = as.yearmon(data$date))
as.yearmon()比as.Date()更适配月度数据,不会卡在2月29日这种边界问题上。要是你手头是日度销售数据,换成as.Date()加frequency=365就行。
一眼看出规律:画图比看数字管用
别急着建模,先画出来。用plot()看看原始序列,再加个decompose()拆解趋势、季节和残差:
plot(ts_data, main = "月均气温变化(2015–2023)", ylab = "℃")
decomp <- decompose(ts_data)
plot(decomp)
我那组数据的季节图里,每年7月都稳稳顶在最高点,而1月几乎固定在最低位——这说明季节性极强;趋势图则缓缓上扬,近九年平均升温约0.8℃,肉眼可辨。
预测下个月?试试ARIMA
想预估下个月气温?forecast包里的auto.arima()能自动选参数:
library(forecast)
fit <- auto.arima(ts_data)
fc <- forecast(fit, h = 1) # 预测1步
print(fc)
输出里会带点估计值和80%、95%置信区间。我试了2023年12月的数据,模型给出预测2.3℃±0.4℃,实际是2.6℃,误差在合理范围。如果换成零售店的日销量,这个方法也能快速响应促销或节假日带来的波动。
小技巧:遇到缺失值别删,用na.interp填
实测数据常有断档,比如某个月仪器坏了没记录。别急着删整行——na.interp()能基于前后值线性插补:
ts_clean <- na.interp(ts_data)
它比简单用均值填充更靠谱,尤其对温度、股价这类连续变化的序列。
不是所有序列都要复杂模型
上周帮朋友处理奶茶店周销量,前两年波动大,但最近半年明显走平。我直接用了ets()(指数平滑),比ARIMA快,预测结果反而更稳。R里没有“必须用哪个模型”的规矩,谁跑出来残差白噪声检验通过、预测误差小,就用谁。