原文链接:http://tecdat.cn/?p=3232

原文出处:拓端数据部落公众号

我们最近有一个很棒的机会与一位客户合作,要求构建一个适合他们需求的异常检测算法。业务目标是准确地检测各种营销数据的异常情况,这些数据包括跨多个客户和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)。

有问题欢迎下方留言!

拓端tecdat|R语言时间序列分解和异常检测方法应用案例相关推荐

  1. 拓端tecdat|R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

    最近我们被客户要求撰写关于LOESS(局部加权回归)的研究报告,包括一些图形和统计输出. 这篇文章描述了一种对涉及季节性和趋势成分的时间序列的中点进行建模的方法.我们将对一种叫做STL的算法进行研究, ...

  2. 拓端tecdat|R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险

    最近我们被客户要求撰写关于冠心病风险的研究报告,包括一些图形和统计输出. 相关视频:R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险 逻辑回归Logistic模型原理和R语言分类预测冠 ...

  3. 拓端tecdat|R语言向量误差修正模型 (VECMs)分析长期利率和通胀率影响关系

    最近我们被客户要求撰写关于向量误差修正模型的研究报告,包括一些图形和统计输出. 向量自回归模型估计的先决条件之一是被分析的时间序列是平稳的.但是,经济理论认为,经济变量之间在水平上存在着均衡关系,可以 ...

  4. 拓端tecdat|R语言线性回归和时间序列分析北京房价影响因素可视化案例

    最近我们被客户要求撰写关于北京房价影响因素的研究报告,包括一些图形和统计输出. 目的 房价有关的数据可能反映了中国近年来的变化: 人们得到更多的资源(薪水),期望有更好的房子 人口众多 独生子女政策: ...

  5. R语言:怎么进行异常检测

    a <- try(as.Date('2017-02-30'),silent = T) 当silent为F是,错误消息还是会返回 怎么检测a是否出错呢:if('try-error' %in% cl ...

  6. r语言时间序列图_R中的时间序列图

    r语言时间序列图 In this tutorial, we'll be going over how to create time series plots in R. Time series dat ...

  7. R语言时间序列代码整理

    R语言时间序列代码整理 时间序列: data<-read.csv('/Users/ji_fanyang/Desktop/test2.csv') myseries<- ts(data[1], ...

  8. R语言时间序列(time series)分析实战:简单指数平滑法预测

    R语言时间序列(time series)分析实战:简单指数平滑法预测 目录

  9. R语言时间序列(time series)分析实战:HoltWinters平滑法预测

    R语言时间序列(time series)分析实战:HoltWinters平滑法预测 目录

  10. R语言时间序列(time series)分析实战:霍尔特指数Holt‘s平滑法预测

    R语言时间序列(time series)分析实战:霍尔特指数Holt's平滑法预测 目录

最新文章

  1. Python3中装饰器介绍
  2. 图像分割--PixelNet: Representation of the pixels, by the pixels, and for the pixels
  3. 高颜值的神经网络可视化工具:3D、彩色、可定制,还能可视化参数重要性
  4. Java 实现MapReduce函数
  5. 【哲学探讨】娱乐至死
  6. spark sql and hive 3g数据测试
  7. Android AIDL使用介绍(3) 浅说AIDL背后的Binder
  8. ubuntu系统下安装docker并部署Springboot+mysql+redis
  9. ImportError: cannot import name 'pyopenpose' from 'openpose'错误解决方法
  10. CFileDialog获取文件与文件夹路径
  11. 【Java】Java 8 新特性-----Lambda 表达式
  12. 1年sql数据库经验,却说数据模型一文不值?你还没懂数据仓库
  13. java.lang.NoClassDefFoundError: weblogic/rmi/extensions/DisconnectListener
  14. 通过分区(Partition)提升MySQL性能
  15. 拓端tecdat|Python基于粒子群优化的投资组合优化研究
  16. CAD编辑指南2:五大CAD查看器的功能盘点
  17. 谈谈扫码支付的实现流程
  18. Debug: defusedxml, CV_LOAD_IMAGE_UNCHANGED,CV_IMWRITE_JPEG_QUALITY,undistortPoints
  19. ipad微信号无法连接服务器,ipad微信内置浏览器无法微信登录
  20. C++ 定义学生信息结构体,按照学号顺序排序

热门文章

  1. 五天学redhat系列之---安装篇(下)
  2. 一次debug过程描述
  3. 将现有企业级模板项目从 Visual Studio .NET 2003 迁移到 Visual Studio 2005
  4. 几种常见机器学习距离公式
  5. fvcore CfgNode
  6. 第四季-专题8-LINUX系统调用
  7. spring boot task实现动态创建定时任务
  8. [SDOI2011]染色 BZOJ2243 树链剖分+线段树
  9. 飘逸的辉耀,http://smileapple.jd-app.com/
  10. JDBC连接Oracle数据库时出现的ORA-12505错误及解决办法.