SPB Git

spb/wp5_uqo

Public

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

Initial commit: restructured UQO WP5 (Airbnb & residential rents)

Clean repository rebuilt from immo-wp5-spb-20260519 (original left untouched):
- data/processed: verified bit-identical parquet datasets
- src/ + scripts/01-10: refactored pipeline, reproduces published tables
  (14/16 byte-identical, residual diffs documented in AUDIT.md §8)
- figures/: all 15 figures regenerated, including 5 missing from original
- paper/: editorial rewrite, compiles clean (41 pages, 0 unresolved refs)
- AUDIT.md / CHANGES.md: full audit and change log

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Aug 5, 2026) Browse files

76 changed files +5,963 −0

76 changed files
added .gitignore +21 −0
@@ -0,0 +1,21 @@
1 +# Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +__pycache__/
3 +*.pyc
4 +.DS_Store
5 +
6 +# Raw data is not distributed
7 +data/raw/*.csv
8 +data/raw/*.json
9 +
10 +# LaTeX build artifacts
11 +paper/*.aux
12 +paper/*.bbl
13 +paper/*.blg
14 +paper/*.log
15 +paper/*.out
16 +paper/*.toc
17 +paper/*.lof
18 +paper/*.lot
19 +paper/*.fls
20 +paper/*.fdb_latexmk
21 +paper/*.synctex.gz
added AUDIT.md +158 −0
@@ -0,0 +1,158 @@
1 +<!-- Author: Simon-Pierre Boucher — contact@spboucher.ai -->
2 +
3 +# AUDIT — Original project `immo-wp5-spb-20260519`
4 +
5 +Audit of `~/Desktop/UQO/UQO_WP/immo-wp5-spb-20260519` performed on 2026-08-05, **before** any restructuring.
6 +The original folder is left **untouched**; the clean repository is rebuilt at `~/Desktop/wp5_uqo`.
7 +
8 +## 1. Project summary
9 +
10 +Hedonic and spatial econometric analysis of the relationship between Airbnb activity and
11 +residential rents in Quebec, Canada (UQO Working Paper No. 5, Simon-Pierre Boucher, May 2026).
12 +~5,000 Airbnb listings + 8,356 Realtor.ca rental listings, spatial buffer merge (Haversine,
13 +250 m–2 km), OLS/hedonic models, spatial models (SAR/SEM via spreg), quantile regressions,
14 +ML robustness (LASSO, Elastic Net, RF, GBM, SHAP).
15 +
16 +## 2. Scripts (`scripts/`, 10 files, ~2,930 lines)
17 +
18 +| Script | Role | Inputs | Outputs |
19 +|---|---|---|---|
20 +| `01_load_inspect_data.py` | Inspect raw data, write data dictionary log | `airbnb.csv`, `rent.json` (**missing**, see §5.1) | `outputs/logs/data_inspection.txt` |
21 +| `02_clean_airbnb.py` | Standardize cities, winsorize price p1/p99, `log_price`, impute rating (median) & reviews (0), `is_entire_home` | `airbnb.csv` (**missing**) | `data_clean/airbnb_clean.parquet` |
22 +| `03_clean_rent.py` | Filter Single Family + Monthly, parse rent/city/borough/lat/lon/beds/baths/size, winsorize p1/p99, `log_rent` | `rent.json` (**missing**) | `data_clean/rent_clean.parquet` |
23 +| `04_merge_data.py` | Spatial buffer merge (Haversine 250 m/500 m/1 km/2 km, chunked), city/borough aggregation, combined analysis file | the 2 clean parquets | `merged_spatial.parquet`, `merged_neighborhood.parquet`, `merged_analysis.parquet` |
24 +| `05_descriptive_analysis.py` | Summary-stat tables, correlation matrix, 7 descriptive figures | clean + merged parquets | 3 tables, 7 figures |
25 +| `06_hedonic_models.py` | Models 1a–1e (rent), 2a–2c (Airbnb pricing), 3 fwd/rev (city level), OLS HC1 | `merged_analysis`, `airbnb_clean` | 3 `.tex` tables |
26 +| `07_spatial_models.py` | Model 4: SAR (GM_Lag) + SEM (GM_Error) via spreg, KNN(5) weights; buffer robustness 250 m–2 km | `merged_analysis` | 2 tables + `coefficient_buffer_comparison.pdf` |
27 +| `08_quantile_models.py` | Model 5: quantile regressions τ∈{.10,.25,.50,.75,.90} + fine grid plot | `merged_analysis` | 1 table + `quantile_coefficients.pdf` |
28 +| `09_ml_robustness.py` | Model 6: OLS/LASSO/ENet/RF/GBM (seed 42, 80/20 split), SHAP | `merged_analysis` | `ml_comparison.{tex,csv}` + 3 figures |
29 +| `10_generate_tables_figures.py` | Outlier/winsorization + subsample robustness tables, hexbin heatmap, coefficient-robustness plot, quintile bar chart | `merged_analysis` | 2 tables + 3 figures |
30 +
31 +All paths are already relative to the project root via `Path(__file__).resolve().parent.parent` — good.
32 +Scripts are standalone monoliths with heavy duplication (see §5.4).
33 +
34 +## 3. Data
35 +
36 +- `data_clean/` (5 parquet files, all present and readable):
37 + `airbnb_clean.parquet` (4,950 rows expected), `rent_clean.parquet` (8,303 rows),
38 + `merged_spatial.parquet`, `merged_neighborhood.parquet`, `merged_analysis.parquet` (8,258 rows × 42 cols).
39 +- **Raw data (`airbnb.csv`, `rent.json`) are absent** from the folder and from the whole disk
40 + (searched `~/Desktop/UQO` and Spotlight). See §5.1.
41 +
42 +## 4. Figure inventory
43 +
44 +Figures **generated by the code** (15) vs figures **present** in `outputs/figures/` (10):
45 +
46 +| Figure | Generated by | In `outputs/figures/` | Referenced by paper |
47 +|---|---|---|---|
48 +| dist_airbnb_price.pdf | 05 | yes | yes |
49 +| dist_rent.pdf | 05 | yes | yes |
50 +| airbnb_by_city.pdf | 05 | yes | no |
51 +| rent_by_city.pdf | 05 | **no** | no |
52 +| scatter_airbnb_rent.pdf | 05 | yes | no |
53 +| map_airbnb.pdf | 05 | **no** | **yes → broken** |
54 +| map_rent.pdf | 05 | **no** | **yes → broken** |
55 +| coefficient_buffer_comparison.pdf | 07 | yes | yes (×2) |
56 +| quantile_coefficients.pdf | 08 | **no** | **yes → broken** |
57 +| ml_predicted_vs_actual.pdf | 09 | yes | no |
58 +| feature_importance.pdf | 09 | yes | yes |
59 +| shap_summary.pdf | 09 | yes | yes |
60 +| rent_airbnb_heatmap.pdf | 10 | yes | no |
61 +| coefficient_robustness.pdf | 10 | yes | yes |
62 +| rent_by_airbnb_bins.pdf | 10 | **no** | no |
63 +
64 +The 5 missing PDFs were evidently deleted (or the run predates those functions); the code that
65 +produces them is intact. **Consequence:** `wp5/main.tex` fails to compile (fatal error, no PDF);
66 +only `wp5/main_web.tex` compiles because it replaces missing figures with placeholder boxes.
67 +Re-running the pipeline regenerates all 15 figures and fixes the paper build.
68 +
69 +`wp5/figures/` contains a stale copy of the same 10 PDFs (duplicate of `outputs/figures/`).
70 +
71 +## 5. Problems found (nothing was changed; fixes happen in the new repo)
72 +
73 +### 5.1 Raw data missing (blocking for steps 01–03 only)
74 +`airbnb.csv` and `rent.json` are referenced by scripts 01–03 and by the original README but do
75 +not exist anywhere on disk. The pipeline is therefore reproducible **from `data_clean/` onward**
76 +(steps 04–10 + paper), which covers every number and figure in the paper. Steps 01–03 are kept
77 +in the new repo and fail with an explicit message if the raw files are absent.
78 +**→ Requires user review: locate/restore the raw files if full from-scratch reproduction is needed.**
79 +
80 +### 5.2 Two divergent copies of the paper
81 +- `paper/` — same sections, figures referenced as `../outputs/figures/…`, no title page, compiled OK.
82 +- `wp5/` — adds UQO title page (`uq_logo.jpg`), `Makefile`, `.latexmkrc`, `\graphicspath{{figures/}}`,
83 + plus `main_web.tex` (variant with a "Figure indisponible" fallback macro).
84 +- Only real content differences: figure paths in `03_data.tex`, `05_results.tex`, `06_robustness.tex`.
85 +- `wp5/` is the canonical/most recent version (June 2026) → used as the base for the rewrite.
86 +
87 +### 5.3 Figure caption vs content mismatch
88 +`03_data.tex` captions the two distribution histograms as "(log scale)" but scripts plot **levels**
89 +(CAD). Caption corrected in the rewrite (editorial fix; figures unchanged).
90 +
91 +### 5.4 Code-quality issues (fixed by refactor, results preserved)
92 +- Significance-star helper duplicated in 4 scripts; LaTeX regression-table builder duplicated in 4 scripts;
93 + matplotlib style blocks duplicated in 3 scripts; city-FE OLS helper duplicated within script 10.
94 +- Scripts 05 requests columns `size_sqft`, `guests_count`, `amenities_count`, `num_images`,
95 + `quality_score` that don't exist in the parquets (`rent_clean` has `size_interior_sqft`); the
96 + helper silently skips them, so the published summary tables lack those rows. **Kept as-is** to
97 + reproduce identical tables; noted for future work.
98 +- Scripts 06–08 are top-level scripts (no `main()`); 02/03 likewise.
99 +- `scripts/__pycache__/` committed; `.DS_Store` files scattered.
100 +
101 +### 5.5 Dead / duplicate / unused files
102 +- `paper/` entire directory superseded by `wp5/` (kept only as reference in the original folder).
103 +- `wp5/main_web.tex` + `main_web.*` build artifacts: web variant with placeholder hack — obsolete
104 + once figures are regenerated.
105 +- LaTeX build artifacts (`.aux`, `.log`, `.out`, `.bbl`, `.blg`, `.fls`, `.fdb_latexmk`, `.toc`, `.synctex.gz`).
106 +- `scripts/__pycache__/`, `.DS_Store` (×6).
107 +- `outputs/figures/` vs `wp5/figures/`: duplicated PDFs.
108 +
109 +### 5.6 Environment
110 +Python 3.14.4 (Homebrew) with pandas 3.0.2, numpy 2.4.4, statsmodels 0.14.6, scikit-learn 1.6.1,
111 +scipy 1.17.1, matplotlib 3.10.9, pyarrow 24.0.0, shap 0.48.0, libpysal 4.14.1, spreg 1.9.0.
112 +TeX Live (`pdflatex`, `latexmk`, `bibtex`) available. Note: with libpysal+spreg installed, script 07
113 +takes the SAR/SEM branch — consistent with the published `spatial_models.tex`.
114 +
115 +## 6. Paper (`wp5/`)
116 +
117 +- `main.tex` (184 lines): clean preamble (newtx, booktabs, natbib/apalike, fancyhdr, hyperref),
118 + metadata macros, inputs 8 sections + title page + 3 appendices; 24 BibTeX entries, all cited.
119 +- Sections: 01 introduction, 02 literature, 03 data, 04 methodology (models 1–6 + identification),
120 + 05 results, 06 robustness, 07 discussion, 08 conclusion; appendices: data, methods, robustness.
121 +- Prose already in good academic English; rewrite pass = flow/consistency polish, caption fix
122 + (§5.3), figure/table path normalization to the new layout, and making every figure resolvable.
123 +- Tables are `\input` from `../outputs/tables/*.tex` → becomes `../results/tables/` in the new repo.
124 +
125 +## 7. Verification plan (Phase 2b)
126 +
127 +1. Copy the 5 parquets to `data/processed/` (bit-identical, checksummed).
128 +2. Re-run refactored steps 04→10; compare regenerated `merged_*.parquet` (DataFrame equality)
129 + and every `.tex`/`.csv` table against the originals (`diff`). Figures: confirm regeneration and
130 + spot-check values; PDF bytes differ (timestamps) so tables are the numeric ground truth.
131 +3. Any discrepancy is recorded below — never silently corrected.
132 +
133 +## 8. Discrepancies found during verification
134 +
135 +Full pipeline (steps 04–10) re-run in the new repo on 2026-08-05 and compared to the originals:
136 +
137 +- **Merged parquets (3/3): identical** — `merged_spatial`, `merged_neighborhood`,
138 + `merged_analysis` regenerated from the committed clean parquets are value-identical
139 + to the originals (`pandas.testing.assert_frame_equal`).
140 +- **Tables: 14/16 byte-identical** after aligning the generators with the published
141 + fragments (the original `outputs/tables/*.tex` had been hand-stripped of their
142 + `\begin{table}…\end{table}` wrappers after generation; the new scripts emit those
143 + fragments directly — see `CHANGES.md`). Residual differences, both preserved and
144 + NOT corrected:
145 + 1. `quantile_regression.tex` — in the τ=0.10 column only, three control
146 + coefficients differ in the 4th decimal (bathrooms 0.2410→0.2411,
147 + bt_House 0.0607→0.0608, bt_Row/Townhouse 0.1302→0.1310, SE 0.0469→0.0468).
148 + The Airbnb coefficient, all other quantiles, and the OLS column are identical.
149 + Cause: IRLS convergence jitter of `statsmodels.QuantReg` at the extreme
150 + quantile; no significance level or claim in the paper changes.
151 + 2. `ml_comparison.csv` — two values differ at the 16th significant digit
152 + (~1e-16 relative; float representation). The 4-decimal `ml_comparison.tex`
153 + is byte-identical.
154 +- **Figures: all 15 regenerated**, including the 5 missing from the original
155 + (`map_airbnb`, `map_rent`, `quantile_coefficients`, `rent_by_city`,
156 + `rent_by_airbnb_bins`), which un-breaks the paper build. PDF bytes differ from
157 + the surviving originals (embedded timestamps/IDs); the numeric ground truth is
158 + the table set above, plus the underlying data verified identical.
added CHANGES.md +152 −0
@@ -0,0 +1,152 @@
1 +<!-- Author: Simon-Pierre Boucher — contact@spboucher.ai -->
2 +
3 +# CHANGES — Restructuring of `immo-wp5-spb-20260519` → `wp5_uqo`
4 +
5 +Date: 2026-08-05. The original project at
6 +`~/Desktop/UQO/UQO_WP/immo-wp5-spb-20260519` was **left completely untouched** and
7 +serves as the backup (in place of an `_old/` copy inside this repo).
8 +
9 +Per request, every file created in this repo carries the header
10 +`Author: Simon-Pierre Boucher — contact@spboucher.ai` (comment syntax adapted per
11 +language: `#` Python/Makefile, `%` LaTeX/BibTeX, `<!-- -->` Markdown; in
12 +`references.bib` the email is written `contact (at) spboucher.ai` because a literal
13 +`@` inside a `.bib` comment breaks BibTeX).
14 +
15 +## 1. Moved / renamed
16 +
17 +| Original | New |
18 +|---|---|
19 +| `airbnb.csv`, `rent.json` (project root) | `data/raw/` (files missing — see §5) |
20 +| `data_clean/*.parquet` (5 files) | `data/processed/` (bit-identical copies, checksummed) |
21 +| `scripts/01_load_inspect_data.py` | `scripts/01_inspect_raw_data.py` |
22 +| `scripts/02…09_*.py` | same names under `scripts/` (refactored) |
23 +| `scripts/10_generate_tables_figures.py` | `scripts/10_robustness_tables_figures.py` |
24 +| `outputs/tables/` | `results/tables/` |
25 +| `outputs/logs/` | `results/logs/` |
26 +| `outputs/figures/` + `wp5/figures/` (duplicates) | `figures/` (single source, regenerated) |
27 +| `wp5/` (canonical LaTeX) | `paper/` |
28 +| `paper/` (old LaTeX copy), `wp5/main_web.tex` + fallback hack | **dropped** (superseded; the fallback is unnecessary now that all figures exist) |
29 +| `scripts/__pycache__/`, `.DS_Store`, LaTeX build artifacts | dropped / gitignored |
30 +
31 +New files: `README.md`, `AUDIT.md`, `CHANGES.md`, `requirements.txt` (pinned),
32 +`data/raw/README.md`, `.gitignore`, `src/` package.
33 +
34 +## 2. Code refactoring (results preserved — see §4)
35 +
36 +- **`src/config.py`** — all paths and constants (buffer radii, chunk size, Earth
37 + radius, random seed) in one place; output dirs auto-created; `require()` gives a
38 + clear error message when an input is missing instead of a traceback.
39 +- **`src/geo.py`** — the vectorised Haversine matrix (was duplicated in script 04).
40 +- **`src/latex_tables.py`** — significance stars (previously copy-pasted in 4
41 + scripts) and the stargazer-style `results_to_latex` builder (was in script 06).
42 +- **`src/plotting.py`** — the two matplotlib style blocks (were duplicated across
43 + scripts 05, 09, 10). Scripts 07/08 intentionally keep matplotlib defaults, as
44 + in the original.
45 +- All scripts now have a `main()` entry point, docstrings, and import shared
46 + helpers; scripts 01–03 fail with an explanatory message when the raw data are
47 + absent. Script 10's two near-identical OLS helpers were merged into one
48 + (`run_ols_city_fe`, parameterised by the Airbnb exposure variable).
49 +- **Table fragments:** the published `outputs/tables/*.tex` had been *hand-edited*
50 + after generation (the `\begin{table}…\end{table}` wrappers were stripped so the
51 + paper could `\input` them inside its own table environments). The refactored
52 + generators emit exactly those fragments, so pipeline output now feeds the paper
53 + directly with no manual post-processing.
54 +- Deliberately **kept as-is** (to reproduce identical outputs): the
55 + `size_sqft`/`guests_count`/etc. column names requested by script 05 that don't
56 + exist in the processed data (the summary-stats helper skips them, matching the
57 + published tables) — noted in `AUDIT.md` §5.4.
58 +
59 +## 3. Pipeline verification (Phase 2b)
60 +
61 +Full re-run of steps 04→10 in this repo, compared against the originals:
62 +
63 +- 3/3 merged parquet files **value-identical**.
64 +- 14/16 tables **byte-identical**. Two residual, numerically negligible
65 + differences (documented, not corrected): the τ=0.10 quantile-regression column
66 + (3 control coefficients at the 4th decimal — IRLS convergence jitter; the
67 + Airbnb coefficient and all conclusions unchanged) and 2 values of
68 + `ml_comparison.csv` at the 16th significant digit. Details: `AUDIT.md` §8.
69 +- All **15 figures regenerated**, including the 5 missing from the original
70 + project (`map_airbnb`, `map_rent`, `quantile_coefficients`, `rent_by_city`,
71 + `rent_by_airbnb_bins`) — this un-breaks the paper build, which previously
72 + failed on the missing maps.
73 +
74 +## 4. Paper rewrite (`paper/`)
75 +
76 +Structure was already `main.tex` + `sections/` + `appendix/` + `references.bib`;
77 +it was kept, with figure paths pointed at `../figures/` and table inputs at
78 +`../results/tables/`. `latexmk` builds `main.pdf` (41 pages) with **zero
79 +unresolved references or citations**. All 24 BibTeX entries are cited; every
80 +figure/table in the paper is referenced in the text and captioned.
81 +
82 +### Editorial corrections that ALIGN THE TEXT WITH THE PAPER'S OWN TABLES
83 +**⚠️ These need your review — the previous prose contradicted the (unchanged) tables:**
84 +
85 +1. **Abstract, §5.2, Conclusion — Airbnb pricing model (Model 2).** The text
86 + claimed listings in higher-rent cities "command significant price premia"
87 + (with a "$100 → 2–4%" magnitude). Table 4 shows `mean_rent_city` is
88 + *insignificant in every column* (negative point estimates in 2a/2b). The text
89 + now reports the null result and its interpretation. Also corrected: the
90 + claimed positive rating/superhost premia (rating is not in the model;
91 + superhost is significantly **negative**).
92 +2. **§5.3 City-level model.** "Strong positive correlation … fewer than 30
93 + cities" → modest but significant forward association (0.0001**), essentially
94 + zero explanatory power in the reverse regression, and the actual 153 cities.
95 +3. **§5.5 Quantile regressions.** "Insignificant at the 10th percentile,
96 + monotonically increasing" → significant at *all* quantiles, roughly flat over
97 + the lower half, rising to its maximum (0.0047) at τ=0.90.
98 +4. **§6 Alternative exposure / §7 Commercialisation.** The text claimed the
99 + entire-home share is positively associated with rents (supporting the
100 + commercialisation hypothesis). Model 1e shows a small *negative,
101 + insignificant* coefficient; the text now reports this and discusses why. The
102 + phantom "mean Airbnb price" alternative measure (never in the table) was
103 + removed from the list.
104 +5. **§5.6 ML results.** "Gradient boosting best, all ML beat OLS; bedrooms and
105 + city indicators most important" → random forest is best (test R²=0.71), the
106 + regularised linear models tie OLS, and the top features are bathrooms,
107 + coordinates, and bedrooms (city indicators are not ML features).
108 +6. **§5.1 Baseline description.** Column description now matches the actual
109 + (1a)–(1e) layout; bedroom effect corrected to 11–13% (was "15–25%"),
110 + bathrooms 23–30%; adjusted R² 0.56 (was "0.40–0.55").
111 +7. **§6 Outlier sensitivity.** Text described winsorisation at 1/99; the code
112 + *trims* at rent 5/95 and Airbnb count 1/99. Text now matches, and the
113 + "negligible effect" claim was corrected (the rent-trimmed estimate is ~20%
114 + smaller, still significant).
115 +
116 +### Methods descriptions aligned with the actual implementation
117 +8. **Model 4 / methodological appendix.** Radius-based leave-one-out spatial lag
118 + estimated by OLS → the implemented KNN(k=5) row-standardised weights with SAR
119 + estimated by `GM_Lag` and SEM by `GM_Error` (spreg).
120 +9. **Quantile SEs.** "Bootstrap, 1,000 replications" → the asymptotic
121 + kernel-based SEs actually produced by `statsmodels.QuantReg`.
122 +10. **Clustered SEs.** Claims that clustered-SE results are "reported" were
123 + removed (none were computed); replaced by an honest inference caveat.
124 +11. **Model 2/6 covariate lists, GBM "early stopping", RF "permutation
125 + importance"** → corrected to the actual controls, fixed 500 iterations, and
126 + SHAP values.
127 +12. **Figure captions.** The two distribution histograms were captioned "(log
128 + scale)" but plot levels in CAD → captions corrected.
129 +13. **Appendix sample-attrition numbers** updated to the actual counts
130 + (Airbnb 5,000 → 3,456; rent 8,356 → 8,303; regression sample 7,925).
131 +
132 +Sections 1 (introduction), 2 (literature) and most of 7–8 needed only the
133 +consistency fixes above; the prose was already in polished academic English and
134 +was otherwise preserved.
135 +
136 +## 5. Items requiring your review
137 +
138 +- **Raw data missing** (`airbnb.csv`, `rent.json`): absent from the original
139 + folder and the whole disk. Steps 01–03 are ready but cannot run until the files
140 + are restored to `data/raw/`. Everything else reproduces from `data/processed/`.
141 +- **The text↔table contradictions in §4 above** (especially item 1, which changes
142 + the abstract's fourth claim, and item 4). The tables were and remain the
143 + original results; if you believe the *tables* are wrong instead, the code paths
144 + to investigate are `scripts/06_hedonic_models.py` (`mean_rent_city`,
145 + `share_entire_home_500m`).
146 +- The two numerically negligible reproduction differences (`AUDIT.md` §8).
147 +- The paper still says "Version 1.0, May 2026" — bump `\WPversion`/`\WPdate` in
148 + `paper/main.tex` if you consider this revision a new version.
149 +- `figures/ml_predicted_vs_actual.pdf`, `airbnb_by_city.pdf`, `rent_by_city.pdf`,
150 + `scatter_airbnb_rent.pdf`, `rent_airbnb_heatmap.pdf`, `rent_by_airbnb_bins.pdf`
151 + are generated but not included in the paper (same as the original); include
152 + them if desired.
added README.md +75 −0
@@ -0,0 +1,75 @@
1 +<!-- Author: Simon-Pierre Boucher — contact@spboucher.ai -->
2 +
3 +# Airbnb, Residential Rents, and Housing Market Pressure (UQO WP5)
4 +
5 +A hedonic and spatial econometric analysis of the relationship between Airbnb
6 +activity and residential rental prices in Quebec, Canada.
7 +UQO Working Paper No. 5 — Simon-Pierre Boucher, Université du Québec en Outaouais.
8 +
9 +## Repository layout
10 +
11 +```
12 +wp5_uqo/
13 +├── README.md # this file
14 +├── AUDIT.md # audit of the original project (pre-restructuring)
15 +├── CHANGES.md # everything that was moved, refactored, or rewritten
16 +├── requirements.txt # pinned Python dependencies
17 +├── data/
18 +│ ├── raw/ # airbnb.csv + rent.json (NOT distributed — see data/raw/README.md)
19 +│ └── processed/ # cleaned & merged parquet files (committed)
20 +├── src/ # shared modules (paths/config, geo, LaTeX tables, plot styles)
21 +├── scripts/ # numbered pipeline entry points (01–10)
22 +├── figures/ # all 15 paper figures (regenerated by the pipeline)
23 +├── results/
24 +│ ├── tables/ # LaTeX table fragments + CSV outputs
25 +│ └── logs/ # data-inspection log
26 +└── paper/ # LaTeX source (main.tex + sections/ + appendix/) → main.pdf
27 +```
28 +
29 +## Reproducing everything
30 +
31 +Requires Python ≥ 3.12 (developed on 3.14.4) and a TeX distribution with `latexmk`.
32 +
33 +```bash
34 +pip install -r requirements.txt
35 +
36 +# Steps 01–03 need the raw files in data/raw/ (see data/raw/README.md).
37 +# The committed parquets in data/processed/ make them optional.
38 +python3 scripts/01_inspect_raw_data.py # optional — raw data inspection log
39 +python3 scripts/02_clean_airbnb.py # optional — rebuilds airbnb_clean.parquet
40 +python3 scripts/03_clean_rent.py # optional — rebuilds rent_clean.parquet
41 +
42 +python3 scripts/04_merge_data.py # spatial buffer merge (Haversine 250m–2km)
43 +python3 scripts/05_descriptive_analysis.py # summary tables + descriptive figures
44 +python3 scripts/06_hedonic_models.py # Models 1–3 (hedonic OLS, HC1)
45 +python3 scripts/07_spatial_models.py # Model 4 (SAR/SEM via spreg) + buffer robustness
46 +python3 scripts/08_quantile_models.py # Model 5 (quantile regressions)
47 +python3 scripts/09_ml_robustness.py # Model 6 (LASSO/ENet/RF/GBM + SHAP)
48 +python3 scripts/10_robustness_tables_figures.py # robustness tables + extra figures
49 +
50 +cd paper && latexmk # builds paper/main.pdf
51 +```
52 +
53 +Every script reads and writes paths defined in `src/config.py`; the pipeline can
54 +be run from any working directory.
55 +
56 +## Key findings
57 +
58 +- Each additional Airbnb listing within 500 m is associated with ≈ 0.4% higher
59 + monthly rent (0.3–0.5% across specifications), controlling for dwelling
60 + characteristics, building type, and city fixed effects.
61 +- The association decays with buffer radius (250 m → 2 km) and is strongest at
62 + the upper quantiles of the rent distribution.
63 +- SAR/SEM spatial models confirm substantial spatial autocorrelation in rents;
64 + the Airbnb coefficient survives with mild attenuation.
65 +- ML benchmarks (random forest, gradient boosting) confirm the predictive
66 + relevance of Airbnb exposure; the linear specification remains adequate.
67 +- Cross-sectional design — associations, not causal effects.
68 +
69 +## Provenance
70 +
71 +Restructured from `~/Desktop/UQO/UQO_WP/immo-wp5-spb-20260519` (left untouched
72 +as backup) on 2026-08-05. See `AUDIT.md` for the audit of the original project
73 +and `CHANGES.md` for the full list of changes; regenerated tables were verified
74 +against the originals (14/16 byte-identical, 2 residual float-level differences
75 +documented in `AUDIT.md` §8).
added data/processed/airbnb_clean.parquet +0 −0

Binary file not shown.

added data/processed/merged_analysis.parquet +0 −0

Binary file not shown.

added data/processed/merged_neighborhood.parquet +0 −0

Binary file not shown.

added data/processed/merged_spatial.parquet +0 −0

Binary file not shown.

added data/processed/rent_clean.parquet +0 −0

Binary file not shown.

added data/raw/README.md +16 −0
@@ -0,0 +1,16 @@
1 +<!-- Author: Simon-Pierre Boucher — contact@spboucher.ai -->
2 +
3 +# Raw data (not included)
4 +
5 +The two raw input files are **not distributed** with this repository and were
6 +not present in the original project folder either (see `AUDIT.md` §5.1):
7 +
8 +- `airbnb.csv` — ~5,000 Airbnb listings scraped from Airbnb (Quebec province)
9 +- `rent.json` — 8,356 residential rental listings from Realtor.ca (Quebec province)
10 +
11 +Place them in this directory to run pipeline steps 01–03
12 +(`scripts/01_inspect_raw_data.py`, `02_clean_airbnb.py`, `03_clean_rent.py`).
13 +
14 +The cleaned datasets derived from them are committed in `data/processed/`,
15 +so the full analysis (steps 04–10) and the paper are reproducible without
16 +the raw files.
added figures/airbnb_by_city.pdf +0 −0

Binary file not shown.

added figures/coefficient_buffer_comparison.pdf +0 −0

Binary file not shown.

added figures/coefficient_robustness.pdf +0 −0

Binary file not shown.

added figures/dist_airbnb_price.pdf +0 −0

Binary file not shown.

added figures/dist_rent.pdf +0 −0

Binary file not shown.

added figures/feature_importance.pdf +0 −0

Binary file not shown.

added figures/map_airbnb.pdf +0 −0

Binary file not shown.

added figures/map_rent.pdf +0 −0

Binary file not shown.

added figures/ml_predicted_vs_actual.pdf +0 −0

Binary file not shown.

added figures/quantile_coefficients.pdf +0 −0

Binary file not shown.

added figures/rent_airbnb_heatmap.pdf +0 −0

Binary file not shown.

added figures/rent_by_airbnb_bins.pdf +0 −0

Binary file not shown.

added figures/rent_by_city.pdf +0 −0

Binary file not shown.

added figures/scatter_airbnb_rent.pdf +0 −0

Binary file not shown.

added figures/shap_summary.pdf +0 −0

Binary file not shown.

added paper/.latexmkrc +6 −0
@@ -0,0 +1,6 @@
1 +# Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +$pdf_mode = 1;
3 +$pdflatex = 'pdflatex -interaction=nonstopmode -halt-on-error -synctex=1 %O %S';
4 +$bibtex_use = 2;
5 +$clean_ext = 'synctex.gz run.xml bbl bcf fdb_latexmk fls log aux out toc lof lot blg';
6 +@default_files = ('main.tex');
added paper/Makefile +12 −0
@@ -0,0 +1,12 @@
1 +# Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +.PHONY: all clean distclean
3 +
4 +all:
5 + latexmk
6 +
7 +clean:
8 + latexmk -c
9 +
10 +distclean:
11 + latexmk -C
12 + rm -f *.synctex.gz *.run.xml *.bbl *.bcf
added paper/appendix/appendix_data.tex +103 −0
@@ -0,0 +1,103 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% =============================================================================
3 +% appendix_data.tex — Additional data details
4 +% =============================================================================
5 +\section{Data Appendix}\label{app:data}
6 +
7 +\subsection{Variable Definitions}
8 +
9 +Table~\ref{tab:var_definitions} provides a comprehensive list of variables used in the analysis, including their definitions, sources, and units.
10 +
11 +\begin{table}[htbp]
12 + \centering
13 + \caption{Variable Definitions}
14 + \label{tab:var_definitions}
15 + \small
16 + \begin{tabularx}{\textwidth}{l l X l}
17 + \toprule
18 + \textbf{Variable} & \textbf{Source} & \textbf{Definition} & \textbf{Unit} \\
19 + \midrule
20 + \multicolumn{4}{l}{\textit{Rental listing variables}} \\
21 + \addlinespace
22 + \texttt{rent} & Realtor.ca & Monthly asking rent & CAD \\
23 + \texttt{log\_rent} & Constructed & Natural log of monthly rent & --- \\
24 + \texttt{bedrooms} & Realtor.ca & Number of bedrooms & Count \\
25 + \texttt{bathrooms} & Realtor.ca & Number of bathrooms (total) & Count \\
26 + \texttt{building\_type} & Realtor.ca & Building type (Apartment, House, Row/Townhouse) & Category \\
27 + \texttt{size\_interior} & Realtor.ca & Interior floor area & sq ft \\
28 + \texttt{lat}, \texttt{lon} & Realtor.ca & Latitude and longitude of the listing & Degrees \\
29 + \texttt{city} & Realtor.ca & City / municipality name & Category \\
30 + \addlinespace
31 + \midrule
32 + \multicolumn{4}{l}{\textit{Airbnb listing variables}} \\
33 + \addlinespace
34 + \texttt{price\_numeric} & Airbnb & Nightly asking price & CAD \\
35 + \texttt{log\_price} & Constructed & Natural log of nightly price & --- \\
36 + \texttt{property\_type} & Airbnb & Property type (Rental unit, House, Cabin/Chalet, Condo, Apartment) & Category \\
37 + \texttt{rating} & Airbnb & Star rating (0--5 scale) & Numeric \\
38 + \texttt{num\_reviews} & Airbnb & Number of guest reviews & Count \\
39 + \texttt{is\_superhost} & Airbnb & Superhost status indicator & Binary \\
40 + \texttt{is\_guest\_favorite} & Airbnb & Guest favourite designation & Binary \\
41 + \texttt{pets\_allowed} & Airbnb & Whether pets are allowed & Binary \\
42 + \texttt{is\_entire\_home} & Constructed & Indicator for entire-home property types & Binary \\
43 + \texttt{lat}, \texttt{lon} & Airbnb & Latitude and longitude of the listing & Degrees \\
44 + \texttt{city} & Airbnb & City name (standardised) & Category \\
45 + \addlinespace
46 + \midrule
47 + \multicolumn{4}{l}{\textit{Airbnb exposure variables (constructed via spatial buffer merge)}} \\
48 + \addlinespace
49 + \texttt{airbnb\_count\_$r$} & Constructed & Number of Airbnb listings within radius $r$ & Count \\
50 + \texttt{airbnb\_density\_$r$} & Constructed & Airbnb count / buffer area ($\pi r^2$) & Per km$^2$ \\
51 + \texttt{mean\_airbnb\_price\_$r$} & Constructed & Mean Airbnb nightly price within radius $r$ & CAD \\
52 + \texttt{share\_entire\_home\_$r$} & Constructed & Share of entire-home Airbnb listings within $r$ & Proportion \\
53 + \texttt{mean\_rating\_$r$} & Constructed & Mean rating of Airbnb listings within $r$ & Numeric \\
54 + \texttt{superhost\_share\_$r$} & Constructed & Share of superhost listings within $r$ & Proportion \\
55 + \addlinespace
56 + \midrule
57 + \multicolumn{4}{l}{\textit{City-level variables}} \\
58 + \addlinespace
59 + \texttt{airbnb\_count\_city} & Constructed & Total Airbnb listings in the city & Count \\
60 + \texttt{mean\_airbnb\_price\_city} & Constructed & City-level mean Airbnb nightly price & CAD \\
61 + \texttt{share\_entire\_home\_city} & Constructed & City-level share of entire-home listings & Proportion \\
62 + \texttt{mean\_rent\_city} & Constructed & City-level mean monthly rent & CAD \\
63 + \bottomrule
64 + \end{tabularx}
65 + \begin{flushleft}
66 + \footnotesize\textit{Notes:} Buffer radii $r \in \{250\text{m}, 500\text{m}, 1\text{km}, 2\text{km}\}$. All monetary values are in Canadian dollars (CAD). ``Constructed'' indicates variables derived from the raw data during the cleaning and merge stages.
67 + \end{flushleft}
68 +\end{table}
69 +
70 +\subsection{City Name Standardisation}
71 +
72 +The Airbnb dataset contains city names with inconsistent formatting, including accented and unaccented variants and abbreviations. Table~\ref{tab:city_mapping} lists the standardisation mapping applied during data cleaning.
73 +
74 +\begin{table}[htbp]
75 + \centering
76 + \caption{City Name Standardisation Mapping}
77 + \label{tab:city_mapping}
78 + \small
79 + \begin{tabular}{ll}
80 + \toprule
81 + \textbf{Original Name(s)} & \textbf{Standardised Name} \\
82 + \midrule
83 + Montr\'{e}al & Montreal \\
84 + Qu\'{e}bec City, Quebec City, Quebec & Qu\'{e}bec \\
85 + Levis & L\'{e}vis \\
86 + Saint Come & Saint-C\^{o}me \\
87 + Sainte Adele, Sainte-Adele, Ste-Ad\`{e}le & Sainte-Ad\`{e}le \\
88 + Saint Sauveur, Saint-Sauveur-des-Monts & Saint-Sauveur \\
89 + Ste-Agathe-des-Monts & Sainte-Agathe-des-Monts \\
90 + \bottomrule
91 + \end{tabular}
92 +\end{table}
93 +
94 +\subsection{Sample Attrition}
95 +
96 +The following summarises the sample attrition at each stage of data cleaning:
97 +
98 +\begin{itemize}
99 + \item \textbf{Airbnb:} Raw dataset $\approx 5{,}000$ listings. After dropping listings with missing or non-positive prices, the cleaned sample retains 3{,}456 listings.
100 + \item \textbf{Rentals:} Raw dataset of 8{,}356 records. After restricting to single-family properties with monthly rental periods and positive parsed rents, the cleaned sample retains 8{,}303 listings, all with valid coordinates.
101 + \item \textbf{Spatial merge:} All rental listings with valid coordinates are retained; the Airbnb count is zero for listings with no Airbnb neighbours within the buffer radius (composition variables such as the mean nearby price are undefined in that case).
102 + \item \textbf{Regressions:} The baseline hedonic sample comprises the 7{,}925 rental listings with non-missing bedrooms and bathrooms.
103 +\end{itemize}
added paper/appendix/appendix_methods.tex +65 −0
@@ -0,0 +1,65 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% =============================================================================
3 +% appendix_methods.tex — Methodological details
4 +% =============================================================================
5 +\section{Methodological Appendix}\label{app:methods}
6 +
7 +\subsection{Haversine Distance Formula}\label{app:haversine}
8 +
9 +The Haversine formula computes the great-circle distance between two points on the surface of a sphere, given their latitudes and longitudes. For two points $(lat_1, lon_1)$ and $(lat_2, lon_2)$ expressed in radians, the Haversine distance is:
10 +
11 +\begin{equation}\label{eq:haversine}
12 + d = 2R \cdot \arcsin\!\left(\sqrt{\sin^2\!\left(\frac{\Delta lat}{2}\right) + \cos(lat_1) \cdot \cos(lat_2) \cdot \sin^2\!\left(\frac{\Delta lon}{2}\right)}\right),
13 +\end{equation}
14 +
15 +\noindent where:
16 +\begin{itemize}
17 + \item $R = 6{,}371$ km is the mean radius of the Earth;
18 + \item $\Delta lat = lat_2 - lat_1$ is the difference in latitudes;
19 + \item $\Delta lon = lon_2 - lon_1$ is the difference in longitudes.
20 +\end{itemize}
21 +
22 +The Haversine formula provides an accurate approximation for short to medium distances on the Earth's surface. For the distances relevant in our application (typically less than 5 km), the approximation error relative to the exact geodesic distance (Vincenty's formula) is negligible.
23 +
24 +\paragraph{Implementation.} In our spatial merge (Section~\ref{sec:spatial_merge}), the Haversine distance is computed in vectorised form using NumPy. For each chunk of rental listings, we compute the full pairwise distance matrix between the chunk and all Airbnb listings, yielding an $(n_{\text{chunk}} \times n_{\text{Airbnb}})$ matrix of distances. Buffer membership is determined by comparing each element of this matrix against the threshold radius $r$.
25 +
26 +\subsection{Spatial Weights Construction}\label{app:spatial_weights}
27 +
28 +The spatial weights matrix $\mathbf{W}$ used in Model~4 (Equation~\ref{eq:spatial_lag}) is a $k$-nearest-neighbour matrix with $k = 5$. For each rental listing $i$, the neighbourhood $\mathcal{N}_i$ is the set of the five rental listings closest to $i$ in Euclidean coordinate space (excluding $i$ itself):
29 +
30 +\begin{equation}
31 + w_{ik} = \begin{cases}
32 + \frac{1}{5} & \text{if } k \in \mathcal{N}_i, \\[4pt]
33 + 0 & \text{otherwise},
34 + \end{cases}
35 +\end{equation}
36 +
37 +\noindent so that the spatial lag $\sum_k w_{ik} \ln(\text{rent}_k)$ is the mean log rent of listing $i$'s five nearest neighbours. Row-standardisation guarantees that every observation has a well-defined, equally weighted neighbourhood, avoiding the empty-neighbourhood problem that a fixed-radius definition would create in sparse rural areas.
38 +
39 +\paragraph{Choice of $k$.} The choice of $k = 5$ balances two considerations. A smaller $k$ would capture only the most proximate listings, yielding a responsive but noisy spatial lag; a larger $k$ would average over a broader area, reducing noise but blurring relevant spatial variation---and, in dense urban cores, five nearest neighbours typically lie within a few hundred metres.
40 +
41 +\paragraph{Estimation.} The inclusion of a spatial lag of the dependent variable as a regressor introduces a well-known simultaneity problem: $\sum_k w_{ik} \ln(\text{rent}_k)$ is correlated with $\eta_i$ whenever the errors are spatially correlated, so OLS estimation of Equation~\ref{eq:spatial_lag} would be inconsistent. We therefore estimate the SAR model by the generalised-moments instrumental-variable estimator of Kelejian and Prucha (\texttt{GM\_Lag} in \texttt{spreg}), which instruments the spatial lag with spatially lagged exogenous regressors, and the SEM by the corresponding \texttt{GM\_Error} estimator \citep{anselin1988spatial, lesage2009introduction}.
42 +
43 +\subsection{Quantile Regression Estimation}
44 +
45 +The quantile regression model at quantile $\tau$ (Equation~\ref{eq:quantile}) is estimated by minimising the asymmetrically weighted sum of absolute residuals:
46 +
47 +\begin{equation}
48 + \hat{\boldsymbol{\beta}}_\tau = \arg\min_{\boldsymbol{\beta}} \sum_{i=1}^{n} \rho_\tau\!\left(\ln(\text{rent}_i) - \mathbf{X}_i' \boldsymbol{\beta}\right),
49 +\end{equation}
50 +
51 +\noindent where $\rho_\tau(u) = u(\tau - \mathbf{1}[u < 0])$ is the check function \citep{koenker1978regression}. We estimate the model with the iteratively reweighted least squares algorithm implemented in \texttt{statsmodels}.
52 +
53 +Standard errors are the asymptotic estimates based on the kernel estimate of the conditional density of the response at the fitted quantile (the default in \texttt{statsmodels}), which are consistent under independent but not necessarily identically distributed errors.
54 +
55 +\subsection{Machine-Learning Model Details}
56 +
57 +\paragraph{LASSO and Elastic Net.} The LASSO model \citep{tibshirani1996regression} estimates:
58 +\begin{equation}
59 + \hat{\boldsymbol{\beta}}_{\text{LASSO}} = \arg\min_{\boldsymbol{\beta}} \left\{ \frac{1}{2n}\|\mathbf{y} - \mathbf{X}\boldsymbol{\beta}\|_2^2 + \lambda \|\boldsymbol{\beta}\|_1 \right\},
60 +\end{equation}
61 +where $\lambda > 0$ is the regularisation parameter selected by 5-fold cross-validation. The elastic net extends this with an $L_2$ penalty, controlled by a mixing parameter $\alpha \in (0,1)$.
62 +
63 +\paragraph{Random Forest.} The random forest model \citep{breiman2001random} constructs an ensemble of $B = 500$ regression trees with a maximum depth of 15, each trained on a bootstrap sample with random feature subsampling.
64 +
65 +\paragraph{Gradient Boosting.} The gradient boosting model \citep{friedman2001greedy} sequentially fits shallow regression trees to the residuals of the current ensemble. We use 500 boosting iterations, a maximum tree depth of 5, and a learning rate of 0.05. SHAP (SHapley Additive exPlanations) values \citep{lundberg2017unified} are computed on the held-out test set from the fitted gradient boosting model to quantify the contribution of each feature to individual predictions.
added paper/appendix/appendix_robustness.tex +27 −0
@@ -0,0 +1,27 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% =============================================================================
3 +% appendix_robustness.tex — Additional robustness tables
4 +% =============================================================================
5 +\section{Additional Robustness Results}\label{app:robustness}
6 +
7 +This appendix presents additional robustness checks that supplement the results reported in Section~\ref{sec:robustness}.
8 +
9 +\subsection{Full Regression Output --- Baseline Hedonic Model}
10 +
11 +The preferred hedonic rent specification (Model~1c in Table~\ref{tab:hedonic_rent}) includes property controls (bedrooms, bathrooms, building type) and city fixed effects. Full regression output including all control variable coefficients and city fixed effects is available upon request.
12 +
13 +\subsection{Correlation Matrix of Airbnb Exposure Measures}
14 +
15 +The pairwise correlation matrix of the Airbnb exposure variables at the 500\,m buffer radius documents the degree of collinearity among alternative exposure measures. The various exposure measures---count, density, share of entire-home listings, mean price---are positively correlated, reflecting the spatial concentration of Airbnb activity.
16 +
17 +\subsection{Quantile Regression --- Full Coefficient Tables}
18 +
19 +The quantile regression results reported in Table~\ref{tab:quantile} focus on the Airbnb exposure coefficient across the rent distribution. Full coefficient tables including control variables at each quantile are available upon request.
20 +
21 +\subsection{Machine-Learning Cross-Validation Results}
22 +
23 +Table~\ref{tab:ml_performance} in the main text reports hold-out sample performance for all machine-learning models. The gradient boosting and random forest models achieve substantially higher $R^2$ on the test set relative to linear models, suggesting meaningful nonlinearities in the rent--amenity relationship.
24 +
25 +\subsection{Additional Subsample Results}
26 +
27 +The subsample analysis in Section~\ref{sec:robustness} examines Montreal versus non-Montreal and apartment versus house subsamples. Additional subsample results (e.g., by Airbnb exposure quartile or by borough-level regulation status) are available upon request.
added paper/main.pdf +0 −0

Binary file not shown.

added paper/main.tex +186 −0
@@ -0,0 +1,186 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% ============================================================================
3 +% UQO Working Paper No. 5
4 +% Airbnb, Residential Rents, and Housing Market Pressure:
5 +% A Hedonic and Spatial Econometric Analysis
6 +% ============================================================================
7 +\documentclass[12pt,letterpaper]{article}
8 +
9 +% --- Encoding & Language ---
10 +\usepackage[T1]{fontenc}
11 +\usepackage[english]{babel}
12 +
13 +% --- Page Layout ---
14 +\usepackage[
15 + letterpaper,
16 + top=1in, bottom=1in, left=1in, right=1in,
17 + headheight=15pt
18 +]{geometry}
19 +\usepackage{setspace}
20 +\onehalfspacing
21 +
22 +% --- Typography ---
23 +\usepackage{newtxtext,newtxmath}
24 +\usepackage{microtype}
25 +
26 +% --- Math ---
27 +\usepackage{amsmath,amsfonts}
28 +\let\Bbbk\relax
29 +\usepackage{amssymb}
30 +
31 +% --- Tables ---
32 +\usepackage{booktabs}
33 +\usepackage{tabularx}
34 +\usepackage{multirow}
35 +\usepackage{threeparttable}
36 +\usepackage{dcolumn}
37 +\newcolumntype{d}[1]{D{.}{.}{#1}}
38 +
39 +% --- Figures ---
40 +\usepackage{graphicx}
41 +\usepackage{float}
42 +\usepackage[
43 + font = small,
44 + labelfont = bf,
45 + labelsep = period,
46 + skip = 6pt,
47 + justification = centering
48 +]{caption}
49 +\usepackage{subcaption}
50 +
51 +% --- Lists ---
52 +\usepackage{enumitem}
53 +\setlist{nosep,leftmargin=*}
54 +
55 +% --- Colors & Links ---
56 +\usepackage[dvipsnames]{xcolor}
57 +\usepackage[bookmarks, bookmarksnumbered]{hyperref}
58 +\hypersetup{
59 + colorlinks = true,
60 + linkcolor = NavyBlue,
61 + citecolor = NavyBlue,
62 + urlcolor = NavyBlue,
63 + pdfauthor = {Simon-Pierre Boucher},
64 + pdftitle = {Airbnb, Residential Rents, and Housing Market Pressure}
65 +}
66 +
67 +% --- Landscape ---
68 +\usepackage{lscape}
69 +
70 +% --- Bibliography ---
71 +\usepackage[round]{natbib}
72 +\setcitestyle{aysep={}}
73 +\bibliographystyle{apalike}
74 +
75 +% --- Headers & Footers ---
76 +\usepackage{fancyhdr}
77 +\pagestyle{fancy}
78 +\fancyhf{}
79 +\fancyhead[L]{\small\itshape Airbnb, Residential Rents, and Housing Market Pressure}
80 +\fancyhead[R]{\small\thepage}
81 +\renewcommand{\headrulewidth}{0.4pt}
82 +\renewcommand{\footrulewidth}{0pt}
83 +\fancypagestyle{plain}{%
84 + \fancyhf{}
85 + \fancyfoot[C]{\small\thepage}
86 + \renewcommand{\headrulewidth}{0pt}
87 +}
88 +
89 +% --- Section Formatting ---
90 +\usepackage{titlesec}
91 +\titleformat{\section}{\large\bfseries}{\thesection.}{0.5em}{}
92 +\titleformat{\subsection}{\normalsize\bfseries}{\thesubsection.}{0.5em}{}
93 +\titleformat{\subsubsection}{\normalsize\itshape}{\thesubsubsection.}{0.5em}{}
94 +\titlespacing*{\section}{0pt}{18pt}{8pt}
95 +\titlespacing*{\subsection}{0pt}{12pt}{4pt}
96 +
97 +% --- Appendix ---
98 +\usepackage{apptools}
99 +\AtAppendix{%
100 + \renewcommand{\thetable}{A\arabic{table}}%
101 + \setcounter{table}{0}%
102 + \renewcommand{\thefigure}{A\arabic{figure}}%
103 + \setcounter{figure}{0}%
104 + \renewcommand{\theequation}{A.\arabic{equation}}%
105 + \setcounter{equation}{0}%
106 +}
107 +
108 +% --- Graphics Path ---
109 +\graphicspath{{../figures/}{.}}
110 +
111 +% ============================================================================
112 +% METADATA
113 +% ============================================================================
114 +\newcommand{\WPnumber}{5}
115 +\newcommand{\WPtitle}{Airbnb, Residential Rents, and Housing Market Pressure: A Hedonic and Spatial Econometric Analysis}
116 +\newcommand{\WPsubtitle}{}
117 +\newcommand{\WPdate}{May 2026}
118 +\newcommand{\WPversion}{1.0}
119 +\newcommand{\WPabstract}{%
120 +This paper investigates the relationship between Airbnb short-term rental
121 +activity and residential rents in Quebec, Canada. Using cross-sectional
122 +microdata comprising approximately 5,000 Airbnb listings and 8,300
123 +residential rental listings, we employ a hedonic pricing framework augmented
124 +with spatial econometric techniques to quantify the conditional association
125 +between nearby Airbnb presence and monthly rents. For each rental listing we
126 +construct Airbnb exposure measures within 250\,m, 500\,m, 1\,km, and 2\,km
127 +buffers using Haversine distances. Our baseline estimates indicate that an
128 +additional Airbnb listing within 500\,m is associated with a statistically
129 +significant increase in monthly rent of approximately 0.3--0.5\%, controlling
130 +for dwelling characteristics, building type, and city fixed effects. Quantile
131 +regressions reveal that this association is stronger at the upper tail of the
132 +rent distribution. A complementary hedonic model of Airbnb nightly prices
133 +indicates that short-term rental pricing is driven primarily by listing
134 +characteristics, with no significant premium attached to city-level rents.
135 +Robustness checks---including alternative buffer radii, subsample
136 +analyses, and machine-learning benchmarks---confirm the stability of the
137 +rent--exposure association. We discuss the policy implications of these results for housing
138 +affordability and short-term rental regulation, while cautioning that
139 +cross-sectional associations should not be interpreted as causal effects.%
140 +}
141 +\newcommand{\WPkeywords}{Airbnb, short-term rentals, housing rents, hedonic pricing, spatial econometrics, housing affordability, Quebec}
142 +\newcommand{\WPjel}{R21, R31, L83, C21}
143 +
144 +% --- Author ---
145 +\newcommand{\WPauthor}{Simon-Pierre Boucher}
146 +\newcommand{\WPaffiliation}{%
147 + D\'epartement des sciences administratives\\
148 + Universit\'e du Qu\'ebec en Outaouais%
149 +}
150 +\newcommand{\WPemail}{simon-pierre.boucher@uqo.ca}
151 +\newcommand{\WPaddress}{%
152 + Gatineau -- Pavillon Alexandre-Tach\'e\\
153 + 283, boulevard Alexandre-Tach\'e\\
154 + Gatineau, Qu\'ebec, Canada J9A 1L8%
155 +}
156 +
157 +% ============================================================================
158 +% DOCUMENT
159 +% ============================================================================
160 +\begin{document}
161 +
162 +% --- Title Page ---
163 +\input{sections/titlepage}
164 +
165 +% --- Main Body ---
166 +\input{sections/01_introduction}
167 +\input{sections/02_literature}
168 +\input{sections/03_data}
169 +\input{sections/04_methodology}
170 +\input{sections/05_results}
171 +\input{sections/06_robustness}
172 +\input{sections/07_discussion}
173 +\input{sections/08_conclusion}
174 +
175 +% --- References ---
176 +\newpage
177 +\bibliography{references}
178 +
179 +% --- Appendix ---
180 +\newpage
181 +\appendix
182 +\input{appendix/appendix_data}
183 +\input{appendix/appendix_methods}
184 +\input{appendix/appendix_robustness}
185 +
186 +\end{document}
added paper/references.bib +270 −0
@@ -0,0 +1,270 @@
1 +% Author: Simon-Pierre Boucher — contact (at) spboucher.ai
2 +% =============================================================================
3 +% references.bib
4 +% IMPORTANT: All entries below are reconstructed from memory and NEED
5 +% VERIFICATION against the actual publications before submission.
6 +% Check titles, journal names, volume/issue numbers, page ranges, and DOIs.
7 +% =============================================================================
8 +
9 +% ── Short-term rentals and housing markets ──────────────────────────────────
10 +
11 +@article{barron2021effect,
12 + title = {The Effect of Home-Sharing on House Prices and Rents: Evidence from {Airbnb}},
13 + author = {Barron, Kyle and Kung, Edward and Proserpio, Davide},
14 + journal = {Marketing Science},
15 + volume = {40},
16 + number = {1},
17 + pages = {23--47},
18 + year = {2021},
19 + publisher = {INFORMS},
20 +}
21 +
22 +@techreport{sheppard2016airbnb,
23 + title = {Do {Airbnb} Properties Affect House Prices?},
24 + author = {Sheppard, Stephen and Udell, Andrew},
25 + institution = {Williams College Department of Economics},
26 + year = {2016},
27 + type = {Working Paper},
28 +}
29 +
30 +@article{garcia2020airbnb,
31 + title = {{Airbnb}, Short-Term Rentals and Housing Prices: Evidence from {Barcelona}},
32 + author = {Garcia-L\'{o}pez, Miquel-\`{A}ngel and Jofre-Monseny, Jordi and Mart\'{i}nez-Mazza, Rodrigo and Segú, Mariona},
33 + journal = {Journal of Urban Economics},
34 + volume = {119},
35 + pages = {103278},
36 + year = {2020},
37 + publisher = {Elsevier},
38 +}
39 +
40 +@article{horn2017airbnb,
41 + title = {Is Home Sharing Driving Up Rents? Evidence from {Airbnb} in {Boston}},
42 + author = {Horn, Keren and Merante, Mark},
43 + journal = {Journal of Housing Economics},
44 + volume = {38},
45 + pages = {14--24},
46 + year = {2017},
47 + publisher = {Elsevier},
48 +}
49 +
50 +@article{wachsmuth2018airbnb,
51 + title = {{Airbnb} and the Rent Gap: Gentrification Through the Sharing Economy},
52 + author = {Wachsmuth, David and Weisler, Alexander},
53 + journal = {Environment and Planning A: Economy and Space},
54 + volume = {50},
55 + number = {6},
56 + pages = {1147--1170},
57 + year = {2018},
58 + publisher = {SAGE Publications},
59 +}
60 +
61 +@article{ke2017sharing,
62 + title = {Short-Term Rentals and the Sharing Economy: The Case of {Airbnb}},
63 + author = {Ke, Qiulin},
64 + journal = {International Journal of Hospitality Management},
65 + volume = {67},
66 + pages = {120--129},
67 + year = {2017},
68 + publisher = {Elsevier},
69 +}
70 +
71 +% ── Hedonic pricing theory ──────────────────────────────────────────────────
72 +
73 +@article{rosen1974hedonic,
74 + title = {Hedonic Prices and Implicit Markets: Product Differentiation in Pure Competition},
75 + author = {Rosen, Sherwin},
76 + journal = {Journal of Political Economy},
77 + volume = {82},
78 + number = {1},
79 + pages = {34--55},
80 + year = {1974},
81 + publisher = {University of Chicago Press},
82 +}
83 +
84 +@incollection{palmquist2005property,
85 + title = {Property Value Models},
86 + author = {Palmquist, Raymond B.},
87 + booktitle = {Handbook of Environmental Economics},
88 + editor = {M\"{a}ler, Karl-G\"{o}ran and Vincent, Jeffrey R.},
89 + volume = {2},
90 + pages = {763--819},
91 + year = {2005},
92 + publisher = {Elsevier},
93 +}
94 +
95 +@article{parmeter2010applied,
96 + title = {Applied Nonparametric Instrumental Variables Estimation},
97 + author = {Parmeter, Christopher F. and Henderson, Daniel J. and Kumbhakar, Subal C.},
98 + journal = {Econometric Reviews},
99 + volume = {29},
100 + number = {4},
101 + pages = {398--418},
102 + year = {2010},
103 + publisher = {Taylor \& Francis},
104 +}
105 +
106 +% ── Spatial econometrics ────────────────────────────────────────────────────
107 +
108 +@book{anselin1988spatial,
109 + title = {Spatial Econometrics: Methods and Models},
110 + author = {Anselin, Luc},
111 + year = {1988},
112 + publisher = {Kluwer Academic Publishers},
113 + address = {Dordrecht},
114 +}
115 +
116 +@book{lesage2009introduction,
117 + title = {Introduction to Spatial Econometrics},
118 + author = {LeSage, James P. and Pace, R. Kelley},
119 + year = {2009},
120 + publisher = {CRC Press},
121 + address = {Boca Raton, FL},
122 +}
123 +
124 +% ── Quantile regression ────────────────────────────────────────────────────
125 +
126 +@article{koenker1978regression,
127 + title = {Regression Quantiles},
128 + author = {Koenker, Roger and Bassett, Gilbert},
129 + journal = {Econometrica},
130 + volume = {46},
131 + number = {1},
132 + pages = {33--50},
133 + year = {1978},
134 + publisher = {Econometric Society},
135 +}
136 +
137 +@article{zietz2008determinants,
138 + title = {Determinants of House Prices: A Quantile Regression Approach},
139 + author = {Zietz, Joachim and Zietz, Emily Norman and Sirmans, G. Stacy},
140 + journal = {Journal of Real Estate Finance and Economics},
141 + volume = {37},
142 + number = {4},
143 + pages = {317--333},
144 + year = {2008},
145 + publisher = {Springer},
146 +}
147 +
148 +% ── Machine learning and econometrics ───────────────────────────────────────
149 +
150 +@article{mullainathan2017machine,
151 + title = {Machine Learning: An Applied Econometric Approach},
152 + author = {Mullainathan, Sendhil and Spiess, Jann},
153 + journal = {Journal of Economic Perspectives},
154 + volume = {31},
155 + number = {2},
156 + pages = {87--106},
157 + year = {2017},
158 + publisher = {American Economic Association},
159 +}
160 +
161 +@article{athey2019machine,
162 + title = {Machine Learning Methods That Economists Should Know About},
163 + author = {Athey, Susan and Imbens, Guido W.},
164 + journal = {Annual Review of Economics},
165 + volume = {11},
166 + pages = {685--725},
167 + year = {2019},
168 + publisher = {Annual Reviews},
169 +}
170 +
171 +@article{tibshirani1996regression,
172 + title = {Regression Shrinkage and Selection via the {Lasso}},
173 + author = {Tibshirani, Robert},
174 + journal = {Journal of the Royal Statistical Society: Series B (Methodological)},
175 + volume = {58},
176 + number = {1},
177 + pages = {267--288},
178 + year = {1996},
179 + publisher = {Wiley},
180 +}
181 +
182 +@article{breiman2001random,
183 + title = {Random Forests},
184 + author = {Breiman, Leo},
185 + journal = {Machine Learning},
186 + volume = {45},
187 + number = {1},
188 + pages = {5--32},
189 + year = {2001},
190 + publisher = {Springer},
191 +}
192 +
193 +@article{friedman2001greedy,
194 + title = {Greedy Function Approximation: A Gradient Boosting Machine},
195 + author = {Friedman, Jerome H.},
196 + journal = {Annals of Statistics},
197 + volume = {29},
198 + number = {5},
199 + pages = {1189--1232},
200 + year = {2001},
201 + publisher = {Institute of Mathematical Statistics},
202 +}
203 +
204 +@inproceedings{lundberg2017unified,
205 + title = {A Unified Approach to Interpreting Model Predictions},
206 + author = {Lundberg, Scott M. and Lee, Su-In},
207 + booktitle = {Advances in Neural Information Processing Systems},
208 + volume = {30},
209 + pages = {4765--4774},
210 + year = {2017},
211 +}
212 +
213 +% ── Regulation and policy ──────────────────────────────────────────────────
214 +
215 +@article{nieuwland2020regulating,
216 + title = {Regulating {Airbnb}: How Cities Deal with Perceived Negative Externalities of Short-Term Rentals},
217 + author = {Nieuwland, Shirley and van Melik, Rianne},
218 + journal = {Current Issues in Tourism},
219 + volume = {23},
220 + number = {7},
221 + pages = {811--825},
222 + year = {2020},
223 + publisher = {Taylor \& Francis},
224 +}
225 +
226 +@article{agyeman2020airbnb,
227 + title = {{Airbnb} and the Undoing of Mid-Twentieth Century Housing Policy},
228 + author = {Agyeman, Julian and McLaren, Duncan and Schaefer-Borrego, Adrianne},
229 + journal = {Urban Studies},
230 + volume = {57},
231 + number = {14},
232 + pages = {2998--3015},
233 + year = {2020},
234 + publisher = {SAGE Publications},
235 +}
236 +
237 +% ── Housing economics ──────────────────────────────────────────────────────
238 +
239 +@article{glaeser2005urban,
240 + title = {Urban Growth and Housing Supply},
241 + author = {Glaeser, Edward L. and Gyourko, Joseph and Saks, Raven E.},
242 + journal = {Journal of Economic Geography},
243 + volume = {6},
244 + number = {1},
245 + pages = {71--89},
246 + year = {2005},
247 + publisher = {Oxford University Press},
248 +}
249 +
250 +@article{saiz2010geographic,
251 + title = {The Geographic Determinants of Housing Supply},
252 + author = {Saiz, Albert},
253 + journal = {Quarterly Journal of Economics},
254 + volume = {125},
255 + number = {3},
256 + pages = {1253--1296},
257 + year = {2010},
258 + publisher = {Oxford University Press},
259 +}
260 +
261 +@article{gyourko2005superstar,
262 + title = {Superstar Cities},
263 + author = {Gyourko, Joseph and Mayer, Christopher and Sinai, Todd},
264 + journal = {American Economic Journal: Economic Policy},
265 + volume = {5},
266 + number = {4},
267 + pages = {167--199},
268 + year = {2013},
269 + publisher = {American Economic Association},
270 +}
added paper/sections/01_introduction.tex +19 −0
@@ -0,0 +1,19 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% =============================================================================
3 +% 01_introduction.tex
4 +% =============================================================================
5 +\section{Introduction}\label{sec:introduction}
6 +
7 +The rapid expansion of short-term rental platforms has fundamentally transformed urban housing markets around the world. Since its founding in 2008, Airbnb has grown from a modest home-sharing service into a global hospitality platform with millions of listings across virtually every major city. By enabling property owners to rent their dwellings---or portions thereof---to short-term visitors at nightly rates that often exceed what a long-term tenant would pay on a monthly basis, the platform has created powerful economic incentives to divert housing units from the residential rental market.
8 +
9 +This diversion mechanism sits at the heart of a growing policy concern: that the proliferation of Airbnb listings may contribute to rising residential rents and reduced housing affordability, particularly in cities with significant tourist appeal. The economic logic is straightforward. When landlords can earn higher returns by listing a unit on Airbnb than by renting it to a long-term tenant, the effective supply of long-term rental housing contracts. On the demand side, Airbnb may attract additional visitors to a neighbourhood, increasing foot traffic, consumption amenities, and---through general equilibrium effects---the desirability of the area for both tourists and residents. The net effect on rents is theoretically ambiguous: supply withdrawal pushes rents upward, while the sign and magnitude of demand-side amenity effects depend on the local context, the composition of Airbnb listings, and the degree of market segmentation between short-term and long-term rentals.
10 +
11 +The province of Quebec, and the city of Montreal in particular, provides a compelling setting in which to study these dynamics. Montreal is Canada's second-largest city and one of North America's foremost tourist destinations, attracting over 11 million visitors annually prior to the COVID-19 pandemic. Its dense, walkable neighbourhoods, vibrant cultural scene, and historic architecture make it especially attractive for short-term rental guests. At the same time, Quebec has experienced significant rental market pressures in recent years. Vacancy rates in the Montreal census metropolitan area have fallen to historically low levels, and median rents have risen substantially. Policymakers at the provincial and municipal levels have responded with a mix of regulatory interventions, including registration requirements for short-term rental operators and zoning restrictions, but the empirical evidence on the housing-market effects of Airbnb in the Quebec context remains limited.
12 +
13 +Estimating the effect of short-term rental platforms on residential rents poses significant empirical challenges. The most fundamental is endogeneity: Airbnb listings are not randomly assigned to locations. Hosts choose to list in neighbourhoods where rents---and tourist demand---are already high, creating a positive correlation between Airbnb density and rent levels that may reflect reverse causality or omitted neighbourhood characteristics rather than a genuine causal effect. In the ideal research design, one would exploit plausible exogenous variation in Airbnb supply---for example, a regulatory shock that differentially affected neighbourhoods---combined with panel data to control for time-invariant unobservables. Our data, however, are cross-sectional: they comprise a single snapshot of Airbnb and rental listings in Quebec, scraped in 2026. We therefore adopt a transparent hedonic pricing framework that quantifies the conditional association between Airbnb presence and rents, controlling for a rich set of dwelling characteristics and location fixed effects, while being explicit about the limitations of causal interpretation.
14 +
15 +Our empirical strategy proceeds in several stages. First, we estimate a hedonic rent model in which the logarithm of monthly rent is regressed on the count of Airbnb listings within a spatial buffer (our preferred radius is 500 metres), controlling for the number of bedrooms, bathrooms, building type, and city fixed effects. This specification yields a semi-elasticity interpretation: the coefficient on Airbnb count measures the percentage change in rent associated with one additional nearby Airbnb listing, holding observable dwelling characteristics constant. Second, we estimate a complementary hedonic model of Airbnb nightly prices, in which city-level mean rents serve as a control, allowing us to examine the bidirectional pricing relationship between the two market segments. Third, we aggregate the data to the city level to examine cross-city variation in Airbnb penetration and mean rents. Fourth, we incorporate spatial lags and vary the buffer radius (250\,m, 500\,m, 1\,km, 2\,km) to assess the spatial decay of the association. Fifth, quantile regressions at the 10th, 25th, 50th, 75th, and 90th percentiles reveal how the Airbnb--rent association varies across the conditional rent distribution. Sixth, we benchmark our parametric estimates against machine-learning methods---LASSO, elastic net, random forest, and gradient boosting---to assess predictive importance and model robustness.
16 +
17 +This paper makes three contributions. First, it provides the first granular, listing-level analysis of the Airbnb--rent nexus in Quebec, drawing on microdata with precise geographic coordinates that allow exact distance-based matching between Airbnb and rental listings. Second, it applies a multi-method approach---combining hedonic regressions, spatial analysis, quantile regressions, and machine learning---to a single dataset, enabling direct comparison of results across methodological frameworks. Third, it contributes to the ongoing policy debate about short-term rental regulation in Canadian cities by providing empirically grounded estimates of the magnitude of the Airbnb--rent association, even as it highlights the limitations inherent in cross-sectional identification.
18 +
19 +The remainder of the paper is organised as follows. Section~\ref{sec:literature} reviews the related literature on short-term rentals and housing markets. Section~\ref{sec:data} describes the data sources, cleaning procedures, and spatial merge strategy. Section~\ref{sec:methodology} presents the econometric framework. Section~\ref{sec:results} reports the main empirical results. Section~\ref{sec:robustness} provides robustness checks and sensitivity analyses. Section~\ref{sec:discussion} discusses policy implications and limitations. Section~\ref{sec:conclusion} concludes.
added paper/sections/02_literature.tex +43 −0
@@ -0,0 +1,43 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% =============================================================================
3 +% 02_literature.tex
4 +% =============================================================================
5 +\section{Literature Review}\label{sec:literature}
6 +
7 +This section reviews the growing body of empirical research on the relationship between short-term rental platforms and housing markets, situating our analysis within the broader literatures on hedonic pricing, spatial econometrics, and the economics of the sharing economy.
8 +
9 +\subsection{Short-Term Rentals and Housing Markets}
10 +
11 +The seminal empirical study of Airbnb's impact on housing costs is \citet{barron2021effect}, who exploit zipcode-level variation in Airbnb penetration across the United States to estimate the platform's effect on both rents and house prices. Using an instrumental-variables strategy based on Google Trends data for Airbnb-related searches, they find that a 1\% increase in Airbnb listings is associated with a 0.018\% increase in rents and a 0.026\% increase in house prices. The authors attribute the effect primarily to the reduction in rental supply, as landlords convert long-term rental units into short-term listings. Our study differs in geographic scope (Quebec rather than the entire US), unit of analysis (individual listings rather than zipcodes), and identification strategy (hedonic controls rather than instrumental variables), but we share the same underlying economic hypothesis.
12 +
13 +\citet{sheppard2016airbnb} study the impact of Airbnb on property values in New York City using a hedonic framework. Exploiting variation in Airbnb listing density across census tracts, they estimate that Airbnb activity increased property values by approximately 6--11\% in high-penetration neighbourhoods. Their analysis highlights the capitalisation of short-term rental income potential into property prices, a channel that is distinct from the rental-supply-reduction mechanism but operates through similar spatial proximity channels.
14 +
15 +\citet{garcia2020airbnb} provide detailed evidence from Barcelona, one of the world's most Airbnb-affected cities. Using transaction-level data on housing prices and spatially disaggregated Airbnb data, they find that Airbnb activity led to a 1.9\% increase in transaction prices and a 4.6\% increase in posted rents in areas of high Airbnb concentration. Their identification strategy relies on the sharp spatial variation in tourist attractiveness within Barcelona, combined with pre-/post-Airbnb comparisons. The Barcelona context shares important features with Montreal: both are major tourist destinations with dense urban cores and significant heritage architecture.
16 +
17 +\citet{horn2017airbnb} focus specifically on the rental market in Boston, estimating the effect of Airbnb listings on asking rents at the census-tract level. They find that a one-standard-deviation increase in Airbnb listings is associated with a 0.4\% increase in asking rents, an effect concentrated in neighbourhoods where a larger share of Airbnb listings are entire-home units rather than shared rooms. This finding motivates our construction of the \texttt{share\_entire\_home} variable and our attention to the composition of Airbnb listings within each spatial buffer.
18 +
19 +\subsection{Hedonic Pricing Theory}
20 +
21 +The hedonic pricing framework, formalised by \citet{rosen1974hedonic}, provides the theoretical foundation for our empirical approach. Rosen's model characterises housing as a differentiated good whose price is determined by an implicit market in which consumers bid for bundles of characteristics---including structural attributes (bedrooms, bathrooms, floor area), locational attributes (neighbourhood quality, accessibility, amenities), and environmental attributes. In this framework, the Airbnb count within a spatial buffer can be interpreted as a locational characteristic that captures the degree of short-term rental activity in the neighbourhood, and its hedonic coefficient reveals the marginal implicit price of exposure to that activity.
22 +
23 +The hedonic approach has been widely applied in the housing economics literature \citep{palmquist2005property, parmeter2010applied}, and it is well suited to our cross-sectional setting. Its principal limitation is the requirement that all relevant quality differences be observed and included as controls; omitted characteristics that are correlated with both Airbnb density and rents will bias the estimated hedonic coefficients. We address this concern by including city fixed effects, which absorb all unobserved city-level heterogeneity, and by reporting results for multiple specifications with progressively richer control sets.
24 +
25 +\subsection{Spatial Econometrics in Housing Research}
26 +
27 +The recognition that housing prices exhibit strong spatial dependence has motivated a large literature on spatial econometric methods for housing markets. \citet{anselin1988spatial} developed the foundational spatial lag and spatial error models that account for spillovers and spatial autocorrelation in cross-sectional regression. \citet{lesage2009introduction} provide a comprehensive treatment of spatial econometric techniques, including the construction of spatial weights matrices and the interpretation of direct and indirect (spillover) effects.
28 +
29 +In the context of Airbnb and housing markets, spatial dependence arises naturally: the rent of a dwelling is influenced not only by its own characteristics but also by the rents and Airbnb activity in nearby locations. Our buffer-based measure of Airbnb exposure is, in effect, a spatially weighted variable that aggregates short-term rental activity within a defined neighbourhood. We complement this approach by including spatially lagged rent variables (the mean rent of nearby listings) to capture peer effects in pricing.
30 +
31 +\subsection{Tourism, Commercialisation, and Regulation}
32 +
33 +\citet{wachsmuth2018airbnb} examine the ``rent gap'' created by Airbnb, arguing that the platform enables a process of ``tourism gentrification'' in which entire neighbourhoods are transformed from residential to quasi-commercial use. Their analysis of New York City demonstrates that professional, multi-listing hosts account for a disproportionate share of Airbnb revenue, suggesting that the platform has moved well beyond its original peer-to-peer home-sharing model. \citet{ke2017sharing} documents the rise of professional hosts and the commercialisation of Airbnb listings, finding that multi-listing operators are associated with higher prices and greater market concentration.
34 +
35 +The commercialisation of short-term rental platforms has prompted regulatory responses across many jurisdictions. \citet{nieuwland2020regulating} provide a comparative analysis of regulatory approaches in major cities, ranging from outright bans on short-term rentals to registration requirements, occupancy limits, and zoning restrictions. In Quebec, provincial legislation requires short-term rental operators to register with the Corporation de l'industrie touristique du Qu\'{e}bec (CITQ), and the City of Montreal has implemented additional restrictions in certain boroughs. The effectiveness of these regulations remains an active area of research \citep{agyeman2020airbnb}.
36 +
37 +\subsection{Quantile Regression and Distributional Effects}
38 +
39 +A growing strand of the housing literature recognises that the relationship between housing characteristics and prices may vary across the conditional price distribution. \citet{koenker1978regression} introduced quantile regression as a method for estimating conditional quantile functions, and \citet{zietz2008determinants} applied the technique to hedonic housing models, finding that the implicit prices of many dwelling characteristics differ significantly between the lower and upper tails of the price distribution. In the Airbnb context, distributional heterogeneity is economically plausible: short-term rental activity may have different effects on low-rent versus high-rent dwellings, reflecting differences in market segmentation, neighbourhood desirability, and the types of units most likely to be converted to short-term rentals.
40 +
41 +\subsection{Machine Learning in Housing Economics}
42 +
43 +Recent advances in machine learning have been increasingly adopted in housing economics for prediction and variable selection. \citet{mullainathan2017machine} discuss the role of machine learning in econometric analysis, distinguishing between prediction tasks (where flexible models excel) and causal inference tasks (where traditional econometric methods remain essential). \citet{athey2019machine} provide a broader survey of machine-learning methods for causal inference. In our robustness analysis, we employ LASSO, elastic net, random forest, and gradient boosting models not to make causal claims but to assess the predictive importance of Airbnb exposure variables relative to other determinants of rent and to verify that our hedonic estimates are not artefacts of linear functional-form assumptions.
added paper/sections/03_data.tex +107 −0
@@ -0,0 +1,107 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% =============================================================================
3 +% 03_data.tex
4 +% =============================================================================
5 +\section{Data}\label{sec:data}
6 +
7 +This section describes the two primary datasets, the cleaning procedures applied to each, the spatial merge strategy used to link them, and the construction of key variables.
8 +
9 +\subsection{Airbnb Listings}
10 +
11 +Our Airbnb data consist of approximately 5{,}000 listings scraped from the Airbnb platform for the province of Quebec, Canada. Each listing record contains the following fields: listing name, city, latitude and longitude coordinates, property type, nightly price (in Canadian dollars), star rating, number of reviews, superhost status, guest-favourite designation, pet-friendliness, and price/rating category indicators.
12 +
13 +The listings span multiple cities across Quebec, with the largest concentrations in Montreal, Quebec City (Qu\'{e}bec), Sherbrooke, and various resort/cottage communities in the Laurentians and Eastern Townships. Property types include \textit{Rental unit}, \textit{Cabin/Chalet}, \textit{House}, \textit{Condo}, and \textit{Apartment}, with Rental unit being the most common category.
14 +
15 +\paragraph{Cleaning.} We standardise city names by merging accented and unaccented variants (e.g., ``Montr\'{e}al'' and ``Montreal'') and consolidating aliases (e.g., ``Quebec City'' and ``Qu\'{e}bec City'' mapped to ``Qu\'{e}bec''). We drop listings with missing or non-positive nightly prices, which yields a cleaned sample of 3{,}456 listings, and winsorise the price distribution at the 1st and 99th percentiles to mitigate the influence of extreme outliers. The log-transformed price, $\ln(\text{price\_numeric})$, is used as the dependent variable in the Airbnb pricing model. Missing ratings are imputed with the sample median, reflecting the assumption that unrated listings represent recently created properties whose quality is, on average, comparable to the centre of the distribution. Missing review counts are set to zero. An indicator variable, \texttt{is\_entire\_home}, is constructed to identify listings of types House, Cabin/Chalet, and Condo, which are typically rented in their entirety.
16 +
17 +\subsection{Residential Rental Listings}
18 +
19 +The rental data consist of approximately 8{,}300 listings scraped from Realtor.ca, Canada's primary real-estate listing platform, for the province of Quebec. Each record contains: address, latitude and longitude, property type, monthly lease rent (in Canadian dollars), building type, number of bedrooms, number of bathrooms, interior size, number of storeys, and postal code.
20 +
21 +Building types in the rental data are dominated by \textit{Apartment} ($n \approx 7{,}515$), followed by \textit{House} ($n \approx 745$) and \textit{Row/Townhouse} ($n \approx 48$). The geographic distribution is heavily concentrated in the Montreal metropolitan area, with additional clusters in Quebec City, Gatineau, Sherbrooke, and Laval.
22 +
23 +\paragraph{Cleaning.} Monthly rent values are extracted from the lease-rent string and converted to numeric format. We restrict the sample to listings with monthly rental periods and positive rent values. Extreme rent values are handled through winsorisation at the 1st and 99th percentiles. The log of monthly rent, $\ln(\text{rent})$, serves as the dependent variable in the hedonic rent model. Bedroom and bathroom counts are cleaned and converted to numeric types. Listings with missing geographic coordinates are dropped prior to spatial merging.
24 +
25 +\subsection{Spatial Merge Strategy}\label{sec:spatial_merge}
26 +
27 +The core challenge in linking the Airbnb and rental datasets is that they share no common listing identifiers. We exploit the fact that both datasets contain precise latitude and longitude coordinates to construct a spatial buffer merge. For each rental listing $i$, we compute the Haversine (great-circle) distance to every Airbnb listing $j$ and count the number of Airbnb listings falling within four concentric buffers: 250\,m, 500\,m, 1\,km, and 2\,km.
28 +
29 +Formally, the Airbnb count for rental listing $i$ within buffer radius $r$ is:
30 +\begin{equation}\label{eq:buffer_count}
31 + \texttt{airbnb\_count}_{i,r} = \sum_{j=1}^{N_{\text{Airbnb}}} \mathbf{1}\left[ d(i, j) \leq r \right],
32 +\end{equation}
33 +where $d(i, j)$ is the Haversine distance between listings $i$ and $j$, and $\mathbf{1}[\cdot]$ is the indicator function.
34 +
35 +In addition to the count, we construct several exposure metrics within each buffer: Airbnb density (count divided by buffer area, $\pi r^2$), mean Airbnb nightly price, share of entire-home listings, mean rating, and superhost share. These variables capture not only the intensity of Airbnb activity but also its composition and quality.
36 +
37 +At the preferred 500\,m radius, the mean Airbnb count per rental listing is approximately 8 listings, with substantial variation across urban and rural areas.
38 +
39 +\subsection{City-Level Aggregation}
40 +
41 +As a complementary linkage strategy, we aggregate Airbnb data to the city level and merge city-level summary statistics---total Airbnb count, mean nightly price, share of entire-home listings---onto the rental data using the city name as the merge key. This approach sacrifices the within-city spatial variation that drives our buffer-based analysis but provides a useful benchmark for examining cross-city relationships.
42 +
43 +\subsection{Summary Statistics}
44 +
45 +Tables~\ref{tab:summary_airbnb} and~\ref{tab:summary_rent} present summary statistics for the cleaned Airbnb and rental datasets, respectively.
46 +
47 +\begin{table}[htbp]
48 + \centering
49 + \caption{Summary Statistics --- Airbnb Listings}
50 + \label{tab:summary_airbnb}
51 + \input{../results/tables/summary_stats_airbnb.tex}
52 +\end{table}
53 +
54 +\begin{table}[htbp]
55 + \centering
56 + \caption{Summary Statistics --- Residential Rental Listings}
57 + \label{tab:summary_rent}
58 + \input{../results/tables/summary_stats_rent.tex}
59 +\end{table}
60 +
61 +Key features of the data are worth noting. The median Airbnb nightly price is approximately \$220 CAD, while the median monthly rent is approximately \$1{,}950 CAD. There is substantial variation in both prices, reflecting the heterogeneity of listings in terms of location, size, and quality. The Airbnb data span a wide range of property types, from budget-oriented rental units to luxury chalets, while the rental data are dominated by apartment units.
62 +
63 +% Table removed: buffer_summary.tex not generated as a separate file.
64 +% Buffer-based exposure statistics are described in Section~\ref{sec:spatial_merge}.
65 +
66 +\subsection{Geographic Distribution}
67 +
68 +Figures~\ref{fig:map_airbnb} and~\ref{fig:map_rent} display the geographic distribution of Airbnb and rental listings, respectively. The spatial overlap between the two datasets is concentrated in the Montreal metropolitan area and, to a lesser extent, in Quebec City and resort regions.
69 +
70 +\begin{figure}[htbp]
71 + \centering
72 + \includegraphics[width=0.85\textwidth]{map_airbnb.pdf}
73 + \caption{Geographic Distribution of Airbnb Listings in Quebec}
74 + \label{fig:map_airbnb}
75 +\end{figure}
76 +
77 +\begin{figure}[htbp]
78 + \centering
79 + \includegraphics[width=0.85\textwidth]{map_rent.pdf}
80 + \caption{Geographic Distribution of Residential Rental Listings in Quebec}
81 + \label{fig:map_rent}
82 +\end{figure}
83 +
84 +Figure~\ref{fig:price_distributions} shows the distributions of Airbnb nightly prices and monthly rents (both in levels, trimmed above the 99th percentile for readability).
85 +
86 +\begin{figure}[htbp]
87 + \centering
88 + \begin{subfigure}[t]{0.48\textwidth}
89 + \centering
90 + \includegraphics[width=\textwidth]{dist_airbnb_price.pdf}
91 + \caption{Airbnb nightly price (CAD)}
92 + \label{fig:dist_airbnb}
93 + \end{subfigure}
94 + \hfill
95 + \begin{subfigure}[t]{0.48\textwidth}
96 + \centering
97 + \includegraphics[width=\textwidth]{dist_rent.pdf}
98 + \caption{Monthly rent (CAD)}
99 + \label{fig:dist_rent}
100 + \end{subfigure}
101 + \caption{Distributions of Airbnb Nightly Prices and Monthly Rents}
102 + \label{fig:price_distributions}
103 +\end{figure}
104 +
105 +\subsection{Data Limitations}
106 +
107 +Several limitations of the data should be acknowledged. First, the data are cross-sectional, representing a single snapshot in time. We cannot observe how Airbnb entry or exit affects rents over time, nor can we control for time-varying confounders. Second, we do not observe host identifiers, which precludes the construction of multi-listing indicators at the host level---a variable that has been important in prior studies for distinguishing professional from casual hosts. Third, the Airbnb data are scraped from the public-facing platform and may not capture all listings, particularly those that are inactive, delisted, or hidden behind search filters. Fourth, the rental data from Realtor.ca represent \textit{asking} rents rather than \textit{transacted} rents; to the extent that there is systematic negotiation between posted and final rents, our dependent variable may be measured with noise. Fifth, there may be spatial selection in the data: the coverage of both platforms is likely denser in urban areas, particularly Montreal, which limits the generalisability of our findings to rural and peripheral markets.
added paper/sections/04_methodology.tex +90 −0
@@ -0,0 +1,90 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% =============================================================================
3 +% 04_methodology.tex
4 +% =============================================================================
5 +\section{Methodology}\label{sec:methodology}
6 +
7 +This section presents the econometric models employed to quantify the association between Airbnb activity and residential rents, discusses identification, and describes the machine-learning robustness framework.
8 +
9 +\subsection{Model 1: Hedonic Rent Model with Airbnb Exposure}\label{sec:model1}
10 +
11 +Our baseline specification is a hedonic rent equation in which the log of monthly rent is regressed on a measure of nearby Airbnb activity and a vector of dwelling-level controls:
12 +
13 +\begin{equation}\label{eq:hedonic_rent}
14 + \ln(\text{rent}_i) = \alpha + \beta \cdot \texttt{airbnb\_count}_{i,r} + \mathbf{X}_i' \boldsymbol{\gamma} + \sum_{c} \delta_c \cdot \mathbf{1}[\text{city}_i = c] + \varepsilon_i,
15 +\end{equation}
16 +
17 +\noindent where $\text{rent}_i$ is the monthly rent of listing $i$; $\texttt{airbnb\_count}_{i,r}$ is the number of Airbnb listings within buffer radius $r$ of listing $i$ (our preferred specification uses $r = 500$\,m); $\mathbf{X}_i$ is a vector of dwelling characteristics including the number of bedrooms, number of bathrooms, building type (Apartment, House, Row/Townhouse), and interior size (where available); $\delta_c$ denotes city fixed effects that absorb all time-invariant, city-level unobservables (including average neighbourhood quality, local labour-market conditions, and municipal regulations); and $\varepsilon_i$ is a mean-zero error term.
18 +
19 +The coefficient of interest, $\beta$, has a semi-elasticity interpretation: it measures the approximate percentage change in monthly rent associated with one additional Airbnb listing within the buffer, conditional on observed dwelling characteristics and city. A positive and statistically significant $\hat{\beta}$ is consistent with the hypothesis that Airbnb activity is associated with higher residential rents, though it does not, by itself, establish causality.
20 +
21 +We estimate Equation~\eqref{eq:hedonic_rent} by ordinary least squares (OLS) with heteroskedasticity-robust standard errors (HC1).
22 +
23 +\subsection{Model 2: Hedonic Airbnb Pricing Model}\label{sec:model2}
24 +
25 +To examine the pricing determinants of Airbnb listings and the relationship between local rents and short-term rental prices, we estimate a hedonic model of Airbnb nightly prices:
26 +
27 +\begin{equation}\label{eq:hedonic_airbnb}
28 + \ln(\text{price}_j) = \alpha' + \theta \cdot \overline{\text{rent}}_c + \mathbf{Z}_j' \boldsymbol{\lambda} + \sum_{c} \delta'_c \cdot \mathbf{1}[\text{city}_j = c] + u_j,
29 +\end{equation}
30 +
31 +\noindent where $\text{price}_j$ is the nightly price of Airbnb listing $j$; $\overline{\text{rent}}_c$ is the mean log monthly rent in city $c$ (obtained from the rental dataset); $\mathbf{Z}_j$ includes listing characteristics---the number of bedrooms and bathrooms, guest capacity, amenities count, superhost status, and the entire-home indicator; and $u_j$ is an error term.
32 +
33 +The coefficient $\theta$ captures the association between the local residential rent level and Airbnb pricing. A positive $\hat{\theta}$ would suggest that Airbnb hosts in higher-rent cities charge higher nightly prices, consistent with the opportunity-cost channel: when the forgone rental income from listing a unit on Airbnb is higher, hosts set higher nightly prices to compensate. Note that when city fixed effects are included, $\overline{\text{rent}}_c$ is collinear with the city dummies; in such specifications, $\theta$ is identified from the city-level variation absorbed by the fixed effects, and we report results both with and without city fixed effects.
34 +
35 +\subsection{Model 3: City-Level Interaction Model}\label{sec:model3}
36 +
37 +To characterise the bidirectional relationship between Airbnb activity and rents at the city level, we estimate a forward and a reverse aggregate regression:
38 +
39 +\begin{align}
40 + \overline{\ln(\text{rent})}_c &= a_1 + b_1 \cdot \text{airbnb\_count}_c + \mathbf{W}_c' \boldsymbol{\phi}_1 + e_{1c}, \label{eq:city_rent} \\[6pt]
41 + \text{airbnb\_count}_c &= a_2 + b_2 \cdot \overline{\ln(\text{rent})}_c + \mathbf{W}_c' \boldsymbol{\phi}_2 + e_{2c}, \label{eq:city_airbnb}
42 +\end{align}
43 +
44 +\noindent where overlines denote city-level means, $\text{airbnb\_count}_c$ is the total number of Airbnb listings in city $c$, and $\mathbf{W}_c$ contains city-level mean bedrooms and bathrooms. The coefficients $b_1$ and $b_2$ describe the cross-city co-movement of rents and Airbnb activity. Because many of the 153 cities in the aggregated sample contribute few underlying listings, these regressions should be interpreted as descriptive rather than inferential.
45 +
46 +\subsection{Model 4: Spatial Analysis}\label{sec:model4}
47 +
48 +To account for spatial dependence in rents, we estimate a spatial autoregressive (SAR) model and a spatial error model (SEM) alongside the OLS baseline. The SAR model augments the hedonic equation with a spatial lag of the dependent variable:
49 +
50 +\begin{equation}\label{eq:spatial_lag}
51 + \ln(\text{rent}_i) = \alpha'' + \rho \cdot \sum_{k} w_{ik} \ln(\text{rent}_k) + \beta' \cdot \texttt{airbnb\_count}_{i,r} + \mathbf{X}_i' \boldsymbol{\gamma}' + \sum_{c} \delta''_c \cdot \mathbf{1}[\text{city}_i = c] + \eta_i,
52 +\end{equation}
53 +
54 +\noindent where $\mathbf{W} = [w_{ik}]$ is a row-standardised $k$-nearest-neighbour spatial weights matrix with $k = 5$, so that $\sum_k w_{ik} \ln(\text{rent}_k)$ is the mean log rent of the five nearest rental listings. The spatial autoregressive parameter $\rho$ captures the degree to which rents co-move within a spatial neighbourhood, after controlling for observed characteristics. The SEM instead places the spatial process in the disturbance, $\eta_i = \lambda \sum_k w_{ik} \eta_k + \nu_i$, capturing spatially correlated unobservables. Both models are estimated by generalised method of moments \citep[GM\_Lag and GM\_Error;][]{anselin1988spatial, lesage2009introduction}, which avoids the simultaneity bias that OLS estimation of Equation~\eqref{eq:spatial_lag} would entail.
55 +
56 +This specification serves two purposes. First, the spatial models absorb variation from spatially correlated unobservables (e.g., neighbourhood amenities that affect both rents and Airbnb desirability). Second, comparing $\hat{\beta}'$ from Equation~\eqref{eq:spatial_lag} with $\hat{\beta}$ from Equation~\eqref{eq:hedonic_rent} provides a diagnostic for the sensitivity of the Airbnb coefficient to spatial confounders.
57 +
58 +In addition to the spatial lag model, we examine the robustness of the Airbnb exposure measure by varying the buffer radius $r$ across 250\,m, 500\,m, 1\,km, and 2\,km. This exercise traces out the spatial decay of the association: if the Airbnb--rent relationship is genuinely local, we expect $\hat{\beta}$ to be largest at small radii and to attenuate as the buffer expands.
59 +
60 +\subsection{Model 5: Quantile Regression}\label{sec:model5}
61 +
62 +To investigate heterogeneity in the Airbnb--rent association across the conditional rent distribution, we estimate quantile regressions \citep{koenker1978regression}:
63 +
64 +\begin{equation}\label{eq:quantile}
65 + Q_{\tau}\!\left[\ln(\text{rent}_i) \mid \mathbf{X}_i, \texttt{airbnb\_count}_{i,r}\right] = \alpha_\tau + \beta_\tau \cdot \texttt{airbnb\_count}_{i,r} + \mathbf{X}_i' \boldsymbol{\gamma}_\tau + \sum_{c} \delta_{c,\tau} \cdot \mathbf{1}[\text{city}_i = c],
66 +\end{equation}
67 +
68 +\noindent for quantile indices $\tau \in \{0.10, 0.25, 0.50, 0.75, 0.90\}$. City fixed effects are restricted to the five largest cities (with the remainder grouped) to keep the quantile estimation well conditioned. The quantile-specific coefficient $\beta_\tau$ measures the marginal association between Airbnb exposure and the $\tau$th quantile of log rent. If the effect of Airbnb is larger at the upper tail of the distribution, this may indicate that short-term rental activity disproportionately affects higher-quality or higher-rent segments of the market. Standard errors are the asymptotic kernel-based estimates of \citet{koenker1978regression} as implemented in \texttt{statsmodels}.
69 +
70 +\subsection{Model 6: Machine-Learning Robustness}\label{sec:model6}
71 +
72 +We complement the parametric analysis with four machine-learning methods: LASSO, elastic net, random forest, and gradient boosting, alongside an OLS benchmark. These models are trained to predict $\ln(\text{rent}_i)$ from the Airbnb exposure measures at the 500\,m radius (count, density, mean price, entire-home share), dwelling characteristics (bedrooms, bathrooms), and geographic coordinates, and are evaluated on a held-out test set (20\% of the sample) using root mean squared error (RMSE), mean absolute error (MAE), and $R^2$.
73 +
74 +The machine-learning models serve three purposes. First, they provide a benchmark for the predictive accuracy of the hedonic model: if the OLS model achieves comparable $R^2$ to the flexible ML models, this suggests that the linear specification is not severely misspecified. Second, LASSO and elastic net coefficients reveal which variables are selected as predictors, providing a data-driven assessment of the importance of Airbnb exposure relative to dwelling characteristics. Third, random forest and gradient boosting models yield variable-importance measures (SHAP values) that quantify the contribution of each feature to predictive accuracy, without imposing functional-form assumptions.
75 +
76 +\subsection{Identification and Endogeneity}\label{sec:identification}
77 +
78 +We are explicit about the identification challenges inherent in our cross-sectional design. The primary concern is that Airbnb listing density is endogenous to local rent levels and neighbourhood desirability. Three channels of endogeneity are relevant:
79 +
80 +\begin{enumerate}[label=(\roman*)]
81 + \item \textbf{Reverse causality:} High rents may attract Airbnb hosts (because the opportunity cost of leaving a unit vacant is high, and short-term rental income can offset high carrying costs), creating a positive bias in the estimated $\hat{\beta}$.
82 + \item \textbf{Omitted variables:} Neighbourhood amenities---such as proximity to cultural attractions, restaurants, and transit---that are unobserved in our data may simultaneously attract Airbnb guests and drive up residential rents, again biasing $\hat{\beta}$ upward.
83 + \item \textbf{Spatial sorting:} Airbnb hosts may select locations based on unobserved characteristics (e.g., architectural charm, noise tolerance norms) that also affect residential rents.
84 +\end{enumerate}
85 +
86 +Our city fixed effects control for all time-invariant, city-level confounders, including differences in local housing-market tightness, tourism infrastructure, and regulatory regimes. Within-city variation in Airbnb density is our identifying variation, and this variation is plausibly driven by both locational amenities (tourist attractiveness) and the supply of suitable housing units---neither of which is fully exogenous. We therefore interpret our estimates as conditional correlations rather than causal effects. The inclusion of spatial lags, robustness checks across buffer radii, and machine-learning diagnostics provides indirect evidence on the plausibility and stability of our estimates, but a definitive causal statement would require either panel data with suitable fixed effects or a credible instrument for Airbnb supply---neither of which is available in our setting.
87 +
88 +\subsection{Standard Errors}
89 +
90 +Throughout the analysis, we report heteroskedasticity-robust standard errors (HC1) as our baseline. For the quantile regressions, we report the asymptotic standard errors produced by the kernel-based estimator in \texttt{statsmodels}. For the machine-learning models, we report held-out test-set performance metrics, with regularisation parameters selected by 5-fold cross-validation.
added paper/sections/05_results.tex +137 −0
@@ -0,0 +1,137 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% =============================================================================
3 +% 05_results.tex
4 +% =============================================================================
5 +\section{Results}\label{sec:results}
6 +
7 +This section presents the empirical results for each of the six models described in Section~\ref{sec:methodology}. Throughout, we use cautious language to reflect the conditional nature of our estimates: the terms ``associated with'' and ``conditional correlation'' are used in place of ``effect'' or ``impact,'' consistent with the limitations of our cross-sectional identification strategy.
8 +
9 +\subsection{Baseline Hedonic Rent Model}
10 +
11 +Table~\ref{tab:hedonic_rent} reports the OLS estimates of the hedonic rent model (Equation~\ref{eq:hedonic_rent}). Column~(1a) presents the bivariate specification with only the Airbnb count within 500\,m; column~(1b) adds dwelling controls (bedrooms, bathrooms, building type); and column~(1c)---our preferred specification---adds city fixed effects. Columns~(1d) and~(1e) replace the Airbnb count with two alternative exposure measures, the Airbnb density and the share of entire-home listings within the buffer.
12 +
13 +\begin{table}[htbp]
14 + \centering
15 + \caption{Hedonic Rent Model --- Baseline OLS Results}
16 + \label{tab:hedonic_rent}
17 + \input{../results/tables/hedonic_rent_baseline.tex}
18 +\end{table}
19 +
20 +The coefficient on $\texttt{airbnb\_count\_500m}$ is positive and statistically significant across all specifications. In the preferred specification (column~1c), each additional Airbnb listing within 500\,m is associated with an approximate 0.4\% increase in monthly rent, holding dwelling characteristics and city constant. This semi-elasticity is economically modest but statistically robust: at the median monthly rent of approximately \$1{,}950, one additional nearby Airbnb listing corresponds to a rent differential of roughly \$6--\$10 per month. However, the practical significance compounds when one considers that many urban rental listings have 10 or more Airbnb listings within 500\,m, implying cumulative differentials that are economically meaningful.
21 +
22 +Among the control variables, dwelling size is the dominant predictor of rent: each additional bedroom is associated with approximately 11--13\% higher rent, and each additional bathroom with approximately 23--30\% higher rent. Building type (House and Row/Townhouse relative to Apartment) also enters significantly. City fixed effects raise the explanatory power of the model considerably, confirming substantial cross-city variation in rent levels.
23 +
24 +The adjusted $R^2$ of the preferred specification is approximately 0.56, indicating that observed dwelling characteristics and city fixed effects explain a substantial share of the cross-sectional variation in rents, though a considerable residual remains, consistent with the importance of unobserved unit-specific and micro-locational factors.
25 +
26 +\subsection{Hedonic Airbnb Pricing Model}
27 +
28 +Table~\ref{tab:hedonic_airbnb} reports the estimates of the Airbnb pricing model (Equation~\ref{eq:hedonic_airbnb}).
29 +
30 +\begin{table}[htbp]
31 + \centering
32 + \caption{Hedonic Airbnb Pricing Model --- OLS Results}
33 + \label{tab:hedonic_airbnb}
34 + \input{../results/tables/hedonic_airbnb_pricing.tex}
35 +\end{table}
36 +
37 +Contrary to the opportunity-cost hypothesis, the city-level mean rent does not enter significantly in any specification: the coefficient $\hat{\theta}$ is small and statistically indistinguishable from zero, with a negative point estimate in columns~(2a) and~(2b) and a positive one in column~(2c). Airbnb nightly prices in our sample are therefore not systematically higher in higher-rent cities once listing characteristics are taken into account; the pricing of short-term rentals appears to be driven primarily by the properties of the listing itself rather than by conditions in the local long-term rental market.
38 +
39 +Among the listing-level controls, dwelling size matters most: bedrooms and, especially, bathrooms are associated with significantly higher nightly prices. Superhost status carries a significant \textit{negative} coefficient, which likely reflects composition effects---superhosts in the sample are concentrated in more modest, high-volume urban units rather than in luxury properties---and guest capacity enters negatively once size is controlled for. The entire-home indicator is positive and significant once city fixed effects are included (column~2c), consistent with whole units commanding a premium over rooms in shared dwellings within the same market.
40 +
41 +When city fixed effects are included, the listing-level coefficients retain their signs and broad magnitudes, suggesting that the within-city pricing structure of Airbnb listings is largely independent of the cross-city rent variation.
42 +
43 +\subsection{City-Level Results}
44 +
45 +Table~\ref{tab:city_level} presents the city-level regressions (Equations~\ref{eq:city_rent} and~\ref{eq:city_airbnb}).
46 +
47 +\begin{table}[htbp]
48 + \centering
49 + \caption{City-Level Regressions}
50 + \label{tab:city_level}
51 + \input{../results/tables/city_level_interaction.tex}
52 +\end{table}
53 +
54 +The forward regression shows a positive and statistically significant---though economically small---cross-city association between the total number of Airbnb listings and mean log rents: cities with more Airbnb listings tend to have somewhat higher average rents, conditional on average dwelling size. The reverse regression, by contrast, has essentially no explanatory power ($R^2 = 0.01$), and mean rent does not significantly predict city-level Airbnb counts. Although the aggregation yields 153 city-level observations, most cities contribute only a handful of underlying listings, which limits the statistical power of these regressions and amplifies the influence of individual city outliers. We interpret these results as descriptive patterns that motivate the listing-level analysis rather than as evidence of a causal relationship.
55 +
56 +\subsection{Spatial Model Results}
57 +
58 +Table~\ref{tab:spatial_results} reports the OLS baseline alongside the spatial lag (SAR) and spatial error (SEM) models of Equation~\ref{eq:spatial_lag}.
59 +
60 +\begin{table}[htbp]
61 + \centering
62 + \caption{Spatial Regression Models}
63 + \label{tab:spatial_results}
64 + \input{../results/tables/spatial_models.tex}
65 +\end{table}
66 +
67 +The spatial autoregressive coefficient ($\hat{\rho}$, the coefficient on $W \cdot \ln(\text{rent})$) is positive and strongly significant, and the spatial error parameter $\hat{\lambda}$ in the SEM is large (0.54), confirming substantial spatial dependence in rents: the rents of nearby listings carry systematic information about a given listing's rent, even after controlling for dwelling characteristics and city fixed effects. This finding is consistent with the large literature on spatial autocorrelation in housing markets.
68 +
69 +Importantly, the coefficient on $\texttt{airbnb\_count\_500m}$ ($\hat{\beta}'$) remains positive and statistically significant in both spatial specifications: it is mildly attenuated in the SAR model (0.0034 versus 0.0038 in the OLS baseline) and essentially unchanged in the SEM. The mild attenuation is expected: to the extent that the Airbnb coefficient in the baseline model partly reflected spatially correlated omitted variables (captured by the spatial terms), the spatial models provide more conservative estimates. The persistence of a significant positive association strengthens confidence that the Airbnb--rent correlation is not solely an artefact of spatial confounding.
70 +
71 +Figure~\ref{fig:buffer_decay} illustrates the spatial decay of the Airbnb coefficient across buffer radii.
72 +
73 +\begin{figure}[htbp]
74 + \centering
75 + \includegraphics[width=0.75\textwidth]{coefficient_buffer_comparison.pdf}
76 + \caption{Estimated Airbnb Coefficient by Buffer Radius}
77 + \label{fig:buffer_decay}
78 +\end{figure}
79 +
80 +The per-listing coefficient is largest at the 250\,m radius and declines monotonically as the buffer expands, consistent with a localised association between Airbnb activity and rents. At the 2\,km radius, the coefficient remains positive but is substantially smaller in magnitude, reflecting the dilution of the Airbnb signal over a larger geographic area. This spatial decay pattern is consistent with prior findings in the literature and suggests that the Airbnb--rent association operates at a highly localised scale.
81 +
82 +\subsection{Quantile Regression Results}
83 +
84 +Table~\ref{tab:quantile} and Figure~\ref{fig:quantile_plot} present the quantile regression estimates of $\beta_\tau$ for $\tau \in \{0.10, 0.25, 0.50, 0.75, 0.90\}$.
85 +
86 +\begin{table}[htbp]
87 + \centering
88 + \caption{Quantile Regression Results --- Coefficient on Airbnb Count (500m)}
89 + \label{tab:quantile}
90 + \input{../results/tables/quantile_regression.tex}
91 +\end{table}
92 +
93 +\begin{figure}[htbp]
94 + \centering
95 + \includegraphics[width=0.75\textwidth]{quantile_coefficients.pdf}
96 + \caption{Quantile Regression Coefficients on Airbnb Count (500m) with 95\% Confidence Intervals}
97 + \label{fig:quantile_plot}
98 +\end{figure}
99 +
100 +The quantile regression results reveal meaningful heterogeneity in the Airbnb--rent association across the conditional rent distribution. The coefficient is positive and statistically significant at every quantile considered. It is roughly flat over the lower half of the distribution (0.0037 at $\tau = 0.10$, 0.0034--0.0035 at $\tau = 0.25$ and $\tau = 0.50$) and then rises in the upper tail, reaching 0.0041 at $\tau = 0.75$ and its largest value, 0.0047, at $\tau = 0.90$---roughly 25\% above the OLS estimate.
101 +
102 +This pattern is economically interpretable. High-rent listings---typically located in desirable neighbourhoods with strong tourist appeal---are precisely the locations where Airbnb activity is most intense and where the supply-withdrawal mechanism is most plausible. The quantile results thus suggest that the association between Airbnb and rents, while present throughout the distribution, is strongest in the upper segment of the rental market.
103 +
104 +\subsection{Machine-Learning Robustness}
105 +
106 +Table~\ref{tab:ml_performance} reports the out-of-sample predictive performance of the four machine-learning models alongside the OLS benchmark.
107 +
108 +\begin{table}[htbp]
109 + \centering
110 + \caption{Machine-Learning Model Performance (Test Set)}
111 + \label{tab:ml_performance}
112 + \input{../results/tables/ml_comparison.tex}
113 +\end{table}
114 +
115 +The random forest achieves the highest $R^2$ on the test set (0.71), closely followed by gradient boosting (0.69); the regularised linear models (LASSO and elastic net) perform essentially on par with OLS (test $R^2 \approx 0.51$). The gap between the tree-based and linear models indicates that nonlinear relationships and interactions among covariates---most plausibly involving the geographic coordinates---contribute meaningfully to rent variation beyond what the linear hedonic model captures. The linear specification nevertheless accounts for the bulk of the explainable variation and remains a reasonable approximation for inference on the Airbnb exposure coefficient.
116 +
117 +Figure~\ref{fig:feature_importance} displays the mean absolute SHAP values from the gradient boosting model.
118 +
119 +\begin{figure}[htbp]
120 + \centering
121 + \includegraphics[width=0.80\textwidth]{feature_importance.pdf}
122 + \caption{Feature Importance from Gradient Boosting Model}
123 + \label{fig:feature_importance}
124 +\end{figure}
125 +
126 +Dwelling characteristics (bathrooms, bedrooms) and geographic coordinates are consistently the most important predictors of rent. The Airbnb exposure variables---mean nearby price, density, count, and entire-home share---each rank as moderately important features and jointly account for a non-trivial share of predictive power, confirming that Airbnb exposure carries information beyond what is captured by dwelling size and raw location. The LASSO and elastic net models retain the Airbnb count variable with a positive coefficient, consistent with the OLS results.
127 +
128 +Figure~\ref{fig:shap_summary} presents a SHAP summary plot, providing a more granular view of how each feature contributes to individual predictions.
129 +
130 +\begin{figure}[htbp]
131 + \centering
132 + \includegraphics[width=0.80\textwidth]{shap_summary.pdf}
133 + \caption{SHAP Summary Plot from Gradient Boosting Model}
134 + \label{fig:shap_summary}
135 +\end{figure}
136 +
137 +The SHAP analysis confirms that higher Airbnb counts are associated with positive contributions to predicted rent, consistent with the parametric results. The distribution of SHAP values for the Airbnb count variable shows a rightward shift for listings with high Airbnb exposure, reinforcing the finding that nearby short-term rental activity is associated with higher rents.
added paper/sections/06_robustness.tex +94 −0
@@ -0,0 +1,94 @@
1 +% Author: Simon-Pierre Boucher — contact@spboucher.ai
2 +% =============================================================================
3 +% 06_robustness.tex
4 +% =============================================================================
5 +\section{Robustness Checks}\label{sec:robustness}
6 +
7 +This section presents a battery of robustness tests designed to assess the sensitivity of our baseline estimates to alternative specifications, sample definitions, and exposure measures.
8 +
9 +\subsection{Buffer Radius Robustness}
10 +
11 +Our baseline specification uses a 500\,m buffer to define Airbnb exposure. Table~\ref{tab:buffer_robustness} reports the coefficient on the Airbnb count variable for buffer radii of 250\,m, 500\,m, 1\,km, and 2\,km, estimated using the same hedonic specification (Equation~\ref{eq:hedonic_rent}) with the full set of dwelling controls and city fixed effects.
12 +
13 +\begin{table}[htbp]
14 + \centering
15 + \caption{Buffer Radius Robustness --- Hedonic Rent Model}
16 + \label{tab:buffer_robustness}
17 + \input{../results/tables/buffer_robustness.tex}
18 +\end{table}
19 +
20 +The results confirm the spatial decay pattern illustrated in Figure~\ref{fig:buffer_decay}. The per-listing coefficient is largest at the 250\,m radius, where the spatial signal is most concentrated, and decreases monotonically as the buffer expands---mechanically so, since a listing counted within a wide buffer is a weaker proxy for immediate proximity than one counted within a narrow buffer. At all radii, the coefficient is positive and statistically significant at the 1\% level. The consistency of the positive association across radii provides reassurance that the finding is not an artefact of the particular buffer choice.
21 +
22 +Figure~\ref{fig:buffer_coef_plot} visualises the coefficient estimates and their 95\% confidence intervals across buffer radii.
23 +
24 +\begin{figure}[htbp]
25 + \centering
26 + \includegraphics[width=0.70\textwidth]{coefficient_buffer_comparison.pdf}
27 + \caption{Airbnb Count Coefficient Across Buffer Radii (with 95\% CI)}
28 + \label{fig:buffer_coef_plot}
29 +\end{figure}
30 +
31 +\subsection{Alternative Exposure Measures}
32 +
33 +Our baseline uses the raw count of Airbnb listings as the exposure measure. We consider two alternative measures to assess whether the results are sensitive to the functional form of the exposure variable:
34 +
35 +\begin{enumerate}[label=(\roman*)]
36 + \item \textbf{Airbnb density:} the count divided by the buffer area ($\pi r^2$ in km$^2$), which normalises for the geometric expansion of the buffer.
37 + \item \textbf{Share of entire-home listings:} the fraction of Airbnb listings within the buffer that are classified as entire-home properties (House, Cabin/Chalet, Condo), capturing the composition of short-term rental activity.
38 +\end{enumerate}
39 +
40 +These alternative specifications are reported as Models~(1d) and~(1e) in Table~\ref{tab:hedonic_rent}.
41 +
42 +The Airbnb density measure yields qualitatively identical results to the raw count, with a positive and significant coefficient---as expected, since at a fixed radius the density is a rescaling of the count. The share of entire-home listings, by contrast, is \textit{not} significantly associated with rents (the point estimate is small and negative): conditional on dwelling characteristics and city fixed effects, it is the intensity of nearby Airbnb activity, rather than its compositional tilt toward entire homes, that co-varies with rents in our data. This finding does not support the compositional prediction of the supply-withdrawal hypothesis, under which entire-home listings---the closest substitutes for long-term rental units---should matter most; we return to this point in Section~\ref{sec:discussion}.
43 +
44 +\subsection{Subsample Analysis}
45 +
46 +To assess whether the baseline results are driven by a particular geographic segment or building type, we estimate the hedonic rent model separately for the following subsamples:
47 +
48 +\begin{enumerate}[label=(\roman*)]
49 + \item \textbf{Montreal vs.\ non-Montreal:} Montreal dominates both datasets and is the primary tourist destination. The Airbnb--rent association may be stronger in Montreal, where short-term rental activity is most concentrated, or weaker if the city's larger and more liquid rental market is better able to absorb the supply shock.
50 + \item \textbf{Apartments vs.\ Houses:} Apartments constitute the vast majority of rental listings and are arguably the closest substitute for Airbnb rental units. Houses, by contrast, are a more heterogeneous category and may operate in a partially segmented market.
51 +\end{enumerate}
52 +
53 +Table~\ref{tab:subsample} presents the results.
54 +
55 +\begin{table}[htbp]
56 + \centering
57 + \caption{Subsample Analysis --- Hedonic Rent Model}
58 + \label{tab:subsample}
59 + \input{../results/tables/robustness_subsamples.tex}
60 +\end{table}
61 +
62 +The Montreal subsample yields a positive and significant Airbnb coefficient that is similar in magnitude to the full-sample estimate, confirming that the baseline results are not driven solely by the inclusion of non-Montreal observations. The non-Montreal subsample also produces a positive coefficient, though with lower precision due to the smaller sample size and the greater heterogeneity of non-Montreal markets (which include both urban centres and resort communities).
63 +
64 +The apartment subsample closely mirrors the full-sample results, which is unsurprising given that apartments constitute approximately 90\% of the rental sample. The house subsample yields a coefficient that is larger than the full-sample estimate (0.0067) and statistically significant despite the much smaller sample, though its wider confidence interval reflects the greater heterogeneity of house rentals.
65 +
66 +\subsection{Outlier Sensitivity}
67 +
68 +To assess the sensitivity of the results to extreme values, we re-estimate the baseline model on two trimmed samples: one that retains only listings with monthly rents between the 5th and 95th percentiles, and one that drops the top and bottom 1\% of observations by Airbnb count within 500\,m (i.e., listings in the most Airbnb-saturated locations).
69 +
70 +\begin{table}[htbp]
71 + \centering
72 + \caption{Outlier Sensitivity --- Hedonic Rent Model}
73 + \label{tab:outlier_sensitivity}
74 + \input{../results/tables/robustness_outliers.tex}
75 +\end{table}
76 +
77 +The results are stable across the outlier-handling approaches. Trimming the rent distribution at the 5th and 95th percentiles reduces the point estimate by roughly a fifth (from 0.0039 to 0.0031)---consistent with the quantile-regression finding that the association is strongest in the tails---while trimming extreme Airbnb counts slightly increases it (0.0042). In every case the coefficient remains positive and significant at the 1\% level, providing confidence that the baseline results are not driven by a small number of influential observations.
78 +
79 +\subsection{Inference Caveats}
80 +
81 +Our baseline reports HC1 (heteroskedasticity-robust) standard errors, which are consistent under arbitrary forms of heteroskedasticity but assume independence across observations. In a cross-sectional setting with spatially concentrated observations, standard errors clustered at the city level---or corrected for spatial correlation more generally---would likely be larger than the HC1 estimates we report. The very high $t$-statistics on the Airbnb coefficient in the baseline model suggest that the finding would survive a substantial widening of the confidence intervals, but readers should bear this caveat in mind when interpreting the reported significance levels.
82 +
83 +\subsection{Summary of Robustness}
84 +
85 +Figure~\ref{fig:robustness_summary} presents a coefficient plot summarising the Airbnb count coefficient across all robustness specifications.
86 +
87 +\begin{figure}[htbp]
88 + \centering
89 + \includegraphics[width=0.80\textwidth]{coefficient_robustness.pdf}
90 + \caption{Summary of Airbnb Count Coefficients Across Specifications}
91 + \label{fig:robustness_summary}
92 +\end{figure}
93 +
94 +Across all specifications---varying the buffer radius, the exposure measure, the sample, and the outlier treatment---the estimated association between Airbnb presence and residential rents is consistently positive. While the magnitude varies across specifications, the qualitative conclusion is robust: higher Airbnb density in the immediate vicinity of a rental listing is associated with higher monthly rents, conditional on observable dwelling characteristics and city-level heterogeneity.
added paper/sections/07_discussion.tex +53 −0
Large diff (53 lines) is not loaded by default to keep the page fast.Load diff
added paper/sections/08_conclusion.tex +17 −0
Large diff (17 lines) is not loaded by default to keep the page fast.Load diff
added paper/sections/titlepage.tex +78 −0
Large diff (78 lines) is not loaded by default to keep the page fast.Load diff
added paper/uq_logo.jpg +0 −0

Binary file not shown.

added requirements.txt +12 −0
Large diff (12 lines) is not loaded by default to keep the page fast.Load diff
added results/logs/data_inspection.txt +766 −0
Large diff (766 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/buffer_robustness.tex +15 −0
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/city_level_interaction.tex +21 −0
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/correlation_matrix.csv +8 −0
Large diff (8 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/correlation_matrix.tex +13 −0
Large diff (13 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/hedonic_airbnb_pricing.tex +31 −0
Large diff (31 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/hedonic_rent_baseline.tex +31 −0
Large diff (31 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/ml_comparison.csv +6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/ml_comparison.tex +14 −0
Large diff (14 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/quantile_regression.tex +24 −0
Large diff (24 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/robustness_outliers.tex +15 −0
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/robustness_subsamples.tex +15 −0
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/spatial_models.tex +26 −0
Large diff (26 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/summary_stats_airbnb.csv +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/summary_stats_airbnb.tex +15 −0
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/summary_stats_rent.csv +4 −0
Large diff (4 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/summary_stats_rent.tex +9 −0
Large diff (9 lines) is not loaded by default to keep the page fast.Load diff
added scripts/01_inspect_raw_data.py +177 −0
Large diff (177 lines) is not loaded by default to keep the page fast.Load diff
added scripts/02_clean_airbnb.py +118 −0
Large diff (118 lines) is not loaded by default to keep the page fast.Load diff
added scripts/03_clean_rent.py +274 −0
Large diff (274 lines) is not loaded by default to keep the page fast.Load diff
added scripts/04_merge_data.py +332 −0
Large diff (332 lines) is not loaded by default to keep the page fast.Load diff
added scripts/05_descriptive_analysis.py +370 −0
Large diff (370 lines) is not loaded by default to keep the page fast.Load diff
added scripts/06_hedonic_models.py +307 −0
Large diff (307 lines) is not loaded by default to keep the page fast.Load diff
added scripts/07_spatial_models.py +467 −0
Large diff (467 lines) is not loaded by default to keep the page fast.Load diff
added scripts/08_quantile_models.py +254 −0
Large diff (254 lines) is not loaded by default to keep the page fast.Load diff
added scripts/09_ml_robustness.py +275 −0
Large diff (275 lines) is not loaded by default to keep the page fast.Load diff
added scripts/10_robustness_tables_figures.py +360 −0
Large diff (360 lines) is not loaded by default to keep the page fast.Load diff
added src/__init__.py +2 −0
Large diff (2 lines) is not loaded by default to keep the page fast.Load diff
added src/config.py +53 −0
Large diff (53 lines) is not loaded by default to keep the page fast.Load diff
added src/geo.py +33 −0
Large diff (33 lines) is not loaded by default to keep the page fast.Load diff
added src/latex_tables.py +129 −0
Large diff (129 lines) is not loaded by default to keep the page fast.Load diff
added src/plotting.py +48 −0
Large diff (49 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme