[Javascript] 一次元配列から最大値、最小値、平均、合計、分散、標準偏差を算出する

記事
IT・テクノロジー

はじめに

最近、Javascriptメインの統計に関する案件依頼があり、その際に使用した必要最低限の統計解析セットを紹介します。

なお、分散及び標準偏差に関しましては、公式も含めこちらでの解説は割愛します。あくまでもJavascriptのコードの紹介となります。

また、分散と標準偏差以外はワンライナーの関数式となり、それぞれ独立で利用可能です。

前提として、共通の引数として使用する一次元配列は以下とします。
const array = [10,15,20,5,35,25,30];

■最大値

コードレビューした際、よくfor文forEachで順次確認するロジックを見かけます。降順にソートしたものの先頭が最大値になります。
const max = arr => arr.sort((a,b) => b-a)[0];
console.log(max(array));
// 35

■最小値

最大値と逆の考え方です。昇順にソートしたものの先頭が最小値となります。
const min = arr => arr.sort((a,b) => a-b)[0];
console.log(min(array));
// 5

■合計

array.reduceは配列のそれぞれの要素に対して、順次ユーザー定義のコールバック関数を実行し、その処理によって配列の各値を一つの値にまとめます。この説明では分かりづらいですが、配列要素の合計を求めるのはこのメソッドの基本形です。
const sum = arr => arr.reduce((a,b) => a+b);
console.log(sum(array));
// 140

■平均値

説明するまでもないのですが、合計を要素数で除算すれば平均値を算出できます。
const avr = arr => arr.reduce((a,b) => a+b)/arr.length;
console.log(avr(array));
// 20

■分散

array.mapを使って「(値-平均値)の2乗」の配列を生成した後、array.redduceで合計を出し、さらに配列の要素数で除算するロジックが散見されます。以下のようにarray.reduceのみでも計算できます。
const variance = arr => {
    const avr = arr.reduce((a,b) => a+b)/arr.length;
    return arr.reduce((a,c) => (a + ((c - avr) ** 2)),0)/arr.length;
};
console.log(variance(array));
// 100.0

■標準偏差(母集団標準偏差)

分散の平方根ですから、Math.sqrtを使用します。
const stdev = arr => {
   const avr = arr.reduce((a,b) => a+b)/arr.length;
   const Var = arr.reduce((a,b) => (a + ((c - avr) ** 2)),0)/arr.length;
   return Math.sqrt(Var);
};
console.log(max(array));
// 10.0

// varianceが既に定義されていれば、以下のようにワンライナーで記述できます。
const stdev = arr => Math.sqrt(variance(arr));

最後に

統計関連の案件はスプレッドシート+GAS、もしくは数式設定であることがほとんどです。レアな内容でしたので誰かのお役に立てば幸いです。

[追記] 2022.06.27
分散のコードの一部に誤植があったため修正しました。
また、最大値、最小値についてはMathオブジェクトのメソッドを使用すればもっとシンプルに記述できますので補足しておきます。

const max = Math.max(...arr);
console.log(max);
// 35

const min = Math.min(...arr);
console.log(min);
// 5

CSSを含めたフロントエンドの表示・動作不具合の解析も行います
以下サービスよりご相談受付けております。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す