中央値絶対偏差の集約

この single-value 集約は、検索結果の 中央値絶対偏差 を近似します。

中央値絶対偏差は、変動性の尺度です。これはロバストな統計量であり、外れ値を含む可能性のあるデータや、正規分布していないデータを記述するのに役立ちます。このようなデータに対しては、標準偏差よりも説明的であることがあります。

これは、全サンプルの中央値から各データポイントの偏差の中央値として計算されます。すなわち、ランダム変数 X に対して、中央値絶対偏差は median(|median(X) - X\u003csub

私たちのデータが1から5の星のスケールでの製品レビューを表していると仮定します。このようなレビューは通常、平均として要約されますが、理解しやすい一方で、レビューの変動性を説明するものではありません。中央値絶対偏差を推定することで、レビューがどれだけ異なるかを洞察することができます。

この例では、平均評価が3つ星の製品があります。その評価の中央値絶対偏差を見て、どれだけ異なるかを判断しましょう。

Python

  1. resp = client.search(
  2. index="reviews",
  3. size=0,
  4. aggs={
  5. "review_average": {
  6. "avg": {
  7. "field": "rating"
  8. }
  9. },
  10. "review_variability": {
  11. "median_absolute_deviation": {
  12. "field": "rating"
  13. }
  14. }
  15. },
  16. )
  17. print(resp)

Ruby

  1. response = client.search(
  2. index: 'reviews',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. review_average: {
  7. avg: {
  8. field: 'rating'
  9. }
  10. },
  11. review_variability: {
  12. median_absolute_deviation: {
  13. field: 'rating'
  14. }
  15. }
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.search({
  2. index: "reviews",
  3. size: 0,
  4. aggs: {
  5. review_average: {
  6. avg: {
  7. field: "rating",
  8. },
  9. },
  10. review_variability: {
  11. median_absolute_deviation: {
  12. field: "rating",
  13. },
  14. },
  15. },
  16. });
  17. console.log(response);

コンソール

  1. GET reviews/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "review_average": {
  6. "avg": {
  7. "field": "rating"
  8. }
  9. },
  10. "review_variability": {
  11. "median_absolute_deviation": {
  12. "field": "rating"
  13. }
  14. }
  15. }
  16. }
rating は数値フィールドでなければなりません

2 の結果として得られる中央値絶対偏差は、評価にかなりの変動性があることを示しています。レビュアーはこの製品について多様な意見を持っているに違いありません。

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "review_average": {
  5. "value": 3.0
  6. },
  7. "review_variability": {
  8. "value": 2.0
  9. }
  10. }
  11. }

近似

中央値絶対偏差を計算するための単純な実装は、全サンプルをメモリに保存しますが、この集約は代わりに近似を計算します。これは、TDigestデータ構造 を使用して、サンプルの中央値とサンプル中央値からの偏差の中央値を近似します。TDigestの近似特性についての詳細は、パーセンタイルは(通常)近似ですを参照してください。

TDigestの分位数近似のリソース使用と精度のトレードオフ、したがってこの集約の中央値絶対偏差の近似の精度は、compression パラメータによって制御されます。compression の設定を高くすると、メモリ使用量が増加する代わりに、より正確な近似が得られます。TDigestの compression パラメータの特性についての詳細は、圧縮を参照してください。

