例えば集団に含まれる値が以下の場合を考える。
[0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9] | |
array[10] | 1.5 | 1.2 | 2.3 | 2.4 | 2.9 | 3.2 | 4.8 | 1.7 | 4.7 | 2.6 |
度数分布を取るためには、まず最小の階級の下限点 l_min と級間の幅 cls_width を定める必要がある。このとき、arrayの値の取り扱いに伴って、 l_min および cls_width の取り方は次のように異なる。
l_min と cls_width を決めたなら、array のそれぞれの値を、階級の下限点 cls_l に変換する。 この場合、cls_l に当たる値は、cls_l = 1.0, 2.0, 3.0, 4.0, ... でありそれぞれの値は次の式に従って変換される。
tmp = (array[m] - l_min) /
cls_width [ただし tmp は整数]
cls_l[m] = l_min + cls_width * tmp (1)
[0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9] | |
l[10] | 1.0 | 1.0 | 2.0 | 2.0 | 2.0 | 3.0 | 4.0 | 1.0 | 4.0 | 2.0 |
このとき各階級値の度数を格納するための配列 cnt が必要になる。この配列のサイズを効率的に決めるためには、最大の階級の下限点 l_max を知っておく必要がある。この場合、 arrayの最大値 max(array)に対して式(1)を適用することによって l_max = 4.0 であることがわかり cnt の要素数 n は次の数だけ必要になる。
n = (l_max - l_min)/cls_with + 1 (2)
n を求めて、cnt[n]を動的に確保する。
[0] | [1] | [2] | [3] | |
cnt[4] | ||||
対象 | [1.0, 2.0) | [2.0, 3.0) | [3.0, 4.0) | [4.0, 5.0) |
ここで、cnt[0]には、配列 l における 1.0 の度数を格納する。処理の簡単のため、l[m] と n の対応を取るため、両者の関係を以下のように明らかにしておく。
n = (l[m] - l_min) / cls_with (3)
式(3)に従って配列 l を以下のように n の値として更新する。
[0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9] | |
l[10] | 0 | 0 | 1 | 1 | 1 | 2 | 3 | 0 | 3 | 1 |
l[10] に対する度数分布は、cnt[l[n]]++ で求めることができ、その結果は以下のようになる。
[0] | [1] | [2] | [3] | |
cnt[4] | 3 | 4 | 1 | 2 |
対象 | [1.0, 2.0) | [2.0, 3.0) | [3.0, 4.0) | [4.0, 5.0) |
n と cls_l の関係は
cls_l[n] = n * cls_width + l_min (4)
で求めることができるため、cnt のそれぞれの要素が、どの cls_l を表しているかが確認できる。
2008/07/21: 作成