評価指標の評価と整理

2026-09-07 · 技術版 · 簡易版は 「ランキングの良さはどうすれば測れる?」

ランキング方式の優劣を決めるために使う「評価指標」を、その指標自体が信用できるかという観点で検証し、6 つの軸で整理した記録です。定義、測り方、結果の数表、再現手順を書きます。実データへの適用は 「実データでの方式比較」 に分けました。前提として、勝率をロジスティック関数で表す Bradley-Terry モデルと、t 検定・順位相関の基本を知っていれば読めるように書きました。数式には毎回、日本語の読み下しを添えます。

概要
目次
  1. 何を決めたいのか
  2. 指標の定義
  3. 指標を評価する 6 つの軸と、それぞれの測り方
    1. 妥当性: 指標で選ぶと、本当に良い方式を選べるか
    2. 検出力: 小さな差に気づけるか
    3. 検出力 (条件付き): 実力帯に絞ったときも信号が残るか
    4. シーディングバイアス: シードを組んだ側に甘くないか
    5. 解釈性: 説明なしで通じるか
    6. 集計の癖: 平均の取り方で答えが変わらないか
  4. 結果: 指標ごとの性質
    1. 妥当性
    2. 検出力 (全体)
    3. 検出力 (帯内)
    4. シーディングバイアス
    5. 部分的なランキングの扱い
    6. まとめの表
    7. 採用しなかった指標と、その理由
  5. 再現手順

1. 何を決めたいのか

決めたいのは「ランキング方式 A と B のどちらが良いか」です。ここで「良い」とは「まだ起きていない大会の結果をよく当てる」ことです。

手順はこうです。ある大会が始まる直前の時点までの結果で方式 A を計算し、参加者を並べてシード (1 位、2 位、…の予想) を作ります。その予想を、大会の最終順位と各試合の勝敗に突き合わせて 1 つの数にします。この数が評価指標です。方式 B でも同じ大会で同じことをして、大会ごとに差を取ります。

ここで困るのは、指標は「予想と結果の一致度」であって、本当に測りたい「予想と真の強さの一致度」ではないことです。真の強さは現実では見えません。そこで、真の強さを最初から決めた合成世界 (別記事) を使って「指標は真の強さの一致度の代わりになるか」を確かめ、その結果を踏まえて実データを読みます。

2. 指標の定義

記号は、シード \(s_i\) (選手 \(i\) の予想順位、1 始まり)、最終順位 \(p_i\)、参加者数 \(n\)、試合の勝者 \(w\) と敗者 \(l\) です。指標は 1 大会ごとに「合計と件数」を出し、複数大会では合計を合計で割ってまとめます (大会ごとの平均は取りません。理由は 3.6 節)。

最終順位を見る指標 (順位系)

試合の勝敗だけを見る指標 (勝敗系)

アップセット (シードが下の側が勝つこと)の大きさを見る指標

実装は experiments/metrics/seed_metrics.py です。

3. 指標を評価する 6 つの軸と、それぞれの測り方

合成世界には約 10 種類の方式が入っています。各方式について「予想の並びと真の強さの並びが一致した 2 人組の割合」を計算し、これを真の品質 \(g\) と呼びます。これが正解の順位表です。

3.1 妥当性: 指標で選ぶと、本当に良い方式を選べるか

測り方: 方式を指標の値で並べた順と、真の品質 \(g\) で並べた順が、どれだけ同じかを Spearman の順位相関で見ます (低いほど良い指標は符号を反転してから)。1.0 なら完全に同じ順です。方式が 10 個しかないので、1 段入れ替わるだけで約 0.98 になる粗い量です。条件を変えた 23 の世界で計算し、平均と最小値を見ます。平均が良くても特定の世界で崩れる指標は使えないので、最小値のほうが大事です。

3.2 検出力: 小さな差に気づけるか

考え方: 指標は大会ごとに運で揺れます。知りたい差がその揺れより小さいと、いくら大会を集めても「誤差の範囲」にしかなりません。揺れに対して差がどれだけ大きく出るかが検出力です。

