Cracking the Code: How to Calculate Hollinger's PER Without All the Mess

Zach FeinAnalyst IJanuary 19, 2009

John Hollinger's Player Efficiency Rating (PER) is a one-number measure of a player's per-minute productivity, and it may be one of the best basketball stats out there.

The PER is computed using a detailed, complex formula that, in essence, adds for positive stats such as rebounds, assists, and steals, and subtracts for negative stats such as shots missed or turnovers.

But the formula is too complicated. I like recreating stats by myself (as if I made it), but I could never come around to PER—who would want to go through that formula?

I decided to calculate PER—just for once—and find an easier way to compute it, using only linear weights (or multiplying a player's stats by different weights and adding them up).

Naturally, it took me three times before I finally got down the correct formula in Excel.

(My "player" was the league average player's stats prorated to 82 games, his "team's" stats were the average of all 30 teams last year, and the "league" stats were last year's league stats.)

I found the weight of a stat by adding one of that stat to the player's season totals (but not to the team or league), and finding the affect of that addition on the PER.

I was shocked to find that the PER—before adjusting it to make the league average equal 15.00—is around 0.28, so the effects looked small, although in reality they weren't.

The following table shows these effects of all stats used in the PER formula.

Off. Reb0.7262.3
Def. Reb0.2720.85
FT Miss-0.372-1.15
FG Miss-0.726-2.3


The column showing "Weight" is actual weight multiplied by 1,880 (explained below), and the "Approx." column shows the approximate weight if a field goal made was set to five.

So, what's up with the 1,880? That is the (approximate) adjustment used to set the weighting of the league average of above stats equal to the league average PER. In other words, using those weights to any one player will recreate his PER before you set the league average PER to 15.00.

We're almost there. The next step is the problem of making the league average PER 15.00. We can go through and actually calculate it—but that would be ironic, wouldn't it? We want to make the simplest formula to recreate PER, so we need a shortcut for this step.

Luckily, the league average hasn't changed the past few years—each adjustment has been around 54, with no real difference between them. So the final step is to multiply the weights by 54. You end up with these, the final weights of each stat.

Off. Reb39.190
Def. Reb14.707
FT Miss-20.091
FG Miss-39.190


Notice I've left out pace adjustments until now. The reason is that, although they are quite important in both the PER formula and evaluating players in different schemes, they are almost as tough as PER to calculate. You can find them on various Web sites, but that wouldn't be a simple calculation, would it?

Thus, the formula for the linear weights PER is

[ FGM x 85.910

+ Steals x 53.897

+ 3PTM x 51.757

+ FTM x 46.845

+ Blocks x 39.190

+ Offensive_Reb x 39.190

+ Assists x 34.677

+ Defensive_Reb x 14.707

- Foul x 17.174

- FT_Miss x 20.091

- FG_Miss x 39.190

- TO x 53.897 ]

x (1 / Minutes).

How does that formula match up with actual PER? Here are the PERs and linear weights PERs of the top 10 leaders in actual PERs.

LeBron James32.0930.73
Chris Paul30.2028.30
Dwyane Wade28.8728.06
Kobe Bryant24.9525.70
Dwight Howard25.8725.67
Carlos Boozer24.7725.34
Dirk Nowitzki24.0123.75
Tim Duncan24.4623.44
Devin Harris23.6322.95
Brandon Roy24.6022.90


Every one of the top 10 in actual PER were in the top 10 of the linear weights PER save for Devin Harris, who was beat by a hair by Shaquille O'Neal, whose lwtsPER was 23.65. Chris Paul and Brandon Roy have the biggest gaps in their PERs, because their teams have the slowest and second-slowest paces in the league, so they would have greatly benefited from the pace adjustment.

The lwtsPER is almost a perfect match of the actual PER, except that the lwtsPER underestimates by a slight bit (the average of the actual PER above is 26.35, and the average of the lwtsPER is 25.68). The league average of the lwtsPER is 14.98, which could be one reason as to why.


Looking to calculate PER, but don't want to go through all the mumbo jumbo?

Try the linear weights PER.