机器学习笔记(时间序列):不同类型的图示

10 篇文章 2 订阅
本文介绍了如何在R语言中使用ts和forecast等包绘制时间图,展示趋势、季节性和周期性特征。通过window、subset和lagplot等函数操作时间序列数据,以及ggplot2进行可视化,帮助理解数据模式。实例包括房屋销售、国库券和发电量数据的分析。
摘要由CSDN通过智能技术生成

1 时间图 time-plot

        就是最普通的绘制一张随时间变化的连点图。不过在这一张图中,可能会有时间序列的不同属性:趋势、季节性、周期性

1.0 R语言补充:设置时间序列

y <- ts(c(123,39,78,52,110), start=2012)

 

 如果我们不是一年一个数据,那么我们可以设置freq,表示一年的频率

y<-ts(c(5,3,3.1,3.2,3.3,3.4,3.5,3.3,3.2,4,4.1,4.2,
        6,4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5,
        10,9,8,8.5,8.4,8.5,8.6,8.7,8.8,8.9,9,9.5),
       start = 2020,
       frequency = 12)

识别出来的是2020到2023,也就是3年

library(forecast)
library(ggplot2)

forecast::autoplot(y)+ggtitle('3-year data')+xlab('year')+ylab('hundred')

 1.0.1 截取时间序列

1.0.1.1 使用window 函数

y

      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
2020  5.0  3.0  3.1  3.2  3.3  3.4  3.5  3.3  3.2  4.0  4.1  4.2
2021  6.0  4.0  4.1  4.2  4.3  4.4  4.5  4.6  4.7  4.8  4.9  5.0
2022 10.0  9.0  8.0  8.5  8.4  8.5  8.6  8.7  8.8  8.9  9.0  9.5


window(y,start=2021)
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug
2021  6.0  4.0  4.1  4.2  4.3  4.4  4.5  4.6
2022 10.0  9.0  8.0  8.5  8.4  8.5  8.6  8.7
      Sep  Oct  Nov  Dec
2021  4.7  4.8  4.9  5.0
2022  8.8  8.9  9.0  9.5

想要截断到某个月份的话,也可以:

y_pre=window(y,start=2020,end=c(2021,12))
> y_pre
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct
2020 5.0 3.0 3.1 3.2 3.3 3.4 3.5 3.3 3.2 4.0
2021 6.0 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8
     Nov Dec
2020 4.1 4.2
2021 4.9 5.0

1.0.1.2 使用subset函数

可以按照下标截取(R语言是从1开始计数的) 

subset(y,start=2)
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug
2020       3.0  3.1  3.2  3.3  3.4  3.5  3.3
2021  6.0  4.0  4.1  4.2  4.3  4.4  4.5  4.6
2022 10.0  9.0  8.0  8.5  8.4  8.5  8.6  8.7
      Sep  Oct  Nov  Dec
2020  3.2  4.0  4.1  4.2
2021  4.7  4.8  4.9  5.0
2022  8.8  8.9  9.0  9.5

 我们这里是按照月份划分年的数据,所以我们可以按照月份截取(如果按照季度,可以是quarter)

subset(y,month=1)
Time Series:
Start = 2020 
End = 2022 
Frequency = 1 
[1]  5  6 10

 1.0.1.3 head & tail

截取最前和最后的几个

head(y,2)
     Jan Feb
2020   5   3

head(y)
     Jan Feb Mar Apr May Jun
2020 5.0 3.0 3.1 3.2 3.3 3.4

tail(y,2)
     Nov Dec
2022 9.0 9.5

tail(y)
     Jul Aug Sep Oct Nov Dec
2022 8.6 8.7 8.8 8.9 9.0 9.5

1.1 趋势 trend

当数据长期增加或减少时,就会出现趋势。 它不必是线性的。

有时我们将趋势称为“改变方向”,即它可能从上升趋势变为下降趋势。

1.2 季节性 seasonality

        当时间序列受到季节因素(例如一年中的某个时间或一周中的某一天)的影响时,就会出现季节性模式。

        季节性总是具有固定且已知的频率。

1.3 周期性(循环) Cyclic

        当数据表现出非固定频率的上升和下降时,就会出现一个循环。

许多人将周期性行为与季节性行为混为一谈(我之前有些博客可能也有这个问题,我会陆续更改),但它们确实完全不同: 如果波动不是固定频率的,那么它们是循环的; 如果频率不变并且与日历的某些方面相关联,则该模式是季节性的。

         一般来说,周期的平均长度比季节性模式的长度要长,而且周期的幅度往往比季节性模式的幅度更易变化。

