見出し画像

【数学】ポケモンの研究 ランクマシリーズ2 パラドックス環境の考察

どうも.
ミカサ研でございます.

今日は私のYouTubeでやっているポケモンの研究について書いていきます.
動画化する前の草稿としてnoteを利用しようかなと考えています.

タイトルには「数学」と書いていますが,別になんかすごい数学的手法を用いるとかそんな芸当は僕にはできないのであらかじめご容赦ください(数学のレベルとしてはせいぜい高校数学レベルです.もしもっと高度な内容を期待して開いた方がいたらごめんなさい🙇‍♂️).
構築記事とか実際の対戦を通しての考察じゃないということをアピールするためにあえて「数学」という語を用いました.

あと最初に一言.本記事は下書きなしでぶっつけで書いているので支離滅裂な部分もあると思います.ちょっと読みにくいかもしれませんが許してネ.

なんかクッソ長い文章になってしまったので,「結果と考察」だけでも読んでもらえたらと思います.

はじめに

最近,種族値を元に色々計算してポケモンの強さについて考察していました.例えば,以前あげた『シン・種族値ランキング』では,総合耐久指数と戦闘民族指数から“種族値”を逆算して,ランキングを発表しました.

種族値は,ポケモンの強さをはかる代表的な指標ですが,当然のことながら限界がありますよね.

それに,動画でもちょっとだけ触れたのですが,6つある能力のうち,素早さだけは他と異質なので他と同列に扱うのにも少し抵抗があります.

そこで,種族値だけにとどまらず,他の要素も取り入れてポケモンの強さをはかることが要請されます.

ランクマの使用率を考慮したい

強さは相対的に定義される

ランクマでの使用率が高いポケモンは強いポケモンですよね.

じゃあ,ランクマの使用率上位のポケモンがそのままポケモンの強さかと問われたら,そうとも言い切れませんよね.なぜなら,ポケモン勝負はメタり合いですから,使用率上位のポケモンもメタられたら弱くなります(とはいえ,やはりカイリューは最強である).

それに,使用率の高さがそのままポケモンの強さであるっていう主張は,「多数決の結果は必ず正しい」という間違った認識と似ていますよね.

少し話は逸れましたが,要は,ポケモンの強さとは環境に対して相対的に定義されるべきなのです.

ランクマの使用率を参照したいけれど

ポケモンの強さを相対的に定義するために,ランクマの使用率を用いたいと思います.ランクマにおけるポケモンの使用率等のデータはつい先日ポケモンHOMEで公開されましたから,ようやくポケモンSVにてポケモンの強さが相対的に定義できるようになりました.

しかるに,肝心の使用率がわからない…

使用率のランキングはわかるけれど,使用率はわからない.

まぁ剣盾のときからそうでしたが.

そういうわけでちょっと工夫しなければなりません.

上位20体の使用率を見てみる

工夫するために,アルテマ様の以下のサイトを利用することにしました.このサイトでは,270戦の独自調査結果が公開されていました.
上位20体のデータしかありませんでしたが,かなり有用なデータだと思うので,僕としてはこれを利用しない手はありませんでした.

そのデータによれば,例えばカイリューの使用率は44.1%とありました.つまり,270人中119人がカイリューを手持ちに入れていたということでしょう.

手持ちのポケモンは概ね6体のはずですから,カイリューの存在確率は44.1/6 = 7.35%程度だと計算できます.このように上位20体の存在確率を計算して和を取ると,なんと71.8%になりました.

つまり,使用率上位20体のポケモンが対戦環境の7割を占めるということになります.
言い方を換えると,トレーナーの手持ちのポケモンのうち4体以上は使用率上位20体のうちどれか,といったところでしょうか.

ちなみに,現在ポケモンSVにいる400体のポケモンのうち,ランクマシリーズ2に参加可能で最終進化形態または進化なしのポケモンは合計で約150体います.

そのうち20体で70%が説明できてしまうわけですから,多様性もあったもんじゃないですね.

おい! 多様性を大事にするんじゃなかったのか!

上位20体のデータから150体の使用率を推定する

ランクマにおけるポケモンの使用率は150位まで公開されています.
しかしその使用率は公開されていません.
しかし上位20体の使用率は観測値からわかっています.

となれば,数学の力を使って,上位20位までの傾向から21位〜150位の使用率も推定できそうですよね.

なので!
やってみました!

結論を申し上げますと,良い感じの推定はできませんでした…

昨今話題になっているOpenAIのChatGPTとも相談しつつ色々な方法で試してみたんですけど,うまくいかなかったんですよね.

