Jul 102013
 

One of the complaints against advanced statistics in hockey is the names of some of the advanced statistics. Sometimes people complain about names like Corsi, Fenwick, PDO, etc. because they don’t have meaningful names. I never really understood it because once you figure it out, which honestly it isn’t that difficult, it isn’t all that difficult. That said, it still seems that some people feel it is a bit of a hurdle for some to get into advanced hockey statistics. I am hoping to revamp and improve my hockey statistics database even more this summer and in the process I wondered if there is interest in having me use some standardized hockey statistics nomenclature that we can all agree on. Here is what I am proposing:

Event Statistics Description
TOI Time on ice
G Goals
A Assists
FirstA First Assists
SOG Shots on goal
SAG Shots at goal (includes missed shots)
ASAG Attempted Shots at Goal (includes missed and blocked shots)
Percentage Statistics
Sh% Shooting percentage (G/SoG)
SAGSh% Shots at goal shooting percentage (G/SaG)
ASAGSh% Attempted Shots at Goal Shooting percentage (G/aSaG)
Sv% Save percentage (G/SoG)
SAGSv% Shots at goal save percentage (G/SaG)
ASAGSv% Attempted Shots at Goal Save percentage (G/aSaG)
ShSv% Shooting percentage + save percentage (Sh% + Sv%)
SAGShSv% Shots at goal shooting percentage + save percentage (SAGSh% + SAGSv%)
ASAGShSv% Attempted Shots at goal shooting percentage + save percentage (ASAGSh% + ASAGSv%)
Other Statistics
IGP Individual Goals Percentage (iG / GF)
IAP Individual Assist Percentage (iA / GF)
IPP Individual Points Percentage (iPts / GF)
ISOGP Individual Shots on Goal Percentage (iSOG / SOGF)
IASAGP Individual Shots at Goal Percentage (iSAG / SAGF)
IASAGP Individual Attempted Shots at Goal Percentage (iASAG / ASAGF)
Zone Starts
OZFO Numer of Offensive Zone Face Offs
NZFO Number of Neutral Zone Face Offs
DZFO Number of Defensive Zone Face Offs
OZFO% Offensive Zone Face Off Percentage – OZFO /(OZFO+NZFO+DZFO)
NZFO% Neutral Zone Face Off Percentage – NZFO /(OZFO+NZFO+DZFO)
DZFO% Defensive Zone Face Off Percentage – DZFO /(OZFO+NZFO+DZFO)
OZBias Offensive Zone Bias – (2*OZFO + NZFO) / (OZFO + NZFO + DZFO)
DZBias Defensive Zone Bias – (2*DZFO + NZFO) / (OZFO + NZFO + DZFO)
OZFOW% Offensive Zone Face Off Winning Percentage
NZFOW% Neutral Zone Face Off Winning Percentage
DZFOW% Defensive Zone Face Off Winning Percentage
FOW% Face off win percentage (all zones)
Prefix
i Individual Stats
TM Average stats of team/line mates weighted by TOI with
Opp Stats of opposing players weighted by TOI against
PctTm Percent of Teams stats the player recorded in games the player played in
Suffix
F Stats for the players team while player is on the ice
A Stats against the players team while player is on the ice
20 or /20 Stats per 20 minutes of ice time
60 or /60 Stats per 60 minutes of ice time
F% Percentage of events that are by the players own team (i.e. for)
D Difference between For and Against statistics

The major changes are instead of calling shots + missed shots fenwick events we call them Shots At Goal (SAG) and instead of calling shots + missed shots + blocked shots corsi events we call them Attempted Shots At Goal (ASAG). Also PDO which is shooting percentage + save percentage is now named ShSv%.

The prefixes and suffixes can be added to individual stats to create new statistics. For example:

  • iSh% = Individual Shooting Percentage (iG / iSOG)
  • TMSAG20 = Team mate average Shots at Goal per 20 minutes of ice time weighted by TOI with
  • OppGF% = Opponent average Goals For Percentage weighted by time on ice against
  • PctTmG = In games that the player played in, the percentage of his teams goals that the player himself scored.

Note that not all combinations of prefixes and suffixes make sense. For example, PctTmSh% or Sh%F but that is self explanatory I think.

What does everyone think? I am perfectly fine sticking with the way I have statistics currently presented but if the majority think something along the lines of the above is better I am all for making the change. If anyone has any other suggestions they are welcome as well. I just think that this is as good a time as any to come up with some standardized nomenclature.

