高校数学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
この記事が気に入ったらサポートをしてみませんか?