24

ここでのこの質問は役に立たないようです:パーセンタイルの計算(Ruby)

数値の配列から95パーセンタイル(または実際には他の必要なパーセンタイル)を計算したいと思います。最終的に、これはRailsに適用され、多数のレコードに対する分布を計算します。

しかし、数値の配列から特定のパーセンタイルを正確に決定する方法を決定できれば、そこから取得できます。

率直に言って、私はそのような機能を持つある種の宝石を見つけることができなかったことに驚いています-私はまだそれを見つけていません。

ヘルプは大歓迎です。

4

4 に答える 4

40

ExcelのPERCENTILE関数を複製する場合は、次のことを試してください。

def percentile(values, percentile)
    values_sorted = values.sort
    k = (percentile*(values_sorted.length-1)+1).floor - 1
    f = (percentile*(values_sorted.length-1)+1).modulo(1)
    
    return values_sorted[k] + (f * (values_sorted[k+1] - values_sorted[k]))
end

values = [1, 2, 3, 4]
p = 0.95
puts percentile(values, p)
#=> 3.85

この式は、実際には特定のパーセンタイルであるQUARTILEメソッドに基づいています-https: //support.microsoft.com/en-us/office/quartile-inc-function-1bbacc80-5075-42f1-aed6-47d735c4819d

于 2012-08-02T20:41:05.827 に答える
18

あなたが既存の宝石に興味があるなら、descriptive_statistics宝石は私がこれまでに見つけたpercentile機能の最高のものです。

IRBセッション

> require 'descriptive_statistics'
=> true
irb(main):009:0> data = [1, 2, 3, 4]
=> [1, 2, 3, 4]
irb(main):010:0> data.percentile(95)
=> 3.8499999999999996
irb(main):011:0> data.percentile(95).round(2)
=> 3.85

gemの良い部分は、「95パーセンタイルのデータが欲しい」というエレガントな表現方法です。

于 2014-04-04T10:05:11.813 に答える
7

アイテム数に基づくパーセンタイル

a = [1,2,3,4,5,6,10,11,12,13,14,15,20,30,40,50,60,61,91,99,120]

def percentile_by_count(array,percentile)
  count = (array.length * (1.0-percentile)).floor
  array.sort[-count..-1]
end

# 80th percentile (21 items*80% == 16.8 items are below; pick the top 4)
p percentile_by_count(a,0.8) #=> [61, 91, 99, 120]

値の範囲に基づくパーセンタイル

def percentile_by_value(array,percentile)
  min, max = array.minmax
  range = max - min
  min_value = (max-min)*percentile + min
  array.select{ |v| v >= min_value }
end

# 80th percentile (119 * 80% = 95.2; pick values above this)
p percentile_by_value(a,0.8) #=> [99, 120]

興味深いことに、ExcelのPERCENTILE関数は6080パーセンタイルの最初の値として返されます。この結果が必要な場合(制限の先端にあるアイテムを含める場合)は、.floor上記をに変更し.ceilます。

于 2012-08-02T20:18:16.923 に答える
0

これは私が自分の統計ライブラリで開発した方法です。

def quantiles(data, probs=[0.25, 0.50, 0.75])
  values = data.sort

  probs.map do |prob|
    h = 1 + (values.count - 1) * prob
    mod = h % 1
    (1 - mod) * values[h.floor - 1] + (mod) * values[h.ceil - 1]
  end
end

1つの分位数だけが必要な場合は、を実行しますquantiles(data, [0.95])

于 2020-10-05T16:04:58.273 に答える