黄昏より暗きもの、血の流れより赤きもの

黄昏より暗きもの、血の流れより赤きもの

自分の好きな事を好きなように書いて行きます。

標本値の平均、分散、標準偏差の求め方

問題


nを自然数とする。このときΣをΣ(1<=k<=n) x_k = x_1 + x_2+......+ x_nとN個の要素の和(合計)として定義する。ここでN個の標本X_1,X_2,X_3,X_4,.............,X_nからなる母集団がある。このとき各標本値をx_1,x_2,x_3,.......,x_nとしたとき、


平均:E(X) = 1/n *Σ(1<=k<=N) x_k -(1)
分散*1:V(X) = 1/n *Σ(1<=k<=N) {x_k-E(X)}^2 -(2)
標準偏差:δ(X) = √V(X) -(3)


と定義する。このとき、以下の条件の下でE(X),V(X),δ(X)を求める関数をそれぞれ作成せよ。


(i):各標本値x_1,x_2,..........,x_nは配列に格納する物とする。
(ii):各関数の引数は(i)の各標本値が格納された配列を引数とすること。(配列の要素数を引数とする必要がある場合はそれも引数として良い)

プログラムの説明


まず平均から求めよう。平均=合計÷個数なので、E(X) = (x_1+x_2+........+x_n) / nより合計をnで割った物を出力すれば良い。まずは合計を求めよう。合計はfor文内部で各配列の要素を加算していけば良いのであった。それをnで割って平均を得る。


次に分散だが、(2)を見ての通り右辺のE(X)があるので分散を求めるには平均の値を算出する必要がある。今回は(2)の右辺を展開して整理した式、V(X)=E(X^2)-{E(X)}^2を用いて計算していく。ここでE(X^2)= 1/n *Σ(1<=k<=N) {x_k}^2 となり、まずはE(X^2)を求め、次にそこから{E(X)}^2を引いてV(X)を求めている。(3)のδ(X)はsqrt関数を使ってV(X)の平方根を求めれば良い。

ソースコード


PHPソースコードのみここに掲載。C言語ソースコードが見たいと言う場合はこちらを見て欲しい。尚標本数n(配列の長さ)はcount関数を用いて計算している。


実行結果と検証


今回は母集団の各標本値を1に設定して、平均1,分散0,標準偏差0が出力されるか検証していく。下記の実行結果の通りそれぞれ1,0,0と入力されているので問題なく動作している。




後書き


google analisticでブログのアクセス数を見ていたとき、X日間のアクセス数から1日当たり平均してどれだけアクセスが来ているか?を計算したくこのプログラムを組んだ。この場合ならば表計算ソフトの関数一発で済みそうだが、csvファイルを編集する手間を省きたい場合等はプログラムで用意しておいた方が良さそうだ。又画像処理では赤、緑、青の画素値(0〜255)毎の平均や標準偏差を求める事もあり、プログラムで出力した方が楽な場合もある。

*1:分散:標本値の分布が平均からどれだけ散らばっているかを示す値