# ⚖️ The Assessment Gap in Quebec **UQO Working Paper No. 10** — *Vertical and Horizontal Inequity in Municipal Property Valuation: Evidence from 522,769 Sales Matched to the Assessment Roll* [![Paper](https://img.shields.io/badge/paper-PDF%20(29%20p.)-b31b1b?logo=latex&logoColor=white)](paper/main.pdf) [![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](requirements.txt) [![Data](https://img.shields.io/badge/data-745%2C119%20matched%20sales%20·%20parquet-4051b5)](data/raw/README.md) [![Estimation](https://img.shields.io/badge/estimation-statsmodels%20·%20linearmodels%20(AbsorbingLS%20%2B%20IV2SLS)-4051b5)](src/wp10/models.py) [![Reproducible](https://img.shields.io/badge/reproducible-end--to--end%20pipeline-2e7d32)](scripts/) [![Institution](https://img.shields.io/badge/UQO-D%C3%A9pt.%20des%20sciences%20administratives-16365c)](https://uqo.ca) [![Author](https://img.shields.io/badge/author-Simon--Pierre%20Boucher-16365c)](mailto:contact@spboucher.ai) [![Contact](https://img.shields.io/badge/contact-contact%40spboucher.ai-a02020?logo=maildotru&logoColor=white)](mailto:contact@spboucher.ai) > **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](#-what-this-paper-does) 2. [Headline results](#-headline-results) 3. [Repository layout](#-repository-layout) 4. [Quick start](#-quick-start) 5. [The pipeline, step by step](#-the-pipeline-step-by-step) 6. [Data](#-data) 7. [Methodology](#-methodology) 8. [Figures & tables inventory](#-figures--tables-inventory) 9. [Limitations](#-limitations) 10. [Citation](#-citation) 11. [Author & contact](#-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: ``` 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 ``` 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](mailto:contact@spboucher.ai)