1.4 举例说明

  •  每月房屋销售(左上图)显示出每年内的强烈季节性,以及一些大约 6-10 年的强烈周期性行为。 这一数据没有明显的趋势。
  • 美国国库券合约(右上)显示了 1981 年芝加哥市场连续 100 个交易日的结果。这里没有季节性,但有明显的下降趋势。 可能,如果我们有一个更长的序列,我们会看到这种下降趋势实际上是一个长周期的一部分,但仅从 100 天来看,它似乎只是一种趋势。
  • 澳大利亚季度发电量(左下)呈现强劲增长趋势,具有很强的季节性。 这里没有任何循环行为的证据。
  • 谷歌收盘价(右下)的每日变化没有趋势、季节性或周期性行为。 随机波动似乎不太可预测,也没有强大的模式可以帮助开发预测模型。

2 周期性图 seasonal plot

        季节性图类似于时间图time plot,只是数据是针对观察数据的各个“季节”绘制的。

 现在每个季节的数据都重叠了。 季节性图可以更清楚地看到潜在的季节性模式,并且在识别模式发生变化的年份时特别有用。

        通过上述周期性图,很明显,每年 1 月份的销售额都会出现大幅增长。 实际上,这些可能是 12 月下旬的销售,因为客户年底前购物,但销售直到一两周后才向政府登记。

        该图还显示,2008 年 3 月的销售额异常少(大多数其他年份显示在 2 月和 3 月之间有所增加)。 2008 年 6 月的少量销售额可能是由于在收集数据时对销售额的统计不完整(比如统计的时候还在六月份)。

        季节性图的一个有用变化是使用极坐标。 设置 polar=TRUE 使时间序列轴呈圆形而不是水平,如下所示。  

2.1 R语言补充

用和1.0一样的数据的library

forecast::ggseasonplot(y,
                       year.labels = TRUE,
                       year.labels.left = TRUE)
    +ylab('hundred')
    +ggtitle('seasonal plot')

 极坐标:

forecast::ggseasonplot(y,polar=TRUE)+ylab('hundred')+ggtitle('seasonal plot')

 3 周期性子图

另一种强调季节性模式的图是在单独的时间子图中将每个季节的数据收集在一起。

         蓝色水平线表示每个月的平均值。 这种形式的绘图可以清楚地看到潜在的季节性模式,还可以显示季节性随时间的变化。 它对于识别特定季节内的变化特别有用。

         在这个例子中,情节并不是特别有启发性。 但在某些情况下,这是查看随时间变化的季节性变化的最有用的方法。

3.1R语言补充

个人尝试中,加了forcast::反而报错

ggsubseriesplot(y)+ylab('hundred')+ggtitle('seasonal subseries plot')

 4 散点图 scatter plot

到目前为止讨论的图表对于可视化单个时间序列很有用。 探索时间序列之间的关系也很有用。

图 2.7 显示了 2014 年澳大利亚维多利亚州的两个时间序列:半小时电力需求(千兆瓦)和温度(摄氏度)。 温度是针对维多利亚州最大城市墨尔本的,而需求值是针对整个州的。

我们可以通过绘制一个系列与另一个系列来研究需求和温度之间的关系。

 4.1 R语言补充

假设我们有另一个时间序列x

x<-ts(c(5,6,7.1,2.2,5.3,1.4,2.5,6.3,3.2,4,5.1,4.2,
         6,4,4.1,3.2,2.3,8.4,0.5,4.6,4.7,3.8,4.9,5,
         12,7,8,6.5,8.4,5.5,9.6,7.7,9.8,10.9,9,6.5),
       start = 2020,
       frequency = 12)

qplot(x,y)

 5 相关性

        计算相关系数来衡量两个变量之间关系的强度是很常见的。

         变量 x 和 y 之间的相关性由下式给出

         r 的值始终介于 - 1 和 1 之间,负值表示负关系,正值表示正关系。

        图 2.9 中的图表显示了具有不同相关程度的数据集示例。

        

         相关系数仅衡量线性关系的强度,有时可能会产生误导。 例如,图 2.8 所示的电力需求与温度数据的相关性为 0.28,但非线性关系比这要强。

        图 2.10 中的图都具有 0.82 的相关系数,但它们的关系非常不同。 这表明查看数据图而不是简单地依赖相关值是多么重要。

        

5.1 相关性矩阵 scatter plot

