The Creep Score Difference statistic is commonly used to evaluate a player’s laning phase; however, it’s far from a perfect stat. One of the main problems I have with the stat is that it doesn’t account for the champion matchup, which may give each player advantages or disadvantages before the game even starts.
To account for the strength of matchups in CSD, I have created a matchup-adjusted CSD stat which is calculated by taking the actual CSD and subtracting the matchup’s average CSD from it.
Adjusted CSD = CSD – Matchup CSD
Since this formula uses matchup averages for CSD, it is important to set some limitations on what can be used as the matchup average. I’ve set the sample size limit for each matchup to 5 games: if a matchup has been played 5 games or more, then the average CSD over those games will be used, but if the matchup has been played for fewer than 5 games then the matchup CSD will be registered as 0, meaning that the adjusted CSD will equal the actual CSD.
One issue that arises from implementing a minimum number of games for a matchup is that there may not be enough data on a lot of the matchups. While I only want to use pro play for the matchup CSD value, I also need to ensure that I can get a value for almost all matchups. To do this in the calculations that follow, I’ve decided to use data from the CBLoL, LCK, LCS, LEC and LMS. All of the data used from these leagues is from games played on the same patches (9.01, 9.02, 9.03, 9.04, 9.05) during the Spring Split 2019 regular season.
To illustrate, the size of the adjustments that can be made using this approach, the tables below show the 5 matchups for each role that have the largest average CSD at 10 minutes with a minimum of 5 games played.
Largest Matchup CSD Adjustments
Top Lane
| Champion | Opponent | Games Played | CSD@10 |
| Jayce | Sylas | 5 | 18.2 |
| Jayce | Ornn | 6 | 15.2 |
| Jayce | Yorick | 11 | 12.4 |
| Jayce | Vladimir | 6 | 11.7 |
| Fiora | Aatrox | 6 | 11.3 |
Jungle
| Champion | Opponent | Games Played | CSD@10 |
| Karthus | Lee Sin | 5 | 17 |
| Jarvan IV | Zac | 5 | 13.8 |
| Karthus | Gragas | 6 | 11.8 |
| Olaf | Camille | 5 | 10.6 |
| Gragas | Zac | 6 | 9.3 |
Mid Lane
| Champion | Opponent | Games Played | CSD@10 |
| Zoe | Viktor | 6 | 15.2 |
| Lissandra | Zilean | 5 | 14.6 |
| Zoe | Galio | 5 | 10.2 |
| Lissandra | Galio | 21 | 9.4 |
| Akali | Galio | 5 | 8.8 |
Bot Lane
| Champion | Opponent | Games Played | CSD@10 |
| Lucian | Vayne | 6 | 13 |
| Lucian | Viktor | 7 | 12.4 |
| Kai’Sa | Viktor | 7 | 11.4 |
| Jinx | Kai’Sa | 5 | 9 |
| Xayah | Sivir | 5 | 9 |
For every role shown, there are champions that have more than one matchup that is very good or very bad for them. Examples of these champions are Jayce in the top lane, Karthus in the jungle, Galio in the mid lane and Lucian in the bot lane. This is to be expected, since champions that are in-meta would be expected to have many favourable matchups and champions that are non-meta would be expected to have many bad matchups. This is partly why Galio, who has three matchups in the bottom five in the mid lane, was almost not played at all in the mid lane near the end of Spring Split and almost exclusively as support.
With numbers like these, it’s easy to see that players who frequently played in favourable matchups would’ve earned higher CSDs than their skill might warrant, which will be corrected in their adjusted CSD, while the opposite will be true for those who played many unfavourable matchups.
A full list of the matchups used in the calculations of adjusted CSD for the 2019 spring split can be found in this spreadsheet.
Applying Matchup-Adjusted CSD
The next step is to compare the results of actual CSD@10 to adjusted CSD@10 to see what impact the adjustment has on actual players. To do this, I’m going to look at the biggest winners and losers based on how they rank compared to the rest of the LCS. I’ll do this with supports excluded and only including players with at least 10 games played. The 5 players who are most benefited and the 5 players most hurt by the adjusted CSD are displayed below.
| Player | Actual CSD Rank | Adjusted CSD Rank | Rank Difference |
| Crown | 20 | 10 | 10 |
| huhi | 32 | 23 | 9 |
| Darshan | 27 | 20 | 7 |
| Santorin | 8 | 2 | 6 |
| Dhokla | 41 | 36 | 5 |
| WildTurtle | 24 | 29 | -5 |
| Solo | 15 | 21 | -6 |
| Froggen | 6 | 13 | -7 |
| Xmithie | 10 | 18 | -8 |
| Huni | 23 | 31 | -8 |
The players who have positive values in the rank difference columns are players who were typically put into poor matchups in the draft by their team. These players had worse laning stats than they may have deserved, due to having poor matchups consistently, and so the other stats typically used to measure a player’s strength may have been affected by this as well. For example, even though huhi definitely didn’t have a great performance this past split, part of that underperformance was due to poor matchups, so maybe his performance wasn’t as bad as it appeared.
The opposite is true for the players with negative values in the rank difference columns. For these players, their laning stats may have been inflated. This is especially worrying for a player like Huni, who already seemed to be performing below his usual performance. His inflated stats might mean that he was actually performing even worse than it appeared.
Examples – Huhi
Taking a closer look at the specifics of the games and how they went can give us a better idea of how a player played, as well. Let’s start with huhi, who played 12 games in Spring Split and whose match history can be found in the table below. Five of his games were in unfavourable matchups, two were favourable, and five were matchups with fewer than the required five games played.
Huhi’s Mid Lane Matchups, Spring 2019
| Champion | Opponent | CSD@10 | mCSD@10 | aCSD@10 |
| Urgot | Zilean | 0 | — | 0 |
| Ryze | Aatrox | -7 | +3.7 | -10.7 |
| Urgot | Akali | +1 | -5.4 | +6.4 |
| Ryze | Lissandra | +2 | -2 | +4 |
| Lissandra | Zoe | +0 | -1.8 | +1.8 |
| Ryze | Viktor | +7 | — | +7 |
| Aurelion Sol | Zoe | -2 | — | -2 |
| Lissandra | Zoe | -16 | -1.8 | -14.2 |
| Lissandra | Ryze | +12 | +2 | +10 |
| Sylas | Orianna | -16 | — | -16 |
| Ryze | Sylas | -12 | — | -12 |
| Viktor | Zoe | -1 | -15.2 | +14.2 |
The interesting thing about huhi is that in the five unfavourable games, where his average matchup CSD@10 was -5.2, he only had a CSD@10 of -2.8 and thus an adjusted CSD@10 of +2.4. Meaning that he performed better in poor matchups in terms of adjusted CSD (aCSD@10) than in even or good matchups (where his average aCSD@10 was -3.4). This seems to indicate that huhi is the type of player that is relatively good at losing gracefully but isn’t able to push advantages very well. Therefore, he should be someone that his team often blind picks for in draft, since having a favourable matchup isn’t something that he’s very good at abusing.
Examples – Huni
Huni’s match history below illustrates the possible drawbacks of the adjusted CSD stat. The first issue is that many of Huni’s games don’t have a matchup average value. Due to Huni’s variety of champions played and cheese picks, there is often not a large enough sample size to have a matchup average, which is why 13 of his 18 games have no value for mCSD@10. This means that the adjusted CSD stat will likely not provide much more information than the actual CSD.
However, there is still a lot to be gained from analyzing Huni’s match history. The first thing is that his CSD@10 and aCSD@10 are largely decreased by his Spellthief’s Zilean game in which he didn’t CS until he got his upgrade. With that game removed, his CSD@10 jumps from -0.6 to +2.6 and his aCSD@10 goes from -1.9 to +1.3. This game made such a big impact on his CS differentials that without it he goes from a below-average player to an above-average player in terms of CSD. Furthermore, if we look at Huni’s split in general, he seemed to have played much better near the end of the split. In his final 8 games, his CSD@10 and aCSD@10 were +12 and +12.3 respectively. This could be an indication that Huni is improving, returning to his old form and ready for a bounceback split in Summer 2019.
Huni’s Top Lane Matchups, Spring 2019
| Champion | Opponent | CSD@10 | mCSD@10 | aCSD@10 |
| Rumble | Sion | +4 | +4.9 | -0.9 |
| Viktor | Aatrox | -8 | — | -8 |
| Jayce | Sion | +14 | +10.6 | +3.4 |
| Rumble | Akali | -14 | — | -14 |
| Zilean | Urgot | -56 | — | -56 |
| Urgot | Sion | -1 | +4.7 | -5.7 |
| Rumble | Sion | +3 | +4.9 | -1.9 |
| Sion | Riven | -36 | — | -36 |
| Cassiopeia | Kennen | -1 | — | -1 |
| Malphite | Kennen | -12 | — | -12 |
| Karma | Riven | +15 | — | +15 |
| Cassiopeia | Yorick | +10 | — | +10 |
| Karma | Vladimir | +13 | — | +13 |
| Rumble | Aatrox | +10 | — | +10 |
| Ryze | Lissandra | +5 | -2 | +7 |
| Lissandra | Ornn | -10 | — | -10 |
| Vayne | Akali | +34 | — | +34 |
| Lucian | Gangplank | +19 | — | +19 |
Conclusions
The goal of this adjustment to CSD is to increase the predictability of player performance. Adjusted CSD should be more consistent than raw CSD from split to split, and thus be a better indicator of player skill. With matchups taken into account, we can get a much better idea of players’ laning performances. We can also use this information to find certain characteristics of players to see how they may suit a certain team or style, such as whether they perform best in favourable or unfavourable matchups.
The biggest problem with most metrics in League of Legends is that they can be heavily skewed by various contextual factors, and if we ignore lane matchups then we are removing an important variable from our analysis.
However, adjusted CSD isn’t without its drawbacks, as it relies on matchups being played enough times and thus is more reliable in metas where there aren’t as many viable picks in each role. It will also be much more beneficial compared to CSD when evaluating a player who mostly plays meta champions, and will provide little extra value for a player like Huni who plays all sorts of niche champions.
Jack Park is a LoL data analyst who has worked for the Golden Guardians. Find him on Twitter at @jackparkdata.