測り方: 真の強さの並びにノイズを混ぜた「少し悪い予想」を作ります。 \[s_\varepsilon = \operatorname{rank}(\theta + \varepsilon z), \quad z \sim N(0,1)\] 読み下し: 真の強さ \(\theta\) に大きさ \(\varepsilon\) の乱数を足して並べ直す。\(\varepsilon\) が 0 なら完璧な予想で、\(\varepsilon\) が大きいほど悪い予想です。この予想の真の品質は式で分かります。 \[g(\varepsilon) = \frac12 + \frac{1}{\pi}\arcsin\frac{1}{\sqrt{1+\varepsilon^2}}\] \(\varepsilon = 0.2\) で 0.937、\(0.4\) で 0.879 です。実際の方式は 0.78〜0.85 なので、\(\varepsilon = 0.2\) は「ほぼ完璧な予想がほんの少し悪くなった」状況です。

完璧な予想と少し悪い予想を、同じ大会の同じ結果で採点し、大会ごとに差 \(D_T\) を取ります (同じ大会で比べるので、大会自体の当たり外れは消えます)。乱数 \(z\) は \(\varepsilon\) を変えても使い回します (乱数の引きの差を混ぜないため)。そして \[t = \frac{\bar D}{\mathrm{sd}(D)/\sqrt{N}}\] 読み下し: 差の平均が、運による揺れの何倍か。\(N\) は大会数で、大会を 4 倍集めると \(t\) は 2 倍になります。だから \(t\) から「同じ差に気づくのに何大会要るか」を \(N^* = N (t^*/t)^2\) で逆算できます (\(t^* = 2\) で五分五分、2.8 で 8 割の確率で気づく目安)。

3.3 検出力 (条件付き): 実力帯に絞ったときも信号が残るか

「上位 8 人の並びだけ」「9 位から 16 位だけ」のように帯で切ると、帯の中の実力差は小さいので、1 大会の順位や勝敗はコイン投げに近づき、どの指標も信号が減ります。減り方が指標で大きく違うので、これも軸にします。測り方は 3.2 と同じ対応付き \(t\) で、帯の中だけで計算します。

3.4 シーディングバイアス: シードを組んだ側に甘くないか

簡易版の記事で「シードバイアス」と呼んでいるものと同じです。

大会の結果は予想と無関係には生まれません。トーナメント表を組んだシードが、誰と誰が当たるか、誰が不戦勝を得るかを決めます。そのため、表を組んだ方式 (とそれに似た方式) は、実力とは別の理由で良く見えたり悪く見えたりします。これを測るのがこの軸です。

測り方 (較正した比較): 方式 \(R\) と「真の品質は \(R\) と全く同じで、表を組んだシードとは無関係に作った並び」を比べます。後者は \(\operatorname{rank}(\theta + \varepsilon z)\) の \(\varepsilon\) を、真の品質が \(R\) と一致するまで二分法で調整して作ります。例えば \(R\) の真の品質が 0.80 なら、無関係な並びの真の品質がちょうど 0.80 になる \(\varepsilon\) を探します。真の品質が同じなので、指標の値の差はまるごと「\(R\) がシードと見誤りを共有していること」の効果です。大会単位の対応付き \(t\) で出し、乱数を変えて平均します。答え合わせとして、無関係な並び同士 (乱数違い) で同じ計算をすると \(t \approx 0\) になることを確認しています。

3.5 解釈性: 説明なしで通じるか

数値化はしませんが、運用上の軸として持ちます。「何回戦ぶんズレたか」「上位側が勝った割合」は通じます。「アップセットの大きさの対数」は説明が要ります。

3.6 集計の癖: 平均の取り方で答えが変わらないか

大会ごとに指標を計算して大会平均を取ると、16 人大会の 1 人が 512 人大会の 1 人の 32 倍の重みを持ちます。SPSP では MASPR について、大会平均と選手単位の集計で方式の優劣の符号が反転したことがありました。以後は選手単位・試合単位の合計でまとめ、対応付き検定だけ大会を単位にしています。

4. 結果: 指標ごとの性質

4.1 妥当性

23 の世界での順位相関の平均です。

指標平均備考
FWR0.985どの世界でも安定
PA0.981
ULG0.972
MASPR0.970
相対順位差 / 対数順位差0.959 / 0.956全大会 100 人以上の世界で 0.63 / 0.49 まで低下
UF0.947
アップセット 1 件あたりの UF0.905ある世界で 0.41 まで低下
確信度 AUC0.889ある世界で 0.08 まで崩壊
全試合の回戦差0.862参加者の偏りやシードの出所を入れた世界で 0.4〜0.6

崩れる指標ほど、現実に近い条件 (実際のランキングでシードした世界) で崩れました。

