World of Tanks:戦車の勝率は何に依存していますか?

今日は、Wargaming APIの使用について話し、多くのグラフを作成し、戦車の勝率が何に依存しているかを分析します。 私はWorld of Tanksの第一人者ではないことに注意してください。どこかで間違いを犯した場合は、コメントに書いてください。 すべてのグラフはクリック可能です。







画像







すべての戦車の勝率ヒストグラムは、全体的な分布が正常であることを示していますが、右側に尾があります。 それを理解してみましょう。







ゲームワールドオブタンクスでは、多くのプレイヤーがアカウントの統計、つまり勝率(勝利の割合)、個人評価、WN8などに大きな注意を払っています。 これらのパラメーターには、多くの特性を考慮した数式があります。 基本的に、プレイヤーの勝率は、戦闘ごとの平均ダメージ、生存率、戦闘の平均レベル、およびその他のいくつかのパラメーターの影響を受けます。 しかし、単一の戦車の勝率を決定するものは何ですか? 最も明白なオプションは、それをもっとプレイするプレイヤーからです。 しかし、今日は、サーバー上のタンクの平均的な損傷や格納庫からは見えない類似の特性を含めないで、タンクのパラメータを分析したいと思います。







したがって、個別の戦闘を行う場合、各チームには15人がいるため、各プレイヤーは平均で戦闘の結果に6.66%の影響を与えます。 チーム内のプレイヤーが少ない場合、それらのバランスを取ることがより難しくなり、そのため、それぞれの影響が滑らかになります。 チームは、各タンクの重量に基づいて仲人によって形成されるため、チームの重量の合計差は最小限に抑えられます。 戦車の重量は、戦闘のレベルとそのクラス(重戦車、中戦車、軽戦車、金曜、金曜など)によって異なります。 ゲームで一般的に認められている意見は、戦闘の結果はすべて平均49%の勝利、同数の敗北、2%の引き分けに減るというものです。







プレーヤーが与えるダメージが大きくなり、受け取る回数が減るほど、勝つチャンスが増えるため、勝率が上がることは明らかです。 これは、プレイヤー自身と彼の経験に大きく依存します。「間違った手」の中で最もクールな戦車でさえチームに利益をもたらさないからです。







データ検索



データを取得するには、公開のWargaming APIを使用できます。このAPIは、プレーヤーと機器に関するさまざまな情報を提供します。 https://api.worldoftanks.ru/wot/account/tanks/のaccount_idフィールドでGETリクエストを使用すると、プレーヤーのテクニックに関する情報、つまりjson形式の各戦車での戦闘と勝利の総数を取得できます。 私はそれを額にしました:0から40kkのサイクルで、すべてのaccount_idのデータを取得しようとしました。 Pythonコードスニペット:







url_users = 'https://api.worldoftanks.ru/wot/account/tanks/' #   Keep-Alive,      session = requests.Session() def get_users_json(ids): #     100 id # application_id      WG params = {'account_id': ids, 'application_id': 'demo'} while True: try: r = session.get(url_users, params) r_json = r.json() except: #          #     ,    time.sleep(1) continue if r.status_code == 200 and r_json['status'] == 'ok': return r_json['data']
      
      





もちろん、マルチスレッドまたは非同期にモジュールを使用することもできます。これにより、間違いなくダウンロードが高速化されます。 私のコンピューターでは、スクリプトが2日間実行され、2600万人のユーザーのデータがダウンロードされました。 週末に出発するので、2日間の積み込みは重要ではありませんでした。







次に、各タンクの勝率(合計450)を計算し、すべての機器の詳細な特性を取得できます。 特性はhttps://api.worldoftanks.ru/wot/encyclopedia/vehicles/でリクエストすることで取得できますが、APIはこのタンクの最上位のモジュールを教えてくれません。 この方法の答えは、「modules_tree」フィールドです。このフィールドには、戦車のモジュールを調査するためのツリーが含まれているので、それを調べた後、最上位のモジュールを選択できます。 定義上、これは最高レベルのモジュールであり、複数ある場合は研究に最も高価です。 これで、 https: //api.worldoftanks.ru/wot/encyclopedia/vehicleprofile/で必要なモジュールのIDを渡してリクエストを行うことができます。 その結果、450の戦車に関する詳細なデータが得られます。







タグを使用する



データ分析には、pythonライブラリpandasを使用しました。 すべてのデータをpandas.DataFrameにロードすると、450行40列になりました。 すべての兆候のリスト:







画像







ap_damage、apcr_damage、he_damge、hc_damage、および_penetrationと同じものを除き、すべての機能は直感的でなければなりません。 これは、さまざまな種類のシェルによる損傷と装甲貫通です。 APIは、特定の種類の発射体の損傷と装甲貫通に関するデータを含むオブジェクトの配列の形式で、武器に関する情報を返します。 それらには4つのタイプがあります。









