SPB Git

spb/wp10_uqo Public

UQO Working Paper No. 10 — The assessment gap in Quebec: vertical and horizontal inequity in municipal property assessment.

TeX 55.9% Python 44%
9.6 KB

# ⚖️ The Assessment Gap in Quebec

UQO Working Paper No. 10Vertical and Horizontal Inequity in Municipal Property Valuation: Evidence from 522,769 Sales Matched to the Assessment Roll

Paper Python Data Estimation Reproducible Institution Author Contact

TL;DR — Matching 522,769 Quebec residential sales (2021–2026) to the triennial assessment rolls that tax them, this paper delivers the first province-wide audit of property-assessment equity in Canada. Within the same municipality × roll × year, the elasticity of the assessment ratio w.r.t. price is −0.34 (Cheng FE) and still −0.08 under Clapp's measurement-error-robust IV. 99% of municipalities fail the IAAO uniformity standard, 95% fail its vertical-equity standard — Montréal is the lone progressive large market. The median dwelling in the bottom local price decile pays ~65% more property tax than uniform assessment would imply; the top decile pays ~5% less.


# 📖 Table of contents

  1. What this paper does
  2. Headline results
  3. Repository layout
  4. Quick start
  5. The pipeline, step by step
  6. Data
  7. Methodology
  8. Figures & tables inventory
  9. Limitations
  10. Citation
  11. Author & contact

# 🎯 What this paper does

Quebec taxes every dwelling in proportion to its assessed value, redrawn on a triennial roll whose values must, by statute (art. 46 LFM), reflect market conditions at a single reference date. If assessments are regressive — cheap homes overvalued relative to expensive ones — the effective tax rate falls with wealth, silently. This project measures that gap at province scale:

text
ln AV_i = α_c(i) + β · ln SP_i + ε_i      (c = municipality × roll × sale-year)
  • γ = β − 1 is the elasticity of the assessment ratio w.r.t. price (γ < 0 ⇒ regressive), identified within 2,884 market-timing cells;
  • the Clapp (1990) rank IV purges the attenuation bias that pushes naïve ratio studies toward spurious regressivity;
  • the full IAAO ratio-study battery (median ratio, COD, PRD, PRB) with bootstrap CIs is computed for every municipality with ≥ 100 usable sales;
  • quantile profiles, subgroup elasticities, horizontal-dispersion regressions and an exact intra-municipal tax-shift calculation complete the audit.

# 🏆 Headline results

Object Estimate
Cheng elasticity, pooled OLS β = 0.812 (0.029)
Cheng elasticity, cell FE β = 0.656 (0.029) → γ = −0.344
Clapp rank-IV (error-robust) β = 0.917 (0.021) → γ = −0.083
Quantile profile β(τ), τ = .10 → .90 0.87 → 0.49 (failure concentrated at the top)
Province-wide PRB (2021 / 2024) −0.104 / −0.002 (staleness mechanism)
Municipalities with PRB < 0 99% (95% below IAAO band)
Median municipality COD 26 (IAAO ceiling: 15)
Excess tax, bottom ↔ top local decile +65% ↔ −5% (median)
The exception Montréal: PRB +0.07, progressive in all 6 years

Sub-group anatomy: condos γ = −0.12 vs single-family −0.45 / plex −0.49; land share > 0.4 → −0.50; age > 60 y → −0.43; large markets (>10k sales) −0.27.

# 🗂 Repository layout

text
wp10_uqo/
├── data/
│   ├── raw/                  # matched sales–roll snapshot (see data/raw/README.md)
│   └── processed/            # analysis.parquet (built by step 01)
├── src/wp10/                 # reusable package
│   ├── config.py             # paths, thresholds, constants
│   ├── sample.py             # sample construction & variable definitions
│   ├── iaao.py               # COD / PRD / PRB + bootstrap CIs
│   ├── models.py             # Cheng FE, Clapp IV, quantiles, horizontal, tax shift
│   └── plotstyle.py          # journal-calibre matplotlib style (validated palette)
├── scripts/                  # the pipeline, in order
│   ├── 01_build_sample.py
│   ├── 02_iaao_stats.py
│   ├── 03_estimate_regressions.py
│   ├── 04_make_figures.py
│   └── 05_make_tables.py
├── results/
│   ├── reproduced/           # every CSV the scripts emit
│   └── tables/               # LaTeX tables input by the paper
├── figures/                  # 10 publication figures (PNG, 300 dpi)
└── paper/                    # main.tex + sections/ + references.bib → main.pdf

