Resource Your one-stop shop for GSC OU statistics

Siatam

is a Tutoris a Forum Moderatoris a Top Community Contributoris a Top Metagame Resource Contributoris a Senior Staff Member Alumnusis a Former Old Generation Tournament Circuit Champion
Moderator
While this thread will serve as documentation for the project I would also like it to be a location for discussion about the cool charts and statistics people find using the tool. Please feel free to post in the thread!

Table of Contents:
Introduction
Documentation and example analyses (How to use)
Disclaimers about data and statistics
Fun Stats


Introduction:

I'm proud to present the GSC OU Stats Master (Patent Pending), a data analysis project that I've been chipping away at for the past few months. Before getting into the details of the spreadsheet I'd like to show a few demonstrations of what it can do.

Calculate Usage and Win Rate for Pokemon, move, and opponent combinations:
1775691713926.png
1775691717095.png


Display Usage and Win Rate for Pokemon, move, and opponent combinations over time using rolling averages:
1775691723061.png


Search replays by user, opponent, date, Pokemon, moves, and result:
1775691727488.png



How does The GSC OU Stats Master do this?
This spreadsheet is a database of publicly available Gen 2 OU replays from the Smogtours server. As of the making of this post, it contains replays from 9 January 2015 (Mr. E vs Lavos SPL VI Week 1) to 4 April 2026 (Zokuru vs underlying SPL XVII Finals). The database totals 19,194 replays and 38,388 teams.

In the following posts in this thread I will explain how to use the spreadsheet, make some disclaimers about statistics, and show some fun stats I gathered that don't easily fit into the spreadsheet.

Full discloser: the spreadsheet is horribly optimized. The link I shared at the top of this post allows anyone access to use the spreadsheet in Google Sheets. The shared copy will probably be unusable if multiple people are viewing and editing it at the same time. I don't know if it will be functional on mobile. I recommend downloading a local copy to your Google account if you want to use it extensively. The raw data, calculations and user interface in spreadsheet are edit protected but viewers are still able to edit the search fields as well as create new tabs. Please do not grief the spreadsheet. I do not want to make it download only.

What does the future look like for this project?
While I make no guarantees about how long I will update the spreadsheet with new replay data, I don't plan to never update it again. Future goals I have for this project include optimizing the spreadsheet, moving the project to PowerBI, and adding additional features that people would like to see. If you have suggestions or want to help me implement improvements, let me know!

Shoutouts
melancholy0 Great post in the OU VR thread. Your spreadsheet was very helpful to convert the Eo Scout output into a usable format.

While this thread will serve as documentation for the project I would also like it to be a location for discussion about the cool charts and statistics people find using the tool. Please feel free to post in the thread!
 
Last edited:
Documentation and example analyses (How to use)

General Tips and Tricks:

  • Most of the spreadsheet is edit locked to preserve the formulas and formatting. Any cell colored green is a search field and may be edited.
  • Each tab has a cell labelled "Lag Helper". When it is set to "0" the outputs of the spreadsheet will be locked to their default state. I recommend locking the output whenever you are making multiple changes to your search criteria and unlocking it when you changes are complete. If the output is not locked the spreadsheet will recalculate every time you edit a cell, resulting in a lot of lag.
  • The search criteria fields are not case sensitive. They also automatically filter out any blank spaces. Remember that some Pokemon/moves use non alphanumeric characters, such as Mr. Mime and Double-Edge.
  • If you get no outputs, double check your spelling and that you did not enter a Pokemon name in a move field or a move in a Pokemon field, etc.

Games Graph Tab:
The Games Graph tab is the simplest tool in the spreadsheet. It plots total games played by date as well as a rolling total of games played over X time span. For example, if the rolling time period is 12 months, the rolling total on 1 March 2026 will be the number of games played from 1 March 2025 to 1 March 2026. The Games Graph is a useful tool to familiarize yourself with the spreadsheet functions as well as visualize the influence of changing the length rolling time period. If you are curious, the 12 months equates to 365 days so it is affected by leap years.

