LoL

LoLのピックに迷うので、マッチアップ勝率で選ぶツールを自分で作ってみた

LoLで対面のマッチアップ勝率を確認するとき、統計サイトだとカウンタータブを開いて一覧をスクロールし、自分の使うチャンピオンを探すことになります。この「探す」作業を省きたくて、自分のチャンピオンプールだけに絞って勝率順に出すツールを自作しました。

データは現在のパッチだけで 52万試合、全パッチの累計で 404万試合です(2026年8月時点)。

作った過程を残しておきます。Riot APIの申請から、一番しんどかったデータ収集まで。

Kana
Kana

…自分で作ったの?

Lyze
Lyze

ピック画面って時間制限があるからね。調べてる間に決まっちゃう。


統計サイトだと、対面の勝率までスクロールが必要

自分が普段使っているサイトだと、対面のチャンピオンに対する勝率を見る手順はこうなります。使いやすいサイトですし、情報も揃っているのですが。

  1. 対面のチャンピオンを選ぶ
  2. カウンタータブを開く
  3. 勝率一覧から、自分の使うチャンピオンが出てくるまでスクロールする

3つ目がしんどい。一覧に並んでいるのは全チャンピオンですが、自分が実際に出せるのはそのうち数体だけです。残りは全部、目で飛ばしている。

しかもピック画面には制限時間があります。結局、調べずにピックすることが増えていました。

問題は統計サイトの出来ではなくて、情報がページごとに分かれていることです。カウンターを見たあと、ビルドを見ようとすると、また別のページに移る。1回ずつは小さくても、毎試合やると効いてきます。

統計サイトは「強いチャンピオン」を教えてくれる。でも「自分が使える中でどれを出すか」は教えてくれない。


作ったもの ── 自分のプールから、勝率順に出すツール

作ったのは2つです。

ピックアシスタントティアリスト
やること自分のプールから、相手構成に強い順に並べるチャンピオンの強さと「個性」を一覧で見る
URL/lol/tool/pic//lol/tool/tier/
向いている場面ピック画面で今すぐ決めたいとき何を練習するか決めたいとき

データはRiot APIから自分で集めています。

対象      : プラチナ以上のソロランク(6ティア)
地域      : 15サーバー(KR / JP1 / EUW1 / NA1 / OC1 など)
更新      : 毎時
現パッチ  : 522,929試合
累計      : 4,043,265試合

勝率とTierの集計に使うのは現在のパッチだけです。LoLはパッチで数字が変わるので、古いパッチを混ぜると意味が薄れます(過去パッチは推移グラフにだけ使っています)。

ピックアシスタントの画面。左にピックプール、右におすすめ度とアイテムサジェストが並ぶ

左でプールと相手を選ぶと、右に勝率順のおすすめとビルドがそのまま出ます。この画面から動きません。

実物はこちらです → ピックアシスタントティアリスト


Riot APIの申請は、あっさり通った

Riot Games APIには3種類のキーがあります。作り始めてすぐ、ここで選択を迫られました。

DevelopmentPersonalProduction
失効24時間なしなし
審査即時数日〜2週間2週間〜6週間
向いている場面手元で試す個人サイトの自動更新個人の戦績検索を出す

Developmentキーは24時間で失効します。手元で試すぶんには足りますが、サーバーで毎時データを集めるには使えません。かといってProductionは審査が長く、実例では6週間以上待っているケースもありました。

なのでPersonalキーを申請しました。一発で通りました。 書き直しもリジェクトもなし。

申請フォームで効いたのは、用途の説明(Description)を具体的に書いたことだと思っています。伝えたのは2点です。

  • 個人を特定する情報は出さない — 表示するのは集計後の統計値だけで、プレイヤー名もアカウント情報も保存しない
  • 閲覧者の操作でAPIを叩かない — 収集はサーバー側の定期実行で、サイトを見る人は書き出し済みのJSONを読むだけ

Riot APIの規約では、プレイヤー名を紐づけた形での公開・蓄積が制限されています。集計後の統計値だけなら問題ありません。

