SPB Git

spb/wp3_uqo Public

UQO Working Paper No. 3 — Hedonic housing price models for the US: parametric, quantile, and machine-learning approaches.

TeX 77.8% Python 22.1%
7.0 KB

# CHANGES — Restructuration du projet WP3 (2026-08-05)

Original intact : ~/Desktop/UQO/UQO_WP/immo-wp3-spb-20260519/. Nouvelle structure : ~/Desktop/wp3_uqo/ (ce dossier). Voir AUDIT.md pour l'état des lieux initial.


# 1. Déplacements / réorganisation

Origine (immo-wp3-spb-20260519/) Destination (wp3_uqo/)
us_housing.duckdb data/raw/
analytical_sample.pkl, model_data.pkl, shap_data.pkl data/processed/
qr_results.pkl, ml_results.pkl, extended_results.pkl, v3_*.pkl results/
figures/fig*.png (6 survivantes) remplacées par les 11 régénérées dans figures/ (originales conservées dans l'archive source)
wp3/main.tex, wp3/sections/, wp3/appendix/, uq_logo.jpg, Makefile paper/
run_v3_spatial.py refactoré → scripts/01_spatial_robustness.py
v3_qr_imputation_analysis.py refactoré → scripts/02_qr_imputation.py

Non repris (restent dans l'archive source uniquement) : paper_hedonic_pricing{,_v2,_v3}.tex (anciennes versions), wp3/main_web.tex (contournement « Figure indisponible », devenu inutile), fichiers auxiliaires LaTeX, .DS_Store.

# 2. Code refactoré

  • Nouveaux modules src/wp3/ : config.py (chemins relatifs, constantes, listes de variables), data.py (loaders + construction de la matrice de 62 régresseurs), models.py (entraînement XGBoost commun), plotting.py (style de figures + libellés lisibles).
  • Les 2 scripts survivants sont réécrits en scripts numérotés avec docstrings, argparse, chemins relatifs (les chemins codés en dur /Users/.../Desktop/immo-wp3-spb-20260519 ne fonctionnaient plus) et déduplication (le helper XGBoost et les listes de variables sont partagés).
  • Nouveaux scripts : 03_make_figures.py (11 figures depuis les pickles, avec statistiques de vérification), 04_export_tables.py (tables du papier → results/tables/*.csv).
  • requirements.txt épinglé sur l'environnement validé.
  • En-tête Author: Simon-Pierre Boucher — contact@spboucher.ai ajouté à tous les fichiers de code et LaTeX (dans references.bib, l'e-mail est écrit sans @ : BibTeX interprète @ comme début d'entrée).

# 3. Figures

  • 5 figures manquantes recréées depuis les pickles (fig2 diagnostics OLS, fig4 prédit vs observé, fig7 carte, fig8 régions, fig9 relations bivariées) — les PNG originaux avaient été supprimés (~9 juin 2026) et le PDF existant contenait des boîtes « Figure indisponible ».
  • Les 11 figures régénérées dans un style homogène « journal » (demande utilisateur) : typographie serif cohérente avec le papier, axes épurés (spines haut/droite retirés), grille discrète, palette sobre, libellés lisibles (« Log(Living Area) » au lieu de ln_sqft), titres de panneaux (a)/(b) alignés à gauche, 300 dpi.
  • Vérifications contenu = papier (imprimées par 03_make_figures.py) : skewness 0,18 / kurtosis 5,55 / JB 217 078 (fig2) ; R² OLS 0,6301 / XGB 0,8330 / LGB 0,8088 (fig4) ; OLS de référence ln_sqft 0,312 (fig3) — tous identiques aux valeurs du papier.
  • Les 6 PNG originaux restent disponibles dans l'archive source pour comparaison.

# 4. Papier LaTeX (paper/)

Structure : main.tex + une section par fichier (déjà le cas), figures lues depuis ../figures/ (\graphicspath), bibliographie convertie du thebibliography manuel vers references.bib (37 entrées, clés identiques) + BibTeX/apalike. sections/references.tex supprimé. Compilation : latexmkmain.pdf, 52 pages, 0 erreur, 0 référence/citation indéfinie (l'archive originale n'avait pas de main.pdf compilable — figures manquantes).

# Complétions (placeholders [TODO] remplis avec les valeurs stockées dans les pickles)

  • Tableau des tests inter-quantiles (results) : 8 lignes [TODO: diff]/[TODO: z] remplies depuis v3_qr_imputation_results.pkl (ln_lot −0,041/z=−9,49 ; luxury −0,054/−6,82 ; foreclosure −0,155/−4,18 ; Northeast −0,264/−21,43 ; West −0,086/−6,26 ; bedrooms −0,051/−5,95 ; age² +0,010/1,40 ; waterfront +0,222/1,86), lignes triées par |z|.
  • Tableau winsorisation (robustness) : β ln_sqft 0,610 ; bathrooms 0,211 ; garage 0,111.
  • Tableau stabilité QR : CV exacts (au lieu de « <7 ») et stabilité de signe 100 % pour waterfront/pool.
  • Annexe : marqueurs [TODO] retirés de la liste « Robustness Agenda » (items non cochés = travaux futurs) ; checklist reproductibilité : « Code available: Yes (replication package) », « Data available: On request ».

# Corrections d'incohérences (chiffres alignés sur les pickles — À VALIDER par l'auteur)

  1. En-tête du tableau inter-quantile : disait β(0.90)−β(0.10) alors que les valeurs déjà présentes (garage +0,185, z=28,92…) correspondent à β(0.10)−β(0.90). En-tête corrigé.
  2. Moran's I : le tableau affichait 0,268/0,278/0,277 avec z=42,4/44,0/43,8 et « k=10 » ; le pickle (v3_spatial_results.pkl) contient 0,2742/0,2839/0,2652 (moyenne 0,2745 et écart-type 0,0076 du papier ✓) calculés avec k=8. Valeurs et k corrigés ; z recalculés en ré-exécutant le pipeline refactoré (41,8/43,5/40,5) — la ré-exécution reproduit exactement les I du pickle (validation bout-en-bout du script 01). Méthodologie : k=10 → k=8.
  3. Description de la winsorisation (data + robustness) : le texte disait « 1er/99e centile, toutes les variables continues » ; le code réel (script survivant + pickle) = lot au 99,5e centile (3 944 obs.) + Bike Score plafonné à 100 (38 obs.). Les chiffres du tableau (R² 0,640, β lot 0,058) proviennent bien de ce calcul. Description corrigée.
  4. « CV < 7 % » → « CV < 8 % » (methodology, robustness, discussion, limitations) : bedrooms 7,3 % et foreclosure 7,1 % dépassent 7 %.
  5. Matrice de robustesse : lignes FE mélangeaient R² in-sample (0,634) et out-of-sample (0,678/0,725) ; uniformisées en out-of-sample (0,630 → 0,678 (+4,8 pp) → 0,725 (+9,5 pp)), cohérent avec le tableau FE des résultats.
  6. Le tableau QR-stabilité listait « Pool » à la fois comme stable (<7) et instable (33,4) ; doublon supprimé (CV réel 33,4 %).

Aucun résultat, coefficient ou conclusion scientifique n'a été modifié : toutes les corrections ci-dessus alignent le texte sur les résultats effectivement stockés dans les pickles.

# 5. À vérifier par l'auteur

  • Les 6 corrections numérotées ci-dessus (§4), en particulier Moran (k=8, nouvelles valeurs I/z).
  • Le style des 11 figures régénérées (les 6 originales sont dans l'archive source si vous préférez l'ancien rendu pour certaines).
  • Les scripts amont perdus (construction de l'échantillon depuis DuckDB, estimation OLS/QR/ML/SHAP) ne sont pas reconstruits — les artefacts stockés en tiennent lieu. Si une reconstruction complète raw→results est souhaitée, elle est possible mais devra être validée contre les pickles.
  • paper/main.tex affiche « This version: \today » — figer la date avant soumission si besoin.