Help us understand the problem. What is going on with this article?

初心者の初心者による初心者のためのデータ分析!League of Legendsで下克上を目指せ!(大体の試合時間を調べてみた)

数ある記事の中からこのページを開いてくださりありがとうございます。

就労移行支援施設でpythonなどの勉強をしているまゆんごまゆまゆと申します。

先日まであげていた記事

初心者の初心者による初心者のためのデータ分析!League of Legendsで下克上を目指せ!(穴場のチャンピオン探し編)

初心者の初心者による初心者のためのデータ分析!League of Legendsで下克上を目指せ!(機械学習で代替案編)

に続きLeague of Legendsの分析をしていきます。

今回やること

これまでの分析では試合であまり使われていないけれど勝率の高いキャラクター(=チャンピオン)を調べたり、万が一使えなくなってしまった場合の代替案の候補を機械学習を用いて考察をしました。

今回はブルー(試合のフィールドで見ると左下側の陣地)の方から見て勝っている時と負けている時の試合時間は大体どれくらいかを調べていきます。

検証方法

これまでと同様にLeague of Legendsの試合データから試合の勝敗、試合時間の部分をお借りします。

試合時間の平均値や最大値最小値だけでなく統計学でよく見かける概念(中央値、パーセンタイル値、分散値、標準偏差値、最頻値)も用いていきます。

言語はPythonでJupyter Notebookを使用します。

検証開始!

csvファイルを入れ使いやすいように加工する

import pandas as pd
import numpy as np

match_data = pd.read_csv('matchinfo.csv')#コードとcsvファイルは同じフォルダで保存している。pandasはここで使用。

time_average = match_data[['bResult', 'gamelength']]#新しくtime_averageとしmatch_dataからブルーのチームの勝敗と試合時間の記録に絞り込む

time_average.head()
#データの冒頭を見てみましょう。
bResult gamelength
1 40
0 38
1 40
0 41
1 35

bResultで1が勝ち、0が負けになります。

これだとちょっとわかりにくいのでWinとLoseに変えていきましょう。

time_average.replace(0,"Lose", inplace=True)
time_average.replace(1,"Win", inplace=True)

time_average.head()
bResult gamelength
Win 40
Lose 38
Win 40
Lose 41
Win 35

これで勝ち負けが一発でわかるようになりました。

続いてデータの概観を見てみましょう。

time_average.describe()
gamelength
count 7620.000000
mean 37.012598
std 7.983238
min 17.000000
25% 31.000000
50% 36.000000
75% 41.000000
max 95.000000

全部で7620試合で一番長い試合だと90分以上という長丁場だったことがわかります。

勝った試合と負けた試合に分けてより細かく見ていきましょう。

平均値、最大値最小値、中央値、パーセンタイル値

平均値や最大値最小値については説明は必要ないかなと思います。

中央値とは一連のデータを値の大きさで並べ替えた時中央に位置する値のことです。

そしてパーセンタイル値は値の大きさで並べ替えた時指定した順位に位置する値です。

result = time_average.groupby("bResult").agg({"gamelength": ["mean", "max", "min", "median", lambda x: np.percentile(x, q=20)]}) .reset_index()

result.columns = ["bResult", "time_mean","time_max", "time_min",  "time_median", "time_20per"]

result
bResult time_mean time_max time_min time_median time_20per
Lose 37.437536 78 18 36 31
Win 36.656536 95 17 36 30

勝っている時と負けている時で平均時間、中央値、パーセンタイル値で大きな差がないことがわかります。

ただこれだけだとどれくらい試合時間が分散されているかが不明です。

例えば勝っている場合の試合時間の範囲が17分から95分と非常に広く、時間の分布で偏りがあったり極端に散らばっている可能性もゼロではありません。

今度は分散値、標準偏差値を見ていきましょう。

分散値、標準偏差値

分散値も標準偏差値も平均値からのばらつきを示す値で、分散値は標準偏差値を二乗したものになります。

result_2 = time_average.groupby("bResult").agg({"gamelength": ["var", "std"]}).reset_index()
#ここでは新たにresult_2という変数を使用。
result_2.columns = ["bResult", "time_var", "time_std"]
#time_var(分散値)time_std(標準偏差値)を勝敗ごとに記述した表を作成

result_2
bResult time_var time_std
Lose 62.314122 7.893929
Win 64.657396 8.040982

勝っている場合も負けている場合もばらつきに大きな差がないことがわかりました。

それぞれのばらつきが小さいとはちょっと言い難そうです。

勝っている場合も負けている場合も試合の平均時間は約37分で変わらないので試合時間が勝敗に直接関わってくるといわけではなさそうです。

最後に最頻値を見ていきましょう。

最頻値

最頻値はデータ群などの中で最も頻繁に出てくる値になります。

result_3_win = time_average[time_average['bResult'] == "Win"]
result_3_lose = time_average[time_average['bResult'] == "Lose"]
#今回は勝敗ごとに分ける

result_3_win = result_3_win["gamelength"].mode()
result_3_lose = result_3_lose["gamelength"].mode()
#mode()を使用

print("Win: " + str(result_3_win))
print("Lose: " + str(result_3_lose))

Win: 0    34
dtype: int64
Lose: 0    33
dtype: int64

勝っている場合も負けている場合も差は微々たるものであることがわかりました。

まとめ

1つの試合にかかる時間は35分前後であることが多いもののある程度のばらつきがあることは否定できないようです。

また、勝ち負けで差が生じるのかというところについても大きな差は見られず試合時間が勝率に直接関係するということはなさそうです。

今後の課題として試合中チームとしてどのような作戦をとれば勝ちやすくなるかとなっていくので引き続き検証を進めていきます。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away