The 2019 Hitter Projections: Where Did We Go Wrong?
If the other projectionators are anything like me, the projections going awry, afoul, or askew is always something in the back of their minds. Ideally, one should make projections, let the rubber hit the road, and then worry about what actually happened in the fall post-mortems. As much as I’d like to do that, when ZiPS makes an aggressive projection in one direction or the other, especially one that departs from the consensus of the other projection systems, I can’t help but look over my shoulder. Yesterday, I looked at pitchers for whom ZiPS missed the mark. Today, I consider the other side.
Among hitters, no projection has haunted my dreams as much as Juan Soto’s. Yes, Juan Soto was a superstar in 2018. Yes, he was just 19 when he destroyed the National League. Yes, everybody loves him as a player, not just the projection systems. However, in this case, ZiPS went out on a bit of a limb with Soto. Rather than the typical curmudgeonly regressing-toward-the-mean, ZiPS saw Soto playing even better, projecting a ninth-place finish in WAR among position players. Soto hasn’t been a disappointment, and ZiPS hasn’t been totally wrong, but the modest 23-point differential between ZiPS and reality grows larger once you consider that ZiPS missed low on the level of offense around the league.
| Name | Consensus OPS | ZiPS OPS | Diff |
|---|---|---|---|
| Juan Soto | .906 | .959 | .053 |
| Cody Bellinger | .837 | .889 | .052 |
| Joey Gallo | .843 | .889 | .046 |
| Christian Walker | .721 | .764 | .043 |
| Eloy Jimenez | .820 | .863 | .043 |
| Adalberto Mondesi | .717 | .758 | .041 |
| Eduardo Escobar | .760 | .798 | .038 |
| J.T. Realmuto | .802 | .838 | .036 |
| David Dahl | .807 | .840 | .033 |
| Ben Gamel | .712 | .744 | .032 |
| Grayson Greiner | .648 | .602 | -.046 |
| Mitch Garver | .723 | .677 | -.046 |
| Tyler Flowers | .740 | .694 | -.046 |
| Elias Diaz | .727 | .682 | -.045 |
| Jorge Alfaro | .658 | .614 | -.044 |
| Lourdes Gurriel Jr. | .722 | .678 | -.044 |
| Albert Pujols | .704 | .660 | -.044 |
| Jose Abreu | .837 | .795 | -.042 |
| Bryan Reynolds | .686 | .645 | -.041 |
| Robinson Cano | .802 | .763 | -.039 |
It’s interesting to see where ZiPS differed the most from the other three projection systems used here. Do note that the “Consensus OPS” will vary slightly from what you see in the following tables, as ZiPS is not included in these consensus stats. ZiPS in 2019 tended to like a lot of the mid-20s “interesting” power prospects while simultaneously liking middling young catchers less than the other systems. That’s something that hadn’t come up in previous seasons, so I’m curious to see whether it continues and what it means. The data used by ZiPS versus that used by the other systems means it isn’t always going to be an apples-to-grenades comparison.
As with the pitchers, ZiPS is very close in accuracy to the consensus projections, but slightly behind (again, as I expect it to be). For the bias-adjusted projections, the consensus has an RMSE (root-mean-square error) of 0.1072 in OPS compared to ZiPS’ .1076. If these were the end-of-year results, we’d all be very depressed, but half-year stats are quite volatile!
| Name | Consensus OPS | Actual OPS | Diff |
|---|---|---|---|
| Fernando Tatis Jr. | .703 | 1.026 | .323 |
| Lourdes Gurriel Jr. | .711 | 1.009 | .298 |
| Scott Kingery | .661 | .959 | .298 |
| Cody Bellinger | .850 | 1.137 | .287 |
| Bryan Reynolds | .676 | .956 | .280 |
| Hunter Dozier | .676 | .952 | .276 |
| Hunter Pence | .701 | .962 | .262 |
| Mitch Garver | .712 | .972 | .261 |
| Joey Gallo | .855 | 1.109 | .254 |
| Eric Sogard | .635 | .884 | .249 |
| James McCann | .646 | .890 | .245 |
| Josh Bell | .791 | 1.035 | .244 |
| Christian Yelich | .897 | 1.139 | .243 |
| Peter Alonso | .759 | .999 | .240 |
| Kevin Newman | .652 | .855 | .204 |
| Oscar Mercado | .636 | .837 | .201 |
| Pedro Severino | .629 | .829 | .201 |
| Howie Kendrick | .749 | .947 | .198 |
| Pablo Sandoval | .679 | .877 | .198 |
| Carson Kelly | .685 | .881 | .197 |
Everyone liked Fernando Tatis Jr. over the long haul prior to his debut, but it was an open question whether or not everything would click in 2019. Everything has clicked in 2019. It’s easy to forget that Tatis only played a little more than half of a season in Double-A in 2018, and missed significant time due to a broken thumb. That he has succeeded does not mean it was a certainty coming into the season, so I’ll live with being wrong here. In a way, Tatis’ explosion reminds me of Hanley Ramirez’s back in the day. Not that Tatis and Hanley are or were comparable players, but the magnitude of their respective rookie explosions is similar.
What will haunt me is the Gurriel projection. The consensus was wrong on Gurriel, but if you scroll up to the first chart, ZiPS was really, really wrong on Gurriel. What makes it even more maddening is that I’m still not sure why. Gurriel’s launch angle is up and he’s hitting more barrels, but he’s also exhibiting this weird combination of swinging at fewer pitches and making even less contact than in 2018. ZiPS is coming around on Gurriel, and his rest-of-season projection now stands a stunning 73 points of OPS above his preseason projection. If we used the full-on ZiPS rather than the simpler in-season model that increase would be 94 points! The computer understands the improvement better than I do apparently.
ZiPS liked Joey Gallo more than the consensus, but still undershot Gallo’s OPS (so far) by more than 100 points. I can at least get my head around Gallo’s improvement. While a .391 BABIP is unlikely to be sustainable, there’s been a real change in his approach at the plate. In 2018, Gallo swung at 32.2% of pitches outside the strike zone; that ranked him 152nd in baseball if we use 300 plate appearances as our cutoff. In a single year, he’s cut off nearly a third of that, with his 22.5% ranking 21st-best among players with 150 plate appearances. While he’s also swinging at fewer pitches in the strike zone, the dropoff isn’t to the same degree. Even if his BABIP drops precipitously from .391, it may not drop down to previous levels. Gallo had a .250 BABIP in 2017 and a .249 BABIP in 2018, but the ZiPS model for BABIP that uses hit ball data thinks he “ought to” have put up a .301 BABIP over that period. That’s the largest deviation among hitters, suggesting that there was some hidden upside in there. ZiPS only projected a .273 BABIP — the longer a player underperforms, the more likely ZiPS is to believe reality rather than the estimate — but now thinks he’s somewhere around .300 again.
Baseball’s having a low-ball moment. Using Statcast’s strike zone, the rate at which home runs are being hit on low pitches is up 62% from 2018. 409 balls below the strike zone were hit for homers last year; this year we’re already at 347! Does this have an effect on the projections? Looking at the projections as a whole, there’s a real relationship between a hitter’s low-ball hitting ability and him beating the 2019 projections. This is something to come back to in the season’s post-mortem. The number of golf ball homers being hit would make a 1970s hitting coach cringe!

