Fees — computed vs published
Each programme-year's cost is computed course-by-course from the fees book, then compared with UCT's independently published "typical annual fee". Where both sides can be tested, the computation reproduces the published figure — the strongest external check on the whole dataset.
COM median |Δ|
EBE median |Δ|
FHS median |Δ|
In 2025 rands: separating curriculum change from price escalation
Nominal fee trends conflate two things: what the curriculum asks students to take, and UCT's annual fee escalation. The dataset derives its own deflator from the fees books — for each consecutive edition pair, the median fee ratio across every course code present in both books (~3,900 matched codes per pair; the spread is a few hundredths of a percentage point, i.e. the escalation is applied near-uniformly across the fee book). Fee income gain/loss should be read from the real series, not inferred from credits — a dropped course may carry little or no fee.
The nominal series rises 29% over 2021–2026; in 2025 rands the fee is essentially flat — even through the 2024 credit cut, whose dropped credits carried no fee. Credit changes are not a proxy for fee-income changes.
Distribution of differences (comparable fees)
Histograms of the percentage difference between computed and published fees, for the faculties whose fees are published per programme-year. Trimmed to ±25% for readability; the outliers appear in the divergence table below.
Structural divergence is not error
Three faculties publish fees at a coarser grain than the year, so per-year differences are expected by design and labelled, never "corrected":
flat_annual— Law publishes one flat annual fee per LLB stream; the graduate stream's year 1 still matches to the rand.degree_flat— Science and Humanities publish one fee per degree, covering every major; per-major deltas are indicative only.
Largest divergences (comparable fees only)
Worth reading with the findings pages: the biggest gaps are mostly menu-inflated estimates (a choice menu with no printed pick-rule) or clinical years whose rotation codes carry no fee row — documented cases, not noise.
Elective-slot costs are median-based estimates and are always carried in a
separate column (fee_estimated_component_zar) so exact-figure analyses can
exclude them.