Группировка чисел для гистограммы
Вопрос
У меня есть куча чисел, которые я хочу использовать для создания гистограммы для стандартной оценки.
Поэтому я вычисляю среднее значение и стандартное отклонение чисел и нормализую каждое x с помощью этой формулы
x' = (x-среднее значение)/std_dev
В результате получается число от -4 до 4.Я хочу наметить этот результат.Я ищу способ сгруппировать числа, чтобы избежать маленьких столбиков.
Мой план состоит в том, чтобы ячейки в интервале [-4,4] располагались с центром в единицах последовательного квартала, т.е. [-4,-3.75,...,3.75,4]
Пример:0.1 => bin "0.0", 0.3 => bin "0.25", -1.3 => Bin "-1.5"
Каков наилучший способ достичь этого?
Решение
Вот решение, которое не использует никаких библиотек третьей части.Числа должны быть в массиве vals
.
MULTIPLIER = 0.25
multipliers = []
0.step(1, MULTIPLIER) { |n| multipliers << n }
histogram = Hash.new 0
# find the appropriate "bin" and create the histogram
vals.each do |val|
# create an array with all the residuals and select the smallest
cmp = multipliers.map { |group| [group, (group - val%1).abs] }
bin = cmp.min { |a, b| a.last <=> b.last }.first
histogram[val.truncate + bin] += 1
end
Я думаю, что он выполняет правильное округление.Но я пробовал это только с:
vals = Array.new(10000) { (rand * 10) % 4 * (rand(2) == 0 ? 1 : -1) }
и распределение получилось несколько искаженным, но, вероятно, в этом виноват генератор случайных чисел.
Другие советы
Rails предоставляет Перечислимый#group_by - смотрите Источник здесь, предполагая, что вы не используете Rails: http://api.rubyonrails.org/classes/Enumerable.html
Предполагая, что ваш список называется xs, вы могли бы сделать что-то вроде следующего (непроверенное):
bars = xs.group_by {|x| #determine bin here}
Тогда у вас получится хэш, который выглядит как:
bars = { 0 => [elements,in,first,bin], 1 => [elements,in,second,bin], etc }