So it took me about 5 posts to realize I was looking at basketball the wrong way, then I finally found some at least interesting observations last post when I looked at the top and bottom 10 offensive teams in history.
I’m going to do the same for defense.
Let’s John Nash this shit. You already know.
%load_ext rpy2.ipython
%%R
# Load libraries & initial config
library(ggplot2)
library(gridExtra)
library(scales)
# Load libraries & initial config
%matplotlib nbagg
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import boto3
from StringIO import StringIO
# Retrieve team stats from S3
teamAggDfToAnalyze = pd.read_csv('https://s3.ca-central-1.amazonaws.com/2017edmfasatb/fas_boto/data/teamAggDfToAnalyze.csv', index_col = 0)
pd.set_option('display.max_rows', len(teamAggDfToAnalyze.dtypes))
print teamAggDfToAnalyze.dtypes
pd.reset_option('display.max_rows')
# This function adjusts the input stats for pace and outputs per 100 possession metrics
def paceConversion(df, listOfFields):
for field in listOfFields:
df['{}_per_100_poss'.format(field)] = (100/df['baseStats_Pace'])*(48/(df['perGameStats_MP']/5))*df[field]
return df
# Select a subset of columns to manage size of dataframe
teamAggDfToAnalyzeSelectedColumns = teamAggDfToAnalyze[[
'season_start_year',
'perGameStats_Tm',
'baseStats_W',
'baseStats_WLPerc',
'perGameStats_MP',
'baseStats_Pace',
'baseStats_Rel_Pace',
'baseStats_ORtg',
'baseStats_Rel_ORtg',
'baseStats_DRtg',
'baseStats_Rel_DRtg',
'perGameStats_PTS',
'perGameStats_2PA',
'perGameStats_2PPerc',
'perGameStats_3PA',
'perGameStats_3PPerc',
'perGameStats_FGA',
'perGameStats_FGPerc',
'perGameStats_FTA',
'perGameStats_FTPerc',
'perGameStats_ORB',
'perGameStats_DRB',
'perGameStats_AST',
'perGameStats_STL',
'perGameStats_BLK',
'perGameStats_TOV',
'opponentPerGameStats_PTS',
'opponentPerGameStats_2PA',
'opponentPerGameStats_2PPerc',
'opponentPerGameStats_3PA',
'opponentPerGameStats_3PPerc',
'opponentPerGameStats_FGA',
'opponentPerGameStats_FGPerc',
'opponentPerGameStats_FTA',
'opponentPerGameStats_FTPerc',
'opponentPerGameStats_ORB',
'opponentPerGameStats_DRB',
'opponentPerGameStats_AST',
'opponentPerGameStats_STL',
'opponentPerGameStats_BLK',
'opponentPerGameStats_TOV'
]]
# Pace adjust the following metrics
teamAggDfToAnalyzePaceAdjusted = paceConversion(
teamAggDfToAnalyzeSelectedColumns,
[
'opponentPerGameStats_PTS',
'opponentPerGameStats_2PA',
'opponentPerGameStats_3PA',
'opponentPerGameStats_FGA',
'opponentPerGameStats_FTA',
'opponentPerGameStats_ORB',
'perGameStats_DRB',
'perGameStats_STL',
'perGameStats_BLK',
'opponentPerGameStats_TOV',
'opponentPerGameStats_STL',
'opponentPerGameStats_BLK'
]
)
Let’s refresh our memory again to see what DRtg vs W/L% look like
# Scatter of DRtg vs W/L%
teamAggDfToAnalyzePaceAdjusted.plot(kind = 'scatter', x = 'baseStats_DRtg', y = 'baseStats_WLPerc', title = 'League Historical DRtg vs W/L%')

