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?

Était-ce utile?

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 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top