Rを使って対戦ゲームLoLで、イロレーティング(Elo rating)を測定してみた

Data Science

2017.12.5

Topics

こんにちは。データサイエンスチームのjwsです。
この記事は、DataScience Advent Calendarの5日目の記事です。
 
League of Legends(以下LoL)というPCゲームを聞いたことありますか?
私は、最近はプレイしなくなったものの
重要な「e-sportsの試合」は日程をチェックして視聴しています。
特に、今年はWorld Championshipが中国で開催されて時差があまりなかったので、
ほとんどの試合を生放送で見ることができました。
 
今回は2017年のLeague of Legends Champions Korea(以下LCK)の勝敗結果をもとに
各チームのElo rating(あとで説明します)を簡易的に計算してみて、
レーティングの値が実際の結果を表しているかを試してみました。
果たして優勝チームは、レーティングも最も高かったでしょうか?
 

LoLとは

Riot Gamesが開発したMOBA(Multiplayer online battle arena)ゲームで、
月間プレイユーザー数は1億名を超える世界的なヒット作です。
■ Game Site:https://jp.leagueoflegends.com/ja/
■ Wikipedia :https://ja.wikipedia.org/wiki/League_of_Legends
 

LCK & World Championship

毎年、秋に開かれるLoL World Championshipは、各国リーグの上位チームだけが招待され、
世界トップの座を競う最大級のイベントです。
この大会でLCK所属のチームが2013年から2017年まで5年間連続して優勝を果たしたので、
LCKは言うまでもなくLoL世界最強のリーグです。
LCKはspringとsummerの2シーズン制で、各チームの2回総当たり戦で行われます。
なお、シーズンの順位によってWorld Championshipへの出場ポイントが付与されます。
 

Elo ratingとは

アメリカの物理学者であるアルパド・イロ(Arpad “Elo”)博士が対戦ゲームであるチェスで
プレイヤーの実力を数値化(レーティング)するために考案した手法です。
以下、Wikipediaから抜粋した具体的な計算方法です。
イロレーティング – Wikipedia

つまり、


の2人が対戦してAが1回勝ったとしたら、


になり、


になります。(K=16の場合)

仮定

♦ レーティングの初期値は、すべてのチームにおいて1500とします。
:過去の成績から見てチーム間の戦力差は存在しますが、今回は考慮しませんでした。
♦ K = 16。
:Kの値を大きくすればするほど勝敗によるレーティングの変動幅が大きくなります。
♦ LCK summerでの勝負は、LCK springのレーティングを引き継ぐものとします。
なお、World Championshipでの勝負は、LCK summerのレーティングを引き継ぐものとします。
 

計算フロー

2017年LCKの勝敗データをゲーム情報サイトから入手しました。
トータルで約500回の試合が行われました。
その後、上記の計算式を反映したR関数を作成し、各対戦に対してレーティングを計算しました。

### eloRating function ###
eloRating=function(RA, RB, k=16) {
  EA <- (1 / (1 + 10^((RB - RA)/400)))
  EB <- (1 / (1 + 10^((RA - RB)/400)))
  
  newRA  <- RA + k * (1 - EA)
  newRB  <- RB + k * (0 - EB)
  
  df <- cbind(newRA, newRB)
  return(df)
}
### rating calculation ###
for(i in 1:nrow(dataset)){
  A <- dataset[i,]$winner
  B <- dataset[i,]$loser
  
  RA <- master[master$team == A,]$rating
  RB <- master[master$team == B,]$rating
  
  newRating <- eloRating(RA, RB)
  newRA <- newRating[,1]
  newRB <- newRating[,2]
  
  master[master$team == A,]$rating <- newRA
  master[master$team == B,]$rating <- newRB
}

結果


① まず「SKT T1」はLCK springの優勝チームらしく
springシーズンはもちろん、ほとんどの期間で一番高いレーティングを記録しました。
ただし、LCK summerの中盤以降は、苦戦も見受けられます。

②「LONGZHU GAMING」は、LCK summerでの勢いがすごいです。
その勢いこそLCK summerを制覇した原動力でしょう。
しかし、LCK springでの成績が悪かったので
年間のレーティングでは 一度もトップに立ったことがありません。

③「Samsung Galaxy」は、全般的に「SKT T1」よりレーティングが下回ったものの
World Championshipでの成績が良くて、 最後の最後でレーティング逆転に成功しました。
レーティングも彼らが今年の王座に相応しいと言ってくれます。
諦めずチームのパフォーマンスを改善していった努力に拍手を送ります。
優勝賞金は、$172万のようですね。おめでとうございます。
 

まとめ

このように簡単な関数とデータさえあれば、誰でもElo ratingを計算することができます。
対象の戦力を数値化してみることは、順位を追うこととはまた違う魅力があります。
ご自分の興味ある分野において適用してみるのはいかがでしょうか。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

jws

データサイエンスチームでBIや分析案件の対応を行っています。MMORPGを含め、Civilization、XCOM、Football Manager、League of Legendsなどのゲームが好きです。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら