NumPy使えよってのはさておき。about:blankでどうにかしちゃう系エンジニア向けの記事です。こんな感じのデータからいろいろ出していきます。あんまり大きいデータをいじる気はないのでパフォーマンスは考えていません。
const arr = [ 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 ]
平均値
const average = data => data.reduce((s,e)=>s + e, 0)/data.length;
console.log(average(arr)); // 3.9
中央値
const median = data => {
const sorted = data.sort((a,b) => {
return a - b;
})
return (sorted[Math.floor(sorted.length/2)] + sorted[Math.floor((sorted.length - 1)/2)])/2
};
console.log(median(arr)); // 3.5
最頻値
const mode = data => [...new Set(data)].reduce((prev, curr) => {
const prevCount = data.reduce((s, e) => s + (e === prev[0] ? 1 : 0), 0);
const currCount = data.reduce((s, e) => s + (e === curr ? 1 : 0), 0);
return (
prevCount < currCount ?
[curr] :
(prevCount === currCount ? [...prev, curr] : prev)
)
}, []);
console.log(mode(arr)); // [ 3, 1, 5 ]
標準偏差
上記average
関数を使います。$\sigma^2 = \bar{x^2}-(\bar{x})^2$という有名等式を使うだけです。
const stDev = data => Math.sqrt(average(data.map(e => e**2)) - average(data)**2);
console.log(stDev(arr)); // 2.3430749027719964
偏差値
average
,stDev
から愚直に求めるだけです。
const devValue = (data, value) => 50 + 10 * (value - average(data))/stDev(data)
console.log(devValue(arr, 3)) // 46.15889360201312
度数表
const frequency = data => data.reduce((prev, curr) => {
prev[curr] = (prev[curr] ?? 0) + 1;
return prev;
}, {})
console.log(JSON.stringify(frequency(arr)));
// {"1":2,"2":1,"3":2,"4":1,"5":2,"6":1,"9":1}