Python

  1. resp = client.search(
  2. index="reviews",
  3. size=0,
  4. aggs={
  5. "review_variability": {
  6. "median_absolute_deviation": {
  7. "field": "rating",
  8. "compression": 100
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. index: 'reviews',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. review_variability: {
  7. median_absolute_deviation: {
  8. field: 'rating',
  9. compression: 100
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. index: "reviews",
  3. size: 0,
  4. aggs: {
  5. review_variability: {
  6. median_absolute_deviation: {
  7. field: "rating",
  8. compression: 100,
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. GET reviews/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "review_variability": {
  6. "median_absolute_deviation": {
  7. "field": "rating",
  8. "compression": 100
  9. }
  10. }
  11. }
  12. }

この集約のデフォルトの compression 値は 1000 です。この圧縮レベルでは、この集約は通常、正確な結果の5%以内ですが、観察されたパフォーマンスはサンプルデータに依存します。

スクリプト

上記の例では、製品レビューは1から5のスケールです。これを1から10のスケールに変更したい場合は、ランタイムフィールドを使用してください。

Python

  1. resp = client.search(
  2. index="reviews",
  3. filter_path="aggregations",
  4. size=0,
  5. runtime_mappings={
  6. "rating.out_of_ten": {
  7. "type": "long",
  8. "script": {
  9. "source": "emit(doc['rating'].value * params.scaleFactor)",
  10. "params": {
  11. "scaleFactor": 2
  12. }
  13. }
  14. }
  15. },
  16. aggs={
  17. "review_average": {
  18. "avg": {
  19. "field": "rating.out_of_ten"
  20. }
  21. },
  22. "review_variability": {
  23. "median_absolute_deviation": {
  24. "field": "rating.out_of_ten"
  25. }
  26. }
  27. },
  28. )
  29. print(resp)

Ruby

  1. response = client.search(
  2. index: 'reviews',
  3. filter_path: 'aggregations',
  4. body: {
  5. size: 0,
  6. runtime_mappings: {
  7. 'rating.out_of_ten' => {
  8. type: 'long',
  9. script: {
  10. source: "emit(doc['rating'].value * params.scaleFactor)",
  11. params: {
  12. "scaleFactor": 2
  13. }
  14. }
  15. }
  16. },
  17. aggregations: {
  18. review_average: {
  19. avg: {
  20. field: 'rating.out_of_ten'
  21. }
  22. },
  23. review_variability: {
  24. median_absolute_deviation: {
  25. field: 'rating.out_of_ten'
  26. }
  27. }
  28. }
  29. }
  30. )
  31. puts response

Js

  1. const response = await client.search({
  2. index: "reviews",
  3. filter_path: "aggregations",
  4. size: 0,
  5. runtime_mappings: {
  6. "rating.out_of_ten": {
  7. type: "long",
  8. script: {
  9. source: "emit(doc['rating'].value * params.scaleFactor)",
  10. params: {
  11. scaleFactor: 2,
  12. },
  13. },
  14. },
  15. },
  16. aggs: {
  17. review_average: {
  18. avg: {
  19. field: "rating.out_of_ten",
  20. },
  21. },
  22. review_variability: {
  23. median_absolute_deviation: {
  24. field: "rating.out_of_ten",
  25. },
  26. },
  27. },
  28. });
  29. console.log(response);

コンソール

  1. GET reviews/_search?filter_path=aggregations
  2. {
  3. "size": 0,
  4. "runtime_mappings": {
  5. "rating.out_of_ten": {
  6. "type": "long",
  7. "script": {
  8. "source": "emit(doc['rating'].value * params.scaleFactor)",
  9. "params": {
  10. "scaleFactor": 2
  11. }
  12. }
  13. }
  14. },
  15. "aggs": {
  16. "review_average": {
  17. "avg": {
  18. "field": "rating.out_of_ten"
  19. }
  20. },
  21. "review_variability": {
  22. "median_absolute_deviation": {
  23. "field": "rating.out_of_ten"
  24. }
  25. }
  26. }
  27. }

結果は次のようになります:

コンソール-結果

  1. {
  2. "aggregations": {
  3. "review_average": {
  4. "value": 6.0
  5. },
  6. "review_variability": {
  7. "value": 4.0
  8. }
  9. }
  10. }

欠損値

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

楽観的に考えて、いくつかのレビュアーがこの製品をとても気に入って、評価を忘れたと仮定しましょう。彼らには5つ星を与えましょう。

Python

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

Ruby

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

Js

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

コンソール

  1. GET reviews/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "review_variability": {
  6. "median_absolute_deviation": {
  7. "field": "rating",
  8. "missing": 5
  9. }
  10. }
  11. }
  12. }