ezPM ratings are back!

(If you want to get on with Christmas and stuff, you can read this later, and just check out the new ezPM link at the top of the page.)

It’s taken me several months to re-code my play-by-play parser since Basketball-Value.com is no longer being updated (i.e. since Aaron Barzilai was hired by the 76ers). The cool part is that now I can make updates faster. I also have more data available to put in the model. Every play (or event) in my database has a lot of information associated with it that can be queried. To illustrate, here’s a typical field goal attempt (it should be pretty straightforward to follow each field):

```{
"Lakers" : [
"Steve Blake",
"Kobe Bryant",
"Antawn Jamison",
"Pau Gasol",
"Jordan Hill"
],
"Warriors" : [
"Stephen Curry",
"Klay Thompson",
"Richard Jefferson",
"Carl Landry",
"David Lee"
],
"as" : 24,
"away" : "Warriors",
"block" : "Jordan Hill",
"coords" : {
"x" : 2,
"y" : 10
},
"date" : "2012-11-09",
"distance" : 4,
"espn_id" : "400277800",
"event" : "Jordan Hill blocks a Stephen Curry driving finger roll shot from 4 feet out.",
"home" : "Lakers",
"hs" : 27,
"opponent" : "Lakers",
"pid" : 142,
"q" : 2,
"release" : "driving finger roll shot",
"season" : "2013",
"shooter" : "Stephen Curry",
"t" : "9:22",
"team" : "Warriors",
"type" : "fga",
"url" : "http://scores.nbcsports.msnbc.com/nba/pbp.asp?gamecode=2012110913",
"value" : 2
}
```

Here’s an example of a turnover (you’ll see the fields are somewhat different, because it’s a different type of event):

```{
"Suns" : [
"Goran Dragic",
"Jared Dudley",
"P.J. Tucker",
"Luis Scola",
"Marcin Gortat"
],
"Warriors" : [
"Stephen Curry",
"Jarrett Jack",
"Klay Thompson",
"David Lee",
"Andrew Bogut"
],
"_id" : ObjectId("50d801f85bca6d03c1001113"),
"as" : 46,
"away" : "Warriors",
"date" : "2012-10-31",
"espn_id" : "400277730",
"event" : "Stephen Curry with a bad pass turnover: Bad Pass",
"home" : "Suns",
"hs" : 36,
"opponent" : "Suns",
"pid" : 195,
"player" : "Stephen Curry",
"q" : 2,
"season" : "2013",
"t" : "3:39",
"team" : "Warriors",
"tov_type" : "Bad Pass",
"type" : "tov",
"url" : "http://scores.nbcsports.msnbc.com/nba/pbp.asp?gamecode=2012103121"
}
```

Anyway, after doing all this, I can now get back to routinely calculating my various metrics, and hopefully, making them even more informative in the future. For example, here are a couple of things I’m working on for a future iteration of ezPM:

• Change value of a rebound depending on the floor location and type of release. For example, if the offense tends to have a higher `OREB%` after a missed layup attempt, than the value of a defensive board in that situation should be higher.
• Similarly, a player might be debited less for a missed layup attempt, since the offense has a better chance of securing the rebound.
• Another change that I’ve been wanting to make for a while is to make the value of a possession dependent on the starting state. For example, possessions started after a steal, defensive rebound, or made basket, tend to have different expected values. This should be accounted for wherever the model uses `PPP`.

PSAMS Regressed on ORAPM: A New Variant of Statistical +/- for Offense

One form of +/- that I didn’t mention in my Advanced Stats Primer (but which will be included in a future update) is statistical +/- (SPM). I know, you’re thinking, isn’t +/- already “statistical”? Yes, but in the land of jargon, even jargon begets its own jargon. SPM essentially is a model created by regressing simple or advanced box score stats (see here and here for current examples) onto some form of adjusted +/- (APM or RAPM).

In the past I looked into the correlation between the offensive components of 3-yr RAPM and ezPM, and found that the results were statistically significant and fairly high ($R^2=0.32$). Here, I took the individual components of my PSAMS (Position- and Shot-Adjusted Marginal Scoring) metric for 2011, and regressed those onto Jeremias Engelmann’s 2011 ORAPM data set. Continue reading “PSAMS Regressed on ORAPM: A New Variant of Statistical +/- for Offense”