03 度数分布とヒストグラム
データをいくつかの階級に分けて分類します。これが度数分布で,図にしたものがヒストグラムです。
ここで「階級に分ける」という作業が,データの特徴を表すときに重要で,階級の分け方によってヒストグラムの形が変わり,場合によっては印象がまったく違うものになってしまいます。
この節では,階級の分けかたを考え,階級の分け方によってヒストグラムがどのように変わるかのシミュレーションもしてみましょう。
使うデータは,新体力テストの立ち幅跳びのデータです。
階級の設定
まず,このデータの最小値と最大値を求めます。
立ち幅跳びのデータは第3列のデータですので,column(list,n) 関数で第3列をとり出します。
data3=column(datalist,3);
取り出したデータ data3 は次のようになっています。
[立ち幅跳び,251,250,267,2,・・・・・]
第1要素は名称で,第2要素からあとが立ち幅跳びのデータですので,これをとり出します。
data=data3--[data3_1];
ここで,-- は要素を削除する演算子です。data3 から第1要素 data3_1 を削除したものを data としています。
リストからリストを引く形になるので, [data3_1] と,リストにしています。
次に,max() と min() で最大,最小を求め,コンソールに表示します。
これを見て階級を設定しましょう。
たとえば,170から290まで,20ごとにとります。階級のどちらの値を入れるかも問題になります。いまは右を入れましょう。すなわち
170より大で190以下,190より大で210以下,・・・・
です。階級の数は6になりますので,はじめに6つの要素からなるリスト hist[0,0,0,0,0,0] を用意しておきます。0,0,・・は打ち込めばよいでしょうが,apply() という便利な関数があるので,これを使ってみましょう。
hist=apply(1..6,0);
これで hist=[0,0,0,0,0,0] ができます。
度数のカウント
では,カウントしていきます。repeat() で繰り返していけばよいでしょう。
repeat(length(data),
class=ceil((data_#-170)/20);
hist_class=hist_class+1;
);
うまくいったかどうか,コンソールに表示して確かめましょう。data は sort() で昇順に並べ替えて表示します。
ceil() はその数より大きい最小の整数を返す関数で,天井関数と呼ばれるものです。これを床関数 floor() に変えると,階級の下の値が入るようになります。
度数分布表を作る
階級を表す列を作って,度数分布表を表示します。
histtable=[];
repeat(6,s,
b=170+(s-1)*20;
class=b+"~"+(b+19);
histtable=append(histtable,[class,hist_s]);
);
drawtext([0,-2],"立ち幅跳び");
drawtable([0,-7],histtable,width->70);
度数分布表のリストを histtable としました。はじめは空です。
class=b+"~"+(b+19); で,階級を表す文字列を作っています。 b は数値ですが,"〜" が文字なので,+演算で全体が文字列になります。
これと,度数をセットにしたリストを append() で histable に追加していきます。
度数分布表を降順にする場合は,リストを逆順にすればよいので
drawtable([0,-7],reverse(histtable),width->70);
とします。
ヒストグラムを描く
長方形を塗っていくので,fillpoly() を使います。
repeat(6,s,
x=5+s*1.5;
y=-8;
fillpoly([[x,y],[x+1.4,y],[x+1.4,y+hist_s/2],[x,y+hist_s/2]]);
drawtext([x+0.2,y-1],155+s*20);
);
表示位置は試行錯誤しながら適当に決めましょう。
縦軸や縦の値も必要ならば入れることができます。
階級の数を変える
ヒストグラムは,階級のとり方によって様相が変わることがあります。それをシミュレーションしてみましょう。
ここまでは階級の数を6にしました。これを変数 n にして,作りかえます。repeat(6,・・) を repeat(n,・・)にしますが,それ以外のところ(たとえば階級の幅 20 )も必要に応じて変えます。
n=10; // 階級の数
w=120/n; // 階級の幅
base=2-w; // 表,ヒストグラムのベースライン
hist=apply(1..n,0);
repeat(length(data),
class=ceil((data_#-170)/w);
hist_class=hist_class+1;
);
histtable=[];
repeat(n,s,
b=170+(s-1)*w;
class=b+"~"+(b+w-1);
histtable=append(histtable,[class,hist_s]);
);
drawtext([0,-2],"立ち幅跳び");
drawtable([0,base],histtable,width->70);
repeat(n,s,
x=5+s*1.5;
y=base;
fillpoly([[x,y],[x+1.4,y],[x+1.4,y+hist_s/2],[x,y+hist_s/2]]);
drawtext([x+0.2,y-1],170+(s-1)*w+w/2);
);
nとbase を適宜変更すればシミュレーションができます。次の図は n=10の場合です。n=6のときとだいぶ印象が違いますね。