Here’s the thing. There’s a ton of great analytics resources out there. Evolving Hockey, Hockey Viz, and others are producing amazing insight into the NHL that has given us new ways of looking at the players around the league and predicting the success of teams. Their knowledge of hockey, analytics, and programming is beyond what I could ever hope to put together.
The problem for someone like me is that I like to know how the sausage is made, and trying to figure out how they’ve made their sausage hurts my head at time, so I’ve decided to make my own. For better or worse, I decided to embark on the idea of pulling together my own measure that combines the individual contributions of a player with the outcomes of when they are on the ice. I then wanted to take that combined score, and compare it to their contract. A lot of my approach has been drawn from what Dom Luszczyszyn has done with Game Score, which you can read about here. The differences in my version of score, is the separation of on ice play calculations from individual result calculations, and the omission of faceoffs in game score and the inclusion of hits instead, with the intention of finding the means to value defensive play at a higher rate to make the players more comparable to forwards. At this time I haven’t factored goaltenders into this measure, but hope to do so as I refine what I’ve started on.
So the calculation breakdown is fairly simple:
Goals * 0.8
Primary Assists * 0.7
Secondary Assists * 0.5
Penalties Drawn – Penalties Taken * 0.2
Blocked Shots * 0.1
Hits * 0.02
Those results would be added together and divided by games played to produced the individual output component.
Aspects that were in Game Score like individual shots, and face off win/loss would lend itself more to forwards than defensemen so they have been removed. There has been slight adjustment’s compared to Dom’s approach on when it comes to goal valuation, blocked shot valuation, and secondary assists as well, and a modest bump up to penalties drawn/taken as well. Dom’s work was based on valuation created by Matt Cane for a weighted shot model, my shifts in valuation were kept minimal to stay as consistent with this approach as possible.
I also acknowledge that hits are a particularly subjective stat, in how they are recorded, the impact of a hit, and of course the factor that if you are hitting you don’t have control of the puck and that’s a bad thing. Given that even the best teams are going to be playing without the puck 40% of the time, considering actions that could help recover the puck seemed beneficial and worth including, even if requires an additional grain of salt be factored into this.
Most notably, the CF-CA part of Game Score has been excluded from the individual output, and that’s because it’s been given separate consideration as part of the Total Player Score below…
On Ice Play
So trying to balance the individual outputs with the on ice outputs is equally important, especially when trying to quantify the impact of defensemen. Rather than a straight forward CF to CA, I made the decision to put some additional emphasis on high danger shot attempts, and significantly less on the low danger chances. The multiplier for High Danger was based on the league total high danger shot attempts related to medium danger ones. The same is true of low danger in relation to medium danger. Arguably the same could have been achieved by using an existing expected goals value, but the purpose of this stat is to be for simple people like myself to be able to see how the sausage is made, and to do that, I relied on my less nuanced values.
Here’s the calculation:
High Danger Corsi For divided by High Danger Corsi For and Against * 2.89
Medium Danger Corsi For divided by Medium Danger Corsi For and Against
Low Danger Corsi For divided by Low Danger Corsi For and Against * 0.24
The sum of these three values is multiplied by time on ice.
The outputs give an exaggerated version of Corsi, and that’s essentially what I was hoping for out of this. I considered using HDCF exclusively, but decided the weighting approach captured the idea of “the full 60 minutes” better.
Total Player Score
After arriving at the two numbers, they are multiplied by each other to give us the Total Player Score. Here’s an example of the Leafs Total Player Scores at 5v5 through the first 10 games of this season:
|Players||TPS||On Ice Play||Ind. Outputs|
Matthews being the best amongst the Leafs isn’t really a surprise. And with the season Holl has had, the fact that he’s right up there isn’t really a surprise either. Travis Boyd is an interesting one, as bad things seem to be going on when he’s on the ice, but he’s been very fortunate in his small sample of games to get on the scoresheet.
Looking at the Total Player Score for the 2019-20 season, Auston Matthews favours pretty well around the league at 5v5…
|Player||TPS||On Ice Play||Ind. Output|
There are no shortage of names that we’d expect to see up there, but there are also names like Yamamoto, Guentzel, and Rust that are products of their linemates as well. If there is a shortcoming that is particularly glaring for me, it’s that I can’t remove Rust from Crosby or Yamamoto from Draisaitl in this, though it’s perhaps worth noting that they have excelled in their passenger roles.
The Contract Comparison Component
The next piece I wanted to look at with this was taking a look at how the TPS value would directly compare to their salary cap hit. Basically, how good is the player’s pay compared to their contract. The values I used were strictly a comparison of percentiles. Looking at the 2019-20 TPS scores for players who played more than 300 minutes, their percentile was compared to their AAV percentile giving us a Contract value vs. Performance score. Any score close to 0 shows the contract is pretty much right on target value wise, and scores with a high number represent the best value contracts (often entry level contracts of star players), and the lowest values represent the worst contracts in the league (Hi, Loui Eriksson.)
I decided to take that value one step further with a weighted value that adjusted the score based on age, years until free agency, whether they’d be an unrestricted free agent when the deal ended, if they have an over 35+ clause, and if they have a No Trade/No Movement clause.
The values usually end up being nearly identical for RFAs, especially ELC contracts, but the values shift a bit more for unrestricted free agents.
Top Value Contracts
|Player||AAV||Weighted Contract Value|
Worst Value Contracts
|Player||AAV||Weighted Contract Value|
The numbers are being run off of 2019-20 Total Player Scores, and when I switch the TPS Percentiles over to the 2021 season, I’m sure we’ll (sadly) see a redemption story for Josh Anderson.
While I can write all I want about what I’ve done to date, perhaps the best way to get feedback on this is to share the work to date with the world. So here is a link to the Tableau Dashboard.
The dashboard includes the percentile of their current cap hit around the league, their TPS percentile for the 2019-20 season. The Total Player Score Report (TPS Report) gives the Total player score, but also shows what is driving that score, either the individual outputs or the on ice play. The contract value shows the weighted contract value first, and the more raw number second. As you can see above for Matthews, his contract is right about where it should be and there isn’t any change between the weighted and raw scores, which is common for RFA aged players.
The player’s stat line is also included as a point of reference as these are the building blocks for the TPS score, as well as some of the most important comparators like expected goals, corsi, and game score.
Lastly there is a second filterable graph that allows you to look at comparisons for the player above, and see some of the trending patterns.
Hooooo Doggy, there is still work to be done. First and foremost I need to bring goaltenders into the fold on this. I’m currently leaning towards a save percentage model similar to the one used for the On Ice Play approach.
In addition to that, it would be great to bring prospects into the mix in some regard through lite version of this mixed in with NHL equivalencies. Other pieces like establishing a common value of draft picks would also be a goal.
The other piece that I want to work into this is a means to establish who is driving the line a bit better. Take some of the Draisaitl shine off of Kailer Yamamoto, and what not.
Finally the hope is to add a bit of a predictive component for what the player’s cap hit should be, what their trade value is, and based on history what we can predict their future TPS scores to be as well.
In short, there is still plenty of work that needs to be done on this, but for now I’m happy to better understand how the sausage is made.