スタートページJavascript

simple-statistics 統計パッケージ


simple-statistics 紹介

simple-statistics は、統計分野の JavaScript ライブラリです。次のような分野で多くの関数を提供しています。

JavaScript の関数として提供されますので、JavaScript と混在して利用することができます。

利用法

head 部に
   <script src='https://unpkg.com/simple-statistics@7.7.0/dist/simple-statistics.min.js'></script>
を記述することにより、上述の関数群を JavaScript 内に記述できます。
 その関数名には、simple-statistics での関数であることを示して他のライブラリの関数と区別するために「ss.」のプレフィックスを付けます。

本ページの内容

あまりにも多くの関数がありますが、ここでは私の都合でほんの一部だけを掲げています。
  ・私が使うであろう基本的なもの
  ・私に機能が理解できるもの
  ・使い方がわかりテストして納得したもの
すなわち、私の忘備録(早見表)の性格になっています。


基本的な配列関数

最小値 x = ss.min(v)
 JavaScript の Math.min は2変数の比較ですが、ss.min はベクトル中の最小値を求めます。
    ss.min([10, 20, 30, 40, 50]);   // 10

最大値 x = ss.max(v)
    ss.max([10, 20, 30, 40, 50]);   // 50

合計 x = ss.sum(v)
    ss.sum([10, 20, 30, 40, 50]);   // 150

平均 x = ss.mean(v)
    ss.mean([10, 20, 30, 40, 50]);  // 30

調和平均 x = ss.harmonicMean(v)
    ss.harmonicMean([10, 20]);      // => 13.33

幾何平均 x = ss.geometricMean(v)
    ss.geometricMean([1, 2, 4]);   // 2

対数平均 x = ss.geometricMean(v)
    ss.logAverage([10, 100, 1000]); // => 100

範囲 v = ss.factorialt(v)
    ss.extent([7, 2, 5, 9, 4, 1, 10, 6, 8, 3]); // => [1, 10]

中央値 x = ss.median(v)
    ss.median([7, 2, 5, 9, 4, 1, 10, 6, 8, 3]); // =>5.5

分位値 v ss.quantile(v, p)
  p: 小さいほうから割合pのvの値、x でも v でもよい
    ss.quantile([7, 2, 5, 9, 4, 1, 10, 6, 8, 3], 0.5);         // 5.5
    ss.quantile([7, 2, 5, 9, 4, 1, 10, 6, 8, 3], 0.2);         // 2.5
    ss.quantile([7, 2, 5, 9, 4, 1, 10, 6, 8, 3], [0.2, 0.5]);  // [2.5, 5.5]

四分位範囲 x = ss.interquartileRange(v)
 第3四分位数と第1四分位数の差
    ss.interquartileRange([7, 2, 5, 9, 4, 1, 10, 6, 8, 3]); // =>5

最頻値 x = ss.mode(v)
    ss.mode([1, 1,  2, 2, 2,  3, 3,  4, 4,  5]); // =>2

歪度 x = ss.sampleSkewness(v)
    ss.sampleSkewness([1, 1,  2, 2, 2,  3, 3,  4, 4,  5]); // =>0.334

累乗 x = ss.product(v)
    ss.product([1, 2, 3, 4]); // => 24

階乗 x = ss.factorialt(v)
    ss.factorial(4); // => 24

基本統計量

分散(自由度=n)x = ss.variance(v)
    ss.variance([10, 20, 30, 40, 50]);                 // 200

標準偏差(自由度=n)x = ss.standardDeviation(v)
    ss.standardDeviation([10, 20, 30, 40, 50]);        // 14.14

標本分散(自由度=n-1)x = ss.sampleVariance(v)
    ss.sampleVariance([10, 20, 30, 40, 50]);           //250

標本標準偏差(自由度=n-1)x = ss.sampleStandardDeviation(v)、 
    ss.sampleStandardDeviation([10, 20, 30, 40, 50]);  // 15.81

変動係数 x = ss.coefficientOfVariation(v)、
  平均に対する標準偏差の比率
    ss.coefficientOfVariation([10, 30, 20, 50, 40]);   // 0.527

