見出し画像

高校数学10分プログラミング(数学Ⅰ編 3.データの分析)10日目「データの共分散や相関係数を計算する」

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

おはようございます。

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

本日の課題は、データの共分散や相関係数を計算するプログラムを作成することです。


共分散

$${x}$$の偏差と$${y}$$の偏差の積$${(x_k-\bar{x})(y_k-\bar{y})}$$の平均値

$$
s_{xy} = \frac{1}{n} \{ (x_1-\bar{x})(y_1-\bar{y})+(x_2-\bar{x})(y_2-\bar{y})+ \cdots +(x_n-\bar{x})(y_n-\bar{y}) \}
$$

相関係数

$$
r = \frac{s_{xy}}{(x \mathrm{の標準偏差})(y \mathrm{の標準偏差})} \ \ (-1 \leq r \leq 1)
$$


課題

以下の2つの変量$${x,y}$$についてのデータについて、共分散と相関係数を計算して、それらの結果をコンソールに出力するプログラムを作成してください。

$$
x : 43,39,51,27,65,24,62,33,56,48 \\
y : 59,62,84,53,76,48,83,47,65,72
$$


ヒント

共分散を計算する際に、$${x}$$の平均値と$${y}$$の平均値を求める必要があります。データの平均値の算出については、課題『高校数学10分プログラミング(数学Ⅰ編 3.データの分析)1日目「データの平均値を求める」』で作成した平均値を求める関数 calcmeanvalue を利用します。

// 平均値を計算する関数
float calcmeanvalue(
  int data_num, // データ数
  float[] data // データの配列
){
  float sum = 0.0; 
  for(int i=0; i<data_num; i++){
    sum += data[i];
  }
  return sum / data_num;
}

また、相関係数を計算する際に、$${x}$$の標準偏差と$${y}$$の標準偏差を求める必要があります。標準偏差の算出については、課題『高校数学10分プログラミング(数学Ⅰ編 3.データの分析)8日目「データの分散、標準偏差を求める」』で作成した分散を計算する関数 calcvariance と標準偏差を求める関数 calcstandarddeviation を利用します。

// 分散を計算する関数
float calcvariance(
  int data_num, // データ数
  float[] data // データの配列
){
  // 平均値を計算する
  float mean = calcmeanvalue(data_num, data);
  
  float sum = 0.0; 
  for(int i=0; i<data_num; i++){
    sum += (data[i] - mean) * (data[i] - mean);
  }
  return sum / data_num;
}

// 標準偏差を計算する関数
float calcstandarddeviation(
  int data_num, // データ数
  float[] data // データの配列
){
  // 分散を計算する
  float variance = calcvariance(data_num, data);
  
  // 標準偏差を計算する
  float sd = sqrt(variance);
  
  return sd;
}

そして、これらの関数と同様に、共分散と相関係数の算出についても、それぞれ関数 calccovariance と calccorrelationcoefficient を準備して利用するようにします。

これらを踏まえて、データの共分散と相関係数を計算するプログラムはソースコード1のようになります。

// データの共分散と相関係数を求める
void setup(){

  // データ
  int data_num = 10; // データ数
  float[] data_x = {43,39,51,27,65,24,62,33,56,48}; // データx
  float[] data_y = {59,62,84,53,76,48,83,47,65,72}; // データy

  // 共分散
  float covariance = calccovariance(data_num, data_x, data_y);
  println("共分散:",covariance);
  
  //相関係数
  float correlation_coefficient = calccorrelationcoefficient(data_num, data_x, data_y);
  println("相関係数:",correlation_coefficient);
    
}

// 平均値を計算する関数
float calcmeanvalue(
  int data_num, // データ数
  float[] data // データの配列
){
  float sum = 0.0; 
  for(int i=0; i<data_num; i++){
    sum += data[i];
  }
  return sum / data_num;
}

// 分散を計算する関数(偏差の2乗の平均値を利用)
float calcvariance(
  int data_num, // データ数
  float[] data // データの配列
){
  // 平均値を計算する
  float mean = calcmeanvalue(data_num, data);
  
  float sum = 0.0; 
  for(int i=0; i<data_num; i++){
    sum += (data[i] - mean) * (data[i] - mean);
  }
  return sum / data_num;
}

// 標準偏差を計算する関数
float calcstandarddeviation(
  int data_num, // データ数
  float[] data // データの配列
){
  // 分散を計算する
  float variance = calcvariance(data_num, data);
  
  // 標準偏差を計算する
  float sd = sqrt(variance);
  
  return sd;
}

// 共分散を計算する関数
float calccovariance(
  int data_num, // データ数
  float[] data_x, // 1つ目のデータxの配列
  float[] data_y  // 2つ目のデータyの配列
){

}

// 相関係数を計算する関数
float calccorrelationcoefficient(
  int data_num, // データ数
  float[] data_x, // 1つ目のデータxの配列
  float[] data_y  // 2つ目のデータyの配列
){

}

ソースコード1 データの共分散と相関係数を計算するプログラム(未完成)

ソースコード1の平均値を計算する関数 calcmeanvalue などの他の関数を参考にして、共分散を計算する関数 calccovariance

// 共分散を計算する関数
float calccovariance(
  int data_num, // データ数
  float[] data_x, // 1つ目のデータxの配列
  float[] data_y  // 2つ目のデータyの配列
){

}

と相関係数を計算する関数 calccorrelationcoefficient

// 相関係数を計算する関数
float calccorrelationcoefficient(
  int data_num, // データ数
  float[] data_x, // 1つ目のデータxの配列
  float[] data_y  // 2つ目のデータyの配列
){

}

の中身を追記して、プログラムを完成させてください。


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

MK's papa

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