1. Define the clock
IFAB Law 7 defines two 45-minute halves and allowances for time lost. A label such as 45+4 should not be forced into a nominal five-minute bin without deciding how actual exposure is represented.
2. Build exposure-aware intervals
For each match and interval, record minutes played and goals. If an interval contains 80 goals across 7,600 team-minutes, its rate is 80 / 7,600 = 0.0105 goals per team-minute. A longer added-time interval naturally offers more scoring exposure.
3. Add context
| Field | Reason |
|---|---|
| Score state | Trailing teams alter risk |
| Red cards | Team strength and space change |
| Competition and season | Rules and styles differ |
| Added time | Exposure is not fixed |
| Home-away side | Venue effects may differ |
StatsBomb's open data exposes event timestamps and match context for selected competitions, supporting a reproducible prototype.
4. Separate description from prediction
An interval with a higher historical rate does not automatically offer a favourable market. A live probability also depends on teams, score, time remaining and current match evidence. A Bayesian in-play football model is one published example of dynamic updating and model checking.
5. Test on later matches
Choose intervals and covariates on training seasons, then evaluate the same design on later fixtures. TimeSeriesSplit provides one chronological framework. Report uncertainty and multiple-comparison risk if many intervals were searched.
Exposure-aware worked record
Suppose a team scores eight goals in the 76th minute or later across ten matches. "Eight late goals" omits the exposure: substitutions, stoppage time, red cards and time spent chasing differ by match. Record eligible minutes and match states for both scoring and conceding.
| Field | Purpose |
|---|---|
| Interval start and end | Makes bins mutually exclusive |
| Added-time rule | Prevents inconsistent 45+ and 90+ allocation |
| Score state | Separates chasing from level or leading periods |
| Player count | Marks red-card exposure |
| Goal type | Distinguishes penalties and own goals if relevant |
| Available minutes | Provides a rate denominator |
Compare the team's rate with a league and strength-adjusted baseline. Display the event count beside the rate so a visually large percentage from a small sample is obvious.
Forecast test
scikit-learn's TimeSeriesSplit guidance supports the chronological validation rule used in the next step.
For each historical kickoff, calculate timing features using only prior matches. Compare a model with those features against the same model without them on later fixtures. Evaluate probability quality, not whether one memorable late goal occurred. Refit the bins or weights only inside training periods; selecting the strongest-looking interval from the final season leaks the answer into the feature design.
When presenting the result, pair every percentage with the event count and eligible minutes. This lets a human reader distinguish a recurring pattern from a large rate produced by little exposure.
Related resources
Use live prediction models for dynamic probabilities or in-play odds for price-state comparisons.
Continue learning
- Next guide: How to Build a Reproducible Football Stats Dashboard
- Related guide: How to Use xG in Pre-Match Research
Assumptions and limitations
The rate example is illustrative. Event timestamps, stoppage-time representation and abandoned matches require explicit rules. Historical interval patterns can be confounded by score state and should not be presented as universal opportunities.

