標準偏差、共分散、相関係数の簡潔な(?)計算方法

発端

相関係数を計算するC言語のコードを ChatGPT に書かせたところ、いささか奇妙な計算式のコードが生成された。本当に正しいのか検算してみたところ、たしかに正しかった。

おさらい

標準偏差、共分散、相関係数は次のように定義される。

平均を用いずに計算する方法

上記の定義ではいったん平均を計算している。
次の式では平均を用いずに標準偏差、共分散、相関係数を計算できる。

証明

標準偏差については次の通り。

共分散についても同様に示せる。

これらから、相関係数についても前述の式の通りとなる。

これは簡潔な計算方法か?

この計算式は直感的に分かりにくいし、じつのところたいして計算量が減るわけでもない。ただし、いったん平均を計算する必要が無いのでループが1回ですみ、コードが簡潔になる。

C言語のコード

相関係数を計算するC言語の関数を以下に示す。

double correl(const double x[], const double y[], int n)
{
    double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0, sumY2 = 0;
    for (int i = 0; i < n; i++) {
        sumX += x[i];
        sumY += y[i];
        sumXY += x[i] * y[i];
        sumX2 += x[i] * x[i];
        sumY2 += y[i] * y[i];
    }
    double numerator = n * sumXY - sumX * sumY;
    double denominator = sqrt((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY));
    return numerator / denominator;
}