Рассчитать 95-й процентили в Ruby? - программирование
Подтвердить что ты не робот

Рассчитать 95-й процентили в Ruby?

Этот вопрос здесь не помогает: Вычисление Percentiles (Ruby)

Я хотел бы вычислить 95-й процентиль (или, действительно, любой другой желаемый процентиль) из массива чисел. В конечном итоге это будет применяться в Rails для расчета распределения по большому количеству записей.

Но если я могу определить, как точно определить данный процентиль из массива чисел, я могу взять его оттуда.

Честно говоря, я удивлен, что мне не удалось найти какой-то драгоценный камень, который будет иметь такие функции - я еще не нашел его.

Помощь приветствуется.

4b9b3361

Ответ 1

Если вы хотите реплицировать функцию 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, который на самом деле является только конкретным процентили - http://support.microsoft.com/default.aspx?scid=kb;en-us;Q103493.

Ответ 2

Если ваш интерес к существующему драгоценному камню, то descriptive_statistics gem лучше всего я нашел до сих пор для функции 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

Хорошая часть драгоценного камня - это элегантный способ описания "Я хочу 95 процентов данных".

Ответ 3

Процентное число на основе количества элементов

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 возвращает 60 в качестве первого значения для 80-го процентиля. Если вы хотите получить этот результат: если вы хотите, чтобы элемент, падающий на вершину лимита, включался — затем измените .floor выше на .ceil.