拡張統計集約
集約された文書から抽出された数値に対して統計を計算する multi-value
メトリクス集約です。
extended_stats
集約は、追加のメトリクス(sum_of_squares
、variance
、std_deviation
、std_deviation_bounds
など)が追加された stats
集約の拡張版です。
データが学生の試験成績(0から100の間)を表す文書で構成されていると仮定します。
Python
resp = client.search(
index="exams",
size=0,
aggs={
"grades_stats": {
"extended_stats": {
"field": "grade"
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'exams',
body: {
size: 0,
aggregations: {
grades_stats: {
extended_stats: {
field: 'grade'
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "exams",
size: 0,
aggs: {
grades_stats: {
extended_stats: {
field: "grade",
},
},
},
});
console.log(response);
コンソール
GET /exams/_search
{
"size": 0,
"aggs": {
"grades_stats": { "extended_stats": { "field": "grade" } }
}
}
上記の集約は、すべての文書に対する成績統計を計算します。集約タイプは extended_stats
で、field
設定は統計が計算される文書の数値フィールドを定義します。上記は次のように返されます:
std_deviation
と variance
は母集団メトリクスとして計算されるため、それぞれ std_deviation_population
と variance_population
と常に同じです。
コンソール-結果
{
...
"aggregations": {
"grades_stats": {
"count": 2,
"min": 50.0,
"max": 100.0,
"avg": 75.0,
"sum": 150.0,
"sum_of_squares": 12500.0,
"variance": 625.0,
"variance_population": 625.0,
"variance_sampling": 1250.0,
"std_deviation": 25.0,
"std_deviation_population": 25.0,
"std_deviation_sampling": 35.35533905932738,
"std_deviation_bounds": {
"upper": 125.0,
"lower": 25.0,
"upper_population": 125.0,
"lower_population": 25.0,
"upper_sampling": 145.71067811865476,
"lower_sampling": 4.289321881345245
}
}
}
}
集約の名前(上記の grades_stats
)は、返されたレスポンスから集約結果を取得するためのキーとしても機能します。
標準偏差の境界
デフォルトでは、extended_stats
メトリクスは std_deviation_bounds
と呼ばれるオブジェクトを返し、平均からプラス/マイナス2標準偏差の範囲を提供します。これはデータの分散を視覚化するのに役立つ方法です。異なる境界、たとえば3標準偏差が必要な場合は、リクエストで sigma
を設定できます:
Python
resp = client.search(
index="exams",
size=0,
aggs={
"grades_stats": {
"extended_stats": {
"field": "grade",
"sigma": 3
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'exams',
body: {
size: 0,
aggregations: {
grades_stats: {
extended_stats: {
field: 'grade',
sigma: 3
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "exams",
size: 0,
aggs: {
grades_stats: {
extended_stats: {
field: "grade",
sigma: 3,
},
},
},
});
console.log(response);
コンソール
GET /exams/_search
{
"size": 0,
"aggs": {
"grades_stats": {
"extended_stats": {
"field": "grade",
"sigma": 3
}
}
}
}
sigma は平均から表示される標準偏差の数を制御します |
sigma
は任意の非負の倍精度であり、1.5
のような非整数値を要求できます。0
の値は有効ですが、upper
と lower
の境界の平均を返すだけです。
upper
と lower
の境界は母集団メトリクスとして計算されるため、それぞれ upper_population
と lower_population
と常に同じです。
標準偏差と境界は正規性を必要とする
標準偏差とその境界はデフォルトで表示されますが、すべてのデータセットに適用できるわけではありません。メトリクスが意味を持つためには、データが正規分布している必要があります。標準偏差の背後にある統計は正規分布データを前提としているため、データが大きく左または右に偏っている場合、返される値は誤解を招く可能性があります。
スクリプト
インデックスされていない値で集約する必要がある場合は、ランタイムフィールドを使用してください。たとえば、私たちが扱っていた成績が学生のレベルを超えた試験のものであり、これを「修正」したいとします:
Python
resp = client.search(
index="exams",
size=0,
runtime_mappings={
"grade.corrected": {
"type": "double",
"script": {
"source": "emit(Math.min(100, doc['grade'].value * params.correction))",
"params": {
"correction": 1.2
}
}
}
},
aggs={
"grades_stats": {
"extended_stats": {
"field": "grade.corrected"
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'exams',
body: {
size: 0,
runtime_mappings: {
'grade.corrected' => {
type: 'double',
script: {
source: "emit(Math.min(100, doc['grade'].value * params.correction))",
params: {
correction: 1.2
}
}
}
},
aggregations: {
grades_stats: {
extended_stats: {
field: 'grade.corrected'
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "exams",
size: 0,
runtime_mappings: {
"grade.corrected": {
type: "double",
script: {
source: "emit(Math.min(100, doc['grade'].value * params.correction))",
params: {
correction: 1.2,
},
},
},
},
aggs: {
grades_stats: {
extended_stats: {
field: "grade.corrected",
},
},
},
});
console.log(response);
コンソール
GET /exams/_search
{
"size": 0,
"runtime_mappings": {
"grade.corrected": {
"type": "double",
"script": {
"source": "emit(Math.min(100, doc['grade'].value * params.correction))",
"params": {
"correction": 1.2
}
}
}
},
"aggs": {
"grades_stats": {
"extended_stats": { "field": "grade.corrected" }
}
}
}
欠損値
missing
パラメータは、値が欠けている文書がどのように扱われるべきかを定義します。デフォルトでは無視されますが、値があるかのように扱うことも可能です。
Python
resp = client.search(
index="exams",
size=0,
aggs={
"grades_stats": {
"extended_stats": {
"field": "grade",
"missing": 0
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'exams',
body: {
size: 0,
aggregations: {
grades_stats: {
extended_stats: {
field: 'grade',
missing: 0
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "exams",
size: 0,
aggs: {
grades_stats: {
extended_stats: {
field: "grade",
missing: 0,
},
},
},
});
console.log(response);
コンソール
GET /exams/_search
{
"size": 0,
"aggs": {
"grades_stats": {
"extended_stats": {
"field": "grade",
"missing": 0
}
}
}
}
grade フィールドに値がない文書は、値が 0 の文書と同じバケットに入ります。 |