The input for the Games Graph looks like:
1775692113902.png

And the default output looks like:
1775692117792.png


There are four editable criteria (green cells) to you can use to change the graph's output. The first is the lag helper (see above), then fields to set the minimum and maximum dates of the analysis and a field to change the length of time the graph uses the calculate the rolling total games. The input box also tells you what format each field expects as well as what happens if the fields are left blank.

Here are a few demonstrations of different input and outputs for this tab.
1775692125146.png
1775692131939.png

Usage & W/R Numeric Tab:
The Usage & W/R Numeric tab is used to calculate the win rate and usage rate of a Pokemon, move, teammate, and opponent combination. The input field is a set up in complexity compared the to Games Graph tab, but all other tabs in the spreadsheet share a similar input format. This complexity gives the user a lot of flexibility to tailor their searches but may take some time get comfortable with. I caution you that if you fill out every search field the analysis will find few, if any, results and can spit out statistics that are bogus.

The input for this tab looks like:
1775692136689.png

And the output looks like:
1775692152120.png


This tab supports filtering for Leads, up to 6 pokemon, up to 24 moves, and the equivalent number of filters for the opposing team. The Pokemon fields are not ordered, the only search criteria that considers team order is the Lead field. Each Pokemon field has 4 corresponding move fields that are located underneath it.
It is useful to know that this tab and all others that follow it support filtering out search criteria. This means that you can analyze teams that lead with Zapdos and also analyze all teams that do not lead with Zapdos. The syntax to do this is to enter ! in front of a search criteria to exclude it from your results.
The output displays the usage rate, win rate, wins, ties, losses, and total teams that meet the search criteria. For the purposes of win rate, Player 1's team winning counts as a win, while Player 2's team winning counts as a loss. The output also displays the total number of teams in the dictated date range as well as converting the search criteria into a sentence that is easier to read and screenshot.

Be aware that there is an edge case that I did not bother to account for. If you search for a move and do not specify a Pokemon or search for a move under a Pokemon you are filtering out the analysis may not capture every replay with that move. It will capture every replay where the move is used by exactly one Pokemon on the team but will exclude replays where multiple team members use the move. I don't think this is a big deal as we care the most about Pokemon + move combinations, but it can make analyzing moves in isolation more difficult. Swagger is an example of a move you may want to evaluate, but this tool won't do a complete job of it. I may fix this edge case later, but it is substantial work for minimal gains.

Here are some example analyses:
1775692159972.png
1775692164663.png

Read the "Disclaimers about data and statistics" section before you put too much stock into the 40% win rate.
Usage & W/R Graph Tab:
The Usage & W/R Graph tab is very similar to the Usage & W/R Numeric tab that comes before it, but instead of calculating overall usage and win rates it shows how they change over time.

The input for the tab looks like:
1775692170764.png

And the outputs look like:
1775692175501.png

1775692179241.png

As you can see the inputs are very similar to the Usage & W/R Numeric tab, but has a new Rolling Average field like the Games Graph tab.
This tab has two outputs. One graph of Win rate, Usage rate (left axis) and the rolling total teams (right axis) and one graph of the Win rate (left axis) and Usage rate (right axis). Since the win rate of any search is typically higher than the usage rate it can be difficult to see how much the usage rate is actually changing. The second graph exists to rescale the usage rate independent of the win rate.
The important thing to look for in the rolling total teams chart is not the relative peaks and valleys, as the total volume of games played changes over time and the usage rate is what really tells you how common a Pokemon/move combination is. What you should look for in the rolling total teams is a low absolute value. When the value is low it means the sample size for the analysis is small and the statistics are more susceptible to variations due to random chance. Another way to think about it is if the win/usage rate lines look "square" the data is unreliable. If they look "squiggly" they are OK.

Above each of the graphs is also a cell converting the search criteria into a sentence.


Here's another example analysis:
1775692189153.png

1775692193529.png

1775692197472.png

Replay Search Tab:
The replay search tab does what is says on this tin. The advantage is has over other replay scouting tools is that you can search for replays of specific matchups or specific movesets rather than just by player.

