ANALYTICS9 min

Expected Points in Basketball

ByHoopDeck Analytics· Basketball Data Analysts

From shot outcome to shot quality. A first look at the Expected Points model.

A team's offense lives and dies by the quality of the shots it creates. For years, we have evaluated this quality by looking at what happens after the shot: field goal percentage, points scored, offensive rating. These are all useful metrics, but they share a structural limitation: they depend on the final outcome of each shot, which is noisy by definition and affected by variance and game context.

Expected points starts from the opposite need: shifting focus from "did the shot go in?" to "how good was the shot when it was taken?".

Instead of only observing makes and misses, we estimate the probability of a shot going in given specific shot features: distance from the rim, floor area, defensive pressure, whether it came from an assist, and so on.

This perspective shift is essential to truly evaluate offensive shot quality. Expected points does not require shot outcome to be computed: it uses information available before ball release. That allows us to evaluate how consistently a team can generate good looks, beyond hot nights and cold shooting stretches.

Data source: LBA 2025/2026 shots

To build the expected points model, we used shot data collected by the HoopDeck team on LBA 2025/2026 games. Tracking is done through proprietary HoopDeck technology.

For each shot attempt we store:

  • exact on-court shot location (court coordinates);
  • whether the shot was contested by the defense;
  • whether the shot was assisted and, if so, the assisting player.

This level of detail is what allows us to move from raw shooting percentage to an estimate of shot quality, i.e. expected points.

Concrete shot examples from the dataset

Let's look at two real shots from the LBA 2025/2026 season to understand the kind of information we collect.

Shot 1

Shot details

  • Location: Restricted Area
  • Contested: Yes
  • Assisted: No
  • Result: Made

This is the recorded shot position from the HoopDeck database. By clicking the shot in the original post, you can inspect the shot tags (C: contested; UA: unassisted).

Game Period Score Type X Y Contested Assisted
Cremona-Cantù 4Q 86-87 2FGM 3.11 -39.96 Yes No

Shot 2

Shot details

  • Location: 3-point line
  • Contested: No
  • Assisted: Yes
  • Result: Made

This is the recorded shot position from the HoopDeck database. By clicking the shot in the original post, you can inspect the shot tags (UC: uncontested; A: assisted).

Game Period Score Type X Y Contested Assisted
Cremona-Cantù 1Q 12-8 3FGM -0.16 -18.7 No Yes

How the Expected Points model works

Now that we have seen the raw data, let's walk through how we transform it into expected points.

Model logic

The model takes shot features and predicts the probability of the shot going in.

Model inputs (the same features shown in the examples):

  • shot location on the floor (farther distance usually means lower probability);
  • contested or not (contested shots generally reduce probability);
  • assisted or not (assisted shots generally increase probability).

Model output: a probability between 0 and 1 (EP: Expected Probability).

You can think of the model as an "expert observer" that has seen thousands of LBA shots. It learns from historical data: for each shot profile (location, contested status, assist status), it records how often shots are made.

When a new shot comes in, the model does not treat it as an isolated event. It compares the shot to similar historical attempts and uses those patterns to estimate make probability.

This learn-from-history, predict-on-new-data process is at the core of modern statistical modeling. In our case, the model is not trying to guess the exact outcome of one shot. It is estimating shot quality at release.

For Willis' layup, the model compares it to all contested, unassisted layups near the rim in the season:

Game Period Score Type X Y Contested Assisted EP (%)
Cremona-Cantù 4Q 86-87 2FGM 3.11 -39.96 Yes No 52.2

For Bortolani's three, the model compares it to uncontested, assisted threes from the same season:

Game Period Score Type X Y Contested Assisted EP (%)
Cremona-Cantù 1Q 12-8 3FGM -0.16 -18.7 No Yes 47.5

From probability to Expected Points

Once probability is estimated, we convert it to expected points:

Expected Points (xP) = Probability (EP) × Shot Value

  • 2-point shot: xP = EP × 2
  • 3-point shot: xP = EP × 3

For the two examples:

Game Period Score Type EP xP
Cremona-Cantù 4Q 86-87 2FGM 52.2 1.04
Cremona-Cantù 1Q 12-8 3FGM 47.5 1.43

Real points vs Expected Points: one game example

Expected points is not only useful at shot level. We can aggregate it at game level to compare actual scoring with the scoring quality generated by each offense.

Expected points also includes free throws, using league-average expectation for FT attempts. This gives a complete view of offensive shot quality across 2PT, 3PT, and FT production.

Using Cremona vs Cantù (LBA 2025/2026, Round 19) as an example:

Team PTS xP
Cremona 89 84.8
Cantù 87 92.1

The final score was 89-87 for Cremona, but Cantù generated better expected offensive output in terms of shot quality.

This is exactly the value of expected points: a team can win despite lower quality shot creation, or lose despite generating better looks. It helps us read the game beyond final score and focus on the quality of offensive decisions across the full 40 minutes.

In future articles we will dive deeper into team-level and player-level use cases, showing how expected points can become a practical tool for evaluating offenses, players, and strategy beyond basic shooting percentages.