如何获得忽略异常值的平均值?

mil*_*den 1 postgresql statistics aggregate

说我有一个postgresql表,其中包含以下值:

id | value
----------
1  | 4
2  | 8
3  | 100
4  | 5
5  | 7
Run Code Online (Sandbox Code Playgroud)

如果我使用postgresql来计算平均值,它给我的平均值为24.8,因为100的高值对计算有很大的影响.事实上,我想在6左右找到一个平均值,并消除极端情况.

我正在寻找消除极端的方法,并希望这样做"统计上正确".极端无法修复.我不能说; 如果值超过X,则必须将其消除.

我一直在弯曲我的postgresql聚合函数,但不能把我的手指放在我正确使用的东西上.有什么建议?

Pet*_*ans 10

Postgresql也可以计算标准差.

您只能获取平均值()+/- 2*stddev()中的数据点,这些数据点大致对应于最接近平均值的90%数据点.

当然2也可以是3(95%)或6(99.995%)但不要挂在数字上,因为在收集异常值存在的情况下,你不再处理正态分布.

要非常小心并验证它是否按预期工作.


小智 6

我不能说; 如果值超过X,则必须将其消除.

好吧,你可以使用having和subselect来消除异常值,例如:

HAVING value < (
 SELECT 2 * avg(value)
 FROM   mytable
 GROUP BY ...
)
Run Code Online (Sandbox Code Playgroud)

(或者,就此而言,如果您想要更好地消除异常值,可以使用更复杂的版本来消除超过2或3个标准偏差的任何内容.)

另一种选择是考虑生成一个中值,这是一种相当统计上合理的异常值计算方法; 幸运的是,有三个合理的例子:一个来自Postgresql Wiki,一个是作为Oracle兼容性层构建的,另一个来自PostgreSQL Journal.请注意它们如何精确/准确地实现中位数的警告.