4.2 検出力 (全体)

\(\varepsilon = 0.2\) の劣化 (真の品質で約 6% 落ち) を 1 世界あたり 171 大会で検出したときの \(|t|\) の 22 世界平均と、必要な大会数の換算 (\(171 \times (t^*/t)^2\)、\(t^* = 2\) と \(2.8\)) です。

指標平均 \(|t|\)五分五分で気づく大会数8 割の確率で気づく大会数
ULG6.71530
PA6.61631
MASPR5.62243
FWR3.94588
アップセット 1 件あたりの UF2.887171
確信度 AUC1.8211414

同じ現実を見ているのに、指標の選び方だけで「1〜2 か月で分かる」と「2 年集めても分からない」に分かれます。逐次検定 (SPRT) で運用した場合、ULG は中央値 16 大会で判定できました。

4.3 検出力 (帯内)

バイアスのない世界 (真の強さでシードした世界) で、真の品質差 4.8 ポイントの 2 方式を、到達順位の帯の中だけで区別したときの \(t\) です。

指標全体1〜8 位17〜32 位33〜64 位65〜128 位129 位以下
MASPR12.39.56.87.43.92.8
ULG11.86.55.43.03.82.7
PA12.74.32.92.71.42.6
FWR8.23.61.1−0.51.90.4

帯の中で信号が残る順は MASPR、ULG、PA、FWR です。勝ち負けだけの FWR は帯で切るとほとんど何も見えなくなります。帯別の分析では ULG を主に使います (次のバイアスに強く、信号も残るため)。

4.4 シーディングバイアス

3 種類の歪みが見つかりました。

(a) 全体の水準が動く。 同じ世界でシードだけを (でたらめ → Elo → 真の強さ) と替えると、どの方式の観測 PA も +0.05〜0.075 上がります。真の品質は誰も変わっていません。シードが正確なほど強い人が守られ、順当な結果になりやすいからです。教訓: シードの質が違う大会群や季の絶対値を比べてはいけません。

(b) でたらめでも少し当たる。 でたらめなシード (真の品質 0.5) の PA は 0.525 です。参加者が 2 のべき乗に足りないとき、不戦勝はシード上位に配られ、不戦勝の選手は最下位の集団に入らないからです。2 のべき乗ちょうどの大会だけで計算すると 0.500 に戻り、不戦勝の多い人数 (11〜13 人) では 0.514 まで上がります。

(c) シードを組んだ側 (と似た方式) が、実力より良く、または悪く見える。 3.4 の較正した比較で、指標の種類ごとに向きが分かれました。

指標の種類\(t\)向き
順位系 (相対順位差, 対数順位差, MASPR, PA)+5.8〜+8.9組んだ側が良く見える
勝敗系と ULG、UF、確信度 AUC−1.6〜+1.9歪まない
生の目盛りのギャップ系 (順位差 (生の目盛り), 全試合の回戦差)−1.7〜−3.5組んだ側が悪く見える

仕組みは「平均への回帰」です。表を組んだ方式が低く見誤った選手ほど極端な枠 (1 位対 64 位) に置かれます。その選手が勝ったとき、組んだ方式の目盛りでだけアップセットの幅が最大になるので、生の目盛りの指標では組んだ側が悪く見えます。逆に順位系では、表がシード上位を守るので最終順位がシードに寄り、組んだ側が良く見えます。勝敗の向きだけを見る指標は、似た方式なら向きの答えがほぼ同じなので歪みません。

表を組む方式を取り替えた 5 つの世界で、各方式の観測 PA が「較正した無関係な並び」よりどれだけ高く出たか (ポイント) です。

採点される方式JJPR でシードSPSP でシード直対単体でシードElo でシード真の強さでシード
JJPR+4.5+2.9+2.3+0.9−0.6
順位評価単体 (tj)+3.5+3.0+2.2+1.0−0.6
SPSP (ens)+2.9+3.3+2.7+1.1−0.4
直対単体 (bt)+2.3+3.0+3.0+1.3−0.3
Glicko-2+1.9+2.0+1.9+1.6−0.4
Elo+2.5

読み方: どの世界でも一番盛られるのは表を組んだ方式で、次にそれに似た方式です。組んだ方式自身の盛られ幅は JJPR > SPSP > 直対単体 > Elo の順で、シードが「大会の順位から直接作られている」ほど大きくなります。真の強さでシードすると誰も盛られません (Glicko-2 が毎回持っていた +1.6〜2.0 の底上げ分まで消えます)。つまり盛られる正体は「シードの見誤りを方式が共有していること」で、見誤りのないシードでは共有しようがない、ということです。