Also, I currently have statistics for the following situations:

  • 5v5
  • 5v5 Home
  • 5v5 Road
  • 5v5 Close
  • 5v5 Tied
  • 5v5 Up1
  • 5v5 Up 2+
  • 5v5 Down 1
  • 5v5 Down 2+
  • 5v5 Leading
  • 5v5 Trailing
  • 5v4 PP
  • 4v5 SH
  • Zone start adjusted data for all of the above except 5v4 SH and 4v5 SH.

If there is interest I may consider adding other situations. For example, first period, second period, third period, 4v4, 5v5 close home and 5v5 close road. Would anyone find these or any other situation interesting to look at?

Also feel free to consider the comments of this post the place where you can officially make any other suggestions of upgrades/enhancements you would like to see made to stats.hockeyanalysis.com. I can’t make any promises I will do implement them but I hope to make some upgrades over the summer.

Update:  Added ‘D’ to the suffix list which stands for differential. So ASAGD would stand for Attempted Shots At Goal Differential which is the equivalent of corsi differential in use now. Might consider adding Rel but need to consider if it is necessary or not. Thoughts?

 

Apr 122013
 

Even though I think the idea of ‘usage’ and ‘tough minutes’ is a vastly over stated factor in an individual players statistics they are interesting to look at as it gives us an indication of how a coach views the player. So for all the usage fans, here is another usage statistic which I will call the Leading-Trailing Index, or LT Index for short.

LT Index = TOI% when leading / TOI% when trailing

where TOI% is the percentage of the teams overall ice time (in games that the player played in) that the player is on the ice (so a 5v5 TOI% of 20% means the player was on the ice for 20% of the time that the team was at 5v5). Thus, the LT index is a ratio of the players ice time when his team is leading to his ice time when his team is trailing adjusted for the overall ice time that the team is leading/trailing. Any number greater than 1.00 indicates the player gets a greater share of ice time when the team is leading and anything under 1.00 indicates the player gets a greater share of ice time when the team is trailing.  So, any players with an LT index greater than one is used more as a defensive player than an offensive one and anything less than one they are used more as an offensive player than a defensive one. Any player around 1.00 is a well balanced player. So, looking at this seasons data we have the following player usage:

Defensive Usage

Defenseman LT Index Forward LT Index
MICHAEL STONE 1.21 BJ CROMBEEN 1.66
KEITH AULIE 1.20 MATHIEU PERREAULT 1.45
RYAN MCDONAGH 1.19 CRAIG ADAMS 1.35
PAUL MARTIN 1.16 TRAVIS MOEN 1.33
BRYCE SALVADOR 1.15 BOYD GORDON 1.26
BRENDAN SMITH 1.14 JAMES WRIGHT 1.26
SCOTT HANNAN 1.14 MICHAEL FROLIK 1.23
ANDREJ SEKERA 1.13 BRIAN BOYLE 1.22
MIKE WEBER 1.13 MATT CALVERT 1.22
JUSTIN BRAUN 1.12 TANNER GLASS 1.20
BARRET JACKMAN 1.12 MATT MARTIN 1.19
ROBYN REGEHR 1.12 RUSLAN FEDOTENKO 1.19
CLAYTON STONER 1.12 STEPHEN GIONTA 1.19
ANTON VOLCHENKOV 1.11 CASEY CIZIKAS 1.19
RON HAINSEY 1.11 JEFF HALPERN 1.18
TIM GLEASON 1.11 DAVID JONES 1.17
ROSTISLAV KLESLA 1.11 NIKOLAI KULEMIN 1.17
ROB SCUDERI 1.10 ZACK KASSIAN 1.17
NIKLAS HJALMARSSON 1.10 RYAN CARTER 1.16
NICKLAS GROSSMANN 1.10 TORREY MITCHELL 1.16

Offensive Usage

