統計に必要となる基礎的な統計量の計算と標準化の計算例です。
//----------------------------------------------------------------- // 基礎統計量: // 平均値,偏差平方和,分散,標準偏差,相関係数の計算, 標準化 //----------------------------------------------------------------- #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 |