Although the inverse relationship can definitely be seen, we don’t see quite the same strength of correlation between DRtg and W/L%. The the teams with the best DRtg are not the best teams of all time, but range anywhere from 35% to 80% W/L%. The worst DRtg teams are a bit more concentrated in the lower W/L% ranges, but still we see some variation here. Regardless, let’s look into the numbers to get a better sense of what’s going on.
Let’s exclude anything before the 80’s again to ensure we can pace adjust properly (recall that certain key stats weren’t recorded before the 80’s in the NBA).
# Drop all seasons before the 80's
teamAggDfToAnalyzePaceAdjusted1979 = teamAggDfToAnalyzePaceAdjusted[teamAggDfToAnalyzePaceAdjusted['season_start_year'] >= 1979]
print 'There have been {} teams in NBA history starting from the 79-80 season'.format(teamAggDfToAnalyzePaceAdjusted1979.shape[0])
# Set variable top N teams to take
topN = 10
# Order by DRtg ascending (lower DRtg is better)
teamAggDfToAnalyzePaceAdjusted1979.sort_values('baseStats_DRtg', ascending = True, inplace = True)
teamAggDfToAnalyzePaceAdjusted1979.reset_index(inplace = True)
teamAggDfToAnalyzePaceAdjusted1979.drop('index', 1, inplace = True)
# We'll give each team a unique identifier based on the year and team because some teams repeat (CHI)
teamAggDfToAnalyzePaceAdjusted1979['unique_team_id'] = teamAggDfToAnalyzePaceAdjusted1979['season_start_year'].astype(str) + '-' + teamAggDfToAnalyzePaceAdjusted1979['perGameStats_Tm'].astype(str)
# Extract top 10 teams
teamAggDfToAnalyzeTiersTop = teamAggDfToAnalyzePaceAdjusted1979.head(topN)
# Extract bottom 10 teams
teamAggDfToAnalyzeTiersBottom = teamAggDfToAnalyzePaceAdjusted1979.tail(topN)
print teamAggDfToAnalyzeTiersBottom
Quick sanity check on the data looks good for now. No missing values.
The Good
Let’s take a look at the best defensive teams in history.
pd.set_option('display.max_columns', len(teamAggDfToAnalyzeTiersTop.columns))
print(teamAggDfToAnalyzeTiersTop)
pd.reset_option('display.max_columns')
Hmm, 6 of the 10 teams are from from the 1998 season. Upon googling, this was one of the lockout seasons with only 50 games played. Perhaps the shortened schedule. The wiki article on the 98-99 season also indicated that certain teams didn’t meet each other, and inter-conference games were slashed to preserve intra-conference games. I’m going to exclude the 1998 data, which is a bit shady because theoretically I should have removed it from my offensive analysis as well. Looking back, there was only 1 team from 98 (bulls) that showed up in either the top 10 / bottom 10 offensive teams, so maybe not that big of a deal. But for integrity in later analysis, I’ll have to keep this in mind.
# Drop all seasons before the 80's
teamAggDfToAnalyzePaceAdjusted19791998Excl = teamAggDfToAnalyzePaceAdjusted[(teamAggDfToAnalyzePaceAdjusted['season_start_year'] >= 1979) & (teamAggDfToAnalyzePaceAdjusted['season_start_year'] != 1998)]
print 'There have been {} teams in NBA history starting from the 79-80 season, excluding the 98-99 season'.format(teamAggDfToAnalyzePaceAdjusted19791998Excl.shape[0])
# Set variable top N teams to take
topN = 10
# Order by DRtg ascending (lower DRtg is better)
teamAggDfToAnalyzePaceAdjusted19791998Excl.sort_values('baseStats_DRtg', ascending = True, inplace = True)
teamAggDfToAnalyzePaceAdjusted19791998Excl.reset_index(inplace = True)
teamAggDfToAnalyzePaceAdjusted19791998Excl.drop('index', 1, inplace = True)
# We'll give each team a unique identifier based on the year and team because some teams repeat (CHI)
teamAggDfToAnalyzePaceAdjusted19791998Excl['unique_team_id'] = teamAggDfToAnalyzePaceAdjusted19791998Excl['season_start_year'].astype(str) + '-' + teamAggDfToAnalyzePaceAdjusted19791998Excl['perGameStats_Tm'].astype(str)
# Extract top 10 teams
teamAggDfToAnalyzeTiersTop = teamAggDfToAnalyzePaceAdjusted19791998Excl.head(topN)
# Extract bottom 10 teams
teamAggDfToAnalyzeTiersBottom = teamAggDfToAnalyzePaceAdjusted19791998Excl.tail(topN)
pd.set_option('display.max_columns', len(teamAggDfToAnalyzeTiersTop.columns))
print(teamAggDfToAnalyzeTiersTop)
pd.reset_option('display.max_columns')
Hmm, the top 4 teams are all from 2003. Am I missing something else here? Looking at the wiki page for the 03-04 season, nothing seems too out of the ordinary. Detroit won the championship, but they were one of the best defensive teams ever. SAS and IND also had good defensive teams then. I’ll just take this for what it is and go ahead with the data. Let’s take a look at some basic metrics
%%R -i teamAggDfToAnalyzeTiersTop -w 1000 -h 800 -u px
leagueNTeamsPlot <- function(tiersDf, tier){
# Opponent 2PA Scatter
leagueNTeams2PShooting = ggplot(
tiersDf,
aes(
x = opponentPerGameStats_2PA_per_100_poss,
y = opponentPerGameStats_2PPerc,
color = unique_team_id,
label = unique_team_id
)
) +
geom_point(size = 7) +
geom_text(hjust = -0.3) +
ggtitle(sprintf("%s Opponent Historical 2P Shooting", tier)) +
scale_x_continuous(expand = c(0, 2)) +
theme(legend.position="none")
# Opponent 3PA Scatter
leagueNTeams3PShooting = ggplot(
tiersDf,
aes(
x = opponentPerGameStats_3PA_per_100_poss,
y = opponentPerGameStats_3PPerc,
color = unique_team_id,
label = unique_team_id
)
) +
geom_point(size = 7) +
geom_text(hjust = -0.3) +
ggtitle(sprintf("%s Opponent Historical 3P Shooting", tier)) +
scale_x_continuous(expand = c(0, 2)) +
theme(legend.position="none")
# BLK / Opponent FG%
leagueNTeamsFTShooting = ggplot(
tiersDf,
aes(
x = perGameStats_BLK_per_100_poss,
y = opponentPerGameStats_FGPerc,
color = unique_team_id,
label = unique_team_id
)
) +
geom_point(size = 7) +
geom_text(hjust = -0.3) +
ggtitle(sprintf("%s Team Historical BLK / Opponent FG Shooting", tier)) +
scale_x_continuous(expand = c(0, 1)) +
theme(legend.position="none")
# ORB / TOV Scatter
leagueNTeamsORBTOVShooting = ggplot(
tiersDf,
aes(
x = perGameStats_STL_per_100_poss,
y = opponentPerGameStats_TOV_per_100_poss,
color = unique_team_id,
label = unique_team_id
)
) +
geom_point(size = 7) +
geom_text(hjust = -0.3) +
ggtitle(sprintf("%s Team Historical STL / Opponent TOV Stats", tier)) +
scale_x_continuous(expand = c(0, 1)) +
theme(legend.position="none")
grid.arrange(leagueNTeams2PShooting, leagueNTeams3PShooting, leagueNTeamsFTShooting, leagueNTeamsORBTOVShooting, ncol = 2)
}
leagueNTeamsPlot(teamAggDfToAnalyzeTiersTop, 'Top')
Okay, initial thoughts in no particular order:
- The rise of the 3-point shot is kind of apparent again! With the average percentages that teams have shot in league history, 47% 2P and 33% 3P, the 3P shot is actually more efficient, getting you more points per attempt (not by much, but over time would add up). Other than the 2011 celtics, all teams didn’t face too many 3 point shooting teams. Back in those days, you’d want your opponents to shoot 3’s because they may have been less favourable looks than 2’s if you had a good center. The percentages on 3’s are about average probably because teams weren’t shooting that many of them, guarding the 3 didn’t make too much of a different on your DRtg. For the 2011 celtics, teams were shooting more 3’s (nearly 20 attempts per game, more on par with the number of 3PA we see in the league today), but the celtics guarded that very very well, holding opponents to nearly 30%.
- The best defensive teams guarded their 2PA quite well, most holding their opponents to that 44-45% range, which is close to what we saw for very poor offensive teams. These guys essentially turned their opponents into horrible offensive teams. Attempts remained pretty consistent with what we’ve seen though per 100 possessions.
- Blocks share an inverse relationship with FG%
- Each block causes a missed FGA
- If your team gets the ball after your block, it’s counted as a missed FGA and a rebound
- If their team gets the ball after your block, it’s counted as a missed FGA and a rebound, and they an extended possession
- In both cases, a missed FGA is recorded and their FG% would go down. We see that trend here (albeit small sample size), and I have some questions but I’ll dive into it a bit later.
- Each block causes a missed FGA
- Steals share a proportional relationship with turnovers, almost at a 1 to 1 ratio, and this was what I was hoping for because steals directly translate to turnovers at the end of the day
We’ve already discussed FGs in detail in our last post, so I will skip over this for now and focus on blocks and steals. FG will likely come back into the overall discussion of team defence, and to an extent I don’t even think you can talk about blocks and steals without talking about team defence or FG, but baby steps…
Blocks
Let’s just start with baselining how many blocks an average team usually gets
# Blocks histogram
teamAggDfToAnalyzePaceAdjusted19791998Excl[['perGameStats_BLK_per_100_poss']].plot(kind = 'hist', title = 'League Historical Average Blocks / 100 Possessions')
print teamAggDfToAnalyzePaceAdjusted19791998Excl[['perGameStats_BLK_per_100_poss']].mean()
Ok so your average team blocks about 5.3 per game. On average, we saw that the better defensive teams (in terms of blocking) were getting 7-8. The difference in opponent FT% was only 1-2% less. If we go with our initial assumption that a team take about 85 shots, 2 blocks would cause the opponent field goals to go down about 2.3%. Does this matter? I’m honestly not sure. Would they have even made those 2 FGA anyways? Did the 2 blocks come consecutively and ended up in a score on the opponent’s third try anyways? There’s so many things that could happened after the block, it’s difficult to generalize it to a specific scenario. Even then, does 2.3% decrease in FGA even matter? We saw that good teams could shoot the 2 ball at like 50%, if they had shot at 47.7%, is that a big deal? Again, I’m not quite sure. we saw a difference from 50% to 45% matter in terms of being elite, so would 2.3% demote you down to a mid-tier team rather than an elite team? Again, very very difficult to say and depends on so many other factors.
At this point, I want to say that blocks don’t matter as much as steals.
Steals
Steals to me in some ways define defense. Steals and forcing the other team to put up a tough shot, which in some cases may even be more analogous to a steal than a missed FGA, are exactly what you aim to do. When you steal the ball, their possession is done, period. You could block a shot 8 times in a row and still give up a score on the possession but you can’t steal a ball and give up a score. They’re done. DONE. Count that as a TOV, add one to the number of possessions without a score and continue with the game.
In our last post, we looked at the number of turnovers poor offensive teams had. They averaged around 18-19 TOV. To no surprise, we see that good defensive teams held their opponents to around that mark!
Team Defense
Let’s pull this back up and look at defence as a whole, perhaps by style of defence or play. Again, honestly I don’t know too much about defence. My knowledge comes from pickup (i.e. no knowledge) or recreational league play (i.e. very very very limited knowledge). I don’t know that much, so the best thing for me to do is probably just dive into a few teams and do a small case study on ones that look interesting from the data and try to explain why things are the way they are. When I talk about team defense here, I’m not trying to be armchair Popovich (even from the armchair, pop can’t be replicated…) but I’m simply talking about styles of defense from an armchair perspective. Do their bigs have great blocking ability? Do their guards have quick hands? Do they seem to switch well on screens? Do they play big? Small? Etc. Leggo.
2003 Spurs
There are only 3 teams that break the 98 DRtg barrier, and the spurs sit at 94… alright then! Definitely keep in mind that this doesn’t mean the spurs were runaway the best team in the league. This year, they weren’t even first in their division and they were 3rd in their conference. This team had Timmy, TP, Manu, with Bowen, Horry, Rose, and Nesterovic as well. While the team did have two NBA all-defense calibre players in Bowen and Timmy, the team doesn’t strike me as being stifled with elite defenders. I could be showing my naivety here, but I’m looking to be proven wrong because obviously this team was great at defense.
What made me even pick the 2003 spurs in the first place is undoubtedly the opponent FG%. 42%. 42%. 42%!!!!! Opponents were generating
75 points off FGA. Remember that the rockets today pump out about:
HOU is one of the best offensive teams, sure, but the spurs held EVERY SINGLE TEAM for A WHOLE SEASON to an average of 20 POINTS LESS THAN THEM OFF FGA.
I wasn’t really sure where to start, so I just watched a spurs-pistons game from the 2005 finals. This is the game where Robert Horry hits the 3 in overtime to beat the pistons in game 5. I know that this is the wrong year, but I’m just trying to get a sense and refresh my memory of basketball in general because I haven’t watched a full game for a while. Just youtubed spurs full game and this one came up first. Notes in no particular order:
- For the spurs, really just two words: TIM F^#&@^# DUNCAN. Alright, fine, three words. Really though, you can see why they win. Forget offense and defense for a second. Tim Duncan does it everywhere and anywhere. On offense, the efficiency of scoring (let alone free throws in this game) just comes so seemingly easy. He’s just built so long and tall that it’s really hard to contest any of his jump hooks. On defense, same thing, his length really allows him to affect shots, rebounds, passes in the lane… you name it. Countless times it seems that Tim Duncan is in the middle of a missed FGA or turnover. There were times in this game where Detroit would keep switching Tim onto Billups. Generally, Billups got the best of Tim, but Billups is an elite and crafty point guard and Tim held his own in more or less any other situation. You rarely saw Sheed or Big Ben with any groundbreaking plays.
- Perhaps this was because Billups generally took over on the weaker TP or on a switch with Duncan. The Detroit offense undoubtedly ran through Billups, and more often than not he took advantage. On the final play of overtime, you see Bruce Bowen pick up Billups, and he gets stopped dead in his tracks. It seemed like a quiet night for Hamilton, though, perhaps because Billups was on HIM the whole time and he may have lit it up if TP was checking him. Regardless, many of the Detroit offensive advantages seemed to stem from Tony Parker. Right now I’m talking about team defense, but for many plays, it seemed the team defense was as bad as their weakest link, TP.
- In general, I felt the offensive talent in this game is just too good to really comment on defense too much. So many times Billups hit a crafty layup, or Tim Duncan just flipped up a swish, let alone Robert Horry taking over in the 4th & OT. Many of Horry and TD’s shots you can’t really defend. Billups shots were often defended decently but he just hit some crazy ones. If I take a look at the box score stats, it seems that both teams were okay.
- SAS had 50% on 2PA and 40% on 3PA. Elite. DET had 47% on 2PA and 22% on 3PA. SAS shot way more 3’s, and were more efficient shooting the 3, with 8 3PM vs 2 3PM. This seemed to even out the 5 extra turnovers they had over the pistons (16-11). So how exactly do you gauge defense here? Detroit couldn’t contain the SAS shooting at all, but when you have a weapon like Robert Horry going off from 3, to what degree can you contest that? DET had 7 steals on SAS, which caused the additional turnovers, so from that perspective, they played a great defensive game. On the other hand, SAS held DET to average 2P shooting and horrible 3P shooting. My initial impression was that Billups was lighting it up on offense, but would they have gotten better percentages had Duncan and Bowen not been there and Sheed and Hamilton could distribute the scoring as well? These are questions I’m not sure I know enough to answer without watching more tape.
2003 Pistons
The 2003 Detroit Pistons had your core of Billups, Hamilton, Prince, Sheed, Big Ben. They were notoriously known for defense. Why? I honestly don’t quite remember because I was like 15 then and still hated everything in my life. But now looking at the numbers, I do know that the Pistons held their opponents to
off FGA. 2 points worse than SAS, but for all intents and purposes, they were clearly both defensive beasts.
I watched the 2005 pistons – heat ECF game 1 (I know, again, not the same team exactly, but it was just the year after), and much like the spurs game, you could see why Detroit was so good. This was a great game to demonstrate their capabilities across the board.
I’d actually like to start off with offense ironically. The first thing I noticed was that all their starters, as well as many bench players, were deadly. Just deadly. Any of them could hit you with anything at any moment. Billups would scout the floor but had every capability of making a big shot or driving it to the hole. Hamilton could run circles around you and drill a midrange with high accuracy. Sheed basically did it all (especially this game), showing off like 4 threes, multiple jump hooks, and getting a few blocks. Prince, somehow seemingly weighing 90 pounds, could shoot or post up with the best of em. Big Ben, although not as offensively gifted, hit a few good shots but beasted on the defensive end. I mentioned some defensive notes in there, but again, offensively, you pick your poison. Who do you concentrate on? They’re all all-stars… The number of points they got: 16, 13, 13, 18, 20. Who got what? Does it matter? You could assign any name to any point total and you could believe it. 44% 2P% and 55% 3P%!! Great showing by the whole team!
I wanted to start with that because it’s pretty much the same story defensively. They are all gifted, and they move so well with each other. Their bigs are BEASTS. Although this game was also an insight into how dominant Shaq was (jesus christ…), their bigs did a pretty solid job overall. Looking at the data, I’m seeing the difference in numbers between 2-3 blocks, 2-3 steals, a contested shot here and there, a hard fought defensive board here and there… they add up to a ton of points. Miami played good defense too, but when you look at Sheed and Big Ben’s statlines, 3 steals, 6 blocks between the two. This goes for both teams in this game to be honest, but on the blocks front, man, so many shots altered. So many easy shots that should have been gimme layups erased. There were at least 6 points that should have gone down in history as easy points in this game, just gone. For steals, Big Ben (I think) poked the ball away from Shaq 3 times, and I remember distinctly (for both blocks and steals actually) that these lead to easy points on the other end. So in that case, not only did they erase a possible 2-3 points, they gained 2 points for a 4-5 point swing, all stemming from a single poke.
Watching these games, you really start to notice all the intricacies of what 1 number means in the grand scheme of things. Every time I see a block, I gotta think that it can either mean 0 points, or a 4-5 point swing!
Let’s watch one more game.
2011 Celtics
Third game. Game 6 2012 ECF BOS-MIA. To talk about BOS defense, you first have to talk about MIA offence. AKA Bron dropping 45 on 77% on 2PA mostly consisting of mid-range jumpers and 50% on 3PA. And therein lies the answer to Boston’s defense. To me, it’s not that Boston’s defense was bad, it’s just that Boston’s defense basically didn’t matter because if Lebron wants to pull up on your team 10 times with a mid-range jumper, you let him. Why would you want him to drive or find a cutting DWade when you can play your luck and see if he goes 25% on the night. Unfortunately, he went 77% on the night and you probably just let that one go.
Boston lost this game 98 – 79 and their starters were basically out midway through the fourth. There was a lot of hustle with MIA and BOS with 8 and 9 steals respectively (Rondo had 7 TOV, with him taking the blame for most of them), but at the end of the day it wasn’t even MIA’s defense that held BOS to such low points. BOS just couldn’t hit shots. KG was 6-14 with so many easy baby hooks missed, Paul Pierce was even worse with 4-18 and the C’s were 1-14 from 3.
Overall, very bad game to watch defense because nothing really happened lol. Bron was great, C’s were bad, and that’s all she wrote.
The Ugly
Alright, let’s take a look at the ugly.
%%R -i teamAggDfToAnalyzeTiersBottom -w 1000 -h 800 -u px
leagueNTeamsPlot(teamAggDfToAnalyzeTiersBottom, 'Bottom')
I’ll make this one relatively short because I feel I’m starting to repeat a lot of the same concepts.
Shooting
The thing that jumps out to me the most again is shooting. These teams were allowing FG% that elite teams were achieving. In essence, any team that played these teams played like an all-time elite team for that game. Opponents were shooting >50% up to like 54% on 2PA! Many of these teams were allowing 35-40% on 3PA as well! These, as we’ve seen before, are elite numbers. The answer probably really varies between team to team, but having watched a few games fresh in my mind, I feel that a large part of this was probably because either
- The team didn’t have any superstars to rely on
- The team just didn’t gel well together and didn’t play cohesively
If I think about what allows a team to shoot well. It’s one story if you have Lebron going off for 77%, but it’s another thing to let different teams average 54% 2PA on you for the entire season. To me, these teams were probably lacking both 1 and 2.
Their offense probably played a role here too because, after seeing how many easy buckets can happen from blocks and steals, these guys were likely blocked on and stolen from quite a bit as well to lead to easy buckets on the other end and higher FG%.
Let’s take a super quick look.
# Scatter of oppoenent pace adjusted steals and blocks
teamAggDfToAnalyzeTiersBottom.plot(kind = 'scatter', x = 'opponentPerGameStats_BLK_per_100_poss', y = 'opponentPerGameStats_STL_per_100_poss', title = 'Worst Defensive Teams\' Oppoent STL & BLK')

