ブキレーティング算出

Splatoonは通常同ランクのユーザーがマッチングするため、ランクよりもブキの強さが勝敗に大きく影響していると考えブキのレーティングを求めてみました。
レーティングアルゴリズムにはTrueSkillを用いました。実装は以下の記事を参考にしています。
https://qiita.com/BlueRayi/items/f994bb67e0dc5723c2a1

ブキのレーティングを算出は、「各チーム4人揃っているもの」とガチマッチについては「全員のランクが一致しているもの」を対象としています。
(レベルが離れすぎているものを除外すると、もっと良いブキのレーティングが求まるかもと考えていますが今回はやっていません。)

import pandas as pd
import numpy as np
import trueskill
from tqdm import tqdm
df_train = pd.read_csv('./data/train_data.csv')
def calc_weapon_rate(mode):
    
    env = trueskill.TrueSkill()

    weapon_dict = {}
    
    if mode != 'all':
        _df = df_train[df_train['mode'] == mode]
    else:
        _df = df_train.copy()

    # 両チーム4人そろっているものを対象
    _df = _df[~(_df[['A1-weapon', 'A2-weapon', 'A3-weapon', 'A4-weapon', 'B1-weapon', 'B2-weapon', 'B3-weapon', 'B4-weapon']].isnull().sum(axis=1) > 0)]
    
    # 全員のランクが同一のバトルを対象
    if  mode not in ['nawabari' , 'all']:
        _df = _df[(_df['A1-rank'] == _df['A2-rank']) & (_df['A1-rank'] == _df['A3-rank']) & (_df['A1-rank'] == _df['A4-rank']) & (_df['A1-rank'] == _df['B1-rank']) & (_df['A1-rank'] == _df['B2-rank']) & (_df['A1-rank'] == _df['B3-rank']) & (_df['A1-rank'] == _df['B4-rank'])]

    for idx, row in tqdm(_df.sort_values('period').iterrows(), total=len(_df)):
        team_a = {}
        team_b = {}

        for weapon_column in ['A1-weapon', 'A2-weapon', 'A3-weapon', 'A4-weapon']:
            weapon = row[weapon_column]
            team_a[weapon] = weapon_dict.get(weapon, env.create_rating())
        
        for weapon_column in ['B1-weapon', 'B2-weapon', 'B3-weapon', 'B4-weapon']:
            weapon = row[weapon_column]
            team_b[weapon] = weapon_dict.get(weapon, env.create_rating())

        team_a, team_b, = env.rate((team_a, team_b,), ranks=(abs(row['y'] - 1), row['y'],))

        weapon_dict.update(team_a)
        weapon_dict.update(team_b)

    rate_dict = {k:float(v) for k, v in weapon_dict.items()}
    
    return rate_dict

レーティングは全モードと各モード個別に求めた計6パターンを求めています。

# allは全modeが対象
for mode in ['all', 'nawabari', 'area', 'asari', 'hoko', 'yagura']:
    mode_rate = calc_weapon_rate(mode)
    
    display(f'{mode} レーティング結果')
    
    df_rate = pd.DataFrame(sorted(mode_rate.items(), key=lambda x:x[1]), columns=['weapon', 'rating'])

    display('上位10件')
    display(df_rate.sort_values('rating', ascending=False).head(10))
    
    display('下位10件')
    display(df_rate.head(10))
