By Owen Crandall

What is wOBA?

Weighted On-Base Average was created by statistician and baseball researcher Tom Tango, and is described in his work, The Book: Playing The Percentages In Baseball. wOBA was designed to measure offensive performance by combining the ideas behind on-base (OBP) and slugging percentage (SLG) without their limitations. OBP tells you how often a player reaches base, but not how far they reached. SLG does tell you how far they reached, but only considers hits and not other methods of reaching base. OPS (on-base plus slugging) was created to account for these issues by combining the two stats. It is very helpful for player evaluation, but, according to Tango, it is more effective to build a statistic from scratch than use one built from flawed metrics.

The basis of wOBA comes from the run values of offensive events. This is the idea that each offensive event (whether it be a single, home run, hit by pitch etc.) has an expected amount of runs that it produces. Some events are more valuable than others, i.e. a home run usually produces more runs than a walk. These values are taken from run expectancy matrices, which compute the probability of scoring a run given different inning states (i.e. how many runners are on base and how many outs there are). The process of deriving the weights will be discussed in detail in the next section. In a typical Major League run environment, league average wOBA tends to be roughly .320, with the best hitters at .370 and above and the worst at .300 and below, according to Fangraphs.

Given the high-scoring nature of the KCL, I thought it would be interesting to develop wOBA for it, as it will hopefully provide a more insightful look into the run producing value of each player.

The Process

In addition to the original formula for wOBA published in his book, Tom Tango published a SQL script that allows you to adjust the weights in the formula based on the run environment of the league you are examining. As there are only 4 teams in the KCL compared to 30 Major League teams, it made more sense to download the files containing player statistics and access them using R, rather than setting up a database and accessing it using SQL. Therefore, the SQL script published by Tango had to be adapted for R. The R script containing the processes described in the rest of this article is attached below.

After loading in and formatting the data, the first step was creating the run values of each event. The base number used in creating run values is runs per out, which determines the run environments of various leagues and seasons. For example, a league with more runs per out would have a richer run environment than a league with less. This was calculated by adapting innings pitched to outs and using that to divide the total runs scored. At the time of this writing, the R/Outs in the KCL is 0.286, telling us that an average of 0.286 runs is scored for every out made.

Now using the R/Outs, we can build the run values. Using the formula provided by Tango, the values build on each other, starting with walks being worth 0.14 runs greater than R/Outs. The formulation for the rest of this step can be seen in the table below.

Offensive EventFormula
WalksR/Outs + 0.14
Hit by PitchesBB RV* + 0.025
SinglesBB RV + 0.155
Doubles1B RV + 0.3
Triples2B RV + 0.27
Home Runs1.4
Stolen Bases0.2
Caught StealingR/Outs * 2 + 0.075

*BB RV = Run Value for Walks

Now that we have our run values, we can scale them to create our wOBA formulation. It would be possible to create a version of wOBA with the unmodified run values, but by scaling them we put wOBA on a similar scale as OBP, aiding in our understanding of it. To scale the run values, we need to create two more building blocks, Run Plus and Run Minus. According to Tango, Run Plus gives us the “average run value of safe batting events” (meaning walks, hit by pitches, and hits). Run Minus gives us the value of events not included in the weights, such as sacrifice flies and errors. Both metrics are ratios with the same numerator, denoted as pRunMult (Player Run Multiple) in the accompanying R script. This number was calculated for each player by multiplying their stats by the league run values and summing them. After calculating the Run Plus and Minus denominators for each player, the league Run Plus and Minus was calculated by summing the league pRunMult and dividing it by the sums of the accompanying denominators.

We now need one final piece to create the wOBA weights, the wOBA scale. This combines the pieces discussed above and gives us a multiplier to scale each run value by. Its formula is 1/(Run Plus + Run Minus). Now we can calculate the wOBA weights. For each event except for stolen bases and caught stealing (which are not included in the wOBA calculation but still have their weights computed), the run value is added to the Run Minus value and multiplied by the wOBA scale. We now have our final weights and can compute weighted on-base average.

The Results

The wOBA weights for the KCL can be viewed in the table below. Note that these weights are dependent on the current league numbers, so they will change as the season goes along.

BBHBP1B2B3BHRSBCS
0.890.921.071.431.752.050.240.77

Using the weights, we can finally compute wOBA for the league, multiplying each weight by each hitter’s stats, summing those values, and dividing by plate appearances. Before we can calculate the league average wOBA that will allow us to make observations about the individual players, we must establish a qualification. In general, baseball players are “qualified”, meaning they have enough plate appearances to represent a suitable sample size, if they have at least 3.1 plate appearances per team game. KCL teams only play 7-inning games, so this number is reduced to 2.4. However, given the developmentary nature of the KCL, very few players play enough to give them a qualifying number of at bats. Therefore, I believe it is fair to reduce this number by 10 plate appearances. At this current point in time, all four teams have played at least 16 games, giving us a plate appearance qualification of 28. With this number in hand, we can calculate league average wOBA and display the qualified hitters.

