こんなコードでどうでしょう.
// data は数値の配列 function calcStatsSummary(data){ // データ数 (サンプルサイズ) を取得 var size = data.length; // 平均を計算 var sum1 = 0; for (var i in data){ sum1 += data[i]; } var mean = sum1/size; // (不偏) 標準偏差を計算 var sum2 = 0; for (var i in data){ sum2 += Math.pow(data[i] - mean, 2); } var SD = Math.sqrt(sum2/(size - 1)); // 歪度と尖度を計算 var sum3 = 0; var sum4 = 0; for (var i in data){ sum3 += Math.pow((data[i] - mean)/SD, 3); sum4 += Math.pow((data[i] - mean)/SD, 4); } var skew = sum3*size/(size-1)/(size-2); var exKurt = size*(size+1)/(size-1)/(size-2)/(size-3)*sum4 - 3*(size-1)*(size-1)/(size-2)/(size-3); // 各種代表値が返り値 return {size: size, mean: mean, SD: SD, skew: skew, exKurt: exKurt}; }
母集団の平均の推定
これについては何も言うことはない.算術平均を知らない人はまずいないでしょうから.
母集団の標準偏差の推定
標本から分散を算出するときは, でなく
で割って不偏分散を計算するほうがよい推定になる.この動画が分かりやすくて詳しい.
理屈が分かると計算するのも楽しいよね.まぁ 導出はこの動画ではしてないから,結局全部分かるわけじゃないけどね.とにかく,不偏分散 (=不偏標準偏差の2乗) はこの式で求まる.
母集団の歪度の推定
歪度を Javascript で計算したい人ってどれくらいいるんだろう… こういうことをしたい人は統計処理に強い言語で作業するんじゃなかろうか.ともかく,推定した不偏標準偏差を使って歪度はこう計算できるらしい.
分母に が登場しますが,これは前に計算した
の正の平方根ですね.いろんな資料に「それぞれの値から標本平均を引いたものを,標準偏差で割って3乗する」と書いてあるけど,ここでいう「標準偏差」が「標本から単純に計算した標準偏差」なのか「不偏分散の正の平方根」なのか判然としない.
このページの最下部の「重要注意」という箇所に書かれてることが参考になった.結論は,正しくは後者.「不偏分散の正の平方根」を使うのがいいみたい.
歪度として、 {N/(N – 1)/(N – 2)} Σ(Xi – m)³/S³ の式を用いているものがあります。 m は平均、S² は分母が N-1 の分散。Σ は i について 1 から N まで合計する意味。この歪度は、与えられた大きさ N の集団の歪度ではなく、この集団を等確率、独立な1群の標本とする母集団の歪度の推定量です。
歪度
母集団の尖度の推定
ここまできたら最後は簡単.この計算で尖度を推定しましょう.
最後に3っぽい数をマイナスしてるのは英語で Excess kurtosis と呼ばれるものを計算している (kurtosis は尖度の意味).超過尖度?日本語で何て言うんだろう.真の分布が既知のときは,単に計算された尖度から3を引いて算出されるのが Excess kurtosis だそうな.
大抵の統計処理の場合には真の分布は未知なので,尖度も推定になる.推定された尖度を Excess kurtosis に修正する際には,単に3を引くのではなく標本サイズを使ったちょっとややこしい式になるそうです.英語の Kurtosis の記事に詳しく書かれてる.
統計のややこしさの理由
今回は標本から母集団における各種統計量を推定するという計算をした.大抵の場合は,知りたいのはそれだと思う.でも標本そのものにおける標準偏差や歪度・尖度を計算することも出来るよね.
計算している量が単に標本に関するデータなのか,それとも母集団に関する推定量なのかを見極める必要がある.それが分かってないと,計算しても混乱するよね.
コメントを残す