標準偏差をJavascriptを使って自動で取得する方法
大学の統計の授業で標準偏差を求める内容があったのですが、いちいち計算するのが面倒だったのでJavascriptに計算を任せることにしました。その中でいくつか新しいメソッドを学んだのでやり方を軽く載せておきます。
今回のコードで取得できる値は
平均・分散・標準偏差になります。
使用するメソッドはreduce(), map(), sqrt()の三つです。
最初からまとめて標準偏差を出すコードもかけるのですが、後から見てもわかりやすいように細かく分けてあります。
データのサンプルとして、実際に課題で使ったものを使用していきます。
dataset: 288.02, 230.60, 216.85, 243.74, 236.96, 288.57, 311.20, 370.23, 368.57, 301.79,271.99, 298.12
これらのデータを配列に入れておきます。
const dataset = [288.02, 230.60, 216.85, 243.74, 236.96, 288.57, 311.20, 370.23, 368.57, 301.79, 271.99, 298.12];
// データの順番は適当でOK
1. 平均を求める
まずデータの合計を求めるためにreduce()というメソッドを使います。
実際のコードはこんな感じです。
/*データの合計を求める */
const sum = dataset.reduce((a, b) => {
return a + b;
});
reduce()のコールバック関数の一つ目の引数(今回はa)は"accumulator"の役割を持っています。ざっくり言うとデータを保管しておくものです。
accumulatorの初期値(initialValue)が設定されていない場合は配列の最初のデータが入ります。
今回は初期値を設定していないため、配列の一番最初の"288.02"が入っていると考えてください。(a = 288.02)
二つ目の引数(今回はb)は"currentValue"といってこれから処理されるデータのことです。配列の2番目のデータが入ります。(b = 230.60)
そしてa+bの結果として返された値がaccumulatorに入れられます。
(accumulator = a = 288.02 + 230.60)
全ての配列要素がcurrentValueに入り、計算されるまでreduce()のコールバック関数は実行されます。
そのためreduce()を使うことで配列データの合計が出せます。
以下の図を見るとreduce()の流れが分かりやすいと思います。
https://developer.mozilla.org/en-us/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
引用元: MDN Web Docs
データの合計を求めたので、これをデータ数で割り平均を求めます。
平均を求めるコードはこんな感じです。reduce()に比べたら楽勝です。
const average = sum / dataset.length;
2. 分散を求める
分散を求めることが一番面倒くさいですが、コードで書くととても簡単に求められるようになります。
分散を求めるにはmap()というメソッドを使っていきます。
実際のコードはこんな感じです。
const deviation = dataset.map((a) => {
const subtract = a - average; /*平均との差 */
return subtract ** 2;
});
map()は配列の要素全てに対して関数を実行し、その結果を新しい配列に入れていきます。
今回はmap()のコールバック関数において、以下の処理をしています。
1. それぞれのデータと平均の偏差を求め、その結果を二乗する。
2.二乗した結果を新しい配列に入れていく。
よって変数deviationはそれぞれのデータの偏差の二乗が入った配列になっています。
次にdeviationに入った要素の合計を求めます。これは先ほど使ったreduce()で求めていきます。
実際のコードはこんな感じです。
const deviationSum = deviation.reduce((a, b) => {
return a + b
});
変数deviationSumを'データ数−1'で割ることで分散を計算します。(与えられたデータがサンプルデータだったため)
実際のコードはこんな感じです。
const variance = deviationSum / (dataset.length - 1); //サンプルデータの場合
最後に標準偏差を求めていきます。
3. 標準偏差を求める
一番面倒な分散を求めたので、あとは分散の平方根を求めるだけになります。
平方根を求めるためにはsqrt()メソッドを使用します。
実際のコードはこんな感じです。
const standardDiviation = Math.sqrt(variance);
//平方根を取得し、標準偏差を求める
sqrt()は引数の平方根を返します。今回は変数varianceに入った分散の平方根、つまり標準偏差を返しています。
これで一通り標準偏差を求めるコードが完成です。
下記に全てのコードをまとめたものを貼っておきます。datasetの配列の中身を変えるだけで標準偏差が求められるはずです。
const dataset = [288.02, 230.60, 216.85, 243.74, 236.96, 288.57, 311.20, 370.23, 368.57, 301.79, 271.99, 298.12];
const sum = dataset.reduce((a, b) => {
return a + b;
});
const average = sum / dataset.length;
const deviation = dataset.map((a) => {
const subtract = a - average;
return subtract ** 2;
});
const deviationSum = deviation.reduce((a, b) => {
return a + b
});
const variance = deviationSum / (dataset.length - 1);
const standardDiviation = Math.sqrt(variance);
今回はひとつひとつの工程に細かく分けて書いたので少々長くなっていますが、もっとまとめて書きたい方はググってみてください。
最後まで読んでいただきありがとうございました。