Case Study / Civic Data & Analytics

Canada Housing Affordability Analysis

A 120-hour civic data project with the GLOCAL Foundation of Canada analyzing where the housing-affordability burden falls heaviest across Canada, using Statistics Canada Census 2016 & 2021 and CMHC Rental Market Survey 2024–2025 data in Python, Pandas, and Jupyter.

  • Python
  • Pandas
  • Jupyter Notebook
  • Matplotlib
  • Statistics Canada
  • CMHC
  • Data Visualization
  • Civic Tech
Cost-burdened 2021
20.9%
Renter burden
33.2%
Renter vs owner
2.24×
Datasets
4 official

01 / Method

From raw census tables to policy brief

The GLOCAL 120-hour program runs from data collection through visualization to a public-facing communication brief.

  1. 01 — Collect

    Gathered 4 official datasets: Statistics Canada Census 2016 & 2021 core housing need and 30%+ shelter-cost burden, plus CMHC Rental Market Survey 2024–2025 for 2-bedroom rents and vacancy rates. Every figure is official, none simulated.

    Statistics Canada · CMHC RMS · data/SOURCES.md citations
  2. 02 — Clean & engineer

    Handled missing values and inconsistent formats, then engineered four features on top of the raw owner/renter shares: renter–owner gap, census-to-census change, renter-specific change, and renter-vs-owner ratio.

    pandas · feature engineering · STIR 30% affordability line
  3. 03 — Visualize

    Built six chart suites: core housing need by province, owner-vs-renter gap, high-STIR cities, 2016→2021 change, vacancy vs rent, and the national supply/vacancy/rent trend.

    matplotlib · reusable charts module · outputs/
  4. 04 — Communicate

    Translated the findings into a policy brief for a non-technical audience, connecting the data to housing and social policy actions as part of the GLOCAL 120-hour program.

    Policy brief · Task 5 · #Civicdatavisualization

02 / Results

Provincial affordability scoreboard (2021 Census)

Share of households spending 30%+ of income on shelter, with the engineered renter–owner gap and the 2016→2021 change. Negative change means the burden improved.

ProvinceCore need %Total burden %Owner %Renter %Gap (pts)Δ 2016→21
British Columbia13.425.519.337.818.5-2.5
Ontario12.124.217.738.420.7-3.5
Alberta9.921.216.034.018.0+0.3
Saskatchewan10.317.211.133.122.0-3.0
Nova Scotia10.017.99.734.725.0-3.7
Manitoba10.117.39.933.523.6-1.8
Quebec6.016.110.025.215.2-4.9
Prince Edward Island7.015.58.830.221.4-3.1
Newfoundland and Labrador8.014.68.932.523.6-2.6
New Brunswick6.212.97.528.020.5-3.9

03 / Visuals

Where the burden bites hardest

Three of the six chart suites from the notebook, re-rendered for the web.

Core housing need by province (2021)

National average 10.1% — BC and Ontario sit above the line.

  • British Columbia13.4%
  • Ontario12.1%
  • Saskatchewan10.3%
  • Manitoba10.1%
  • Nova Scotia10.0%
  • Alberta9.9%
  • Newfoundland and Labrador8.0%
  • Prince Edward Island7.0%
  • New Brunswick6.2%
  • Quebec6.0%

High-STIR zones — heaviest renter burden

Mid-size Ontario and BC cities top the list, ahead of the two biggest metros.

  • Kelowna, B.C.43.7%
  • Peterborough, Ont.43.0%
  • Barrie, Ont.42.4%
  • Oshawa, Ont.41.7%
  • Kingston, Ont.41.4%
  • Toronto, Ont.40.5%
  • Victoria, B.C.40.0%
  • Nanaimo, B.C.39.9%

National trend — supply up, vacancy up, rents still rising (CMHC)

2023

Vacancy rate1.5%
Average rent$1,373

2025

Vacancy rate3.1%
Average rent$1,550

Record purpose-built supply doubled the vacancy rate, yet average rent still climbed ~13% — supply slowed rent growth but did not reverse it.

04 / Findings

What the data says

Six headline findings carried into the Task 5 policy brief.

20.9% of households were cost-burdened in 2021

Down from 24.1% in 2016 — though part of the 2021 improvement was flattered by temporary pandemic income supports, noted as a caveat in the analysis.

Renters carry ~2.2× the burden of owners

Nationally 33.2% of renters vs 14.8% of owners spend 30%+ of income on shelter. The gap is a structural feature, not a regional quirk — it appears in every province, widest in Nova Scotia at 25 points.

BC and Ontario lead on core housing need

British Columbia (13.4%) and Ontario (12.1%) sit well above the 10.1% national line; Quebec (6.0%) and New Brunswick (6.2%) are lowest. Core need correlates strongly with shelter burden (r = 0.88).

Alberta is the only province where it got worse

Total burden fell in every province between 2016 and 2021 except Alberta (+0.3 pts), the lone increase in the country.

High-STIR zones are mid-size cities, not just big metros

Kelowna, Peterborough, Barrie, Oshawa, and Kingston top the renter-burden list — ahead of Toronto and Vancouver. This is the key regional-trend insight carried into the policy brief.

Record supply hasn't reversed rent growth

Purpose-built supply pushed national vacancy from 1.5% (2023) to 3.1% (2025), yet average rent still climbed from ~$1,373 to $1,550. Vancouver remains both the most expensive ($2,314 for a 2-bedroom) and the tightest (1.6% vacancy); Calgary, the loosest big market at 4.6%, still saw the fastest rent growth at +8.9%.

05 / Takeaways

Key learnings

What a 120-hour civic data project teaches about analytics for public policy.

  • Official data beats anecdote

    Restricting the analysis to Statistics Canada and CMHC sources — with full citations in SOURCES.md — made every claim defensible in front of a policy audience.

  • Feature engineering tells the story

    The raw tables never mention inequality; the engineered renter–owner gap and ratio columns are what turned a census extract into a structural-inequity finding.

  • Reproducibility is part of the deliverable

    All cleaning and charts live in versioned src/ modules (housing.py, charts.py), so every figure in the brief can be regenerated from the raw CSVs in one notebook run.

  • Caveats build credibility

    Flagging that pandemic income supports flattered the 2021 numbers kept the analysis honest and made the final brief more persuasive, not less.