I tracked 200 games to figure out my best heroes in comp using Google Docs and code magic

I figured I'd go ahead and share it anyhow. A good friend of mine I queue with said you folks might find it interesting.

What is this?

So what is it? This right here

This is a spreadsheet where I have tracked all of my gains and losses by hero(es), map, starting SR, and ending SR (along with notes). A few simple formulas are used to make this process a little easier. For example, The starting SR value is actually a function that return the value of the column that is one up, and one right. (The ending SR value for the previous match). The amount gained/lost is determined by subtracting column D from column C * -1. This is nice as it saves me from having to do all of this manually at the end of games. I just need to know my heroes, maps, and ending SR for games.

Now, the fun part isn't the boring list of wins and losses. The REAL fun is in the tabs below. "Heroes", "Maps", "Gamemode" and "By Map By Hero". Each of these tabs are calculated statistics based on all these rows found in "Main". Lots of stats are calculated here such as total wins, losses, average gains per win, average losses per loss, net SR gained this season, total SR gained, total SR lost, etc.

Now, I'm sure all of this looks extremely tedious to calculate all by hand, but the best part is each of these pages are automatic functions that update each time a new row is added. Therefore, many of these stats are realtime as you enter them, meaning minimal effort for up to date stats on hero performance.

How does it work?

Interestingly enough, Google lets you define custom spreadsheet functions in Javascript that you can use in your document. I originally wrote individual functions for each statistic--and while it was a great prototype, this eventually became extremely expensive. At a point, over 6,000 functions would auto-update each time data was added. This became so unbelievably expensive, it was actually causing me to lag during games, because my web browser was using so much processing power to iterate through all of these functions. Some were even prone to fail due to the mass volume of updates.

Due to that, I wrote some quick and dirty code to help mitigate this problem. Using some special implementations, I was able to significantly optimize the code. So well, in fact, that each tab is now a single function (including by hero by map!) This significantly decreased the amount of functions to be called, thus increasing update time and reducing redundancies.

If you are interested, you can find a copy of the code used in the spreadsheet In this Github Gist. (This code was all written live, and may not follow best practices, fair forewarning!)

All hero and map lists are pulled from a master list. New copies of the list are created for most functions, and are iterated through. This is nice, actually, because it makes it extremely simple to add both maps and heroes. For example, I wrote this before Moira was released. In order to add her to the heroes tab, and to every single map statistic, all I had to do is add her to the _heroes object, and the code took care of the rest.

What does everything mean?

As a fair forewarning, I am no statistician by any means. Most all of the information I track is extremely simple (and perhaps even skewed). I'm sure with some cooperation from somebody with a more math oriented background, I could clean this all up. But for what I have right now:

Heroes

Games - Total number of games played (For example, if I pick Moira and Orisa for a Numbani game, both Moira and Orisa have "1" game each)
Games Adj. - Total number of games, adjusted. This attempts to account for heroes that weren't played for a full time. For example, if I pick Moira and Orisa for a Numbani game, then each hero has played .5 of a game.
Winrate - Winrate, based on total games
Winrate Adj. - Winrate, based on total number of games, adjusted
Break Even Winrate - Based on how much SR I average when I win on a hero based on how much I lose with a hero. Based on those numbers, this is how often I would have to win with that hero to have a net SR gain of 0 with that hero
Total Wins - Total number of wins on the hero
Total Wins Adj. - Total number of wins on the hero, adjusted
Total Losses - Total number of losses on the hero
Total Losses Adj. - Total number of losses on the hero, adjusted
Net Gain - Total value of all SR gains + SR losses with this hero
Net Gain Adj. - Total value of all SR gains + SR losses with this hero, adjusted (For example, if I lose a game on Numbani while having picked Moira and Orisa, and lose 25 SR, each hero is responsible for having lost 12.5 SR in this calculation)
Avg Net Gain Per Game - Net Gain / Total Games
Avg Net Gain Per Game Adj. - Net Gain Adj / Total Games Adj
Total Point Gain - Total number of points the hero has gained
Total Point Loss - Total number of points the hero has lost
Total Point Loss Adj. - Total number of points the hero has loss, adjusted
Highest Point Gain - The highest amount of SR the hero has ever won in a game
Avg Point Gain Per Match - On average, how much SR is gained when the hero wins a game
Highest Point Loss The highest amount of SR the hero has ever lost in a game
Avg Point Loss Per Loss - On average, how much SR is lost when the hero loses a game
Avg Gain Per Match Adj. - On average, how much SR is being gained by playing this hero each match (This is equal to total point gain - total point loss / total games, to figure out approximately how much this hero is earning you each time you play them).

Maps

