Building a Premier League Stats Dashboard in Tableau

This week I started building a football dashboard in Tableau looking at goal contributions in the Premier League.

I used public player and appearance data, starting by unioning the appearances.csv and players.csv files, with player_id as the relationship between them. From there, I wanted to build something simple that lets you look at attacking output in a few different ways, while also giving the user some control over what counts as a meaningful sample.

I started with a scatterplot of minutes played against goal contributions, then added top 15 charts for goals per 90 and assists per 90. After that, I added parameters so the user can filter by minimum minutes played, minimum goals scored, start date, and position.

Starting with goal contributions

The first thing I created was a goal contributions field by combining goals and assists:

[Goals] + [Assists]

That gave me a simple attacking output measure to use in the scatterplot.

I then built a scatterplot with minutes played on the x axis and goal contributions on the y axis. To keep it focused, I filtered it to Premier League only, excluded goalkeepers, and only looked at matches from the start of the current league season. That gave me a decent first view straight away. The players with the biggest output over large minutes stood out quickly, while the labels also made it easier to pick out players doing well with less game time.

Adding goals per 90

After that, I built a top 15 goals per 90 chart.

The first calculation was just:

SUM([Goals]) * 90 / SUM([Minutes Played])

That works fine on paper, but the problem is obvious quite quickly. A player can rank really highly if they have only played a small number of minutes and scored once or twice. That makes the stat less useful if you are trying to compare players with proper sample sizes.

So instead of leaving it like that, I added parameters for minimum minutes played and minimum goals scored, then built that logic into the calculation.

IF
SUM([Minutes Played]) >= [Min Minutes]
AND SUM([Goals]) >= [Min Goals]
THEN SUM([Goals]) * 90 / SUM([Minutes Played])
END

This made the chart much more usable, because the user can decide how strict they want to be with the thresholds. I used the same approach for assists per 90.

That gave the dashboard two ranked views alongside the scatterplot. One looks at total output through goal contributions, while the other two show who stands out on a per 90 basis.

Adding a start date parameter

The dataset goes back much further than this season, so I also wanted users to be able to move the start point back and look at output over a longer period of Premier League history.

To do that, I created a start date parameter and used it in a date filter calculation where:

[Date] >= [Start Date]

That means the default dashboard view can focus on the current season, but the user can also move the date back and see a wider sample if they want to.

Adding a position parameter

The final thing I added was a position parameter.

That lets the user switch the view depending on the type of player they want to look at. For example, the attacker view makes sense for goals and assists, but it is also interesting to switch to defenders and see who stands out there.

What I’d improve next

At the moment, the dashboard is doing the main job I wanted it to do, which is giving a clean view of goal contributions, goals per 90, and assists per 90 with a few useful controls.

The next step is to make it easier to read at a glance. I want to add ranks to the bar charts and spend a bit more time on the formatting, as the current version is still more functional than polished.

That will probably be the focus of the next blog.

Author:
Harry Singler
Powered by The Information Lab
1st Floor, 25 Watling Street, London, EC4M 9BR
Subscribe
to our Newsletter
Get the lastest news about The Data School and application tips
Subscribe now
© 2026 The Information Lab