Defenseman LT Index Forward LT Index
RYAN ELLIS 0.78 DEREK DORSETT 0.77
KRIS LETANG 0.84 RAFFI TORRES 0.77
MARK STREIT 0.86 TAYLOR HALL 0.79
KYLE QUINCEY 0.87 CORY CONACHER 0.79
MATT NISKANEN 0.87 JORDAN EBERLE 0.80
JUSTIN SCHULTZ 0.87 NAIL YAKUPOV 0.82
DOUGIE HAMILTON 0.88 RYAN NUGENT-HOPKINS 0.82
VICTOR HEDMAN 0.88 RICH CLUNE 0.82
DAN BOYLE 0.89 BLAKE COMEAU 0.82
KEVIN SHATTENKIRK 0.89 KYLE PALMIERI 0.84
ALEX PIETRANGELO 0.89 BRENDAN GALLAGHER 0.84
JOHN-MICHAEL LILES 0.90 CLAUDE GIROUX 0.86
JOHN CARLSON 0.90 VINCENT LECAVALIER 0.86
P.K. SUBBAN 0.90 DREW SHORE 0.86
LUBOMIR VISNOVSKY 0.91 TJ OSHIE 0.87
CODY FRANSON 0.91 ALEX OVECHKIN 0.87
JAMIE MCBAIN 0.91 JONATHAN HUBERDEAU 0.87
ROMAN JOSI 0.92 NICKLAS BACKSTROM 0.87
JARED SPURGEON 0.93 SCOTT HARTNELL 0.87
CHRISTIAN EHRHOFF 0.93 MARIAN HOSSA 0.87

Balanced Usage

Defenseman LT Index Forward LT Index
MICHAEL DEL_ZOTTO 0.99 BRYAN LITTLE 0.99
ERIC BREWER 0.99 MIKE FISHER 0.99
JAKUB KINDL 0.99 MIKKEL BOEDKER 0.99
ADRIAN AUCOIN 0.99 ALEXEI PONIKAROVSKY 0.99
ALEX GOLIGOSKI 0.99 JASON POMINVILLE 0.99
ERIK GUDBRANSON 1.00 CHRIS STEWART 0.99
DREW DOUGHTY 1.00 DANIEL BRIERE 1.00
THOMAS HICKEY 1.00 RADIM VRBATA 1.00
JOHNNY ODUYA 1.00 ALEX TANGUAY 1.00
SLAVA VOYNOV 1.00 GABRIEL LANDESKOG 1.00
MATT IRWIN 1.00 JIRI TLUSTY 1.00
FRANCIS BOUILLON 1.01 COLIN WILSON 1.00
JONAS BRODIN 1.01 PATRICK DWYER 1.00
BRENT SEABROOK 1.01 JADEN SCHWARTZ 1.01
JOSH GORGES 1.01 BRANDON SAAD 1.01
DUSTIN BYFUGLIEN 1.01 LEO KOMAROV 1.01
BRENDEN DILLON 1.01 DREW MILLER 1.01
GREG ZANON 1.01 DAVID PERRON 1.01
KRIS RUSSELL 1.02 TOM PYATT 1.01

It’s amazing how much more BJ Crombeem gets used protecting a lead than when trailing. You’d have to think that score effects could have a significant impact on his stats because of this. Not really a lot of surprises there though though in the case of a guy like Derek Dorsett him being in the ‘offensive usage’ category has more with the coach not wanting to use him defending a lead than hoping he will score a goal to get the team back in the game.

 

Apr 112013
 

Stats.hockeyanalysis.com has just gotten even better! Several people have asked why I have zone start adjusted stats for team stats and it is a good question. The answer to that is that it was just easier from a programming point of view to have the same ‘situations’ for both the player level and the team level and since I was already calculating, for example, 5v5close zone start adjusted data for players it was east to add 5v5close zone start adjusted data for teams. Since it makes sense to have non-zone start adjusted data for teams it was on my todo list to get it implemented. So, now it is done, and so much more. The situations that you can access data for at both the player and team level are:

  • 5v5
  • 5v5 home
  • 5v5 road
  • 5v5 close
  • 5v5 tied
  • 5v5 leading
  • 5v5 trailing
  • 5v5 up 1 goal
  • 5v5 up 2+ goals
  • 5v5 down 1 goal
  • 5v5 down 2+ goals
  • 5v4 PP
  • 4v5 PK

In addition to all of the above, all of the above are also available in their Zone Adjusted forms except for the 5v4 PP and 4v5 PK situations. In total, there are now 24 different situations you can search for stats on.  Have at it and don’t blame me for any lost weekends (or lost productivity at work).

(As usual, if you find any issues with the new data please let me know. The stats should be correct but while I have done some testing on the new code to display the stats but it isn’t completely tested.)

 

