統計処理の初歩 例1)統計データファイルから読み出し、平均・分散・標準偏差の表示 //program file name: "heikin.cpp" #include #include #include #include using namespace std; int main (int argc, char *argv[]) { //変数の宣言。 char hensumei[128]; int n, kazu; float gokei = 0, bunsan = 0, heikin; float atai[100]; //コマンドライン引数が1つでない場合は、使用法を表示して終了する。 if(argc != 2) { cout << "Usage: heikin \n"; return 1; } //ファイルを開く。エラーの場合はその旨表示して終了する。 ifstream fin(argv[1]); if(!fin) { cout << "Can't open input file!\n"; return 1; } //ファイルからの入力。 fin >> hensumei; fin >> kazu; for (n=1; n<=kazu; n++) { fin >> atai[n]; gokei = gokei + atai[n]; } fin.close(); //平均の算出。 heikin = gokei / kazu; //分散の算出。 for (n=1; n<=kazu; n++) { bunsan = bunsan + (atai[n] - heikin) * (atai[n] - heikin); } bunsan = bunsan / kazu; //結果の画面への出力。 cout << "\n"; cout << "variable: " << hensumei << "\n"; cout << "obs. value z-score\n"; for (n=1; n<=kazu; n++) { cout << setw(4) << n << setw(6) << atai[n] << setw(12) << (atai[n] - heikin) / sqrt(bunsan) << "\n"; } cout << "\n"; cout << "sum: " << gokei << "\n"; cout << "mean: " << heikin << "\n"; cout << "variance: " << bunsan << "\n"; cout << "standard deviation: " << sqrt(bunsan) << "\n"; return 0; } 例2)ファイルから読み出し、共分散、相関係数、回帰係数の算出と表示 //program file name: "kaiki.cpp" #include #include #include using namespace std; main (int argc, char *argv[]) { //変数の宣言。 char hensumei1[128], hensumei2[128]; int n, kazu1, kazu2; float heikin1 = 0, heikin2 = 0; float bunsan1 = 0, bunsan2 = 0, kyobunsan = 0; float soukan, kaiki_a, kaiki_b; float atai1[100], atai2[100]; //コマンドライン引数が2つでない場合は、使用法を表示して終了する。 if(argc != 3) { cerr << "Usage: kaiki \n"; return 1; } //ファイル1を開く。エラーの場合はその旨表示して終了する。 ifstream fin1(argv[1]); if(!fin1) { cerr << "Can't open input file1.\n"; return 1; } //ファイルからの入力。 fin1 >> hensumei1; fin1 >> kazu1; for (n=1; n<=kazu1; n++) { fin1 >> atai1[n]; heikin1 = heikin1 + atai1[n]; } fin1.close(); //ファイル2を開く。エラーの場合はその旨表示して終了する。 ifstream fin2(argv[2]); if(!fin2) { cerr << "Can't open input file2.\n"; return 1; } //ファイル2からの入力。 fin2 >> hensumei2; fin2 >> kazu2; for (n=1; n<=kazu2; n++) { fin2 >> atai2[n]; heikin2 = heikin2 + atai2[n]; } fin2.close(); //ファイル1とファイル2の個体数が一致しない場合は、その旨表示して終了する。 if (kazu1 != kazu2) { cout << "Numbers of observations do not match!\n"; return 1; } //平均の算出。 heikin1 = heikin1 / kazu1; heikin2 = heikin2 / kazu1; //分散・共分散・相関係数・回帰係数の算出。 for (n=1; n<=kazu1; n++) { bunsan1 = bunsan1 + (atai1[n] - heikin1) * (atai1[n] - heikin1); bunsan2 = bunsan2 + (atai2[n] - heikin2) * (atai2[n] - heikin2); kyobunsan = kyobunsan + (atai1[n] - heikin1) * (atai2[n] - heikin2); } bunsan1 = bunsan1 / kazu1; bunsan2 = bunsan2 / kazu1; kyobunsan = kyobunsan / kazu1; soukan = kyobunsan / (sqrt(bunsan1) * sqrt(bunsan2)); kaiki_b = soukan * (sqrt(bunsan2) / sqrt(bunsan1)); kaiki_a = heikin2 - kaiki_b * heikin1; //結果の画面への出力。 cout << "\n"; cout << "variable1: " << hensumei1 << "\n"; cout << "mean1: " << heikin1 << "\n"; cout << "standard deviation1: " << sqrt(bunsan1) << "\n"; cout << "variable2: " << hensumei2 << "\n"; cout << "mean2: " << heikin2 << "\n"; cout << "standard deviation2: " << sqrt(bunsan2) << "\n"; cout << "covariance: " << kyobunsan << "\n"; cout << "correlation coefficient: " << soukan << "\n"; cout << "regression coefficient [a]: " << kaiki_a << "\n"; cout << "regression coefficient [b]: " << kaiki_b << "\n"; return 0; }