C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でt検定を実装する方法:平均値と標準偏差を使ったt値の計算

このチュートリアルでは、t検定(スチューデントのt検定)を実装するC++プログラムについて詳しく解説します。

t検定とは?

t検定は、2つのデータセットの平均値を比較し、それらが統計的に類似しているのか、それとも有意に異なるのかを判定するために用いられる手法です。

さらに、t検定では差がどの程度大きいのかを数値として把握できるため、その変化が何に起因しているのかを考察する際にも役立ちます。

C++によるt検定の実装例

以下のコードでは、大きく分けて3つの関数を実装しています。

  • calc_mean():配列内のデータの平均値を計算します。
  • calc_deviation():不偏標準偏差(n-1で割る)を計算します。
  • calc_ttest():2つのデータセットの平均値と標準偏差をもとに、t値を算出します。
#include <bits/stdc++.h>
using namespace std;
// 平均値を計算
float calc_mean(float arr[], int n){
    float sum = 0;
    for (int i = 0; i < n; i++)
        sum = sum + arr[i];
    return sum / n;
}
// 標準偏差を計算
float calc_deviation(float arr[], int n){
    float sum = 0;
    for (int i = 0; i < n; i++)
        sum = sum + (arr[i] - calc_mean(arr, n)) * (arr[i] - calc_mean(arr, n));
    return sqrt(sum / (n - 1));
}
// 2つのデータセットのt検定を求める
float calc_ttest(float arr1[], int n, float arr2[], int m){
    float mean1 = calc_mean(arr1, n);
    float mean2 = calc_mean(arr2, m);
    float sd1 = calc_deviation(arr1, n);
    float sd2 = calc_deviation(arr2, m);
    float t_test = (mean1 - mean2) / sqrt((sd1 * sd1) / n + (sd2 * sd2) / m);
    return t_test;
}
int main(){
    float arr1[] = { 10, 20, 30, 40, 50 };
    int n = sizeof(arr1) / sizeof(arr1[0]);
    float arr2[] = { 1, 29, 46, 78, 99 };
    int m = sizeof(arr2) / sizeof(arr2[0]);
    cout << calc_ttest(arr1, n, arr2, m) << endl;
    return 0;
}

実行結果

-1.09789

コードのポイント

t値は、次の式で計算されます。

t = (平均値1 − 平均値2) ÷ √(分散1/n + 分散2/m)

この式において、分子は2つの平均値の差を表し、分母はそれぞれのデータセットのばらつき(標準誤差)を表しています。得られたt値の絶対値が大きいほど、2つのグループの平均には大きな差があると判断できます。

上記の例では、t値が約「-1.098」となり、負の値であることから、第2のデータセット(arr2)の平均が第1のデータセット(arr1)よりも高いことがわかります。

  1. C++でAVL木(AVLツリー)を実装する方法:回転操作とサンプルコードを徹底解説

    AVL木とは AVL木(AVL Tree)は、自己平衡型二分探索木(Self-balancing Binary Search Tree)の一種です。すべてのノードにおいて、左部分木と右部分木の高さの差が「1以下」に保たれるという性質を持っています。この平衡条件により、木が片側に偏って成長することを防ぎ、検索・挿入・削除といった操作を常に効率的(O(log n))に行うことができます。 木の回転(Tree Rotation)とは 木の回転とは、要素の順序(ソート順)を崩すことなく木の構造を変更する操作のことです。あるノードを一段上へ移動させ、別のノードを一段下へ移動させることで実現されます。 回

  2. 【C++】STLのset_symmetric_differenceで集合の対称差を実装するプログラム

    本記事では、C++の標準テンプレートライブラリ(STL)に含まれる set_symmetric_difference 関数を使って、2つの集合の「対称差」を求めるプログラムを紹介します。 対称差とは、2つの集合のうち「どちらか一方にだけ存在し、両方には存在しない」要素から構成される集合のことです。 主な集合演算の種類 和集合(Union):どちらか一方に含まれるすべての要素 積集合(Intersection):両方に共通して含まれる要素 対称差(Symmetric Difference / 排他的論理和 XOR):片方にのみ含まれる要素 差集合(Difference / 減算):一方から他方