spb/qwhpi Public
QHPI — Quebec Housing Price Index: quality-adjusted, hierarchically pooled housing price indexes.
Python 63.9%
TypeScript 25.4%
CSS 5.5%
TeX 3.5%
SQL 0.8%
Makefile 0.5%
Dockerfile 0.5%
1<!--2=============================================================================3QWHPI — Quebec Weekly Housing Price Index4Author : Simon-Pierre Boucher5Contact : contact@spboucher.ai6File : outputs/reports/audit_report.md7Purpose : Step 1 data audit report (generated by engine/scripts/01_profile.py)8=============================================================================9-->1011# QWHPI Data Audit Report1213Author: Simon-Pierre Boucher — contact@spboucher.ai1415## 1. Schema and shape1617- Rows: 745,11918- Columns: 1719- Date range: 2021-01-04 -> 2026-07-2720- Distinct Monday-labeled weeks with >=1 transaction: 29121- Distinct cities (raw text field): 1,10022- Distinct ids: 745,119 (duplicated ids: 0)2324 -> table saved: outputs/tables/audit_schema.csv (17 rows)2526## 2. Missingness2728 -> table saved: outputs/tables/audit_missingness.csv (17 rows)29- `buildingType`: 283,206 missing (38.01%)30- `ownerType`: 224,999 missing (30.2%)31- `yearBuilt`: 137,315 missing (18.43%)32- `floorArea`: 115,153 missing (15.45%)33- `previousValue`: 78,581 missing (10.55%)34- `zipCode`: 75,369 missing (10.12%)35- `totalArValue`: 63,160 missing (8.48%)36- `street`: 6,688 missing (0.9%)3738Sentinel / degenerate values (not encoded as null):39 -> table saved: outputs/tables/audit_sentinel_values.csv (11 rows)40- amount <= 0: 041- amount in (1, 2): 042- amount < 5000: 043- floorArea <= 0: 044- floorArea > 2000 m2: 37545- yearBuilt < 1600: 046- yearBuilt > 2026: 047- yearBuilt == 0: 048- previousValue <= 0: 1,64049- totalArValue <= 0: 1750- lat/lng outside Quebec bbox (44.9-62.7N, -79.8--57W): 05152## 3. Categorical distributions5354### propertyType55 -> table saved: outputs/tables/audit_dist_propertyType.csv (4 rows)56- unifamilial: 443,078 (59.46%)57- indéterminé: 107,656 (14.45%)58- condo: 100,218 (13.45%)59- plex: 94,167 (12.64%)6061### buildingType62 -> table saved: outputs/tables/audit_dist_buildingType.csv (6 rows)63- None: 283,206 (38.01%)64- single-story: 205,924 (27.64%)65- full-story: 188,584 (25.31%)66- mansard: 52,808 (7.09%)67- split-level: 8,743 (1.17%)68- single-wide: 5,854 (0.79%)6970### ownerType71 -> table saved: outputs/tables/audit_dist_ownerType.csv (4 rows)72- physical_person: 496,404 (66.62%)73- None: 224,999 (30.2%)74- legal_person: 22,351 (3.0%)75- mixed: 1,365 (0.18%)7677## 4. Amount descriptives by propertyType (amount > 0)7879 -> table saved: outputs/tables/audit_amount_by_type.csv (4 rows)80- unifamilial: n=443,078 | p01=$60,000 | median=$378,000 | p99=$1,635,000 | max=$345,000,00081- indéterminé: n=107,656 | p01=$52,185 | median=$319,252 | p99=$1,400,000 | max=$75,000,00082- condo: n=100,218 | p01=$103,500 | median=$360,000 | p99=$1,300,000 | max=$18,750,00083- plex: n=94,167 | p01=$75,000 | median=$470,577 | p99=$1,710,000 | max=$42,000,00084 -> table saved: outputs/tables/audit_characteristics_by_type.csv (4 rows)8586## 5. Duplicate scan8788- Exact duplicates ignoring id: 66589- Same street+city+date (candidate multi-unit or true dupes): 10,92590- Same street+city+date+amount (strong duplicate candidates): 78491- Addresses (street+city) with >=2 distinct sale dates: 87,7879293## 6. Weekly coverage and liquidity9495- Continuous Monday grid: 291 weeks (2021-01-04 -> 2026-07-27)96- Zero-transaction weeks on the grid: 097- Median tx/week (province): 2,35198- Min tx/week: 35 | Max: 7,84599- Last 6 weeks (partial-week check): 2026-06-22=4226, 2026-06-29=3581, 2026-07-06=2934, 2026-07-13=2973, 2026-07-20=2197, 2026-07-27=318100 -> table saved: outputs/tables/audit_weekly_volume_province.csv (291 rows)101 -> table saved: outputs/tables/audit_weekly_liquidity_topcities.csv (100 rows)102 -> table saved: outputs/tables/audit_liquidity_matrix.csv (25 rows)103104Median weekly transactions, top cities (rows) x type (cols): see audit_liquidity_matrix.csv105- {'city': 'Québec', 'condo': 41.5, 'indéterminé': 6.0, 'plex': 21.0, 'unifamilial': 66.0}106- {'city': 'Montréal', 'condo': 145.0, 'indéterminé': 39.0, 'plex': 80.0, 'unifamilial': 64.0}107- {'city': 'Gatineau', 'condo': 7.0, 'indéterminé': 12.0, 'plex': 12.0, 'unifamilial': 54.0}108- {'city': 'Laval', 'condo': 21.0, 'indéterminé': 8.0, 'plex': 8.0, 'unifamilial': 54.0}109- {'city': 'Sherbrooke', 'condo': 2.0, 'indéterminé': 6.0, 'plex': 7.0, 'unifamilial': 29.0}110- {'city': 'Longueuil', 'condo': 15.0, 'indéterminé': 10.0, 'plex': 9.0, 'unifamilial': 28.0}111- {'city': 'Lévis', 'condo': 4.0, 'indéterminé': 6.0, 'plex': 5.0, 'unifamilial': 26.0}112- {'city': 'Saguenay', 'condo': 2.0, 'indéterminé': 4.0, 'plex': 8.0, 'unifamilial': 26.0}113- {'city': 'Trois-Rivières', 'condo': 2.0, 'indéterminé': 5.0, 'plex': 8.0, 'unifamilial': 23.0}114- {'city': 'Terrebonne', 'condo': 3.0, 'indéterminé': 6.0, 'plex': 3.0, 'unifamilial': 22.0}115- {'city': 'Saint-Jean-sur-Richelieu', 'condo': 2.0, 'indéterminé': 4.0, 'plex': 3.0, 'unifamilial': 18.0}116- {'city': 'Drummondville', 'condo': 1.0, 'indéterminé': 3.0, 'plex': 4.0, 'unifamilial': 16.0}117118- Top 50 city strings cover 61.4% of transactions119 -> table saved: outputs/tables/audit_city_top200.csv (200 rows)120121## 7. `indéterminé` property type — preliminary look122123- Count: 107,656 (14.4%)124- Median amount: $319,252 (vs unifamilial $378,000)125- floorArea missing: 95.6% | yearBuilt missing: 95.2% | buildingType missing: 97.9%126- Top buildingType values within indéterminé: None=105,377, single-story=1,089, mansard=601, full-story=557, single-wide=26, split-level=6127- ownerType within indéterminé: None=73,911, physical_person=20,620, legal_person=12,657, mixed=468128