JavaとApache Commons Mathで共分散を手軽に計算する方法

はじめに

システム改修で新たに共分散を使用した計算が必要になりました。今回はJavaで共分散を計算する方法について解説します。

共分散について

共分散は、2種類のデータ間の関係性を数値化したものです。計算結果が正の場合、片方のデータが増加すると、もう片方も増加すると予測されます。逆に、計算結果が負の場合、片方のデータが増加すると、もう片方は減少すると予測されます。そして、計算結果の絶対値が大きければ大きいほど、データ間の関連性が強いことを示します。

例:
あるクラスの国語と数学のテストスコアをもとに共分散を計算した場合、正の結果が得られれば、国語の点数が上がると、数学の点数も上がる傾向があることが示されます。逆の結果の場合、国語の点数が上がると数学の点数は下がる傾向が示されます。

共分散の計算では、2つのデータの偏差の積の平均を用いています。ここで、偏差はデータの個々の値とそのデータの平均値との間の差を指します。
以下は、偏差の計算方法です。

偏差の計算方法:
\[ d_i = x_i - \bar{x} \]
dはdeviation(偏差)の略です。

上記の偏差の計算を利用して、共分散を計算します。
下記が共分散の計算方法です。

共分散の計算方法:
\[ \text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y}) \]

  • Cov(X, Y)は変数Xと変数Yの共分散を表します。

  • Covはcovariance(共分散)の略です。

  • nはデータの総数を表します。

  • \(x_i\) と \(y_i\) はそれぞれのデータポイントを表します。

  • \(\bar{x}\) と \(\bar{y}\) は変数Xと変数Yの平均をそれぞれ表します。

国語と数学のテスト結果における共分散の例題

以下はあるクラスの国語と数学のテストの点数を示すテーブルです。

生徒番号 国語の点数 数学の点数
1 70 60
2 80 75
3 75 70
4 85 80
5 95 90

上記の国語と数学の点数の共分散を求めましょう。

必要なライブラリのセットアップ

Javaを使用して共分散をプログラムで計算するには、Apache Commons Math ライブラリを使用します。今回はMavenを使用することを想定します。既存のpom.xmlに以下を追加してください。

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-math3</artifactId>
        <version>3.6.1</version>
    </dependency>
</dependencies>

Javaを使った国語と数学のスコアに基づく共分散計算方法

国語と数学のスコアに基づいて共分散を計算する具体的なJavaの実装を以下に示します。

import org.apache.commons.math3.stat.correlation.Covariance;

public class Main {

    public static void main(String[] args) {
        // 国語のテストスコア
        double[] japaneseScores = { 70, 80, 75, 85, 95 };
        // 数学のテストスコア
        double[] mathScores = { 60, 75, 70, 80, 90 };

        // Apache Commons MathのCovarianceクラスを使用して共分散を計算
        Covariance covariance = new Covariance();
        double cov = covariance.covariance(japaneseScores, mathScores, false);

        // 計算結果の表示
        System.out.println("共分散:" + cov);
    }

}

上記のコードでは、covariance.covariance(japaneseScores, mathScores, false)falseは、母共分散(全体の共分散)を計算することを指示しています。もしtrueを指定すると、標本共分散(一部のデータから全体を推測する共分散)が計算されます。

実行結果

共分散:85.0

実行結果の検算

上記の結果を検算してみます。

\[\text{共分散} = \text{Cov}(X,Y) = \frac{\sum_{i=1}^{n} (X_i - \bar{X})(Y_i - \bar{Y})}{n}\]

ここで、国語と数学のテストスコアの平均を計算します。

\[\bar{X} = \frac{70 + 80 + 75 + 85 + 95}{5} = 81\]
\[\bar{Y} = \frac{60 + 75 + 70 + 80 + 90}{5} = 75\]

これにより、各スコアが平均からどれだけ離れているかの「偏差」を計算するための基準となります。

\begin{align*}
\text{Cov}(X,Y) &= \frac{1}{5} \sum_{i=1}^{5} (X_i - 81)(Y_i - 75) \\
&= \frac{1}{5}[(70-81)(60-75) + (80-81)(75-75) + (75-81)(70-75) + (85-81)(80-75) + (95-81)(90-75)] \\
&= \frac{1}{5}[-11 \times -15 + (-1) \times 0 + (-6) \times (-5) + 4 \times 5 + 14 \times 15] \\
&= \frac{425}{5} \\
&= 85
\end{align*}

終わりに

今回は、JavaApache Commons Mathライブラリを使用し、国語と数学の点数に基づいて共分散の計算を行いました。この情報が皆さんの参考になれば幸いです。

コメント

タイトルとURLをコピーしました