見出し画像

高校数学10分プログラミング(数学Ⅰ編 3.データの分析)6日目「データの四分位数を求める」

マガジンリスト > 数学Ⅰ編 3.データの分析 > 6日目 課題

おはようございます。

本日は、高校数学10分プログラミング(数学I編 3.データの分析)の6日目です。

本日の課題は、データの四分位数を求めるプログラムを作成することです。

四分位数

① 範囲 データの最大値と最小値の差
② 四分位数 データを値の大きさの順に並べたとき、4等分する位置にくる値。小さい方から第1四分位数、第2四分位数(中央値)、第3四分位数といい、これらを順に$${Q_1, Q_2, Q_3}$$で表す。
③ 四分位範囲 $${Q_3-Q_1}$$ 四分位偏差 $${\frac{Q_3-Q_1}{2}}$$


課題

以下の「小テストの点数」のデータの四分位数を求めて、コンソールに出力するプログラムを作成してください。

$$
3 \ 4 \ 9 \ 7 \ 6 \ 10 \ 5 \ 5 \ 7 \ 9 \ 6 \ 8 \ 1 \ 5 \ 7 \ 10 \ 8 \ 6 \ 3 \ 7
$$


ヒント

四分位数を求めるためのアルゴリズム

アルゴリズムは以下の手順で行います。
① 与えられたデータを昇順にソートします。ソートについては、課題『高校数学10分プログラミング(数学Ⅰ編 3.データの分析)2日目「データをソートする」』で作成した、データをソートするための関数 bubblesort を利用します。
② ソートしたデータから、最小値、最大値を求めます。これらは昇順にソートしたデータ(配列)の先頭と末尾の配列の要素が対応します。
③ 次に、第2四分位数を求めます。第2四分位数の導出はデータ数$${N}$$が偶数か奇数かで場合分けが必要になります。
$${N}$$を$${2}$$で割ったときの商を$${h}$$とします。
図1を見てください。データ数$${N}$$が偶数の場合(図1の「データ数が10個の場合」と「データ数が12個の場合」)、第2四分位数$${Q_2}$$は配列の$${h-1}$$番目の要素と$${h}$$番目の要素との平均値となります。一方、データ数$${N}$$が奇数の場合(図1の「データ数が11個の場合」と「データ数が13個の場合」)、第2四分位数$${Q_2}$$は$${h}$$番目の要素となります。
④ 最後に、第1四分位数、第3四分位数を求めます。第1四分位数と第3四分位数の導出は③で計算した$${h}$$が偶数か奇数かで場合分けが必要になります。
$${h}$$を$${2}$$で割ったときの商を$${q}$$とします。
もう一度、図1を見てください。データ数$${h}$$が偶数の場合(図1の「データ数が12個の場合」と「データ数が13個の場合」)、第1四分位数$${Q_1}$$は配列の$${q-1}$$番目の要素と$${q}$$番目の要素との平均値となり、第3四分位数$${Q_3}$$は配列の$${N-q-1}$$番目の要素と$${N-q}$$番目の要素との平均値となります。一方、データ数$${h}$$が奇数の場合(図1の「データ数が10個の場合」と「データ数が11個の場合」)、第1四分位数$${Q_1}$$は$${q}$$番目の要素となり、第3四分位数$${Q_3}$$は$${N-q-1}$$番目の要素となります。

図1 四分位数の算出例

四分位数を求めるプログラム

では、四分位数を求めるプログラムを作成します。

// データの四分位数を算出する
void setup(){

  // データ
  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}; // データ

  // 四分位数
  float[] quartile = calcquartile(data_num, data);
  println(quartile);
  
}

// バブルソート(昇順)
float[] bubblesort(
  int data_num, // データ数
  float[] data // データの配列
){
  float[] bs = new float[data_num];
  for(int i=0; i<data_num; i++){
    bs[i] = data[i];
  }
  for(int i=0; i<data_num; i++){
    for(int j=1; j<data_num-i; j++){
      if(bs[j-1] > bs[j]){
        float temp = bs[j];
        bs[j] = bs[j-1];
        bs[j-1] = temp;
      }
    }
  }
  return bs;
}

// 四分位数を求める関数
float[] calcquartile(
  int data_num, // データ数
  float[] data // データの配列
){
  // データを昇順にソートする
  float[] bs = new float[data_num];
  bs = bubblesort(data_num, data);

  // 最小値、第1四分位数、第2四分位数、第3四分位数、最大値の順で格納される配列
  float[] Q = {0,0,0,0,0};
  
  // 最小値
  Q[0] = 
  // 最大値
  Q[4] = 
  // 第2四分位数
  int half_size = data_num / 2; // データの半分
  if( data_num % 2 == 0 ){ // データ数が偶数のとき
    Q[2] = 
  } else { // データ数が奇数のとき
    Q[2] = 
  }
  // 第1四分位数と第3四分位数
  if( half_size % 2 == 0){ // データの半分の数が偶数のとき
    Q[1] = 
    Q[3] = 
  } else { // データの半分の数が奇数のとき
    Q[1] = 
    Q[3] = 
  }  
  return Q;
}

ソースコード1 データの四分位数を求めるプログラム(未完成)

ソースコード1ではデータの四分位数を求める関数 calcquartile を準備しています。上記で説明した四分位数を求めるためのアルゴリズムを参考にして、この関数内の Q[0] から Q[4] までの計算式を記述して、プログラムを完成させてください。なお、データ数$${N}$$は変数 data_num 、 $${N}$$を$${2}$$で割ったときの商$${h}$$は変数 half_size でそれぞれ表しています。

あと、スケッチ名は「calcQuartile」としておいてください。


それでは、よろしくお願いします。

MK's papa

この記事が気に入ったらサポートをしてみませんか?