楽しんだ者勝ち~就活を終えて伝えたいこと~

MENU

【C言語】統計的手法入門②

【スポンサーリンク】

 

はじめに

 

 【C言語】統計的手法入門①の続きです。ここでは、C言語で共分散、相関係数、最小2乗法を出力する方法を紹介しています。

 

目的(求める結果)

 

 

手順

 

  1. 偏差積
  2. 共分散
  3. 相関係数
  4. 最小2乗法

 

 【C言語】統計的手法入門①で用いた方法で結果を求めます。乱数の生成、平均、偏差、分散、標準偏差、標準化までの流れは、一緒です。ちなみにここでは、標準化した値は使わないので、無視してもらっても大丈夫です。

 

 偏差積は、2つの値の偏差の積です。これを最初に求めます。次に共分散を求めます。共分散は、偏差積を足し合わせて、総数で割った値です。相関係数は、共分散をそれぞれの標準偏差をかけたもので割った値です。

 

 最小2乗法は、回帰直線として、以下のようになります。(証明は省略)

 

f:id:mottobungaku:20181206175624p:plain



 

 以上の流れをC言語でコード化します。

コード(抜粋)

 

void randcalc(double covariance[0],double co_co[0],double a[0],double b[0]){

	int i;
	double deviation_product[count],sum;
	com randout[count];
	com randout2[count];
	randnum1(randout);
	randnum2(randout2);
/* initialization */
	sum = 0.0;

for(i=0;i<count;i++){
	deviation_product[i] = randout[i].deviation * randout2[i].deviation;
	sum += deviation_product[i];
}
	covariance[0] = sum/count;

/*correlation coefficient*/
	co_co[0]=covariance[0]/(randout[0].sta_devi * randout2[0].sta_devi);
	b[0]=co_co[0]/randout[0].dispersion;
	a[0]=randout2[0].average-(b[0]*randout[0].average);
}
 

結果

 

f:id:mottobungaku:20181206175942p:plain

 【C言語】統計的手法入門①で、rand1とrand2が無相関という結果が出ました。それに基づいて、回帰直線まで求め、まとめたものが上記の図になりました。

 

最後に

 

 統計的手法は、データを整理して、関係性を視覚化することが目的です。視覚化してみることで、何か分かったりします。データ数が多い場合、手で計算するのは、時間がかかります。
 ここでは、C言語を用いて、結果を効率よく求める方法を紹介しました。pythonやRなどの統計学に向いている言語もあります、そちらでも統計的手法に挑戦してみて下さい。