100%|███████████████████████████████████████████████████████████████████████████| 66009/66009 [01:06<00:00, 985.82it/s]
'all レーティング結果'
'上位10件'
weapon rating
138 heroslosher_replica 21.334269
137 l3reelgun 21.082505
136 pablo_permanent 20.834420
135 heroshelter_replica 20.720125
134 herobrush_replica 20.482331
133 splatroller 20.451646
132 dynamo 20.415668
131 octoshooter_replica 20.357198
130 prime_becchu 20.221645
129 splatspinner_collabo 20.221394
'下位10件'
weapon rating
0 squiclean_a 13.766819
1 liter4k_custom 14.932152
2 liter4k_scope_custom 14.943248
3 splatcharger 15.308379
4 splatcharger_collabo 15.635741
5 herocharger_replica 15.815932
6 liter4k_scope 15.999332
7 rapid_elite_deco 16.203354
8 splatscope 16.309819
9 nzap89 16.353035
100%|██████████████████████████████████████████████████████████████████████████| 14426/14426 [00:13<00:00, 1035.54it/s]
'nawabari レーティング結果'
'上位10件'
weapon rating
138 heroslosher_replica 25.915059
137 l3reelgun 24.497217
136 dualsweeper 23.216195
135 h3reelgun 22.835705
134 nova_neo 22.063314
133 sharp_neo 21.985940
132 herobrush_replica 21.961196
131 splatspinner_collabo 21.910322
130 splatspinner_becchu 21.802804
129 sharp 21.782759
'下位10件'
weapon rating
0 barrelspinner 13.613031
1 rapid 14.140932
2 herocharger_replica 14.971593
3 splatcharger 15.114934
4 rapid_elite_deco 15.156668
5 rapid_becchu 15.489685
6 herospinner_replica 15.549404
7 carbon 15.600710
8 clashblaster 15.778402
9 clashblaster_neo 15.790121
100%|███████████████████████████████████████████████████████████████████████████| 12768/12768 [00:13<00:00, 963.30it/s]
'area レーティング結果'
'上位10件'
weapon rating
138 spygadget 27.064331
137 campingshelter 27.059740
136 herospinner_replica 26.965264
135 pablo_hue 26.771588
134 hissen_hue 26.590925
133 dynamo 26.408077
132 prime_becchu 26.233822
131 heroshelter_replica 26.216221
130 campingshelter_camo 26.162114
129 dynamo_becchu 26.002144
'下位10件'
weapon rating
0 squiclean_a 19.407355
1 kelvin525 19.752276
2 soytuber 19.809553
3 splatcharger 19.964114
4 rapid_elite_deco 20.118165
5 herocharger_replica 20.274106
6 soytuber_custom 20.419140
7 jetsweeper_custom 20.546009
8 carbon_deco 20.705242
9 52gal 20.969598
100%|████████████████████████████████████████████████████████████████████████████| 8540/8540 [00:07<00:00, 1077.79it/s]
'asari レーティング結果'
'上位10件'
weapon rating
138 rapid_elite 28.885126
137 52gal_deco 27.949951
136 l3reelgun 27.569466
135 bamboo14mk2 27.496112
134 h3reelgun_d 27.368856
133 splatroller 27.242023
132 kelvin525 27.190304
131 parashelter 27.022608
130 splatspinner_collabo 26.797740
129 hissen 26.788957
'下位10件'
weapon rating
0 heroslosher_replica 18.908318
1 liter4k_scope_custom 19.600206
2 soytuber_custom 20.341170
3 soytuber 20.555009
4 nova_neo 20.598378
5 quadhopper_white 20.676451
6 squiclean_a 20.965480
7 liter4k_scope 21.075540
8 bottlegeyser 21.191042
9 jetsweeper_custom 21.339614
100%|██████████████████████████████████████████████████████████████████████████| 11216/11216 [00:11<00:00, 1009.03it/s]
'hoko レーティング結果'
'上位10件'
weapon rating
138 herobrush_replica 27.770271
137 bold_7 26.842919
136 bottlegeyser 26.605904
135 parashelter 26.574282
134 splatroller 26.475114
133 splatroller_becchu 26.401515
132 52gal_deco 26.392369
131 parashelter_sorella 26.383651
130 hokusai_becchu 26.362412
129 screwslosher_neo 26.303335
'下位10件'
weapon rating
0 rapid_deco 17.825537
1 squiclean_a 18.794527
2 liter4k_custom 19.901871
3 h3reelgun 20.332253
4 rapid_elite_deco 20.338164
5 splatcharger 20.596957
6 52gal 20.755208
7 splatcharger_becchu 21.037250
8 heroslosher_replica 21.095810
9 liter4k_scope_custom 21.334382
100%|██████████████████████████████████████████████████████████████████████████| 10797/10797 [00:10<00:00, 1026.54it/s]
'yagura レーティング結果'
'上位10件'
weapon rating
138 longblaster_custom 26.724202
137 variableroller 26.653230
136 heroslosher_replica 26.297394
135 screwslosher_neo 26.102104
134 splatroller 26.093006
133 campingshelter_camo 25.976686
132 splatroller_collabo 25.782746
131 splatspinner_collabo 25.774471
130 hissen 25.679115
129 carbon 25.621711
'下位10件'
weapon rating
0 liter4k_custom 16.407917
1 liter4k_scope_custom 17.183141
2 soytuber_custom 19.558201
3 52gal_deco 19.758581
4 quadhopper_white 19.825624
5 squiclean_a 19.995358
6 campingshelter_sorella 20.702726
7 rapid_elite_deco 20.829415
8 bamboo14mk2 20.841187
9 splatcharger_collabo 20.881611

私はSplatoon2は比較的早い段階でプレイをやめてしまったので、この結果からあまり細かな考察はできないのですが
ヒーロー系ブキがちょこちょこ上位にあがってきており、これは入手困難なヒーロー系ブキを持っているということはある程度そのブキを極めているといえるのではないかと考えています。

私は、この結果を生かすことができていないため、この結果から何か得られることがありましたらコメント頂けると幸いです。
またレーティング算出は初めて行うので、バグ等ありましたらご指摘ください。

添付データ

  • weapon_rating.ipynb?X-Amz-Expires=10800&X-Amz-Date=20241008T083336Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIP7GCBGMWPMZ42PQ
  • Icon22
    jo-kwsm

    スプラトゥーンプレイ時間2000時間超えの視点からコメントさせていただきます。上位のヒーロー武器に関しては、環境において特段評価されている武器ではありません。ヒーロースロッシャーやヒーローブラシはむしろ低い評価です。そのため使用率が低いのですが、その武器を好んで使っている一部の上位プレイヤーの戦績が色濃く反映されている可能性が有ります。ヘビーユーザーであるほどプレイ時間が増え、試合数が多くなることを考えると使用率の低い武器ほど戦績に対する上位プレイヤーの影響が大きいかもしれません。

    Favicon
    new user
    コメントするには 新規登録 もしくは ログイン が必要です。