試したことは以下の通りです.

  • スピアマンの順位相関係数を求めて順位から使用率を逆算.その際,使用率の和が1.0になるように正規化

    • あまり良い推定にならなかった.例えば,上位31体でようやく累積確率が72%になった

    • 他にも使用率1位の所持率が100%を超えるという異常事態になった

    • そも,スピアマンの順位相関係数が確率分布を求めるためのものではないので仕方のないことだろう

  • 多項式近似で上位20体のプロットを近似できる関数を求めて,21〜150位の使用率も推定

    • 次数が低いと推定の精度が頗る悪く,次数をあげると振動してしまい(単調減少の関数にならないため),無理だった

    • 100位や150位に無理やりそれっぽい値を仮定したプロットを与えてやっても単調減少の関数は作れず,断念

    • これにはExcelを用いた.Python等でスプライン補間をやってみたらあるいはいい感じのができる可能性はあるが期待はしていない

  • 対数近似で上位20体のプロットを近似できる関数を求めて,21〜150位の使用率も推定

    • Excelで簡単にできたのでやってみた.対数関数なので単調減少が約束されており,見た目はいい感じだったが,80位あたりから使用率が負の値をとり始めてしまったため断念

  • ロジスティック回帰モデルを用いて最尤推定を行ない結果を予測

    • 1位と2位の所持率が100%を超える異常事態となり,また上位に重みをかけすぎている結果となったので推定として使い物にならなかった

  • 上位20体のデータを観測データとして,21位以降のデータを未知数としてベイズ推定を行なった

    • ChatGPTくんに推奨された方法.21位以下が全て等しく0.01%というゴミみたいな結果になった(ChatGPTのミス?)

てな感じで,推定はうまくいきませんでした😭😭😭
これは僕の知識・技量不足の可能性も高いので,有識者の方が読んでいましたらどうかどうか,御智慧をお貸しください.

なお,ノンパラメトリックに確率分布を推定するカーネル確率密度推定なる手法があるようですが,この推定に使うには一筋縄に行きそうになかったので断念しました.
気が向いたらリベンジしてみることにします.

結局,正規分布を使うことに

上位20体のデータから150体分のデータ推定がうまくいかなかったので,困りました.

まともな手法で試してみても無理なら今度は目分量じゃい!

最も雑な推定方法は,順位を線形的に使用率に変換する方法が考えられます.1位は150体,2位は149体,…,i位は151-i体,…,150位は1体という比率になっていると考えるわけです.実際,かなり前にこの考え方で使用率を考慮した考察をしています.

でもこのやり方だと,上位のポケモンを過小評価しすぎなんですよね.

先ほど,ランクマでは上位20体が環境の7割を占めると述べました.
しかし,この線形的な方法だと上位70体になってようやく環境の7割を占めることになりますから,不適当なことは明らかですね.

というわけでどうしましょう.
まぁ,確率分布で困ったら正規分布でええやろってことで正規分布を用いることにしました.

正規分布の右半分に注目し,あの滑らかな減少具合を使用率に見立てようと,そういうわけです.

正規分布N(x; m, s)は平均mと標準偏差sをパラメタとするので,mとsを与えてやる必要があります.平たく言えば,mは正規分布の頂点の位置,sは正規分布の広がりを規定します.

そこで,正規分布はN(x; m=0, s=19)としました.m=0としたのは,順位がi位のポケモンの使用率を次のように定義するためです: 
(ポケモンiの使用率) = 2*(P(x=i; m=0, s=19) - P(x=i-1; m=0, s=19))
ここで,P(x; m, s)は正規分布N(x; m, s)をx=-∞からx=xまで積分したものとします.
s=19としたのは,20位までの累積確率が約72%になるようにするためです.
ちなみにこの正規分布によれば,上位26体までのポケモンが環境の約83%を占めることになります.

正規分布を採用した数学的根拠なんてないですが,まぁ悪くないんじゃないかなと思ってます.
問題点として理解しておくべき点は次の2点でしょうか.

  • 上位50体で環境の約99%が説明されてしまう

    • 上位50体で99%はやりすぎな気がします.例えば2月12日付のランキングによれば,パルシェンの使用率は64位.パルシェンの所持率をこの正規分布に従って計算すると約0.1%.パルシェンを手持ちに入れてるトレーナーが1000人に1人しかいないというのはちょっと考えづらいですよね

  • 最上位クラスのポケモンの所持率にほとんど差がない

    • 観測上は第1位,2位,3位,4位,5位のポケモンの所持率は順に,44.1%,39.3%,30.7%,29.6%,28.1%でした(無論,これはn=270のサンプルにおける割合なので母集団は多少異なる割合にはなると思います).一方で,この正規分布によれば第1位から順に,25.1%,25.1%,25.0%,24.8%,24.5%と計算されます