| Name | Consensus OPS | Actual OPS | Diff |
|---|---|---|---|
| Jose Ramirez | .902 | .634 | -.268 |
| Travis Shaw | .813 | .568 | -.245 |
| Kendrys Morales | .760 | .566 | -.194 |
| Danny Jansen | .741 | .548 | -.193 |
| Carlos Gonzalez | .756 | .572 | -.184 |
| Jesus Aguilar | .810 | .631 | -.179 |
| Yonder Alonso | .752 | .576 | -.176 |
| Daniel Descalso | .726 | .554 | -.172 |
| Eduardo Nunez | .725 | .572 | -.153 |
| Chris Davis | .685 | .533 | -.152 |
| John Hicks | .685 | .535 | -.150 |
| Juan Lagares | .654 | .504 | -.150 |
| Starlin Castro | .717 | .571 | -.146 |
| Matt Carpenter | .851 | .706 | -.145 |
| Austin Hedges | .701 | .558 | -.143 |
| Mike Zunino | .699 | .557 | -.142 |
| Paul Goldschmidt | .881 | .741 | -.140 |
| Robinson Cano | .792 | .653 | -.139 |
| Jeimer Candelario | .731 | .595 | -.136 |
| Rougned Odor | .763 | .629 | -.134 |
Oh, J-Ram, did you anger a sorcerer? Unless I missed something, if Ramirez’s season ends up with this OPS, it will be the least accurate projection for a batter coming off a five-WAR season in ZiPS history. Now, ZiPS only goes back to the early years of the millennium, but still, that’s not a feather in ZiPS’ cap.
Naturally, coming off a drug suspension, there are eyebrows being raised at Robinson Canó’s disappointing season in New York. It’s tempting to take the bait and worm out of a bad projection, but with nearly 15 years of drug testing, ZiPS still can’t find a pattern of group over-performance or underperformance based on the timing of a drug suspension. I think the more boring story — that a 36-year-old middle infielder is declining rapidly — is the more accurate one.
Danny Jansen fits in the category of “wrong, but in a very weird way.” ZiPS was relatively negative on Jansen coming into the season, projecting a .243/.332/.385 line, a full 61 points of OPS below what the fans estimated. Coming off a .247/.342/.432 debut and a strong performance in Triple-A, people expected more. Readers north of the border let me have it (though politely, because Canada). ZiPS turned out to be wrong, but in the opposite direction: Jansen now at .196/.278/.314 for the Jays.
Dan Szymborski is a senior writer for FanGraphs and the developer of the ZiPS projection system. He was a writer for ESPN.com from 2010-2018, a regular guest on a number of radio shows and podcasts, and a voting BBWAA member. He also maintains a terrible Twitter account at @DSzymborski.
Ah, but Juan Soto is up to .960 now after going {2-for-3, HR, 3B, BB} vs the Marlins last night. +1 for ZiPS.
I think that kid’s gonna be a player
Soto, actual: .301/.406/.554
ZiPS preseason: .296/.400/.559
I’d call that a win.
He also posted a .923 OPS last year. Simply projecting anything using that data would be a win.
Robinson Cano’s home ballpark also suppresses exit velocity more than any other.
Cano’s struggles this year have largely been on the road . . .
Ramirez, Goldschimdt, Carpenter and Shaw on that final table are the most interesting to me. Big time players to fall apart, with age not likely TOO big a factor overall (possibly one with Carpenter). Also, Pablo Sandoval on the 2nd table is fun lol
Hmm, what was the split on Moncada?
.727 OPS-ZIPS v .885 actual OPS. A bit below the bottom of the over-performers list .
Dan, how many players do you expect the ZIPS model to miss at the tails in a given season? For example, missing OPS by +/- .150 (300 PA)?
Sooo.. what exactly is the point here on Soto? Guy has a .960 OPS?
The article was written before last night’s games.
Also, I expected the league to have an OPS around 25 points lower than it has.
Given Soto’s last month vs his first couple, it’s not out of the question that his OPS could continue to rise to meet an adjusted OPS matching the ZIPS projection ie, if he hits .985 by the end of the season (which would be nuts), would that make you feel better about ZIPS? Or just bad in a different way?
I would definitely feel better with a .985!
I love the idea of Dan purposefully creating a system that over or underrates certain players or teams. I know it sounds stupid, but that doesn’t mean I shouldn’t mindlessly believe it.
There is literally nothing in the World that you should mindlessly believe in.
Even better – put into ZiPS a built-in penalty for exactly *one* team and *one* player. And never tell anybody which team/player it is. Create an air of paranoia around every projection!
This would be the best thing ever. PLEASE at least start dropping hints that it might happen — the whiff of a conspiracy starts more fires than evidence.
I heard JFK JR came back to tell him which player to penalize.
Nothing horribly wrong with Jansen that a better babip wouldn’t fix – bump his average to .230-.240 by upping his babip to .285, and then his seasonal line, while still not great, isn’t standout awful. The K rate has been dropping all year, which was a huge red flag to start the year, since he had kept it low for 2017 and 2018 across various levels and was a main selling point for his hitting. June looked more in line with projections, even with a still low .261 babip.
The report on him coming up was that his defense might not be good enough, so I’m choosing the optimistic viewpoint that he’s been working hard on his defense (which the stats all like, and appears fine to watch) and let the hitting slide for a while. Also optimistically, I’d keep a fairly high projection for him, maybe a .260/.340/.420, for the rest of the year. Not much to do in Toronto this year but hope for the best in the future…
Hot as can be now
Turns out he got even hotter tonight…
One last Jansen note…he is nowhere near this list now, and in just 3 games has upped his ops almost 100 points. Still a bad line, but just a regular bad line instead of his earlier “who is letting the pitcher hit?” line.
Obviously Tatis is a stud with power and stolen bases. However, I’d pump the breaks on this whole Hanley comparision. While he will continue to outperform his expected stats likely due to his game changing speed, he has the biggest difference between expected batting line and actual batting line in the MLB. His expected batting average is .236 vs his actual .330. His expected slugging .445 vs his actual .606, in a redraft he is my #1 sell high.
I just commented the same in another article. His numbers look primed to absolutely crater in the second half. Doesn’t hit the ball hard, too many grounders, strikes out a ton. Not a great combo.
Thank god someone finally said it. He’s obviously a talented young player, but the amount of people that will happily glance over his advanced stats while praising him is alarming – especially when it’s the same people that’ll quickly point out other player’s problems/expected declines. Even in this article, Gallo’s BABIP gets called out 2 paragraphs later, and it’s ~40 points lower than Fernando’s.
Eric Sogard can hit now apparently. Huh.
I don’t think there are answers in the data to why these are accurate or not. You really don’t need to lose any sleep over the inaccuracies. You can take pride in authoring a respectable projection model, but you would be best off accepting that it is what it is. The rationalization isn’t worth anything.
I don’t think that answer will set well with anyone who has the personality type to uh….create their own projection system. Lol it’s in his nature (and literally his job) to find answers and rationalize data
Just FYI FG braintrust, you guys are getting served an ad that renders this article page nonfunctional on mobile (iPhone, Chrome browser) with the following url: http://happy.goodluckspace.com/bonus/us-wvi-p-cdn/lp1-8.php?c=2yz14dhxz3bz2&k=f6258ae7e1cb2eff1c800bd0ea6b09c0&country_code=US&country_name=United%20States®ion=Louisiana&city=New%20Orleans&isp=Cox%20Communications%20Inc.&lang=en&ref_domain=&os=iOS&osv=12&browser=Chrome&browserv=75&brand=Apple&model=iPhone&marketing_name=iPhone&tablet=2&rheight=0&rwidth=0&e=5
Thanks for the heads up – I’ll let Dave know!
On my apple I hit the X next to the url halfway through and can stop the happyfunluck page appearing. Got to be fast though
This is still a problem. FG has been nigh unreadable some days with the redirects. Been like this for months.
Every few weeks I forget why I never read FG articles anymore, then I click on one on my phone and I’m redirected to some site and I remember.
Thanks for sharing the informative article.
Looks like Jansen might still have a chance to at least get back to his projections.