simple-statistics は、統計分野の JavaScript ライブラリです。次のような分野で多くの関数を提供しています。
https://simple-statistics.github.io/docs/
JavaScript の関数として提供されますので、JavaScript と混在して利用することができます。
head 部に
<script src='https://unpkg.com/simple-statistics@7.8.8/dist/simple-statistics.min.js'></script>
を記述することにより、上述の関数群を JavaScript 内に記述できます。
その関数名には、simple-statistics での関数であることを示して他のライブラリの関数と区別するために「ss.」のプレフィックスを付けます。
例
<head>
<script src='https://unpkg.com/simple-statistics@7.8.8/dist/simple-statistics.min.js'></script>
</head>
<body>
<script>
function init() {
var xmin = ss.min([10, 20, 30, 40, 50]);
alert(xmin);
}
</script>
</body>
あまりにも多くの関数がありますが、ここでは私の都合でほんの一部だけを掲げています。
・私が使うであろう基本的なもの
・私に機能が理解できるもの
・使い方がわかりテストして納得したもの
すなわち、私の忘備録(早見表)の性格になっています。
最小値 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 を用いるほうが使いやすいように思います。