algo-rank-elo について
ペア比較の結果から参加者や項目を順位付けするEloレーティングのスキルです。評価更新、入力検証、結果確認を説明し、単一試合と一括計算用のスクリプトを備えています。
主な機能
- 01ペア結果に基づくレーティング更新
- 02勝敗と引き分けへの対応
- 03Kファクターによる変動幅の調整
- 04レーティング変化のゼロサム検証
- 05単一試合または一括更新の実行
活用シーン
- 01試合結果から選手を順位付け
- 02ペア比較の選好に基づく項目評価
- 03クラウドソーシング比較による品質評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ asgard-ai-platform/ skills --skill algo-rank-eloインストール後、Claude Code で/algo-rank-eloを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples/sample_input.jsonreferences/bradley-terry.mdvariable-k.mdscripts/elo.py詳細
Elo レーティングシステム
概要
Elo は、各ペア比較の後に更新される数値レーティングを割り当てます。勝者はポイントを獲得し、敗者はポイントを失います。交換されるポイント数は、予想された結果と実際の結果によって変わります。もともとはチェス向けに考案されましたが、現在ではスポーツ、ゲーム、A/B の選好テストで使用されています。更新処理は各対戦につき O(1) で実行されます。
使用する場面
適用条件:
- ペア比較データ(A 対 B の結果)から項目をランキングする場合
- ゲームやスポーツ向けの競争型レーティングシステムを構築する場合
- ペア比較による選好を通じて、クラウドソースで品質を評価する場合
使用しない場面:
- ペア比較ではなく絶対スコアがある場合(直接ランキングを使用してください)
- 個人のスキルよりチームの力学が重要な場合(TrueSkill を使用してください)
アルゴリズム
IRON LAW: Elo Assumes Each Matchup Is Independent and Stationary
Rating changes are based on surprise: beating a higher-rated opponent
gains more points than beating a lower-rated one. K-factor controls
update speed: high K (32) = volatile, fast adaptation. Low K (16) =
stable, slow adaptation. Choose K based on how quickly skill changes.
フェーズ 1: 入力検証
すべての参加者を基準レーティング(通常は 1500)で初期化します。対戦結果として、勝者、敗者(または引き分け)を収集します。 ゲート: 対戦データが有効であり、同一参加者同士の対戦がないこと。
フェーズ 2: コアアルゴリズム
- 期待スコア: E_A = 1 / (1 + 10^((R_B - R_A)/400))
- 実際のスコア: S_A = 1(勝利)、0.5(引き分け)、0(敗北)
- 更新: R_A_new = R_A + K × (S_A - E_A)
- すべての対戦を順次処理します(逐次 Elo では順序が重要です)
フェーズ 3: 検証
確認項目: レーティングポイントの合計が保たれていること(ゼロサム)。レーティング分布が妥当であること(データエラーによる極端な値がないこと)。 ゲート: レーティングが保たれており、上位にランクされた項目が妥当性チェックを通過すること。
フェーズ 4: 出力
確信度の指標を付けて、レーティングをソートして返します。
出力形式
{
"ratings": [{"id": "player_A", "rating": 1720, "matches": 50, "wins": 35, "losses": 15}],
"metadata": {"k_factor": 32, "initial_rating": 1500, "total_matches": 500}
}
例
入出力例
入力: プレイヤー A(1500)がプレイヤー B(1500)に勝利、K=32 期待される結果: E_A = 0.5、S_A = 1。R_A_new = 1500 + 32×(1-0.5) = 1516。R_B_new = 1484。
エッジケース
| 入力 | 期待される結果 | 理由 |
|---|---|---|
| 1500 が 2000 に勝利 | レーティングが大幅に上昇(K=32 の場合、約 29 ポイント) | 大きな番狂わせで、予想外の度合いが大きい |
| 2000 が 1500 に勝利 | レーティングがわずかに上昇(K=32 の場合、約 3 ポイント) | 予想どおりの結果で、予想外の度合いが小さい |
| 同レーティング同士の引き分け | 変化なし | 予想された結果と実際の結果が完全に一致 |
注意点
- K ファクターの選択: 大きすぎるとレーティングが変動しやすくなります。小さすぎると実際のスキル変化の反映が遅くなります。参加したばかりの人には大きく、実績のある人には小さくするなど、K を変動させてください。
- 順序への依存: 逐次 Elo のレーティングは、対戦の処理順序によって変わります。バッチ処理には、反復 Elo または Bradley-Terry モデルを使用してください。
- インフレ/デフレ: 参加者が出入りするオープンシステムでは、平均レーティングが変動することがあります。レーティングの下限を設けるか、定期的に較正してください。
- チーム向けに設計されていない: 標準の Elo は 1 対 1 用です。チームの場合は、チームの平均レーティングを使用するか、チーム内の個人の貢献度をモデル化する TrueSkill を使用してください。
- レーティング ≠ 勝率: レーティング差 200 は期待勝率約 76% を意味しますが、実際の結果は状況、調子、運によって変わります。
スクリプト
| スクリプト | 説明 | 使用方法 |
|---|---|---|
scripts/elo.py | ゼロサム検証付きで Elo レーティングを更新します(単一の対戦またはバッチ) | python scripts/elo.py --help |
組み込みの妥当性テストを実行するには、python scripts/elo.py --verify を実行してください。
参考資料
- Bradley-Terry モデル(バッチ Elo)については、
references/bradley-terry.mdを参照してください - K ファクターの変動方式については、
references/variable-k.mdを参照してください