The input looks like:

1775692202286.png

The output looks like:
1775692205517.png


You know the drill by now, the input is similar to the previous tabs but now includes a field for the replay result and fields for the usernames of Players 1 and 2. (FYI you can use ! to exclusively filter out results. Enter !Loss in the Result field to find replays that result in a win or a tie for Player 1.) Note that the player field filters out non-alphanumeric characters just like Pokemon Showndown does. In the eyes of Showdown "Siatam" and "S!i#aT%a\M" are the same account.

The output converts the search criteria into a sentence, displays the total number of replays found, and lists the replay link, date, player, and team information. The output is limited to 1000 replays. Add more filters to your search if you are getting that message.

Examples:
1775692210312.png

1775692213999.png
1775692218191.png

1775692221381.png
 
Last edited:
Disclaimers about data and statistics

Data Pruning:

My dataset does not include every Gen 2 OU replay I located. I selectively pruned the data and introduced my own biases into it. I used two filters to remove Gen 2 OU replay I deemed "non-relevant". They are:
1. Remove all replays that do not have at least one Snorlax.
The intent of the filter is to remove replays of GSC lower tiers that were played in the OU format. This was most common in the time before GSC lower tier formats were supported on the Smogtours server. The collateral of this decision was removing any legitimate OU replays that ended before either side showed Lax (I don't think there were many) and removing any replays of actual Laxless mirrors (I don't think there were any).

2. Remove all replays that do not show at least six Pokemon.
The intent of this filter is to remove replays where people were testing mechanics and replays of games that people quickly restarted due to RNG in the first turns or due to bringing the incorrect team. I landed on six Pokemon to get at least 50% coverage of the twelve mons brought to each match. I also considered it unlikely that someone would forfeit before at least six mons were collectively revealed. I think there were very few "valid" games removed with this filter.

Before filtering I had 20,332 replays (40,662 teams). After filtering I had 19,194 replays (38,388 teams), a 5.6% reduction. If anyone wants the replay data I filtered out, let me know.


Sample Size and why you should use at least a 12 month rolling average:
Sample size is king when it comes to evaluating if the data is statistically significant. To reduce the likelihood the relations found are due to random chance the sample size should be as large as possible. The spreadsheet gives users the freedom to apply a lot of filters. Using too many filters will make the sample size tiny and the resulting statistics less representative of the true relationships between Pokemon, moves, etc. Any analyses looking at data pre-2017 are heavily influenced by small samples sizes.

I think the most important chart in the spreadsheet to under when it comes to analyzing the data is the Games Graph.
1775691970837.png

1775691975207.png
The number of games played on Smogtours is heavily influenced by when tournaments are happening. Our tournaments run on a yearly schedule and game volumes have repeatable lows at the end/beginning of each calendar year. Using a rolling average of less than 12 months will capture these dips in activity and introduce more random chance into the resulting statistics. While there are year-over-year variations in the quantity of games played, they is less severe than the variation with a given year.

Here is a demonstration:
1775691986658.png

Win and Usage rate of teams with Raikou, without Zapdos, without Skarmory (aka solo Raikou offense) - 12 month rolling average.

1775691993237.png

Win and Usage rate of teams with Raikou, without Zapdos, without Skarmory (aka solo Raikou offense) - 6 month rolling average.
While the yellow lines follow the same general shape, you can see bigger peaks and troughs of win rate appear near the start of some calendar years - where the rolling sample sizes are smallest!

Relation between Pokemon revealed, Moves used, and Win Rate:
The more moves a Pokemon revealed, the more likely it is to have won. The more Pokemon a player revealed, the more likely they are to have lost.

I found this relationship while testing the spreadsheet and thought it was important to highlight. Remember that due to using replay data, the spreadsheet does not calculate true usage and win rates of what peoples brought- only what they revealed.
It stands to reason that each time a Pokemon uses a move it generates value for the player, and more moves = more value. (Good!) Obviously after a Pokemon is knocked out it can't use moves or generate value. (Bad!) The relationship is inverse for number of Pokemon revealed. When a game is going well, a player may win only revealing four or five of their mons. When a game is going poorly and Pokemon are getting knocked out players are forced to reveal more of their team.

