绝对中位差(median_absolute_deviation)聚合

这个single-value(单值) 聚合近似于其搜索结果的绝对中位差(median absolute deviation)

绝对中位差是一个可变性的衡量标准。 它是一个可靠的统计数据,这意味着它对于描述可能有异常值或可能不是正态分布的数据很有用。 对于这样的数据,它可能比标准差(standard deviation)更具描述性。

它被计算为每个数据点与整个样本的中位数的偏差的中位数。 也就是说,对于随机变量X,绝对中位差是 median(|median(X) - Xi|)。

示例

假设我们的数据代表 1 到 5 星的产品评论。 这样的评论通常被汇总为一个平均值,这很容易理解,但不能描述评论的可变性。 估算绝对中位差可以让我们了解到评论之间的差异有多大。

在本例中,我们有一个平均评级为3星的产品。 让我们看看它的评级的绝对中位差,以确定它们的变化程度

GET reviews/_search
{
  "size": 0,
  "aggs": {
    "review_average": {
      "avg": {
        "field": "rating"
      }
    },
    "review_variability": {
      "median_absolute_deviation": {
        "field": "rating" 
      }
    }
  }
}

rating 必须是一个 numeric 字段

由此产生的绝对中位差值 2 告诉我们,在评级中有相当多的可变性。 点评的人肯定对这个产品有不同的看法。

{
  ...
  "aggregations": {
    "review_average": {
      "value": 3.0
    },
    "review_variability": {
      "value": 2.0
    }
  }
}

近似值

计算绝对中位差的简单实现将整个样本存储在内存中,因此这种聚合计算的是近似值。 它使用 TDigest数据结构 来近似样本中值和样本中值偏差的中值。 有关 TDigests 的近似特征的更多信息,请参考 百分位数(通常)是近似的

参数 compression 控制着资源使用和 TDigest 分位数近似值的精确度之间的权衡,因此也控制着该聚合的绝对中位差近似值的精确度。 较高的 compression 设置以较高的内存使用率为代价提供了更精确的近似值。 有关 TDigest 参数 compression 的特征的更多信息,请参考compression

GET reviews/_search
{
  "size": 0,
  "aggs": {
    "review_variability": {
      "median_absolute_deviation": {
        "field": "rating",
        "compression": 100
      }
    }
  }
}

此聚合的默认 compression 的值是1000。 在这个压缩级别上,该聚合通常与确切结果的差距在 5% 以内,但观察到的性能将取决于样本数据。

脚本

该度量聚合支持脚本。 在上面的例子中,产品评论的等级是 1 到 5。 如果我们想将它们修改为 1 到 10,可以使用脚本。

如果要使用内联脚本:

GET reviews/_search
{
  "size": 0,
  "aggs": {
    "review_variability": {
      "median_absolute_deviation": {
        "script": {
          "lang": "painless",
          "source": "doc['rating'].value * params.scaleFactor",
          "params": {
            "scaleFactor": 2
          }
        }
      }
    }
  }
}

要指定一个存储的脚本:

GET reviews/_search
{
  "size": 0,
  "aggs": {
    "review_variability": {
      "median_absolute_deviation": {
        "script": {
          "id": "my_script",
          "params": {
            "field": "rating"
          }
        }
      }
    }
  }
}

缺失的值

参数 missing 定义应该如何处理有缺失值的文档。 默认情况下,它们将被忽略,但也可以将它们视为有一个值。

让我们乐观一点,假设一些点评的人非常喜欢这个产品,以至于忘记给它打分。我们会给他们 5 颗星:

GET reviews/_search
{
  "size": 0,
  "aggs": {
    "review_variability": {
      "median_absolute_deviation": {
        "field": "rating",
        "missing": 5
      }
    }
  }
}