Scorer Bias Adjustments

October 28, 2020, Micah Blake McCurdy, @IneffectiveMath

Introduction

The national hockey league has for years recorded shot locations for goals, saves, and misses, and unsurprisingly people like me have done a great deal with the data so recorded. However, doubts have arisen about how accurate these shot locations have been at various times and places. For instance, consider the New York Rangers shots taken (on top) and allowed (on the bottom) at 5v5 during the 2007-2008 season, broken out by home (on the left) and away (on the right).

Red regions show areas with more shots than league average, blue areas with fewer. Immediately we can see that the pattern of shots at Madison Square Garden (where the Rangers play their home games) is dramatically closer to the net. Furthermore, the "tops of the circles" are defined with an unusual clarity on both of the MSG maps, a feature replicated (somewhat) in the rangers shots away from home but not at all in their shots conceded on the road.

Even more unsettlingly, the goaltending results vary substantially. The ratio of goals to expected goals at MSG is around 0.7, both for the rangers goaltenders (mostly, by volume, the in-his-prime future hall-of-famer Henrik Lundqvist; fair enough, perhaps) and also for visiting netminders. On the road, the ratio of goals to expected goals is much closer to one, suggesting that somehow goaltenders consistently perform better at MSG, regardless of which team they play for. One plausible explanation is that the scorers at this rink during these games systematically recorded the shots (for both teams) as closer to the goal than they actually were.

It is a common notion (I am among the people who has popularized this notion) that scorer bias is an old problem, and that modern shot locations are much improved. This is true, to an extent, as we will see, but even modern rinks have concerning patterns, such as the current cup champions:

Here the pattern of the ratios of goals to expected goals is in the other directions; goals are easier to come by, relative to their seeming quality, in Tampa Bay than in Tampa games elsewhere. More generally, the striking similarity of shot locations for both teams in Tampa home games is itself concerning.

Over the years various attempts have been made to measure this scorer bias on shot locations, and to artificially modify the listed coordinates, with the aim of producing a more accurate data set. Most important among them were:

In addition to scorer bias, however, there are at least three important other reasons why home/road outcomes may vary:
  1. Home and road performances are confounded with changes in many other factors, including rest and playing rosters, especially goaltenders. Especially salient here are score effects, the phenomenon of teams playing differently because of the score, especially the leading team and especially late in games. This confounding of score variation with home/road variation is known to not be random, since home teams have won and play more while winning than the road team.
  2. The above point explains how home/road variation can arise from other factors that correlate with home/road distinctions. However, home and road performances may be different for that reason, that is, because players (perhaps unwittingly) and coaches (somewhat more wittingly) employ different stratagies. For instance, one coach may prefer a riskier style at home, wisely or unwisely; another may prefer to use their home-advantage of last-change to mitigate risk instead.
  3. Random variation.
Since all of the existing approaches to scorer bias adjustment fail to account for at least one of the above possibilities, I have decided to develop the method detailed here to do so.

Method

To estimate the scorer bias, I used a modified version of my "flagship" shot rate model, magnus that I use for estimating, among other things, player impacts on shot generation and shot suppression at 5v5. I assume that scorer bias at 5v5 can be extrapolated to all situations. Briefly, the model in its "usual" form contains terms for every player on offence, for every player on defence, for home-ice advantage, for the various score states, for shift starts by zone, and for coaches. To this "stock" model I add the following terms for today's purpose:

For example, if the Dallas Stars were to play a game against the New York Rangers at Madison Square Garden, the relevant new terms for the Stars shots would be "DAL road offence", "NYR home defence", and "NYR rink". The relevant new terms for the Rangers shots would be "NYR home offence", "DAL road defence", and "NYR rink".

Fitting

It is a vital feature of magnus that it is fit with zero-bias penalties, that is, values different from league average are discouraged. Without them the estimates for player impact would be overfit, conforming too tightly to the random peculiarities of happenstance instead of the innate ability of the aspects of the terms that interest us.

I have applied similar penalties to the new terms in this model. The numerical value of the penalty is ten thousand, matching the penalties used for players in magnus. (There is no suitable canonical choice for this value, here ten thousand arises in part because of my normalization of many covariates to have values near one and my use of a hundred-by-hundred grid for discretizing the half-rink.)

Turning Bias Distribution Into Bias Vectors

The "coefficient" values output from fitting magnus are shot maps, that is, one-hundred-by-one-hundred grids of numbers describing the rate of shots at a given point relative to league average. What I want, however, is a vector field, associating to every point on the rink a different point, such that moving all shots in this way will correct for the scorer bias, in total. The road from the one to the other is somewhat hairy. First, I am considering at this time only modifications of location, not the possibility that the overall rate of shots might possibly change. Hence, I first normalize each rink adjustment covariate to have mean zero. Then, for each rink, I form two distributions, each defined on the half-rink: the shots per time as recorded, and the shots per time as recorded plus the bias covariate. Both of these distributions are strictly positive and we want to find the simplest way to describe a point-by-point movement that will turn one pile of shots into the other pile of shots.

