Improving CSD – A better way to measure effectiveness in lane

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


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


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.

4 thoughts on “Improving CSD – A better way to measure effectiveness in lane”

  1. Hi,

    It’s very good that to see a CSD topic raised on oracleselixir :) It really like the approach of eliminating champion or even whole matchup factor by measuring the distance to some average ‘benchmark’ value. It is however not only a CSD thing – I do believe most stats, if not all, should be analyzed like that.

    What is a real drawback about CSD and what was not mentioned in the article is that due to being a stat taken from given timestamp it has a huge flaw: if one lane is pushing towards the other at 10 or 15 minutes mark (for CSD@10 & CSD@15 respectively), that laner will have temporary CSD advantage over his opponent. Such advantage will most likely be evened out the next minute when the wave eventually reaches the turret. Here is one quite old but still valid example:

    A good way to examine my thesis is to measure CSD at 10 minutes and for instance at 11 minutes to see how it may differ. Maybe even measure average CSD for every minute from 5 to 15 and compare this to raw CSD@10.

    This considered, CSD is a very poor stat that I would not consider at all. Adjustment to CSD mentioned in the article partly help because often pushing factor is very much determined by the matchup, however it is not always the case. In my opinion, ‘CSD’ should be measured otherwise and there can be a few ways to do it:
    1. comparing between lane opponents only ‘missed’ CS
    2. adding lane’s alive minions to one’s CS score (this assumes they will CS 100% which is not entirely correct)
    3. calculating % CS effectiveness as given player minion kills (on his lane) / total minions that died (on that lane). This % can be compared between lane opponents the same way as CSD is.

    I’m not touching jungle CS topic as for me it is a complete different story to lane CS.

    Of course, this approaches are currently not supported by any data from Riot API but it is really worth consideration.


    1. Hi Patrollbb,

      I agree 100% that this idea of adjusting for matchups can be implemented in almost any stat. People already use this outside of laning stats as well with damage rating (champion adjusted damage) as an example of this.

      In regards to the flaws in measuring CS in general, I see your point as it can seem volatile especially in the early game. However, using only missed CS as a comparison might run into a similar problem. If one person has a big wave stacking up against them then they would have killed less minions than their opponent and therefore, their CS missed value would be much lower than it may be after that wave crashed. This method tilts the CSD in favour of the person who has a wave crashing against them.

      Regarding the second idea of adding up the scores, you addressed one of the problems which is that they won’t necessarily always get 100% of the missing CS. Another reason why this may not work so well, is that it will be hard to tell how far off of the 100% they will be because that will vary based on the situation. If they are under turret and being harassed they will likely miss a larger percentage of the CS than if they are the ones pushing the wave. Once again this method seems to reward the one losing the matchup.

      Finally for the third option, I think that this would be the most useful. But, I wouldn’t use it as a replacement. This allows one to see the efficiency of the CS of a laner and if they had a low efficiency that probably means that they are frequently pushed in. However, what it doesn’t provide that the raw value of CSD provides is an indication as to how much this percentage lead is contributing to a gold lead and ultimately how much stronger through laning does one laner get versus another. If someone has 10% more CS than their opponent and they have 110 CS while their opponent has 100 that is a larger gold difference than someone having 55 CS and their opponent having 50 which is the same percentage difference. I think that this would be very useful in tandem with the raw CSD as a means of further evaluating how the lane went.

      Assuming that this was supported by data from the Riot API, I think that this kind of information would allow us to go into much more depth as to how a lane went for someone. I don’t think that any of these options should be used as replacements for CSD, but using them along with CSD could definitely provide us with some new insights.

  2. Hello again,

    Your answer is more than I ever expected! I’m really glad that you went through my findings and what is more some of them you found worthy :)

    In fact, your examples and explanations convinced me that none of my proposed calculations is good enough to use. Instead, I took a different approach now based on what I already mentioned above. The real problem is the timing of CSD. We could argue when should CSD be captured – on 10th or 15th minute? Many, including Tim, already discussed that. What I am convinced now is that single capture based on specific time can always be volatile and biased so we should work on something different.

    In my first comment I also had an idea to calculate CSD each minute from 5 till 15 and taking average. Wouldn’t that be a bit better way to measure CSD? This helps a bit as with more observations data is less likely to be distorted by some temporary factor. It is better, yet for sure far from perfection. Maybe some castes all, maybe some most ‘data capture moments’ when they are once a minute they can still consist the same bias and this way calculated CSD will mimic the CSD@10 and CSD@15 problems.

    Now a new concept: imagine we are able to have a summary of each minion wave after all minions of that wave are dead. The summary will include laner’s minions scored of that wave and the time when the wave perished. This way, we could agree on a number of X waves that are a representation of the early or early-to-mid game just like we did with CSD being calculated @10 or @15. With that, we could calculate CSD after this X waves only on minions from this waves which already are all dead (nothing more accumulated waiting to be scored). Wouldn’t this be the best solution?

    Releasing my fantasy out I could imagine with such minion wave summaries for each wave why wouldn’t we do a breakdown of the whole laning phase: a table with CSD for each wave of minions: +1,-2,0 etc. with the time own wave and opponent’s wave perished (to also see if there was lane freezing or sth). Something like a waterfall chart would illustrate that perfectly! Shouldn’t this be a direction?

    1. Hi patrollbb,

      I like the idea of taking the average of the CSDs each minute from 5 to 10 or 15 and using that. This still gives a single numerical value and a similar adjustment for matchup could be used on this. It is also still very simple for the everyday fan to gauge how a player did in a certain match using this as it is with CSD.

      The summary of the minion waves including the time of wave death and the player’s CS proficiency based on number of waves is something that I find really interesting. I think that it would be something very valuable to pro players and teams more so than to regular fans. But, this would provide teams with much further insight on how matchups and lanes should be played out. It’s one thing to know Jayce should beat Sylas in lane, but what’s even more valuable is how. With the wave timings one would be able to figure out at what levels the matchup may change, for example, Sylas beats Jayce level 1 to 3 and then from level 4 on Jayce beats Sylas. This method would give teams a way to quantify some of the things that they would be reviewing in video and confirm their thoughts as to how certain matchups should be played.

      I really like both of these ideas and how they would be able to improve the needs of fans along with pro players and teams. I hope information like this becomes available in the near future as I’m sure that some interesting findings will come about with this.

Leave a Reply to patrollbb Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.