データサイエンスでDota2強くなるかも説(5)～ハード試合データを解析してみたら驚愕の事実が～

# はじめに


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

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

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

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

![file](https://hamaruki.com/wp-content/uploads/2022/09/image-1662048158424.png)

### 前回までのあらすじ

#### 環境構築編
Dota2の情報をPythonで取得できるような環境を作成し[<sup>*1</sup>]( https://hamaruki.com/2022/09/06/data-science_with_dota2_05/#参考サイト)，データを取得＋定期的に保存する機構を作りました[<sup>*2</sup>]( https://hamaruki.com/2022/09/06/data-science_with_dota2_05/#参考サイト)．

#### データ解析編

実際にBotとの対戦をプロットしてみて客観的に解析してみたところ[<sup>*3</sup>]( https://hamaruki.com/2022/09/06/data-science_with_dota2_05/#参考サイト)，ミディアムボットとの対戦をしてもハードボットとの対戦ではそこまで効果がない可能性が発見されました[<sup>*4</sup>]( https://hamaruki.com/2022/09/06/data-science_with_dota2_05/#参考サイト)．


### 今回の概要

ハード試合データを解析してみたいと思います．


## 必要なもの

### Dota2

![](https://hamaruki.com/wp-content/uploads/2022/09/DOTA-2_1920x1080.jpg)

### Dota2解析環境

https://hamaruki.com/2022/09/02/data-science_with_dota2_03/


## Dota2 解析プログラム



### 使用データセット

- bot戦（ハード）：Jakiro【勝利】
- bot戦（ハード）：Jakiro【勝利】
- bot戦（ハード）：Jakiro【敗北】
- bot戦（ハード）：Jakiro【勝利】
- bot戦（ハード）：Jakiro【勝利】
- bot戦（ハード）：Jakiro【勝利】
- bot戦（ハード）：Jakiro【敗北】
- bot戦（ハード）：Jakiro【敗北】

8試合のデータセットを使います．いずれも`jakiro`を使用しました．
ハードボットとの対戦について，僕的にはこいつが使いやすいかなと初心者ながら感じでいます．

![](https://hamaruki.com/wp-content/uploads/2022/09/jakiro.jpg)


### Import package


```python
import dota2gsi
import glob
import pandas as pd

import seaborn as sns
from matplotlib import pyplot as plt
import matplotlib as mpl
```

### figure style


```python

#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


ログのフォルダを指定します．
```python
target_dir = "logs"
```


ログのフォルダ内の`csv`ファイルを検索します．
```python
#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"]
target_log_file_list = glob.glob(target_dir + "/*.csv")
```


ファイルの一覧はこちらになります．
```python
target_log_file_list
```


```bash
    ['logs\\log_20220904-161354_npc_dota_hero_jakiro_W.csv',
     'logs\\log_20220905-092008_npc_dota_hero_jakiro_W.csv',
     'logs\\log_20220905-131433_npc_dota_hero_jakiro_L.csv',
     'logs\\log_20220905-141336_npc_dota_hero_jakiro_W.csv',
     'logs\\log_20220905-151758_npc_dota_hero_jakiro_W.csv',
     'logs\\log_20220905-171404_npc_dota_hero_jakiro_W.csv',
     'logs\\log_20220906-093622_npc_dota_hero_jakiro_L.csv',
     'logs\\log_20220906-102435_npc_dota_hero_jakiro_L.csv']
```


ファイルを順に読みだして`DataFrame`型を`list`に追加していきます．
```python
df_list = []
for file_path in target_log_file_list:
    df_list.append(pd.read_csv(file_path))
```

中身の`DataFrame`はこんな感じになります．
```python
df_list[0].head(5)
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Unnamed: 0</th>
      <th>draft_activeteam</th>
      <th>draft_activeteam_time_remaining</th>
      <th>draft_dire_bonus_time</th>
      <th>draft_pick</th>
      <th>draft_radiant_bonus_time</th>
      <th>draft_team#:home_team</th>
      <th>hero_alive</th>
      <th>hero_break</th>
      <th>hero_buyback_cost</th>
      <th>...</th>
      <th>provider_appid</th>
      <th>provider_version</th>
      <th>provider_timestamp</th>
      <th>hero_level_try0</th>
      <th>hero_health_try0</th>
      <th>player_gold_try0</th>
      <th>player_camps_stacked_try0</th>
      <th>hero_level_try0_W</th>
      <th>hero_level_W</th>
      <th>player_gold_try</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>True</td>
      <td>False</td>
      <td>253</td>
      <td>...</td>
      <td>570</td>
      <td>47</td>
      <td>1662275633</td>
      <td>1</td>
      <td>740</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>1</td>
      <td>1</td>
      <td>5.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>True</td>
      <td>False</td>
      <td>253</td>
      <td>...</td>
      <td>570</td>
      <td>47</td>
      <td>1662275635</td>
      <td>1</td>
      <td>740</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>1</td>
      <td>1</td>
      <td>5.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>True</td>
      <td>False</td>
      <td>253</td>
      <td>...</td>
      <td>570</td>
      <td>47</td>
      <td>1662275635</td>
      <td>1</td>
      <td>740</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>1</td>
      <td>1</td>
      <td>5.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>True</td>
      <td>False</td>
      <td>253</td>
      <td>...</td>
      <td>570</td>
      <td>47</td>
      <td>1662275635</td>
      <td>1</td>
      <td>740</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>1</td>
      <td>1</td>
      <td>5.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>True</td>
      <td>False</td>
      <td>253</td>
      <td>...</td>
      <td>570</td>
      <td>47</td>
      <td>1662275635</td>
      <td>1</td>
      <td>740</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>1</td>
      <td>1</td>
      <td>5.0</td>
    </tr>
  </tbody>
</table>
<p>5 rows × 84 columns</p>
</div>



`DataFrame`の列名の一覧はこちら

```python
df_list[0].columns
```

```bash
    Index(['Unnamed: 0', 'draft_activeteam', 'draft_activeteam_time_remaining',
           'draft_dire_bonus_time', 'draft_pick', 'draft_radiant_bonus_time',
           'draft_team#:home_team', 'hero_alive', 'hero_break',
           'hero_buyback_cost', 'hero_buyback_cooldown', 'hero_disarmed',
           'hero_has_debuff', 'hero_health', 'hero_health_percent', 'hero_hexed',
           'hero_id', 'hero_level', 'hero_magicimmune', 'hero_mana',
           'hero_mana_percent', 'hero_max_health', 'hero_max_mana', 'hero_muted',
           'hero_name', 'hero_respawn_seconds', 'hero_selected_unit',
           'hero_silenced', 'hero_stunned', 'hero_talent_1', 'hero_talent_2',
           'hero_talent_3', 'hero_talent_4', 'hero_talent_5', 'hero_talent_6',
           'hero_talent_7', 'hero_talent_8', 'hero_xpos', 'hero_ypos',
           'map_clock_time', 'map_daytime', 'map_dire_ward_purchase_cooldown',
           'map_game_state', 'map_game_time', 'map_name', 'map_matchid',
           'map_radiant_ward_purchase_cooldown', 'map_nightstalker_night',
           'map_roshan_state', 'map_roshan_state_end_seconds', 'map_win_team',
           'map_customgamename', 'player_assists', 'player_camps_stacked',
           'player_deaths', 'player_denies', 'player_gold', 'player_gold_reliable',
           'player_gold_unreliable', 'player_gpm', 'player_hero_damage',
           'player_kill_list:victimid_#', 'player_kill_streak', 'player_kills',
           'player_last_hits', 'player_net_worth', 'player_pro_name',
           'player_runes_activated', 'player_support_gold_spent',
           'player_wards_destroyed', 'player_wards_placed',
           'player_wards_purchased', 'player_xpm', 'provider_name',
           'provider_appid', 'provider_version', 'provider_timestamp'],
          dtype='object')
```


### Plot level section

#### Extract level data

ここから対象の列だけ抽出して`DataFrame`に新たにぶち込んでいきます．

```python
df_ex_data_list = []
for i, df in enumerate(df_list):
    target_name = 'hero_level'
    result_flag = target_log_file_list[i].split(".csv")[0].split("_")[-1]
    
    plot_name = '{}_try{}_{}'.format(target_name, i, result_flag)
    #plot_name = '{}_{}'.format(target_name, result_flag)
    
    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)
```

レベルの列だけを抽出した`DataFrame`がこちらになります．

```python
df_ex_merge
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>hero_level_try0_W</th>
      <th>hero_level_try1_W</th>
      <th>hero_level_try2_L</th>
      <th>hero_level_try3_W</th>
      <th>hero_level_try4_W</th>
      <th>hero_level_try5_W</th>
      <th>hero_level_try6_L</th>
      <th>hero_level_try7_L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>33798</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>23.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33799</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>23.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33800</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>23.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33801</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>23.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33802</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>23.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
<p>33803 rows × 8 columns</p>
</div>



#### Plot level data

レベルの遷移をプロットしたグラフがこちらです．

```python
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)
```

![](https://i.imgur.com/ngLXosj.png)



### Mean data

#### make mean data

「勝ち」，「負け」のグループに分けて平均を算出していきます．

```python
def extract_columns_data(df_ex_merge, target_name):
    columns_list = [i for i in df_ex_merge.columns if(target_name in i)]
    df_ex_merge[target_name] = df_ex_merge[columns_list].mean(axis=1, skipna=True)
    #df_ex_merge[target_name] = df_ex_merge.mean(axis=1)
    return df_ex_merge
```


```python
df_mean_merge = extract_columns_data(df_ex_merge, "_W")
df_mean_merge = extract_columns_data(df_mean_merge, "_L")
df_mean_merge
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>player_gold_try0</th>
      <th>player_gold_try1</th>
      <th>player_gold_try2</th>
      <th>player_gold_try3</th>
      <th>player_gold_try4</th>
      <th>player_gold_try5</th>
      <th>player_gold_try6</th>
      <th>player_gold_try7</th>
      <th>_W</th>
      <th>_L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>5.0</td>
      <td>600.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>1</th>
      <td>5.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>600.0</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2</th>
      <td>5.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>5.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>3</th>
      <td>5.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>5.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>5.0</td>
      <td>600.0</td>
      <td>600.0</td>
      <td>5.0</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>33798</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>4652.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33799</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>4652.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33800</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>4652.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33801</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>4652.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33802</th>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>4685.0</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
<p>33803 rows × 10 columns</p>
</div>


「勝ち」，「負け」を抽出して平均を算出した`DataFrame`がこちらです．

```python
df_mean_merge2 = df_mean_merge[["_W", "_L"]]
df_mean_merge2
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>_W</th>
      <th>_L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1.0</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1.0</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1.0</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1.0</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1.0</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>33798</th>
      <td>23.0</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33799</th>
      <td>23.0</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33800</th>
      <td>23.0</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33801</th>
      <td>23.0</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>33802</th>
      <td>23.0</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
<p>33803 rows × 2 columns</p>
</div>



各試合のレベル遷移と勝ったときの平均，負けたときの平均をプロットしたデータがこちらです．

```python
plt.figure(figsize=(20,12))


ax = sns.lineplot(data=df_mean_merge2, lw=4)
ax = sns.lineplot(data=df_ex_merge, lw=2, ax=ax)
plt.legend(labels=["Win","Lose"])
#sns.lineplot(data=df_data, x='clock_time', y='level', lw=2)
```

    
![](https://i.imgur.com/vLEzK0p.png)


### Plot health section

#### Extract health data

ここから体力の列だけ抽出して`DataFrame`に新たにぶち込んでいきます．

```python
df_ex_data_list = []
for i, df in enumerate(df_list):
    target_name = 'hero_health'
    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


```python
plt.figure(figsize=(20,5))
sns.lineplot(data=df_ex_merge, lw=2)
```

![](https://i.imgur.com/5GQfOpV.png)



### Plot gold data

#### Extract gold data

ここからゴールドの列だけ抽出して`DataFrame`に新たにぶち込んでいきます．

```python
df_ex_data_list = []
for i, df in enumerate(df_list):
    target_name = 'player_gold'
    result_flag = target_log_file_list[i].split(".csv")[0].split("_")[-1]
    
    plot_name = '{}_try{}_r_{}'.format(target_name, i, result_flag)
    #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)
```

ゴールドの遷移から，稼いだ金額の積算を算出します．

```python
df_ex_merge2 = df_ex_merge.diff().fillna(0)
df_ex_merge2[df_ex_merge2<0] = 0
df_ex_merge2 = df_ex_merge2.cumsum()
df_ex_merge2
```

積算の結果がこちら


<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>player_gold_try0_r_W</th>
      <th>player_gold_try1_r_W</th>
      <th>player_gold_try2_r_L</th>
      <th>player_gold_try3_r_W</th>
      <th>player_gold_try4_r_W</th>
      <th>player_gold_try5_r_W</th>
      <th>player_gold_try6_r_L</th>
      <th>player_gold_try7_r_L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>33798</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18162.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
    </tr>
    <tr>
      <th>33799</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18162.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
    </tr>
    <tr>
      <th>33800</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18162.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
    </tr>
    <tr>
      <th>33801</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18162.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
    </tr>
    <tr>
      <th>33802</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18195.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
    </tr>
  </tbody>
</table>
<p>33803 rows × 8 columns</p>
</div>


勝，負の列をそれぞれ平均します．

```python
df_mean_merge = extract_columns_data(df_ex_merge2, "r_W")
df_mean_merge = extract_columns_data(df_mean_merge, "r_L")
df_mean_merge
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>player_gold_try0_r_W</th>
      <th>player_gold_try1_r_W</th>
      <th>player_gold_try2_r_L</th>
      <th>player_gold_try3_r_W</th>
      <th>player_gold_try4_r_W</th>
      <th>player_gold_try5_r_W</th>
      <th>player_gold_try6_r_L</th>
      <th>player_gold_try7_r_L</th>
      <th>r_W</th>
      <th>r_L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>33798</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18162.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33799</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18162.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33800</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18162.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33801</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18162.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33802</th>
      <td>17763.0</td>
      <td>14212.0</td>
      <td>14526.0</td>
      <td>14759.0</td>
      <td>18195.0</td>
      <td>14715.0</td>
      <td>21314.0</td>
      <td>19372.0</td>
      <td>15928.8</td>
      <td>18404.0</td>
    </tr>
  </tbody>
</table>
<p>33803 rows × 10 columns</p>
</div>


勝，負の列だけを抽出します．

```python
df_mean_merge2 = df_mean_merge[["r_W", "r_L"]]
df_mean_merge2
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>r_W</th>
      <th>r_L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>33798</th>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33799</th>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33800</th>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33801</th>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33802</th>
      <td>15928.8</td>
      <td>18404.0</td>
    </tr>
  </tbody>
</table>
<p>33803 rows × 2 columns</p>
</div>


x軸にとる`index`を作成します．

```python
df_mean_merge3 = df_mean_merge2.reset_index()
df_mean_merge2
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>r_W</th>
      <th>r_L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>33798</th>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33799</th>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33800</th>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33801</th>
      <td>15922.2</td>
      <td>18404.0</td>
    </tr>
    <tr>
      <th>33802</th>
      <td>15928.8</td>
      <td>18404.0</td>
    </tr>
  </tbody>
</table>
<p>33803 rows × 2 columns</p>
</div>




```python
df_mean_merge2.columns
```



```bash
    Index(['r_W', 'r_L'], dtype='object')
```


#### Plot gold data


ゴールドの積算をプロットしたものです．

```python
plt.figure(figsize=(20,10))
sns.lineplot(data=df_ex_merge2, lw=2)
```

![](https://i.imgur.com/JBawccw.png)



平均もプロットしたものがこちらです．

```python
plt.figure(figsize=(20,20))
#sns.lineplot(data=df_mean_merge2, x="index", y="player_gold_try")
ax = sns.lineplot(data=df_mean_merge2, lw=4)
sns.lineplot(data=df_ex_merge2, lw=2, ax=ax)
#plt.legend(labels=["Win","Lose"])
```


![](https://i.imgur.com/lS5KYSa.png)




## 考察

8試合のデータを勝，負に分類して考察していこうと思います．

レベルとゴールドの遷移をプロットしたところ，いずれも勝利したときの平均のグラフの方が敗北したときの平均のグラフより下回っていました．これより，レベルやゴールドを順調に稼いだからといって勝てる訳ではないと考えられます．

これは，味方の振る舞いの影響が想定よりも大きく，自分のレベルやゴールドの稼ぎがそこまで影響していないということになります．
（とても悲しい．．．．）


## プログラム

コードはこちらです．

https://github.com/HamaruKi0303/Dota2-GSI-Science/blob/main/Dota2Analysis04.ipynb

## おわりに

今回はハードボットとの対戦ログを解析してみた結果．
勝利している方が敗北している試合よりもレベル，ゴールドを多く稼いでいると思っていたのですが，その仮説とは相反した結果が得られました．敗北した方が勝利している方より稼いでいる結果になってました．

これは，味方の振る舞いの影響が想定よりも大きく，自分のレベルやゴールドの稼ぎがそこまで影響していないということになりました．

とても悲しい結果ですね．．．．



<h2 id="参考サイト">参考サイト</h2>

- *1：[データサイエンスでDota2強くなるかも説(1)～環境設定～](https://hamaruki.com/2022/09/01/data-science_with_dota2_01/)
- *2：[データサイエンスでDota2強くなるかも説(2)～ビッグデータ取得&定期保存～](https://hamaruki.com/2022/09/01/data-science_with_dota2_02/)
- *3：[データサイエンスでDota2強くなるかも説(3)～試合データをプロットしてみた～](https://hamaruki.com/2022/09/02/data-science_with_dota2_03/)
- *4：[データサイエンスでDota2強くなるかも説(4)～ミディアムとハード試合データをプロットしてみたら驚愕の事実が～](https://hamaruki.com/2022/09/04/data-science_with_dota2_04/)




## 最新情報

速報はTwitterやブログにて

https://hamaruki.com/category/dota2%e3%83%87%e3%83%bc%e3%82%bf%e3%82%b5%e3%82%a4%e3%82%a8%e3%83%b3%e3%82%b9/


https://twitter.com/hAru_mAki_ch/status/1569690537917140994