ちなみに,2点目の「差がないこと」については一見してデメリットに見えますが,メリットとして捉えることもできます.それは,順位の変動にあまり影響を受けないということです.
ポケモンの強さは相対的に定義されるべきですが,あまりに環境に順応しすぎた強さを定義してしまうと,その強さはその瞬間での強さでしかなくなり,ある程度普遍性のある強さとして議論できなくなってしまいます.
その点,正規分布によれば,ある程度の順位の乱高下は結果にあまり影響を及ぼさないため,ある程度の相対性を維持しつつ普遍性のある計算を行なえそうです.

いざ,使用率を用いつつポケモンの強さを計算する

期待残存HPと敗北率

ポケモンiの強さは,任意のポケモンjと戦ったときの期待残存HP(残存HPの期待値)と敗北率(負ける確率)で表せると考えました.

残存“HP”とある通り,今回の強さの定義ではダメージ計算を行ないます.ダメージ計算をするということは,本来なら乱数が絡みますし,実数値の計算が必要なので,努力値振や持ち物・特性について仮定しなければならないことがあります.
そこで,まずは今回の計算で仮定したことを列挙することから始めます.
なお,今回は2月12日付のランキングから上位50体のポケモンのみ抽出しているのでそれより下のポケモンは考慮していません.

計算上の仮定

  • レベル50同士の対戦,技の威力は100固定でタイプ一致技,タイプ相性考慮せず,ダメージ乱数は中乱数を仮定

    • 故に,物理ダメージ D = 60 * A実数値/B実数値 と計算した

    • 特殊ダメージも同様

    • 簡単のためにタイプ相性は考慮しなかったが,テラスタルによって自分も相手もタイプがコロコロ変わる今作においてはそこまで欠陥のある仮定ではない

  • 攻撃側のA/C実数値は基本的には252振,性格補正なし,特性による補正あり

    • “基本的には”としたのは,ごく一部の耐久ポケモンはA/C無振でその分耐久に回したため

      • ヘイラ,キョジオ,アマガ,シッポ,ドオー,カバ,ブラッキー,ロンゲ

    • 特性によるA/C実数値に補正をかけたポケモンは以下の通り.

      • ドドゲ(*1.2),ジバコ(*1.3),マリルリ(*2.0),ニンフ(*1.2),コータス(*1.5),ハラバリー(*2.0)

        • ドドゲは総大将で2体瀕死の状態を仮定

        • ジバコはアナライズで後手攻撃を仮定

        • ニンフはフェアリースキンでノ技を仮定

        • コータスは日照りで炎技を仮定

        • ハラバリーは電気に変えるで充電状態からの電技を仮定

          • ハラバリーはちょっと強すぎる仮定であることは否めない

    • 特性によるB/D実数値に補正をかけたポケモンは以下の通り

      • バンギ(*1.5),ギャラ・マンダ(*1.5)

        • バンギは砂おこしでDが1.5倍

        • ギャラ・マンダは威嚇で実質的にBが1.5倍

          • 威嚇は相手依存なのでちょっと悩んだ

      • なお,カイリューのマルスケとミミッキュの化けの皮は後の計算で考慮した

    • 性格補正や道具によるダメージ倍率の変化は,それらがある場合とない場合とで場合分けして計算することにした

  • 防御側のB/D実数値は努力値256を,物理技と特殊技が1:1の割合で飛んでくると仮定したときの総合耐久指数が最も大きくなるようにHBDに分配

    • 参考: https://yakkun.com/tool/hbd.htm

    • なお,先ほどあげたA/C無振のポケモンは努力値508を,総合耐久指数が最も大きくなるようにHBDに分配した

  • ちなみにSは無振を仮定

    • 話を単純化するため

期待残存HPと敗北率の計算

長々と仮定を書き終えたところで,ようやく期待残存HPと敗北率の計算方法について説明します.これらは以下の手順で計算されます.

  1. ポケモンiとポケモンjのS種族値を比較する

    1. ポケiの方がポケjよりも素早かった場合,ポケiの攻撃,ポケjの攻撃,ポケiの攻撃,ポケjの攻撃,… と繰り返し交互に攻撃すると考え,それぞれの攻撃での被ダメの割合を累積していく

      1. ポケjの累積被ダメが先に1.0を超えたら,それはポケiの勝ち.現時点で残っているHPが「ポケiのポケjに対する残存HP」であり,この残存HPにポケjの存在確率(正規分布を用いて推定した確率)を掛け算すると,それは「ポケiのポケjに対する期待残存HP」である

      2. ポケiの累積被ダメが先に1.0を超えたら,それはポケiの負け.ポケjの存在確率がポケiの敗北率_jである

    2. ポケiの方がポケjよりも遅いか同速だった場合,ポケjの攻撃,ポケiの攻撃,ポケjの攻撃,ポケiの攻撃,… と繰り返し交互に攻撃すると考え,それぞれの攻撃での被ダメの割合を累積していく

      1. 先と同様に,ポケiのポケjに対する期待残存HPを計算する

      2. 先と同様に,ポケiの敗北率_jを計算する

  2. 任意のjに対する期待残存HPの総和をとる.敗北率_jについても同様