# 🚀 Quick start

bash
cd wp10_uqo
python3 -m pip install -r requirements.txt

# place the parquet snapshot in data/raw/ (see data/raw/README.md), then:
python3 scripts/01_build_sample.py         # 745,119 → 522,769 sales
python3 scripts/02_iaao_stats.py           # IAAO diagnostics + bootstrap
python3 scripts/03_estimate_regressions.py # FE / IV / quantile / heterogeneity / tax shift
python3 scripts/04_make_figures.py         # 10 figures
python3 scripts/05_make_tables.py          # 10 LaTeX tables

cd paper && make                           # compile main.pdf (latexmk)

Total runtime ≈ 5 minutes on an Apple-silicon laptop; peak RAM ≈ 6 GB.

# 🗃 Data

745,119 residential-market transactions (Jan 2021 – Jul 2026) matched at the parcel level to the assessment roll in force at the sale date (median match distance 0.6 m; every retained sale reproduces the roll value exactly). From the roll: total/land/building assessed values, lot & floor areas, year built, unit count, CUBF use code, roll vintage and the statutory market-condition date. Sample cascade (details in the paper, §4): residential CUBF → match quality → valid AV/SP → 1/99% ratio trim within roll vintage → cells ≥ 20 sales ⇒ 522,769 sales, 625 municipalities, 2,884 cells.

# 🔬 Methodology

  1. IAAO diagnostics (Standard on Ratio Studies, 2013) within municipality × sale-year blocks, aggregated by median — COD, PRD, PRB with percentile-bootstrap CIs (src/wp10/iaao.py).
  2. Cheng (1974) log-log regression with 2,884 absorbed fixed effects (linearmodels AbsorbingLS), SEs clustered on 625 municipalities.
  3. Clapp (1990) rank IV — Z ∈ {−1,0,+1} from within-cell rank agreement of ln AV and ln SP, 2SLS on demeaned data (IV2SLS) — the conservative bound.
  4. Quantile regressions on within-cell demeaned data (τ = .10….90).
  5. Heterogeneity: separate FE estimates by class, age, land share, roll lag, municipality size, sale year.
  6. Horizontal inequity: |ln r − cell median| regressed on characteristics.
  7. Tax shift: r / cell-median − 1 by within-cell price decile — exact % over/under-payment under Quebec's exemption-free ad valorem rule.

# 🖼 Figures & tables inventory

Figure Content
fig_ratio_dist ratio distribution + by roll lag (Panels A/B)
fig_time median ratio by month × roll vintage (staleness drift)
fig_binscatter within-cell ln ratio vs ln price, 20 bins — the core fact
fig_quantile β(τ) profile with FE/IV benchmarks
fig_heterogeneity forest plot of subgroup γ
fig_prb_muni, fig_cod municipal PRB / COD distributions vs IAAO bands
fig_map province map of municipal PRB (Montréal exception)
fig_taxshift excess tax burden by local price decile
fig_robustness γ_FE vs γ_IV across 10 sample variants

Tables (results/tables/*.tex): summary stats, IAAO province-wide, ten largest markets, vertical regressions, quantiles, heterogeneity, horizontal, tax shift, robustness, Paglin–Fogarty.

# ⚠️ Limitations

  • Sales < $50k absent from the source registry; residual non-arm's-length transfers may survive screens (bottom-decile shift = upper bound).
  • 2021–2026 is an unusually turbulent market — levels statistics are period-specific (the within-market elasticity is not).
  • No appeals, renovations, or owner demographics observed.
  • Montréal's progressivity may partly reflect borough-level composition.

# 📝 Citation

bibtex
@techreport{boucher2026assessmentgap,
  author      = {Boucher, Simon-Pierre},
  title       = {The Assessment Gap in Quebec: Vertical and Horizontal Inequity
                 in Municipal Property Valuation},
  institution = {Universit\'e du Qu\'ebec en Outaouais,
                 D\'epartement des sciences administratives},
  type        = {Working Paper},
  number      = {10},
  year        = {2026},
  month       = {August}
}

# 👤 Author & contact

Simon-Pierre Boucher — Département des sciences administratives, Université du Québec en Outaouais (UQO), Gatineau, QC. 📧 contact@spboucher.ai