はじめに
最近,Dota2を始めましたが全く勝てません
ハードボットにボコボコにされます.
色々と調べても「死ぬな」くらいのことしか分らず苦戦しています.
データサイエンスでDota2強くなるかも説
そこで,データサイエンスの力を借りて,どのような状況なら勝っているか?や前回に比べてどのように振舞ったから勝てたのか?ということを数値化して分析していけば強くなるのでは!と考えました.本企画はその仮説を検証していく企画です.
前回までのあらすじ
環境構築編
Dota2の情報をPythonで取得できるような環境を作成し*1,データを取得+定期的に保存する機構を作りました*2.
データ解析編
実際にBotとの対戦をプロットしてみて客観的に解析してみました*3.
今回の概要
ミディアムとハード試合データをプロットして解析してみたいと思います.
必要なもの
Dota2
Dota2解析環境
Dota2 解析プログラム
使用データセット
- bot戦(ミディアム):Chaos Knight【勝利】
- bot戦(ミディアム):Chaos Knight【勝利】
- bot戦(ハード):Chaos Knight【敗北】
- bot戦(ハード):Chaos Knight【敗北】
4試合のデータセットを使います.2つともChaos Knight
を使用しました.
僕的にはこいつが使いやすいかなと初心者ながら感じでいます.
Import package
import dota2gsi
import glob
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
import matplotlib as mpl
figure style
#sns.palplot(sns.color_palette("RdBu_r", 24))
#sns.set_palette("RdBu_r")
#sns.set(style='darkgrid')
#sns.set_style('whitegrid')
mpl.style.use('fivethirtyeight')
Read csv file
target_log_file_list = ["log_20220901-160140_BM_W.csv", "log_20220901-204148_BM_W.csv", "log_20220902-010822_BH_L.csv", "log_20220904-035245_BH_L.csv"]
df_list = []
for file_path in target_log_file_list:
df_list.append(pd.read_csv(file_path))
df_list[0].head(5)
df_list[0].columns
Index(['Unnamed: 0', 'alive', 'break', 'buyback_cost', 'buyback_cooldown',
'disarmed', 'has_debuff', 'health', 'health_percent', 'hexed', 'id',
'level', 'magicimmune', 'mana', 'mana_percent', 'max_health',
'max_mana', 'muted', 'name', 'respawn_seconds', 'selected_unit',
'silenced', 'stunned', 'talent_1', 'talent_2', 'talent_3', 'talent_4',
'talent_5', 'talent_6', 'talent_7', 'talent_8', 'xpos', 'ypos',
'clock_time', 'daytime', 'dire_ward_purchase_cooldown', 'game_state',
'game_time', 'name.1', 'matchid', 'radiant_ward_purchase_cooldown',
'nightstalker_night', 'roshan_state', 'roshan_state_end_seconds',
'win_team', 'customgamename', 'assists', 'camps_stacked', 'deaths',
'denies', 'gold', 'gold_reliable', 'gold_unreliable', 'gpm',
'hero_damage', 'kill_list:victimid_#', 'kill_streak', 'kills',
'last_hits', 'net_worth', 'pro_name', 'runes_activated',
'support_gold_spent', 'wards_destroyed', 'wards_placed',
'wards_purchased', 'xpm'],
dtype='object')
Plot level section
Extract level data
df_ex_data_list = []
for i, df in enumerate(df_list):
target_name = 'level'
plot_name = '{}_try{}'.format(target_name, i)
df[plot_name] = df[target_name]
df_ex_data_list.append(df[plot_name])
df_ex_merge = pd.concat(df_ex_data_list, axis=1)
df_ex_merge
Plot level data
ヒーローのレベルをプロットした結果がこちらです.
これを見るとtry0とtry1とtry2が似たような繊維になっていることが分かります.try1は後半ではややズレた波形になってしまっていますが,
try0とtry2に関しては終始似たような遷移になっています.
plt.figure(figsize=(20,8))
sns.lineplot(data=df_ex_merge, lw=2)
#sns.lineplot(data=df_data, x='clock_time', y='level', lw=2)
Plot health section
Extract health data
df_ex_data_list = []
for i, df in enumerate(df_list):
target_name = 'health_percent'
plot_name = '{}_try{}'.format(target_name, i)
df[plot_name] = df[target_name]
df_ex_data_list.append(df[plot_name])
df_ex_merge = pd.concat(df_ex_data_list, axis=1)
Plot health data
正直とてもみにくいので何か工夫する必要があると思います.
plt.figure(figsize=(20,5))
sns.lineplot(data=df_ex_merge, lw=2)
Plot gold data
Extract gold data
df_ex_data_list = []
for i, df in enumerate(df_list):
target_name = 'gold'
plot_name = '{}_try{}'.format(target_name, i)
df[plot_name] = df[target_name]
df_ex_data_list.append(df[plot_name])
df_ex_merge = pd.concat(df_ex_data_list, axis=1)
Plot gold data
try1, try2, try3はこまめにアイテムを購入して様子が伺えます.
plt.figure(figsize=(20,5))
sns.lineplot(data=df_ex_merge, lw=2)
Plot reliable gold data
df_ex_data_list = []
for i, df in enumerate(df_list):
target_name = 'gold_reliable'
plot_name = '{}_try{}'.format(target_name, i)
df[plot_name] = df[target_name]
df_ex_data_list.append(df[plot_name])
df_ex_merge = pd.concat(df_ex_data_list, axis=1)
plt.figure(figsize=(20,5))
sns.lineplot(data=df_ex_merge, lw=2)
考察
try0, try1はミディアム,try2, try3はハードボットと対戦しており,ミディアムボットには全勝,ハードボットとは全敗という結果です.
これを踏まえてレベルの波形を見るととても面白いことが分かります.レベルは全勝したミディアムボットと同じような遷移をしているにもかかわらずハードボットとは勝つことができませんでした.これより,ミディアムボットとハードボットとの対戦での振る舞いは全く異なるということが分かります.
レベルだけでなく,所持金の遷移を見ても同じようなことが言えます.つまり,ミディアムボットとの対戦でいくらスキル(立ち振る舞いなど)を磨いてもハードボットとの対戦では効果は薄い可能性があるということが分かりました.
恐らく試合の質が結構異なると思われます.
プログラム
コードはこちらです.
おわりに
今回はミディアムボットとハードボットとの対戦ログを解析してみた結果.
ミディアムボットで数をこなしていれば成長すると思っていたので結構ショックな結果になりました....
なので,今後はハードボットとの対戦を中心に解析/考察を進めていきたいと思います.
参考サイト
- *1:データサイエンスでDota2強くなるかも説(1)~環境設定~
- *2:データサイエンスでDota2強くなるかも説(2)~ビッグデータ取得&定期保存~
- *2:データサイエンスでDota2強くなるかも説(3)~試合データをプロットしてみた~
最新情報
速報はTwitterやブログにて