Hmm, these teams didn’t have as much STLs and BLKs against them as I would have imagined. The steals are getting up there, but the blocks are quite normal. Perhaps they were so poor offensively as well that they never even got the opportunity to have their shots blocked… if you get a steal, you can’t really get a block on that same possession! Anyways, I’ll avoid reading into this too deeply. Just a thought I had after freshly watching 3 games. Let’s move on.
Blocks & Steals
Sorry for the possible confusion, but I was just talking about the OPPONENT’S blocks and steals. Let me switch over to the TEAM’S blocks and steals, and remember, these are the teams that are poor defensively.
Blocks immediately jump out. These teams averaged about 4 per game, about 50-75% of what great defensive teams had. I definitely have to do more tape watching to get a better feel for how blocks impact games. Again, when I first started writing these posts, I really didn’t think a block did much. After watching games, a block could result in a 4-5 point swing. That’s major if you keep getting blocks. Not to blow it out of proportion but it isn’t too crazy to see how a few blocks could result in a 10 point swing! Something else I noticed was that blocks get the momentum and crowd going… oh man. I’m not even sure how exactly to describe the intangible here, but honestly it isn’t too hard to see a situation where a team is about to start a run then a block plays a sparkplug role and gets the entire team and crowd into it. Eventually maybe the other team gets rattled and makes some stupid mistakes and you eventually score more easy baskets etc etc. It’s hard to measure with numbers, but it’s so obvious it smacks you in the face when you watch in person.
I’m not so sure I have more to say about steals. Not from a lack of something to say, but probably more from a lack of knowledge about the game. It can mean good individual defense, good team defense, poor decision making by the opponent… etc. However, it is interesting that even poor defensive teams were still getting a good 8 steals per game.
Tying It All Together…
Over the past few posts, I’ve really just looked at a handful of the most obvious stats. There is so much more I can do, but it’ll be a process to explore everything. Really, what I’ve taken away most from my analysis thus far is a good benchmark / profile of what good teams’ numbers look like, and what bad teams’ numbers look like.
Good teams shoot >50% from 2PA and >33% from 3PA, and keep their opponents under those.
Good teams will do the dirty work in grabbing offensive boards, come up with momentum changing steals (9-10 / 100 poss) or blocks (7-8 / 100 poss).
Good teams will prevent turning the ball over (15 / 100 poss) and will force their opponents to (18-20 / 100 poss)
Out of 100 possessions, a good team will usually capitalize on 40-50 of their 85-90 shots per 100 possessions, and turn the ball over hopefully less than 15 times. Bonus for more ORBs to give them more shot opportunities.
With these numbers, let’s maybe focus back on the raptors and do a deeper dive, perhaps even getting into some of the players.