申請前に「Product URL が動いていること」を確認してください。空ページや「Coming Soon」だけのページはリジェクト対象です。

Kana
Kana

英語で書くんだ。。

Lyze
Lyze

サイト自体は日本語のままで大丈夫だよ。申請フォームの説明文だけ英語で書けばいい。


データ取得が一番しんどかった

ここが本題です。申請より、データを集めるほうが何倍も大変でした。

制限が、思っていたより厳しい

Personalキーのレート上限を実測したら、20リクエスト/秒・100リクエスト/2分でした。

これ、Developmentキーと同じ数字です。Personalキーは「6,000リクエスト/2分」という数字が広く流通しているのですが、少なくとも手元のキーではそうなっていませんでした。

X-App-Rate-Limit: 100:120,20:1

上限ぎりぎりを踏まないよう95リクエスト/2分で回しているので、1日に叩ける回数は約68,000リクエスト(この時点では1系統だけ)。LoLのプラチナ以上の試合数はこれよりはるかに多いので、全部の試合を取るのは構造的に不可能です。上限まで無駄なく使えるかどうかの勝負になります。

リクエストを4倍にしても、試合は増えなかった

Riot APIのレート制限はホストごとに独立しています。マッチデータはasia / americas / europe / seaの4ホストに分かれているので、地域を分散させれば枠が4倍になる計算です。

やってみました。結果がこれです。

日付新規試合消費リクエスト試合/リクエスト
06-3048,21160,0950.80
07-0110,24660,5970.17
07-03(並列化した日)45,326242,9970.19
07-0486,854224,9980.39
07-05150,415249,9140.60

06-30 は未処理のプレイヤーが大量に溜まっていた日で、効率がよく出ています。翌日にはその在庫を食い尽くして 0.17 まで落ちました。日ごとの振れが大きいので、ここは効率(試合/リクエスト)で見てください。

そして07-03。リクエストを4倍(6万→24万)に増やしたのに、取れた試合は4.5万で 06-30 とほぼ同じでした。効率も0.19のままです。

増えた枠の大半は空振りでした。「すでに取得済みのプレイヤーに、新しい試合ある?」と何度も聞いて、「ない」と返ってくる。その問い合わせに枠の8割を使っていました。

効いたのは、巡回の順番を変えたこと

やったことは大きく4つです。

  • 未スキャンのプレイヤーを優先して回る(試合が溜まっている人から収穫する)
  • 最近プレイしていない人はスキップする(休眠アカウントに聞かない)
  • 収穫が多い地域に枠を寄せる(空振りの多い地域から自動で振り替える)
  • 回る先そのものを広げる(収集対象のサーバーを15に増やした)

結果、試合/リクエストが 0.19 → 0.60。取れる試合は1日4.5万から10万台(ピークだった日は15万)に増えました。リクエスト数はほとんど変えていません。

レート制限に弾かれた回数は、7月上旬までのログ全体で23回だけです。上限ぎりぎりで走らせても、ほぼ弾かれずに済んでいます。

増やしたら、別のところが壊れた

めでたし、とはいきませんでした。収集量が増えた直後、今度は書き出し側がメモリ不足で強制終了しました。

同じ期間のログに残っていた強制終了は26回。まる2日、サイトのデータが止まりました。

原因は単純で、数千万行になったテーブルをfetchall()で一気にメモリへ読み込んでいたことです。データが少ないうちは動いていた書き方が、量が増えた瞬間に破綻しました。

カーソルで1行ずつ流す形に変えて解決しています。

教訓:生データのテーブルをPython側に全部読み込まない。 SQL側で集計するか、ストリームで舐める。


ピック結果とビルドを同じ画面に置いた

ここからは工夫したところです。

ピックアシスタントは1画面で完結します。ページ移動がありません。

上部    : レーンを選ぶ
左ペイン: 自分のピックプール(最大10体)+ 相手の構成
右ペイン: おすすめ度(勝率順)+ アイテムサジェスト

おすすめ度は、相手それぞれとの対面勝率から出しています。自分のレーンの直接対面を重く、他レーンを軽く重み付けする形です。

