【问题标题】:How to remove outliers from an ActiveRecord Query in Rails如何从 Rails 中的 ActiveRecord 查询中删除异常值
【发布时间】:2012-09-18 11:45:41
【问题描述】:

好的,所以场景是这样的:

我问一个问题“你每周在食物上花多少钱?”

在指定数量的贡献后,假设 100 我想扫描结果,并发现明显的虚假结果。假设平均值为 80 英镑,但有些人投入了 1,而其他人投入了 10,000。

要求是不对输入的数据进行验证,而是动态分析数据并确定数据的有效范围,在数据库统计更新期间从结果中剔除异常值。

使用 Rails 3.2、ActiveRecord 和 Postgresql 实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails database postgresql statistics outliers


    【解决方案1】:

    消除错误结果的一个好方法是计算出standard deviation。您可以使用 posttgres 执行此操作:

    SELECT stddev(amount) FROM answers
    

    然后您可以查看答案是否超出此范围,并在需要时删除。

    请注意,这总是会删除一些答案,所以如果您不希望有任何问题,请不要这样做。

    【讨论】:

    • 如果您将异常值定义为两个或三个标准差,那么它可能不会删除任何内容,具体取决于分布的形状。见en.wikipedia.org/wiki/Outlier
    • 我选择了标准差方法,是的,它确实消除了一些极端值,但留下了一些我仍然会认为是异常值的值,即使是 1 倍标准差。我对照 excel 仔细检查了公式,以确保我没有把它搞砸;)正如你提到的(Craig),我认为这里的问题是分布的形状。
    【解决方案2】:

    假设平均值为 80 英镑,但一些 numty 输入的值为 1 并且 其他人已经投入了 10,000 个。

    假设有人投入了 117 英镑。那是异常值吗? 127 英镑呢? 137 英镑?

    识别异常值是一项统计工作,而不是真正的数据库工作。只有当数据库返回所有相关数据时,您才能做好这项工作。如果您正在用 Ruby 编写统计软件,那么我会说这是 Ruby 的工作(Ruby 程序员的工作)来帮助您确定哪些值是异常值,哪些不是。

    确定哪些值是异常值后,可以很简单地从计算中消除它们,方法是运行时排除,或者使用amt_spent >= 53 and amt_spent <= 117 之类的范围再次运行查询。但请考虑更强大的统计技术,即不受异常值影响的技术。

    您也可以从数据库中删除这些行,但这可能会产生误导。我自己从不那样做。

    Detection of outliers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2017-08-07
      • 1970-01-01
      • 2017-10-26
      • 2013-05-07
      • 2011-06-14
      相关资源
      最近更新 更多