Markets coveredMatch OddsCorrect ScoreOver / UnderFirst HalfSecond Half
Statometrics
Model Library · Distributions

Zero-Inflated Models

Count models that add an extra chance of zero, for markets where some zeros are structural, such as a player not starting.

Intermediatepre-match

In one sentence

A zero-inflated model mixes a "certain zero" state with a normal count distribution, to explain more zeros than Poisson or negative binomial would produce.

How it works

Some zeros happen for two different reasons. A striker might record zero shots on target because he had a quiet game, or because he never got on the pitch. A plain Poisson model lumps these together and ends up confused: it underestimates the zeros and overestimates everything else.

A zero-inflated model splits the story into two steps. First, a switch: is the player (or team, or event) "active" at all? Second, if active, how many does he get, via a Poisson or negative binomial? The zeros come from both routes.

This fits player props, bookings for players who may be subbed early, and any count where a separate process can shut the whole thing off.

The maths

P(X=0)=π+(1−π) e−λP(X=0) = \pi + (1-\pi)\,e^{-\lambda} P(X=k)=(1−π) λke−λk!,k≥1P(X=k) = (1-\pi)\,\frac{\lambda^{k}e^{-\lambda}}{k!}, \qquad k \ge 1
  • π is the probability of the "structural zero" state (for example, the player does not play).
  • λ is the expected count when the player is active.
  • X is the observed count.

In words: zeros come from two places, the switch being off and the Poisson count happening to be zero.

Worked betting example

Football player market, illustrative inputs: a striker to have 1 or more shots on target. You estimate an 80% chance he starts and, when he starts, an average of 1.2 shots on target. Assume the bet stands if he does not play (check the rules; many player markets void instead).

  1. P(0 shots on target) = 0.20 + 0.80 × e to the power −1.2 = 0.20 + 0.80 × 0.3012 = 44.10%.
  2. P(1 or more) = 55.90%. Fair odds ≈ 1.79.
  3. A naive Poisson with the same overall mean (0.8 × 1.2 = 0.96) gives P(1 or more) = 61.71%, fair odds ≈ 1.62.
  4. The market offers 1.70. Naive Poisson says back: 0.6171 × £7 − 0.3829 × £10 ≈ +£0.49 on a £10 stake. The zero-inflated model says don't: 0.5590 × £7 − 0.4410 × £10 ≈ −£0.50.
  5. If he is confirmed in the starting line-up, π drops to zero and P(1 or more) becomes 69.88%, fair odds 1.43.

The lesson for traders: team news moves π, and π moves the price more than tweaking λ does.

Where it's good

  • Player props (shots, tackles, cards) before team news is confirmed.
  • Goalscorer-type markets where substitutions and injuries shut off exposure.
  • Counts of rare events for teams that sometimes "park the bus" and create nothing.
  • Explaining why a model systematically underprices zero outcomes.

Limitations and pitfalls

  • Market rules decide everything. If the bet is void when the player does not start, the structural-zero part is irrelevant and you should use the plain count model.
  • Separating the two sources of zeros needs a lot of data or a good external estimate of π (such as predicted line-ups).
  • Often a negative binomial fits the data just as well with fewer assumptions. Compare fits before choosing.
  • Partial participation (a 20-minute cameo) is neither "off" nor "fully on"; scale λ by expected minutes instead.
  • Overfitting risk is high when both π and λ get their own predictors with small samples.

How to build it

  • Python: statsmodels ZeroInflatedPoisson and ZeroInflatedNegativeBinomialP. R: pscl::zeroinfl.
  • Data: player minutes, starts, shots and opponent quality; predicted line-ups for π.
  • Tip: model expected minutes directly where possible; it is clearer than a single on/off switch.
Learn it step by step
18+ only. Educational content, not financial or betting advice. Past results do not guarantee future returns. If gambling stops being fun, get free, confidential help at BeGambleAware.org.
Members