Mode - What mode this map is considered (used for GameMode calculations)
Times Played - How many times this map has been played
Times Won - Total wins
Times Lost - Total losses
Winrate - Total wins/ total games
Total Net Gain - How much SR has been gained minus how much has been lost
Avg Net Gain - How much, on average, is gained by playing this map.
Total Gain - Total number of points gained by winning on this map
Total Loss - Total number of points lost by losing on this map
Avg Gain - How much is won on average when winning on this map
Avg Loss - How much is lost on average when losing on this map
Highest gain - The most ever gained on the map in a win
Highest loss - The most ever lost on the map in a loss
Best Heroes - Names of heroes with the highest number of wins on the map
Worst Heroes - Names of the heroes with the lowest number of wins on the map

GameMode

Games - Total games
Wins - Total wins
Losses - Total losses
Winrate - Total wins/ total games
Net Gain - How much SR has been gained minus how much has been lost
Avg Net Gain - How much, on average, is gained by playing this mode.
Total Gain - Total number of points gained by winning on this map
Total Loss - Total number of points lost by losing on this map
Highest gain - The most ever gained on the mode in a win
Highest loss - The most ever lost on the mode in a loss

Heroes

Matches - Total number of games played (For example, if I pick Moira and Orisa for a Numbani game, both Moira and Orisa have "1" game each)
Times Played Adj Adj. - Total number of games, adjusted. This attempts to account for heroes that weren't played for a full time. For example, if I pick Moira and Orisa for a Numbani game, then each hero has played .5 of a game.
Wins - Total number of wins on the hero
Wins Adj. - Total number of wins on the hero, adjusted
Total Losses - Total number of losses on the hero
Total Losses Adj. - Total number of losses on the hero, adjusted
Winrate - Winrate, based on total games
Winrate Adj. - Winrate, based on total number of games, adjusted
Break Even Winrate - Based on how much SR I average when I win on a hero based on how much I lose with a hero. Based on those numbers, this is how often I would have to win with that hero to have a net SR gain of 0 with that hero
Net Gain - Total value of all SR gains + SR losses with this hero
Net Gain Adj. - Total value of all SR gains + SR losses with this hero, adjusted (For example, if I lose a game on Numbani while having picked Moira and Orisa, and lose 25 SR, each hero is responsible for having lost 12.5 SR in this calculation)
Total Point Gain - Total number of points the hero has gained
Total Point Gain Adj. - Total number of points the hero has lost, adjusted
Total Point Loss - Total number of points the hero has lost
Total Point Loss Adj. - Total number of points the hero has loss, adjusted
Highest Point Gain - The highest amount of SR the hero has ever won in a game
Avg Net Gain Per Game - Net Gain / Total Games
Avg Net Gain Per Game Adj. - Net Gain Adj / Total Games Adj
Highest Point Loss The highest amount of SR the hero has ever lost in a game

What was your motivation for this?

Overwatch seems like an extremely random game when it comes to SR gains and losses. Even now, I still can't make heads or tails of it. I came from years of playing competitive TF2 in UGC. In my time there, I met many great players, who went on to be great Overwatch players. And the results of who landed where is nothing short of astounding. Many of Overwatch's top players are former TF2 competitive players from both ESEA and UGC. I am familiar with quite a few top names, and actually managed to have the honor to play with JAKE back when he was sneakypolarbear in Squirtle Squad in UGC's season 15 gold division.  I have kept in touch with many members of that team, and members of other teams we played against. Remarkably, many of the players there struggle to even maintain Masters (often falling out to ridiculous loss streaks, or gaining nothing per win). Still more, I recall of players who often played in much lower divisions achieving top 500 or being 250+ points into GM.  Given this, I have come to the belief that given the erratic wins/losses based on seemingly arbitrary statistics, simply "playing to win" is not the best approach if I seek to climb.  To paint a better picture, I find it best to not try to find the hero I perform best on, but where the system thinks I perform the best on, and I have an adequate winrate to support it. (Ultimately,  one-tricking, or limiting my hero pool to mitigate losses rather than attempt to truly win the most). JAKE has a wonderful article on one-tricking you can read about here

(How) did this help?

In truth, most people would think of this entire spreadsheet irrelevant and would likely instead go off statistics on sites like MasterOverwatch or Oversumo to determine their performance. However, in my findings of comparing my statistics here to statistics on their sites. In my experiences, there seems to be little correlation to relative hero performance and SR gain to loss ratio.

Oversumo is a mobile application that will scrape your stats and then compare them to people at your SR level, to figure approximately how much better or worse you do in what are believed to be SR-weighted stats. Here are a few excerpts of Oversumo for my game sessions for this season

