Measure Batting with OPS

Use OPS as a simple measurement of a player’s offensive contributions.

The on-base percentage captures all of the times a play makes it on base, but it weighs them all the same. The slugging average weighs extra bases in rating hits, but it doesn’t capture all of the times that players make it on base. So why not try adding the two together? That gives you on base plus slugging average, or OPS:


Pete Palmer came up with OPS in the 1970s. It’s one of the best simple statistics for evaluating players. It captures the most important offensive attributes for a ballplayer: the ability to hit the ball hard, the ability to get on base, and the ability not to get out. It also correlates well with runs scored.

Running the Hack

Here’s the simple way to calculate OPS, if you have already loaded the Baseball DataBank data into R:

	batting$OBP <- (H + BB + HBP) / (AB + BB + HBP + SF)
	batting$TB <- (H + X2B + 2 * X3B + 3 * HR)
	batting$SLG <- batting$TB / AB
	batting$OPS <- batting$OBP + batting$SLG

As I explain in “Measure Batting with Batting Average” [Hack #40] , I use a slightly more complicated method of calculation. Basically, I calculate the average number of games a player’s teams played (when the player played on more than one team) and the total statistics for a player for a whole season. This lets me correctly calculate whole-season statistics for a player and determine who qualified for batting awards:

 # assumes that b_and_t dataframe ...

Get Baseball Hacks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.