CrunchCast

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

Try:
Max 10 courses
29 years of real UBC grade data12,334 courses scored4 real signals behind every scoreXGBoost shipped model
Scroll

How it works

Four numbers behind every score

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.

avg
low avghigh avg
this course

lower average → higher score

01

Grade impact

Where the course's average grade sits among other courses at its level. A lower average means a higher score.

fail_rate

more fails → higher score

02

Fail risk

The share of students who have failed the course in past terms.

std_dev
tight wide

wider spread → higher score

03

Grading unpredictability

How spread out grades are within a section. A wide spread means the class average tells you less about where you'll land.

enrolled

bigger class → higher score

04

Class size

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

It measures grading, not workload

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

Weekly load
heavynot counted
Grading
generouscounted
0
[EASY]

Example B

Weekly load
lightnot counted
Grading
strictcounted
0
[EASY]

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

How the model is built

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

trains the modeldisplay only
19962016W2025W

42 terms train the model

01

The data

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)

history lookup16.38
XGBoost16.00

lower is better

02

The model

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

grade
fail rate
spread
class size

example quiz result

03

Personalization

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

Read this before you trust a score

What the model can't tell you, and where the data falls short.

01

It's a stand-in for difficulty

The score is built from past grade outcomes. It doesn't measure workload, time spent, or how good the teaching is.

02

The data is a decade old

The predictor stops at 2016W. A course's instructors and content may have changed a lot since then.

03

Two time ranges, kept apart

The history browser covers 1996 to 2025, but the predictor only goes up to 2016W. The two are never mixed.

04

Instructor names aren't cleaned up

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.

05

Few past offerings, low confidence

Courses with only a few past offerings get a low-confidence label, and the app shows a warning next to their score.

06

Vancouver only

All three data sources only reliably cover UBC's Vancouver campus.

FAQ

Common questions

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.

Check your term before you register

Add the courses you're considering and see how each one has graded, with the numbers behind every score.

Build your term