Агрегация медианного абсолютного отклонения
Эта single-value агрегация приближённо вычисляет медиану абсолютных отклонений результатов поиска.
Медиана абсолютных отклонений — это мера вариации. Это устойчивая статистика, что означает, что она полезна для описания данных, которые могут содержать выбросы или не подчиняться нормальному распределению. Для таких данных она может быть более информативной, чем стандартное отклонение.
Она вычисляется как медиана отклонений каждого значения данных от медианы всего набора данных. То есть для случайной величины X медиана абсолютных отклонений равна median(|median(X) - Xi|).
Пример
Предположим, что наши данные представляют отзывы о продукте по шкале от одного до пяти звезд. Такие отзывы обычно суммируются с помощью среднего значения, что легко понять, но не описывает вариацию отзывов. Оценка медианного абсолютного отклонения может пролить свет на то, насколько отзывы различаются друг от друга.
В этом примере у нас есть продукт со средней оценкой 3 звезды. Давайте посмотрим на медианное абсолютное отклонение оценок, чтобы определить, насколько они различаются.
resp = client.search(
index="reviews",
size=0,
aggs={
"review_average": {
"avg": {
"field": "rating"
}
},
"review_variability": {
"median_absolute_deviation": {
"field": "rating"
}
}
},
)
print(resp) response = client.search(
index: 'reviews',
body: {
size: 0,
aggregations: {
review_average: {
avg: {
field: 'rating'
}
},
review_variability: {
median_absolute_deviation: {
field: 'rating'
}
}
}
}
)
puts response const response = await client.search({
index: "reviews",
size: 0,
aggs: {
review_average: {
avg: {
field: "rating",
},
},
review_variability: {
median_absolute_deviation: {
field: "rating",
},
},
},
});
console.log(response); GET reviews/_search
{
"size": 0,
"aggs": {
"review_average": {
"avg": {
"field": "rating"
}
},
"review_variability": {
"median_absolute_deviation": {
"field": "rating"
}
}
}
} |
|
Полученное медианное абсолютное отклонение 2 показывает, что в оценках есть значительная вариативность. Отзывы пользователей об этом продукте разнятся.
{
...
"aggregations": {
"review_average": {
"value": 3.0
},
"review_variability": {
"value": 2.0
}
}
} Приближение
Прямая реализация расчета медианы абсолютных отклонений хранит весь образец в памяти, поэтому эта агрегация вместо этого выполняет приближенное вычисление. Она использует структуру данных TDigest для приближённого вычисления медианы выборки и медианы отклонений от медианы выборки. Подробнее о характеристиках приближения TDigest см. в разделе Процентили (как правило) приблизительны.
Компромисс между использованием ресурсов и точностью приближения квантиля TDigest, а следовательно, и точностью приближения медианы абсолютных отклонений в этой агрегации, регулируется параметром compression. Более высокое значение compression обеспечивает более точное приближение за счёт большего использования памяти. Подробнее о характеристиках параметра TDigest compression см. в разделе Сжатие.
resp = client.search(
index="reviews",
size=0,
aggs={
"review_variability": {
"median_absolute_deviation": {
"field": "rating",
"compression": 100
}
}
},
)
print(resp) response = client.search(
index: 'reviews',
body: {
size: 0,
aggregations: {
review_variability: {
median_absolute_deviation: {
field: 'rating',
compression: 100
}
}
}
}
)
puts response const response = await client.search({
index: "reviews",
size: 0,
aggs: {
review_variability: {
median_absolute_deviation: {
field: "rating",
compression: 100,
},
},
},
});
console.log(response); GET reviews/_search
{
"size": 0,
"aggs": {
"review_variability": {
"median_absolute_deviation": {
"field": "rating",
"compression": 100
}
}
}
} Значение по умолчанию для параметра compression этой агрегации равно 1000. При этом уровне сжатия эта агрегация обычно отличается от точного результата не более чем на 5%, но наблюдаемая производительность зависит от данных выборки.
Скрипт
В примере выше отзывы о продуктах находятся в диапазоне от одного до пяти. Если вы хотите изменить их на диапазон от одного до десяти, воспользуйтесь полем runtime.
resp = client.search(
index="reviews",
filter_path="aggregations",
size=0,
runtime_mappings={
"rating.out_of_ten": {
"type": "long",
"script": {
"source": "emit(doc['rating'].value * params.scaleFactor)",
"params": {
"scaleFactor": 2
}
}
}
},
aggs={
"review_average": {
"avg": {
"field": "rating.out_of_ten"
}
},
"review_variability": {
"median_absolute_deviation": {
"field": "rating.out_of_ten"
}
}
},
)
print(resp) response = client.search(
index: 'reviews',
filter_path: 'aggregations',
body: {
size: 0,
runtime_mappings: {
'rating.out_of_ten' => {
type: 'long',
script: {
source: "emit(doc['rating'].value * params.scaleFactor)",
params: {
"scaleFactor": 2
}
}
}
},
aggregations: {
review_average: {
avg: {
field: 'rating.out_of_ten'
}
},
review_variability: {
median_absolute_deviation: {
field: 'rating.out_of_ten'
}
}
}
}
)
puts response const response = await client.search({
index: "reviews",
filter_path: "aggregations",
size: 0,
runtime_mappings: {
"rating.out_of_ten": {
type: "long",
script: {
source: "emit(doc['rating'].value * params.scaleFactor)",
params: {
scaleFactor: 2,
},
},
},
},
aggs: {
review_average: {
avg: {
field: "rating.out_of_ten",
},
},
review_variability: {
median_absolute_deviation: {
field: "rating.out_of_ten",
},
},
},
});
console.log(response); GET reviews/_search?filter_path=aggregations
{
"size": 0,
"runtime_mappings": {
"rating.out_of_ten": {
"type": "long",
"script": {
"source": "emit(doc['rating'].value * params.scaleFactor)",
"params": {
"scaleFactor": 2
}
}
}
},
"aggs": {
"review_average": {
"avg": {
"field": "rating.out_of_ten"
}
},
"review_variability": {
"median_absolute_deviation": {
"field": "rating.out_of_ten"
}
}
}
} Что приведёт к:
{
"aggregations": {
"review_average": {
"value": 6.0
},
"review_variability": {
"value": 4.0
}
}
} Пропущенное значение
Параметр missing определяет, как обрабатывать документы, у которых отсутствует значение. По умолчанию они игнорируются, но также можно обработать их как если бы у них было значение.
Давайте предположим, что некоторые пользователи так сильно полюбили продукт, что забыли оценить его. Мы присвоим им оценку пять звезд.
resp = client.search(
index="reviews",
size=0,
aggs={
"review_variability": {
"median_absolute_deviation": {
"field": "rating",
"missing": 5
}
}
},
)
print(resp) response = client.search(
index: 'reviews',
body: {
size: 0,
aggregations: {
review_variability: {
median_absolute_deviation: {
field: 'rating',
missing: 5
}
}
}
}
)
puts response const response = await client.search({
index: "reviews",
size: 0,
aggs: {
review_variability: {
median_absolute_deviation: {
field: "rating",
missing: 5,
},
},
},
});
console.log(response); GET reviews/_search
{
"size": 0,
"aggs": {
"review_variability": {
"median_absolute_deviation": {
"field": "rating",
"missing": 5
}
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/search-aggregations-metrics-median-absolute-deviation-aggregation.html