Some final thoughts on the Astros season

  • Losing in Game 7 of the World Series does not mean the Astros’ 2019 season was a failure.  Yes, expectations were high, especially after they won 107 games in the regular season (best in MLB), but there’s a lot of randomness in the playoffs and that’s just the way it is.  Honestly this was less painful than how the Yankees lost – in Game 6 they were down 4-2 going into the 9th inning, and DJ LeMahieu hit a 2 run home run to tie it, then Altuve hit a walkoff home run in the bottom of the 9th to send the Astros to the World Series.  It did hurt that the Astros were down to ~20% chance to win the series after going down 2-0, then up to ~80% after going up 3-2, then they lost…
  • Poor Will Harris.  He was very good in the regular season and postseason, and then he gave up a late home run in Game 6 to put things out of reach, and a late home run in Game 7 to let the Nationals go ahead.  He was also responsible for the collapse in 2015 in Game 4 against the Royals – the Astros were up 6-2 in the 8th inning and the Royals won 9-6 😦
  • I think AJ Hinch made mostly good decisions in the game.  Taking Greinke out in the 7th after giving up a home run and a walk was questionable given how well he had been pitching, but he hadn’t gone that long in a start in a while.  I can understand the thinking that “I have a good bullpen, I just need 8 more outs”. On the home run Will Harris made a good pitch and Howie Kendrick just baaaaaarely hit it off the foul pole.  And I can understand not bringing in Gerrit Cole then – yeah, he’s the Astros’ best pitcher, but he’s never pitched on short rest before, so it seems dicey to bring him in the middle of an inning on 2 days rest.
  • However, AJ Hinch said after the game that Cole would only come in if the Astros were ahead, which is just dumb.  This is the last game of the season!  If he’s our best option, use him even if we’re down a run or two!  Anyway, none of this probably mattered because our closer gave up another run that probably put it out of reach anyway at 4-2.
  • Much is being made of the fact that the road team won all 7 games.  Prior to this, no 7-game series in baseball, basketball, or hockey had ever had the road team even win the first 6 games.  But it’s not that unlikely if the teams are evenly matched (around a 1/64 chance), and the home field advantage in baseball is not that big compared with other sports.  It is weird that none of the games were particularly close – the Nats won the first game 5-4, but after that the margins of victory were 9, 3, 7, 6, 5, 4.
  • I know Gerrit Cole is a free agent now, and probably mad that AJ Hinch didn’t put him in, and mad that the Astros didn’t win, but to put on his agent Scott Boras’s cap (instead of an Astros cap) is both bizarre and disrespectful.  Just wait a day!  You know you’re going to get a huge contract!
  • I don’t have the numbers in front of me, but in their losses the Astros were dreadful with runners in scoring position.  That really just goes to randomness, though – I doubt they were trying less hard or anything!
  • This hurts, but honestly I’m happy for the Nats, and I was rooting for them until they played Houston.  They were behind in all 5 of their elimination games and came back to win them, which is really impressive.
  • Watching Astros postseason games is really stressful.  I think the optimal experience for watching postseason games is having a team to root for but ultimately not caring too much…
  • We’ll get ’em next year!

The Astros are going to the World Series! What a crazy game!

The Astros beat the Yankees last night to win the ALCS 4 games to 2 and go to the World Series. And it was a pretty crazy game!

The Astros’ strength all season long has been their hitting and their starting pitching. Their defense is pretty good, and their relief pitching has been anywhere from OK to pretty good. The Yankees have also been great at hitting, but their bullpen is also great. (their defense is also pretty good and their starting pitching has been good but not great)

Knowing this, the fact that Game 6 was a “bullpen game” for both teams meant that the Yankees had an advantage on paper. See, the Astros have 2 amazing starting pitches (Verlander and Cole) and 1 very good one (Greinke). But in the postseason you need four starting pitchers, and the late season collapse of Wade Miley (very good until September; terrible thereafter) meant that the Astros didn’t have a great option, so they decided to use a bunch of relief pitchers in the game. Usually you hope for a starting pitcher to go 6 or 7 innings; tonight the Astros’ first pitcher went 1 2/3 innings. The Yankees have similar issues, but as I mentioned their relief pitching is better.

The Astros took a 3-0 lead in the first inning off a Yuli Gurriel home run (while I was putting a kid to bed so I couldn’t watch :-/ ), then the Yankees chipped away at the lead until going into the bottom of the 8th inning the Astros were up 4-2. At this point the best two pitchers the Yankees had left were Zack Britton, who is very good, and Aroldis Champan, who is their usual closer and very very good.

To me, it seemed obvious that Chapman should be pitching the bottom of the 8th. The Yankees needed to keep the game as close as possible because they only had one more inning to get back in it, so there doesn’t seem to be any point to “saving” Chapman for if the Yankees happened to tie or take the lead in the 9th. Also Chapman hasn’t pitched a lot this postseason and can go 2 innings. But they put Britton in, and he ended up in a bases-loaded situation with two outs before getting a pinch hitter out to escape the inning.

