Skip to content
varun.rout

Jump to

Search pages, projects and repos

← Back to work

Football · methodology, not performance

Live repoReal data

Player Availability Analysis

Independent research · deployed two-service product

View the repo →

What this is

Per-player-per-day availability-risk decision support from public subjective athlete-monitoring data. Its headline is process rigour and honest negative results: three pre-registered audits overturned favourable-looking results, including its own promoted champion.

Metrics

Champion (pooled rolling-origin)

0.836 ROC-AUC · AP 0.097 · Brier 0.0063

vs prevalence-null 0.500

Alert budget, 2.5% review rate

11 of 18 onsets (recall 0.61)

34.8 false alerts per captured onset

Alert budget, 5% review rate

13 of 18 onsets (recall 0.72)

60.4 false alerts per captured onset

Testing

175 tests, GitHub Actions CI on every push

Stack

PythonGCP: BigQuery + Cloud StorageFastAPINext.jsCloud RunGitHub Actions CI

Provenance

Decision support only: not a diagnostic or clearance tool, no causal claims. Deployed as two Cloud Run services behind a shared review credential (never a production authentication claim). The single-use confirmatory final-test ROC-AUC (0.827) rests on five onsets and is barred from ever being cited as a performance figure, by the project’s own governance.

What I would not claim

  • "production" (shared review credential, not production authentication)
  • real-time or online serving (batch inference; deferred to V2)
  • the final-test ROC-AUC (0.827) as a performance figure, anywhere
  • clinical, diagnostic, clearance or causal framing
  • the review credential itself, in any public document

Rigour first, performance nowhere near the headline

The baselines the champion has to beat, the two disclosed alert-budget operating points, and the three pre-registered audits that overturned favourable-looking results along the way.

Baselines the champion has to beat

Prevalence-null

0.500 ROC-AUC

Captures 0 of 5 onsets at any alert budget.

Recent-load heuristic

0.477 ROC-AUC

Below the prevalence-null baseline.

The champion

ChampionM1-F1: 9-predictor regularised logistic regression

Selected after a Cox model was rejected on a pre-registered leakage diagnostic and a gradient-boosted classifier was rejected on an overfitting signature. Raw probabilities: no post-hoc calibrator beat them on Brier or log loss.

Pooled rolling-origin

AUC 0.836 · AP 0.097 · Brier 0.0063

Fixed validation window

AUC 0.808 · Brier 0.0037

Alert budget: two measured operating points

Operating points are the two rates the project actually measured. Nothing between them is estimated.

Onsets captured

11 of 18

Recall

0.61

False alerts / captured onset

34.8

Only the two measured operating points are shown. Nothing between them is estimated.

Reversed on my own evidence

  • Cox proportional hazards rejected: unseen-player ROC-AUC collapsed from 0.818 to 0.577 under a pre-registered reset-clock leakage diagnostic.
  • Gradient boosting rejected: training average precision 0.256 vs validation 0.013, a clear overfitting signature.
  • F3 was the leading point estimate (ROC-AUC 0.851) and was promoted, then withdrawn after an audit found its strongest predictor was reading reporting behaviour, not physiology.
  • A 2.5% alert threshold frozen on development data realised a 4.7% rate on held-out data — traced to an in-sample-vs-out-of-fold derivation bug, not patched, recorded as a methodological finding.

The number this project will never let you cite

Deliberately withheldSingle-use confirmatory final-test ROC-AUC

0.827

Rests on five onsets across 8,845 player-days. The project's own governance bars this number from ever being cited as a performance figure, on a CV, in a case study, or in an interview. Shown here only to demonstrate that it is deliberately withheld, not omitted by accident.

Data provenance. Pooled rolling-origin development evidence and disclosed baselines from player-availability-analysis, generated into data/availability.json. Public SoccerMon subjective-monitoring data. Decision support only; no causal or clinical claim.