Talking about lanes in Dota

I wanted to get back to writing some stuff about stats in dota, but didn’t really have both time and a good reason to. And the latter appeared recently as an addition of laning stats in some of the reports in my stats hub. I’d like to tell a story about processing this idea, implementing it and what I noticed so far while looking through the data.

You may read the whole thing, about the idea and implementation, or just straight up skip to the last part with some observations.

Russian version of this text can be found here.

Video version

The Idea

Initial version of the idea was suggested by Fazy on my Discord. But his initial suggestion was slightly different: winrates of heroes playing “from behind”.

All props to Fazy and the idea he wrote in #dev-talks channel

The idea raised some questions straight ahead. What does it actually mean for a hero to be “behind”? How can we define the advantage? How can we detect it? However, I definitely liked the idea, and I was curious, if I’ll be able to actually implement it.

Boring technical part

The concept level of the idea looked fairly easy: just take the networth difference data and detect, who was behind in networth (aka enemy had higher networth) for a longer period of time, while also having a some kind of “tie” threshold (e.g. 10%). And for you to understand why exactly it was close to impossible, I need to explain, how exactly the “reports” work and why I don’t really want to add new features right now.

Back when I started making “reports”, I just wanteed to make a bunch of scripts, just a simple toolset, to automatically gather match data, saving only the data I need to local databases, and then “cooked” the complete “report” — an all-in-one file that would have all the aggregated and calculated data. Initially I thought it will be just a bunch of simple one-time-use scripts to make some Reddit posts about the tournaments and static HTML pages. Something went wrong.

In the end I didn’t have neighther Markdown module for reddit nor static HTML output. But I was still impleementing new features for the Web View, as well as all the other scripts.

Bear with me, it’s all boring, but it’s important to understand the limitations ahead.

So, all the things I explained earlier, led to these problems:

  • The code was quickly thrown together and it wasn’t initially planned to be anything bigger, so it’s hard to support
  • Changing the structure of a database is fairly easy. The problems started with multiple independent DBs, mostly because of the way the scripts were written. In reality the DB structure for a report is somewhat fixed
  • Every report file (due to the way it was processed initially to geneerate simple static pages) is loaded wholly into the memory while processing web view, and well… Sometimes, when the report structure is big and complex, the memory may just end. It made complex data somewhat a taboo for some reports — and it may be easier to just rewrite everything from scratch (and I’m working on exactly that for a while now)

The latter problem got partly solved (and I may write about all the tweaks related to it), but it’s still a significant problem that can’t be ignored.

Slightly less boring practical part

With all the problems I listed just a bit earlier, we practically have these things to consider:

  • We can’t change thee code structure or logic too much (otherwise this shitcastle may just fall)
  • Database structure is practically fixed, so we need to work with something we already have
  • The amount of data geneerated for the report should be limited in size

But what data do we have at out disposal to make any assumtions about the game state and calculate outcomes? My first thought was about “stomp” and “comeback” values, but those don’t even have any faction related information, so they are practically unusable. But then I noticed another field that was leeft unused for a long time: “lane efficiency”.

It’s practically the same as “efficiency” value in Opendota’s match analysis, and it basically says what percentage of the maximum available lane gold (passive and from lane creeps) the hero was able to accumulate to minute 10. This metric always looked interesting to me on paper, but I couldn’t find a good way to use it.

And this is how the idea developed: what if we will decide, if a team was behind or not, by looking at lane outcome? Lane lost = behind, lane won = ahead. And I already had an urge to play with lane stats, so why the hell not? Now the only thing we need is to make a test query, that would combine the data together.

In practice, we have lane stats, calculated from gold at minute 10 mark.

But comparing teams isn’t that useful, so why won’t we compare lane opponents instead?

But what do we do with Supports then? My initial thought was using average efficiency value of Core heroes on the same team as the support hero and compare it to an enemy support — practically using the team’s overall efficiency to evaluate supports. But this approach led to massive increase in query execution time when having a massive number of matches (e.g. meta or ranked reports), so this solution wouldn’t fit. This led to another thought: we may be able to use maximum efficiency value on the lane, so supports will be evaluated using their lane companion. At first I had some doubts about this solution, but it actually turned out to be pretty good in practice.

The only thing remaining is building the test tool to execute the query and look at the data, and…

