# Suggestions for simple model of who wins the league in a game of fantasy football

In a game of fantasy football players score points each week depending on the team they have selected, and at the end of a season the player with the most points wins. There are $W = 38$ weeks, and a total of $N$ players. In the $w$th week I would like to estimate the probability that the $i$th player will win the league, given his or her recent form.

As a rough approximation, I suspect that each player's weekly score will follow a normal distribution, with a player specific mean, $\mu_{i}$, and a player specific standard deviation, $\sigma_{i}$. I can calculate these statistics for any given week by looking at player data from a pre-determined number of previous weeks.

If a player's score in week $w$ is $s_{iw}$, and there are $W - w$ games left, their expected final score, $s_{iW}$, is simply given by $$s_{iW} = s_{iw} + \mu_{i} (W - w),$$ which is just their current score plus any additional points they are expected to gain in the remaining weeks. I'm not sure, however, how to calculate the standard deviation around the final score. More importantly, the player with the highest score, $s_{iW}$, is obviously the most likely to win, but how do I calculate the probability that they will win? I will essentially have $N$ overlapping normal distributions for the final scores. Do I need to sum up the pairwise probability that each player beats another or something like that?

This is just for a bit of 'fun', and a good way to get me to learn some statistics, so any advice is much appreciated. References to introductory materials about these kinds of questions also welcomed.

Since $s_{iW}$ is a sum of normally distributed random variables, with $W - w$ variables all from the same distribution, the expected variance will simply be $\sigma_{i}^2(W - w)$. To compute the overall probability of an individual $i$ winning, you could integrate a function that gives the probability that $i$ wins or ties for first across all possible final scores $s$

$$P(i\ \mathrm{wins\ or\ ties\ for\ first }) =\int f_i(s) \prod_{}^{i*} F_{i*}(s)\ ds$$

where $f_{i}(s)$ is the probability density function for individual $i$, $i*$ is the index for all individuals excluding the focal individual, and $F_{i*}(s)$ is the cumulative distribution function for individual $i*$. Thus, for each possible final score $s$, the product $\prod_{}^{i*} F_{i*}(s)$ gives the probability that all other individuals have a score equal to or less than the value, while $f_{i}(s)$ gives the probability that the focal individual finishes with score $s$. Integrating over that function would give the total probability that individual $i$ wins or ties for first. Once you compute $P(i\ \mathrm{wins\ or\ ties\ for\ first})$ for all $i$, getting to $P(i\ \mathrm{wins})$ is easy

$$P(i\ \mathrm{wins}) = 1 - \prod_{}^{i*} P({i*}\ \mathrm{wins\ or\ ties})$$

If I was faced with this problem in real life, I'd simulate because it is so easy. Here is some code that simulates the game you described. I specify increasing means for players 1 through 10, and you can see that the probabilities of each player winning add up to 1 and align with the knowledge that the mean scores increase from player 1 to player 10. If you really wanted to compute probabilities analytically for some reason, this would be a way to check your answer.

set.seed(23)

# Means and standard deviations for N players
N <- 10
u <- seq(0, 1, length.out=N)
sd <- runif(N, 0.1, 2)

# Function to play for 10 weeks and record final score
play <- function(n, u, sd) {
winners <- c()
for (j in 1:n) {
sw <- c()
for (i in 1:length(u)) {sw[i] <- sum(rnorm(length(u), mean=u[i], sd=sd[i]))}
winners[j] <- which.max(sw)
}
return(winners)
}

# Play 1000 times
out <- play(1000, u, sd)

# Summarize output
table(out)/1000
## out
##      1      3      4      5      6      7      8      9     10
## 0.0019 0.0006 0.0252 0.0556 0.0257 0.1415 0.1999 0.2218 0.3278

# Check that they sum to 1
sum(table(out)/1000)
##  1

• That was an insanely good answer! Complete with R code that I can go and play with as well. Couldn't really ask for more, thanks! May 16, 2016 at 8:01