Turning business questions into defensible recommendations.

Each case starts from a decision someone had to make, runs on real data with its cleaning documented step by step, and ends in recommendations that state their own limits. The full evidence — logs, notebooks, reconciliation counts — lives in each case's repository.

Selected work

3 cases

Private credit / small-business lending

Corrected for age, the 2023 vintage of US small-business loans is the worst since 2009

A loan book's charge-off rate lies when the vintages inside it are of different ages. The 2023 SBA vintage shows 3.5%, one of the best numbers in the programme's history; read at the same age as every other vintage it projects to 12.2%. At 36 months a vintage has realised only 23.5% of the losses it will suffer.

  • SQL
  • DuckDB
  • Python
  • matplotlib
  • 1,697,539 loans · 35 vintages · 1991–2026
Stacked column chart of cumulative charge-off rates for the FY2015 to FY2025 vintages. Each column splits into the loss already recorded and the loss the projection says is still to come. FY2023 reaches 12.2%, far above the 6.0-9.2% band where FY2010 to FY2014 landed, even though only 3.5% has been recorded so far. FY2024 and FY2025 carry no projection and are labelled not projectable; their raw rates are 1.05% and 0.14%.

Football / sports finance

Football's transfer money is spreading out, not concentrating — and youth carries no premium

The industry treats both as settled: money pooling in fewer clubs, young players costing an ever-growing premium. Four transfer windows of deal-level data and a decade of FIFA's census contradict both. What is stable is who sells — 96 clubs were net sellers in all four seasons, where chance would have given 61.

  • SQL
  • DuckDB
  • Python
  • matplotlib
  • 6,716 priced transfers · €37.4bn · 2 sources
Diverging bar chart showing how many clubs fall above or below what random role assignment would produce. Clubs that never sold and clubs that sold in all four seasons are over-represented by 15 and 35; the middle categories are under-represented by 34 and 28.

Video games

On Steam, the cheapest price band has the worst reception across all 10 genres

Games priced under a real $3.25 systematically get the worst reception in their genre. The best reception sits at $6.46-$12.36 — never the cheapest, and not always the most expensive either. Based on that, I recommend concentrating due diligence on Adventure, Indie and Casual.

  • Python
  • pandas
  • matplotlib
  • 125,855 games · 2 sources combined
Horizontal bar chart comparing each genre's cheapest price band against its best band. In all 10 genres the best band's median review score is higher than the cheapest band's, by 2.5 to 5.0 percentage points.

Latest note

All notes →

My risk bands changed every time I rebuilt the databaseThe query was correct and every number it produced was plausible. Half the rows still changed between two runs of the same pipeline over the same data — because of a tie-break I had not written.