中央絶対偏差 x = ss.medianAbsoluteDeviation(v)
    ss.medianAbsoluteDeviation([10, 20, 30, 40, 50]);  // => 10

二乗平均平方根 x = ss.rootMeanSquare(v)
    ss.rootMeanSquare([10, 20, 30, 40, 50]);           // 33.16

相関 x = ss.sampleCorrelation(v1, v2)
    ss.sampleCorrelation([1, 2, 3, 4, 5], [10, 30, 20, 50, 40]);  // 0.8

共分散 x = ss.ampleCovariance(v1, v2)
    ss.sampleCovariance([1, 2, 3, 4, 5], [10, 30, 20, 50, 40]);   // => 20

統計分布

累積標準正規確率 p = cumulativeStdNormalProbability(z)
  -∞<x<zの確率面積
    ss.cumulativeStdNormalProbability(0):  // 0.5
    ss.cumulativeStdNormalProbability(2):  // 0.977
    ss.cumulativeStdNormalProbability(3):  // 0.998

プロビット z = ss.probit(p)
  累積標準正規確率の逆でZを与えてpを戻す。
    ss.probit(0.5);    // 0
    ss.probit(0.99);   // 2.321

正規分布誤差関数 p = errorFunction(z)
  0<x<zの確率面積(x<0とすると負の値になる)
    ss.errorFunction(0); // 0
    ss.errorFunction(2); // 0.995

逆正規分布誤差関数 z = ss.inverseErrorFunction(p)
    ss.inverseErrorFunction(0);  // 0
    ss.inverseErrorFunction(0.99);  // 1.816

二項分布 v = ss.binomialDistribution(試行数、確率)
  サイコロを3個投げたとき1の目が出る確率
    ss.binomialDistribution(3, 1/6);
        // [0.579, 0.347, 0.069, 0.005]
        //  0個  1個 2個  3個 が1の目になる確率

ポアソン分布 v = poissonDistribution(λ)
  平均発生頻度がλのとき発生頻度がXになる確率P(x)を求める。その確率が0に近くなったら打ち切る
    ss.poissonDistribution(2);
        //   [0.135, 0.271, 0.271, 0.180, 0.090, 0.036, … ]
        //  x=  0      1      2      3      4      5

検定


t検定(母平均との検定) p値 = ss.tTest(配列、推定母平均値)
    配列から計算される標本平均が推定母平均値であるとしてよいかの検定
  pの絶対値が小ならば一致。大なら不一致
    ss.tTest([10, 20, 30, 40, 50], 30); // 0
    ss.tTest([10, 20, 30, 40, 50], 31); // -0.158
    ss.tTest([10, 20, 30, 40, 50], 25); // 0.790

t検定(2つのサンプルの平均の差)p値 = ss.tTestTwoSample(v1, v2, diff)
  diff = 0(両側), 1(上側), -1(下側)
    ss.tTestTwoSample([1, 2, 3, 4, 5], [1, 2, 3, 4, 5], 0);        // 0        差がない
    ss.tTestTwoSample([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], 0);   // -3.799   差がある
    ss.tTestTwoSample([1, 2, 3, 4, 5], [2, 2, 3, 5, 5], 0);        // -0.408   差があるか
    ss.tTestTwoSample([1, 2, 3, 4, 5], [2, 2, 3, 5, 5], 1);        // -1.429   大きいといえるか
    ss.tTestTwoSample([1, 2, 3, 4, 5], [2, 2, 3, 5, 5], -1);       //  0.612   小さいといえるか

χ2適合度検定  b = chiSquaredGoodnessOfFit(v, 分布タイプ, 危険率)
  data がtypeの分布に危険率pで適合しているかを ture.false で返す

data = [
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     2, 2, 2, 2, 2, 2, 2, 2, 2, 
     3, 3, 3, 3
];
x = ss.chiSquaredGoodnessOfFit(v, ss.poissonDistribution, 0.05); // false

機械学習

k-meansクラスタリングや単層のパーセプトロンなど機械学習の分野のライブラリがありますが、simple-statistics 単独ではなく、他のライブラリとの連携が必要(らしい)ので、ここでは割愛します。私の感じでは、Python や R を用いるほうが使いやすいように思います。