It is important to recognize the Pokemon and move combinations you filter for are not the only factors that influenced the outcome of the games. Teammates, RNG, misclicks, and the skill level of the player/opponent all affect the game but are not directly captured in the search. When Machamp clicks all of Curse, Cross Chop, Earthquake, and Rock Slide in one game, it means the game was already going very well. A Baton Pass team that revealed Smeargle/Jolteon/Scizor/Snorlax/Machamp/Marowak probably lost. A Baton Pass team that only revealed Smeargle and Marowak probably dominated.

Here are a few screenshots to illustrate the relationship:

1775692000890.png

Golem wins 51.1% of games it is revealed in.

1775692004535.png

Golem wins 53.1% of its games where it has the opportunity to spin.

1775692008788.png

Golem wins 58.8% of its games where it spins and explodes!

1775692013859.png

Cloyster wins 50.1% of the games it appears it.

1775692024446.png

Cloyster only wins 49.6% of games when it appears alongside Snorlax?

1775692031706.png

And the win rate drops to 49.2% when adding Zapdos?
 
Last edited:
Fun Stats
Here are some fun stats that I gathered during this project that I did not add tabs in the spreadsheet for.

Ties:
Of the total 19,194 replays in my analysis, 223 (1.17%) ended in a tie. Vileman has the most ties with 6. A Real Jester, vani, Siatam, and Allce are tied (heh) for second with 5 ties each.

10 Most Popular Teams:

RankTeamAlso Known As:CountOccurrence Rate (%)
1Cloyster, Machamp, Nidoking, Snorlax, Tyranitar, ZapdosNidoChamp8742.15
2Cloyster, Gengar, Golem, Jynx, Snorlax, ZapdosFear's WW Zap team8111.99
3Cloyster, Gengar, Nidoking, Snorlax, Tyranitar, ZapdosNidoGar8101.99
4Cloyster, Exeggutor, Machamp, Snorlax, Steelix, ZapdosPre-Jynx offense #17841.93
5Cloyster, Exeggutor, Snorlax, Steelix, Vaporeon, ZapdosBorat7351.81
6Forretress, Raikou, Skarmory, Snorlax, Starmie, TyranitarZokuru's standard stall 65031.24
7Cloyster, Gengar, Jynx, Nidoking, Snorlax, ZapdosThief Spam4691.15
8Cloyster, Exeggutor, Gengar, Snorlax, Steelix, ZapdosPre-Jynx offense #24211.04
9Cloyster, Exeggutor, Nidoking, Snorlax, Tyranitar, ZapdosPre-Jynx offense #34111.01
10Cloyster, Exeggutor, Marowak, Snorlax, Tyranitar, ZapdosBKC's Eggy Wak offense3930.97

