C言語で実装する共分散を用いたピアソンの相関係数計算方法を解説
この記事ではC言語を活用し、共分散を求める計算からピアソンの相関係数
数式
共分散とピアソンの相関係数の基礎
共分散の概念
共分散は、2つの変数がどれだけ一緒に変動するかを示す統計量です。
例えば、変数 X と Y の値がともに大きくなる傾向がある場合、共分散は正の値となり、逆に片方が大きいともう片方が小さい場合は負の値となります。
共分散の値自体は、データの単位に依存するため、直接変数間の関係の強さを比較する際には補正が必要になることがあります。
ピアソンの相関係数の定義
ピアソンの相関係数は、共分散を各変数の標準偏差で割ることで求められ、2つの変数間の線形関係の強さと方向を示す指標です。
値は
に近い場合は正の強い相関、 に近い場合は負の強い相関、 付近の場合はほとんど線形な相関がないことを意味します。
計算式の解説
ピアソンの相関係数
ここで、
共分散は次の式で求めることができます。
また、標準偏差は、それぞれの分散の平方根であり、分散は次の式で計算されます。
これらの式を用いることで、データの散らばりと関連性を正確に評価することが可能となります。
C言語で実装する相関係数計算
プログラムの基本構成
必要なヘッダファイルとライブラリ
C言語で実装する際は、以下のヘッダファイルを使用します。
stdio.h
:標準入出力に関する関数を使用するためstdlib.h
:メモリ確保や一般的なユーティリティを使用するためmath.h
:平方根など数学関数を使用するため
これらをインクルードすることで、標準的な機能が利用可能になります。
main関数の役割
main
関数は、プログラム実行時のエントリーポイントとなります。
ここでは、データの初期化、共分散や相関係数計算の関数呼び出し、結果の表示などが行われます。
プログラム全体の流れの管理や、各関数の連携など、基本的な処理をまとめる重要な部分です。
共分散の計算方法
入力データの取得と前処理
計算を行うためには、対象となるデータ配列が必要です。
実際のプログラムでは、データをファイルから読み込む場合や、ユーザーからの入力を受け取る場合がありますが、ここではサンプルとして固定配列を用います。
前処理としては、データ個数の確認や NULL チェック、必要なメモリ確保などが行われます。
平均値の求め方と計算の流れ
まず、各変数の平均値
平均値は、全データの合計をデータ数で割ることで求められます。
その後、各データと平均値との差を計算し、共分散や分散の算出に利用します。
計算の流れは以下の通りです。
- 変数 X と Y の平均値を計算する。
- 各データ点において (x[i] – 平均値) や (y[i] – 平均値) を算出する。
- それらの積の和をとり、データ数で割ることで共分散を求める。
ピアソンの相関係数の算出
分散と標準偏差の計算
平均値の計算後、各変数の分散を計算します。
分散
その後、標準偏差は分散の平方根として計算します。
これにより、データの散らばり具合が数値として評価でき、相関係数の分母として使用されます。
相関係数算出の実装例
共分散と各変数の標準偏差が求まったら、相関係数は以下の式で計算されます。
実装例では、まず共分散を求める関数と、標準偏差を求める関数を用意し、main
関数内でそれらを呼び出して最終的に相関係数を出力するようにします。
コード例と解説
ソースコードの全体像
以下に、C言語を用いて共分散とピアソンの相関係数を計算するサンプルコードの全体像を示します。
このコードは、固定配列のデータを用い、各関数を呼び出すことで実装されています。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 配列のサイズ
#define SIZE 5
// 平均値を計算する関数
double calculateMean(double data[], int n) {
double sum = 0.0;
for (int i = 0; i < n; i++) {
sum += data[i];
}
return sum / n;
}
// 共分散を計算する関数
double calculateCovariance(double x[], double y[], int n) {
double meanX = calculateMean(x, n);
double meanY = calculateMean(y, n);
double covariance = 0.0;
for (int i = 0; i < n; i++) {
covariance += (x[i] - meanX) * (y[i] - meanY);
}
return covariance / n;
}
// 分散を計算する関数
double calculateVariance(double data[], int n) {
double mean = calculateMean(data, n);
double variance = 0.0;
for (int i = 0; i < n; i++) {
variance += (data[i] - mean) * (data[i] - mean);
}
return variance / n;
}
// ピアソン相関係数を計算する関数
double calculatePearsonCorrelation(double x[], double y[], int n) {
double covariance = calculateCovariance(x, y, n);
double stdDevX = sqrt(calculateVariance(x, n));
double stdDevY = sqrt(calculateVariance(y, n));
return covariance / (stdDevX * stdDevY);
}
// main関数:プログラムのエントリーポイント
int main(void) {
// サンプルデータの定義
double x[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0};
double y[SIZE] = {2.0, 4.0, 6.0, 8.0, 10.0};
// 相関係数の計算
double correlation = calculatePearsonCorrelation(x, y, SIZE);
// 結果の出力
printf("Pearson Correlation Coefficient: %f\n", correlation);
return 0;
}
各パートの詳細解説
calculateMean
関数
配列内の全要素の合計を求め、データ数で割ることで平均値を計算します。
これにより、後続の共分散や分散計算の基礎となる値が得られます。
calculateCovariance
関数
まず、配列 x
と y
の平均値をそれぞれ求め、各データ点から平均値を引いた値の積の和を計算します。
最後に、その値を配列のサイズで割ることで共分散を算出しています。
calculateVariance
関数
各データ点と平均値との差の二乗和を計算し、データ数で割ることで分散を求めます。
この分散の平方根をとると標準偏差となるため、相関係数の算出に不可欠です。
calculatePearsonCorrelation
関数
共分散と、それぞれの標準偏差を利用してピアソンの相関係数を求めます。
計算式に基づき、結果として得られる値が2つの変数間の線形関係を示す数値となります。
実行結果と確認方法
上記のサンプルコードをコンパイルして実行すると、固定配列のサンプルデータに基づいて計算されたピアソンの相関係数が出力されます。
例えば、サンプルデータとして x = {1.0, 2.0, 3.0, 4.0, 5.0}
と y = {2.0, 4.0, 6.0, 8.0, 10.0}
を用いた場合、全ての要素が完全な正の線形関係にあるため、結果は 1.000000
に近い値となります。
Pearson Correlation Coefficient: 1.000000
エラーハンドリングと拡張性
入力値の検証方法
実際の現場では、ユーザーからの入力やファイル読み込み時に不正なデータが混入する可能性があります。
そのため、以下のような入力値の検証を行うと安心です。
- 配列のサイズが0でないかチェック
- NULL ポインタの確認
- 数値以外のデータが入っていないか検証
エラーチェックを適切に行うことで、実行時の予期せぬ動作やクラッシュを防止させることができます。
応用例と現場での利用ケース
本実装は、固定配列を用いたシンプルな例ですが、実際の現場では次のような応用が考えられます。
- 大規模なデータセットの解析
- ファイル I/O を用いた実データの読み込み
- リアルタイムな統計解析システムへの組み込み
また、共分散や相関係数の計算は、機械学習やデータサイエンスの分野において、入力データ間の関係性を解析する重要な手法として利用されるため、拡張性のあるコード設計が求められます。
まとめ
この記事では、C言語を用いて共分散とピアソンの相関係数を算出する方法について解説しました。
共分散や相関係数の基本、各数式の意味を理解し、データの前処理から平均、分散、標準偏差の計算手順を追いながら、実践的なサンプルコードで全体の流れを説明しています。
また、エラーチェックや拡張性、応用例についても言及し、実際の解析に役立つ知識を身につけることができます。