Apr 112013
 

Every now and again someone asks me how I calculate HARO, HARD and HART ratings that you can find on stats.hockeyanalysis.com and it is at that point I realize that I don’t have an up to date description of how they are calculated so today I endeavor to write one.

First, let me define HARO, HARD and HART.

HARO – Hockey Analysis Rating Offense
HARD – Hockey Analysis Rating Defense
HART – Hockey Analysis Rating Total

So my goal when creating then was to create an offensive defensive and overall total rating for each and every player. Now, here is a step by step guide as to how they are calculated.

Calculate WOWY’s and AYNAY’s

The first step is to calculate WOWY’s (With Or Without You) and AYNAY’s (Against You or Not Against You). You can find goal and corsi WOWY’s and AYNAY’s on stats.hockeyanalysis.com for every player for 5v5, 5v5 ZS adjusted and 5v5 close zone start adjusted situations but I calculate them for every situation you see on stats.hockeyanalysis.com and for shots and fenwick as well but they don’t get posted because it amounts to a massive amounts of data.

(Distraction: 800 players playing against 800 other players means 640,000 data points for each TOI, GF20, GA20, SF20, SA20, FF20, FA20, CF20, CA20 when players are playing against each other and separate of each other per season and situation, or about 17.28 million data points for AYNAY’s for a single season per situation. Now consider when I do my 5 year ratings there are more like 1600 players generating more than 60 million datapoints.)

Calculate TMGF20, TMGA20, OppGF20, OppGA20

What we need the WOWY’s for is to calculate TMGF20 (a TOI with weighted average GF20 of the players teammates when his team mates are not playing with him), TMGA20 (a TOI with weighted average GA20 of the players teammates when his team mates are not playing with him), OppGF20 (a TOI against weighted average GF20 of the players opponents when his opponents are not playing against him) and OppGA20 (a TOI against weighted average GA20 of the players opponents when his opponents are not playing against him).

So, let’s take a look at Alexander Steen’s 5v5 WOWY’s for 2011-12 to look at how TMGF20 is calculated. The columns we are interested in are the Teammate when apart TOI and GF20 columns which I will call TWA_TOI and TWA_GF20. TMGF20 is simply a TWA_TOI (teammate while apart time on ice) weighted average of TWA_GF20. This gives us a good indication of how Steen’s teammates perform offensively when they are not playing with Steen.

TMGA20 is calculated the same way but using TWA_GA20 instead of TWA_GF20. OppGF20 is calculated in a similar manner except using OWA_GF20 (Opponent while apart GF20) and OWA_TOI while OppGA20 uses OWA_GA20.

The reason why I use while not playing with/against data is because I don’t want to have the talent level of the player we are evaluating influencing his own QoT and QoC metrics (which is essentially what TMGF20, TMGA20, OppGF20, OppGA20 are).

Calculate first iteration of HARO and HARD

The first iteration of HARO and HARD are simple. I first calculate an estimated GF20 and an estimated GA20 based on the players teammates and opposition.

ExpGF20 = (TMGF20 + OppGA20)/2
ExpGA20 = (TMGA20 + OppGF20)/2

Then I calculate HARO and HARD as a percentage improvement:

HARO(1st iteration) = 100*(GF20-ExpGF20) / ExpGF20
HARD(1st iteration) = 100*(ExpGA20 – GA20) / ExpGA20

So, a HARO of 20 would mean that when the player is on the goal rate of his team is 20% higher than one would expect based on how his teammates and opponents performed during time when the player is not on the ice with/against them. Similarly, a HARD of 20 would mean the goals against rate of his team is 20% better (lower) than expected.

(Note: The OppGA20 that gets used is from the complimentary situation. For 5v5 this means the opposition situation is also 5v5 but when calculating a rating for 5v5 leading the opposition situation is 5v5 trailing so OppGF20 would be OppGF20 calculated from 5v5 trailing data).

Now for a second iteration

The first iteration used GF20 and GA20 stats which is a good start but after the first iteration we have teammate and opponent corrected evaluations of every player which means we have better data about the quality of teammates and opponents the player has. This is where things get a little more complicated because I need to calculate a QoT and QoC metric based on the first iteration HARO and HARD values and then I need to convert that into a GF20 and GA20 equivalent number so I can compare the players GF20 and GA20 to.

