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経由でデヌタをダりンロヌドしたくない堎合は、私に連絡しおください。



Source: https://habr.com/ru/post/J302536/


All Articles