Comprehensive NBA Free Throw Modeling
Enough predictors to tighten up the posterior distributions
Previously, we modeled how well players shoot free throws using a simple hierarchical Bayesian binomial model. How well a player shot depended both on what we’ve seen them shoot so far this season, as well as learning across players hierarchically.
Then we incrementally added in their position, since it makes more sense to assume guards shoot like guards if you don’t know anything else about them.
Here, we take it one step further. Actually 5 steps further, just dumping in the next easiest features into the model.
This was partially inspired by our friend who has a solid NBA analysis newsletter
The Model
Incrementally improving on our free throw modeling, we added the following position-specific features:
Height
Experience
Draft Position
Weight
International vs US
The Players
Here’s the posterior broken out by position:
Height: Smaller is Better, But Tons of Uncertainty
The estimate for the effect of height is negative, but the uncertainty is huge. Notably, it’s reasonably certain for guards.
Broken out by position, plotting our estimate of the effect of height on top of the raw data:
Experience: More → Better
This isn’t to say more experience makes you better. But if all you know is a player’s position and number of years in the NBA, you know more than nothing.
Draft Position: Another Obvious Effect
Probably don’t need much commentary on this one.
Weight: Heavy Forwards Struggle
I’m curious what your thoughts on weight are. I’ll hold off on my interpretation, but if you leave a comment, I promise to engage.
International vs US
It doesn’t matter.
Top Shooters
Look how much we’ve tightened up our estimates.
Bottom Shooters
Looking Ahead
I’m so thankful for everyone that DM’d me over the last few weeks.
I probably won’t be posting any more free throw modeling for a bit. I have some really off-the-wall ideas that I’ve been modeling, and I want to share that next, I think.















Thanks for the shoutout! I really like using draft position as a model feature because it contains so much baseline info (with a few exceptions)