比如我们现在有5个独立的时间序列 

 要查看这五个时间序列之间的关系,我们可以将每个时间序列与其他时间序列进行对比。 这些图可以排列在散点图矩阵中

         对于每个面板,纵轴上的变量由该行中的变量名给出,横轴上的变量由该列中的变量名给出。

         有许多选项可用于在每个面板中生成不同的图。 在默认版本中,相关性显示在图的右上半部分,而散点图显示在下半部分。 在对角线上显示密度图。

        散点图矩阵的价值在于它可以快速查看所有变量对之间的关系。 在此示例中,第二列图显示新南威尔士州北海岸的游客与新南威尔士州南海岸的游客之间存在很强的正相关关系,但新南威尔士州北海岸的游客与新南威尔士州南部内陆的游客之间没有可检测到的关系。

        也可以看到异常值。 新南威尔士州大都会地区有一个异常高的季度,对应于 2000 年悉尼奥运会。 这在图 2.12 左列的前两个图中最容易看出,其中 NSW Metro 的最大值与主要的观测云是分开的。

5.2.1 R语言补充

GGally::ggpairs(data.frame(as.numeric(x), as.numeric(y)))

 6 lag plot  滞后图

        图 2.13 显示了澳大利亚啤酒季度产量的散点图,其中横轴显示了时间序列的滞后值。 每个图表显示了针对不同 k 值绘制的 yt 与 yt−k 的关系图。

        

        这里的颜色表示变量代表不同的季度。 点按时间顺序连接成线。

         这种关系在滞后 4 和 8 处是非常正向的,反映了数据的强烈季节性。(t和t-4;t和t-8之间的强正向关系) 出现滞后 2 和 6 的负相关是因为峰值(第四季度)与波谷(第二季度)相对应

 6.1 补充 R语言实现

gglagplot((x))

 7 自相关 autocorrelation

        正如相关性衡量两个变量之间线性关系的程度一样,自相关衡量时间序列滞后值之间的线性关系。

        有几个自相关系数,对应于滞后图中的每个面板。 例如,r1 测量 yt 和 yt-1 之间的关系,r2 测量 yt 和 yt-2 之间的关系,依此类推。

        rk可以写成

        其中T 是时间序列的长度

         下表给出了啤酒生产数据的前九个自相关系数。

这些对应于图 2.13 中的九个散点图。

        绘制自相关系数以显示自相关函数或 ACF。 该图也称为相关图

        

 在此图中:

  • r4 高于其他滞后。 这是由于数据中的季节性模式:峰值往往相隔四个季度,而谷底往往也相隔四个季度。
  • r2 比其他滞后更负,因为波谷往往比波峰落后四分之二。
  • 蓝色虚线表示相关性是否显着不同于零。

7.1 R语言实现

 ggAcf(x)

 7.2 ACF图中 的趋势和季节性

        当数据有趋势时,小滞后的自相关往往较大且为正,因为时间附近的观测值也在附近。 因此,有趋势的时间序列的 ACF 往往具有正值,随着滞后的增加而缓慢下降。

        当数据是季节性的时,季节性滞后(季节性频率的倍数)的自相关将大于其他滞后的自相关。

        当数据同时具有趋势和季节性时,会看到这些影响的组合。

         图 2.15 中绘制的每月澳大利亚电力需求序列显示了趋势和季节性。 其 ACF 如图 2.16 所示。

        

 

         随着滞后增加,ACF 缓慢下降是由于趋势,而“扇形”形状是由于季节性。

8 白噪声

 不显示自相关的时间序列称为白噪声。 图 2.17 给出了一个白噪声系列的例子。

 set.seed(30)
 y <- ts(rnorm(50))
 autoplot(y) + ggtitle("White noise")

 他的ACF是

 

         对于白噪声序列,我们期望每个自相关接近于零。

         当然,它们不会完全等于零,因为存在一些随机变化。

        对于白噪声序列,我们预计 ACF 中 95% 的尖峰位于 ±2/√T 范围内,其中 T 是时间序列的长度。 通常将这些界限绘制在 ACF 图上(上面的蓝色虚线)。

         如果一个或多个大尖峰超出这些界限,或者如果超过 5% 的尖峰超出这些界限,则该系列可能不是白噪声。

        在上例中,T=50,因此边界为 ±2/√50=±0.28。 所有的自相关系数都在这些范围内,因此数据是白噪声。

9 相邻点之间的残差图

 y<-ts(c(5,3,3.1,3.2,3.3,3.4,3.5,3.3,3.2,4,4.1,4.2,
         6,4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5,
         10,9,8,8.5,8.4,8.5,8.6,8.7,8.8,8.9,9,9.5),
       start = 2020,
       frequency = 12)


library(forecast)
res<-residuals(naive(y))

library(ggplot2)
autoplot(res)+ggtitle('residuals of neighbors')

9.1 checkresiduals

checkresiduals((y))

 

 

10 直方图

gghistogram(y)

 

参考资料:2.9 White noise | Forecasting: Principles and Practice (2nd ed) (otexts.com) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值