2016-11-13 13 views

答えて

0

範囲。これらの値を決定するには、データの一部の前処理が必要な場合があります。たとえば、次のように我々は最初のグループの最小値とグループの数を計算するかもしれない

values = [139, 145, 149, 151, 152, 153, 164, 166, 169] 
group_size = 5 

を与えられた:

smallest, largest = values.minmax 
    #=> [139, 169] 
start = group_size*(smallest/group_size) 
    #=> 135 
nbr_groups = ((largest-start+1)/group_size.to_f).ceil 
    #=> 7 

現在、我々は、ヒストグラムを作成するために使用することができ、アレイを構築することができます。

def group_values(values, start, nbr_groups, group_size) 
    groups = Array.new(nbr_groups) do |i| 
    f = start + i * group_size 
    { nbr: 0, range: f..f+group_size-1 } 
    end  
    values.each_with_object(groups) { |v,arr| 
    arr[(v-start)/group_size][:nbr] += 1 } 
end 

のは、(startと上記計算nbr_groupsの値のために)それを試してみましょう。

freq = group_values(values, start, nbr_groups, group_size) 
    #=> group_values(values, 135, 7, 5) 
    #=> [{:nbr=>1, :range=>135..139}, 
    # {:nbr=>0, :range=>140..144}, 
    # {:nbr=>2, :range=>145..149}, 
    # {:nbr=>3, :range=>150..154}, 
    # {:nbr=>0, :range=>155..159}, 
    # {:nbr=>1, :range=>160..164}, 
    # {:nbr=>2, :range=>165..169}] 

得られた配列の各要素のため:range

  • 値がヒストグラムの横軸を標識するために設けられています。
  • values(値は140-144155-159)の要素を含まないグループが返される配列に含まれるように、配列groupsを初期化しました。私がそのアレイをその場で構築したのであれば、その2つのグループのハッシュは含まれていなかったでしょう。
  • ヒストグラムの垂直軸の周波数範囲を設定するには、次のように計算します。

freq.map { |h| h[:nbr] }.minmax 
    #=> [0, 3] 
3

あなたは、各範囲のための簡単な定義を扱っているので、[はい]:通常

values.group_by do |v| 
    (v-1)/5 
end.values 
# => [[139], [145, 149], [151, 152, 153], [163], [166, 169]] 

group_byも、グループ要素を含んでいるが、この場合には、それは便利ではありませんので、これは無視することができます。

あなたはこの使用範囲で探しているのフォームにこれを変換することができます:ヒストグラム1は、通常、最初の範囲の最小値、範囲の大きさや数を指定し準備するに

values.group_by do |v| 
    (v-1)/5 
end.map do |v, a| 
    [ (v*5+1..v*5+5), a.length ] 
end.to_h 
# => {136..140=>1, 141..145=>1, 146..150=>1, 151..155=>3, 161..165=>1, 166..170=>2} 
関連する問題