SPB Git

spb/wp5_uqo

Public

UQO Working Paper No. 5 — Airbnb, residential rents and housing market pressure.

harmonisation standard UQO WP (2026-10-17)

Page titre du gabarit, natbib + aer, docs/ pour les rapports d'audit, README au standard (Status, citation WP 5), .gitignore et Makefile/.latexmkrc du gabarit, main.pdf recompilé.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Oct 17, 2026) parent 29cbe13 Browse files

11 changed files +172 −290

modified .gitignore +28 −9
@@ -1,16 +1,18 @@
1−# Author: Simon-Pierre Boucher — contact@spboucher.ai 1+# Raw & processed data — never committed (see data/raw/README.md for provenance)
2+data/raw/*
3+!data/raw/README.md
4+data/processed/*
5+!data/processed/.gitkeep
6+
7+# Python
2 __pycache__/ 8 __pycache__/
3 *.pyc 9 *.pyc
4−.DS_Store 10+.pytest_cache/
5− 11+.venv/
6−# Raw data is not distributed 12+*.egg-info/
7−data/raw/*.csv
8−data/raw/*.json
9 13
10−# LaTeX build artifacts 14+# LaTeX build artifacts (paper/main.pdf IS committed)
11 paper/*.aux 15 paper/*.aux
12−paper/*.bbl
13−paper/*.blg
14 paper/*.log 16 paper/*.log
15 paper/*.out 17 paper/*.out
16 paper/*.toc 18 paper/*.toc
@@ -18,4 +20,21 @@ paper/*.lof
18 paper/*.lot 20 paper/*.lot
19 paper/*.fls 21 paper/*.fls
20 paper/*.fdb_latexmk 22 paper/*.fdb_latexmk
23+paper/*.bbl
24+paper/*.blg
25+paper/*.spl
21 paper/*.synctex.gz 26 paper/*.synctex.gz
27+paper/*.run.xml
28+paper/*.bcf
29+
30+# Logs
31+logs/
32+*.log
33+
34+# macOS
35+.DS_Store
36+
37+# Project-specific: processed parquets ARE committed; raw scraped files are not
38+!data/processed/*
39+data/raw/*.csv
40+data/raw/*.json
modified README.md +133 −266
@@ -1,192 +1,93 @@
1−<!-- Author: Simon-Pierre Boucher — contact@spboucher.ai --> 1+<!-- Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca -->
2− 2+# 🏠 Airbnb, Residential Rents, and Housing Market Pressure
3−<div align="center"> 3+
4− 4+**UQO Working Paper No. 5** — *A Hedonic and Spatial Econometric Analysis*
5−# 🏠 Airbnb, Residential Rents & Housing Market Pressure 5+
6− 6+[![Paper](https://img.shields.io/badge/paper-PDF%20(51%20p.)-b31b1b?logo=latex&logoColor=white)](paper/main.pdf)
7−### *A Hedonic and Spatial Econometric Analysis* 7+[![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](requirements.txt)
8− 8+[![Data](https://img.shields.io/badge/data-8%2C303%20rentals%20·%203%2C456%20Airbnb%20·%20parquet-4051b5)](data/raw/README.md)
9−**UQO Working Paper No. 5** 9+[![Estimation](https://img.shields.io/badge/estimation-OLS%20HC1%20·%20SAR%2FSEM%20GMM%20·%20QuantReg%20·%20ML-4051b5)](src/)
10− 10+[![Reproducible](https://img.shields.io/badge/reproducible-end--to--end%20pipeline-2e7d32)](scripts/)
11−<br> 11+[![Institution](https://img.shields.io/badge/UQO-D%C3%A9pt.%20des%20sciences%20administratives-16365c)](https://uqo.ca)
12− 12+[![Author](https://img.shields.io/badge/author-Simon--Pierre%20Boucher-16365c)](mailto:simon-pierre.boucher@uqo.ca)
13−[![Author](https://img.shields.io/badge/Author-Simon--Pierre%20Boucher-1f6feb?style=for-the-badge)](mailto:contact@spboucher.ai) 13+
14−[![Institution](https://img.shields.io/badge/UQO-Sciences%20administratives-00457C?style=for-the-badge)](https://uqo.ca) 14+> **TL;DR** — Using cross-sectional microdata on **3,456 Airbnb listings** and **8,303 residential rental listings** in
15−[![Contact](https://img.shields.io/badge/✉️-contact%40spboucher.ai-EA4335?style=for-the-badge)](mailto:contact@spboucher.ai) 15+> Quebec, the paper measures the conditional association between nearby short-term-rental activity and monthly rents in
16− 16+> a hedonic framework augmented with spatial econometrics. Each additional Airbnb listing within **500 m** is associated
17−<br> 17+> with **≈ +0.4 %** monthly rent (0.3–0.5 % across specifications, ≈ $6–10/month at the median), decaying with distance,
18− 18+> stronger at the top of the rent distribution (β(τ = 0.90) = 0.0047), and surviving SAR/SEM spatial models
19−**— The paper at a glance —** 19+> (ρ̂ = 0.137***), city-clustered SEs and leave-one-city-out checks. Cross-sectional associations, not causal effects.
20−
21−[![PDF](https://img.shields.io/badge/📄_PDF-51_pages-success?style=flat-square)](paper/main.pdf)
22−[![References](https://img.shields.io/badge/📚_References-56_(all_DOI--verified)-blueviolet?style=flat-square)]()
23−[![Sample](https://img.shields.io/badge/🏘️_Sample-8,303_rentals_·_3,456_Airbnb-informational?style=flat-square)]()
24−[![Headline](https://img.shields.io/badge/β-%2B0.4%25_rent_per_listing_(500m)-e63946?style=flat-square)]()
25−[![Tables](https://img.shields.io/badge/📊-13_tables-teal?style=flat-square)]()
26−[![Figures](https://img.shields.io/badge/📈-16_figures-teal?style=flat-square)]()
27−[![Build](https://img.shields.io/badge/latexmk-0_unresolved_refs-brightgreen?style=flat-square)]()
28−
29−**— Methods —**
30−
31−[![OLS](https://img.shields.io/badge/Hedonic-OLS_·_HC1_·_city_FE-orange?style=flat-square)]()
32−[![Spatial](https://img.shields.io/badge/Spatial-SAR_·_SEM_·_GMM_(spreg)-8A2BE2?style=flat-square)]()
33−[![Quantile](https://img.shields.io/badge/Quantile-τ_∈_{.10….90}-c44536?style=flat-square)]()
34−[![ML](https://img.shields.io/badge/ML-LASSO_·_ENet_·_RF_·_GBM_·_SHAP-F7931E?style=flat-square)]()
35−[![Geo](https://img.shields.io/badge/Geospatial-Haversine_buffers_250m→2km-2a9d8f?style=flat-square)]()
36−
37−**— Stack —**
38−
39−[![Python](https://img.shields.io/badge/Python-3.14-3776AB?style=flat-square&logo=python&logoColor=white)](https://www.python.org/)
40−[![pandas](https://img.shields.io/badge/pandas-3.0.2-150458?style=flat-square&logo=pandas&logoColor=white)](https://pandas.pydata.org/)
41−[![statsmodels](https://img.shields.io/badge/statsmodels-0.14.6-4051B5?style=flat-square)](https://www.statsmodels.org/)
42−[![scikit-learn](https://img.shields.io/badge/scikit--learn-1.6.1-F7931E?style=flat-square&logo=scikitlearn&logoColor=white)](https://scikit-learn.org/)
43−[![PySAL](https://img.shields.io/badge/PySAL%2Fspreg-1.9.0-8A2BE2?style=flat-square)](https://pysal.org/)
44−[![SHAP](https://img.shields.io/badge/SHAP-0.48.0-FF4081?style=flat-square)](https://shap.readthedocs.io/)
45−[![LaTeX](https://img.shields.io/badge/LaTeX-latexmk-008080?style=flat-square&logo=latex&logoColor=white)](https://www.latex-project.org/)
46−
47−**— Quality —**
48−
49−[![Reproducible](https://img.shields.io/badge/pipeline-100%25_reproducible-brightgreen?style=flat-square)]()
50−[![Verified](https://img.shields.io/badge/tables-14%2F16_byte--identical_to_originals-brightgreen?style=flat-square)]()
51−[![Deterministic](https://img.shields.io/badge/seed-42_·_deterministic-lightgrey?style=flat-square)]()
52−[![Status](https://img.shields.io/badge/status-working_paper_v1.0-blue?style=flat-square)]()
53−
54−</div>
55−
56−---
57−
58−## 🧭 Navigation
59−
60−| | | |
61−|---|---|---|
62−| [📜 The Paper](#-the-paper) | [🔍 Abstract](#-abstract) | [📖 Inside the Paper](#-inside-the-paper--section-by-section) |
63−| [🏆 Headline Results](#-headline-results) | [📁 Repository Map](#-repository-map) | [💾 Data](#-data) |
64−| [⚙️ Pipeline](#️-analysis-pipeline) | [📐 Models](#-econometric-models) | [🛡️ Robustness](#️-robustness-programme) |
65−| [🚀 Reproduce](#-reproducing-everything) | [🧰 Environment](#-environment--dependencies) | [✅ Provenance](#-verification--provenance) |
66−| [📖 Citation](#-citation) | [📬 Contact](#-contact) | |
67−
68−---
69−
70−## 📜 The Paper
71−
72−<div align="center">
73−
74−> ### **Airbnb, Residential Rents, and Housing Market Pressure:**
75−> ### **A Hedonic and Spatial Econometric Analysis**
76−>
77−> **Simon-Pierre Boucher** — Université du Québec en Outaouais
78−> *UQO Working Paper No. 5 · May 2026 · 51 pages · 56 references*
79−>
80−> [![Read](https://img.shields.io/badge/▶_READ_THE_PAPER-paper%2Fmain.pdf-b31b1b?style=for-the-badge)](paper/main.pdf)
81−
82−</div>
83−
84−## 🔍 Abstract
85−
86−> This paper investigates the relationship between **Airbnb short-term rental activity** and **residential rents** in Quebec, Canada. Using cross-sectional microdata comprising ~5,000 Airbnb listings and ~8,300 rental listings, we employ a **hedonic pricing framework** augmented with **spatial econometric techniques** to quantify the conditional association between nearby Airbnb presence and monthly rents. For each rental listing we construct Airbnb exposure measures within **250 m, 500 m, 1 km, and 2 km buffers** using Haversine distances. Baseline estimates indicate that an additional Airbnb listing within 500 m is associated with a statistically significant increase in monthly rent of approximately **0.3–0.5%**, controlling for dwelling characteristics, building type, and city fixed effects. **Quantile regressions** reveal that the association is stronger at the upper tail of the rent distribution. A complementary hedonic model of Airbnb nightly prices indicates that short-term rental pricing is driven primarily by listing characteristics. Robustness checks — alternative buffer radii, subsample analyses, and machine-learning benchmarks — confirm the stability of the rent–exposure association. We discuss policy implications for housing affordability and short-term rental regulation, while cautioning that **cross-sectional associations should not be interpreted as causal effects**.
87−>
88−> **Keywords:** Airbnb · short-term rentals · housing rents · hedonic pricing · spatial econometrics · housing affordability · Quebec
89−> **JEL:** R21 · R31 · L83 · C21
90 20
91 --- 21 ---
92 22
93−## 📖 Inside the Paper — Section by Section 23+## 📌 Status
94 24
95−| § | Section | What it delivers | Key exhibits | 25+| Item | Value |
96−|:-:|---|---|---| 26+|---|---|
97−| **1** | 🎬 **Introduction** | Motivation, the P2P-platform housing channel, the Canadian evidence gap, magnitude preview vs. Berlin/LA quasi-experiments, three contributions | — | 27+| Version | 1.0 (May 2026) — cover page harmonised to the UQO WP standard, October 2026 |
98−| **2** | 📚 **Literature Review** | 10 thematic subsections: correlational → quasi-experimental STR evidence, Canadian & Quebec studies, P2P economics, STR pricing, hedonic theory, spatial econometrics, quantile methods, ML in housing, tourism gentrification & regulation, gap statement | 56 refs | 28+| SSRN | Abstract ID **7626658** (submitted 2026-10-17, preliminary upload) |
99−| **3** | 💾 **Data** | Two scraped microdatasets, cleaning protocol, **Haversine spatial buffer merge** (6 exposure metrics × 4 radii), summary statistics, geography | Tables 1–2 · Figures 1–3 | 29+| Journal | not yet submitted |
100−| **4** | 📐 **Methodology** | Six models: hedonic rent (1a–1e), Airbnb pricing (2a–2c), city-level (3), SAR/SEM via Kelejian–Prucha GMM (4), quantile (5), ML benchmark (6); identification & endogeneity discussion | Equations 1–6 | 30+| Code & data | steps 04–11 and the paper fully reproducible from the committed parquets; raw scraped files not redistributed |
101−| **5** | 📊 **Results** | β = 0.0039*** per nearby listing; spatial dependence (ρ̂ = 0.137***, λ̂ = 0.539); quantile gradient .0037→.0047; superhost *discount*; RF test R² = 0.71 | Tables 3–9 · Figures 4–7 |
102−| **6** | 🛡️ **Robustness** | Buffer decay, alternative exposures, subsamples, trimming, **city-clustered SEs**, size control, log form, **ring decomposition**, **leave-one-city-out** | Tables 10–12 · Figures 8–10 |
103−| **7** | 💬 **Discussion** | Magnitudes benchmarked against Berlin ($6–10 ≈ 7–13 €/listing), LA & Boston; two candid disagreements with the literature; policy for CITQ/Montreal zoning; 7 limitations; future work | — |
104−| **8** | 🎯 **Conclusion** | Five findings, cross-design corroboration, no overselling | — |
105−| **A–C** | 📎 **Appendices** | Variable dictionary, city-name standardisation, sample attrition · Haversine & KNN-weights formulas, estimator details · supplementary robustness | Tables A1–A2 |
106 31
107−--- 32+## 🎯 What this paper does
108 33
109−## 🏆 Headline Results 34+Peer-to-peer platforms can divert dwellings from the long-term rental stock and raise rents nearby. Quasi-experimental
35+evidence exists for Berlin, Los Angeles or Boston, but Canadian evidence is thin. For every rental listing the paper
36+builds Airbnb exposure measures within 250 m, 500 m, 1 km and 2 km buffers (Haversine distances) — count, density, mean
37+nightly price, entire-home share, mean rating, superhost share — and estimates:
110 38
111−<div align="center"> 39+```
40+log(rent_i) = α + β · airbnb_count_500m_i + X_i'γ + building-type + city FE + ε_i (Models 1a–1e)
41+```
112 42
113−[![F1](https://img.shields.io/badge/1-%2B0.4%25_rent_per_Airbnb_listing_within_500m-e63946?style=for-the-badge)]() 43+complemented by a hedonic model of Airbnb nightly prices (Models 2a–2c), city-level forward and reverse regressions
114−[![F2](https://img.shields.io/badge/2-Spatial_decay:_0.93%25_→_0.06%25_(250m_→_2km)-f4a261?style=for-the-badge)]() 44+(153 cities), SAR/SEM spatial models estimated by Kelejian–Prucha GMM, quantile regressions and a machine-learning
115−[![F3](https://img.shields.io/badge/3-Strongest_at_the_top:_β(τ=.90)=0.0047-e9c46a?style=for-the-badge)]() 45+benchmark. The discussion benchmarks magnitudes against the quasi-experimental literature and draws policy implications
116−[![F4](https://img.shields.io/badge/4-Survives_SAR%2FSEM_(ρ̂=0.137***)-2a9d8f?style=for-the-badge)]() 46+for CITQ registration and Montreal zoning, while cautioning against causal readings.
117−[![F5](https://img.shields.io/badge/5-No_city--rent_premium_in_nightly_prices-264653?style=for-the-badge)]()
118−[![F6](https://img.shields.io/badge/6-Stable_in_leave--one--city--out_(incl._Montreal)-6d597a?style=for-the-badge)]()
119 47
120−</div> 48+## 🏆 Headline results
121 49
122 | # | Finding | Evidence | 50 | # | Finding | Evidence |
123 |:-:|---|---| 51 |:-:|---|---|
124−| 1 | Each additional Airbnb listing within **500 m** ⇒ **≈ +0.4%** monthly rent (0.3–0.5% across specs) — ≈ **$6–10/month** at the median rent, the same order as Berlin's quasi-experimental 7–13 €/listing | Table 3 (1c) · §7.1 | 52+| 1 | Each additional Airbnb listing within 500 m ⇒ ≈ +0.4 % monthly rent (β = 0.0039***) | Table 3 (1c) · §7.1 |
125−| 2 | Per-listing association **decays monotonically with distance** | Table 10 · Fig. 4 | 53+| 2 | The per-listing association decays monotonically with distance (0.93 % at 250 m → 0.06 % at 2 km) | Table 10 · Fig. 4 |
126−| 3 | Significant at **every quantile**, rising to **0.0047 at τ = 0.90** (~25% above OLS) | Table 7 · Fig. 5 | 54+| 3 | Significant at every quantile, rising to 0.0047 at τ = 0.90 (~25 % above OLS) | Table 7 · Fig. 5 |
127−| 4 | **Spatial dependence is substantial** and the coefficient survives GMM spatial models with mild attenuation (0.0034) | Table 6 | 55+| 4 | Substantial spatial dependence (ρ̂ = 0.137***, λ̂ = 0.539); coefficient survives GMM spatial models (0.0034) | Table 6 |
128−| 5 | Airbnb nightly prices driven by **listing characteristics**; superhost enters with a *discount* (vs. premia in prior work — discussed, not hidden) | Table 4 · §7.1 | 56+| 5 | Airbnb nightly prices driven by listing characteristics; superhost enters with a *discount* | Table 4 · §7.1 |
129−| 6 | Robust to **city-clustered SEs** (tighter than HC1), size control, log(1+count), ring decomposition, trimming, and dropping any of the 8 largest cities | Table 12 · Fig. 9 | 57+| 6 | Robust to city-clustered SEs, size control, log(1 + count), ring decomposition, trimming, leave-one-city-out (0.0038–0.0040) | Table 12 · Fig. 9 |
130−
131−---
132 58
133−## 📁 Repository Map 59+## 🗂 Repository layout
134 60
135 ``` 61 ```
136 wp5_uqo/ 62 wp5_uqo/
137−├── 📄 README.md ← you are here 63+├── README.md
138−├── 🔎 AUDIT.md ← forensic audit of the original project 64+├── requirements.txt # pinned dependencies
139−├── 📝 CHANGES.md ← restructuring & rewrite log 65+├── docs/ # AUDIT.md · CHANGES.md · PAPER_REVIEW.md · UPGRADE_REPORT.md
140−├── 🧪 PAPER_REVIEW.md ← pre-upgrade critical assessment
141−├── 📚 UPGRADE_REPORT.md ← literature expansion report (per-ref justification)
142−├── 📦 requirements.txt ← pinned dependencies
143−│
144 ├── data/ 66 ├── data/
145−│ ├── raw/ ← airbnb.csv + rent.json (NOT distributed → README) 67+│ ├── raw/ # airbnb.csv + rent.json — NOT distributed (see data/raw/README.md)
146−│ └── processed/ ← 5 verified parquet datasets (committed) 68+│ └── processed/ # 5 verified parquet datasets (committed)
147−│ 69+├── src/
148−├── src/ ← shared modules 70+│ ├── config.py # all paths & constants
149−│ ├── config.py ← all paths & constants 71+│ ├── geo.py # vectorised Haversine matrix
150−│ ├── geo.py ← vectorised Haversine matrix 72+│ ├── latex_tables.py # stargazer-style table builder
151−│ ├── latex_tables.py ← stargazer-style table builder 73+│ └── plotting.py # publication matplotlib styles
152−│ └── plotting.py ← publication matplotlib styles 74+├── scripts/ # 01 → 11 numbered pipeline
153−│ 75+├── figures/ # 16 publication PDF figures
154−├── scripts/ ← 01 → 11 numbered pipeline 76+├── results/tables/ # 13 LaTeX fragments + 4 CSVs
155−├── figures/ ← 16 publication PDF figures 77+├── results/logs/ # data-inspection log
156−├── results/tables/ ← 13 LaTeX fragments + 4 CSVs 78+└── paper/ # main.tex + sections/ + appendix/ + references.bib → main.pdf
157−├── results/logs/ ← data-inspection log
158−│
159−└── paper/ ← LaTeX → 📄 main.pdf (51 pages)
160− ├── main.tex · references.bib (56 entries) · Makefile
161− ├── sections/ (titlepage + 8 sections)
162− └── appendix/ (data · methods · robustness)
163 ``` 79 ```
164 80
165−--- 81+## 🚀 Quick start
166−
167−## 💾 Data
168−
169−<div align="center">
170 82
171−[![Airbnb](https://img.shields.io/badge/Airbnb-3,456_cleaned_listings-FF5A5F?style=flat-square&logo=airbnb&logoColor=white)]() 83+```bash
172−[![Realtor](https://img.shields.io/badge/Realtor.ca-8,303_cleaned_rentals-006AFF?style=flat-square)]() 84+python3 -m pip install -r requirements.txt
173−[![Merge](https://img.shields.io/badge/Spatial_merge-24_exposure_variables-2a9d8f?style=flat-square)]()
174−[![Coverage](https://img.shields.io/badge/Coverage-Province_of_Quebec-1d3557?style=flat-square)]()
175−
176−</div>
177−
178−| Dataset | Source | Raw → Clean | Key fields |
179−|---|---|---|---|
180−| 🛏️ Airbnb listings | Airbnb (scraped) | ~5,000 → **3,456** | nightly price, lat/lon, property type, rating, reviews, superhost |
181−| 🏢 Rental listings | Realtor.ca (scraped) | 8,356 → **8,303** | monthly rent, lat/lon, bedrooms, bathrooms, building type, size |
182−
183−**Spatial merge** — for every rental listing × radius *r* ∈ {250 m, 500 m, 1 km, 2 km}, six metrics computed against all Airbnb listings via chunked vectorised Haversine distances: `count` · `density` · `mean_price` · `share_entire_home` · `mean_rating` · `superhost_share`, plus city-level aggregates.
184−
185−> 🔒 Raw files are **not distributed** (`data/raw/README.md`). The committed parquets make steps 04–11 and the paper fully reproducible without them.
186 85
187−--- 86+# steps 01–03 need data/raw/ (not distributed); steps 04–11 run from the committed parquets
87+for s in scripts/0{4..9}_*.py scripts/1{0,1}_*.py; do python3 "$s"; done
188 88
189−## ⚙️ Analysis Pipeline 89+cd paper && make # latexmk → main.pdf (51 pages)
90+```
190 91
191 | Step | Script | Produces | ⏱ | 92 | Step | Script | Produces | ⏱ |
192 |:-:|---|---|:-:| 93 |:-:|---|---|:-:|
@@ -202,119 +103,85 @@ wp5_uqo/
202 | 10 | `10_robustness_tables_figures.py` | outlier/subsample tables + 3 figures | ⚡ | 103 | 10 | `10_robustness_tables_figures.py` | outlier/subsample tables + 3 figures | ⚡ |
203 | 11 | `11_extended_robustness.py` | clustered SEs · ring · leave-one-out | ~1 min | 104 | 11 | `11_extended_robustness.py` | clustered SEs · ring · leave-one-out | ~1 min |
204 105
205−<sub>⚡ = under 15 s on Apple Silicon. Everything reads/writes through `src/config.py`; fully deterministic (seed 42).</sub> 106+⚡ = under 15 s on Apple Silicon. Fully deterministic (seed 42).
206−
207−---
208−
209−## 📐 Econometric Models
210−
211−| Model | Specification | Estimator |
212−|:-:|---|---|
213−| **1a–1e** | `log_rent ~ airbnb_count_500m + X + building type [+ city FE]`; variants: density, entire-home share | OLS · HC1 |
214−| **2a–2c** | `log_price ~ mean_rent_city + listing controls [+ city FE]` | OLS · HC1 |
215−| **3** | city-level forward & reverse regressions (153 cities) | OLS · HC1 |
216−| **4** | SAR & SEM, KNN(k=5) row-standardised weights | GMM — `GM_Lag` / `GM_Error` (Kelejian–Prucha) |
217−| **5** | quantile regressions, τ ∈ {.10, .25, .50, .75, .90} + fine grid | IRLS (statsmodels) |
218−| **6** | OLS / LASSO / ENet / RF / GBM, 80/20 split, SHAP attribution | scikit-learn |
219−
220−---
221−
222−## 🛡️ Robustness Programme
223−
224−<div align="center">
225−
226−[![R1](https://img.shields.io/badge/☑-4_buffer_radii-2a9d8f?style=flat-square)]()
227−[![R2](https://img.shields.io/badge/☑-alternative_exposures-2a9d8f?style=flat-square)]()
228−[![R3](https://img.shields.io/badge/☑-4_subsamples-2a9d8f?style=flat-square)]()
229−[![R4](https://img.shields.io/badge/☑-outlier_trims-2a9d8f?style=flat-square)]()
230−[![R5](https://img.shields.io/badge/☑-city--clustered_SEs-2a9d8f?style=flat-square)]()
231−[![R6](https://img.shields.io/badge/☑-size_control-2a9d8f?style=flat-square)]()
232−[![R7](https://img.shields.io/badge/☑-log(1%2Bcount)-2a9d8f?style=flat-square)]()
233−[![R8](https://img.shields.io/badge/☑-ring_decomposition-2a9d8f?style=flat-square)]()
234−[![R9](https://img.shields.io/badge/☑-leave--one--city--out-2a9d8f?style=flat-square)]()
235−
236−</div>
237−
238−The Airbnb coefficient stays **positive and significant at 1%** in every single check; the leave-one-city-out range is 0.0038–0.0040 — excluding Montreal (half the sample) barely moves it.
239−
240−---
241−
242−## 🚀 Reproducing Everything
243−
244−```bash
245−git clone https://github.com/spboucher-ai/wp5_uqo.git && cd wp5_uqo
246−python3 -m pip install -r requirements.txt
247−
248−# full pipeline (steps 01–03 optional: need data/raw/)
249−for s in scripts/0{4..9}_*.py scripts/1{0,1}_*.py; do python3 "$s"; done
250−
251−cd paper && latexmk # → paper/main.pdf (51 pages)
252−```
253−
254−---
255−
256−## 🧰 Environment & Dependencies
257−
258−Verified on **macOS (Apple Silicon) · Python 3.14.4 · TeX Live 2025**.
259−
260−| Package | Pinned | Role |
261−|---|:-:|---|
262−| pandas / pyarrow | 3.0.2 / 24.0.0 | wrangling, parquet I/O |
263−| numpy / scipy | 2.4.4 / 1.17.1 | Haversine, KD-tree |
264−| statsmodels | 0.14.6 | OLS (HC1/cluster), quantile regression |
265−| libpysal / spreg | 4.14.1 / 1.9.0 | KNN weights, SAR/SEM (GMM) |
266−| scikit-learn | 1.6.1 | LASSO, ENet, RF, GBM |
267−| shap | 0.48.0 | SHAP values |
268−| matplotlib | 3.10.9 | all figures |
269−
270−---
271−
272−## ✅ Verification & Provenance
273 107
274−Rebuilt on **2026-08-05** from the original project (kept untouched as backup) under a strict *no-result-changes* policy: 108+## 🗃 Data
275 109
276−- ✅ 3/3 merged parquets **value-identical** to the originals 110+| Dataset | Source | Raw → Clean | Key fields |
277−- ✅ **14/16 tables byte-identical** (2 residual float-level diffs documented in [`AUDIT.md`](AUDIT.md) §8) 111+|---|---|---|---|
278−- ✅ All figures regenerated, including 5 missing from the original (which broke its LaTeX build) 112+| Airbnb listings | Airbnb (scraped) | ~5,000 → 3,456 | nightly price, lat/lon, property type, rating, reviews, superhost |
279−- ✅ Every text↔table inconsistency corrected *in the prose only* — itemised in [`CHANGES.md`](CHANGES.md) 113+| Rental listings | Realtor.ca (scraped) | 8,356 → 8,303 | monthly rent, lat/lon, bedrooms, bathrooms, building type, size |
280−- ✅ All 32 references added in the scholarly upgrade **verified via Crossref/JMLR** (DOIs) — per-reference justification in [`UPGRADE_REPORT.md`](UPGRADE_REPORT.md) 114+
281− 115+Spatial merge: for every rental listing × radius r ∈ {250 m, 500 m, 1 km, 2 km}, six metrics computed against all
282−--- 116+Airbnb listings via chunked vectorised Haversine distances, plus city-level aggregates (24 exposure variables). Raw
283− 117+files are not distributed (`data/raw/README.md`); the committed parquets make steps 04–11 and the paper reproducible.
284−## 📖 Citation 118+
119+## 🔬 Methodology
120+
121+1. **Hedonic rent models 1a–1e** — OLS, HC1 SE, building-type and city fixed effects; variants with density and
122+ entire-home share (`scripts/06`).
123+2. **Airbnb pricing models 2a–2c** — log nightly price on city mean rent and listing controls.
124+3. **City-level regressions** — forward and reverse, 153 cities.
125+4. **Spatial models** — SAR and SEM, KNN (k = 5) row-standardised weights, Kelejian–Prucha GMM (`spreg.GM_Lag`,
126+ `GM_Error`) (`scripts/07`).
127+5. **Quantile regressions** — τ ∈ {0.10, 0.25, 0.50, 0.75, 0.90} plus a fine grid (`scripts/08`).
128+6. **Machine-learning benchmark** — OLS / LASSO / Elastic Net / RF / GBM, 80/20 split, SHAP attribution (`scripts/09`).
129+7. **Robustness** — buffer radii, alternative exposures, subsamples, trimming, city-clustered SEs, size control,
130+ log(1 + count), ring decomposition, leave-one-city-out (`scripts/10`, `scripts/11`).
131+
132+## 🖼 Figures & tables inventory
133+
134+| Figure | Content |
135+|---|---|
136+| `map_airbnb`, `map_rent` | Spatial distribution of the two samples |
137+| `dist_airbnb_price`, `dist_rent` | Price and rent distributions |
138+| `airbnb_by_city`, `rent_by_city` | City-level profiles |
139+| `scatter_airbnb_rent`, `rent_by_airbnb_bins`, `rent_airbnb_heatmap` | Exposure–rent relationships |
140+| `coefficient_buffer_comparison` | β across buffer radii (spatial decay) |
141+| `quantile_coefficients` | β(τ) path |
142+| `ml_predicted_vs_actual`, `feature_importance`, `shap_summary` | ML benchmark and attribution |
143+| `coefficient_robustness`, `leave_one_city_out` | Robustness programme |
144+
145+Tables (`results/tables/*.tex`, 13 fragments): summary statistics, city aggregates, hedonic rent models, Airbnb
146+pricing, city-level regressions, spatial models, quantile regressions, ML comparison, buffer robustness, subsample and
147+trimming checks, extended robustness, appendix variable dictionary.
148+
149+## ⚠️ Limitations
150+
151+- Cross-sectional listing data (asking rents and nightly prices), no panel or quasi-experimental variation: estimates
152+ are conditional associations.
153+- Airbnb exposure may be endogenous to unobserved neighbourhood amenities; the spatial models and city FE mitigate but do
154+ not eliminate this.
155+- Scraped samples are not census-complete; coverage is concentrated in the largest Quebec cities.
156+- Superhost discount and the absence of a city-rent premium in nightly prices diverge from prior work and are discussed,
157+ not resolved.
158+
159+## 📝 Citation
285 160
286 ```bibtex 161 ```bibtex
287 @techreport{boucher2026airbnb, 162 @techreport{boucher2026airbnb,
288 author = {Boucher, Simon-Pierre}, 163 author = {Boucher, Simon-Pierre},
289 title = {Airbnb, Residential Rents, and Housing Market Pressure: 164 title = {Airbnb, Residential Rents, and Housing Market Pressure:
290 A Hedonic and Spatial Econometric Analysis}, 165 A Hedonic and Spatial Econometric Analysis},
291− institution = {Universit\'e du Qu\'ebec en Outaouais, 166+ institution = {Universit\'e du Qu\'ebec en Outaouais, D\'epartement des sciences administratives},
292− D\'epartement des sciences administratives},
293 type = {Working Paper}, 167 type = {Working Paper},
294 number = {5}, 168 number = {5},
295 year = {2026}, 169 year = {2026},
296− month = {May}, 170+ month = {May}
297− address = {Gatineau, QC, Canada}
298 } 171 }
299 ``` 172 ```
300 173
301−--- 174+## 👤 Author & contact
302−
303−## 📬 Contact
304−
305−<div align="center">
306−
307−**Simon-Pierre Boucher**
308−Département des sciences administratives · Université du Québec en Outaouais
309−283, boulevard Alexandre-Taché, Gatineau (Québec) J9A 1L8, Canada
310−
311−[![Email](https://img.shields.io/badge/✉️_contact@spboucher.ai-primary-EA4335?style=for-the-badge)](mailto:contact@spboucher.ai)
312−[![UQO](https://img.shields.io/badge/🏛️_simon--pierre.boucher@uqo.ca-00457C?style=for-the-badge)](mailto:simon-pierre.boucher@uqo.ca)
313−
314−<sub>Issues and PRs welcome — please do not request the raw scraped data, which cannot be redistributed.</sub>
315 175
316−<br><br> 176+**Simon-Pierre Boucher** — Département des sciences administratives,
177+Université du Québec en Outaouais (UQO), Gatineau, QC.
178+📧 [simon-pierre.boucher@uqo.ca](mailto:simon-pierre.boucher@uqo.ca)
317 179
318−<sub>© 2026 Simon-Pierre Boucher — UQO Working Paper No. 5 · Code and manuscript for academic use.</sub> 180+## 🗒 Notes
319 181
320−</div> 182+- Format follows `Recherche-UQO/HARMONISATION.md` (2026-10-17): template title page, `natbib` + `aer` bibliography style,
183+ `docs/` for the restructuring reports.
184+- The original flat May 2026 project (`immo-wp5-spb-20260519`) is archived in
185+ `Recherche-UQO/_archives/versions-mai-2026/airbnb-rents-housing-pressure--immo-wp5-20260519/`; `docs/AUDIT.md` §8 and
186+ `docs/CHANGES.md` document the 2026-08-05 rebuild (14/16 tables byte-identical, prose-only corrections).
187+- Build verified 2026-10-17: 0 errors, 0 undefined references, 56 references rendered.
renamed AUDIT.md → docs/AUDIT.md +0 −0
renamed CHANGES.md → docs/CHANGES.md +0 −0
renamed PAPER_REVIEW.md → docs/PAPER_REVIEW.md +0 −0
renamed UPGRADE_REPORT.md → docs/UPGRADE_REPORT.md +0 −0
modified paper/.latexmkrc +0 −1
@@ -1,4 +1,3 @@
1−# Author: Simon-Pierre Boucher — contact@spboucher.ai
2 $pdf_mode = 1; 1 $pdf_mode = 1;
3 $pdflatex = 'pdflatex -interaction=nonstopmode -halt-on-error -synctex=1 %O %S'; 2 $pdflatex = 'pdflatex -interaction=nonstopmode -halt-on-error -synctex=1 %O %S';
4 $bibtex_use = 2; 3 $bibtex_use = 2;
modified paper/Makefile +0 −1
@@ -1,4 +1,3 @@
1−# Author: Simon-Pierre Boucher — contact@spboucher.ai
2 .PHONY: all clean distclean 1 .PHONY: all clean distclean
3 2
4 all: 3 all:
modified paper/main.pdf +0 −0

Binary file not shown.

modified paper/main.tex +3 −4
@@ -61,16 +61,15 @@
61 citecolor = NavyBlue, 61 citecolor = NavyBlue,
62 urlcolor = NavyBlue, 62 urlcolor = NavyBlue,
63 pdfauthor = {Simon-Pierre Boucher}, 63 pdfauthor = {Simon-Pierre Boucher},
64− pdftitle = {Airbnb, Residential Rents, and Housing Market Pressure} 64+ pdftitle = {Airbnb, Residential Rents, and Housing Market Pressure: A Hedonic and Spatial Econometric Analysis}
65 } 65 }
66 66
67 % --- Landscape --- 67 % --- Landscape ---
68 \usepackage{lscape} 68 \usepackage{lscape}
69 69
70 % --- Bibliography --- 70 % --- Bibliography ---
71−\usepackage[round]{natbib} 71+\usepackage[authoryear,round,semicolon]{natbib}
72−\setcitestyle{aysep={}} 72+\bibliographystyle{aer}
73−\bibliographystyle{apalike}
74 73
75 % --- Headers & Footers --- 74 % --- Headers & Footers ---
76 \usepackage{fancyhdr} 75 \usepackage{fancyhdr}
modified paper/sections/titlepage.tex +8 −9
@@ -1,4 +1,3 @@
1−% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 % ============================================================================ 1 % ============================================================================
3 % Title Page 2 % Title Page
4 % ============================================================================ 3 % ============================================================================
@@ -11,8 +10,8 @@
11 10
12 \vspace{0.6cm} 11 \vspace{0.6cm}
13 12
14−{\footnotesize\textsc{Universit\'e du Qu\'ebec en Outaouais}}\\[0.15cm] 13+{\footnotesize\textsc{Université du Québec en Outaouais}}\\[0.15cm]
15−{\footnotesize\textsc{D\'epartement des sciences administratives}} 14+{\footnotesize\textsc{Département des sciences administratives}}
16 15
17 \vspace{0.8cm} 16 \vspace{0.8cm}
18 17
@@ -31,16 +30,16 @@
31 \vspace{1.2cm} 30 \vspace{1.2cm}
32 31
33 % --- Author --- 32 % --- Author ---
34−{\large \WPauthor\footnotemark[1]}\\[0.3cm] 33+{\large \WPauthor}\\[0.3cm]
35−{\normalsize\itshape \WPaffiliation} 34+{\normalsize \WPaffiliation}\\[0.15cm]
36− 35+{\normalsize \href{mailto:\WPemail}{\WPemail}}\\[0.15cm]
37−\footnotetext[1]{Professeur, D\'epartement des sciences administratives, Universit\'e du Qu\'ebec en Outaouais (UQO), 283 boulevard Alexandre-Tach\'e, Gatineau, QC J9A 1L8, Canada. Email: \href{mailto:\WPemail}{\WPemail}.} 36+{\small \WPaddress}
38 37
39 \vspace{0.8cm} 38 \vspace{0.8cm}
40 39
41 % --- Date & Version --- 40 % --- Date & Version ---
42−{\normalsize This version: \WPdate}\\[0.1cm] 41+{\normalsize \WPdate}\\[0.1cm]
43−{\small\itshape Version~\WPversion} 42+{\small Version~\WPversion}
44 43
45 \end{center} 44 \end{center}
46 45
47 46
Menu

Theme