From this gallery, you can see that:
Orisa - Despite a ~150% increase of hero performance on average, with almost 170% damage blocked on average, Orisa only gains ~22.54 per win, and loses ~23.52 per loss, making almost a full point difference
Winston - With almost a 170% average, Winston actually loses about half a point more per loss
Reaper - Like above, holds roughly a 160% performance average, yet still manages to lose almost two-thirds of a point (~22.67/-23.36)
Ana - While not featured here (I forgot to save the screenshots), actually was extremely low, performing at roughly 110% average at best. Yet, her gains are extremely high, almost 27.3 per win, and only ~21.5 per loss, making it not only positive, but positive by almost 6 whole points and about five points above most heroes.

The information here can be crosschecked with the info on the spreadsheet. But, in short, you can find that hero performance seems to have negligible impact to the amount of gain to loss, and even so far as whether or not you would break-even with good hero performance.

Regardless, it certainly has influenced my hero pick. This sheet has allowed me to re-evaluate which heroes should and shouldn't be picked--sometimes by map, sometimes at all.

Orisa is a good example here. Before tracking my statistics, I often found myself rarely picking Orisa, because when I won, my gains were often low (usually 21-23 per win). However, I noticed that in general, my Orisa picks were netting a high winrate. (At one point, I had managed over a 80% winrate for about 50 games). Despite the low earnings however, I was winning often enough to offset the low gains. My losses were similarly low (however, I did lose more per loss), so I still needed to maintain above a 50% winrate. Thus, I picked her more often.

Ana was another fantastic example. When I won with Ana, I often would gain quite a bit. In fact, it was almost 27 points per game on average. What made this even more exciting was my losses were low, averaging only about 22 points per loss. This was huge! It would make a lot of sense to play her, and even if I wasn't maintaining a 50% winrate I should be doing okay, right? Wrong. While I was technically right (I only needed a 42% winrate to break even, my wrinate was showing to be as low as 37% with Ana on average, thus costing me SR).

Mercy - Prior to the nerf, Mercy was an absolute necessity and everyone knew it. I often ran games where nobody wanted to play Mercy, however. Often times, I found myself taking one for the team and locking Mercy, because I felt even an inexperienced Mercy was better than none. I was finding, however, that my losses with her were significant, losing up to 28 points in a game before, and averaging 25 per loss on the games I used her. Furthermore, gains were low, with the HIGHEST gain being only 21 (average of 20). Ultimately, this showed me the system punished me so much for trying to flex and make up for a meta role, it was better to just not play her at all and let the team attempt to win without it.

Map picks were influenced as well. One good example of this is King of the Hill. Even now, KOTH is my worst gamemode, displaying the most losses. Looking through it, my hero pools that were considerable elsewhere (such as Orisa) were performing abysmally on KOTH. This helped me positively influence my choices by switching my hero pool to other heroes to try and redeem games. A great example of this was Lijiang tower and Winston. For the first 8 games I played on Lijiang Tower, I had a 100% winrate using Winston.

What are the pitfalls?

This isn't a force-pick system. Hero picks still only make sense if the team accommodates them. Just because you have an 80% winrate on Bastion on Junkertown doesn't mean he's going to work if nobody on your team plays a barrier tank. Common sense and circumstantial plays still have an impact. And even if everything is right, it still doesn't mean you're going to win.

Needless to say, this isn't a foolproof system. You are still bound to inevitably lose. This is built to try and help mitigate losses and hopefully pull out a few more wins based on statistics.

Despite 10 games on Eichenwalde, with a 90% winrate on Orisa, I managed to lose 3 consecutive games with Orisa on Eichenwalde from teams that insisted upon overextending or unable to put out damage.

Similarly, with a 100% winrate Winston across 8 games on Lijiang, I lost two consecutive games where DPS were not able to put out enough damage for me to  finish any of their squishy targets, thus losing the game.

Can I use this?

Yes! This is written to intentionally be abstract. You can actually copy this spreadsheet to your own Google docs (File -> Make a copy). In order to make use of it, clear out the rows on Main and add stats for your own games to get started

Final thoughts

So, what does it all mean, then? Truthfully, I still really don't know. But from what I can tell, being a "team player" seems to be the worst decision you can make at a personal level. It genuinely seems best to have a select hero pool that does not punish you as harshly for losing. With that pool in mind, go in and roll the dice to see what the system gives you. Many games seem predetermined by skill mismatches--and even of the ones that are not, you are guaranteed to inevitably lose (an entire game's worth) some games  in circumstances where you receive a griefer or DCer on your team.

Unless you can guarantee yourself the ability to independently wipe the majority of the enemy team during each team fight, and need little more than warm bodies to capture an objective, queuing to climb seems little more than luck of the draw.