As we know here (I even wrote books about this) throughout history those who have used models well have been able to get a big advantage over the bookmakers. This has led me to have no other choice but to try my hand at building a predictive model of LoL game outcomes, using data available as of the point in time the game took place. Even if you don’t have an interest in betting but simply enjoy watching and playing LoL, this article should be of interest to you as we will learn much about the game along the way. In particular, after reading this article you should have a better understanding of how to analyze the pick/ban phase, how to tell if a team is actually good (versus a team that has just been getting lucky), and the importance of correct side selection in competitive play (spoiler, always pick blue).
If you only care about information relevant to those who analyze/predict games as well as overall LoL strategy, and not statistics or the process of building a model, skip to the sentences written in Bold.
Here we will use the excellent and free data set from @TimSevenhuysen at Oracle’s Elixir. Before we start it is helpful to list what subset of LoL games we are modeling as well as some steps taken to prepare the data:
 Our training set (the games we are modeling) will be games from Spring 2017 through Summer 2019. Past data from the 2016 Spring and Summer splits is included in the calculation of historical data for 2017 games
 Only domestic league games from LMS, EULCS/LEC, NALCS/LCS, LCK, CBLoL, and TCL are used – we will ignore international play and Challenger/Academy/smaller leagues and LPL is not included because their histories don't have complete stats
 Team and league names have been aligned to the best extent possible to ensure the best match of historical team stats when teams have changed names
 We are modeling the winner of any one game, not the match in best of two or best of three series
 All data mentioned is calculated as of the pointintime of the game; that is, we only know stats as they were when the game took place
 Everything is done in R and the calculation of these pointintime stats was done mostly with the sqldf package
Feature Development: Team Stats
When building a predictive model of future sports outcomes, we are most interested in features built around stats that describe difference in team skill as well as possible, while also having a high degree of repeatability/carryover into future games. In developing this model most reasonable stats related to gold, kill, dragon, tower and win difference per game were tried and compared. An issue not unique to LoL is that most of these stats are highly correlated – that is, if you know kill difference in a game, you probably know the gold difference in that game, and most likely who won the game as well. Whenever you have stats that are highly correlated, or collinear, often one stat will seem much better at predicting outcomes over a sample of games due to pure random chance, but in the future, another similar stat that measures largely the same thing will appear to be much better. The consequence of this is that including all these stats in combination will not help you better predict the winner of future games than simply choosing the best ones that are most stable over time.
From testing, a combination of two statistics best predicted future game outcomes: simple win percentage in past games, and gold spent percentage differential in past games. The first stat simply tells us who won, and the second stat measures how close the game was akin to a “margin of victory” in something like a baseball game. Does a team who wins blowouts that ended with a 10k gold lead when both teams had only 45k gold win more games than a team who wins many close games by 2k gold? Just like in almost all traditional sports, the models tell us that the team that won more past blowouts does indeed win more games in the future than teams that won close games.
One challenge with using team stats in a predictive model is that at the beginning of the split, we have less information about the teams than at the end. For example, two games into the split, some teams will be 20 with a 100% win rate, while others will be 02 with a 0% win rate in past games. Obviously, we would never predict the 20 team to win 100% of the games against the 02 team going forward. Yet if we include raw data in our model in this way, we will be telling our model to do just this. The model which has a job of using past numbers to predict future ones will respond by weighing the early split games less (as they have stats that are not very useful) and late split games more, which will hurt its predictions across all games on average. Just as we would do when handicapping using our mind or penandpaper, when developing features for predictive models based on past stats, we must combine our past stats with a prior expectation that we had of the team’s ability at the beginning of the split.
Using team stats alone, the best prediction about how good a team will be in the following split in any one stat is how good they were the split before, mixed with how good a league average team is. A league average team will win half their games and have a gold spent percentage difference of zero. From this knowledge we can design our team statistic features as follows, where b and c are constant values:
Win Percentage = (Current Split Wins + b*Last Split Wins + c*(0.5)) / (Current Split Games + b*Last Split Games + c)
Gold Spent Difference Percentage = (Current Season GSPD + b*Last Split GSPD + c*(0)) / (Current Split Games + b*Last Split Games + c)
The final question is how to choose the constants b and c. The larger b is, the more we will weigh last split’s stats relative to the current split, and the larger c is, the more we will assume that LoL teams tend to return to the league average performance each split. If our constants are too small, our model will overrate performance in the current split, while if they are too large, it will not adjust fast enough to split over split improvement or decline. In this exercise we chose b and c through testing all reasonable evennumber combinations and finding those that produced the model that best predicted match outcomes in future games. These values were b = 0.3 and c = 5. This means that our final features for win percentage and gold spent percentage differential in past games will include the last split weighted at 30%, plus five games of leagueaverage performance. For example, suppose SKT is 40 (100%) this year and was 268 (76.4%) last year. SKT’s win percentage would be calculated as:
(4 + 0.3*26 + 5*0.5)/((4+0) + 0.3*(26+8) + 5) = 74.5%
Note the significant weight to both last split’s stats and the league average. It is very important to not overreact to a few games early in the season. When predicting team strength, we should not consider the current split’s performance to be more predictive than the entire previous split until we are at least 30% of the way into the current split.
Our First Predictive Model
With our first two features in hand we can now build a model that uses the difference in team stats, as they were at the time of the game, to predict the winner of any one game. The simplest type of model suitable for this task is a logistic regression, part of the family of generalized linear models. Given variables that describe differences in team strength, the logistic regression will provide coefficients that best predicted a probability that either team will have won past games given those past stats. We hope that this relationship will hold stable over time for use in future games. We define our model as:
Probability Blue Side Team Wins the Game ~ Intercept + Coefficient 1*(Difference in BlueRed Win Percentage) + Coefficient 2*(Difference in BlueRed Gold Spent Percentage Difference)
Plugging this into R we obtain an output of:
Estimate 
z value 

