対戦ゲームでランクが上がると手に入るポイントが減り、格上に勝つと一気にレートが跳ね上がる。対戦相手の強さを考慮して実力を数値化する仕組みの正体が、Eloレーティング(イロレーティング)です。
ランキング上位を目指して対戦を重ねるなかで、なぜこの点数が増減したのか疑問に感じた経験はありませんか。
Eloレーティングの計算式は、高校数学レベルの四則演算と指数関数だけで組み立てられています。基本の仕組みさえ掴めば、自作の対戦ゲームや社内の実力比較システムへそのまま組み込めます。
Eloレーティングとは?実力を相対評価する仕組みの基本

Eloレーティングとは、対戦相手との実力差をもとに勝敗結果から実力を推定し、相対的な数値として表す計算手法です。
考案者はハンガリー生まれのアメリカ人物理学者、アルパード・イロ(Arpad Elo)氏。チェスの腕前を正確に格付けする目的で考案され、国際チェス連盟(FIDE)の公認レーティングとして広く普及しました。
[プレイヤーAの実力] ─── 対戦前の差分 ─── [プレイヤーBの実力]
│ │
▼ ▼
Aの期待勝率を計算 Bの期待勝率を計算
│ │
└───────────── 実際の勝敗 ──────────────┘
│
▼
期待値と実際の結果のズレ
│
▼
両者のレーティングを同時に更新
従来の勝率計算は、単純に対戦数と勝利数で割り算するものが主流でした。この手法だと、弱い相手とばかり戦って勝利を稼いだプレイヤーが見かけ上の高勝率を叩き出してしまいます。対戦相手の質を公平に評価できない欠点がありました。
Eloレーティングはこの問題を解決します。「強い相手に勝てば大きく増え、弱い相手に負ければ大きく減る」という重み付けを自動で行うためです。
対戦相手の実力に応じたポイントのやり取りを行うゼロサム構造が、数値のインフレやデフレを防ぎます。現代ではチェスにとどまらず、サッカーの代表チーム格付け、格闘ゲームのオンラインマッチング、さらにはAIモデル同士のブラインド評価まで、幅広い現場で採用されています。
AIを活用した客観的なデータ分析手法について関心がある方は、フリーランスのデータ分析AIベスト5|月3,000円以下で選ぶ (2026年版)も参考になります。
期待勝率を求める計算式|ロジスティック関数を使う理由

