見出し画像

23/12/28 平均・共分散・相関係数を求めるプログラム【2var.c】

こんにちは、とある高専生です。
前回更新したブログが10月ということで2ヶ月ほど空いてしまいました。
申し訳ありません…

今回は前回に引き続き高専数学「新確率統計 改訂版」という教科書に出てくる2次元のデータの「平均」「共分散」「相関係数」を求めるプログラムを紹介します。
こちらも前回同様C言語で作成しています。

教科書「新確率統計 改訂版」P.41 ~ の内容です。

図1 使用する教科書

1. プログラム(コード)のダウンロードと注意事項

まず今回のプログラムはC言語で作成しています。
ダウンロードは以下のリンクからどうぞ!
https://drive.google.com/drive/folders/12vDIjkiVgTr8ZJSTq0xEm2-cGcmqaJ8b?usp=sharing

【注意事項】
こちらはC言語で作成しており、Linux環境でのコンパイルが必要となります。 コンパイルの際、末尾に「-lm」と記載することをお願いします。
(理由 : math.h を使用しているため)

例 :

$ gcc 2var.c -o 2var.out -lm

一応ここでもプログラムを記載しておきます。

#include <stdio.h>
#include <math.h>
#define MAX 1000

int main() {
    int i = 0, j;
    double x[MAX], y[MAX], x_Ave = 0, y_Ave = 0, xy_Ave = 0, Sxy = 0, x2_Ave = 0, y2_Ave = 0, X, Y, r;
    printf("共分散 / 相関係数 を求めます.\n 0を入れると計算開始します.\n");

    // x[]の値
    for (i = 0; i < MAX; i++) {
        printf("x[%d]を入力 : ", i);
        scanf("%lf", &x[i]);
        if (x[i] == 0) {
            j = i;
            break;
        }
    }
    printf("\n");

    // y[]の値
    for (i = 0; i < MAX; i++) {
        printf("y[%d]を入力 : ", i);
        scanf("%lf", &y[i]);
        if (y[i] == 0) {
            j = i;
            break;
        }
    }
    printf("\n");

    // x平均
    for (i = 0; i < j; i++) {
        x_Ave = x_Ave + x[i];
    }
    x_Ave = x_Ave / i;
    printf("x平均 : %lf\n", x_Ave);

    // y平均
    for (i = 0; i < j; i++) {
        y_Ave = y_Ave + y[i];
    }
    y_Ave = y_Ave / i;
    printf("y平均 : %lf\n", y_Ave);

    // xy平均
    for (i = 0; i < j; i++) {
        xy_Ave = xy_Ave + x[i] * y[i];
    }
    xy_Ave = xy_Ave / i;
    printf("xy平均 : %lf\n\n", xy_Ave);

    // 共分散
    Sxy = xy_Ave - x_Ave * y_Ave;
    printf("共分散 : %lf\n", Sxy);

 // x^2平均
    for (i = 0; i < j; i++) {
        x2_Ave = x2_Ave + pow(x[i], 2);
    }
    x2_Ave = x2_Ave / i;

    // y^2平均
    for (i = 0; i < j; i++) {
        y2_Ave = y2_Ave + pow(y[i], 2);
    }
    y2_Ave = y2_Ave / i;

    // XとY
    X = x2_Ave - pow(x_Ave, 2);
    Y = y2_Ave - pow(y_Ave, 2);

    // 相関係数
    r = Sxy / (sqrt(X) * sqrt(Y));
    printf("相関係数 : %lf\n", r);

    return 0;
}

2. 実行してみた!

前回のブログではプログラムの中身についても少し触れましたが、今回のコードは数学的知識を複雑に説明する必要があるので省略させていただきます。
詳しく知りたい方は「共分散 相関係数 公式」などで検索してみてください。この公式をもとにコードは作成しています。

では実際にコンパイルして実行してみると~…

図2 実行結果_1

図2のように文字が表示されます。
ここまでは前回と同じですね。
使い方は前回の1次元のデータと同じなので詳しくは以下のブログをご覧ください。
【前回のブログ(1次元のデータ)】
https://note.com/roposaimitukozo/n/n55723b35bf6d

では実際に数値を入力していきます。
例えば、
xのデータ [10, 30, 50, 70]

yのデータ [20, 40, 60, 80]
があったとします。
これらを入力していくと図3のようになります。

図3 実行結果_2

x、yのデータ共に、入力し終わったら最後に『 0 』と入力してください。
それで、『 0 』以前に入力されたデータが今回使用するデータなんだな、とプログラムに読み込ませます。

これでxとyのデータを用いた「それぞれの平均」「共分散」「相関係数」を計算してくれます。

図3にもあるように無事計算ができると答えとなる値を出力してくれます。
この答えがあっているか不安な方は一度計算機を片手に検算してみてください。(相当だるいですよ笑)

ということで今回はここまでです。
最後までお読みいただきありがとうございました!

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