そして右ペインの下にアイテムサジェストを置きました。相手構成のAP/AD比率を見て、靴・対AP・アンチヒール・対タンクを提案します。

ピックを決めた流れのまま、ビルドの方針まで見える。 別ページに移動して調べ直す必要がありません。「探して回る手数をなくす」というのが、このツール全体の方針です。


ティアリストは「チャンピオンの個性」が見えるようにした

もう1つがティアリストです。こちらは考え方が少し違います。

「最強はこれ」と断定するツールにはしたくありませんでした。 ランク帯やレーンによって使うべきチャンピオンは変わりますが、ある程度戦えるチャンピオンの範囲は決まっています。その範囲を示して、あとは好みで選んでもらう。そういう作りにしています。

なので、1行にこれだけ載せました。

  • 勝率・ピック率・バン率
  • ダメージ型(物理 / 魔法 / 混合を積み上げバーで)
  • 直近5パッチの推移(ゲーム長別・ランク帯別のミニグラフ)

そして行をクリックすると、その下に5軸のレーダーチャート・詳細スタッツ・実際のビルドが開きます。ここでもページ移動はありません。

ティア表の行を開いた状態。5軸レーダー、詳細スタッツ、ゲーム長別の勝率グラフ、最終ビルドが並ぶ

このレーダーが「個性」の部分です。レーン平均を真ん中に置いた同じ5軸で描いているので、同じレーンの中で形を比べると性格が見えます。火力に寄っているのか、耐久なのか、味方を支えるタイプなのか。数字を1つずつ読まなくても、形で掴めます。

Tier判定は勝率をそのまま使っていない

地味ですが、Tierの計算にはWilsonスコア信頼区間の下限を使っています。

素の勝率をそのまま並べると、「30試合で勝率60%」が「3000試合で勝率53%」より上に来てしまうからです。試合数が少ないほど50%側に引き戻し、増えるほど素の勝率に近づく、という補正をかけています。

表示している勝率の列は素の値のままで、並び順とTierバッジだけがこの補正値を使う形です。計算式はサイト上にも公開しています。

Kana
Kana

…そこまでやるんだ

Lyze
Lyze

表示してる勝率は素の数字のままだから、上の行のほうが勝率が低く見えることもあるよ。


まとめ

自作して分かったことです。

  • 統計サイトは十分に優秀。 足りなかったのは「自分が出せる中での順」だけだった
  • Personal APIキーの申請は、思ったよりハードルが低かった。自分の場合は、動いているサイトと個人情報を出さない設計を説明したら一発で通った
  • キツいのは申請ではなくデータ収集。レート上限は流通している数字と実測が違うことがある
  • リクエストを増やしても取得数は増えない。効いたのは「無駄な問い合わせを減らすこと」だった(0.19 → 0.60)
  • 量が増えると、別の場所が壊れる。集める側を直したら、書き出す側が落ちた

よくある質問

Q. 既存の統計サイトの代わりになりますか?

なりません。プレイヤーの戦績検索は実装していません(個人の検索にはProduction APIキーが必要です)。ピックを決める場面だけに絞ったツールです。統計サイトの使い分けは比較記事にまとめています。

Q. データはどのランク帯ですか?

プラチナ以上のソロランクです。ツール上でレーンとランク帯を絞り込めます。

Q. 日本サーバーのデータですか?

15サーバーを合算した数字で、割合としては韓国サーバーが最も大きいです。日本サーバー単体で絞り込む機能は今のところありません。

Q. 更新頻度は?

毎時です。現在のパッチのデータだけを集計しています。


次に作るならバンサジェストかな、と考えています。自分のプールから「先にバンしておくべき相手」を出す機能です。

ただ、使っている人がどこで困っているかは知りたいです。「こういう機能がほしい」「ここが使いにくい」があれば教えてください。ツールのページの下に要望フォームへのリンクを置いています。

全部は作れないと思いますが、次に何を作るかの参考にします。Xでも感想聞かせてください。

この記事は役に立ちましたか?

読みたい記事をリクエストする

シェア