拡張統計集約

集約された文書から抽出された数値に対して統計を計算する multi-value メトリクス集約です。

extended_stats 集約は、追加のメトリクス(sum_of_squaresvariancestd_deviationstd_deviation_bounds など)が追加された stats 集約の拡張版です。

データが学生の試験成績(0から100の間)を表す文書で構成されていると仮定します。

Python

  1. resp = client.search(
  2. index="exams",
  3. size=0,
  4. aggs={
  5. "grades_stats": {
  6. "extended_stats": {
  7. "field": "grade"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. index: 'exams',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. grades_stats: {
  7. extended_stats: {
  8. field: 'grade'
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. index: "exams",
  3. size: 0,
  4. aggs: {
  5. grades_stats: {
  6. extended_stats: {
  7. field: "grade",
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. GET /exams/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "grades_stats": { "extended_stats": { "field": "grade" } }
  6. }
  7. }

上記の集約は、すべての文書に対する成績統計を計算します。集約タイプは extended_stats で、field 設定は統計が計算される文書の数値フィールドを定義します。上記は次のように返されます:

std_deviationvariance は母集団メトリクスとして計算されるため、それぞれ std_deviation_populationvariance_population と常に同じです。

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "grades_stats": {
  5. "count": 2,
  6. "min": 50.0,
  7. "max": 100.0,
  8. "avg": 75.0,
  9. "sum": 150.0,
  10. "sum_of_squares": 12500.0,
  11. "variance": 625.0,
  12. "variance_population": 625.0,
  13. "variance_sampling": 1250.0,
  14. "std_deviation": 25.0,
  15. "std_deviation_population": 25.0,
  16. "std_deviation_sampling": 35.35533905932738,
  17. "std_deviation_bounds": {
  18. "upper": 125.0,
  19. "lower": 25.0,
  20. "upper_population": 125.0,
  21. "lower_population": 25.0,
  22. "upper_sampling": 145.71067811865476,
  23. "lower_sampling": 4.289321881345245
  24. }
  25. }
  26. }
  27. }

集約の名前(上記の grades_stats)は、返されたレスポンスから集約結果を取得するためのキーとしても機能します。

標準偏差の境界

デフォルトでは、extended_stats メトリクスは std_deviation_bounds と呼ばれるオブジェクトを返し、平均からプラス/マイナス2標準偏差の範囲を提供します。これはデータの分散を視覚化するのに役立つ方法です。異なる境界、たとえば3標準偏差が必要な場合は、リクエストで sigma を設定できます:

Python

  1. resp = client.search(
  2. index="exams",
  3. size=0,
  4. aggs={
  5. "grades_stats": {
  6. "extended_stats": {
  7. "field": "grade",
  8. "sigma": 3
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. index: 'exams',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. grades_stats: {
  7. extended_stats: {
  8. field: 'grade',
  9. sigma: 3
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. index: "exams",
  3. size: 0,
  4. aggs: {
  5. grades_stats: {
  6. extended_stats: {
  7. field: "grade",
  8. sigma: 3,
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. GET /exams/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "grades_stats": {
  6. "extended_stats": {
  7. "field": "grade",
  8. "sigma": 3
  9. }
  10. }
  11. }
  12. }
sigma は平均から表示される標準偏差の数を制御します

sigma は任意の非負の倍精度であり、1.5 のような非整数値を要求できます。0 の値は有効ですが、upperlower の境界の平均を返すだけです。

upperlower の境界は母集団メトリクスとして計算されるため、それぞれ upper_populationlower_population と常に同じです。

標準偏差と境界は正規性を必要とする

標準偏差とその境界はデフォルトで表示されますが、すべてのデータセットに適用できるわけではありません。メトリクスが意味を持つためには、データが正規分布している必要があります。標準偏差の背後にある統計は正規分布データを前提としているため、データが大きく左または右に偏っている場合、返される値は誤解を招く可能性があります。

スクリプト

インデックスされていない値で集約する必要がある場合は、ランタイムフィールドを使用してください。たとえば、私たちが扱っていた成績が学生のレベルを超えた試験のものであり、これを「修正」したいとします:

Python

  1. resp = client.search(
  2. index="exams",
  3. size=0,
  4. runtime_mappings={
  5. "grade.corrected": {
  6. "type": "double",
  7. "script": {
  8. "source": "emit(Math.min(100, doc['grade'].value * params.correction))",
  9. "params": {
  10. "correction": 1.2
  11. }
  12. }
  13. }
  14. },
  15. aggs={
  16. "grades_stats": {
  17. "extended_stats": {
  18. "field": "grade.corrected"
  19. }
  20. }
  21. },
  22. )
  23. print(resp)

Ruby

  1. response = client.search(
  2. index: 'exams',
  3. body: {
  4. size: 0,
  5. runtime_mappings: {
  6. 'grade.corrected' => {
  7. type: 'double',
  8. script: {
  9. source: "emit(Math.min(100, doc['grade'].value * params.correction))",
  10. params: {
  11. correction: 1.2
  12. }
  13. }
  14. }
  15. },
  16. aggregations: {
  17. grades_stats: {
  18. extended_stats: {
  19. field: 'grade.corrected'
  20. }
  21. }
  22. }
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.search({
  2. index: "exams",
  3. size: 0,
  4. runtime_mappings: {
  5. "grade.corrected": {
  6. type: "double",
  7. script: {
  8. source: "emit(Math.min(100, doc['grade'].value * params.correction))",
  9. params: {
  10. correction: 1.2,
  11. },
  12. },
  13. },
  14. },
  15. aggs: {
  16. grades_stats: {
  17. extended_stats: {
  18. field: "grade.corrected",
  19. },
  20. },
  21. },
  22. });
  23. console.log(response);

コンソール

  1. GET /exams/_search
  2. {
  3. "size": 0,
  4. "runtime_mappings": {
  5. "grade.corrected": {
  6. "type": "double",
  7. "script": {
  8. "source": "emit(Math.min(100, doc['grade'].value * params.correction))",
  9. "params": {
  10. "correction": 1.2
  11. }
  12. }
  13. }
  14. },
  15. "aggs": {
  16. "grades_stats": {
  17. "extended_stats": { "field": "grade.corrected" }
  18. }
  19. }
  20. }

欠損値

missing パラメータは、値が欠けている文書がどのように扱われるべきかを定義します。デフォルトでは無視されますが、値があるかのように扱うことも可能です。

Python

  1. resp = client.search(
  2. index="exams",
  3. size=0,
  4. aggs={
  5. "grades_stats": {
  6. "extended_stats": {
  7. "field": "grade",
  8. "missing": 0
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. index: 'exams',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. grades_stats: {
  7. extended_stats: {
  8. field: 'grade',
  9. missing: 0
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. index: "exams",
  3. size: 0,
  4. aggs: {
  5. grades_stats: {
  6. extended_stats: {
  7. field: "grade",
  8. missing: 0,
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. GET /exams/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "grades_stats": {
  6. "extended_stats": {
  7. "field": "grade",
  8. "missing": 0
  9. }
  10. }
  11. }
  12. }
grade フィールドに値がない文書は、値が 0 の文書と同じバケットに入ります。