はじめに
以前から、サウナ中の心拍や各フェーズの時間をもとに、TotonoiScore というスコアを算出しています。
前回までの記事はこちらです。
TotonoiScore は、ユーザーの主観評価ではなく、ログから取得できる客観データをもとに算出する指標として設計しています。
サウナ巡りを続けてデータが蓄積していく中で、当初の想定とは少し違うスコアの出方が見えてきました。
現状でも一定の傾向は見えていましたが、スコアとしてより扱いやすくするには、計算ロジックを見直した方がよさそうです。
この記事では、どこに違和感があったのか、どのように計算方針を変えたのか、そして結果がどう変わったのかをまとめます。
きっかけ:ログが増えて見えてきた違和感
サウナ巡りを続けてログが増えてくると、1回ごとのスコアだけでなく、複数回分のスコア分布を見ることができるようになりました。
そこで気になったのが、TotonoiScore の出方です。
当初のロジックでは、構成要素のうち回復系のスコアが高く出やすく、総合スコアも高得点側に寄りやすい傾向がありました。
そこで各要素のバランスを見直し、単純な加重平均に近い形も試しました。
しかし今度は、総合スコアが全体的に渋くなりすぎる問題が出てきました。
例えば、100点満点のスコアとして表示しているにもかかわらず、90点以上がほとんど出ない状態になると、ユーザー視点では少し物足りなく見えます。
TotonoiScore は客観データから算出する指標ですが、アプリ上ではスコアと円グラフで表示するため、数値の出方そのものもユーザー体験に大きく影響します。
そのため今回は、単にスコアを上げ下げするのではなく、各構成要素のバランスと、セット単位 / セッション単位でのスコアの扱いを見直すことにしました。
見直したポイント
今回の見直しでは、TotonoiScore を単純に高くする・低くするのではなく、スコアの構成そのものを整理しました。
まず、セット単位のスコアとセッション単位のスコアを分けて考えることにしました。
1セットごとの状態と、1回のサウナ全体としての状態は少し意味が異なります。
以前の計算では、セット数が多くなるほど、どうしてもスコアが低かったセットの影響を受けやすくなることがありました。
もちろん、悪かったセットを完全に無視するべきではありませんが、1セットだけ崩れたことでセッション全体の評価が大きく下がりすぎるのも少し違うと感じました。
そのため、セットスコアでは Depth / Speed / Stability の各要素から、そのセット単体の状態を評価します。
一方で、セッションスコアでは全セットの平均だけを見るのではなく、その日の中でスコアが最も高かったセットも一部反映するようにしました。
また、Stability については、他の要素と同じような加点要素として扱うのではなく、休憩中の安定性が大きく崩れた場合に減点する要素として扱う方針にしました。
これにより、Depth / Speed が十分に高いセットでは高スコアに届きやすくしつつ、Stability が低い場合にはきちんとスコアへ反映されるようにしています。
新しい計算方針
今回の見直しでは、TotonoiScore を「セットスコア」と「セッションスコア」に分けて考えることにしました。
セットスコアは、1セットごとの状態を評価するスコアです。
ここでは、Depth と Speed を主軸にして、そのセットで十分な負荷がかかり、回復に切り替わっているかを見ます。
一方で、Stability は加点要素というより、休憩中の安定性が大きく崩れた場合の減点要素として扱うことにしました。
これにより、Depth / Speed が十分に高いセットでは高スコアに届きやすくしつつ、休憩中のブレが大きい場合にはスコアを下げるようにしています。
セッションスコアは、1回のサウナ全体を評価するスコアです。
ここでは全セットの平均を基本にしながら、その日の中で最も高かったセットスコアも一部反映するようにしました。
具体的には、全セット平均をベースにしつつ、最高セットとの差分の一部を加える形にしています。
また、低スコアのセットがある場合は軽いペナルティを入れ、悪かったセットを完全には無視しないようにしました。
この形にすることで、全体の安定性を見つつ、「その日の中でスコアが高かったセット」も総合スコアへ反映できるようにしています。
結果
今回の見直しでは、手元のログデータを使って計算結果を確認しました。
検証に使用したデータは以下です。
| 対象 | 件数 |
|---|---|
| セッション数 | 25 |
| 有効セット数 | 97 |
まだ十分に大きなデータとは言えませんが、スコア分布の傾向を見るにはある程度参考になる件数です。
今回の見直しでは、最終的に以下の方針にしました。
- セットスコアは、Depth / Speed を主軸にして Stability を減点要素として扱う
- セッションスコアは、全セット平均を基本にしつつ、最高セットとの差分の一部を反映する
いくつかの計算方式をシミュレーションした結果、単純平均だけでセッションスコアを出すよりも、最高セットを一部反映した方が、スコア分布としては自然になりました。
実データで確認したセッションスコアの分布は以下です。
| 条件 | 割合 |
|---|---|
| スコア90以上 | 8.0% |
| スコア80以上 | 32.0% |
| スコア70以上 | 60.0% |
| スコア60未満 | 16.0% |
90点以上はレアですが、現実的に出るようになりました。
また、80点以上も約3割程度となり、100点満点のスコアとして見たときに、高スコア帯のセッションが判別しやすい分布になっています。
一方で、60点未満はまだ少し多めに残っています。
ただ、低スコアになっているセッションを見ると、複数セットでスコアが低かったり、Depth / Speed のどちらかが大きく落ちていたりするケースが多く、単純に救済すればよいというものでもありませんでした。
そのため、現時点ではこの分布を採用しつつ、今後ログが増えた段階で再度確認する方針にしています。
おわりに
今回は、TotonoiScore の計算ロジックを見直しました。
ログが増えてくると、単発のスコアだけでは見えなかった分布の偏りや、セット単位 / セッション単位での扱いの違いが見えてきます。
特に今回は、単純にスコアを高くする・低くするのではなく、1セットごとの評価と、1回のサウナ全体としての評価を分けて考えることが重要だと感じました。
まだ検証データは 25セッション / 97セット と多くはないため、今回のロジックが最終形というわけではありません。
今後はさらにログを増やしながら、スコア分布や低スコア帯の扱いを確認していく予定です。
とはいえ、そろそろ一人で集められるデータ量にも限界が見えてきました。
より多くのパターンで検証するには、今後はデータ収集の方法も考えていく必要がありそうです。
もちろん、まだまだサウナ巡りも必要です。
これはあくまでフィールドワークです(笑)
今後は、単にスコアを表示するだけでなく、「どの要素がスコアに影響したのか」や「次回どうすればよくなるか」まで分かるようにしていきたいです。