対戦を行う前に、両者の現在のレーティング差から「それぞれが勝つ確率」をあらかじめ割り出します。
期待勝率の計算には、次の数式を用います。プレイヤーAのレーティングを$R_A$、プレイヤーBのレーティングを$R_B$と置いたとき、プレイヤーAが勝つ期待確率$E_A$は次のように定義されます。
$$E_A = \frac{1}{1 + 10^{(R_B - R_A) / 400}}$$
同様に、プレイヤーBが勝つ期待確率$E_B$は次の式です。
$$E_B = \frac{1}{1 + 10^{(R_A - R_B) / 400}}$$
分母にある「400」という数値は、チェス連盟が定めたスケール調整用の定数です。両者のレーティング差がちょうど400離れているとき、計算結果がどうなるかを確認してみましょう。
もし$R_A - R_B = 400$であれば、指数部分は$10^{-400 / 400} = 10^{-1} = 0.1$となります。分母は$1 + 0.1 = 1.1$となり、$E_A = 1 / 1.1 \fallingdotseq 0.909$(約90.9%)が導かれます。
| レーティング差 | Aの | Bの |
|---|---|---|
| +0(同格) | 50.0% | 50.0% |
| +100 | 64.0% | 36.0% |
| +200 | 76.0% | 24.0% |
| +400 | 90.9% | 9.1% |
| +800 | 99.0% | 1.0% |
実力差が200開くと勝率は約4分の3に傾き、400開くと下位側が勝つ確率は1割未満まで落ち込みます。
この滑らかなS字曲線を描く関数をロジスティック関数と呼びます。勝率が0%を下回ったり100%を超えたりせず、実力差がどれほど開いても確率として破綻しない性質を持つため、実力判定の土台に選ばれています。
レーティング更新の計算式|勝敗結果を点数に反映する手順
試合が終わったら、実際の結果をもとにレーティングを書き換えます。
更新後の新しいレーティング$R'_A$は、次の計算式で求めます。
$$R'_A = R_A + K \times (S_A - E_A)$$
ここで登場する変数の意味は次の通りです。
- $R_A$: 試合前のプレイヤーAのレーティング
- $K$: 変動幅を調整する定数(K値)
- $S_A$: 実際の試合結果スコア(勝ち=1、引き分け=0.5、負け=0)
- $E_A$: 事前に計算した期待勝率
計算の肝は$(S_A - E_A)$の部分です。ここは「実際の結果」と「事前の予想」のズレを表しています。
予想通りに格上が勝った場合、期待値$E_A$はすでに1に近い値(例えば0.9)です。勝利しても$S_A - E_A = 1 - 0.9 = 0.1$しか手に入りません。
ところが、格下が格上に勝利する番狂わせが起きた場合、格下の期待値$E_B$は0.1程度しかありませんでした。勝利すると$S_B - E_B = 1 - 0.1 = 0.9$となり、大量のポイントを手にします。
敗れた側はまったく同じ計算式により、$S_A - E_A = 0 - 0.9 = -0.9$となり、相手が獲得した点数と全く同額のポイントを失います。系全体の合計点数が常に保存される点が、Eloレーティングの明快な特徴です。
毎週月曜の朝に、今週のAIの主なニュース・新しく載ったツール・よく読まれた記事をまとめて届けます。登録特典は「AIツール選定チェックリスト 2026」。
確認メールのボタンを押すと登録が完了します。配信はいつでも解除できます。
計算の実例|同格対戦とジャイアントキリングでの数値比較
具体的な数値を使って、計算の流れを追ってみましょう。K値を32に固定して2つの対戦シナリオを計算します。
ケース1:実力が拮抗している対戦(レート1500同士)
プレイヤーA(レート1500)とプレイヤーB(レート1500)が対戦し、プレイヤーAが勝利したケースです。
- 実力差の計算: $1500 - 1500 = 0$
- 期待勝率の計算: $$E_A = \frac{1}{1 + 10^{0 / 400}} = \frac{1}{1 + 1} = 0.50\ (50%)$$
- 試合後の更新計算: $$R'_A = 1500 + 32 \times (1 - 0.50) = 1500 + 16 = 1516$$ $$R'_B = 1500 + 32 \times (0 - 0.50) = 1500 - 16 = 1484$$
勝ったAは16ポイント増え、負けたBは16ポイント減りました。互角の対戦では、勝敗によってK値のちょうど半分のポイントが移動します。
ケース2:格下が格上に勝利した対戦(ジャイアントキリング)
プレイヤーA(レート1800)とプレイヤーB(レート1400)が対戦し、格下のBが勝利したケースです。
- 実力差の計算: $1800 - 1400 = 400$
- 期待勝率の計算: $$E_A = \frac{1}{1 + 10^{-400 / 400}} = \frac{1}{1 + 0.1} \fallingdotseq 0.91\ (91%)$$ $$E_B = \frac{1}{1 + 10^{400 / 400}} = \frac{1}{1 + 10} \fallingdotseq 0.09\ (9%)$$
- 試合後の更新計算: $$R'_A = 1800 + 32 \times (0 - 0.91) = 1800 - 29.12 \fallingdotseq 1771$$ $$R'_B = 1400 + 32 \times (1 - 0.09) = 1400 + 29.12 \fallingdotseq 1429$$
番狂わせが起きた結果、プレイヤーBは29ポイントを一気に獲得し、プレイヤーAは同じく29ポイントを失いました。同格の対戦に比べてポイントの移動量が2倍近くに跳ね上がっています。
K値の決め方で何が変わる?収束スピードと安定性のバランス
K値は、1回の対戦で動く最大ポイント数を決定する重み係数です。システム全体の挙動を左右する最重要パラメータです。
K値を大きく設定すると、数試合勝つだけでレートが急上昇します。新規参入者の実力を素早く適正位置まで持ち上げたいときに役立ちます。反面、たまたまの連敗でレートが急落するため、数値が乱高下して安定しません。
K値を小さく設定すると、1試合ごとの変動が小さくなり、レートの信頼性が高まります。しかし、実力が向上しても数値に反映されるまで膨大な試合数をこなさなければなりません。
実務におけるK値の選定基準をまとめました。
| 対象カテゴリ | 推奨K値の | 主な |
|---|---|---|
| 初心者・新規アカウント | 32 〜 40 | 少ない対戦数で適正レートへ素早く収束させるため |
| 一般プレイヤー(通常帯) | 16 〜 24 | 勝敗のブレを抑えつつ、直近の調子を反映させるため |
| ベテラン・上位ランカー | 10 〜 16 | 偶発的な勝敗によるレート急変を防ぎ、格付けを安定させるため |
| LLMブラインド対戦(モデル評価) | 4 〜 8 | サンプル数を数万件集め、微細な性能差を正確に測るため |
国際チェス連盟(FIDE)でも、過去の対戦数が少ないジュニア選手には$K=40$、通常の競技者には$K=20$、一定以上の高レートに達した選手には$K=10$を割り当てる可変方式を採用しています。
システムの目的に応じてK値を段階的に変化させる設計が、レーティングの信頼性を高める近道です。
引き分けが存在するゲームでの計算処理
チェスやサッカーのように、引き分け(ドロー)が発生する競技でもEloレーティングはそのまま適用できます。
引き分け時の勝敗スコアは$S = 0.5$として扱います。
プレイヤーA(レート1600)とプレイヤーB(レート1400)が引き分けた場面を考えてみましょう。事前の期待勝率は、実力上位のAが約76%、格下のBが約24%です。K値を20として計算します。
- 上位側プレイヤーAの更新: $$R'_A = 1600 + 20 \times (0.5 - 0.76) = 1600 - 5.2 \fallingdotseq 1595$$
- 下位側プレイヤーBの更新: $$R'_B = 1400 + 20 \times (0.5 - 0.24) = 1400 + 5.2 \fallingdotseq 1405$$
引き分けであっても、格上のAはポイントを失い、格下のBはポイントを獲得します。格上にとっては「勝って当然の相手に取りこぼした」と判定され、格下にとっては「強豪相手に引き分けに持ち込んだ大健闘」と評価されるためです。
勝敗スコアの定義を次の3値に固定するだけで、引き分け処理をシンプルに完結できます。
- 勝利:$S = 1.0$
- 引き分け:$S = 0.5$
- 敗北:$S = 0.0$
判定基準が明確なため、複雑な例外処理を追加する必要がありません。
400という定数の意味と確率分布の背景
期待勝率の計算式で分母に置かれている「400」という数値に、疑問を持った方もいるはずです。
この数値は、プレイヤーの実力差が正規分布に従うという仮定のもとで、チェスの段位体系と整合性を取るために設定された歴史的数値です。考案者のアルパード・イロ氏は当初、実力のばらつきを標準偏差200の正規分布としてモデル化しました。
後に計算を簡略化するため、正規分布と形状が酷似したロジスティック分布へ置き換えられました。その際、従来のスケール感を維持するために導入された係数が400です。
数学的には、定数400を別の数値に変更してもレーティングシステムとして成立します。例えば分母を「200」に縮めれば、200ポイントの差で勝率約91%が開く、より振れ幅の激しいスケールが完成します。
ゲーム業界やスポーツ界で400が標準として使われ続けている理由は、チェスで培われた「レーティング差と勝率の感覚」が広く認知されているからです。
実力差と勝率の関係を直感的に把握しやすい基準として、400という定数が定着しています。
Eloレーティングが抱える3つの弱点と対策
シンプルで扱いやすいEloレーティングですが、運用規模が大きくなると特有の課題が浮き彫りになります。
【Eloレーティングの構造的課題】
1. レートインフレ / デフレ
└─ 新規参入者の持ち込みと離脱で市場のポイント総量が歪む
2. 時間経過による実力変化の無視
└─ 1年間放置してもレートが維持され、復帰時に不整合が生じる
3. 多人数対戦・チーム戦への非対応
└─ 1対1の前提が崩れると個人の貢献度を分解できない
1. レーティングのインフレーションとデフレーション
Eloレーティングは参加者全体の合計ポイントが保存されるゼロサム構造を前提にしています。しかし、実際のサービスではプレイヤーが新しく参入し、一部が引退して離脱します。
初期レート1500の初心者が、ポイントを上位層に吸い取られた後にゲームを辞めてしまうと、システム全体にポイントが残留して「インフレ」が起こります。逆に、ポイントを持った上級者が離脱すると、全体のポイントが枯渇して「デフレ」に陥ります。
対策として、定期的なシーズンリセットを導入したり、アクティブ率が低いプレイヤーのポイントを徐々に基準値へ回帰させる仕組みが取り入れられています。
2. 放置アカウントの実力乖離
Eloレーティングには「時間の経過」という概念がありません。2年前にレート2000に到達したプレイヤーがゲームを休止し、久しぶりにログインしてもレート2000のままです。
実際のプレイスキルはブランクによって低下している可能性が高いため、復帰戦でマッチングが崩壊します。
この課題を克服するために開発されたのが「Glickoレーティング」です。Glickoではレーティングの数値に加え、「その数値の不確実性(レーティング偏差: RD)」を保持します。対戦を行わない期間が長引くほど不確実性の値が増大し、復帰後の数試合でポイントが大きく変動して現在の適正値へ素早く収束します。
3. 多人数戦やチーム戦への直接適用が困難
Eloレーティングの計算式は、厳密に「1対1の対戦」を想定して作られています。バトルロイヤルのような多人数戦や、5対5のチーム対戦ゲームにそのまま当てはめることはできません。
チーム戦に適用する場合、チーム全員のレーティング平均値を計算して疑似的な1対1対戦とみなすアプローチが取られます。ただし、この方法では個人のキャリー(格出の活躍)や足を引っ張った度合いを区別できません。
多人数対戦やチーム戦の評価には、マイクロソフトが開発した「TrueSkill」などの多変量ガウス分布を用いるアルゴリズムが適しています。
PythonによるEloレーティング計算の実装コード
Eloレーティングの計算は、外部ライブラリを使わず標準機能だけで数行のコードとして実装できます。
実務でそのまま利用できるシンプルな計算スクリプトを掲載します。
def calculate_expected_score(rating_a: float, rating_b: float) -> float:
"""プレイヤーAの期待勝率を計算する"""
return 1.0 / (1.0 + 10.0 ** ((rating_b - rating_a) / 400.0))
def update_elo(
rating_a: float, rating_b: float, score_a: float, k_factor: float = 32.0
) -> tuple[float, float]:
"""対戦結果に基づいて両者のレーティングを更新する
Args:
rating_a: プレイヤーAの現在のレーティング
rating_b: プレイヤーBの現在のレーティング
score_a: プレイヤーAの結果 (勝ち: 1.0, 引き分け: 0.5, 負け: 0.0)
k_factor: 変動幅を調整するK値
Returns:
更新後の(rating_a, rating_b)のタプル
"""
expected_a = calculate_expected_score(rating_a, rating_b)
expected_b = calculate_expected_score(rating_b, rating_a)
score_b = 1.0 - score_a
new_rating_a = rating_a + k_factor * (score_a - expected_a)
new_rating_b = rating_b + k_factor * (score_b - expected_b)
return round(new_rating_a, 2), round(new_rating_b, 2)
# 実行例
if __name__ == "__main__":
player_a = 1600.0
player_b = 1400.0
print(f"試合前: A={player_a}, B={player_b}")
# Aの期待勝率を表示
exp_a = calculate_expected_score(player_a, player_b)
print(f"プレイヤーAの期待勝率: {exp_a:.1%}")
# 格下のBが勝利した場合 (score_a = 0.0)
new_a, new_b = update_elo(player_a, player_b, score_a=0.0, k_factor=32.0)
print(f"Bが勝利した後のレート: A={new_a}, B={new_b}")
このスクリプトを実行すると、事前の期待勝率と、番狂わせが起きた直後のポイント移動がコンソールに出力されます。
試合前: A=1600.0, B=1400.0
プレイヤーAの期待勝率: 76.0%
Bが勝利した後のレート: A=1575.69, B=1424.31
コードの記述量が少なく、依存関係も一切ありません。データベースからプレイヤー情報を取得し、試合結果を書き戻すパイプラインへ容易に組み込めます。
AIを活用したコーディングやシステム開発全体の効率化については、AIコーディングツールやAIエージェントの活用事例も役立ちます。
AI分野での応用|LLMリーダーボードでEloが重宝される理由
Eloレーティングはゲームの世界を飛び越え、最先端の人工知能研究における標準評価手法として確固たる地位を築いています。
代表例が、大規模言語モデル(LLM)の性能を人間のブラインドテストで競い合う「LMSYS Chatbot Arena」です。ユーザーが投げかけた同一のプロンプトに対し、モデル名を伏せた2つのLLMが回答を出力します。ユーザーが良いと感じた回答に投票し、その勝敗データをもとに各AIのEloレーティングが算出されます。
ユーザーのプロンプト
│
┌───────┴───────┐
▼ ▼
[モデルAの回答] [モデルBの回答]
│ │
└───────┬───────┘
▼
人間によるブラインド投票(勝敗判定)
│
▼
Eloレーティング更新(Arena Leaderboard)
ベンチマークテストには「テストデータへの過学習」という深刻な問題がつきまといます。公開されている試験問題をAIモデル側が事前に暗記してしまうと、見かけ上のスコアだけが高くなり、実際の対話性能が伴わない事態が頻発します。
人間による1対1のブラインド対決とEloレーティングの組み合わせは、この不正を防ぎます。問題が固定されていないため事前の丸暗記が通用せず、モデルの真の対話能力をあぶり出せるためです。
AIモデルの進化に伴い、上位陣のスコア差は非常に小さくなっています。スタンフォード大学のHAIが公開したレポート(2026 AI Index Report)でも、上位モデル群が狭いEloポイント差の中にひしめき合っている事実が示されています。
微細な性能差を白黒つける客観的な審判役として、Eloの数理モデルが頼りにされています。
社内でのAI活用やプロンプトの設計ノウハウを深めたい方は、AIライティングツールおすすめ20選を料金で比較|選び方と注意点 (2026年版)もあわせてご覧ください。
主要なレーティングアルゴリズムの比較
実力評価を行うアルゴリズムは、Eloレーティングだけではありません。システムの要件に応じて最適な手法を選択する必要があります。
代表的な4つのアルゴリズムの特徴を一覧にまとめました。
| アルゴリズム | 対象人数 | 不 | 計算負荷 | 主な |
|---|---|---|---|---|
| Elo | 1対1 | なし(固定値) | 極めて軽い | チェス、サッカー代表ランク、LLMアリーナ |
| Glicko / Glicko-2 | 1対1 | あり(期間考慮) | 軽い | オンラインチェス(Lichess, Chess.com) |
| TrueSkill | チーム戦・多人数 | あり(個人技能分離) | やや重い | Xbox Live、家庭用対戦ゲーム |
| Bradley-Terry | 1対1ペアワイズ | 最尤推定で一括計算 | 重い | 統計分析、推薦システム、RLHF学習 |
手軽に対戦システムを構築したい場合や、リソースを抑えて高速に計算を回したい環境なら、Eloレーティングが一択です。
対戦頻度に大きなばらつきがあるサービスならGlicko、チーム対戦が主体のゲームタイトルならTrueSkillを検討するのが手堅い判断基準になります。
AI PICKS編集部の判定
Eloレーティングは、数十年前に考案されたクラシックな手法でありながら、現代の生成AI評価やマッチング基盤においても色褪せない完成度を誇っています。
何よりの強みは、実装の軽さと直感的なわかりやすさにあります。指数関数ひとつで期待勝率を導き出し、差分をK値で掛けるだけの処理は、サーバー負荷をほぼゼロに抑えられます。ブラックボックスになりがちな複雑な機械学習モデルと比べ、なぜその点数になったのかをユーザーへ明快に説明できる透明性は、サービス運用において重宝します。
一方で、チーム戦や放置アカウントに対する脆弱性は無視できません。5対5の対戦ゲームにそのまま流用しようとすると、個人の活躍が点数に反映されず、ユーザーの不満を招く原因になります。1対1の明確な勝敗が存在する場面に絞って採用するのが賢明な判断です。
シンプルさと説明責任を最優先するなら、Eloレーティングの採用で間違いありません。
よくある質問(FAQ)
Q. Eloレーティングの初期値は何点から始めるのが一般的ですか?
1500点または1200点からスタートするのが通例です。チェスでは1500点が標準的な基準値として長年用いられてきました。中央値を何点に設定しても数学的な計算結果には影響しませんが、プレイヤーにとって馴染みのある1500点を基準に設計すると混乱を防げます。
Q. レーティングがマイナスになることはありますか?
計算理論上、極端な連敗を重ねるとレーティングが0を下回りマイナス値になる可能性は排除できません。ただし、実務で運用する際は下限値(例:100点や0点)をシステム側で固定し、それ以下には下がらないガード処理を設けるのが通例です。
Q. Eloの読み方は「イーロー」ですか、「エロ」ですか?
考案者であるアルパード・イロ氏の苗字に由来しているため、国際的には「イロ(Elo)」と発音するのが正確です。英語圏では「エロ」や「イーロー」と読まれるケースもありますが、頭字語(略称)ではないため「E.L.O.」とアルファベットを一文字ずつ区切って読むのは誤りです。
Q. レート差がどれくらい離れると勝てなくなりますか?
レート差が400開くと、下位側の勝率は約9%まで下がります。さらに差が広がって800離れると、勝率は1%程度に落ち込みます。実力差が400以上あるマッチングは、双方にとって一方的な展開になりやすいため、マッチングシステム側で対戦を成立させない制限を設けるのが一般的です。
Q. K値を試合ごとに変えても計算は破綻しませんか?
計算自体が破綻することはありません。対戦経験の少ない新規プレイヤーのみK値を40に設定し、対戦数が増えたベテランはK値を16に落とすといった運用は、公式のチェス競技でも標準的に行われています。ただし、同一の対戦でプレイヤーAとプレイヤーBのK値が異なると、系全体のポイント保存(ゼロサム性)が崩れる点には配慮が必要です。
Q. サッカーのFIFAランキングでもEloが使われているのですか?
使われています。FIFAは2018年7月より、従来の勝敗平均方式を廃止し、Eloレーティングをベースにした計算式(SUMアルゴリズム)へ移行しました。親善試合よりもワールドカップ本戦のK値を高く設定するなど、大会の重要度に応じた重み付けを加えて運用されています。
あわせて見たいツール・カテゴリ
Eloレーティングの数理モデルを実装したり、対戦データの分析・AI評価基盤を構築する際に役立つ関連リソースです。
データ分析や統計処理の自動化を加速させたいなら、フリーランスのデータ分析AIベスト5|月3,000円以下で選ぶ (2026年版)をあわせて読むと、実務での活用イメージがより鮮明になります。
参考にした一次情報
記事の事実関係は、次の公式ページで確認しています。仕様や料金は変わることがあるため、最新の内容は各ページで確かめてください。
- FIDEニュース「新レーティング規則施行」(公式):FIDEの資格委員会は2009年から、Eloレーティング方式についてJeff Sonas氏の助言を受けています(2026年10月確認)
- LMSYSブログ「Chatbot Arena発表」(公式):Chatbot Arenaは匿名モデル同士の対戦をクラウドソーシングで行い、Eloレーティング方式で順位を付けます(2026年10月確認)