To do this I calculate a TMHARO rating which is a TWA_TOI weighted average of first iteration HARO. TMHARD and OppHARO and OppHARD are calculated in a similar manner. TMHARD, OppHARO and OppHARD are similarly calculated. Now I need to convert these to GF20 and GA20 based stats so I do that by multiplying by league average GF20 (LAGF20) and league average GA20 (LAGA20) and from here I can calculated expected GF20 and expected GA20.

ExpGF20(2nd iteration) = (TMHARO*LAGF20 + OppHARD*LAGA20)/2
ExpGA20(2nd iteration) = (TMHARD*LAGA20 + OppHARD*LAGF20)/2

From there we can get a second iteration of HARO and HARD.

HARO(2nd iteration) = 100*(GF20-ExpGF20) / ExpGF20
HARD(2nd iteration) = 100*(ExpGA20 – GA20) / ExpGA20

Now we iterate again and again…

Now we repeat the above step over and over again using the previous iterations HARO and HARD values at every step.

Now calculate HART

Once we have done enough iterations we can calculate HART from the final iterations HARO and HARD values.

HART = (HARO + HARD) /2

Now do the same for Shot, Fenwick and Corsi data

The above is for goal ratings but I have Shot, Fenwick and Corsi ratings as well and these can be calculated in the exact same way except using SF20, SA20, FF20, FA20, CF20 and CA20.

What about goalies?

Goalies are a little unique in that they only really play the defensive side of the game. For this reason I do not include goalies in calculating TMGF20 and OppGF20. For shot, fenwick and corsi I do not include the goalies on the defensive side of things either as I assume a goalie will not influence shots against (though this may not be entirely true as some goalies may be better at controlling rebounds and thus secondary shots but I’ll assume this is a minimal effect if it does exist). The result of this is goalies do have a HARD rating but no HARO, or shot/fenwick/corsi based HARD or HARO rating.

I hope this helps explain how my hockey analysis ratings are calculated but if you have any followup questions feel free to ask them in the comments.

 

Aug 212011
 

I have just updated my stats site (stats.hockeyanalysis.com) to include a number of new features.  The added features are:

1.  I have added a new situation – 5v5close.  5v5close is when the game is tied or within 1 goal in the first and second period or tied in the third period.  This is what I would call normal play where teams are more or less (depending on talent or game play/coaching style) equally interested in  playing offense or defense.  When teams get a larger lead or lead late in the game teams adjust their style of play to either protect that lead or go all out to score a goal to catch up.  It is probably better to use this than 5v5tied and maybe better than 5v5 (all 5v5 game score situations).

2.  I have included zone start data in the form of OZOF%, DZOF% and NZOF%.  OZOF% is the percentage of face offs taken in the offensive zone when the player is on the ice and DZOF% and NZOF% are the same for defensive zone and neutral zone faceoffs.  When we look at these by situation we can get an idea of how a players use gets changed by game score.  For example, last year Manny Malholtra had 38.8% of his 5v5 face offs in the defensive zone (29.1% offensive zone and 32.1% neutral zone) but when the Canucks were up by a goal his defensive zone faceoffs rose to 41.6% and when the Canucks were up by 2 goals they rose to 48.4%.

3.  I have once again put up with/against statistics for each player.  I had this data up a few years ago but when I re-designed my website I removed it but it is back.  Each player page (i.e. the Malhotra one linked to above) has a set of links at the top of the page to with/against statistics for each season (and multi-seasons) for 5v5 and 5v5 close situations for both goal and corsi data.  Each page shows how the player played with each teammate as well as how they played when they were not playing together as well as how the player performed against each opponent and how well the player and the opponent performed when not playing together.  These tables can give you an indication of which players are playing together and which players play well together as well as who a player plays against the most.  As an example, take a look at Manny Malhotra 5v5 goal with/against data for this past season and you will see he played the most with Raffi Torres (even more than with Roberto Luongo!) but it seems both players had better on ice results when apart.

4.  If you hadn’t noticed yet, a while back I added on ice shooting percentage (Sh%) and on ice opposition shooting percentage (OppSh%, subtract from to get on ice save %) which can be found with the goal data (but not with corsi, fenwick and shot data).

All totaled, there is well over 10 gigabytes of html, php and data base files of statistics (90% of which is in the with/against tables) so be warned, if you really wanted to you could spend days looking at it all.