Bucket count KS test correlation aggregation
editBucket count KS test correlation aggregation
editA sibling pipeline aggregation which executes a two sample Kolmogorov–Smirnov test (referred to as a "KS test" from now on) against a provided distribution, and the distribution implied by the documents counts in the configured sibling aggregation. Specifically, for some metric, assuming that the percentile intervals of the metric are known beforehand or have been computed by an aggregation, then one would use range aggregation for the sibling to compute the pvalue of the distribution difference between the metric and the restriction of that metric to a subset of the documents. A natural use case is if the sibling aggregation range aggregation nested in a terms aggregation, in which case one compares the overall distribution of metric to its restriction to each term.
Parameters
edit
buckets_path

(Required, string)
Path to the buckets that contain one set of values to correlate. Must be a
_count
path For syntax, seebuckets_path
Syntax. 
alternative
 (Optional, list) A list of string values indicating which KS test alternative to calculate. The valid values are: "greater", "less", "two_sided". This parameter is key for determining the KS statistic used when calculating the KS test. Default value is all possible alternative hypotheses.

fractions

(Optional, list)
A list of doubles indicating the distribution of the samples with which to compare to the
buckets_path
results. In typical usage this is the overall proportion of documents in each bucket, which is compared with the actual document proportions in each bucket from the sibling aggregation counts. The default is to assume that overall documents are uniformly distributed on these buckets, which they would be if one used equal percentiles of a metric to define the bucket end points. 
sampling_method

(Optional, string)
Indicates the sampling methodology when calculating the KS test. Note, this is sampling
of the returned values. This determines the cumulative distribution function (CDF) points
used comparing the two samples. Default is
upper_tail
, which emphasizes the upper end of the CDF points. Valid options are:upper_tail
,uniform
, andlower_tail
.
Syntax
editA bucket_count_ks_test
aggregation looks like this in isolation:
Example
editThe following snippet runs the bucket_count_ks_test
on the individual terms in the field version
against a uniform distribution.
The uniform distribution reflects the latency
percentile buckets. Not shown is the precalculation of the latency
indicator values,
which was done utilizing the
percentiles aggregation.
This example is only using the deciles of latency
.
POST correlate_latency/_search?size=0&filter_path=aggregations { "aggs": { "buckets": { "terms": { "field": "version", "size": 2 }, "aggs": { "latency_ranges": { "range": { "field": "latency", "ranges": [ { "to": 0 }, { "from": 0, "to": 105 }, { "from": 105, "to": 225 }, { "from": 225, "to": 445 }, { "from": 445, "to": 665 }, { "from": 665, "to": 885 }, { "from": 885, "to": 1115 }, { "from": 1115, "to": 1335 }, { "from": 1335, "to": 1555 }, { "from": 1555, "to": 1775 }, { "from": 1775 } ] } }, "ks_test": { "bucket_count_ks_test": { "buckets_path": "latency_ranges>_count", "alternative": ["less", "greater", "two_sided"] } } } } } }
The term buckets containing a range aggregation and the bucket correlation aggregation. Both are utilized to calculate the correlation of the term values with the latency. 

The range aggregation on the latency field. The ranges were created referencing the percentiles of the latency field. 

The bucket count KS test aggregation that tests if the bucket counts comes from the same distribution as 
And the following may be the response:
{ "aggregations" : { "buckets" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "1.0", "doc_count" : 100, "latency_ranges" : { "buckets" : [ { "key" : "*0.0", "to" : 0.0, "doc_count" : 0 }, { "key" : "0.0105.0", "from" : 0.0, "to" : 105.0, "doc_count" : 1 }, { "key" : "105.0225.0", "from" : 105.0, "to" : 225.0, "doc_count" : 9 }, { "key" : "225.0445.0", "from" : 225.0, "to" : 445.0, "doc_count" : 0 }, { "key" : "445.0665.0", "from" : 445.0, "to" : 665.0, "doc_count" : 0 }, { "key" : "665.0885.0", "from" : 665.0, "to" : 885.0, "doc_count" : 0 }, { "key" : "885.01115.0", "from" : 885.0, "to" : 1115.0, "doc_count" : 10 }, { "key" : "1115.01335.0", "from" : 1115.0, "to" : 1335.0, "doc_count" : 20 }, { "key" : "1335.01555.0", "from" : 1335.0, "to" : 1555.0, "doc_count" : 20 }, { "key" : "1555.01775.0", "from" : 1555.0, "to" : 1775.0, "doc_count" : 20 }, { "key" : "1775.0*", "from" : 1775.0, "doc_count" : 20 } ] }, "ks_test" : { "less" : 2.248673241788478E4, "greater" : 1.0, "two_sided" : 5.791639181800257E4 } }, { "key" : "2.0", "doc_count" : 100, "latency_ranges" : { "buckets" : [ { "key" : "*0.0", "to" : 0.0, "doc_count" : 0 }, { "key" : "0.0105.0", "from" : 0.0, "to" : 105.0, "doc_count" : 19 }, { "key" : "105.0225.0", "from" : 105.0, "to" : 225.0, "doc_count" : 11 }, { "key" : "225.0445.0", "from" : 225.0, "to" : 445.0, "doc_count" : 20 }, { "key" : "445.0665.0", "from" : 445.0, "to" : 665.0, "doc_count" : 20 }, { "key" : "665.0885.0", "from" : 665.0, "to" : 885.0, "doc_count" : 20 }, { "key" : "885.01115.0", "from" : 885.0, "to" : 1115.0, "doc_count" : 10 }, { "key" : "1115.01335.0", "from" : 1115.0, "to" : 1335.0, "doc_count" : 0 }, { "key" : "1335.01555.0", "from" : 1335.0, "to" : 1555.0, "doc_count" : 0 }, { "key" : "1555.01775.0", "from" : 1555.0, "to" : 1775.0, "doc_count" : 0 }, { "key" : "1775.0*", "from" : 1775.0, "doc_count" : 0 } ] }, "ks_test" : { "less" : 0.9642895789647244, "greater" : 4.58718174664754E9, "two_sided" : 5.916656831139733E9 } } ] } } }