Projections and Accuracy for hitters – a look back at 2016
When it comes to trying to determine who had the most accurate projections, there are a lot of things to consider. And, if you try to consider them all, you won’t have a post – you’ll have a book.
You can use straight statistics, or you can bias-adjust. You can use whole stats. Rate stats. One-on-one comparisons for individual players. All stats. Just fantasy-relevant stats.
What I’ll do, here, is a fairly straightforward comparison between the numbers projected and the results. I’ll do some comparisons with and without bias adjustments, although part of your forecast skill should include not having large biases in the first place. And, for today, we’ll limit ourselves to hitters.
I’m going to be looking at average forecast errors for multiple statistics. If you’re going to do that, you really need to make sure that you are dealing with a consistent set of players. Having someone included in stat A but not stat B’s list can distort things badly. I eventually came up with a list of 256 players to form my focus group, if you will. These 256 were people that I thought, in the 2016 pre-season, would get at least 200 PA in 2016. But not just me – they only made the list if I, and Steamer, and Pecota, and Rotowire, all agreed they would get 200 PA, and then really did. We all made forecasts for these players, and they played enough to make a reasonable grade.
For projections, I have my own, of course, two varieties – the pure computer printout (“Autoclay”), and what I get from plugging those projections into lineups and depth charts and making my own judgments of playing time (“Clay”). I took these from copies I had on my computer from April 3; the latter were the ones I used for my own fantasy league drafts, last April 2 and 3. The fellows at FantasyPros.com helped me out by sharing copies they had made for Zips and Steamer (FanGraphs) last spring. I had downloaded stats from Pecota (Baseball Prospectus) and Rotowire, and I could run a variety of stats myself.
Now, the simplest, most naive forecast you could make, would be to simply use each player’s 2015 major league performance as his 2016 projection. That yields this
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
2015 real | 118.22 | 34.65 | 8.14 | 1.86 | 6.78 | 14.44 | 30.10 | 20.82 | 22.75 | 4.55 | 2.07 | 12.33 | 17.33 | 10.21 | 22.84 | 327.09 | 62.70 | 67.24 |
The numbers for PA through CS are simply the raw, average, absolute value of the differences, between forecast and reality, for all 256 players. The number for batting average shows the average difference, in hits, between projected and actual batting average, given real atbats. For example – suppose someone really went 100-for-400, a .250 batting average. The forecast was .293 – so the error is 17.2 hits (.293 minus .250, times 400). Similarly, the ISO number shows the difference in extra bases between actual and forecast isolated power. bbrate is the difference, in walks, between real and forecast BB/PA, for actual PA; so rate is the same thing for strikeouts. The “Sum” box is the simple sum of the 15 category boxes; “rates” sums just the four rate statistics; “roto” sums the R, HR, RBI, SB, and BA categories. So a 327 sum – that’s you’re naive baseline.
You can do a little better by taking 2013-15 average, instead of just 2015:
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
2013-15 real | 119.13 | 34.55 | 7.78 | 1.49 | 6.41 | 15.01 | 24.65 | 21.37 | 22.49 | 4.26 | 1.90 | 11.54 | 15.40 | 9.77 | 23.50 | 319.27 | 60.21 | 66.08 |
Your next step up in sophistication is to start adding some minor league stats into the ratings. When I run a simple 2013-15 DT for each player, and use that for my forecast – this will have no park factors, no adjustments to league average, and the PA will generally be projected into a 650-PA total, so they won’t project part-time PA at all – well, that gets me this:
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
2013-15 DT | 152.04 | 41.39 | 9.25 | 1.95 | 7.25 | 17.37 | 29.25 | 25.11 | 24.32 | 5.83 | 2.62 | 9.91 | 14.06 | 8.30 | 10.15 | 358.80 | 42.43 | 72.42 |
which isn’t really very good at all, thanks to the way PA are thrown off, and all the counting stats along with it. Projecting to a 650_AP season is definitely NOT the way to go. But the rates stats are dramatically better. Lets improve on the previous by taking a simple average of the three years 2013-15, with one little added wrinkle – minor league stats only count for 50% of major league stats.
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
13-15 DT+ | 104.98 | 30.73 | 6.74 | 1.40 | 5.95 | 12.99 | 17.96 | 17.64 | 19.78 | 4.08 | 1.88 | 9.85 | 14.13 | 8.29 | 9.90 | 266.28 | 42.17 | 57.29 |
That figure, by itself, is comparable to most of the other stats I’ll run. That value is pretty much the primary input to the autoclay – the computer printout, without any further help from me:
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
autoclay | 98.70 | 27.64 | 6.41 | 1.52 | 5.94 | 11.37 | 22.47 | 16.04 | 16.38 | 3.81 | 1.50 | 9.37 | 14.43 | 7.34 | 12.80 | 255.72 | 43.94 | 51.53 |
Next was ZIPS, taking another step forward:
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
zips | 94.80 | 26.82 | 6.39 | 1.66 | 6.22 | 11.56 | 22.96 | 16.08 | 16.72 | 3.97 | 1.67 | 8.98 | 15.07 | 8.16 | 11.92 | 252.99 | 44.14 | 51.98 |
Followed by Rotowire’s projections;
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
rotowire | 91.30 | 27.20 | 7.04 | 1.65 | 6.08 | 11.68 | 22.34 | 15.84 | 16.83 | 4.37 | 1.83 | 9.51 | 15.19 | 8.11 | 12.73 | 251.69 | 45.54 | 52.63 |
Ahead of Rotowire is where I show up:
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
clay | 91.77 | 26.32 | 6.30 | 1.50 | 6.11 | 11.35 | 22.35 | 15.85 | 16.60 | 3.72 | 1.51 | 9.32 | 14.42 | 7.74 | 12.47 | 247.33 | 43.95 | 51.59 |
I’d like to say that’s where it ends, but I have to honestly report that still leaves PECOTA
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
pecota | 90.83 | 25.77 | 6.14 | 1.59 | 5.90 | 11.77 | 21.69 | 15.57 | 16.25 | 4.04 | 1.51 | 9.04 | 14.62 | 8.08 | 12.61 | 245.40 | 44.34 | 50.80 |
And, on top, Steamer:
Stat | PA | H | DB | TP | HR | BB | SO | R | RBI | SB | CS | BA | ISO | bbrate | sorate | Sum | rates | roto | |
steamer | 88.62 | 25.57 | 6.18 | 1.51 | 6.20 | 10.91 | 21.64 | 15.85 | 16.48 | 3.93 | 1.94 | 8.88 | 14.91 | 7.44 | 12.01 | 242.08 | 43.24 | 51.35 |
The differences really aren’t that big between them. For instance, if we take the best score on a player by player basis for the 256 player group, then among the top three the results are fairly even – Clay was best on 80, Steamer on 89, Pecota on 87. Clay beats Steamer 129-127 head to head; Pecota beats Clay 133-123; and Steamer beats Pecota 132-124.
{Note – I had this virtually finished this by about Valentine’s Day, and then – right before hitting the publish key – made one more check and discovered that the “real” stats I was using for validation were not the actual, real stats. Wiping out a lot of work and several erroneous conclusions. Then things went crazy at work, and I focused on getting stats for other leagues in, and before I know it its March – not just barely, but a full week in. Time sure seems to move a lot faster than it used to. May also have to do with being more committed to my day job than I used to be – I could never work on this during the day, the way I used to.]
While everything on this site is free, a donation through Paypal to help offset costs would be greatly appreciated. -Clay
If you are trying to reach me, drop me an email. Same address as the webpage, but replace ".com" with "@gmail.com".
Archives
- November 2023
- September 2023
- March 2023
- February 2023
- January 2023
- January 2022
- September 2021
- April 2021
- February 2021
- December 2020
- February 2020
- November 2019
- January 2019
- March 2018
- February 2018
- January 2018
- August 2017
- June 2017
- March 2017
- January 2017
- September 2016
- May 2016
- April 2016
- March 2016
- February 2016
- January 2016
- September 2015
- April 2015
- March 2015
- January 2015
- December 2014
- November 2014
- October 2014
- April 2014
- February 2014
- January 2014
- October 2013
- April 2013
- March 2013
- February 2013
- March 2012
- February 2012
- January 2012
- December 2011
- November 2011
- October 2011
- August 2011
- July 2011
- June 2011
- May 2011