R语言时间序列分解和异常检测方法应用案例

简介: R语言时间序列分解和异常检测方法应用案例

我们最近有一个很棒的机会与一位客户合作,要求构建一个适合他们需求的异常检测算法。业务目标是准确地检测各种营销数据的异常情况,这些数据包括跨多个客户和Web源数千个时间序列的网站操作和营销反馈。异常检测算法,该算法基于时间并可从一个到多个时间序列进行扩展。

案例研究

我们与许多教授数据科学的客户合作,并利用我们的专业知识加速业务发展。

我们的客户遇到了一个具有挑战性的问题:按时间顺序检测每日或每周数据的时间序列异常。异常表示异常事件,可能是营销域中的Web流量增加或IT域中的故障服务器。无论如何,标记这些不寻常的事件确保业务顺利运行非常重要。其中一个挑战是客户处理的不是一个时间序列,而是需要针对这些极端事件进行分析

anomalize

这里有四个简单步骤的工作要点。

第1步:安装
install.packages("tidyverse")
第2步:加载
library(tidyverse)
第3步:收集时间序列数据
tidyverse\_cran\_downloads
## # A tibble: 6,375 x 3
## # Groups: package \[15\]
## date count package
##
## 1 2017-01-01 873. tidyr
## 2 2017-01-02 1840. tidyr
## 3 2017-01-03 2495. tidyr
## 4 2017-01-04 2906. tidyr
## 5 2017-01-05 2847. tidyr
## 6 2017-01-06 2756. tidyr
## 7 2017-01-07 1439. tidyr
## 8 2017-01-08 1556. tidyr
## 9 2017-01-09 3678. tidyr
## 10 2017-01-10 7086. tidyr
## # ... with 6,365 more rows
第4步:异常化
使用功能及时发现异常情况。

异常检测工作流程

其中包括:

  • 用时间序列分解
  • 用检测异常
  • 异常下限和上限转换

时间序列分解

第一步是使用时间序列分解。“计数”列被分解为“观察”,“季节”,“趋势”和“剩余”列。时间序列分解的默认值是method = "stl",使用平滑器进行季节性分解。

## # A time tibble: 6,375 x 6
## # Index: date
## # Groups: package \[15\]
## package date observed season trend remainder
##
## 1 tidyr 2017-01-01 873. -2761. 5053. -1418.
## 2 tidyr 2017-01-02 1840. 901. 5047. -4108.
## 3 tidyr 2017-01-03 2495. 1460. 5041. -4006.
## 4 tidyr 2017-01-04 2906. 1430. 5035. -3559.
## 5 tidyr 2017-01-05 2847. 1239. 5029. -3421.
## 6 tidyr 2017-01-06 2756. 367. 5024. -2635.
## 7 tidyr 2017-01-07 1439. -2635. 5018. -944.
## 8 tidyr 2017-01-08 1556. -2761. 5012. -695.
## 9 tidyr 2017-01-09 3678. 901. 5006. -2229.
## 10 tidyr 2017-01-10 7086. 1460. 5000. 626.
## # ... with 6,365 more rows

frequency并trend自动为您选择。此外,可以通过输入基于时间的周期(例如“1周”或“2个季度”)来更改选择,可以确定有多少观察属于时间跨度。

异常检测

下一步是对分解的数据执行异常检测。产生了三个新列:“remainder\_l1”(下限),“remainder\_l2”(上限)和“异常”(是/否标志)。默认方法是method = "iqr",在检测异常时快速且相对准确。

## # Groups: package \[15\]
## package date observed season trend remainder remainder_l1
##
## 1 tidyr 2017-01-01 873. -2761. 5053. -1418. -3748.
## 2 tidyr 2017-01-02 1840. 901. 5047. -4108. -3748.
## 3 tidyr 2017-01-03 2495. 1460. 5041. -4006. -3748.
## 4 tidyr 2017-01-04 2906. 1430. 5035. -3559. -3748.
## 5 tidyr 2017-01-05 2847. 1239. 5029. -3421. -3748.
## 6 tidyr 2017-01-06 2756. 367. 5024. -2635. -3748.
## 7 tidyr 2017-01-07 1439. -2635. 5018. -944. -3748.
## 8 tidyr 2017-01-08 1556. -2761. 5012. -695. -3748.
## 9 tidyr 2017-01-09 3678. 901. 5006. -2229. -3748.
## 10 tidyr 2017-01-10 7086. 1460. 5000. 626. -3748.
## # ... with 6,365 more rows, and 2 more variables: remainder_l2 ,
## # anomaly

现在尝试另一个绘图功能。它只适用于单个时间序列。“季节”消除每周的季节性。趋势是平滑的。最后,检测最重要的异常值。

tidyverse\_cran\_downloads %>%
time_decompose(count, method = "stl", frequency = "auto", trend = "auto") %>%
anomalize(remainder, method = "iqr", alpha = 0.05, max_anoms = 0.2) %>%
plot\_anomaly\_decomposition() +

异常下限和上限

最后一步是围绕“观察”值创建下限和上限。创建了两个新列:“recomposed\_l1”(下限)和“recomposed\_l2”(上限)。

