# πŸ›οΈ Hedonic Pricing of Short-Term Rental Properties **UQO Working Paper No. 4** β€” *A Multi-Method Analysis of Airbnb Listing Prices in Quebec* [![Paper](https://img.shields.io/badge/paper-PDF%20(28%20p.)-b31b1b?logo=latex&logoColor=white)](paper/main.pdf) [![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](requirements.txt) [![Data](https://img.shields.io/badge/data-5%2C000%20Inside%20Airbnb%20listings%20Β·%20CSV-4051b5)](data/raw/README.md) [![Reproducible](https://img.shields.io/badge/reproducible-end--to--end%20pipeline-2e7d32)](scripts/) [![Institution](https://img.shields.io/badge/UQO-D%C3%A9pt.%20des%20sciences%20administratives-16365c)](https://uqo.ca) [![Author](https://img.shields.io/badge/author-Simon--Pierre%20Boucher-16365c)](mailto:simon-pierre.boucher@uqo.ca) > **TL;DR** β€” What determines the nightly price of an Airbnb listing in Quebec? On 5,000 Inside Airbnb listings > (3,412 with valid prices) we layer nine nested OLS hedonic specifications (RΒ² from 0.052 structural-only to 0.274 with > reputation, amenities, text and spatial controls), quantile regressions at five quantiles, four gradient-boosting / > forest learners with SHAP (best: XGBoost, RΒ² = 0.285, MAPE 14.3%), and spatial lag / error / Durbin models. Bedrooms, > room type, review scores, location and amenity indices dominate, with weights that shift across the price distribution > and across sub-markets. --- ## πŸ“Œ Status | Item | Value | |---|---| | Version | 1.0 (May 2026) | | SSRN | not yet submitted | | Journal | β€” | | Code & data | reproducible from `scripts/` + `src/`; raw Inside Airbnb sample not committed (see `data/raw/README.md`) | ## 🎯 What this paper does Short-term rental prices are set by hosts, not by a market index, so the implicit prices of a listing's characteristics are the natural object of study. Following Rosen (1974) and Lancaster (1966), the nightly price is decomposed into structural characteristics, amenity bundles, host attributes, reputation signals, locational factors and text-derived features: ``` ln P_i = Ξ± + S_i'Ξ² + A_i'Ξ³ + H_i'Ξ΄ + R_i'ΞΆ + L_i'Ξ· + T_i'ΞΈ + Ξ΅_i ``` Each block is added in turn (M1 … M9), then the full specification is re-estimated by quantile regression, by machine learning with SHAP decomposition, and by spatial econometric models to check robustness to spatial dependence. ## πŸ† Headline results | Object | Estimate | |---|---| | Structural-only OLS (M1) | RΒ² = 0.052 | | + amenity indices (M2) | RΒ² = 0.098 | | + reputation / reviews (M4) | RΒ² = 0.187 (largest single gain) | | Full specification with spatial controls (M9), N = 1,906 | RΒ² = 0.274, adj. RΒ² = 0.254, RMSE 1.169 (βˆ’15.3% vs M1) | | Best learner (XGBoost) | RΒ² = 0.285, RMSE 1.159, MAPE 14.3% | | CatBoost / LightGBM / Random Forest | RΒ² = 0.258 / 0.244 / 0.243 | | Dominant price determinants | bedrooms, room type, review score, distance to centre, amenity indices | ## πŸ—‚ Repository layout ``` airbnb-listing-prices-hedonic/ β”œβ”€β”€ data/ β”‚ β”œβ”€β”€ raw/ # cleaned_dataset_sample.csv (see data/raw/README.md) β€” not committed β”‚ β”œβ”€β”€ interim/ processed/ duckdb/ β”œβ”€β”€ src/ # package: config, data_loader, cleaning, feature_engineering, amenities, β”‚ # geospatial, nlp_features, hedonic_models, quantile_models, spatial_models, β”‚ # ml_models, shap_analysis, robustness, tables, figures, report β”œβ”€β”€ scripts/ β”‚ β”œβ”€β”€ run_analysis.py # master pipeline (features β†’ models β†’ figures β†’ tables) β”‚ └── app.py # Streamlit dashboard β”œβ”€β”€ results/ β”‚ β”œβ”€β”€ tables/ # model_comparison, ml_comparison, price_premiums, quantile_coefficients, … β”‚ β”œβ”€β”€ figures/ # 01–08 publication figures (PNG + PDF) β”‚ └── models/ # model keys (fitted objects not committed) β”œβ”€β”€ Makefile # make all | features | models | figures | tables | paper | dashboard └── paper/ # main.tex + sections/ + figures/ + references.bib β†’ main.pdf ``` ## πŸš€ Quick start ```bash python3 -m pip install -r requirements.txt # place cleaned_dataset_sample.csv in data/raw/, then: make models # python3 scripts/run_analysis.py --data-file data/raw/cleaned_dataset_sample.csv make figures make paper # cd paper && make (latexmk β†’ main.pdf) make dashboard # streamlit run scripts/app.py ``` Runtime β‰ˆ 10 minutes on an Apple-silicon laptop (SHAP and spatial models dominate). ## πŸ—ƒ Data 5,000 Inside Airbnb listings for Quebec (May 2026 extract, 19 raw variables). Prices below CAD 10 (17 obs.) or above CAD 25,000 (27 obs.) are dropped; 810 listings lack a price and 3,412 remain. Amenity strings are parsed into indices (family comfort, luxury, cleanliness), review scores are rescaled to 0–5, titles and descriptions are embedded into text features, and distances to the city centre are computed from coordinates. See `data/raw/README.md`. ## πŸ”¬ Methodology 1. **Cleaning & features** β€” `src/cleaning.py`, `src/feature_engineering.py`, `src/amenities.py`, `src/nlp_features.py`, `src/geospatial.py`. 2. **Nested OLS hedonic models** M1–M9 with HC3 standard errors β€” `src/hedonic_models.py`. 3. **Quantile regression** at Ο„ ∈ {.10, .25, .50, .75, .90} β€” `src/quantile_models.py`. 4. **Machine learning** (XGBoost, CatBoost, LightGBM, Random Forest, Gradient Boosting, GAM, ElasticNet) with SHAP β€” `src/ml_models.py`, `src/shap_analysis.py`. 5. **Spatial econometrics** (SAR, SEM, SDM, k-nearest-neighbour weights) β€” `src/spatial_models.py`. 6. **Robustness** (sub-markets, trimming, alternative amenity indices) and price decomposition β€” `src/robustness.py`, `src/report.py`. ## πŸ–Ό Figures & tables inventory | Figure | Content | |---|---| | `01_price_distribution`, `02_log_price_distribution` | nightly price distributions | | `03_price_map` | spatial distribution of prices | | `04_price_by_neighbourhood`, `05_price_by_room_type` | price by neighbourhood / room type | | `07_review_score_premium` | reputation premium | | `08_distance_to_center_gradient` | price gradient with distance to centre | Tables (`results/tables/*.tex|csv`): model comparison (M1–M9), ML comparison, price premiums, quantile coefficients, robustness summary, price decomposition, price-associated words. ## ⚠️ Limitations - Listed (asking) nightly prices, not realized bookings; no occupancy data. - Cross-sectional snapshot; seasonality is not identified. - 5,000-listing sample; full-specification N = 1,906 after requiring reviews and location. - Text features are embedding-based and not individually interpretable. ## πŸ“ Citation ```bibtex @techreport{boucher2026airbnbhedonic, author = {Boucher, Simon-Pierre}, title = {Hedonic Pricing of Short-Term Rental Properties: A Multi-Method Analysis of Airbnb Listing Prices in Quebec}, institution = {Universit\'e du Qu\'ebec en Outaouais, D\'epartement des sciences administratives}, type = {Working Paper}, number = {4}, year = {2026}, month = {May} } ``` ## πŸ‘€ Author & contact **Simon-Pierre Boucher** β€” DΓ©partement des sciences administratives, UniversitΓ© du QuΓ©bec en Outaouais (UQO), Gatineau, QC. πŸ“§ [simon-pierre.boucher@uqo.ca](mailto:simon-pierre.boucher@uqo.ca) ## πŸ—’ Notes - Harmonised 2026-10-17: `wp4/` β†’ `paper/`, `outputs/` β†’ `results/`, `run_analysis.py`/`app.py` β†’ `scripts/`; paths updated in `src/config.py`, `src/figures.py`, `src/tables.py`, `scripts/app.py` and the root `Makefile`. - Bibliography switched from `apalike` to `aer` (natbib `authoryear,round,semicolon`); compiles without warnings.