SGP for 2021-22 Basketball Category Leagues

Preface

It’s been a while since I’ve done one of these deep dives in Ottoneu basketball category leagues and I needed a break from prepping for my football draft. So here’s a post that explores SGP for that format that might be useful to someone out there.

Introduction

Specifically, this might be of interest to others who calculate their own auction values for category leagues or who are otherwise curious about the under-the-hood of scoring. Basically, I was curious what Standing Gain Points (SGP) looked like for Ottoneu basketball leagues last year for purposes of assigning values to players once projections are available.

Note that the empirical strategy was designed for season-long point leagues, not H2H. However, the correlations between the dollar values derived from the SGPs in the two formats is strong enough that I’d feel comfortable basing H2H values on them (or at least that’s my experience in H2H baseball leagues). For example, if Giannis is worth $120 in a hypothetical season-long category league, then he’ll be worth about $120 in a H2H as well.

Data

Recall that there are 8 category leagues; however, I excluded one league because so many teams had low MP totals, which suggests that a majority of the league was not engaged throughout the season. This isn’t a dig at members of the league; I just want to be transparent regarding the data that was used and it didn’t make sense to comingle data from leagues where the inactivity was evidently quite high.

Counting Stats

For counting stats, I assembled season-long totals for each league and then took the simple average across the 7 leagues. If you’re familiar with SGP, then you know that the calculations are much more straightforward with counting stats than percentage stats (see a few paragraphs down).

I calculated the SGP factors for the counting stats by running a bivariate regression of the counting stat on the rank in descending order. For example, if the highest number of points was 11,500, then that data point would be (12, 11,500). The resulting slope is then the SGP factor. Here are those SGP factors:

  • PTS: 566.45
  • REB: 222.71
  • AST: 142.64
  • STL: 31.54
  • BLK: 30.56
  • FTM: 119.14
  • TOV: -66.81

The interpretation of an SGP factor is that on average it’s the number of the stat needed to advance one place in the standings. For example, on average 566.45 points would move you one point in the standings. To keep with the Giannis example, SGP_pts=2002/566.45=3.53 SGP.

Note that this has yet to be adjusted for replacement-level. Calculating replacement-level is a whole other post. For right now, I’ll stick to just presenting the SGP factors.

Percentage Stats

How would you calculate a SGP based on Giannis’ 55.3% FG%? There are two key data points from each player that are needed to calculate his SGP: his FGM and his FGA. This of course is analagous in baseball to needing to know his H and AB to figure out his marginal effect of a player on his team’s average.

You also need to know the league averages. So the first step is to figure out the FG% and FGA (less one full-time player) of the typical team in the typical league. I came up with 47.2% in 7,500 FGA (rounded to a nice even number), which implies 3,540 FGM per team across all league (less on full-time player).

The second step is to calculate the SGP factors as before: a bivariate regression to yield the slope. We need additional league data, so I’ll hold off on presenting those for the moment.

So there are four relevant data points for each percentage category: the SGP factor, league average FG%, league average team FGM, and league average team FGA.

So the following formula incorporates the two data points from each player (FGM, FGA) and three data points from the league averages. The formula for SGP_fg% is:

SGP_fg%=((Player_fgm+League_fgm)/(Player_fga+League_fga)-League_fg%)/SGP_fg%

So for Giannis (689 FGM, 1245 FGA) and the aforementioned league statistics (0.0040 SGP_fg%, 47.2% FG%, 3,540 FGM, 7,500 FGA), you get

SGP_fg%=((689+3540)/(1245+7500)-0.472)/0.0040=2.88

So this can be interpreted that Giannis’ 55.3% FG% improved his fantasy teams’ points from the FG% by 2.88 places in the standing (i.e., 2.88 SGP).

The SGP factors for the percentage statistics are:

  • FG%: 0.0040 (assuming league average of 3,540 FGM, 7,500 FGA, and 47.2% FG%)
  • 3P%: 0.0032 (assuming league average of 888 3PM, 2,500 3PA, and 35.5% 3P%)

Next Steps

Rotowire hasn’t published their 2022-23 projections, but I’m working with the 2021-22 actual game data via NatStat to try to come up with post hoc values for last season. Happy to post those if they’d be of interest to anyone. I won’t be able to share the values based on Rotowire projections since they’re paywalled, but I can share the post hoc 2021-22 values if those would be of interest.

7 Likes

A post was split to a new topic: See previous draft results

I’d definitely love to see the post hoc numbers from last year. Thanks.

Here you go. Some of them look a little off, so I’ll revisit when I get a chance. Remember that it’s based on season totals, not per game. So guys who missed time are at a significant disadvantage given the methodological approach. It’s not the only way to assign values.

You’ll notice that I only assigned a value of $1 or more to 252 players (i.e, 21 per team). However, these 252 players only total $4,449 in value (12x$400=$4,800). That leaves ~$30 per team in open cap space to either spend on the 4 remaining roster slots or to keep available for in-season acquisitions. These could also include NCAA prospects, which aren’t easily valued.

curious if you think the addition of the second UTIL spot will change these numbers at all? or does not it change since the numbers are based on 21 roster spots and not X amount of starters?

It’s an interesting point.

In theory, the addition of the second UTIL spot will lower replacement level, which will contract the difference between the elite and replacement-level.

However, in practice there’s not much difference in SGP between the 120th ranked player and the 150th ranked player. I’m comparing #120 to #150 because that’s approximately where the worst regular starter in a 12 team, 9 starter league compared to a 10 starter league will typically be (I’m looking a little higher than 12*9=108 because good teams will have a disproportionate share of top players).

For example, in the 2021-22 values that I calculated, #120 (Marcus Smart) checks in with 6.86 SGP compared to 6.26 from #150 (Alperen Sengun). So a difference in SGP of about 0.60, which isn’t very much once you convert SGP_adjusted to a dollar value. By SGP_adjusted I mean total SGP less replacement-level (to set the SGP of the #300 player at about 0).

To illustrate the point graphically, here’s what the scatterplot of the value curve (SGP_adjusted on y-axis, SGP_rank on the x-axis):

Graph

As you can see, as SGP rank increases, the value curve gradually flattens out, particularly around where the replacement-level for starters are (i.e., somewhere around #120 and #150 top players). It gets a little steeper the closer you get to #200 and then is basically a straight-line from #200 to #300.

1 Like

@walt526 I’m trying to switch over to SGP for my app and so working on writing up the code for it, but stuck on defining the “player” you take out of the calculations for ratio stats. Did you take the 252 players you rated as above replacement and find their average FGA? Or just take the average FGA per team and define a full time player as 1 / 21 of that?

It’s been a couple of years since I did this and the details are a little fuzzy. I’m also having trouble finding the code that I wrote to do this analysis.

Basketball is a little different than baseball in that with baseball, starters generally have the same AB or thereabouts, whereas basketball players can have widely different FGA and 3PA even if he’s playing 30+ MPG.

I actually don’t remember how I arrived at 7500 FGA and 2500 3PA. The fact that they’re 7500 and 2500 makes me think that they were toy values. I may have run some analysis or I may have just grabbed them because that’s what seemed to work as denominators. If they were toy values, it’s probably because 3540/7500=47.2% was the league average and 7500 was close enough to what a team would have less one lineup spot. But I don’t have a clear recollection to how I came up with them either way.

Sorry I couldn’t be more helpful.

1 Like