Last iteration of the test data


Now I just need to integrate it into reports and make a web view for it… and that’s where things became a bit more complicated: important data that gave laning stats context, was a bit too much: test report for patch 7.27d had 8x increase in size! It doesn’t look good. After “wrapping” the data in a nicee way, restructuring data and compressing it, the size change dropped down to 2.5x, which is still a noticable change.


So, that’s about it with the boring tech part. What do we have now?

I used available to me 5.8k+ MMR immortal rank data and generated a report based on it to look a bit more into laning data. Technically I could’ve used competitive data, but the overall trends are pretty much the same, while having much less available data.

First of all, I’d like to explain the table:

  • Matches: basically the hero’s matches, but not necessarily. There may be slight differences from matches values in other tablees. These differences may occur either because of lack of detailed analysis, or because of lack of lane opponent in a certain game (this happens sometimes)
  • Lane win rate: literally lane win rate. It works pretty much the same way you would expect from a regular winrate, but the main thing to keep in mind is that we may get a tie here. Tied match is considered a “half” of a win
  • Rank: just likee with other sections that have rank, it’s some sort of “small winrate” sort. In this case parameters used for rank calculation are hero’s lane win rate, overall number of matches, average advantage (and disadvantage) on won (and lost) lane, as well as winrates for various lane outcomes.
  • Average lane advantage: basically average difference in efficiency. This block has two values — average advantage on a won lane and average disadvantage on a lost lane.
  • Categories for lane outcomes (won, tie, lost), every of which has two values: Ratio, which shows a ratio of this lane outcome matches vs total number of matches, and Games won, which shows winrate with this lane outcome

Now it’s time to talk about the cool stuff I noticed.

First thing that I saw is how surprisingly well this support solution fit into the puzzle. I evaluate most of the data based on my own experience in games, so I may be biased, but everything I saw was pretty much answering to all of my expectations.

What’s also interesting is the effect of using only one value, pretty much tied to gold earned, is practically invisible. I guess, it’s mostly because any of factors that may be able to indicate the lane outcome also affect the difference gold earned: kills, deaths, tower kills, ganks… There were only three cases that raised some concerns.

The first one was Alchemist. I was worried that he will be the winner of every single matchup — and yeah, he still has pretty high lane win rate, and yet… His values aren’t actually as high, as I expected. Partially it’s because he starts to accelerate significantly only with bounty runes spawns, stacks farm and, well, networth difference in general becomes more noticable only after the laning stage. And what’s even more important — there are some additional metrics, like winrate while won or lost lane, as well as average advantage and disadvantage, that give his winrate a better context. These also show that he’s not even the best early game gold earner, and his winrate after lost lane is 14th from the last place.

The second case was winning the lane by switching to jungle. But come to think of it, not many heroes are actually capable of outfarming lane opponent by going to jungle, while also not completely abandoning the lane (otherwise they would be detected as junglers). Not many heroes are even capable of efficiently farming jungle during early minutes, especially since neutrals give less gold early on. So, I think it’s fine to go with the assumption, that if a hero is capable of outfarming the opponent by switching to nearby jungle, then this hero pretty much won the lane.

The last questionable case, that actually caught me thinking for a while is “lost lane that was actually won” — the 1 vs 3 lane scenarios, when a hero gets focused. I had this question asked a couple of times, and even got confused for a moment here: what should we do with these lanes? And the answer came with the question: how is it even possible to “win” the lane while losing it? The lane is still lost, no mater how you call it. And to eevaluate the impact of the lost lanee we can use additional parameters, like win percentage while the lane was lost.

Best laners and snowball heroes

We can look at the heroes with the highest lane winrates straight ahead, and most of them are midlane heroes, with rare exceptions: Broodmother (74.32%), Alchemist (72.82%), Templar Assassin (68.55%), Viper (68.32%), Timbersaw (64.65% — can be played as a sidelane core), Doom (63.90% — not a mid hero, but can be occasionally picked as mid), Sven (63.26% — primarily safelane), Shadow Fiend (63.10%), Lina (62.81% — 40% mid, but mostly support), Bristleback (59.74% — occasionally can be core on any lane, primarily sidelanes), Nature’s Prophet (59.59% — also played in offlane), Meepo (58.62%).