なお,カイリューのマルスケとミミッキュの化けの皮はこのときの計算で考慮することができます.カイリューの場合は1回目の被ダメの半分として計算し,ミミッキュの場合は1回目の被ダメを1/8と固定するだけです.

以上の計算は,性格補正の1.1倍,珠補正の1.3倍,拘り補正の1.5倍のそれぞれで計算することができます.

結果と考察

性格補正なし・道具補正なし

さっそく計算結果を示しましょう.
まずは,性格・道具補正なしの最もシンプルな結果から見ましょう(図1).
なお,図中のヘッダには「最速」ありますが,無振と解釈してください.

図1. 性格・道具補正なし,敗北率に関して昇順TOP15

敗北率の低い順に並べたところ,最強はハラバリーでした.次点がニンフでその次がイルカ,ギャラ,ガブ,イダイナキバと続きます.

ハラバリーが1位なのは,特性「電気に変える」が確定で発動し,かつ威力100の電気技が必ず等倍で相手に通る,という今回の計算の中で随一の強い仮定をおいているからですね.
次点のニンフですが,少しだけ無理のある仮定があります.それは,威力100のノーマル技をニンフは持っていないということです.ニンフが連打できる最大打点は威力90のハイパーボイスですから,威力100の仮定には無理があります.
第3位のイルカはマイティフォルム限定の話なので,まぁ妥当でしょう.
第4位のギャラは威嚇でBが1.5倍と考えているのが少し強い仮定です.
第5位のガブリアスでやっと,特性による補正のない上位ランカーとなっています.
……

ガブリアス… お前がナンバー1だ!!

まぁとはいえ,第6位のイダイナキバを見てみると,ガブとほとんど敗北率に違いはなくて(倒せるポケモンが1種類すくないだけで),それなのに期待残存HPはガブよりも10%くらい多いから,これはもはや最強ポケモンはイダイナキバなのでは? とも思ってしまいます.

ちなみにこの敗北率12.5%の意味合いですが,HP満タンの状態から等倍で受かるタイプ一致技どうしをお互いに押し付け合ったときに,勝てる確率が12.5%,言い換えれば9戦中8勝できるという意味です.
お互いに同じ倍率の技を押し付け合うのなら(半減技や2倍弱点技),結果はあまり変わらないと思いますが,倍率に偏りが生じる場合(いわゆる有利対面・不利対面)や同じ倍率でも4倍弱点技のような一瞬にして戦いが終わるような勝負を想定するのなら,違う結果になるのでこの解釈はできないことに注意してください.

追記: 計算方法に若干の誤りがあることをのちに発見しました.そこまで結果に大きく作用する誤りではなかったのですが,順位に若干の変動がありました.より正確な順位はYouTubeで公開したこちらの動画を参照していただけたらと思います.

性格補正なし・拘り補正あり

性格補正ありや珠補正の結果もあるんですけど,ここでは性格補正なし・拘り補正ありの結果を見て終わりにしましょう(図2).

図2. 性格補正なし,拘り補正あり,敗北率に関して昇順TOP15

拘り補正込みだと,敗北率0%のポケモンが9体もいますね.なぜ敗北率が0になるのかというと,防御側のポケモンの攻撃にはなんの補正もかかっていないからです.つまり,攻撃側が一方的に火力を増していると仮定しているのでこのようになっています.

そして高火力の飛び交う環境になると,初撃を半減できるカイリューや1/8に抑えられるミミッキュが上位に食い込んできますね.火力の足りないミミッキュですが,名だたる厨ポケを制してギリギリ15位にランクインしています.

というか,1位のハラバリー以外,見事に物理アタッカーですね.どうして世は物理環境と呼ばれるのか垣間見えますね.ちなみに今回,ニンフは17位でした.

他にも色々と読み取れることはあるかと思いますが,今回はこの辺で終わりにしておきます.YouTubeでもこの話はこするつもりなのでぜひ遊びに来てくださいね!

展望

タイプ補正はかけたいですねぇ.
実装するのが面倒くさくて腰が重いけれど.
あと,今回はランキング上位50体についてしか見ていないから,もっと幅を広げてポテンシャルのあるポケモンを探してみたいとも思います.

おわりに

長文お疲れ様です(僕も少し疲れました😅).
今後ともこんな感じで色々計算していくのでよかったらnoteのみならずYouTubeの方もよろしくお願いします!

ではまたお会いしましょう〜


この記事が気に入ったらサポートをしてみませんか?