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
- π 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).
- P(0 shots on target) = 0.20 + 0.80 × e to the power −1.2 = 0.20 + 0.80 × 0.3012 = 44.10%.
- P(1 or more) = 55.90%. Fair odds ≈ 1.79.
- 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.
- 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.
- 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.
Related methods
- Poisson: the count part of the model.
- Negative binomial: an alternative fix for extra zeros and spread.
- Logistic regression: a natural model for the on/off switch.
- Generalised linear models: the framework both parts sit in.