It’s not very surprising, considering most of mid heroes are going to mid specifically because they are capable of either winning a lane or accelerating in farm by getting solo experience and a good start. But it also shows overall “brawling” nature of sidelanes: most sidelane heroes are usually forced to fight or react, and it’s rather common for safelane cores to have slightly less last hits at minute 10 mark as well.

While most supports and safelane cores have high winrates from won lane, but low or at least average winrates on lanes, most midlane cores have the opposite situation. It also clearly shows a thing many players had a feeling about for a long time: it’s easier to win a game from midlane,

The main trend that you can notice is most heroes at the top are also capable of efficiently farming jungle early on, which is the source of their rising lane advantage. It’s not that surprising by itself, but it’s surprising to see some unexpected picture shifts.

For instance, Broodmotheer has a significant lead over Alchemist in both lane win rate percentagee and average advantage. Even average disadvantage on lost lane for Alchemist is significantly higher than for most other heroes, and his winrates with multiple lane scenarios are lower across the board. It may point at both the hero being rather weak and the fact that he has a hard timee coming back from lost lane scenarios.

Another hero that is somewhat similar to Alchemist is Doom: he’s also capable of creating money out of thin air. However, it’s not his only secret: Doom’s stats look significantly better than Alche’s.

A hero that became an interesting observation is Lina, who is here at the top. And while she’s capable of being a midlane core, it’s more common to see her as a support hero these days (she is played as a midlane core in only 40.9% of cases), so she is practically a support hero. However, her winrates, especially the one on lost lane, are lower than aveerage.

It’s also makes Lina similar to Bristleback. This beast is not the most common guest on the middle lane, but has a fairly high lanee win rate, while having the worst winrate from lost lane: 22.1%.

A bit lower at the top wee can see three heroes that almost never go to midlane these days: Bloodseeker (primarily an offlane hero these days), Juggernaut (primarily a carry) and Enchantress (she is mostly picked as a position 5 support, but can be seen as a position 4 support as well, or even midlane/offlane core). These heroes are not the strongest on their roles (Bristleback/Timbersaw, Sven and Lina respectively are a bit ahead), but stability of their stats is more noticable: generally speaking their winrates with every lane outcome are just, well, average. What’s even more curious, they are not early junglers (except for Enchantress, but it’s usually the case for support-ish Ench, and in this case her own farm, acquired in jungle, doesn’t matter).

I’m generally surprised with this list of heroes: it fits almost perfectly into my picture of the game. Some of the heroes that are at the top with lane win rate are practically created for lane domination. Others are pretty popular in current meta exactly because they are capable of dominating the lane, defininfg the trend.

Winning with the lost lane

Going even deeper into lane outcome winrates discussion: there’s not a single hero who has positive (50%+) winrate with the lane lost. In other words, losing your lane is going to increase your chances to lose, regardless of the hero, and it’s better to try to at least draw the lane if possible (e.g. by disrupting enemy’s farm as well if you can’t farm yourself, or acting like you’re actually winning your lane, forcing enemies to back out).

But, obviously, some heroes don’t need to win the lane as much as others. And, there’s indeed some interesting spread of values.

Let’s define context first: Invoker has the highest winrate with the lane lost (39.69%), Bristleback has the lowest (22.1%), and the median is somewhere around 33.8%.

I expected to see heroes like Spectre, Anti-Mage or Terrorblade — safelane cores that usually lose their lane and catch up in the jungle — at the top. But, surprisingly, most of top-10 heroes here are actually supports and offlaners. And the top five are Invoker (39.69%, primarily midlane, can be a position 4 support), Chen (39.66%, almost exclusively a support), Visage (39.02%, can be played as safelane, midlane and offlane core, as well as position 4 support), Clinkz (38.87%, almost exclusively safelane/midlane core), Magnus (38.71%, mostly a midlane core, but can be seen as an offlane core and even as a support).

More interesting, however, is the list of heroes with the lowest winrates on lost lane: aside from Bristleback down here at the bottom you can see Gyrocopter (25%), Wraith King (26.13%), Pudge (26.99%), Lina (27.46%), Omniknight (27.46%), Kunkka (27.5%), Enchantress (27.51%). It’s also worth to note that most of the heroes that have relatively high winrates with lane won can be found here, including some traditional autoattacking type carries (like Monkey King, Lifestealer). It can signify their need to win the lane and snowball from there.

