numéros de regroupement pour un histogramme
Question
J'ai un tas de chiffres que je veux utiliser pour générer un histogramme pour un score standard.
Par conséquent je calculer la moyenne et l'écart-type du nombre et de normaliser chaque x avec cette formule
x »= (x-moyenne) / std_dev
Le résultat est un nombre compris entre -4 et 4. Je veux tracer ce résultat. Je suis à la recherche d'un moyen de regrouper les chiffres afin d'éviter aux petites barres.
Mon plan est d'avoir des bacs dans l'intervalle [-4,4] centrée sur les unités trimestre de consecutavice, i.e. [-4, -3,75, ..., 3.75,4]
Exemple: 0,1 => bin "0,0", 0,3 => bin "0,25", -1,3 => Bin "-1,5"
Quelle est la meilleure façon d'y parvenir?
La solution
Voici une solution qui n'utilise aucune bibliothèque tierce partie. Les chiffres devraient être dans le vals
Array.
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
Je pense qu'il exécute l'arrondissement approprié. Mais je ne l'ai essayé avec:
vals = Array.new(10000) { (rand * 10) % 4 * (rand(2) == 0 ? 1 : -1) }
et la distribution se genre de travers, mais c'est probablement la faute du générateur de nombres aléatoires.
Autres conseils
Rails fournit Enumerable # group_by - voir la source ici, en supposant que vous n'utilisez Rails: http://api.rubyonrails.org/classes/Enumerable.html
En supposant que votre liste est appelée xs, vous pouvez faire quelque chose comme ce qui suit (non testé):
bars = xs.group_by {|x| #determine bin here}
Ensuite, vous aurez un hachage qui ressemble à:
bars = { 0 => [elements,in,first,bin], 1 => [elements,in,second,bin], etc }