データサイエンスでDota2強くなるかも説(4)~ミディアムとハード試合データをプロットしてみたら驚愕の事実が~

Dota2データサイエンス

はじめに

最近,Dota2を始めましたが全く勝てません
ハードボットにボコボコにされます.

色々と調べても「死ぬな」くらいのことしか分らず苦戦しています.

データサイエンスでDota2強くなるかも説

そこで,データサイエンスの力を借りて,どのような状況なら勝っているか?や前回に比べてどのように振舞ったから勝てたのか?ということを数値化して分析していけば強くなるのでは!と考えました.本企画はその仮説を検証していく企画です.

file

前回までのあらすじ

環境構築編

Dota2の情報をPythonで取得できるような環境を作成し*1,データを取得+定期的に保存する機構を作りました*2

データ解析編

実際にBotとの対戦をプロットしてみて客観的に解析してみました*3

今回の概要

ミディアムとハード試合データをプロットして解析してみたいと思います.

必要なもの

Dota2

Dota2解析環境

データサイエンスでDota2強くなるかも説(3)~試合データをプロットしてみた~
保存したデータを一部可視化して,試合の内容を振り返り分析してみました.

Dota2 解析プログラム

使用データセット

  • bot戦(ミディアム):Chaos Knight【勝利】
  • bot戦(ミディアム):Chaos Knight【勝利】
  • bot戦(ハード):Chaos Knight【敗北】
  • bot戦(ハード):Chaos Knight【敗北】

4試合のデータセットを使います.2つともChaos Knightを使用しました.
僕的にはこいつが使いやすいかなと初心者ながら感じでいます.

file

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はハードボットと対戦しており,ミディアムボットには全勝,ハードボットとは全敗という結果です.

これを踏まえてレベルの波形を見るととても面白いことが分かります.レベルは全勝したミディアムボットと同じような遷移をしているにもかかわらずハードボットとは勝つことができませんでした.これより,ミディアムボットとハードボットとの対戦での振る舞いは全く異なるということが分かります.

レベルだけでなく,所持金の遷移を見ても同じようなことが言えます.つまり,ミディアムボットとの対戦でいくらスキル(立ち振る舞いなど)を磨いてもハードボットとの対戦では効果は薄い可能性があるということが分かりました.

恐らく試合の質が結構異なると思われます.

プログラム

コードはこちらです.

Dota2-GSI-Science/Dota2Analysis04.ipynb at main · HamaruKi0303/Dota2-GSI-Science
Contribute to HamaruKi0303/Dota2-GSI-Science development by creating an account on GitHub.

おわりに

今回はミディアムボットとハードボットとの対戦ログを解析してみた結果.
ミディアムボットで数をこなしていれば成長すると思っていたので結構ショックな結果になりました....
なので,今後はハードボットとの対戦を中心に解析/考察を進めていきたいと思います.

参考サイト

コメント

タイトルとURLをコピーしました