- ベストアンサー
javascriptで歪度と尖度を求めるコード
- javascriptで配列から歪度と尖度を求めるコードの方法について教えてください。
- 現在は不偏分散を利用して歪度と尖度を求めていますが、よりすっきりしたコードにしたいです。
- javascriptの計算方法が複雑なため、コピペで使用することが多いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
const arr = [70,71,70,74,75,73,72]; { const add = (a, b) => a + b, sub = (a, b) => a - b, sum = a=> a.reduce (add, 0), average = a=> sum (a) / a.length, devsq = (a, b = average (a))=> sum (a.map (c=> sub (c, b) ** 2)), vara = a=> devsq (a) / (a.length - 1), stdev = a=> vara (a) ** .5, skewness = (a, b = average (a), c = stdev (a), d = a.length)=> sum (a.map (e=> (sub (e, b) / c) ** 3)) * d / ((d-1)*(d-2)), kurtosis = (a, b = average (a), c = stdev (a) ** 4, d = a.length, e = d*(d+1)/((d-1)*(d-2)*(d-3)), f=3*((d-1)**2)/((d-2)*(d-3)))=> sum (a.map (g=> sub (g, b) ** 4 / c - f)) * e; console.log("不偏分散", vara(arr)); console.log("歪度", skewness(arr)); console.log("尖度", kurtosis(arr)); } 回答がないようですね。 あっているか不明。 尖度においてSD値が4乗になっていない
その他の回答 (1)
- babu_baboo
- ベストアンサー率51% (268/525)
#1 です。 式の展開を勘違いしてた。 4乗の件も勘違い。 すまぬ! const add = (a, b) => a + b, sub = (a, b) => a - b, sum = a=> a.reduce (add, 0), average = a=> sum (a) / a.length, devsq = (a, b = average (a))=> sum (a.map (c=> sub (c, b) ** 2)), vara = a=> devsq (a) / (a.length - 1), stdev = a=> vara (a) ** .5, skewness = (a, b = average (a), c = stdev (a), d = a.length)=> sum (a.map (e=> (sub (e, b) / c) ** 3)) * d / ((d-1)*(d-2)), kurtosis = (a, b = average (a), c = stdev (a) ** 4, d = a.length)=> sum (a.map (g=> (sub (g, b) ** 4) / c)) * d*(d+1)/((d-1)*(d-2)*(d-3)) -3*((d-1)**2)/((d-2)*(d-3)); console.log("不偏分散", vara(arr)); console.log("歪度", skewness(arr)); console.log("尖度", kurtosis(arr));
補足
ありがとうございます。計算結果 不偏分散 3.8095238095238098 歪度 0.2881954902926226 尖度 -1.4463749999999966 となり 私の計算とは違い 3.2653061224489797,0.2881954902926226,-1.4463749999999962 不偏分散ではなく標本分散が示されています。
お礼
間違えた私の方が標本分散を示すようにしていた. 大変失礼しました。 再度の解答有り難うございます。
補足
ありがとうございます。 尖度についてですが >尖度においてSD値が4乗になっていない とありますが、ExcelのKURT関数や参考にしたサイト(https://lookbackmargin.blog/2019/11/13/stats-in-js/)の方法で求めた結果 -1.446375 に対し 尖度 -13.686374999999998 となりました。もう一度確認してみます。 今回、この質問した後私の例を使いWebView2で動作させたところ動かない事が分かり書き換えて動くまでするのにかなり時間が掛かりました(但しそのコードが正しいかも分かりませんが・・)。 またも実感したのがたとえブラウザで動いてもjsのコード書き方をきちんと理解していないコピペではすぐ限界に行き着くことでした。・・・今までこれの繰り返しでしたが 取りあえずお礼まで