This analysis shows how pbprdf was used to analyze NBA players' 3-point shot percentage after a player on the other team either made or missed a shot over the 2017-2018 regular season.
We're interested in finding 3-point shots that were made immediately after a 3-point shot taken by the other team. The way we do this is by running a SPARQL query that calculates each player's season 3-point shot percentage, the 3P% after a player on the other team misses, and the 3P% after a player on the other team makes. We want to calculate the percentage of 3-point shots that they make or miss when we include only shots that they took immediately after a player on the other team took a 3-pointer (within two lines on the play-by-play).
Here's the data that we're using to do this analysis. Each play has a set of triples that include:
games:2018-01-18_76ers_at_Celtics/21
pbprdf:shotPoints "3"^^xsd:int ;
a pbprdf:Shot ;
pbprdf:shotMade "false"^^xsd:boolean ;
pbprdf:shotBy players:Joel_Embiid ;
pbprdf:forTeam teams:76ers ;
pbprdf:period "1"^^xsd:int ;
rdfs:label "76ers: Joel Embiid misses 25-foot three point jumper" ;
pbprdf:previousEvent games:2018-01-18_76ers_at_Celtics/20 .
Our goal is to find 3-point shots that were made after a previous 3-point shot by a player on the other team. We'll look at all 3-point shots after a 3-pointer by a player on the other team, ones that were made after a make, and ones that were made after a miss.
To find them, we'll use a query with subqueries that look like this:
# Find the number of 3-point shots missed after a player on the other team makes a 3
{
SELECT ?player (COUNT(?shot) AS ?shotsMadeAfterMake)
{
?shot pbprdf:shotBy ?player .
?shot pbprdf:shotPoints "3"^^xsd:int .
?shot pbprdf:shotMade "false"^^xsd:boolean .
?shot pbprdf:forTeam ?shotTeam .
{
?shot pbprdf:previousEvent ?previous .
} UNION {
?shot pbprdf:previousEvent / pbprdf:previousEvent ?previous .
}
?previous pbprdf:shotPoints "3"^^xsd:int .
?previous pbprdf:shotMade "true"^^xsd:boolean .
?previous pbprdf:forTeam ?previousShotTeam .
FILTER (?shotTeam != ?previousShotTeam)
}
GROUP BY ?player
}
This subquery takes advantage of the pbprdf:previousEvent triple, which links each event in the play-by-play to the previous one. It looks for any missed 3-point shot that was preceded by a made 3-point shot taken by a player on the other team. It aggregates and combines these, just like in the clutch shot query.
We'll need a pair of subqueries for the overall 3-point field goal percentage (# made / # taken), a pair for made after miss, and a pair for made after make.
The results of this query were pasted into a spreadsheet, with a summary row added withthe average and standard deviation calculation. The spreadsheet was sorted to make it easy to find the players with the highest 3P% after a player on the other team makes a shot.
The average 3P% after the other team makes or misses is pretty much in line with player's overall 3P% average. But here's the REALLY interesting part: the standard deviation for 3P% after a player on the other team makes a shot is more than twice as high (!!!) as standard 3P% standard deviation. This means this metric is extremely player-specific: some players have a HUGE "anything you can do, I can do better" motivation, and it shows up in their stats. So if a player on the other team just made a 3, you definitely want the ball in the hands of Karl-Anthony Towns or Kevin Durant.
What does it mean that Steph Curry actually has a lower 3-point percentage after a player on the other team makes a 3? I can think of some reasons that this is not necessarily a bad thing. Steph is, in many ways, the ultimate team player. Maybe he knows that his team gets especially fired up when a 3 is answered with a 3, or that there's a chance that the momentum can shift a 3 goes unanswered, so it's worth taking the shot.
This table show the top ten players with the highest 3-point shot percentage taken after another player makes a 3-point shot, along with the average and standard deviation over all players.
PlayerName | ThreePointShotPercentage | ShotPercentageAfterMiss | ShotPercentageAfterMake |
---|---|---|---|
"Karl-Anthony Towns" | 41.99 | 45.16 | 62.50 |
"Aaron Gordon" | 33.86 | 33.33 | 56.67 |
"Kevin Durant" | 42.07 | 42.00 | 54.29 |
"Anthony Tolliver" | 44.66 | 39.58 | 51.28 |
"Tobias Harris" | 41.57 | 43.64 | 51.11 |
"Paul George" | 39.64 | 47.27 | 50.79 |
"CJ McCollum" | 39.76 | 46.88 | 50.00 |
"Nikola Jokic" | 38.75 | 22.22 | 50.00 |
"Robert Covington" | 36.99 | 33.33 | 50.00 |
"Allen Crabbe" | 38.27 | 36.36 | 48.39 |
AVERAGE | 37.28 | 37.29 | 36.95 |
STDEV | 3.42 | 7.74 | 8.70 |
The following additional files are attached:
- SPARQL query.txt – the full query that generated the data
- Full data.md – complete results of the query run against the 2017-2018 NBA Season (note that I'm missing a few play-by-play files from the season, so the 3PFG% may be slightly different than official NBA stats, but that shouldn't affect this analysis at all because it's based on complete games)