Unique Pokemon to appear in a Gen 2 OU tours game (with my filters applied):
131 of the 251 Pokemon in Gen 2 have appeared in at least one replay. They are:
PokemonDex Number
Venusaur#0003
Charizard#0006
Blastoise#0009
Raticate#0020
Fearow#0022
Arbok#0024
Pikachu#0025
Raichu#0026
Sandslash#0028
Nidoqueen#0031
Nidoking#0034
Clefable#0036
Jigglypuff#0039
Wigglytuff#0040
Vileplume#0045
Parasect#0047
Venomoth#0049
Dugtrio#0051
Persian#0053
Golduck#0055
Primeape#0057
Arcanine#0059
Poliwhirl#0061
Poliwrath#0062
Alakazam#0065
Machoke#0067
Machamp#0068
Victreebel#0071
Tentacruel#0073
Golem#0076
Rapidash#0078
Slowbro#0080
Magneton#0082
Dodrio#0085
Dewgong#0087
Muk#0089
Cloyster#0091
Gastly#0092
Haunter#0093
Gengar#0094
Hypno#0097
Kingler#0099
Voltorb#0100
Electrode#0101
Exeggutor#0103
Cubone#0104
Marowak#0105
Hitmonlee#0106
Hitmonchan#0107
Lickitung#0108
Weezing#0110
Rhydon#0112
Chansey#0113
Tangela#0114
Kangaskhan#0115
Starmie#0121
Mr. Mime#0122
Scyther#0123
Jynx#0124
Electabuzz#0125
Magmar#0126
Pinsir#0127
Tauros#0128
Gyarados#0130
Lapras#0131
Vaporeon#0134
Jolteon#0135
Flareon#0136
Omastar#0139
Kabutops#0141
Aerodactyl#0142
Snorlax#0143
Articuno#0144
Zapdos#0145
Moltres#0146
Dragonite#0149
Bayleef#0153
Meganium#0154
Typhlosion#0157
Feraligatr#0160
Noctowl#0164
Ledian#0166
Ariados#0168
Crobat#0169
Lanturn#0171
Pichu#0172
Togetic#0176
Xatu#0178
Ampharos#0181
Bellossom#0182
Sudowoodo#0185
Politoed#0186
Jumpluff#0189
Quagsire#0195
Espeon#0196
Umbreon#0197
Murkrow#0198
Slowking#0199
Misdreavus#0200
Wobbuffet#0202
Girafarig#0203
Pineco#0204
Forretress#0205
Gligar#0207
Steelix#0208
Granbull#0210
Qwilfish#0211
Scizor#0212
Shuckle#0213
Heracross#0214
Sneasel#0215
Ursaring#0217
Magcargo#0219
Piloswine#0221
Corsola#0222
Octillery#0224
Delibird#0225
Skarmory#0227
Houndoom#0229
Kingdra#0230
Donphan#0232
Porygon2#0233
Smeargle#0235
Hitmontop#0237
Miltank#0241
Blissey#0242
Raikou#0243
Entei#0244
Suicune#0245
Pupitar#0247
Tyranitar#0248
120 Pokemon did not appear. They are:
PokemonDex Number
Bulbasaur#0001
Ivysaur#0002
Charmander#0004
Charmeleon#0005
Squirtle#0007
Wartortle#0008
Caterpie#0010
Metapod#0011
Butterfree#0012
Weedle#0013
Kakuna#0014
Beedrill#0015
Pidgey#0016
Pidgeotto#0017
Pidgeot#0018
Rattata#0019
Spearow#0021
Ekans#0023
Sandshrew#0027
Nidoran♀#0029
Nidorina#0030
Nidoran♂#0032
Nidorino#0033
Clefairy#0035
Vulpix#0037
Ninetales#0038
Zubat#0041
Golbat#0042
Oddish#0043
Gloom#0044
Paras#0046
Venonat#0048
Diglett#0050
Meowth#0052
Psyduck#0054
Mankey#0056
Growlithe#0058
Poliwag#0060
Abra#0063
Kadabra#0064
Machop#0066
Bellsprout#0069
Weepinbell#0070
Tentacool#0072
Geodude#0074
Graveler#0075
Ponyta#0077
Slowpoke#0079
Magnemite#0081
Farfetch'd#0083
Doduo#0084
Seel#0086
Grimer#0088
Shellder#0090
Onix#0095
Drowzee#0096
Krabby#0098
Exeggcute#0102
Koffing#0109
Rhyhorn#0111
Horsea#0116
Seadra#0117
Goldeen#0118
Seaking#0119
Staryu#0120
Magikarp#0129
Ditto#0132
Eevee#0133
Porygon#0137
Omanyte#0138
Kabuto#0140
Dratini#0147
Dragonair#0148
Mewtwo#0150
Mew#0151
Chikorita#0152
Cyndaquil#0155
Quilava#0156
Totodile#0158
Croconaw#0159
Sentret#0161
Furret#0162
Hoothoot#0163
Ledyba#0165
Spinarak#0167
Chinchou#0170
Cleffa#0173
Igglybuff#0174
Togepi#0175
Natu#0177
Mareep#0179
Flaaffy#0180
Marill#0183
Azumarill#0184
Hoppip#0187
Skiploom#0188
Aipom#0190
Sunkern#0191
Sunflora#0192
Yanma#0193
Wooper#0194
Unown#0201
Dunsparce#0206
Snubbull#0209
Teddiursa#0216
Slugma#0218
Swinub#0220
Remoraid#0223
Mantine#0226
Houndour#0228
Phanpy#0231
Stantler#0234
Tyrogue#0236
Smoochum#0238
Elekid#0239
Magby#0240
Larvitar#0246
Lugia#0249
Ho-Oh#0250
Celebi#0251

