[C言語] カイ2乗分布を計算する – 統計学
カイ2乗分布は、統計学でよく使用される確率分布の一つで、主に適合度検定や独立性検定に用いられます。
C言語でカイ2乗分布を計算するには、まず観測データと期待データの差を計算し、その差の二乗を期待値で割った値を各データ点ごとに求め、全てのデータ点の結果を合計します。
カイ2乗統計量は次の式で表されます:
\[\chi^2 = \sum \frac{(O_i – E_i)^2}{E_i}\]
ここで、\(O_i\)は観測値、\(E_i\)は期待値です。
- カイ2乗分布の基本的な概念
- カイ2乗統計量の計算方法
- C言語での実装例
- 適合度検定や独立性検定の応用
- 統計的有意性の判断基準
カイ2乗分布とは
カイ2乗分布は、統計学において重要な確率分布の一つで、主に適合度検定や独立性検定に使用されます。
この分布は、標本の分散が母集団の分散にどれだけ適合しているかを評価するために用いられます。
カイ2乗分布は、自由度に依存し、自由度が大きくなるほど分布は正規分布に近づきます。
特に、観測データが期待値からどれだけ乖離しているかを測定する際に、カイ2乗統計量を計算し、その結果を基に仮説の検定を行います。
カイ2乗分布は、実際のデータ分析や実験結果の解釈において非常に有用です。
カイ2乗統計量の計算方法
観測値と期待値の違い
- 観測値: 実際にデータ収集によって得られた値。
実験や調査の結果として得られる数値です。
- 期待値: 理論的に予測される値。
特定の仮説が正しいと仮定した場合に得られる数値です。
観測値と期待値の差異を評価することで、データが仮説にどれだけ適合しているかを判断します。
カイ2乗統計量の公式
カイ2乗統計量は、以下の公式で計算されます。
\[\chi^2 = \sum \frac{(O_i – E_i)^2}{E_i}\]
ここで、\(O_i\)は観測値、\(E_i\)は期待値を表します。
この公式により、観測値と期待値の差の二乗を期待値で割ったものを合計します。
自由度の計算方法
自由度は、カイ2乗分布の形状を決定する重要な要素です。
自由度は通常、次のように計算されます。
- 適合度検定の場合: 自由度 = カテゴリ数 – 1
- 独立性検定の場合: 自由度 = (行数 – 1) × (列数 – 1)
自由度が大きくなるほど、カイ2乗分布は正規分布に近づきます。
カイ2乗統計量の例題
例えば、あるサイコロを6回振った結果、以下の観測値が得られたとします。
面 | 観測値 (O) | 期待値 (E) |
---|---|---|
1 | 1 | 1 |
2 | 2 | 1 |
3 | 1 | 1 |
4 | 0 | 1 |
5 | 1 | 1 |
6 | 1 | 1 |
この場合、カイ2乗統計量は次のように計算されます。
\[\chi^2 = \frac{(1-1)^2}{1} + \frac{(2-1)^2}{1} + \frac{(1-1)^2}{1} + \frac{(0-1)^2}{1} + \frac{(1-1)^2}{1} + \frac{(1-1)^2}{1} = 0 + 1 + 0 + 1 + 0 + 0 = 2\]
この結果から、観測値が期待値にどれだけ乖離しているかを評価することができます。
C言語でのカイ2乗分布の実装例
基本的なカイ2乗分布のプログラム
カイ2乗統計量を計算する基本的なプログラムを以下に示します。
このプログラムでは、観測値と期待値を手動で入力し、カイ2乗統計量を計算します。
#include <stdio.h>
int main() {
// 観測値と期待値の配列
double observed[] = {1, 2, 1, 0, 1, 1};
double expected[] = {1, 1, 1, 1, 1, 1};
double chi_square = 0.0;
int n = sizeof(observed) / sizeof(observed[0]); // 配列の要素数
// カイ2乗統計量の計算
for (int i = 0; i < n; i++) {
chi_square += (observed[i] - expected[i]) * (observed[i] - expected[i]) / expected[i];
}
// 結果の表示
printf("カイ2乗統計量: %f\n", chi_square);
return 0;
}
このプログラムを実行すると、カイ2乗統計量が計算され、表示されます。
配列を使ったカイ2乗分布の計算
配列を使用することで、観測値と期待値の数が増えても簡単に計算できます。
上記のプログラムを拡張して、配列のサイズを変更することで、異なるデータセットに対応できます。
ファイル入力を用いたカイ2乗分布の計算
ファイルから観測値と期待値を読み込むプログラムの例を以下に示します。
これにより、データを外部ファイルから取得できます。
#include <stdio.h>
int main() {
FILE *file = fopen("data.txt", "r"); // データファイルを開く
double observed[6], expected[6];
double chi_square = 0.0;
int n = 6; // データの数
// ファイルからデータを読み込む
for (int i = 0; i < n; i++) {
fscanf(file, "%lf %lf", &observed[i], &expected[i]);
}
fclose(file); // ファイルを閉じる
// カイ2乗統計量の計算
for (int i = 0; i < n; i++) {
chi_square += (observed[i] - expected[i]) * (observed[i] - expected[i]) / expected[i];
}
// 結果の表示
printf("カイ2乗統計量: %f\n", chi_square);
return 0;
}
このプログラムでは、data.txt
というファイルから観測値と期待値を読み込み、カイ2乗統計量を計算します。
ファイルの内容は次のようにします。
1 1
2 1
1 1
0 1
1 1
1 1
エラーハンドリングの実装
ファイル操作や計算においてエラーハンドリングを行うことは重要です。
以下のように、ファイルが正常に開けたかどうかを確認するコードを追加します。
if (file == NULL) {
printf("ファイルを開けませんでした。\n");
return 1; // エラーコードを返す
}
完成したサンプルコード
以下は、観測値と期待値をファイルから読み込み、カイ2乗統計量を計算する完成したプログラムです。
エラーハンドリングも含まれています。
#include <stdio.h>
int main() {
FILE *file = fopen("data.txt", "r"); // データファイルを開く
if (file == NULL) {
printf("ファイルを開けませんでした。\n");
return 1; // エラーコードを返す
}
double observed[6], expected[6];
double chi_square = 0.0;
int n = 6; // データの数
// ファイルからデータを読み込む
for (int i = 0; i < n; i++) {
fscanf(file, "%lf %lf", &observed[i], &expected[i]);
}
fclose(file); // ファイルを閉じる
// カイ2乗統計量の計算
for (int i = 0; i < n; i++) {
chi_square += (observed[i] - expected[i]) * (observed[i] - expected[i]) / expected[i];
}
// 結果の表示
printf("カイ2乗統計量: %f\n", chi_square);
return 0;
}
このプログラムを実行することで、ファイルから読み込んだデータに基づいてカイ2乗統計量を計算し、結果を表示します。
カイ2乗分布の応用例
適合度検定におけるカイ2乗分布の使用
適合度検定は、観測データが特定の理論分布にどれだけ適合しているかを評価するためにカイ2乗分布を使用します。
例えば、サイコロを振った結果が均等に出るかどうかを検定する場合、観測値と期待値を比較し、カイ2乗統計量を計算します。
この統計量がカイ2乗分布に基づく臨界値を超える場合、観測データは期待される分布に適合していないと判断されます。
適合度検定は、遺伝学や生態学など、さまざまな分野で広く利用されています。
独立性検定におけるカイ2乗分布の使用
独立性検定は、2つのカテゴリ変数が互いに独立であるかどうかを検定するためにカイ2乗分布を使用します。
例えば、性別と喫煙習慣の関係を調べる場合、クロス集計表を作成し、観測値と期待値を計算します。
カイ2乗統計量を求め、その値が自由度に基づく臨界値を超える場合、性別と喫煙習慣は独立ではないと結論付けます。
この検定は、社会科学やマーケティングリサーチなどでよく用いられます。
分散分析におけるカイ2乗分布の使用
分散分析(ANOVA)では、複数のグループ間の平均値の差を検定する際にカイ2乗分布が利用されます。
特に、分散分析の結果を評価するために、残差の分散がカイ2乗分布に従うことが前提とされます。
例えば、異なる治療法の効果を比較する実験において、各治療法のグループのデータを収集し、分散分析を行います。
得られたF値がカイ2乗分布に基づく臨界値を超える場合、グループ間に有意な差があると判断されます。
この手法は、医学や心理学の研究で広く使用されています。
よくある質問
まとめ
この記事では、カイ2乗分布の基本的な概念から、C言語を用いた実装方法、さらにはその応用例について詳しく解説しました。
カイ2乗分布は、統計学において非常に重要な役割を果たし、適合度検定や独立性検定、分散分析など、さまざまな場面で利用されています。
これらの知識を活用して、実際のデータ分析や研究に役立ててみてください。