yuuuuki
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は比較的早い段階でプレイをやめてしまったので、この結果からあまり細かな考察はできないのですが
ヒーロー系ブキがちょこちょこ上位にあがってきており、これは入手困難なヒーロー系ブキを持っているということはある程度そのブキを極めているといえるのではないかと考えています。
私は、この結果を生かすことができていないため、この結果から何か得られることがありましたらコメント頂けると幸いです。
またレーティング算出は初めて行うので、バグ等ありましたらご指摘ください。
jo-kwsm
スプラトゥーンプレイ時間2000時間超えの視点からコメントさせていただきます。上位のヒーロー武器に関しては、環境において特段評価されている武器ではありません。ヒーロースロッシャーやヒーローブラシはむしろ低い評価です。そのため使用率が低いのですが、その武器を好んで使っている一部の上位プレイヤーの戦績が色濃く反映されている可能性が有ります。ヘビーユーザーであるほどプレイ時間が増え、試合数が多くなることを考えると使用率の低い武器ほど戦績に対する上位プレイヤーの影響が大きいかもしれません。