## # A time tibble: 6,375 x 11
## # Index: date
## # Groups: package \[15\]
## package date observed season trend remainder remainder_l1
##
## 1 tidyr 2017-01-01 873. -2761. 5053. -1418. -3748.
## 2 tidyr 2017-01-02 1840. 901. 5047. -4108. -3748.
## 3 tidyr 2017-01-03 2495. 1460. 5041. -4006. -3748.
## 4 tidyr 2017-01-04 2906. 1430. 5035. -3559. -3748.
## 5 tidyr 2017-01-05 2847. 1239. 5029. -3421. -3748.
## 6 tidyr 2017-01-06 2756. 367. 5024. -2635. -3748.
## 7 tidyr 2017-01-07 1439. -2635. 5018. -944. -3748.
## 8 tidyr 2017-01-08 1556. -2761. 5012. -695. -3748.
## 9 tidyr 2017-01-09 3678. 901. 5006. -2229. -3748.
## 10 tidyr 2017-01-10 7086. 1460. 5000. 626. -3748.
## # ... with 6,365 more rows, and 4 more variables: remainder_l2 ,
## # anomaly , recomposed\_l1 , recomposed\_l2

让我们看一下“lubridate”数据。我们可以plot\_anomalies()和设置time\_recomposed = TRUE。此功能适用于单个和分组数据。

time_decompose(count, method = "stl", frequency = "auto", trend = "auto") %>%
anomalize(remainder, method = "iqr", alpha = 0.05, max_anoms = 0.2) %>%
time_recompose() %>%
# 绘制异常分解
plot\_anomalies(time\_recomposed = TRUE) +
ggtitle("Lubridate Downloads: Anomalies Detected")

预测

forecast是在执行预测之前有效收集异常值的好方法。它使用基于STL的离群值检测方法。它非常快,因为最多有两次迭代来确定异常值带。

结论

R软件非常有效地用于检测异常的许多传统预测时间序列。但是,速度是一个问题,特别是在尝试扩展到多个时间序列时。

我们从中了解到所有软件包的最佳组合:

  • 分解方法:我们包括两个时间序列分解方法:( "stl"使用Loess的传统季节分解)和"twitter"(使用中间跨度的季节分解)。
  • 异常检测方法:我们包括两种异常检测方法:( "iqr"使用类似于3X IQR的方法forecast::tsoutliers())和"gesd"(使用Twitter使用的GESD方法AnomalyDetection)。

有问题欢迎下方留言!

相关文章
|
21天前
|
存储 数据可视化 数据挖掘
R语言在生物信息学中的应用
【10月更文挑战第21天】生物信息学是生物学、计算机科学和信息技术相结合的交叉学科,主要研究生物大分子信息的存储、处理、分析和解释。R语言作为一种强大的统计分析工具,被广泛应用于生物信息学领域。本文将介绍R语言在生物信息学中的应用,包括基因组学、转录组学、蛋白质组学、代谢组学等方面,帮助读者了解R语言在生物信息学中的重要性和应用前景。
45 4
|
21天前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
40 3
|
21天前
|
机器学习/深度学习 数据采集 人工智能
R语言是一种强大的编程语言,广泛应用于统计分析、数据可视化、机器学习等领域
R语言是一种广泛应用于统计分析、数据可视化及机器学习的强大编程语言。本文为初学者提供了一份使用R语言进行机器学习的入门指南,涵盖R语言简介、安装配置、基本操作、常用机器学习库介绍及实例演示,帮助读者快速掌握R语言在机器学习领域的应用。
47 3
|
21天前
|
机器学习/深度学习 并行计算 数据挖掘
R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域
【10月更文挑战第21天】R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域。本文将介绍R语言中的一些高级编程技巧,包括函数式编程、向量化运算、字符串处理、循环和条件语句、异常处理和性能优化等方面,以帮助读者更好地掌握R语言的编程技巧,提高数据分析的效率。
38 2
|
2月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
|
2月前
|
机器学习/深度学习 算法 数据挖掘
R语言中的支持向量机(SVM)与K最近邻(KNN)算法实现与应用
【9月更文挑战第2天】无论是支持向量机还是K最近邻算法,都是机器学习中非常重要的分类算法。它们在R语言中的实现相对简单,但各有其优缺点和适用场景。在实际应用中,应根据数据的特性、任务的需求以及计算资源的限制来选择合适的算法。通过不断地实践和探索,我们可以更好地掌握这些算法并应用到实际的数据分析和机器学习任务中。
|
6月前
【R语言实战】——fGARCH包在金融时序上的模拟应用
【R语言实战】——fGARCH包在金融时序上的模拟应用
|
3月前
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。
|
3月前
|
机器学习/深度学习 资源调度 算法
R语言逻辑回归与分类模型的深度探索与应用
【8月更文挑战第31天】逻辑回归作为一种经典的分类算法,在R语言中通过`glm()`函数可以轻松实现。其简单、高效且易于解释的特点,使得它在处理二分类问题时具有广泛的应用价值。然而,值得注意的是,逻辑回归在处理非线性关系或复杂交互作用时可能表现不佳,此时可能需要考虑其他更复杂的分类模型。
|
3月前
|
数据挖掘
R语言方差分析(ANOVA):理解与应用
【8月更文挑战第31天】ANOVA是一种强大的统计方法,用于比较三个或更多组之间的均值差异。在R语言中,我们可以轻松地使用`aov()`函数进行ANOVA分析,并通过后置检验(如TukeyHSD检验)来进一步分析哪些组之间存在显著差异。ANOVA在多个领域都有广泛的应用,是数据分析中不可或缺的工具之一。