统计删除错误值
我们有一个应用程序,用户可以全天输入价格。这些价格记录在带有时间戳的表格中,然后用于生成价格走势图表...用户有时会错误地输入价格(例如,输入零到多或者少)破坏图表(我们会得到大的尖峰)。如果价格波动超过20%,我们甚至会进行额外的确认对话,但这并不能阻止它们输入错误的值...
在将值绘制图表以排除与其余值完全不同的任何值之前,我可以使用哪种统计方法来分析这些值?
编辑:向骨骼添加一些肉。说价格是股票价格(虽然不是,但它们的行为方式相同)。我们可能会看到价格在一天中大幅上涨或者下跌。我们平均每天记录约150个价格,有时一两个错误。其他时候他们都很好...
解决方案
计算并跟踪标准偏差一段时间。积压得不错之后,可以通过查看离标准数有多少标准偏差来忽略异常值。更好的是,如果我们有时间,可以使用该信息进行一些朴素的贝叶斯分类。
我们可以测量现有总体中的标准差,并从均值中排除那些大于1或者2个标准差的标准差?
这将取决于数据是什么样,以给出更精确的答案...
或者绘制价格的移动平均值,而不是实际价格。
从这里引用:
统计人员设计了几种检测异常值的方法。所有方法都首先量化离群值与其他值的距离。这可以是所有点的离群值和均值之间的差,也可以是剩余值的离群值和均值之间的差,或者离群值和下一个最接近值之间的差。接下来,通过除以某种分散度量(例如所有值的SD,剩余值的SD或者数据范围)来标准化此值。最后,计算出一个回答以下问题的P值:如果所有值都是从高斯总体中真正采样得到的,那么从其他值中随机获得离群值的机会是多少?如果P值较小,则可以得出结论,离群值与其他值的偏差在统计上是显着的。
Google是朋友。 ;)
这是一个很好的问题,但可能会引起很多讨论,因为答案可能会很多种。这取决于
- 我们愿意为此付出多少努力?
- 某些答案的确能相差+/- 20%或者我们发明的任何测试吗?那么总会需要人工干预吗?
- 并且要发明相关的测试,我需要对主题有更多的了解。
话虽如此,以下是可能的替代方案。
- 对先前的值(或者先前的10或者20个值的均值/众数)进行简单的测试将很容易实现
- 下一级别的复杂性将涉及对所有值(或者先前的x值或者最近3个月的值)进行某种统计测量,正态分布或者高斯分布将使我们能够为每个值确定一定的错误度与准确。这种确定性通常以百分比表示。
请参阅http://en.wikipedia.org/wiki/Normal_distribution和http://en.wikipedia.org/wiki/Gaussian_function,这些页面上有足够的链接来进行编程,这也取决于我们使用的语言可能会有功能和/或者插件可以解决此问题
- 例如,一种更高级的方法可能是具有某种学习算法,该算法可以考虑其他参数(在最后的x值之上),而学习算法可以考虑产品类型或者制造商。甚至监视一天中的时间或者输入数字的用户。这个选项似乎超出了我们所需的顶部,但是,它需要大量的工作来对其进行编码以及训练学习算法。
我认为第二种选择是最适合选择。使用标准偏差(很多语言为此包含一个函数)可能是一个更简单的选择,这只是一种衡量值与x先前值的均值偏离程度的方法,我将标准偏差选项放在选项1和2
对于特定绘图问题,以及我们每天平均有1-2个错误(总共150个)中的特定情况,最简单的事情可能是绘制修整后的均值或者中间值的95%范围之类的东西。这实际上取决于我们希望从图中获得什么值。
如果我们确实关心一天价格的真实最大和真实值,则必须将异常值作为异常值处理,并适当地排除它们,可能使用先前建议的异常值测试之一(数据点比下一个多x%点,或者最后n个点,或者与每日平均值相差5个以上的标准差)。另一种方法是查看异常值之后发生的情况。如果它是一个离群值,那么它将急剧上升,然后急剧下降。
但是,如果我们关心总体趋势,则绘制每日修整后的均值,中位数,5%和95%百分数将很好地描绘历史。
选择显示方法,以及根据分析问题需要执行多少离群值检测。如果我们关心中位数或者百分位数,则它们可能无关紧要。