Predicting Premier League Matches with a Little Poisson Math

I've always loved a good sports bet, so when a grad school stats class gave me free rein to pick a final project, I knew exactly where I was headed: could I predict Premier League match outcomes using nothing but last season's scores?

Turns out the answer is yes, and the tool for the job is over a century old.

The Question

Given two Premier League teams, can we predict the probability of a win, loss, or draw using only historical goal-scoring data?

The Approach

The model is built on a Poisson distribution, which is exactly what you'd reach for when you know the average rate an event happens and want to estimate the odds of it happening more or less often. Goals in soccer fit this pattern well.

Using 2018/19 season data, I calculated each team's attacking strength and defensive strength, both home and away. For example, Arsenal averaged 1.89 goals per home game, and since the league-wide home average was 1.57, that put their home attacking strength at 1.20, meaning they scored 20% more than a typical home team.

From there, the model estimates expected goals for each side in a matchup and runs the Poisson distribution across every plausible scoreline, up to 10-10, to build a full probability table for win, loss, and draw.

What I Found

The fun part is watching the model spit out a distribution instead of a single guess. It doesn't just say "Arsenal wins." It says something closer to "Arsenal wins 52% of the time, draws 24%, loses 24%," built entirely from how each team has performed at scoring and conceding.

Limitations and What's Next

This is a season-snapshot model. It doesn't account for injuries, transfers, or mid-season form, all things that matter a lot in real predictions. A natural next step would be rolling in more recent data or weighting recent matches more heavily.

If you want to dig into the code, it's all on GitHub.