Every win rate on this site is an estimate, not a tally. This page states the estimator, the populations behind each percentage, and every threshold in force — so that a number you disagree with can be argued with rather than merely doubted.
Tournament decklists and real match records, ingested from Limitless. A win is a match a player won, not a ratio derived from their final standing. That distinction matters more than it sounds: standings-derived rates cannot tell you who anyone actually played, which is what makes head-to-head possible here at all.
This is tournament data. It is not the ranked ladder, and the two are different populations with different players, different incentives and different metagames. Nothing on this site blends them.
Species type lines are a separate, vendored dataset, used for the type-coverage panel on the matchup simulator and nowhere else. They come from otterlyclueless/pokemon-champions-data, used under CC BY 4.0. That panel is chart arithmetic rather than a game record: it has no sample, no prior and no interval behind it.
A percentage without its denominator is a decoration. These are the four in use:
| Figure | Numerator ÷ denominator |
|---|---|
| Usage | teams carrying the species ÷ every team in the current scope |
| Win rate | matches won ÷ matches decided — ties are excluded from the denominator, not counted as half |
| Teammate share | rosters carrying both ÷ rosters carrying the anchor species |
| Move, item, ability, tera, nature | teams running that option ÷ teams carrying the species and publishing a list |
The last denominator is the uncomfortable one and it is stated on purpose: build data only exists for teams whose lists were published, which at most events is the top cut rather than the field.
Raw wins over games cannot be ranked against each other. A species on six teams sits at 70% off ten games while a staple sits at 52% off forty thousand, and sorting that column puts the noise on top. The usual fix is to hide small samples behind a cutoff, which throws away real rows and still leaves everything above the cutoff unequally reliable.
Instead every rate is pulled toward the field average by a Beta prior fitted to the field itself, by method of moments — Kleinman's estimator of the beta-binomial intra-class correlation ρ, which is the varying-sample version of matching the first two moments. The displayed figure is the posterior mean:
rate = (wins + α) / (games + α + β)So a row carries games / (games + κ)of its own record and the rest of the field average, where κ = α + β is the prior's weight expressed in games. Sample size stops being a separate axis you have to hold in your head while reading a column.
Two deliberate adjustments, both stated because neither is forced by the data. Extra shrinkage:the fitted κ is multiplied before use, because a species' record also carries its five teammates' and its pilot's strength, which inflates the spread the fit reads as real. A ceiling:κ is capped relative to what a typical row in that fit actually played, so a table of twenty-game rows can never be shrunk two hundred times its own evidence into printing the field average on every line.
Reading the prior currently in force…
Alongside the posterior mean, each row carries a one-sided 95% bound — the rate we can defend rather than the rate we estimate. Tiers are banded on that floor, not on the displayed rate, which is why a spectacular thin row does not reach S: the floor already prices in its sample.
The bands are cut from the field's own distribution as standard deviations above its mean — S at 2.3σ, A at 1σ, B at 0σ, C at -0.8σ, D below that — rather than as a fixed share of the board. A fixed share always hands out the same head count whether or not anyone is genuinely ahead: “top 8%” produces nine S picks in a format where three are separated and nine in a format where none are. Cutting on separation self-calibrates, so a tightly balanced format truthfully produces few or no S picks.
| Floor | Value | Applies to | Why |
|---|---|---|---|
| Rosters per species | 20 teams | the overview board | Below this a species is one or two players' pet pick, and its record is theirs rather than the format's. |
| Rosters per pair | 3 teams | Partners, and the pair board behind it | Two-species combinations run to tens of thousands, most of them on a single roster. Without this the fit is mostly noise about itself. |
| Games per combination | 50 games | the browse view of Partners | A display cut, applied after the prior is fitted. Ask for a specific pair and this does not apply — a direct question gets an answer with its game count attached. |
| Games per matchup cell, 2v2 and 4v4 | 30 and 20 games | duo-vs-duo and quartet-vs-quartet cells | Lower than the 1v1 floor, because the same corpus is divided by fifteen subsets a side: at the 1v1 floor these boards would hold a few dozen cells. What the lower floor does not buy is confidence, and it is not meant to. One match feeds every subset pairing on the two teams at once, so a cell's games are correlated observations rather than independent ones, and the tier band is cut from the confidence floor rather than the rate, which prices a thin cell down where the games floor no longer does. |
| Games per matchup cell, 6v6 | 10 games | team-vs-team cells | The lowest floor on the site, over the only cells whose samples are independent. Both sides of a 6v6 cell are a whole six, so a game credits exactly one cell and nothing is attributed to a subset. What makes the floor low is scarcity rather than tolerance: the same exact six meeting the same exact six is rare in a tournament corpus, and the ladder half is what fills those cells in. |
| Teams per side, matchup head boards | 200 at 2v2, 100 at 4v4, 10 at 6v6 | which sides are crossed at all above 1v1 | Not a display cut: a side below this is never crossed, so its cells do not exist rather than being hidden. Without it the cell space is the qualifying side count squared, which is 8.3 million ordered cells at 2v2 and 21.9 million at 4v4, almost all of them holding a single game. A side missing from one of these boards is below this gate, not unplayed. |
A floor is applied after the prior is fitted, never before. Hiding thin rows therefore does not move the rates on the rows it keeps. This is the rule that makes the numbers stable while you filter — if narrowing a table refitted the estimator over the narrowed population, every figure on screen would change as you moved a slider, and none of them would be comparable to what you saw a moment earlier.
It is also worth being plain that a minimum does not fix the real problem. Events differ in size by more than an order of magnitude, and every one of them clears any sane entrant threshold, so a floor does nothing about the weight a huge event carries against a small one. Shrinkage and weighting answer that; a cutoff only hides the smallest rows and leaves the imbalance among the rest untouched.
The fit is api/src/smoothing.ts; the boards it feeds are api/src/boards.ts and api/src/data.ts; the tier bands are suckerpunch/lib/tier.ts. Every smoothed endpoint returns the prior it used alongside its rows, so the figures above can be checked against any response the site makes rather than taken on trust.