In addition to normalizing the bias term to have zero net change, I also symmetrize both shot distributions, that is, averaging them with their left-right-flipped versions, so that the results I get are left-right symmetric. Since the direction of play changes every period but the scorers' equipment does not, I expect any bias corrections should be symmetric in this sense. Furthermore, I clip the distributions to be zero below the goal line and outside of the blue line, since these are the shots in which I am most interested.

Described in this way, the problem fits the pattern of so-called "optimal transport" problems, that of moving a pile of dirt of a given shape to instead have a different shape. Specifically, if it "costs" \(M(p,q)\) dollars to move a unit of dirt from location \(p\) to location \(q\), I would like to find a function \(f(p,q)\) which describes the amount of dirt to be moved from \(p\) to \(q\), and I would like \(f\) to be optimal in the sense that I want both:

I used a "cost" function \(M(p,q)\) as the square of the distance from \(p\) to \(q\), to encourage many small movements instead of fewer larger movements.

I used a python library (Python Optimal Transport) to find the \(f\) which moves the one shot distribution to the other while minimizing the sum over all locations \(p\) and \(q\) of the following quantity: $$ f(p,q) M(p,q) + f(p,q) \ln f(p,q) $$ The first term \(f(p,q) M(p,q)\) is the cost of the movement, the second term is so-called "entropic regularization", which encodes our desire that the function be smooth; the reader will notice the reapparance of the function \(x \mapsto x \ln x\) which features in the definition of log-loss and other information-theoretic notions.

In practice (because computers) this function \(f\) is known through its values on a grid, and for a given \(p\) there are generally many different values of \(q\) for which \(f(p,q)\) is non-zero; that is, shots recorded at \(p\) are moved by optimal transport to many different locations, some here, some there, and so on. I want to extract for each \(p\) the average movement to as to obtain a single location to which I will move shots recorded at \(p\). Thus, for every shot recorded at a location \(p_0\) I find the four closest locations \(p\) in the grid for which I have \(f\) values and compute the weighted sum of every value of \(f(p,q)\), where each value is weighted according to the exponential of the negative of the distance between \(p\) and \(p_0\).

Results

The full results for each rink for each season can be found in the appendix below. As you can imagine, an adjustment for every location for every rink for every season is a lot of information. To summarize this, I've compared the xG for each unblocked shot taken by either team at the indicated rink using the existing coordinates with the xG for the same shot at the adjusted location. Other shot characteristics (rush, rebound, strength state, etc.) are unchanged.

Goalies who played a lot in rinks in the top part of the graph are not quite as good as their unadjusted results would indicate, and goalies who played a lot in rinks at the bottom of the graph are better than we previously thought. Conversely (and to a lesser extent by virtue of ice-time differences), shooters who played a lot of minutes in the upper rinks are better than we thought, and those who played a lot in the lower rinks are not as good as we thought.

Of course, the unavoidable, extraordinarily salient feature of this graph is the deviation of Madison Square Garden, where the Rangers play, from all of the other teams, although the Islanders are no better recently. All of the other rinks, broadly, are in a tight range. In fact, it seems as though shot location bias in the greater New York metropolitan region has been powerful enough to be visible relative to league average. Perhaps a truly sophisticated approach could compute adjustments as I have done here in a way that satisfies a suitably chosen global condition.

I mentioned earlier that it is conventional wisdom that scorer bias is less of an issue in recent years; this seems somewhat true (certainly it is true for MSG) but the full-league trend seems modest. Also, the early seasons are a little more chaotic, with less year-to-year variation of bias in recent years.

Computing per-shot changes (as above) is my preferred way to look at this adjustment; you may instead prefer cumulative xG changes:

Note of course that not every season has 41 games for every rink; the first covid season (19-20) and the second lockout season (12-13) have fewer.

Conclusions

The next step is to perform the adjustments described here, computing new location coordinates for each shot in my hockey database. Then, I will need to re-train my xG model using the new coordinates; I expect that this will change the shooting estimates for some players and the goaltending saving estimates for quite a few others. Then, I will use the new xG model to re-train my shot rate model (without the new terms described here) to obtain new estimates for shot rate impact for skaters and coaches. Then, I will regenerate nearly every single image on my website.

Appendix: Home/Road 5v5 shot rate Splits and Adjustments

The "Splits" links show the road vs home performance for every team, using the existing data. The "Adj" links show the adjustment computed here, where the arrows show the movement of each shot and the red/blue colouring shows where we estimate that there are more/fewer shots recorded than there ought to be.

07-0808-0909-1010-1111-1212-1313-1414-1515-1616-1717-1818-1919-20
ANASplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
ARISplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
ATLSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
BOSSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
BUFSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
CARSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
CBJSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
CGYSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
CHISplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
COLSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
DALSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
DETSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
EDMSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
FLASplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
L.ASplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
MINSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
MTLSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
N.JSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
NSHSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
NYISplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
NYRSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
OTTSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
PHISplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
PITSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
S.JSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
STLSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
T.BSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
TORSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
VANSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
WSHSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
WPGSplits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
Splits
Adj
VGKSplits
Adj
Splits
Adj
Splits
Adj