Header

Lopsided Leagues: How Likely Are They?

The September 15th “Fiddler on the Proof” riddle: how likely is one division in (typically US) sports to be uniformly better than another?

Published Date
Thu Sep 212023

Zach Wissner-Gross puts out a column every week containing mathematical puzzles. This week’s edition asks: how likely are we to find, in a league of six divisions of five teams each, two divisions such that every team in one division has a higher winning percentage than the other? As he clarifies, this includes situations where e.g. two divisions are both uniformly better than a third division.

One huge simplification: Zach has us assuming (reasonably!) that each team’s winning percentage is uniformly distributed from 0 to 100%. This is of course not how sports tends to actually work, but it’s good enough for us!

What If There Were Just Two Teams?

The question I quoted above is actually the extra credit. Let’s first solve the first question: what is the probability that a specific division (let’s call it division 1) will be uniformly better than another specific division (let’s call it division 2)?

Equivalently: what is the probability that the worst team in division 1 is better than the best team in division 2? Let W be the distribution of the worst team’s winning % in division 1 (or really, any specific division), and B the distribution of the best team in division 2. We want to calculate P ( W > B ) . The good news is all the various densities are well-behaved, and the two divisions are fully independent, so we can integrate as we like. In what follows, we assume all numbers go from 0 to 1 (so e.g. 65% = 0.65):

P(W>B)=w,b[0,1]P(W>B,W=w,B=b)dwdb=w,b[0,1]pW(w)P(W>B,B=b|W=w)dwdb=01pW(w)01P(W>B,B=b|W=w)dbdw=01pW(w)P(B<w)dw

This says: let’s add up the probabilities of the worst percentage, scaled by how likely the best team of the other division is to be worse.

Let’s work out P ( W < w ) = 1 P ( W > w ) . The probability of the worst team being greater than w is equal to the probability that ALL teams are above w, since they’re independent. The probability of any given team being above w is 1 w , so P ( W < w ) = 1 ( 1 w ) 5 . We can differentiate for the density, to get p W ( w ) = 5 ( 1 w ) 4 .

Similarly, P ( B < b ) is the probability that all five teams are below b, so it’s b 5 .

So we get p W ( w ) P ( B < w ) d w = 5 ( 1 w ) 4 w 5 d w .

Expanding the integrand gives 5 ( w 5 4 w 6 + 6 w 7 4 w 8 + w 9 ) . We know that:

01xa=xa+1a+1|01=1a+1

Thus we get 5 ( 1 6 4 7 + 6 8 4 9 + 1 10 ) = 1 252 0.003968.

A quick simulation to check:

## Note: this is R code

expected_res <- 1/252

sim_two_specific_teams <- function() {
    div_1_teams <- runif(5)
    div_2_teams <- runif(5)
    return (min(div_1_teams) > max(div_2_teams))
}

N <- 10000000 # or whatever
sim_res <- sapply(1:N, function(i) sim_two_specific_teams())

mean_res <- mean(sim_res)
cat("Simulation result:", mean_res, "\n")

# Can e.g. see how far from expected we are:
# (mean_res - expected_res) / expected_res

I get 0.0039729, pretty close to 1 252 .

Extra Credit: Any Two Such Teams?

If we can have ANY two such teams, it gets trickier.

We care about the best and the worse team in each division. We want to know if there’s any division where the worst team in it is better than any other division’s best team. In other words: the best of the worst teams vs the worst of the best teams.

We can again work out the densities. Let Z be the best of the worst teams (“best-worst”), and Y be the worst of the best (“worst-best”).

P(Z<z)=P(all worst teams under z)=P(W<z)6=(1(1w)5)6pZ(z)=30(1(1z)5)5(1z)4
P(Y<y)=1P(all best teams over y)=1P(B>y)6=1(1P(B<y))6=1(1y5)6

Since we want Z > Y , we could plug these into the same equation we used above, to get:

0130(1(1z)5)5(1z)4(1(1z5)6)dz

This gives 152101667880222680219 1575725555248330357872 (Wolfram Alpha to the rescue...), which is about 0.09653.

Is this right? Let’s run a simulation:

## This is also R code

sim_any_two_teams <- function() {
    divs <- lapply(1:6, function(i) {
        runif(5)
    })
    
    div_worsts <- sapply(divs, min)
    div_bests <- sapply(divs, max)
    
    return (max(div_worsts) > min(div_bests))
}

N <- 100000000 # or whatever
sim_res_extra_credit <- sapply(1:N, function(i) sim_any_two_teams())

I get 0.08622878. Not quite our answer! What went wrong? In the previous part, we could correctly separate the densities, since they were fully independent. Here, the best-worst team is not independent of the worst-best: if I tell you the best-worst had a 0.5 = 50% winning percentage, we don’t then have the luxury of trying six different divisions to see if their best is under that: one of the divisions certainly isn’t, since its worst is already at exactly this value!

You might be tempted to then try something like:

P(Z>Y,Z=z,Y=y)=pZ(z)P(Z>Y,Y=y|Z=z)=pZ(z)P(worst of the “other five” divisions <z)=pZ(z)(1(1z5)5)

That is, replace the power of 6 for the worst-best with five, since we’ve ruled a team out (another way to say it: the best-worst division won’t uniformly dominate itself). This gives about 0.083387, less than our simulation.

This is too conservative. What that assumption misses is this: if I told you the best-worst team’s % was e.g. 0.7 and asked you for the probability that some other division’s best team was below this, 0 . 7 5 is too small: you already know this other division doesn’t have all teams above 0.7 (otherwise it would be the best-worst), so we can condition on not being in the “all above 0.7” case: this gives 0 . 7 5 1 ( 1 0.7 ) 5

So in calculating

P(Y<z|Z=z)=1P(all best teams over z|Z=z)

we know two things: first, for the division with the worst team at z, their best team is already over z, so that’s one of six already sorted. For any other division, we know at the least they don’t have all teams over z, otherwise that would be the best-worst division. So P(best team in div over z | Z = z ) is either 1 (if it’s the best-worst division) or it’s 1 - P(all teams in div under z | not all teams are over z) = 1 z 5 1 ( 1 z ) 5 .

We can now multiply these, as they’re now independent given this conditional information: one of them is 1, the rest give:

P(Y<z|Z=z)=1(1z51(1z)5)5

So the full integral is:

pZ(z)P(Y<z|Z=z)dz=0130(1(1z)5)5(1z)4(1(1z51(1z)5)5)dz

This gives (I also didn’t do this one by hand...) 2565091 29745716 0.086234 .

And indeed we can confirm this is very close to our simulation result.

If you’d like to work out the probabilities in a more realistic setting, where the teams actually play each other, I’d probably recommend simulation instead of integrals!