きっかけ
ゲームアプリ作ってるときに
「スコアの他に順位や偏差値とか表示したら嬉しくね?」
と思ったので実装しようとした😸
(追記)
JavaScriptの記事を書いたけど
サーバー側で処理したくてPHPで書き直したのでそのコードも載せておく(メソッド分割してない)😿
偏差値を求める
下記のスコアに対する偏差値を表示してみる
// スコア一覧
[10, 30, 50, 70, 80, 100]
プログラム(JavaScript)
// 平均
const average = scores => scores.reduce((acc, current) => acc + current, 0) / scores.length
// 分散
const variance = (scores, avg) => scores.reduce((acc, current) => acc + Math.pow(current - avg, 2), 0) / scores.length
// 標準偏差
const standardDeviation = (scores, avg) => Math.sqrt(variance(scores, avg))
// 偏差値
const standardScore = (score, avg, sd) => (((score - avg) * 10) / sd) + 50
// スコア一覧
const scores = [10, 30, 50, 70, 80, 100]
// 偏差値の表示
const avg = average(scores)
const sd = standardDeviation(scores, avg)
scores.forEach((score, i) => console.log((i + 1) + "番目の偏差値: " + standardScore(score, avg, sd)))
プログラム(PHP)
$scores = [10, 30, 50, 70, 80, 100];
$length = count($scores);
$average = array_sum($scores) / $length;
$sum = 0;
foreach ($scores as $score) {
$sum += pow(abs($score - $average), 2);
}
foreach ($scores as $i => $score) {
$standardScore = ($score - $average) / sqrt($sum / $length) * 10 + 50;
echo ($i + 1) . "番目の偏差値: " . $standardScore . "\n";
}
結果
JavaScript
1番目の偏差値: 34.63300360144335
2番目の偏差値: 41.218859200824774
3番目の偏差値: 47.80471480020619
4番目の偏差値: 54.39057039958762
5番目の偏差値: 57.683498199278326
6番目の偏差値: 64.26935379865975
PHP
1番目の偏差値: 34.633003601443
2番目の偏差値: 41.218859200825
3番目の偏差値: 47.804714800206
4番目の偏差値: 54.390570399588
5番目の偏差値: 57.683498199278
6番目の偏差値: 64.26935379866
実際に使ってみた
正しく計算されてるっぽく見える❗️😸
おわりに
ES6のナウい書き方にしてみた
アロー関数の省略記法で長くなったらどこで折り返しするんだろう...😹
(そもそも折り返したいような場合は省略せずに複数行書くべきなのかも)
あとゼロ除算の考慮とかしてないのでコピって使う場合は気を付けてね😽