基礎統計量

統計に必要となる基礎的な統計量の計算と標準化の計算例です。

基礎統計量(list_66.c)
//-----------------------------------------------------------------
// 基礎統計量:
//   平均値,偏差平方和,分散,標準偏差,相関係数の計算, 標準化
//-----------------------------------------------------------------
#include <stdio.h>
#include <math.h>

#define N 15
//-----------------------------------------------------------------
double calc_mean(int n,double* a);
double calc_ss(int n,double* a);
double calc_var(int n,double* a);
double calc_sd(int n,double* a);
double calc_corr(int n,double* x,double* y);
void normalize_data(int n,double* a);
//-----------------------------------------------------------------

int main()
{
    int i,ii;
    double sample_data[30] = {
        53,33,27,63,23,43,63,43,53,23,13,40,30,43,40, // data1
        50,60,10,53,13,57, 7,20,10,37, 7, 6,40,53,23  // data2
    };
    printf("**サンプルデータ\n");
    for(i=0;i<2;i++){
        for(ii=0;ii<N;ii++){
            printf("%.0lf ",sample_data[N*i+ii]);
        }
        printf("\n");
    }
    //--------------------------------------------------
    // 基本統計量
    //--------------------------------------------------
    printf("**基本統計量\n");
    printf("平均値   偏差平方和   分散   標準偏差\n");
    for(i=0;i<2;i++){
        printf("%.3lf   ",calc_mean(N,sample_data+N*i));
        printf("%.3lf   ",calc_ss(N,sample_data+N*i));
        printf("%.3lf   ",calc_var(N,sample_data+N*i));
        printf("%.3lf",calc_sd(N,sample_data+N*i));
        printf("\n");
    }
    printf("相関係数 = %lf\n",calc_corr(N,sample_data,sample_data+N));
    //--------------------------------------------------
    // 標準化
    //--------------------------------------------------
    printf("\n**標準化データ\n");
    for(i=0;i<2;i++){
        normalize_data(N,sample_data+N*i);
        for(ii=0;ii<N;ii++){
            printf("%.2lf ",sample_data[N*i+ii]);
        }
        printf("\n");
    }
    //--------------------------------------------------
    // 標準化後の基本統計量
    //--------------------------------------------------
    printf("**基本統計量\n");
    printf("平均値   偏差平方和   分散   標準偏差\n");
    for(i=0;i<2;i++){
        printf("%.3lf   ",calc_mean(N,sample_data+N*i));
        printf("%.3lf   ",calc_ss(N,sample_data+N*i));
        printf("%.3lf   ",calc_var(N,sample_data+N*i));
        printf("%.3lf",calc_sd(N,sample_data+N*i));
        printf("\n");
    }
    printf("相関係数 = %lf\n",calc_corr(N,sample_data,sample_data+N));
    return 0;
}

//-----------------------------------------------------------------
//  Calc mean value
//-----------------------------------------------------------------
double calc_mean(int n,double* a)
{
    int i; double mean=0;
    for(i=0;i<n;i++) mean += a[i];
    return mean/n;
}
//-----------------------------------------------------------------
// 偏差平方和 (sum of sequares)
//-----------------------------------------------------------------
double calc_ss(int n,double* a)
{
    int i;
    double ss=0,mean=calc_mean(n,a);
    for(i=0;i<n;i++) ss+=(a[i]*a[i]);
    ss -= n*mean*mean;
    return ss;
}
//-----------------------------------------------------------------
// 分散 (variance)
//-----------------------------------------------------------------
double calc_var(int n,double* a)
{
    int i;
    double var=0,mean=calc_mean(n,a);
    for(i=0;i<n;i++) var+=(a[i]*a[i]);
    var -= n*mean*mean;
    var /= (double)n;
    return var;
}
//-----------------------------------------------------------------
// 標準偏差 (standard deviation)
//-----------------------------------------------------------------
double calc_sd(int n,double* a)
{
    int i;
    double sd=0,mean=calc_mean(n,a);
    for(i=0;i<n;i++) sd+=(a[i]*a[i]);
    sd -= n*mean*mean;
    sd /= (double)n;
    return sqrt(sd);
}
//-----------------------------------------------------------------
// 相関係数
//-----------------------------------------------------------------
double calc_corr(int n,double* x,double* y)
{
    int i;
    double mx=calc_mean(n,x);
    double my=calc_mean(n,y);
    double xx=0,yy=0,xy=0,corr=0;
    for(i=0;i<n;i++){
        xx+=(x[i]-mx)*(x[i]-mx);
        yy+=(y[i]-my)*(y[i]-my);
        xy+=(x[i]-mx)*(y[i]-my);
    }
    xx = sqrt(xx); yy = sqrt(yy); corr = xy / (xx*yy);
    return corr;
}
//-----------------------------------------------------------------
// 標準化
//-----------------------------------------------------------------
void normalize_data(int n,double* a)
{
    int i;
    double mv=calc_mean(n,a);
    double sd=calc_sd(n,a);
    for(i=0;i<n;i++)
        a[i] = (a[i]-mv)/sd;
}

実行結果
**サンプルデータ
53 33 27 63 23 43 63 43 53 23 13 40 30 43 40 
50 60 10 53 13 57 7 20 10 37 7 6 40 53 23 
**基本統計量
平均値   偏差平方和   分散   標準偏差
39.333   3041.333   202.756   14.239
29.733   6106.933   407.129   20.177
相関係数 = 0.199165

**標準化データ
0.96 -0.44 -0.87 1.66 -1.15 0.26 1.66 0.26 0.96 -1.15 -1.85 0.05 -0.66 0.26 0.05 
1.00 1.50 -0.98 1.15 -0.83 1.35 -1.13 -0.48 -0.98 0.36 -1.13 -1.18 0.51 1.15 -0.33 
**基本統計量
平均値   偏差平方和   分散   標準偏差
-0.000   15.000   1.000   1.000
-0.000   15.000   1.000   1.000
相関係数 = 0.199165
inserted by FC2 system