Top 10 accounts by Gen 2 OU games played on Smogtours:

RankAccountGamesWins
1Vileman1131637
2Conflict572251
3blightbringerr525296
4gorgie493255
5ABR461273
6Pohjis430271
7marcop9923407205
8dice383214
9mr378362216
10Siatam355206

Top 15 Gen 2 OU replays by views:


The top slots are owned by SPL XVII (2026) - I legitimately have no clue why #1 is such an outlier. I asked Jester and he didn't know either. Maybe it was shared in some tournaments media post? Outside of the top 3 the the list has many replays with big names from 2018-2019 and well as SPL XV (2024) replays. 2018-2019 corresponds with Gen 2 OU's peak volume of games on Smogtours. Curiously no SPL XVII (2025) replays are in the top 15.

Top 15 accounts by total views of their Gen 2 OU replays:

RankAccountTotal Replay Views (as of posting)
1Conflict389,660
2Lavos238,488
3Vileman210,598
4gorgie198,180
5Siatam178,408
6Fear168,659
7ABR165,819
8A Real Jester157,803
9BKC147,306
10Zokuru139,795
11Earthworm138,774
12Century Express138,520
13vani126,424
14Bomber113,745
15Rubyblood102,767

Reminder, while this thread will serve as documentation for the project I would also like it to be a location for discussion about the cool charts and statistics people find using the tool. Please feel free to post in the thread!
 
Last edited:
Nice! Would it be possible to calculate simple metrics like damage dealt, damage received, attacks used, and attacks received for each pokemon in each match? And maybe extending that down the line to include something like the combat summary statistics in Prado Traveler? I feel like these might be the start of some sabermetrics-style analysis of GSC matches and metrics like each Pokemon's WAR, since analyzing things like winrate alone tends to be of limited value. Imagine if Mike Trout at his peak was judged just by his team's winrate, after all.

Also, more than happy to chat at some point about contributing to this project. It's cool! For instance, I imagine at some point you'd like to have a FE for people to interact with as opposed to having them futz around with the spreadsheet directly.
 
Nice! Would it be possible to calculate simple metrics like damage dealt, damage received, attacks used, and attacks received for each pokemon in each match?
It should be possible but I think it would be a project similar in scale to what I’ve completed. I gathered the player names, Pokemon, and moves of each replay from Eo’s Scouter and wrote a simple script to extract the winner, date, and views from each replay’s .json file.
Parsing the entire game log to extract the metrics you listed is beyond my current abilities but seems plausible.

I feel like these might be the start of some sabermetrics-style analysis of GSC matches and metrics like each Pokemon's WAR, since analyzing things like winrate alone tends to be of limited value.
I don’t think I have the statistical background needed to turn the game data into “Pokemon WAR”. A run in baseball is always a good thing, but it is difficult to quantify what makes an action or outcome “good” in a Pokemon game. Even something like dealing damage could be considered “bad” in a scenario like Starmie spamming Surf against a Snorlax freely setting up Curse. Maybe a Smogon statistics master could help create some advanced metrics.

Also, more than happy to chat at some point about contributing to this project. It's cool! For instance, I imagine at some point you'd like to have a FE for people to interact with as opposed to having them futz around with the spreadsheet directly.
For sure, feel free to reach out on Discord. I eventually want to move the project to something like PowerBI but I need to educate myself some more before accomplishing that.
 
Back
Top