FirstLastTeamPAAVGOBPSLGOPSwOBAwOBAdiff
1MitchMurphyBobcats360.320.5280.521.0480.5580.139
2MateoCasillasGround Sloths520.4050.5190.5241.0430.5550.136
3SheaZbrozekGround Sloths530.4490.4910.5711.0620.5510.132
4ClayGadboisBobcats380.3550.4740.5160.990.520.101
5GageWolfeBlue Caps370.3570.4860.50.9860.5190.1
6KodyMortonMerchants600.3330.450.5781.0280.5090.09
7AlecMcGinnisBobcats390.3450.4870.3790.8660.490.071
8JimmyAndersonGround Sloths480.250.4380.50.9380.4850.066
9BennettSummersBobcats290.360.4480.440.8880.4820.063
10MasonNaumanMerchants410.30.4880.30.7880.4740.055
11JakeStewartMerchants410.3610.4390.4170.8560.4670.048
12JakeMorrillBlue Caps320.2610.4690.3040.7730.4640.045
13DanielBastidasMerchants450.2570.4220.40.8220.450.031
14TreyBlanchetteBlue Caps360.3130.3890.4690.8580.4430.024
15ClayConnMerchants660.2290.4240.3540.7780.4390.02
16ColinKarrBobcats320.250.4380.2920.7290.4360.017
17DanMoseleBobcats340.3450.4120.3790.7910.4310.012
18AJWellerBlue Caps360.3230.3890.4190.8080.4250.006
19JohnShueyBlue Caps470.3410.3830.4150.7980.417-0.002
20HaydenStorkBobcats430.270.3720.4050.7770.416-0.003
21AshtonHorchemMerchants620.2830.3870.3580.7460.411-0.008
22CarterSelkGround Sloths490.2440.3270.5370.8630.411-0.008
23LucaMorelliMerchants450.2890.3560.4210.7770.399-0.02
24JacksonSmithBobcats300.280.40.280.680.398-0.021
25NateReedMerchants330.130.3940.2170.6110.388-0.031
26DaltonHobickGround Sloths440.2430.3640.3240.6880.386-0.033
27ChaseWieseBobcats400.2190.3750.2810.6560.382-0.037
28NateCooleyGround Sloths380.2260.3680.290.6590.38-0.039
29KannonKleineBlue Caps390.2330.3590.3330.6920.379-0.04
30BlakeCrancerGround Sloths520.2050.3270.2730.60.342-0.077
31MarkWagnerBobcats310.250.3230.2860.6080.34-0.079
32NolanBowlesBlue Caps320.2670.2810.40.6810.337-0.082
33WillApplegateGround Sloths310.2760.290.2760.5660.306-0.113
34ChrisCaseyMerchants340.20.2940.2330.5270.305-0.114
35JacobCastlemenBlue Caps390.2220.2560.250.5060.274-0.145
36NickMardisBobcats300.1850.2670.1850.4520.269-0.15
37RileyHendrenBlue Caps400.1940.250.2220.4720.264-0.155

As you can see in the table, Mitch Murphy of the Bobcats and Mateo Casillas and Shea Zbrozek of the Ground Sloths lead the league with respective wOBAs of 0.558, 0.555, and 0.551. As you can also see, wOBA correlates fairly well with OPS, but it is not exact, pointing to the issues with OPS discussed earlier.

This qualified group gives us a league average wOBA of 0.419, and as you can see, most of the hitters have much higher wOBAs than what is typical of MLB hitters. This is not necessarily a positive evaluation of their performance, as the MLB is a much tougher environment to score runs in, given the stronger pitching and defense. This lack of context shows a weakness of wOBA not present in normalized statistics such as wRC+ or OPS+. In an attempt to correct this, or at least to provide another data point, the difference from the league average wOBA was calculated for each player and can be seen in the last column of the table above. This number is especially helpful for evaluating players such as AJ Weller (0.425 wOBA) and Hayden Stork (0.416 wOBA), who are both having great offensive seasons, but according to wOBA are both roughly league average.

wOBA is not perfect, but then again, no statistic really is. I believe it succeeds in its goal of providing an overall offensive statistic for run contribution without the inherent flaws of OBP, SLG, and others. I also believe it is an excellent statistic for evaluating a league such as the KCL.

Future Work

I’ll likely recompute the league wOBA later in the season and after playoffs conclude. Hopefully by the end of the season, there will be enough hitters that qualify under the regular rules for qualification that more conclusive results can be taken from the data. I also think it would be interesting to find potential differences between teams and develop a similar advanced statistic for KCL pitchers.

Thank you for reading and please reach out with any comments or questions you may have.

R Script

Leave a Comment