Overwatch League Data Analysis
Final group project for SFU's Business Analytics capstone. A multilinear regression to predict OWL player prize earnings from in-game performance data — and a clear-eyed answer about what public stats can and can't tell you.
Context
This was the final group project in my Business Analytics capstone at SFU's Beedie School of Business. The brief: pick a real-world problem, source the data ourselves, and conduct a Root Cause Analysis on a continuous response variable using whatever statistical tools we'd learned in the course. The point wasn't to solve the problem — we didn't have the time or resources for that — it was to do the kind of superficial first pass an analyst would do before scoping a full investigation.
I pitched the Overwatch League (OWL) angle and the team and prof both liked it, despite the ambitious scope. The question I wanted to answer was one any esports org would care about: which publicly available player performance metrics predict the players most likely to grow their team's profitability through prize earnings? If you're a decision-maker scouting talent, that's a meaningful question to put to data.
Approach
We collected player prize-money data from the esportsearnings.com API and in-game performance data from the official OWL Stats Lab (since deprecated when the OWL was dissolved and replaced by Overwatch Esports). The response variable was career prize earnings; the candidate explanatory variables were every per-game performance metric the Stats Lab exposed — damage dealt, damage taken, healing, eliminations, deaths, ultimate economy, and so on (there were dozens).
The modelling was done in SAS Enterprise Guide, with a KNIME regression tree used in parallel to identify which variables actually mattered before they went into the SAS multilinear regression. Python handled the data preparation: scraping, cleaning, joining the earnings table to the performance table on player ID, and reshaping the per-match data into per-player aggregates.
Results
The best model we landed on identified Damage Taken, Ultimates Earned (Fractional), and Ultimates Used as the most predictive metrics for player earnings. Intuitively that maps to high-engagement frontline players — tanks and aggressive supports who are in the fight, soaking damage, and cycling ultimates — which lines up with the kind of player who tends to be a team's centerpiece.
The headline number was less flattering: an R² of around 0.27. The model explained roughly a quarter of the variance in prize earnings. Useful as a directional reference, not nearly enough to actually scout from.
The conclusion we wrote up was that public-data scouting models like this should be treated as reference, not signal. The limiting factors weren't statistical — they were structural: significant missing values across the Stats Lab dataset, inconsistent collection over the league's lifetime, the inherent complexity of role and meta dependencies, and the fact that the game itself fundamentally changed mid-dataset (Overwatch 1 to Overwatch 2, 6v6 to 5v5). To do better, an org would need experienced scouts in the loop, internal earnings or salary data, or substantially more sophisticated models accounting for role, meta, and patch effects.
Reflection
What I took from the project, beyond the grade, was reps on the unglamorous half of analytics: scoping a question against the data you can actually get, choosing tools for the size of the problem (SAS for the regression, KNIME for variable selection, Python for everything in between), and being honest about what a 0.27 R² means before someone less careful tries to scout from it. The negative result was the result. That's a useful thing to internalize early.