実データへの注意: 日本の大会の実際のシードは、多くが JJPR を基準にスタッフが調整して組まれています。SPSP が表を組んでいなくても、JJPR に似た並びをする方式 (順位評価を含む SPSP もそうです) は順位系の指標で良く見えます。

4.5 部分的なランキングの扱い

UltRank のように上位 K 人しか順位を持たないランキングは、順位のある選手同士の組と試合だけで採点します。比べる相手の方式も、その選手だけを取り出して 1 から並べ直します (シードも最終順位もその中での順位に振り直す)。実データの UltRank 比較 (実データでの方式比較の 2 節) はこの手順で、実装は experiments/metrics/seed_metrics.py の subset 処理です。

絞って測った値は、全参加者で測った値より悪くなります。上位の選手同士は実力差が小さく、当てにくいからです。真の強さでシードした世界 (方式は Glicko-2、37 大会) で、完全なランキングを全参加者で測ると PA 0.810 / FWR 0.718 / MASPR 1.246 / ULG 0.272 ですが、真の強さ上位 200 人の中だけで測ると PA 0.649 / FWR 0.611 / MASPR 1.686 / ULG 0.459 です (experiments/simlab/partial_coverage_check.py)。MASPR・対数順位差・ULG は、絞ると参加者が減ってシード番号が 1 から詰め直されるので目盛りも変わります。どの指標でも、絞った値と絞っていない値を並べて比べてはいけません。

4.6 まとめの表

指標妥当性検出力 (全体)検出力 (帯内)シードの歪み解釈性
PA / \(\tau\)◎◎△良く見える +5〜9◎
MASPR◎○◎良く見える +7〜8◎
対数順位差 / 相対順位差 / \(\rho\)◎◎◎良く見える +8〜9○
ULG◎◎○歪まない△
FWR◎ 最も安定○✕歪まない◎
UF○○計測なし歪まない○
生の目盛りのギャップ系不安定計測なし計測なし悪く見える計測なし
アップセット 1 件あたりの UF / 確信度 AUC世界による計測なし計測なし歪まない計測なし

記号の基準: 妥当性は 4.1 の平均で 0.95 以上を ◎、0.90 以上を ○ とし、特定の世界で 0.5 を下回るものは別に書きました。検出力 (全体) は 4.2 の平均 \(|t|\) で 6 以上を ◎、3 以上を ○、3 未満を △。検出力 (帯内) は 4.3 の帯内 \(t\) の中央値で 6 以上を ◎、3 以上を ○、2 以上を △、2 未満を ✕ としました。

強い軸同士が両立しません。帯の中で信号が残る順位系は歪みが最大で、歪まない FWR は帯の中で無力です。解釈性を除く 4 つの計測軸のすべてで ○ 以上なのは ULG だけでした。ここから運用規則を決めました。

4.7 採用しなかった指標と、その理由

候補に挙げて試したうえで外した指標です。「悪い指標」というより、この用途 (方式の優劣の判定と帯別の分析) に合わなかったものとして書きます。