Intercept 
0.2384 
7.808 
Win Percentage Difference 
2.38 
6.241 
Gold Spent Percentage Difference 
5.43 
4.504 
To start the interpretation of this, let’s begin with the intercept, estimated at 0.2384, and assume that the teams involved in this game were exactly equal – that is, both teams had identical win percentage difference and gold spent percentage difference in past games. The GLM equation here does not provide a raw probability, but instead a set of numbers that build a probability estimate after being plugged into the following equation:
1 / (1 + exp((Numbers))
To estimate the probability the blue team wins the game given otherwise even teams, holding the other two numbers at 0 we obtain the odds that the blue team wins the game as
1 / (1+exp(0.2384))
= 0.559. That is, in games since 2017 with otherwise even teams, the blue side team should be predicted to win 55.9% of the time. This is a huge advantage, yet many teams voluntarily pick the red side given side selection. They are making a decision that is 11.8% worse than the right one!
Of course, the game has evolved over time between counter picks, meta shifts, easier access to baron/dragon through blast plants, etc. Has the blue side become more or less valuable in each meta?
Split 
Predicted Blue Side Win Rate After Adjusting for Team Strength 
Spring 2017 
57.4% 
Summer 2017 
57.1% 
Spring 2018 
54.7% 
Summer 2018 
56.2% 
Spring 2019 
52.6% 
Summer 2019 
56.2% 
While the blue side advantage was slightly lower in 2019 it is still far enough above 50% that no team should realistically ever choose the red side. Riot is well aware of this and actually adjusts matchmaking to make red side teams stronger (with higher MMR players than blue) in solo queue. While one would guess pros would be able to mitigate this, the reality is that the advantage persists. Pros are probably relatively better at red side than amateurs, but the skill difference between top pros is much lower than amateurs in solo queue and this magnifies that slight advantage in skill shot aiming and reaction time that the blue side provides.
Moving on to win percentage difference and gold percentage difference, we see that the model has chosen to use both variables in combination. That is, a combination of past win percentage and past gold spent difference percentage predicts future outcomes better than either statistic alone. Let’s take an example. Suppose Team A on the Blue Side has a calculated past win percentage of 0.65, a past gold spent difference percentage of +0.06, while Team B has a calculated past win percentage of 0.47 and a past gold spent difference percentage of 0.01. The model would predict the following outcome:
1 / (1 + exp((0.2384 + 2.38*(0.650.47) + 5.43*(0.060.01)))) = 0.740 = Blue Side wins the game 74.0% of the Time
In this example the past gold spent difference values were chosen to be typical of teams that win that percentage of games. Knowing this, the output aligns with what we would expect. A team that wins 65% of the time against average teams would be expected to win slightly more than that against a below average team who wins 47% of the time, perhaps 66 or 67%. Combine that with the additional advantage of being on the blue side and we would expect them to be in the low 70% range, which is what the model predicts. Let’s now take the same two teams, but assume that they had the same gold spent percentage difference of 0.02 in past games, indicating that Team A likely got lucky and won many close games while Team B lost many close games:
1 / (1 + exp((0.2384 + 2.38*(0.650.47) + 5.43*(0.020.02)))) = 0.660 = Blue Side wins the game 66.0% of the Time
We can see that gold spent percentage difference in past games can be very influential, changing our prediction by almost 8% in this example.
Feature Development: Player Stats
All stats available at the team level are also available at the player level in the Oracle’s Elixir data set. We can therefore, in theory, look at stats like past KDA/CS difference at the player level, then use these player level stats to aid in our prediction. Unfortunately, I never have found these player level stats to be useful in predicting which team will win games, likely for two reasons. One, most teams don’t change players during the splits at all other than the occasional sub, and even between splits, often don’t make many changes. And when players are changed, they tend to be of similar skill level due to things like team budgets and reputation. This means that we aren’t really measuring anything new by using player stats instead of team stats. Two, player stats are highly dependent on team context – a team might swap out a low KDA player for a high KDA player, but often the high KDA player was just coming from a better team that won most of its games, and teams that win usually have higher KDAs. So even where using player stats might bring something new to the table, often the stats are simply wrong.
However, as some may have noticed, one possible issue with the team stats we have used involves teams that were recently promoted from Challenger as well as completely new teams. Since we have no games of performance from these teams in the previous split, we have basically assumed these teams will perform at a league average level, which in the past would have greatly overestimated their chances. Furthermore, we are making no adjustment for offseason roster moves at all in other teams.
In reality, new and newlypromoted teams can be expected to have a wide range of performance. Truly “new” teams such as those that bought a franchise spot that are mostly made up of good/veteran players from other teams would not be expected to be worse than average, while a team of true Challenger/Academy level players that was just promoted would be expected to perform poorly. A statistic that would capture this concept is the average number of games played by the team’s starting five in top leagues over the past few splits. Do teams with more experienced rosters outperform even after accounting for team stats? We can test this by adding the difference in team experience level, defined as the average games played by the team’s starters over the current split todate and the two splits before that, to our model. The model finds this variable helps better predict games even after including past team results:
Estimate 
z value 

Intercept 
0.2386 
7.8 
Win Percentage Difference 
2.29 
5.98 
Gold Spent Percentage Difference 
4.94 
4.08 
Roster Games Played Difference 
0.0052 
4.26 
Including roster games played does improve our model compared to the previous case, with the AIC of our model dropping to 6123.9 vs 6147.2 before. Note that with the inclusion of games played, the coefficient values of win percentage and gold spent percentage difference dropped slightly. This is because games played in past games is collinear with winning; more experienced teams won more games earlier in the season. However, the model still chooses to use a mix of the three indicating that we are adding additional information and predictive power with this new variable.
Games played difference tends to be fairly small, as most games feature matchups of experienced teams that started almost every game and therefore only vary by singledigit games of experience. Some games however do show a very large difference in experience level, with differences of 50+ games in some cases:
A difference of 50 games translates to a value of 50*0.0052 = 0.26, which assuming even teams, translates to a 6.4% difference in the probability a team wins the game. In short, teams with an experience advantage can be expected to win many more games even after accounting for their past statistics, with an influence on what we would predict of over 5% in win probability in the most extreme cases.
Feature Development: The Draft and Team Comps
So far we have included aspects of both team and roster performance in building our model. However, one of the more enjoyable aspects of esports betting is the ability to bet during the pick/ban phase of the games. In my experience most bookmakers keep their odds open during this period and are smart to do so as judging by odds moves, they tend to get a lot of betting action during this time period. Bettors always seem to have their own views of which team “won the draft” which often are overly influenced by the commentators.
There are two angles around which we can look at the draft. The first is through looking at team composition. This requires a description of the characteristics of the individual champions. For each of the champions that have been used in professional play I have assigned characteristics to the champion, using the following table:
Champion 
Tank 
Scaling 
AD 
AP 
Split 
Engage 
Gnar 
0.5 
0 
1 
0 
1 
0 
Gragas 
1 
0 
0 
1 
0 
1 
Varus 
0 
0 
1 
0 
0 
0 
Kog'Maw 
0 
1 
1 
0 
0 
0 
Alistar 
1 
0 
0 
0 
0 
1 
Yasuo 
0 
0.5 
1 
0 
1 
0 
Hecarim 
0 
0 
1 
0 
0 
0 
Viktor 
0 
1 
0 
1 
0 
0 
Sivir 
0 
1 
1 
0 
0 
0 
Tahm Kench 
1 
0 
0 
0 
0 
0 
Gangplank 
0 
1 
1 
0 
1 
0 
Elise 
0 
0 
0 
1 
0 
0 
Karma 
0 
0 
0 
1 
0 
0 
Jhin 
0 
0 
1 
0 
0 
0 
Janna 
0 
0 
0 
0 
0 
0 
Taliyah 
0 
0 
0 
1 
0 
0 
Ashe 
0 
1 
1 
0 
0 
0 
Taric 
0 
0 
0 
0 
0 
0 
Ekko 
0 
0.5 
0 
1 
1 
0 
Twisted Fate 
0 
0 
0 
1 
1 
0 
Thresh 
0 
0 
0 
0 
0 
1 
Pantheon 
0 
0.5 
1 
0 
1 
0 
Rek'Sai 
0 
0 
1 
0 
0 
0 
Bard 
0 
0 
0 
0 
0 
0 
Kassadin 
0 
1 
0 
1 
0 
0 
Maokai 
1 
0.5 
0 
1 
0 
1 
Kindred 
0 
0.5 
0 
0 
0 
0 
Corki 
0 
0.5 
1 
0 
0 
0 
Kalista 
0 
0 
1 
0 
0 
0 
Miss Fortune 
0 
0 
1 
0 
0 
0 
Trundle 
0.5 
0.5 
1 
0 
0 
0 
LeBlanc 
0 
0.5 
0 
1 
1 
0 
Lucian 
0 
0 
1 
0 
1 
0 
Lissandra 
0.5 
0 
0 
1 
0 
1 
Fiora 
0 
0.5 
1 
0 
1 
0 
Lux 
0 
0 
0 
1 
0 
0 
Shen 
1 
0.5 
1 
0 
1 
0 
Braum 
1 
0 
0 
0 
0 
0 
Ahri 
0 
0 
0 
1 
0 
0 
Olaf 
0 
0 
1 
0 
0 
0 
Zac 
1 
0.5 
0 
0 
0 
1 
Poppy 
1 
0.5 
1 
0 
0 
1 
Lee Sin 
0 
0 
1 
0 
0 
0 
Orianna 
0 
1 
0 
1 
0 
0 
Ezreal 
0 
0 
1 
0 
0 
0 
Ryze 
0 
1 
0 
1 
1 
0 
Graves 
0 
0.5 
1 
0 
0 
0 
Kennen 
0 
0.5 
1 
1 
0 
0 
Zed 
0 
0 
1 
0 
0 
0 
Lulu 
0 
0 
0 
1 
0 
0 
Tristana 
0 
1 
1 
0 
0 
0 
Dr. Mundo 
1 
0.5 
0 
0 
0 
0 
Jayce 
0 
0 
1 
0 
1 
0 
Nautilus 
1 
1 
0 
1 
0 
0 
Azir 
0 
1 
0 
1 
0 
0 
Quinn 
0 
0 
1 
0 
0 
0 
Nidalee 
0 
0 
0 
1 
0 
0 
Morgana 
0 
0 
0 
1 
0 
0 
Syndra 
0 
0 
0 
1 
0 
0 
Irelia 
0 
0 
1 
0 
1 
0 
Malphite 
1 
0.5 
0 
1 
0 
1 
Zilean 
0 
0 
0 
1 
0 
0 
Diana 
0 
0 
0 
1 
0 
0 
Vel'koz 
0 
0.5 
0 
1 
0 
0 
Cassiopeia 
0 
1 
0 
1 
0 
0 
Evelynn 
0 
0 
0 
1 
0 
0 
Jax 
0 
0.5 
1 
0 
1 
0 
Cho'Gath 
1 
0.5 
0 
1 
0 
0 
Anivia 
0 
0.5 
0 
1 
0 
0 
Caitlyn 
0 
0 
1 
0 
0 
0 
Rumble 
0 
0.5 
0 
1 
0 
0 
Sion 
1 
0.5 
1 
0 
0 
0 
Udyr 
0 
0.5 
1 
0 
0 
0 
Leona 
1 
0 
0 
0 
0 
1 
Rengar 
0 
0 
1 
0 
0 
0 
Vayne 
0 
1 
1 
0 
0 
0 
Soraka 
0 
0 
0 
0 
0 
0 
Jinx 
0 
1 
1 
0 
0 
0 
Blitzcrank 
0 
0 
0 
0 
0 
1 
Nunu 
0 
0.5 
0 
0 
0 
0 
Draven 
0 
0.5 
1 
0 
0 
0 
Nocturne 
0 
0 
1 
0 
0 
0 
Rammus 
1 
0.5 
0 
0 
0 
1 
Fizz 
0 
0.5 
0 
1 
0 
0 
Kayle 
0 
0.5 
0 
1 
0 
0 
Karthus 
0 
1 
0 
1 
0 
0 
Nasus 
1 
0.5 
0 
1 
0 
0 
Sejuani 
1 
0.5 
0 
0 
0 
1 
Renekton 
0.5 
0 
1 
0 
1 
0 
Talon 
0 
0 
1 
0 
0 
0 
Malzahar 
0 
0.5 
0 
1 
0 
1 
Jarvan IV 
0.5 
0.5 
1 
0 
0 
1 
Kha'zix 
0 
0 
1 
0 
0 
0 
Twitch 
0 
1 
1 
0 
0 
0 
Urgot 
0.5 
0.5 
1 
0 
1 
0 
Vladimir 
0 
1 
0 
1 
0 
0 
Nami 
0 
0 
0 
1 
0 
1 
Veigar 
0 
1 
0 
1 
0 
0 
Swain 
0.5 
0.5 
0 
1 
0 
0 
Aurelion Sol 
0 
0 
0 
1 
0 
0 
Zyra 
0 
0 
0 
1 
0 
0 
Amumu 
1 
1 
0 
1 
0 
1 
Ziggs 
0 
0 
0 
1 
0 
0 
Riven 
0 
0 
1 
0 
1 
0 
Illaoi 
0.5 
0.5 
1 
0 
1 
0 
Volibear 
1 
0 
1 
0 
0 
1 
Brand 
0 
0.5 
0 
1 
0 
0 
Teemo 
0 
0 
0 
1 
0 
0 
Sona 
0 
0 
0 
1 
0 
0 
Xerath 
0 
1 
0 
1 
0 
0 
Mordekaiser 
0.5 
0 
0 
1 
1 
0 
Akali 
0 
0 
0 
1 
0 
0 
Ivern 
0 
0.5 
0 
1 
0 
0 
Xayah 
0 
0 
1 
0 
0 
0 
Galio 
1 
0.5 
0 
1 
0 
1 
Camille 
0 
0 
1 
0 
1 
0 
Kled 
0.5 
0.5 
1 
0 
0 
1 
Rakan 
0 
0 
0 
1 
0 
0 
Kayn 
0 
0 
1 
0 
0 
0 
Warwick 
0.5 
0 
1 
0 
0 
0 
Katarina 
0 
0.5 
0 
1 
0 
0 
Cho'gath 
1 
1 
0 
1 
0 
0 
Aatrox 
0 
0 
1 
0 
0 
0 
Skarner 
0.5 
0.5 
1 
0 
0 
1 
Shyvana 
0 
0 
1 
0 
0 
0 
Annie 
0 
0.5 
0 
1 
0 
0 
Shaco 
0 
0 
1 
0 
0 
0 
Singed 
1 
0 
0 
1 
1 
0 
Yorick 
0.5 
0.5 
1 
0 
1 
0 
Fiddlesticks 
0 
0 
0 
1 
0 
0 
Heimerdinger 
0 
0 
0 
1 
0 
0 
Vi 
0 
0.5 
1 
0 
0 
0 
Ornn 
1 
0.5 
0 
1 
0 
1 
Xin Zhao 
0 
0 
1 
0 
0 
0 
Kai'Sa 
0 
1 
1 
1 
0 
0 
Master Yi 
0 
1 
1 
0 
0 
0 
Zoe 
0 
0 
0 
1 
0 
0 
Darius 
0.5 
0 
1 
0 
0 
0 
Pyke 
0 
0 
1 
0 
0 
0 
Wukong 
0 
0 
1 
0 
0 
0 
Neeko 
0 
0 
1 
1 
0 
0 
Sylas 
0 
0 
1 
1 
0 
0 
Yuumi 
0 
0 
0 
1 
0 
0 
Qiyana 
0 
0 
1 
0 
0 
0 
Garen 
0.5 
0 
1 
0 
1 
0 
These ratings are basic (most champions we are talking about only 0/1, yes or notype ratings) and some champions have changed characteristics due to reworks or meta shifts over time. You may disagree with some of these ratings, but I think most are reasonable and should give us a basic idea of which types of team compositions are likely to have an advantage over others, if any. Using these numbers, we can then assign a rating to each team’s composition around each characteristic. We assign characteristics based on the following:
 Tank, AD, AP, Scaling, and Split push characteristics are given by the sum of that value across champions teams picked in that one game, excluding the support
 The Engage characteristic also includes the support
 Finally, we have a Tank characteristic specific to the jungler, as tank junglers have won far more than their share of games
We can then test all such characteristics in our model, to see if they add more predictive ability than team+player stats alone. We find the following:
 There is no advantage in having more AD/AP/Scaling/Split Push champions than the other team; champions have generally been balanced across these dimensions
 There is a huge disadvantage in having an allAD/allAP team composition
 Tanky and engageheavy team comps have slightly outperformed those without a tank, but not enough to be a significant variable in our model
 Tank junglers have strongly outperformed other types of junglers across metas
These compositional factors show up in our model as follows:
Estimate 
z value 

Intercept 
0.2379 
7.748 
Win Percentage Difference 
2.25 
5.86 
Gold Spent Percentage Difference 
5.16 
4.24 
Roster Games Played Difference 
0.004979 
3.99 
Blue All AP/AD  Red All AP/AD 
0.3042 
2.92 
Blue Tanky Jungler  Red Tanky Jungler 
0.1947 
3.4 
This model shows further improvement over our last model, with an AIC of 6103.7 versus 6123.9. Making these changes did not significantly impact the other variables in our model, suggesting that team draft performance is independent of results in past games. Note the sizable influence of both variables in this model. About 7.7% of the time, one team picked an allAD or AP team comp into the other who didn’t, and these teams won 42.5% of the time given other things being equal. In other words, the itemization advantage these flawed team comps provide is worth 7.5% in win rate to the other team. Tank/engage style junglers also greatly outperformed, with the coefficient of 0.1947 indicating that teams having this advantage at the jungle position won 54.8% of the time, given other variables being equal. While allAD/AP team comps will likely always be terrible, the tank jungler is likely more a function of meta and which junglers have been better in general throughout LoL. However, it should be noted that running the above model on each split as opposed to all games, tanky junglers outperformed in every single split since 2017.
The other important aspect of the draft involves the wellknown pick/ban and win rates. Do team compositions featuring a combination of champions that have been successful in recent games outperform those that have been less successful? The answer turns out to be a definitive yes, but it is important to take care in how one determines “successful”.
A challenge using past win rate in LoL is that champions are nerfed/buffed each patch, with the “best” champions typically seeing the most nerfs (buffs on the other hand are pretty much random). Although there is a list of changes on Riot’s site, it would be too timeconsuming to determine which of these changes were influential on the champion’s win rates and to what degree. Ideally we would only use stats from the current patch since that reflects each champion’s ability best; however, using champion stats just from the current patch does not provide us with enough of a sample of the champion’s performance in most cases to add any value to our predictions.
To deal with this, we compromise by using only stats from the past 30 days in our measurement of champion level stats, and calculate pick/ban and win rate as of the past 30 days of LoL play across all leagues, not just the league in question. In addition, much of the time we will be faced with champions that have not seen significant play in the last 30 days, plus we do not want to overreact to a champion who has, for example, a win rate of 30 in 3 games. Empirically we find that the best way to deal with this is to use the same methodology as we did with team stats, assuming that most champions are average and adjusting our view of the champion as it builds a stronger positive or negative record over more games. We hence estimate win rate and pick/ban rate using the following equations:
Win Rate: (Wins Last 30 Days + 20 Wins) / (Picks Last 30 Days + 40 Picks)
Pick/Ban Rate: (Picks Last 30 Days + 4.5) / (Games Last 30 Days + 10 Games)
We can then find the “Expected Win Rate” and “Pick/Ban Rate” of a team’s champions by taking the average of these statistics, as they were at game time, across all their champions in that game. For example, suppose Team A picks champions with a 54.5%, 59.0%, 48.7%, 52.1%, and 48.0% win rate according to the above calculations. The average of these five percentages is 52.46% and represents the team’s expected champion win rate for the current game.
Testing team comp win rate and pick/ban rate difference in our model, we find that pick/ban rate adds nothing to our model after team comp win rate is included, but that past win rate adds a great deal to our ability to predict the winner of each game. Our final model is as follows:
Estimate 
z value 

Intercept 
0.2338 
7.59 
Win Percentage Difference 
2.24 
5.83 
Gold Spent Percentage Difference 
5.16 
4.24 
Roster Games Played Difference 
0.00494 
3.96 
Blue All AP/AD  Red All AP/AD 
0.3009 
2.88 
Blue Tanky Jungler  Red Tanky Jungler 
0.1837 
3.19 
Team Comp Win % Differential 
2.176 
2.5 
This addition further improves the model, reducing the AIC to 6099.4 from 6103.7 before. One weakness of our past champion stats is that at the beginning of a new split, we will assume all champions are the same. This is indeed the best assumption to make, as usually champion power levels are drastically changed from split to split. However, this does tend to understate the usefulness of using champion stats to predict future games. One change we can make is to only build our model on games where at least 100 games have been played across all leagues in the 30 days leading up to the game in question. Making this cut reduces the number of games in our sample from 4835 to 4164, but does increase the weight of team comps in our model:
Estimate 
z value 

Intercept 
0.22 
6.6 
Win Percentage Difference 
2.193 
5.36 
Gold Spent Percentage Difference 
5.424 
4.19 
Roster Games Played Difference 
0.00546 
3.99 
Blue All AP/AD  Red All AP/AD 
0.272 
2.45 
Blue Tanky Jungler  Red Tanky Jungler 
0.163 
2.64 
Team Comp Win % Differential 
2.87 
3.08 
The champion past win percentage across team comps tends to hover around 51%, as teams are slightly more likely to pick champions that have been successful in recent games, although not nearly to the degree that they could if they highly valued this metric. With five champions per game, inevitably teams pick a mix of over and under 51%win rate champs. However, differences of around 5% are not rare:
Other things being equal, a difference of 1% in the average past win rate of a team’s champions compared to their opponent translates to a 0.7% difference in the team’s expected win rate in that game. In the extreme case of a 5% difference in past champion win rate, a team can gain 3.5% in win probability by picking high win rate champions compared to their opponent. A good way to determine a champion’s win rate is through its record in all pro LoL games played over the past 30 days, adding a 50/50 record of 20 wins over 40 games to that champion’s win rate to account for the fact that champions win and lose games due to random luck and other factors outside of the power level of that champion.
Overview and Further Improvements
In this article we have walked through the process to build a predictive model of LoL games using past stats. What we didn't do is walk through out of sample testing or backtesting against historical lines to determine if this actually wins, because that stuff is boring and I don't have good historical line data anyway.
Either way, it is important to note that it is only possible to include a fraction of the information that is available at gametime in this type of predictive model which uses past game data to predict future games. For example, early in the season we have assumed that teams perform the same as they did the season before, or in the case of new teams, at a league average level, with an adjustment for roster experience level. A professionallevel LoL handicapper would not use this simple prior assumption but would instead look indepth at offseason roster and coaching moves to determine how well the team was likely to perform in the upcoming season. They would then adjust this prior accordingly.
In addition, a professionallevel LoL handicapper would not take the recent champion winrate stats at face value but instead adjust for buffs/nerfs, and possibly also have their own prior about what champions are OP, rather than just assuming all are average. However, it is important to not overadjust in either case. Often, champions that teams say are good to the point they are picked/banned 100% are actually garbage and don't actually win games, and are only in the meta because they did well in scrims. Just like in real sports there is more to esports handicapping than simply using the stats, although stats should always form the basis for one’s handicapping.