Inspiration
Football substitutions are often judged only after the final whistle. We wanted to help coaches and analysts answer a more useful question:
Given the score, momentum, current XI, bench, and tactical goal, which substitution gives the team the best chance of the desired result?
What it does
SubSense is a historical football replay tool. A user selects a real match, team, and decision point between minutes 65–75, then chooses an objective:
- Protect the lead
- Find an equalizer
- Chase a win
SubSense filters role-compatible bench players, ranks valid substitutions, explains the projected tactical impact, and reveals what actually happened next in the real match.
How we built it
We built the interface with React, Vite, Recharts, React Konva, and Phosphor icons.
The data pipeline uses public StatsBomb Open Data, covering selected historical matches from:
- Bundesliga 2023/24
- FIFA World Cup 2022
- AFCON 2023
We processed 150 matches and 690 observed tactical substitutions.
For every decision point, SubSense reconstructs only the information available at that minute: scoreline, formation, current XI, eligible bench, rolling xG, final-third entries, and player history from earlier matches.
We use bootstrapped ridge-regression models to estimate attacking and defensive xG rates for the rest of the match. Then we simulate possible remaining scorelines using a Poisson distribution.
The probability of scoring (k) goals when expected goals are (lambda) is:
$$ P(K = k) = \frac{e^{-\lambda}\lambda^k}{k!} $$
Recommendations are ranked using outcome utility:
$$ U_{\text{protect}} = P(\text{win}) $$
$$ U_{\text{equalizer}} = P(\text{win}) + P(\text{draw}) $$
$$ U_{\text{chase}} = P(\text{win}) $$
Risk style changes how the model is interpreted:
- Defensive: 20th-percentile utility
- Balanced: mean utility
- Attacking: 80th-percentile utility
Challenges we faced
The main challenge was incomplete player history, especially for bench players. At first, players with limited data could receive a fallback score and appear in a recommendation.
We fixed this by requiring every recommended player to have at least:
- 450 prior minutes
- 5 earlier matches
If enough evidence is unavailable, SubSense shows an Insufficient historical data state instead of guessing.
We also prevented future-data leakage: a recommendation at minute 72 cannot use events that happened after minute 72.
Finally, we learned that penalty-shootout kicks can appear as goals after 120 minutes in event data, so the outcome-reveal view needs to clearly distinguish shootout events from normal match goals.
What we learned
We learned that strong sports analytics is not only about prediction accuracy. It also needs:
- Clear tactical objectives
- Transparent uncertainty
- Honest handling of missing data
- Explainable recommendations
- Respect for the difference between historical correlation and causal proof
SubSense turns raw football event data into an understandable decision-support tool for coaches and analysts.
Explore the project
Want to see how SubSense works, the data safeguards, model logic, and a quick demo flow?
Log in or sign up for Devpost to join the conversation.