R:如何检测和修复情节上的异常值?

时间:2017-06-23 04:34:25

标签: r plot anomaly-detection

我尝试使用来自https://github.com/twitter/AnomalyDetection AnomalyDetectionTs()的{​​{1}} library(AnomalyDetection)https://www.r-bloggers.com/anomaly-detection-in-r/ 在我的数据上。在我的示例数据中,在绘图上有非常摆动的值而没有下降曲线(或像图案一样缓慢下降),而不是它的模式。这个功能对我不起作用。函数检测到的所有异常点都是正确值和正常值。

这是函数的结果:enter image description here

我的示例数据:https://raw.githubusercontent.com/ieatbaozi/R-Practicing/master/example.csv

df <- read.csv(url("https://raw.githubusercontent.com/ieatbaozi/R-Practicing/master/example.csv"),header = TRUE,stringsAsFactors = FALSE)
df$DateTime <- as.POSIXct(df$DateTime)

library(AnomalyDetection)
ADtest <- AnomalyDetectionTs(df, max_anoms=0.1, direction='both', plot=TRUE)
ADtest$plot

这是我的预期结果: enter image description here 如何检测那些异常数据?

如何通过填充最合适的值来修复这些值?将它们平滑以绘制靠近它们周围的图案,并且在修复这些值之后所有数据的总值仍然相同。

我的额外问题是:你有什么想法找到它的模式吗?我可以告诉你更多信息。非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

这是一个可能的解决方案。

  1. 计算每个点周围小窗口的平均值(滚动平均值)
  2. 计算实际值与本地平均值之间的差异。
  3. 计算步骤2中所有差异的标准差。
  4. 标记超出本地均值超过X标准偏差的那些点的异常值。
  5. 使用这种方法,我得到了你正在寻找的点,以及其他一些点 - 从极低值到极高值的过渡点。你或许可以过滤掉那些。

    <强>代码

    library(zoo)        ## For rolling mean function
    
    WindowSize = 5
    HalfWidth = (WindowSize-1)/2
    
    SD = sqrt(mean((rollmean(df$Val, WindowSize ) - 
        df$Val[-c(1:HalfWidth, (nrow(df)+1-(1:HalfWidth)))])^2))
    Out = which(abs(rollmean(df$Val, WindowSize ) - 
        df$Val[-c(1:HalfWidth, (nrow(df)+1-(1:HalfWidth)))]) > 2.95*SD) + 2
    
    plot(df, type="l")
    points(df[Out,], pch=16, col="red")
    

    Time series plot