In the top of the 9th the Astros brought in their closer Roberto Osuna, who has been very good all season long. I swear I thought to myself that it would be ironic if Osuna had a problem here after the Astros doing well with using a bunch of less-good relievers in weird situations the rest of the game. And lo and behold, after a walk and a strikeout DJ LeMahieu hit a home run to tie the game. I was watching the game on my phone in bed, and the Hulu app lagged a bit and then reconnected just in time for the ball to go over the wall, and for a minute I wondered “did that really just happen?”. George Springer was in right field and came really really close to catching the ball, but no dice. (looking at the replay I don’t think he actually could have caught it, it was just inches past where he was reaching…)

Osuna managed to not meltdown and got out of the rest of the inning, so the Astros went to the bottom of the 9th tied with their 8-9-1 hitters coming up. (so their two worst hitters were up first and second) Because of the seemingly questionable decision earlier, now Aroldis Chapman could come in for the Yankees. Also, the Astros were down to only a few relief pitchers so the prospect of going to extra innings seemed grim. After two quick outs, Springer got a walk, and Jose Altuve came to the plate. Jake Marisnick was up after him, and he was put in as a defensive replacement because he’s not a good hitter. But Altuve hit a home run to left field, Astros win 6-4!

baseball win expectancy finder now has balls and strikes!

Here it is!

This wasn’t too much work, and like I mentioned last time it was nice to work on adding a new feature to something. Although I guess I did recreate the app’s shell with create-react-app, I didn’t port it to TypeScript 🙂

One annoying part is that there’s just not that much data so you can pretty easily get into situations where the stats are probably “wrong”. For example, in the top of the 8th inning, no outs or runners, home team up by 2, and a 2-0 count the home team has an 87.08% chance to win. But if the batter gets another ball to make the count 3-0 (good for the visiting team), now the home team has an 88.11% chance to win. I guess I should add a warning when the sample size gets too small or something. (although I don’t know what “too small” is)

I was a little worried that adding balls and strikes would bloat the size of the data files, which did happen. The worst-case is that it would increase the file size by 12x (4 choices for balls * 3 for strikes), but in practice it’s more like 9x. But it turns out that computers are fast so doing the lookups is only barely slower than before.

My original plan was to add the balls and strikes data to the mobile app (and make it an in-app purchase to unlock), but the increase in data size and corresponding memory usage make me less excited about it. Maybe at some point…

How common are walk-off walks (on four pitches!) in baseball?

I’ve been following the Astros pretty closely this season (since they’re very good this year!), and so when I saw they had won a game on a walk-off walk, I was curious how common that was.

A walk-off is when the home team wins the game on that play, by scoring a run to go ahead in the ninth or later inning. So a walk-off walk is when that happens because the batter is walked. It’s kind of very dramatic and anticlimactic at the same time!

In this case, the walk was on four pitches, which seemed exceptionally rare, because you might as well throw at least one strike, right? At first I thought “maybe this has never happened before!”, but (spoiler!) it turns out there are a lot of baseball games that have been played. So I wanted to at least know how common it was.

My baseball win expectancy finder is powered by a Python script that can parse games, so I extended the parsing code to make it easier to run these sorts of reports and ran it. (source available on GitHub, see WalkOffWalkReport in

So, the numbers: in the ~128000 games I have data for, a walk-off walk has happened only 442 times. That sounds like a lot but it’s only around 7 times a season. Not all the games have pitch-by-pitch data, but ~73500 of them do, and walk-off walks on four pitches have happened only 60 times. (not including data from this year)

Since there are roughly 2100 games per season (including the playoffs), this means we’d expect this to happen around 1 time per season. Which is indeed pretty rare!

In fact, Altuve got his walk-off walk with 2 outs – walk-off walks with 2 outs have only happened 257 times (~4 times/season), and ones on four pitches have only happened 41 times, which is around 2 every 3 seasons!

When I was in the middle of this work I remembered that baseball-reference has an incredibly powerful Event Finder, and lo and behold it can do this search as well. In fact, at first our numbers were pretty far off so I found some bugs in my script 🙂 (the numbers are still off by a few because it’s counting a walk where the fourth ball was a wild pitch and a runner scored, while my script doesn’t count those)

My original thought was that I could make it easier to use my script to find stuff like this, but the baseball-reference Event Finder is so incredibly powerful and relatively easy to use I probably won’t bother. Kudos to them!

adding expected runs per inning to baseball win expectancy finder

So…yup, I did that!

I already had all the data for this, so it was more mechanical than anything else. Actually, most of the time I spent was turning it into a proper React app. Before I just had a bunch of inline React code, which was great for testing and simplicity, but meant that a bunch of compilation had to happen on every page load. So I bit the bullet and figured out how to use nwb and all the stuff that lets you compile React code that I don’t really care about. But it builds a pretty small JS file, which is nice.

Still a big fan of React, though!