Many heroes, however, don’t win a lot of lanes, but have a high winrate when the lane is tied. It’s not rare to see a hero with a positive winrate on a tied lane, and here at the top we can find a lot of currently popular meta heroes, that may not be able to win the lane as much, but at least are capable of forcing a draw. At the top of the list you can notice Clinkz, Faceless Void, Spectre, Chen, Enigma, Lone Druid.

Lane stats sorted by lane tie winrate

Strongest laners for every role

But if the lane outcome is so important, what should I play then?

Worry not! Just for that I’ll list some best laners for different positions.

I’ll sort the list by rank and limit it to 6 best heroes for every role, that also have lane win rate higher than 51%.

  • Carry: Sven (63.26%), Juggernaut (58.19%), Huskar (57.11%), Lycan (55.71%), Lifestealer (54.96%), Terrorblade (53.71%)
  • Midlane: Broodmother (74.32%), Alchemist (72.82%), Templar Assassin (68.55%), Viper (68.32%), Timbersaw (64.65%), Shadow Fiend (63.10%)
  • Offlane: Timbersaw (64.65%), Doom (63.9%), Bristleback (59.74%), Nature’s Prophet (59.59%), Bloodseeker (58.23%), Axe (57.52%)
  • Support 4: Lina (62.81%), Enchantress (57.98%), Leshrac (55.38%), Tusk (52.58%), Venomancer (52.55%)
  • Hard Support: Enchantress (57.98%), Venomancer (52.55%), Undying (52.26%), Lich (52.06%), Treant Protector (51.59%), Io (51.53%)

And if we’re gonna talk about the strongest ones, why not look about the worst ones as well!

Here are the list of 5 worst heroes for every position to lane with (unique for every position)

  • Carry: Spectre (37.58%), Faceless Void (42.61%), Wraith King (47.95%, rank 10), Lone Druid (47.27%), Drow Ranger (45.47%)
  • Midlane: Visage (36.75%), Sniper (46.36%, rank 0.8), Tinker (37.43%), Puck (39.06%), Ember Spirit (37.78%)
  • Offlane: Omniknight (45.33%), Pudge (44.09%), Abaddon (45.46%), Brewmaster (42.96%), Pangolier (41.24%)
  • Support 4: Techies (41.10%), Enigma (45.67%), Nyx Assassin (45.24%), Earthshaker (44.51%), Tiny (45.18%)
  • Hard Support: Keeper of the Light (43.23%), Dazzle (48%, rank 5), Grimstroke (46.6%), Shadow Demon (45.88%), Winter Wyvern (44.34%)

And everything here looks obvious and nice: we already saw most of it in our games after all. But the most important thing here is this observation: while winning a lane is important and may make your game significantly easier, it’s not the most important thing. For instance, among the “weakest” carry heroes there are three (out of five), that are relatively popular in current meta and are pretty strong. So the key thing here is the bad lane is not the end of the world, even though it’s worth avoiding if possible.

Closing words

Generally speaking, the main thing you shouldn’t do is picking a hero that will lose the lane. Ideally, if you already have a bad lane matchup, it’s better to force a draw or at least act like you won the lane, so nobody will suspect a thing.

But how do I pick a hero for a lane matchup? For this specific case I enabled the laning component for every immortal ranked trends report starting with 7.27, as competitive season report and meta reports. Not only you can research overall laning stats for all the heroes, you can also look for a better or worse matchup against specific hero as well.

Share your findings and in the Spectral Discord, on Twitter (@ileamare) or send it to my VK page.

And you can also find the 7.27d laning stats here:

And, well, try not to lose your lanes, and even win most of them!




Writing code and stories.

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

7 Tips for that can help Learn Programming Faster

Building Home Automation Open-Source App With React Native, Node, Express and Raspberry Pi

2018 in retrospect.

Thanks to programming, how did I make $ 200k when I was 16 years old?

30 second tool review:

A Poor Man’s Unit Testing Framework For Powershell

Moving Parts

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Lea Spectral

Lea Spectral

Writing code and stories.

More from Medium

How to estimate meta balance level

Science and innovation, an ambiguous relationship

Jack McDowell: Matching Theory

Who will be the first to finish the reading? The science of cheating.