高校数学10分プログラミング(数学Ⅰ編 3.データの分析)5日目「データのヒストグラムを作成する」
マガジンリスト > 数学Ⅰ編 3.データの分析 > 5日目 課題
おはようございます。
本日は、高校数学10分プログラミング(数学I編 3.データの分析)の5日目です。
本日の課題は、データのヒストグラムを作成するプログラムを作成することです。
課題
以下の「小テストの点数」のデータのヒストグラムをキャンバス上に描くプログラムを作成してください。
$$
3 \ 4 \ 9 \ 7 \ 6 \ 10 \ 5 \ 5 \ 7 \ 9 \ 6 \ 8 \ 1 \ 5 \ 7 \ 10 \ 8 \ 6 \ 3 \ 7
$$
ヒント
前課題『高校数学10分プログラミング(数学Ⅰ編 3.データの分析)4日目「データの最頻値を求める」』で最頻値を求めるプログラムを作成する際に、データの階級ごとの個数を求めました。その結果を利用してヒストグラムを描くことができます。
ヒストグラムとは、横軸に階級、縦軸に度数をとった統計グラフのことです。今回の課題の場合は、横軸が小テストの点数、縦軸がその点数を取った人数を表します。
ただ、今回の課題は少し難しいと思います。そのため、今回は以下のヒストグラムを描くプログラム(完成版)を先に示しておきます。このプログラムを実行してみて、ヒストグラムが正しく描かれていることを確認してください。
// データのヒストグラムを描く
void setup(){
size(700, 700); // キャンバスの大きさを指定する
background(255,255,255); // 背景を白色にする
noLoop(); // 繰り返し処理をしない
// データ
int data_num = 20; // データ数
float[] data = {3,4,9,7,6,10,5,5,7,9,6,8,1,5,7,10,8,6,3,7}; // データ
// 階級ごとの個数の計算
int data_kind_num = 11; // データの階級は0から10までの11種類
int[] hist = new int[data_kind_num]; // 階級ごとの個数を数えるための配列
for(int k=0; k<data_kind_num; k++){
hist[k] = 0;
}
for(int i=0; i<data_num; i++){
hist[(int)data[i]]++; // 階級の個数をカウント
}
// 最頻値を求める
int mode = 0;
int max_value = 0;
for(int k=0; k<data_kind_num; k++){
if( max_value < hist[k]){
max_value = hist[k];
mode = k;
}
}
fill(0,0,0); // 文字の色を黒色にする
textSize(20); // 文字のサイズを調整
// 横軸の分割数(左マージン + 階級数+1 + 右マージン)
float horizontal_scale_num = data_kind_num + 3.0;
// 縦軸の分割数(下マージン + 最頻値の値+1 + 上マージン)
float longitudinal_scale_num = max_value + 3.0;
// 横軸の目盛り幅(マージンも同じ幅にする)
float horizontal_scale = width/horizontal_scale_num;
// 縦軸の目盛り幅(マージンも同じ幅にする)
float longitudinal_scale = height/longitudinal_scale_num;
float scale_width = 5.0; // 軸上に付ける目盛りの幅
// 座標軸を準備
line(horizontal_scale, height-longitudinal_scale,
width-horizontal_scale, height-longitudinal_scale); // 横軸
line(horizontal_scale, longitudinal_scale,
horizontal_scale, height-longitudinal_scale); // 縦軸
// 横軸に階級を描く
textAlign(CENTER, TOP);
for(int k=0; k<data_kind_num; k++){
text(k, horizontal_scale+horizontal_scale*(k+0.5), height-longitudinal_scale+scale_width);
}
// 縦軸に目盛り
textAlign(RIGHT, CENTER);
for(int i=max_value; i>=0; i--){
line(horizontal_scale-scale_width, height-longitudinal_scale-longitudinal_scale*i,
horizontal_scale+scale_width, height-longitudinal_scale-longitudinal_scale*i);
text(i, horizontal_scale-scale_width, height-longitudinal_scale-longitudinal_scale*i);
}
translate(horizontal_scale, height-longitudinal_scale); // 座標の中心を移動する
scale(1,-1); // y軸正の向きを下向きから上向きに反転する
noFill(); // 図形の塗りつぶしなし
// ヒストグラムを描く
for(int k=0; k<data_kind_num; k++){
rect(horizontal_scale*k, 0.0, horizontal_scale, longitudinal_scale * hist[k]);
}
}
ソースコード1 ヒストグラムを描くプログラム
なお、スケッチ名は「drawHistgram」としておいてください。
それでは、よろしくお願いします。
MK's papa