关于序列异常点监控的那些事
之前写过一篇如何使用R语言解决可恶的脏数据(点击查看),文中讲到如何识别离群点及这样的数据该如何处理。本文继续讲一讲异常点的那些事,只不过本文的异常点将考虑时间因素,即有序数据异常点监测。
异常点监控的前提条件是:指标无明显趋势,且不会经常发生大幅度的波动,可以认为指标值是服从正态分布的。
监控异常点,首先需要明白什么样的点才能算是异常点,我们来看看关于正态分布的第n倍sigma图:
一般比较常用的就是这3类sigama,根据行业的不同,对产品质量监控严格度会有所不同,有看到使用6sigma的质量控制。质量控制图一般以下图的形式展现,CL为中心线;UCL为上限;LCL为下限:
1)UCL和LCL之间的点属于正常点,而之外的点就归为异常点
2)如果近3个点中有2个高于2倍标准差下的UCL或低于2倍标准差下的LCL;或近5个点中有4个高于单倍标准差下的UCL或低于单倍标准差下的LCL,则说明该指标出现异常趋势
3)如果连续8个点均高于或低于中心线,则称其为有偏向性
4)如果连续6个点呈上升或下载趋势,则称其有明显的偏向趋势
5)如果连续14个点在中心线的上下交替出现,则认为其有周期性或不稳定性。
这里介绍几种常用的控制图,即P控制图、单值-均值控制图和均值控制图。有关控制图的绘制可使用qcc包中的qcc()函数,下面我们就来介绍这几种控制图。
一、P控制图
原理:根据中心极限定理,当样本量足够大时,二项分布服从均值为p_bar=mean(p), 标准差为sqrt(p_bar*(1-p_bar)/n)的正态分布。什么时候需要用到P控制图呢?当你需要求解某个比例时,如成功率;达成率;响应率等,就需要用到这里的P控制图了。我们举个简单的例子来说明一下:
上图是计算P控制图中CL、UCL和LCL值的公式。
```{r}
#网页浏览人数
views <- c(10231,12874,11229,9870,11804,11652,13259,11891,12876,14562,12933,13548,15230,13815,15766)
#注册人数
register <- c(201,229,231,201,237,224,236,167,213,240,259,241,256,276,248)
#绘制P控制图
library(qcc)
res <- qcc(data = register, sizes = views, type = 'p')
```
上图很明显反馈了第8个点为红色点,表面该点低于默认的3倍标准差下的LCL,为一个异常点。而且你会发现,LCL和UCL是两条折线,而非直线,那是因为每天的网页浏览量不一致,即可以认为每次试验中,样本量是可变的,这就导致下图中LCL和UCL值随nk的变换而变换。如果想绘制2倍标准差下的LCL和UCL线,只需将qcc()函数中的参数nsigmas设置为2,如图所示:
```{r}
res2 <- qcc(data = register, sizes = views, type = 'p', nsigmas = 2)
```
这样你就会发现有两个点成为了异常点,即第8个点和第15个点。
二、单值-均值控制图
如果需要监控的对象是一维序列值,这个时候就需要绘制单值-均值控制图了,有关该控制图的原理见下图:
与P控制图不同的是,3倍标准差采用了3*(平均移动极差/1.128),下面就以某门店的月度客单价为例,说说单值-均值控制图:
```{r}
ATV <- c(234,278,253,245,302,228,256,272,300,286,242,222)
res <- qcc(data = ATV, type = 'xbar.one', nsigmas = 2)
```
上图中显示,在2倍标准差内,没有出现异常值,即认为这12个月内的门店客单价比较稳定。而且图中还详细列出了中心线CL、上限UCL、下限LCL和标准差的值。
三、均值控制图
均值控制图与单值-均值控制图基本类似,所不同的是,单值-均值控制图可以理解为每次试验只有1个样本点,而均值控制图可以是多个样本点。具体原理可见下图:
对于每组样本量相同的情况,可以将数据集存储为k行n列,直接使用qcc()函数实现均值控制图的绘制,具体如下:
```{r}
set.seed(1234)
df <- data.frame(x1 = rnorm(25,2,3), x2 = rnorm(25,2,4), x3 = rnorm(25,3,2))
res <- qcc(data = df, type = 'xbar')
```
如果每组样本量不等时,就不能直接使用qcc绘制均值控制图了,而需求对原数据做变换,通过计算每组均值,使得一组一值,从而回到绘制单值-均值控制图中。具体案例如下:
```{r}
#近一个月每日用户客单价监控
set.seed(1234)
Feb <- paste('2.',1:29,sep = '')
date <- rep(Feb, round(runif(29, 100,200)))
ATV <- round(rnorm(length(date), mean = 222, sd = 10))
df <- data.frame(date = date, ATV = ATV)
#对每天数据计算平均客单价
library(dplyr)
group_by_date <- group_by(.data = df, date)
summarise_df <- summarise(.data = group_by_date, mean(ATV))
head(summarise_df)
res <- qcc(data = summarise_df[,2], type = 'xbar.one')
```
上面介绍了比较常用的异常点的监控图,这里需要再次说明的是,监控图不适合非正态分布的数据,如果你的数据存在明显偏态或非正态分布,建议使用《如何使用R语言解决可恶的脏数据》一文的异常点检验方法。
参考资料
《R语言与网站分析》
每天进步一点点2015
学习与分享,取长补短,关注小号!
长按识别二维码à马上关注