確信度 AUC
予想が自信を持っている試合 (レート差が大きい試合) ほど順当に終わるか、を測る指標です。方式の中身を見る指標としては筋が良いのですが、方式ごとにレート差の目盛りが違うので、方式同士を並べる用途では妥当性が平均 0.889、ある世界で 0.08 まで崩れました。検出力も最低で、真の品質 6% の差に 8 割の確率で気づくのに 684 大会かかります (4 季 180 大会ではまず無理です)。方式の比較には使わず、1 つの方式の中で「レート差が試合結果をどれだけ説明するか」を見るときだけの指標と位置づけました。
アップセット 1 件あたりの UF
UF の分母を全試合数ではなくアップセットの件数にした版です。「アップセットは少ないが起きると大きい方式」と「小さいアップセットが多い方式」の順序を取り違えます。アップセットを減らすほど分母が減って 1 件あたりが重くなるので、良い方式が罰される向きです。妥当性は平均 0.905、ある世界で 0.41 でした。分母は全試合数に固定します (ULG と UF はそうしています)。
生の目盛りのギャップ系 (順位差 (生の目盛り)、全試合の回戦差)
順位の数字の差や回戦数の差を対数にせずそのまま足す版です。大規模大会の下位の大きな数字に支配されるうえ、4.4 の (c) で見たように、シードを組んだ側が悪く見える向きの歪みを持ちます。全試合の回戦差は、参加者の偏りやシードの出所を入れた世界で妥当性が 0.4〜0.6 まで落ちました。現実に近い条件ほど壊れる指標は使えません。
相対順位差・対数順位差
順位系の中で検出力が高い (4.2 の平均 \(|t|\) で 6.0 と 5.6) のですが、シードの歪みも最大 (+8〜9) で、妥当性もある世界で 0.49 まで落ちました。同じ順位系なら、意味が通じて歪みがやや小さい MASPR と PA を残し、この 2 つは外しました。
順位相関係数 (Kendall の \(\tau\)、Spearman の \(\rho\))
独立した指標ではありません。\(\tau\) は PA の一次変換 (\(\tau = 2\,\mathrm{PA} - 1\))、\(\rho\) は順位差の 2 乗和の単調変換なので、それぞれ PA と相対順位差の行がそのまま当てはまります。相関係数の形にすると 4.4 の歪みが見えにくくなるだけなので、割合や差の形で書く方を採りました。
2 乗版 (MASPR の RMSE、ULG の RMSE)
大きなズレを強く数える版です。実データの全指標での再採点 (5.3) には入れましたが、答えは元の版とほぼ同じ向きで、少数の大きなアップセットに値が引きずられるぶん検定が不安定になります。追加の情報がないので採用していません。
同じ 2 人の再戦を 1 回に数える FWR
同じ大会で同じ 2 人が 2 回当たる (敗者側で再戦する) 試合を 1 回に数える版です。再戦は通常の FWR でも試合数の 1 割程度で、値はほぼ変わらず、検定の \(t\) が小さくなるだけでした。

指標ではなく集計法で外したものが 1 つあります。大会ごとに指標を出してから大会平均を取る方法です。3.6 に書いたとおり、MASPR で方式の優劣の符号が反転した事故があり、以後は選手単位・試合単位の合計に統一しています。

逆に、外さずに役割を限定したものが順位系 (PA、MASPR) です。シードの歪みがあるので優劣の判定には使いませんが、「何回戦ぶんズレたか」「2 人の上下が何割当たったか」は説明なしで通じるので、結果表には必ず併記しています。

5. 再現手順

# 標準評価 (篝火 4 季) のシードダンプ。設定を変えた版は環境変数を付けて同じ手順
SPSP_EVAL_DUMP_SEEDS=~/spsp-eval-dumps/seeds_14_15.jsonl python3 experiments/harness/eval_v4_ultrank_pertour.py 14_15.txt on
# 変えた版と基準の対応付き比較 (全指標の t)
python3 experiments/metrics/seed_metrics_arm.py --base ~/spsp-eval-dumps/seeds_1*.jsonl --arm ~/spsp-eval-dumps/seeds_arm_dk3_*.jsonl --label dk3 --out arm_dk3.json
# 方式比較 (jjpr / Glicko-2 / Elo / 最尤を時系列で学習)、UltRank の期間分割、帯別
python3 experiments/metrics/seed_metrics_methods.py --dump ... --phase jjpr ; ... --phase replay --ckpt ... --max-sec 240
python3 experiments/metrics/seed_metrics_ult_window.py --dump ... --jjpr-cache ... --seeds ...
python3 experiments/metrics/seed_metrics_bands.py --dump ... --seeds ...
# 指標の検証 (合成世界)
sh experiments/simlab/run_all.sh experiments/simlab/configs/basic.json
python3 experiments/simlab/bias_metrics.py --run experiments/simlab/runs/selfens
python3 experiments/simlab/favoritism_by_method.py --run experiments/simlab/runs/jjprseed

実装上の識別子との対応: PA = pair_acc、MASPR = spr_abs、FWR = match_acc、ULG = upset_loggap_per_match、UF = uf_per_match、対数順位差 = logdiff_abs、相対順位差 = rankdiff_rel、確信度 AUC = conf_auc、順位差 (生の目盛り) = upset_gap_rel_per_match、全試合の回戦差 = match_w2wgap_per_match。

レポート本体は experiments/metrics/reports/validated_metrics_202608/REPORT.md です (合成世界の横断レポートとあわせて、現在は非公開)。