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

42次阅读

共计 4250 个字符,预计需要花费 11 分钟才能阅读完成。

原文链接: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)。

有问题欢送下方留言!

正文完
 0