iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 27
0
Elastic Stack on Cloud

Python&Elasticsearch 入門系列 第 27

IT鐵人第27天 Elasticsearch 使用python查詢資料 Aggregations:Percentiles/Percentile Ranks

今天的文章要講的是Percentiles(百分位數)跟Percentile Ranks(百分位數排名)
以下是這次的測試資料
https://ithelp.ithome.com.tw/upload/images/20201011/20129976e8aquufOiv.png

Percentiles

・這種聚合方式會回傳一個或多個百分位數,這些百分位數所代表的是一定百分比的觀察值出現的點,例如第95個百分位數是大於觀察值的95%的值。

・百分位數通常用於查找異常值。在正態分佈中,第0.13和第99.87個百分位數代表與平均值的三個標準差,任何超出三個標準偏差的數據通常被視為異常。

・預設會回傳[ 1, 5, 25, 50, 75, 95, 99 ]的百分位數。(第25、50、75位數就是第1四分位數、中位數、第3四分位數)

・回傳的數值是近似值

aggs query:

{
  "aggs": {
    "grades_outlier": {
      "percentiles": {
        "field": "grades.eng"
      }
    }
  }
}

結果:

"aggregations" : {
  "grades_outlier" : {
    "values" : {
      "1.0" : 43.0,
      "5.0" : 43.0,
      "25.0" : 69.0,
      "50.0" : 82.5,
      "75.0" : 98.0,
      "95.0" : 100.0,
      "99.0" : 100.0
    }
  }
}

也可以透過可變參數percents決定回傳的百分位數
aggs query:

{
  "aggs": {
    "grades_outlier": {
      "percentiles": {
        "field": "grades.eng",
        "percents": [0.13 ,90, 91, 92, 93, 93, 95, 99.5, 99.87]
      }
    }
  }
}

結果:

"aggregations" : {
  "grades_outlier" : {
    "values" : {
      "0.13" : 43.0,
      "90.0" : 99.8,
      "91.0" : 99.92,
      "92.0" : 100.0,
      "93.0" : 100.0,
      "93.0" : 100.0,
      "95.0" : 100.0,
      "99.5" : 100.0,
      "99.87" : 100.0
    }
  }
}

也可以使用腳本調整,調整的內容取決於使用者的目的,這邊簡單的做個範例
aggs query

{
  "aggs": {
    "grades_outlier": {
      "percentiles": {
        "field": "grades.eng",
        "percents": [0.13 ,90, 91, 92, 93, 93, 95, 99.5, 99.87],
        "script": {
          "lang": "painless", 
          "source": "doc['grades.eng'].value - 20"
        }
      }
    }
  }
}

結果:

"aggregations" : {
  "grades_outlier" : {
    "values" : {
      "0.13" : 23.0,
      "90.0" : 79.8,
      "91.0" : 79.92,
      "92.0" : 80.0,
      "93.0" : 80.0,
      "93.0" : 80.0,
      "95.0" : 80.0,
      "99.5" : 80.0,
      "99.87" : 80.0
    }
  }
}

#腳本的內容就別太在意,這邊只是簡單的告訴大家可以使用腳本依據使用者的目的調整結果

想知道更多實際應用方使可以參考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-percentile-aggregation.html#_script_10

Percentile Ranks

這種聚合方式則和Percentiles相反,是推算數值大約為多少百分位數

回傳的數值是近似值

aggs query:

{
  "aggs": {
    "grades_rp": {
      "percentile_ranks": {
        "field": "grades.eng",
        "values": [40]  #指定要推測的數值
      }
    }
  }
}

結果:

"aggregations" : {
  "grades_rp" : {
    "values" : {
      "40.0" : 6.4102564102564115
    }
  }
}

一樣可以使用腳本調整

{
  "aggs": {
    "grades_rp": {
      "percentile_ranks": {
        "field": "grades.eng",
        "values": [40],
        "script": {
          "source": "doc['grades.eng'].value - 10"
        }
      }
    }
  }
}

結果:

"aggregations" : {
  "grades_rp" : {
    "values" : {
      "40.0" : 12.820512820512823
    }
  }
}

可以應用在算PR值

今天的文章就到這邊,謝謝大家


上一篇
IT鐵人第26天 Elasticsearch 使用python查詢資料 Aggregations:Max/Min
下一篇
IT鐵人第28天 Elasticsearch 使用python查詢資料 Aggregations:Sum/Value Count
系列文
Python&Elasticsearch 入門30

尚未有邦友留言

立即登入留言