APIは、どのシェルがメインであり、どのシェルが金のために購入されているかを示していないため、分析が複雑になります。







特性の作成と選択



ソースデータに基づいて、より有益な兆候を取得できます。







 df['power'] = df.engine_power / (df.weight / 1000) #     df['max_damage'] = df[['ap_damage', 'apcr_damage', 'he_damage', 'hc_damage']].max(axis=1) df['max_penetration'] = df[['ap_penetration', 'apcr_penetration', 'he_penetration', 'hc_penetraion']].max(axis=1) df['dpm'] = df['max_damage'] * df['gun_fire_rate'] #    def get_armor(y): #   ,          #  ,       if y[1]: return np.mean(y[:2]) else: return y[0] df['armor'] = df[['armor_hull_front', 'armor_turrer_sides']].apply(get_armor, axis=1)
      
      





試行錯誤によって(ランダムフォレスト)、最も重要な兆候を選択しました(さらに、さらに2つの興味深い兆候を検討します)。







画像







WOTをプレイしなかった場合、以下が表示されます:タンクレベル(1から10)、プレミアムタンクの有無、強さポイント数、パワー(馬/トン)、発射速度(ラウンド/分)、銃速度(秒) 、銃の散布(メートル)、前進速度(km / h)、最大ダメージ(hp)、最大装甲貫通力(mm)、1分あたりのダメージ(hp / min)、装甲(mm)。







症状の正常化



分析を開始する前に、いくつかの機能を正規化する必要があります。 タンクレベルに依存しない値を取得したいので、レベルごとに個別に正規化します。 言い換えると、レベルごとの属性の平均値を0にします。最大ダメージ、最大装甲貫通力、1分あたりのダメージ、装甲、強さ、およびパワーの正規化を実行しました。







データ分析



勝率はテクノロジーの国に依存しますか? 開発者はこれを可能な限りバランスさせようとしているので、いいえと仮定するのは論理的です。 プロットしましょう。 プロットには、seabornライブラリーを使用しました。







 sns.factorplot('nation','winrate', data=df_normalized,size=4,aspect=3) sns.plt.title('Winrate from nation')
      
      





画像







チェコの戦車はすぐに目を引きます-平均勝率は51%ですが、スプレッドは最大です。 これは、ブランチが比較的新しく、すでに可能なものをすべて投入している多くのプレーヤーが、このブランチを投入するために急いでいるという事実によって説明されます。 このようなプレイヤーはかなり熟練しているため、勝利の割合は平均を上回っています。 また、チェコ人と対戦するすべての人が自分の弱点と侵入ゾーンを知っているわけではありません。 しかし、時間が経つにつれて、勝率の値は等しくなる可能性があります(そうでない場合、WGはブランチ内の多くの戦車を弱体化させます)。







そして、どのクラスのテクノロジーがどのように「曲がる」のでしょうか? 同様のチャートを作成しましょう:







 ax = sns.factorplot('type','winrate', data=df_normalized,size=5,aspect=3) sns.plt.title('Winrate from type')
      
      





画像







平均的な戦車で勝つ最大のチャンスであり、軽戦車と大砲で最小のチャンスであることがわかります。 軽戦車にそのような意味があるという事実は理解できます。 このクラスのプレイヤーの多くは、戦闘開始直後に真っ向から飛び出し、チームに特別な利益をもたらすことなく自然に融合します。 通常、Artaは別のトピックであるため、ここでは説明しません。







さらに、これら2つの機能については、ランダムフォレストに基づくモデルに大きな利点をもたらさないため、説明しません。







以前に選択した属性と勝利の割合の相関関係を見てみましょう。







画像







is_premiumとwinrateの強い相関関係が際立っています。 プレミアムタンクは通常のタンクよりも優れていますか? あまり好きではありません。 このような強い依存性は、経験豊富なプレイヤーがシルバーを養うためにプレミアム装備を使用しているという事実による可能性が最も高いです。 グラフを作成して、プレミアムおよび従来の機器でのウィンレートの分布を確認できます。







 facet = sns.FacetGrid(df_normalized, hue="is_premium",aspect=4) facet.map(sns.kdeplot,'winrate',shade= True) facet.set(xlim=(0.40, df_normalized['winrate'].max())) facet.add_legend() sns.plt.title('Winrate from premium')
      
      





画像







従来の装置での勝利の分布密度は、平均値が49%のガウス正規分布であることがわかります。 プレミアム車の勝利の分布密度はより高いwinrateに向かって拡張され、平均値は52%であり、分散は従来の車のそれよりはるかに高いです。







ゲームには合計114のプレミアムタンクがあり、これは合計の25%です。 勝利の割合によるすべての戦車のヒストグラムでは、右側に尾が見えました。 どのタンクが入ったのか見てみましょう:







画像







テールのタンクの93%がプレミアムです。 興味深いことに、残りの7%(31の2)はチェコの戦車です。







