avglower average → higher score
Grade impact
Where the course's average grade sits among other courses at its level. A lower average means a higher score.
Know how a course actually grades before you register.
CrunchCast scores every UBC course's historical difficulty from decades of real grade data - fail rates, grade spread, class size, the works. Not a workload guess.
Build your term
Drag to interact
How it works
Each course is scored on four things taken from its past grade reports. Each one is ranked from 0 to 100 against courses at the same level, so a first-year course is only compared with other first-year courses. The app shows all four for every course you add, along with the raw figure behind each.
avglower average → higher score
Where the course's average grade sits among other courses at its level. A lower average means a higher score.
fail_ratemore fails → higher score
The share of students who have failed the course in past terms.
std_devwider spread → higher score
How spread out grades are within a section. A wide spread means the class average tells you less about where you'll land.
enrolledbigger class → higher score
How many students usually take it. Bigger classes score higher, and you can turn this down in the personalization quiz if size doesn't bother you.
The honest part
The score is built from how a course has graded in the past, so it can't tell you how much work the course takes. A course with a heavy weekly load and generous grading scores low. A light course with strict grading scores high.
Example A
Example B
Made-up courses to show the idea, not real scores.
What it is
Past average grade, fail rate and grade spread, ranked against courses at the same level, with a confidence level on every score.
What it isn't
A measure of workload, a rating of the teaching, or a forecast for this year's section. The data ends at 2016W.
Under the hood
Three parts, each written up in the repo: the data it learns from, the model itself, and how your quiz answers change the score.
data window
42 terms train the model
The model only learns from UBC's PAIR grade reports, 1996 to 2016W. The source says its data from 2017W on was altered, so the model never sees it. Newer terms, up to 2025W, only show up in the history browser.
test error (MAE)
lower is better
XGBoost, trained on terms up to 2013W and tested on 2014W to 2016W, so it's always scored on terms it hasn't seen. It beats a simple lookup of each course's own history by 2.3% on average error. That's a small gain, because a course's past grades already explain most of its score.
signal weights
example quiz result
There's no second model. By default the four signals count equally. Your quiz answers change how much each one counts, and the app recombines them with simple arithmetic when you ask for a score.
Known limitations
What the model can't tell you, and where the data falls short.
The score is built from past grade outcomes. It doesn't measure workload, time spent, or how good the teaching is.
The predictor stops at 2016W. A course's instructors and content may have changed a lot since then.
The history browser covers 1996 to 2025, but the predictor only goes up to 2016W. The two are never mixed.
A name only matches if it's spelled exactly the same every term, so the model's instructor-history feature is missing for about 52% of rows.
Courses with only a few past offerings get a low-confidence label, and the app shows a warning next to their score.
All three data sources only reliably cover UBC's Vancouver campus.
FAQ
No. The score comes from a course's past average grade, fail rate and grade spread. A heavy course can still score low if it grades generously, and a light one can score high if it grades strictly.
The predictor learns from UBC's PAIR reports up to 2016W. The history browser goes further, from 1996 to the latest available term (currently 2025W), but that newer data is only shown to you. The model never uses it.
On terms it hadn't seen, the model's average error was 16.00 points, against 16.38 for simply looking up each course's own history. That's about 2.3% better. A small gain is expected, since a course's past grades already explain most of its score.
No. You can build a term and get scores without signing up. If you save a term, it's kept in your browser, not on a server.
It has only a few past offerings, or it was first offered after 2016W. The predictor then falls back on estimates for the whole subject or for all courses, so the app flags the score as less reliable.
No. It's an independent portfolio project built on publicly available UBC grade data. It isn't an official UBC tool or a rating of instructors.
Add the courses you're considering and see how each one has graded, with the numbers behind every score.
Build your term