また、相関テーブルから、勝率はタンクレベルに直接比例することがわかります。 チャートについてさらに詳しく考えてみましょう。







画像







そのような写真を説明するのは簡単です。 テクノロジーの最初の2つのレベルでは、経験不足のために初心者プレイヤー全員が戦車の統計を台無しにするという事実のために、このような小さな勝利率があります。 また、最初のレベルでは、リストの一番下にある可能性が高くなります。 反対に、10レベルでは、常にトップにいます。 また、レベル9-10では、プレミアムアカウントなしでプレイすることは収益性がないため、そこにいるほとんどの人はプレミアムでプレイします。







残りの兆候のうち、それらは勝利率に直接比例します:強さ、前進速度、1分あたりのダメージ、および鎧。 逆比例:削減の速度、銃の散布。 これまでのところ、すべてが明らかですが、最大のダメージと装甲の貫通力は、勝利の割合に反比例することがわかります。







これは奇妙です。なぜなら、タンクがより多くのダメージを与えるほど、より良いからです。 そうです。 最大ダメージの値をどのように取得したかをもう一度見ると、キャッチが何であるかを推測できます。 トップガンのすべての可能な砲弾から最大のダメージと装甲貫通力を取得しました。 しかし、結局のところ、ほとんどの場合、地雷への最大のダメージ(最小の装甲貫通力)であり、地雷は従来の戦車で最も一般的に使用されるシェルとはほど遠いため、不正確になります。 また、1回限りのダメージは大きくなる可能性があり、長時間のクールダウンにより1分あたりのダメージは小さくなります。 さらに、相関の負の値は、おそらく大砲が通常最大のダメージと最小の勝利率を持っているという事実によるものです-したがって、反比例。







症状の重要性



これで、このデータにランダムフォレストを構築し、結果を確認できます。 ランダムフォレストは、多くの異なる決定木の結果の平均に基づく最も一般的な機械学習アルゴリズムの1つです。 このアルゴリズムは、個々の特性の重要性を見つけるのに適しています。







画像







さまざまなパラメーターと記号を試しましたが、エラーを大幅に減らすことはできませんでした。 アルゴリズムは平均で予測で1.3%のエラーを生じることがわかります。 次に、このフォレストの属性の重要性を見てみましょう。







 importances = rf.feature_importances_ std = np.std([tree.feature_importances_ for tree in rf.estimators_], axis=0) indices = np.argsort(importances)[::-1] legends = [] for i in range(X.shape[1]): legends.append('%d.%s (%f)' % (i + 1, X.columns[indices[i]], importances[indices[i]])) plt.title('Feature importances') bars = plt.bar(range(X.shape[1]), importances[indices], color='c', yerr=std[indices], align='center') plt.xticks(range(X.shape[1]), range(1, X.shape[1] + 1)) plt.xlim([-1, X.shape[1]]) plt.legend(bars, legends, fontsize=12)
      
      





画像







このモデルでは、最も重要なパラメーターがプレミアムタンクであるかどうかが判明しましたが、この機能の重要性は次に低下するものの2倍です。 重要性に関する次の4つの特徴は、ツールの特性であり、これも予測可能です。 チェコ共和国に属する機能も追加したことがわかります。これにより、エラーがわずかに減少しました。 ただし、他のすべての機能を国や技術クラスに追加しても、アルゴリズムの動作は改善されませんでした。







サンプルからプレミアムタンクを削除し、同じパラメーターでランダムフォレストをトレーニングするとどうなりますか? 結果を箱ひげ図で提示すると便利です。







 fig, ax1 = plt.subplots(figsize=(10, 6)) data = [score_with_premium, score_without_premim] bp = plt.boxplot(data, notch=0, sym='+', vert=1, whis=1.5) ax1.set_title('Comparison of score with and without premium') ax1.set_ylabel('mean_absolute_error') xtickNames = plt.setp(ax1, xticklabels=['With premium', 'Without premium']) plt.setp(xtickNames, rotation=0, fontsize=12)
      
      





画像







アルゴリズムが勝利の割合を推測することはすぐにはるかに容易になり、平均して、相互検証のエラーは0.9%に減少し、エラーの広がりも非常に小さくなりました。







おわりに



WG APIの使用方法を検討しました。 彼らは、勝率がどのように国に依存するかを発見しました-現時点では、技術クラスのチェコ人で最も不安定です-中戦車で最大で、芸術で最小です。 また、レベルに直接依存していることもわかりました。 私たちは、戦車のどの兆候が戦闘での勝利に最も影響するかを分析しました-プレミアム戦車かどうか、そして銃のパラメーターです。 また、戦車の特性によって勝利の割合を比較的正確に予測できる単純なモデルを構築しました。







Upd: saw_toothは、従来技術からのwinrateのグラフを作成し、個別に入力する(クリック可能な)アイデアを提案しました:



PS:このデータセットも使用したいが、API経由でデータをダウンロードしたくない場合は、私に連絡してください。








All Articles