SPB Git

Ch. 8 livré et validé (compilation isolée, tests, fusion des registres)

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

37 changed files +1,700 −121

37 changed files
added analysis/python/cases/ch12_mesurage.py +193 −0
@@ -0,0 +1,193 @@
1+#!/usr/bin/env python3
2+"""Chapitre 12 — Mesurage, superficies et plans : calculs du sujet du cas 1 (Gatineau, DONNÉES SYNTHÉTIQUES).
3+
4+Imprime tous les chiffres cités dans le chapitre 12 :
5+ * plan coté du sujet (cottage à étages, empreinte ≈ 95 m², 165 m² habitables) : superficies selon six conventions
6+ (aire au sol et aire des étages du MEFQ, superficie habitable, nette, habitable avec sous-sol fini, type ANSI Z765) ;
7+ * conversions exactes m² ↔ pi² ;
8+ * prix unitaires implicites du sujet selon la convention (valeur hédonique traite.cas1.predire ≈ 637 953 $) ;
9+ * propagation d'une erreur de mesure sur la valeur : ∂V/∂S = β V/S, méthode delta et effet exact d'une erreur de ±5 % ;
10+ * biais d'un mélange de conventions (sujet mesuré brut, comparables mesurés habitables) ;
11+ * erreur sur la superficie d'un comparable et variance combinée des erreurs ;
12+ * atténuation du coefficient hédonique de la superficie par une erreur de mesure (simulation, graine 20261031).
13+
14+Usage (racine du dépôt) : PYTHONPATH=analysis/python python3 analysis/python/cases/ch12_mesurage.py
15+Le modèle hédonique provient de analysis/python/traite/cas1.py (aucune réécriture)."""
16+from __future__ import annotations
17+import sys, pathlib, math
18+import numpy as np, pandas as pd
19+sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1]))
20+from traite import cas1
21+
22+ROOT = pathlib.Path(__file__).resolve().parents[3]
23+PI2_PAR_M2 = 10.7639 # 1 m² = 10,7639 pi² (convention de l'ouvrage, annexe des conventions)
24+M2_PAR_PI2 = 0.09290304 # 1 pi² = 0,09290304 m² exactement (1 pi = 0,3048 m)
25+GRAINE = 20261031
26+
27+# ----------------------------------------------------------------------------- plan coté du sujet (hypothèses déclarées)
28+PLAN = {
29+ "long_ext_m": 12.00, # longueur hors tout (face externe des murs), ≈ 39 pi 4 po
30+ "larg_ext_m": 7.92, # largeur hors tout, ≈ 26 pi
31+ "epaisseur_mur_m": 0.28, # épaisseur moyenne des murs extérieurs (ossature 2×6, isolant, gypse, revêtement mixte)
32+ "tremie_m2": 1.00 * 3.40, # ouverture de la cage d'escalier à l'étage (1,00 × 3,40 m)
33+ "cloisons_m_lin": 44.0, # longueur cumulée des cloisons intérieures (RDC 18 m + étage 26 m)
34+ "epaisseur_cloison_m": 0.115,
35+ "n_etages": 2,
36+ "sous_sol_fini_m2": 70.0, # cohérent avec le poste « Planchers flottants (sous-sol) : 70 m² » du devis du cas 1
37+ "sous_sol_plancher_sous_sol_m": 1.90, # plancher du sous-sol à 1,90 m sous le niveau moyen du sol (> 0,4 m : pas un étage MEFQ)
38+ "garage_long_m": 6.10, "garage_larg_m": 3.66, # garage simple attaché (20 pi × 12 pi), hors empreinte principale
39+ "lot_facade_m": 15.24, "lot_prof_m": 40.68, # lot rectangulaire 50 pi × 133,5 pi ≈ 620 m²
40+ "marge_avant_m": 7.50, "marge_lat_gauche_m": 2.00, "marge_lat_droite_m": 1.50,
41+}
42+
43+
44+def superficies(plan: dict = PLAN) -> dict:
45+ """Superficies du sujet selon les conventions comparées au tableau 12.3."""
46+ L, W, t = plan["long_ext_m"], plan["larg_ext_m"], plan["epaisseur_mur_m"]
47+ aire_sol = L * W # MEFQ R0701A : projection au sol (tous étages et sous-sol : même empreinte)
48+ perim_sol = 2 * (L + W) # MEFQ R0701B
49+ aire_etages = plan["n_etages"] * aire_sol # MEFQ R0702A : somme des aires brutes des étages (sous-sol exclu)
50+ perim_etages = plan["n_etages"] * perim_sol # MEFQ R0702B
51+ aire_int_niveau = (L - 2 * t) * (W - 2 * t) # intérieur des murs extérieurs, un niveau
52+ habitable = plan["n_etages"] * aire_int_niveau - plan["tremie_m2"] # convention « habitable » de l'ouvrage (hors sous-sol, hors trémie)
53+ cloisons = plan["cloisons_m_lin"] * plan["epaisseur_cloison_m"]
54+ nette = habitable - cloisons # surface utile : cloisons déduites
55+ habitable_ss = habitable + plan["sous_sol_fini_m2"] # « superficie habitable totale » de certaines fiches (sous-sol fini inclus)
56+ ansi_hors_sol = aire_etages # type ANSI Z765 : face externe, niveaux entièrement hors sol ; trémie remplacée par les marches
57+ garage = plan["garage_long_m"] * plan["garage_larg_m"]
58+ lot = plan["lot_facade_m"] * plan["lot_prof_m"]
59+ ratio_murs = aire_int_niveau / aire_sol # = 1 − tP/A + 4t²/A
60+ return {"aire_sol_m2": aire_sol, "perimetre_sol_m": perim_sol, "aire_etages_m2": aire_etages, "perimetre_etages_m": perim_etages,
61+ "aire_int_niveau_m2": aire_int_niveau, "habitable_m2": habitable, "cloisons_m2": cloisons, "nette_m2": nette,
62+ "habitable_sous_sol_m2": habitable_ss, "ansi_hors_sol_m2": ansi_hors_sol, "ansi_sous_sol_m2": plan["sous_sol_fini_m2"],
63+ "garage_m2": garage, "lot_m2": lot, "ratio_int_ext": ratio_murs,
64+ "ratio_murs_formule": 1 - t * perim_sol / aire_sol + 4 * t ** 2 / aire_sol}
65+
66+
67+CONVENTIONS = [("Aire au sol (MEFQ R0701A)", "aire_sol_m2"), ("Superficie nette (utile)", "nette_m2"),
68+ ("Superficie habitable (convention de l'ouvrage)", "habitable_m2"),
69+ ("Aire des étages, brute (MEFQ R0702A)", "aire_etages_m2"),
70+ ("Habitable + sous-sol fini (fiches de courtage)", "habitable_sous_sol_m2")]
71+
72+
73+def modele() -> dict:
74+ d = cas1.charger(); m = cas1.hedonique(d["ventes"])
75+ V = float(cas1.predire(m, cas1.sujet_df(d["sujet"]))[0])
76+ beta = float(m["coef"].loc["ln_S", "coef"]); se = float(m["coef"].loc["ln_S", "se_hc1"])
77+ return {"data": d, "modele": m, "V": V, "beta": beta, "se_beta": se, "S": float(d["sujet"]["superficie_habitable_m2"])}
78+
79+
80+def prix_unitaires(V: float, sup: dict) -> pd.DataFrame:
81+ rows = []
82+ for nom, cle in CONVENTIONS:
83+ s = sup[cle]
84+ rows.append({"convention": nom, "m2": s, "pi2": s * PI2_PAR_M2, "dollars_m2": V / s, "dollars_pi2": V / (s * PI2_PAR_M2)})
85+ return pd.DataFrame(rows)
86+
87+
88+def propagation(V: float, S: float, beta: float, erreurs=(-0.10, -0.05, -0.02, 0.02, 0.05, 0.10)) -> pd.DataFrame:
89+ """Effet d'une erreur relative e sur S : approximation linéaire β e et effet exact (1+e)^β − 1 ; unitaire naïf (β = 1)."""
90+ dVdS = beta * V / S
91+ rows = []
92+ for e in erreurs:
93+ rows.append({"erreur_S_pct": 100 * e, "dS_m2": e * S, "lineaire_pct": 100 * beta * e, "lineaire_dollars": dVdS * e * S,
94+ "exact_pct": 100 * ((1 + e) ** beta - 1), "exact_dollars": V * ((1 + e) ** beta - 1),
95+ "naif_dollars": (V / S) * e * S})
96+ return pd.DataFrame(rows), dVdS
97+
98+
99+def melange_conventions(V: float, beta: float, s_hab: float, s_brute: float) -> dict:
100+ """Sujet mesuré selon une convention, modèle (ou comparables) selon une autre : Δ ln V = β ln(S_1/S_2)."""
101+ d1 = beta * math.log(s_brute / s_hab) # sujet brut, référence habitable → surévaluation
102+ d2 = beta * math.log(s_hab / s_brute) # sujet habitable, référence brute → sous-évaluation
103+ return {"ratio": s_brute / s_hab, "ecart_pct": 100 * (s_brute / s_hab - 1), "sujet_brut_pct": 100 * (math.exp(d1) - 1),
104+ "sujet_brut_dollars": V * (math.exp(d1) - 1), "sujet_hab_pct": 100 * (math.exp(d2) - 1), "sujet_hab_dollars": V * (math.exp(d2) - 1)}
105+
106+
107+def erreur_comparable(P_c: float, S_c: float, S_s: float, beta: float, S_c_obs: float) -> dict:
108+ """Ajustement de superficie A_S = P_c[(S_s/S_c)^β − 1] avec la vraie superficie et avec une superficie erronée du comparable."""
109+ A_vrai = P_c * ((S_s / S_c) ** beta - 1); A_obs = P_c * ((S_s / S_c_obs) ** beta - 1)
110+ return {"A_vrai": A_vrai, "A_obs": A_obs, "erreur": A_obs - A_vrai, "erreur_approx": -beta * P_c * (S_c_obs - S_c) / S_c}
111+
112+
113+def variance_combinee(V: float, beta: float, sigma_s: float, sigma_c: float, n: int) -> dict:
114+ """Écart-type relatif de l'indication par comparaison : β sqrt(σ_s² + σ_c²/n) (erreurs relatives indépendantes, poids égaux)."""
115+ rel = beta * math.sqrt(sigma_s ** 2 + sigma_c ** 2 / n)
116+ return {"relatif": rel, "dollars": rel * V, "part_sujet": sigma_s ** 2 / (sigma_s ** 2 + sigma_c ** 2 / n)}
117+
118+
119+def attenuation(m: dict, d: dict, sigmas=(0.0, 0.02, 0.05, 0.10, 0.15, 0.20), rep: int = 200, graine: int = GRAINE) -> pd.DataFrame:
120+ """Erreur de mesure classique sur ln S (u ~ N(0, σ_u²)) : réestimation de β par MCO (traite.hedonique.mco) et prédiction du sujet.
121+ λ théorique = Var(ẽ)/(Var(ẽ) + σ_u²), ẽ = résidu de ln S sur les autres régresseurs."""
122+ from traite import hedonique as h
123+ v = d["ventes"].copy(); X = cas1.matrice(v); y = np.log(v["prix_vente"].astype(float)).values
124+ cols = list(X.columns); j = cols.index("ln_S")
125+ Xo = X.drop(columns="ln_S").values
126+ lnS = X["ln_S"].values
127+ e = lnS - Xo @ np.linalg.lstsq(Xo, lnS, rcond=None)[0]
128+ var_e = float(np.var(e, ddof=0)); var_lnS = float(np.var(lnS, ddof=0))
129+ rng = np.random.default_rng(graine)
130+ s_sujet = cas1.sujet_df(d["sujet"]); Xs = cas1.matrice(s_sujet)[cols].values
131+ petite = dict(d["sujet"]); petite["superficie_habitable_m2"] = 120; Xp = cas1.matrice(cas1.sujet_df(petite))[cols].values
132+ rows = []
133+ for s in sigmas:
134+ b, Vs, Vp = [], [], []
135+ for _ in range(rep if s > 0 else 1):
136+ Xn = X.values.copy(); Xn[:, j] = lnS + rng.normal(0, s, len(lnS))
137+ r = h.mco(Xn, y); b.append(r["beta"][j])
138+ fac = float(np.mean(np.exp(r["residus"])))
139+ Vs.append(float(np.exp(Xs @ r["beta"])[0]) * fac); Vp.append(float(np.exp(Xp @ r["beta"])[0]) * fac)
140+ lam = var_e / (var_e + s ** 2)
141+ rows.append({"sigma_u": s, "lambda_theorique": lam, "beta_attendu": lam * m["beta"][j], "beta_moyen": float(np.mean(b)),
142+ "beta_ecart_type": float(np.std(b, ddof=1)) if len(b) > 1 else 0.0,
143+ "V_sujet_165": float(np.mean(Vs)), "V_maison_120": float(np.mean(Vp))})
144+ out = pd.DataFrame(rows)
145+ out.attrs["var_e"] = var_e; out.attrs["var_lnS"] = var_lnS; out.attrs["sd_lnS"] = math.sqrt(var_lnS)
146+ return out
147+
148+
149+def tout() -> dict:
150+ sup = superficies(); M = modele()
151+ pu = prix_unitaires(M["V"], sup)
152+ prop, dVdS = propagation(M["V"], M["S"], M["beta"])
153+ mel = melange_conventions(M["V"], M["beta"], sup["habitable_m2"], sup["aire_etages_m2"])
154+ sel = cas1.selection(); comps = sel["comparables"]
155+ c = comps[comps["id_vente"] == "G0404"].iloc[0]
156+ ec = erreur_comparable(float(c["prix_vente"]), float(c["superficie_habitable_m2"]), M["S"], M["beta"], float(c["superficie_habitable_m2"]) + 10)
157+ vc = {k: variance_combinee(M["V"], M["beta"], 0.02, 0.02, 5) for k in ["base"]}
158+ vc["sujet_seul"] = variance_combinee(M["V"], M["beta"], 0.02, 0.0, 5)
159+ vc["comparables_seuls"] = variance_combinee(M["V"], M["beta"], 0.0, 0.02, 5)
160+ vc["cinq_pct"] = variance_combinee(M["V"], M["beta"], 0.05, 0.02, 5)
161+ att = attenuation(M["modele"], M["data"])
162+ return {"sup": sup, "M": M, "pu": pu, "prop": prop, "dVdS": dVdS, "mel": mel, "comp": c, "ec": ec, "vc": vc, "att": att}
163+
164+
165+def main():
166+ r = tout(); sup, M = r["sup"], r["M"]
167+ print("=== Plan coté du sujet (hypothèses déclarées) ===")
168+ for k, v in PLAN.items(): print(f" {k:32s} {v}")
169+ print("\n=== Superficies du sujet (m²) ===")
170+ for k, v in sup.items(): print(f" {k:28s} {v:10.4f}" if isinstance(v, float) else f" {k:28s} {v}")
171+ print(f" (vérif. ratio murs : 1 − tP/A + 4t²/A = {sup['ratio_murs_formule']:.4f} ; direct {sup['ratio_int_ext']:.4f})")
172+ print(f"\n=== Conversions : 1 m² = {PI2_PAR_M2} pi² ; 1 pi² = {M2_PAR_PI2} m² ; produit = {PI2_PAR_M2 * M2_PAR_PI2:.7f}")
173+ print(f" habitable {sup['habitable_m2']:.2f} m² = {sup['habitable_m2']*PI2_PAR_M2:.1f} pi² ; aire des étages {sup['aire_etages_m2']:.2f} m² = {sup['aire_etages_m2']*PI2_PAR_M2:.1f} pi²")
174+ print(f"\n=== Modèle hédonique (traite.cas1) : β_S = {M['beta']:.5f} (ET HC1 {M['se_beta']:.5f}) ; V sujet (Duan) = {M['V']:,.2f} $ ; S = {M['S']} m²")
175+ print("\n=== Prix unitaires implicites du sujet selon la convention ===")
176+ print(r["pu"].to_string(index=False, float_format=lambda x: f"{x:,.2f}"))
177+ print(f"\n=== Propagation : ∂V/∂S = β V / S = {r['dVdS']:,.2f} $/m² ; prix unitaire naïf V/S = {M['V']/M['S']:,.2f} $/m² ; rapport = β = {r['dVdS']/(M['V']/M['S']):.4f}")
178+ print(f" σ_S = 5 % = {0.05*M['S']:.2f} m² → σ_V ≈ {r['dVdS']*0.05*M['S']:,.2f} $ ({100*M['beta']*0.05:.3f} % de V)")
179+ print(r["prop"].to_string(index=False, float_format=lambda x: f"{x:,.3f}"))
180+ print("\n=== Mélange de conventions (habitable vs aire brute des étages) ===")
181+ for k, v in r["mel"].items(): print(f" {k:22s} {v:,.4f}")
182+ c = r["comp"]; ec = r["ec"]
183+ print(f"\n=== Erreur sur la superficie d'un comparable : {c['id_vente']} P = {c['prix_vente']:,.0f} $, S = {c['superficie_habitable_m2']} m² (sujet {M['S']} m²), S observée +10 m² ===")
184+ for k, v in ec.items(): print(f" {k:14s} {v:,.2f} $")
185+ print("\n=== Variance combinée (erreurs relatives indépendantes, 5 comparables, poids égaux) ===")
186+ for k, v in r["vc"].items(): print(f" {k:18s} relatif {100*v['relatif']:.3f} % ; {v['dollars']:,.0f} $ ; part du sujet {100*v['part_sujet']:.1f} %")
187+ att = r["att"]
188+ print(f"\n=== Atténuation (erreur de mesure sur ln S ; Var(ẽ) = {att.attrs['var_e']:.5f}, sd(ln S) = {att.attrs['sd_lnS']:.4f}) ===")
189+ print(att.to_string(index=False, float_format=lambda x: f"{x:,.4f}"))
190+
191+
192+if __name__ == "__main__":
193+ main()
modified analysis/python/cases/ch19_spatial.py +16 −10
@@ -125,10 +125,17 @@ def gwr_resultats(b: dict) -> dict:
125 cols = list(b["Xr"].columns) 125 cols = list(b["Xr"].columns)
126 beta = pd.DataFrame(g["beta"], columns=cols) 126 beta = pd.DataFrame(g["beta"], columns=cols)
127 quart = beta.describe(percentiles=[0.25, 0.5, 0.75]).T[["min", "25%", "50%", "75%", "max"]] 127 quart = beta.describe(percentiles=[0.25, 0.5, 0.75]).T[["min", "25%", "50%", "75%", "max"]]
128− inter = pd.Series(g["beta"][:, 0]).groupby(b["ventes"]["secteur"].values).median() 128+ # effet de localisation local = constante locale + coefficient local du gradient × distance (au-delà de 3 km), par secteur,
129− inter_rel = inter - inter["Hull"] 129+ # comparé à l'effet de localisation du modèle de référence (indicatrice + gradient) et à celui du générateur (prime − 0,006·max(d − 3, 0))
130− dummies = {"Hull": 0.0, **{s: float(b["modele"]["coef"].loc[f"sect_{s}", "coef"]) for s in cas1.SECTEURS[1:]}} 130+ sect = b["ventes"]["secteur"].values; dist = b["Xr"]["dist_centre"].values; j = cols.index("dist_centre")
131− comp = pd.DataFrame({"gwr_intercept_rel_hull": inter_rel, "indicatrice_reference": pd.Series(dummies), "prime_generateur": pd.Series(PRIMES_DGP)}) 131+ loc_gwr = g["beta"][:, 0] + g["beta"][:, j] * dist
132+ coef = b["modele"]["coef"]["coef"]
133+ loc_ref = np.array([coef.get(f"sect_{sc}", 0.0) for sc in sect]) + coef["dist_centre"] * dist
134+ loc_dgp = np.array([PRIMES_DGP[sc] for sc in sect]) - 0.006 * dist
135+ comp = pd.DataFrame({"gwr": loc_gwr, "reference": loc_ref, "generateur": loc_dgp, "secteur": sect}).groupby("secteur").median()
136+ comp["gwr"] -= float(np.median(g["beta"][sect == "Hull", 0])) # écart à la constante locale médiane de Hull
137+ comp = comp.rename(columns={"gwr": "gwr_localisation_rel_hull", "reference": "reference_localisation", "generateur": "generateur_localisation"})
138+ comp.loc["Hull", "gwr_localisation_rel_hull"] = 0.0
132 aicc_mco_r = _aicc(b["mco_r"]["residus"], X.shape[1]); aicc_mco_c = _aicc(b["modele"]["residus"], b["Xc"].shape[1]) 139 aicc_mco_r = _aicc(b["mco_r"]["residus"], X.shape[1]); aicc_mco_c = _aicc(b["modele"]["residus"], b["Xc"].shape[1])
133 return {"selection": sel, "gwr": g, "beta": beta, "quartiles": quart, "comparaison_secteurs": comp, "sujet_beta": gs["beta"][0], 140 return {"selection": sel, "gwr": g, "beta": beta, "quartiles": quart, "comparaison_secteurs": comp, "sujet_beta": gs["beta"][0],
134 "aicc_mco_sans_secteur": aicc_mco_r, "aicc_mco_reference": aicc_mco_c} 141 "aicc_mco_sans_secteur": aicc_mco_r, "aicc_mco_reference": aicc_mco_c}
@@ -141,10 +148,8 @@ def effets_fixes(b: dict, W: np.ndarray) -> pd.DataFrame:
141 r = h.mco(Xm, y); k = Xm.shape[1] 148 r = h.mco(Xm, y); k = Xm.shape[1]
142 return {"specification": nom, "parametres": k, "effets_spatiaux": k_spatial, "effets_temps": k_temps, "r2": r["r2"], 149 return {"specification": nom, "parametres": k, "effets_spatiaux": k_spatial, "effets_temps": k_temps, "r2": r["r2"],
143 "r2_ajuste": r["r2_ajuste"], "sigma": float(np.sqrt(r["sigma2"])), "aic": _aic_mco(r["residus"], k), "moran": h.moran_i(r["residus"], W)["I"]} 150 "r2_ajuste": r["r2_ajuste"], "sigma": float(np.sqrt(r["sigma2"])), "aic": _aic_mco(r["residus"], k), "moran": h.moran_i(r["residus"], W)["I"]}
144− rows = [ligne("Aucun effet spatial ; tendance linéaire", b["Xr"].values, 0, 1), 151+ rows = [ligne("Gradient de distance seul (sans secteur) ; tendance linéaire", b["Xr"].values, 1, 1),
145− ligne("Gradient de distance seulement ; tendance linéaire", b["Xr"].values, 1, 1) if False else None, 152+ ligne("Secteurs et gradient (référence) ; tendance linéaire", b["Xc"].values, 5, 1)]
146− ligne("Secteurs (référence) ; tendance linéaire", b["Xc"].values, 4, 1)]
147− rows = [r for r in rows if r]
148 for cell in [5.0, 3.0, 2.0]: 153 for cell in [5.0, 3.0, 2.0]:
149 gx = np.floor(xy[:, 0] / cell); gy = np.floor(xy[:, 1] / cell); cid = pd.factorize(gx * 1000 + gy)[0] 154 gx = np.floor(xy[:, 0] / cell); gy = np.floor(xy[:, 1] / cell); cid = pd.factorize(gx * 1000 + gy)[0]
150 D = pd.get_dummies(cid, drop_first=True).astype(float).values 155 D = pd.get_dummies(cid, drop_first=True).astype(float).values
@@ -235,6 +240,7 @@ def predictions_sujet(b: dict, mod: dict, g: dict, vk: dict, W: np.ndarray) -> p
235 {"modele": "SEM sans secteur (espérance conditionnelle du résidu)", "ln_correction": u_s, "indication": sem_pred}, 240 {"modele": "SEM sans secteur (espérance conditionnelle du résidu)", "ln_correction": u_s, "indication": sem_pred},
236 {"modele": "SAR sans secteur (décalage des 8 ventes voisines)", "ln_correction": float(sar["rho"] * Wy_s), "indication": sar_pred}, 241 {"modele": "SAR sans secteur (décalage des 8 ventes voisines)", "ln_correction": float(sar["rho"] * Wy_s), "indication": sar_pred},
237 {"modele": "GWR sans secteur (coefficients locaux au sujet)", "ln_correction": float(g["sujet_beta"][0] - b["mco_r"]["beta"][0]), "indication": gwr_pred}]) 242 {"modele": "GWR sans secteur (coefficients locaux au sujet)", "ln_correction": float(g["sujet_beta"][0] - b["mco_r"]["beta"][0]), "indication": gwr_pred}])
243+ df["ecart_log_vs_mco_sans_secteur"] = np.log(df["indication"] / mco_r)
238 df.attrs["voisins_sujet"] = list(b["ventes"]["id_vente"].values[idx]); df.attrs["secteurs_voisins"] = list(b["ventes"]["secteur"].values[idx]) 244 df.attrs["voisins_sujet"] = list(b["ventes"]["id_vente"].values[idx]); df.attrs["secteurs_voisins"] = list(b["ventes"]["secteur"].values[idx])
239 df.attrs["variance_krigeage_sujet"] = float(vk["sujet"]["variance"][0]) 245 df.attrs["variance_krigeage_sujet"] = float(vk["sujet"]["variance"][0])
240 return df 246 return df
@@ -244,11 +250,11 @@ def predictions_sujet(b: dict, mod: dict, g: dict, vk: dict, W: np.ndarray) -> p
244 def sensibilite(b: dict) -> pd.DataFrame: 250 def sensibilite(b: dict) -> pd.DataFrame:
245 y, Xr, xy, e = b["y"], b["Xr"].values, b["xy"], b["mco_r"]["residus"] 251 y, Xr, xy, e = b["y"], b["Xr"].values, b["xy"], b["mco_r"]["residus"]
246 specs = [("k plus proches voisins", k, h.matrice_poids_knn(xy, k)) for k in [4, 6, 8, 12, 16]] 252 specs = [("k plus proches voisins", k, h.matrice_poids_knn(xy, k)) for k in [4, 6, 8, 12, 16]]
247− specs += [("distance inverse", d, h.matrice_poids_distance_inverse(xy, d)) for d in [1.0, 2.0, 4.0]] 253+ specs += [("distance inverse", d, h.matrice_poids_distance_inverse(xy, d)) for d in [2.0, 3.0, 4.0]]
248 rows = [] 254 rows = []
249 for fam, par, W in specs: 255 for fam, par, W in specs:
250 mi = h.moran_i(e, W); sar = h.sar_mv(y, Xr, W); sem = h.sem_mv(y, Xr, W) 256 mi = h.moran_i(e, W); sar = h.sar_mv(y, Xr, W); sem = h.sem_mv(y, Xr, W)
251− rows.append({"famille": fam, "parametre": par, "voisins_moyen": float((W > 0).sum(1).mean()), "I": mi["I"], "z": mi["z"], 257+ rows.append({"famille": fam, "parametre": par, "voisins_moyen": float((W > 0).sum(1).mean()), "lignes_vides": int((W.sum(1) == 0).sum()), "I": mi["I"], "z": mi["z"],
252 "rho": sar["rho"], "se_rho": sar["se_rho"], "aic_sar": sar["aic"], "lambda": sem["lambda"], "se_lambda": sem["se_lambda"], "aic_sem": sem["aic"]}) 258 "rho": sar["rho"], "se_rho": sar["se_rho"], "aic_sar": sar["aic"], "lambda": sem["lambda"], "se_lambda": sem["se_lambda"], "aic_sem": sem["aic"]})
253 return pd.DataFrame(rows) 259 return pd.DataFrame(rows)
254 260
modified analysis/python/figures/ch11_fiche_etat.py +3 −3
@@ -11,7 +11,7 @@ import matplotlib.pyplot as plt
11 from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars 11 from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars
12 import ch11_inspection as cas 12 import ch11_inspection as cas
13 13
14−COUL_ETAT = {1: palette.seq[0], 2: palette.seq[1], 3: palette.seq[2], 4: palette.seq[3], 5: palette.seq[4]} 14+COUL_ETAT = {1: palette.cat[4], 2: palette.cat[0], 3: palette.cat[2], 4: palette.cat[1], 5: palette.cat[3]}
15 15
16 16
17 def fiche_etat(f): 17 def fiche_etat(f):
@@ -26,9 +26,9 @@ def fiche_etat(f):
26 ax.scatter(f.loc[m, "ratio"], y[m], s=tailles[m], color=COUL_ETAT[int(e)], edgecolor=palette.ink2, lw=0.4, zorder=3, label=f"état {int(e)}") 26 ax.scatter(f.loc[m, "ratio"], y[m], s=tailles[m], color=COUL_ETAT[int(e)], edgecolor=palette.ink2, lw=0.4, zorder=3, label=f"état {int(e)}")
27 ax.set_yticks(y); ax.set_yticklabels([c.replace(" (", "\n(") if len(c) > 44 else c for c in f["composante"]], fontsize=7) 27 ax.set_yticks(y); ax.set_yticklabels([c.replace(" (", "\n(") if len(c) > 44 else c for c in f["composante"]], fontsize=7)
28 ax.set_xlim(0, 1.45); ax.axvline(1.0, color=palette.ink2, lw=0.7, ls="--") 28 ax.set_xlim(0, 1.45); ax.axvline(1.0, color=palette.ink2, lw=0.7, ls="--")
29− ax.set_xlabel("Fraction de la vie utile consommée (repère | : âge chronologique ; disque : âge effectif, taille proportionnelle au coût neuf)") 29+ ax.set_xlabel("Fraction de la vie utile consommée\n(trait : âge chronologique ; disque : âge effectif, taille selon le coût neuf)", fontsize=7.5)
30 ax.grid(axis="y", visible=False) 30 ax.grid(axis="y", visible=False)
31− ax.legend(loc="lower right", fontsize=6.8, ncol=2, title="Note d'état", title_fontsize=7) 31+ ax.legend(loc="upper left", bbox_to_anchor=(0.01, 0.99), fontsize=6.8, ncol=1, title="Note d'état constatée", title_fontsize=7)
32 fig.tight_layout() 32 fig.tight_layout()
33 return savefig(fig, "ch11/ch11-fig-fiche-etat.pdf") 33 return savefig(fig, "ch11/ch11-fig-fiche-etat.pdf")
34 34
modified analysis/python/figures/ch11_frise_pathologies.py +11 −10
@@ -9,6 +9,7 @@ Sortie : assets/figures/ch11/ch11-fig-frise-pathologies.pdf"""
9 import sys, pathlib 9 import sys, pathlib
10 ROOT = pathlib.Path(__file__).resolve().parents[3] 10 ROOT = pathlib.Path(__file__).resolve().parents[3]
11 sys.path.insert(0, str(ROOT / "analysis/python")) 11 sys.path.insert(0, str(ROOT / "analysis/python"))
12+import textwrap
12 import matplotlib.pyplot as plt 13 import matplotlib.pyplot as plt
13 from traite.style import setup, palette, savefig, LARGEUR 14 from traite.style import setup, palette, savefig, LARGEUR
14 15
@@ -36,21 +37,21 @@ FAMILLES = ["Fondations et sols", "Enveloppe", "Isolation et air intérieur", "P
36 37
37 def main(): 38 def main():
38 setup() 39 setup()
39− coul = {f: palette.cat[i % len(palette.cat)] for i, f in enumerate(FAMILLES)} 40+ coul = {f: palette.cat[i] for i, f in enumerate(FAMILLES[:-1])}; coul["Normes"] = palette.ink2
40 ordre = sorted(FRISE, key=lambda r: (FAMILLES.index(r[3]), r[1])) 41 ordre = sorted(FRISE, key=lambda r: (FAMILLES.index(r[3]), r[1]))
41− fig, ax = plt.subplots(figsize=(LARGEUR, 4.6)) 42+ fig, ax = plt.subplots(figsize=(LARGEUR, 5.2))
42 for k, (lib, d, f_, fam) in enumerate(ordre): 43 for k, (lib, d, f_, fam) in enumerate(ordre):
43 ax.barh(k, f_ - d, left=d, height=0.62, color=coul[fam], alpha=0.9) 44 ax.barh(k, f_ - d, left=d, height=0.62, color=coul[fam], alpha=0.9)
44− ax.text(d - 1, k, lib, ha="right", va="center", fontsize=6.6, color=palette.ink) 45+ ax.set_yticks(range(len(ordre))); ax.set_yticklabels(["\n".join(textwrap.wrap(r[0], 46)) for r in ordre], fontsize=6.3)
45− ax.set_yticks([]); ax.set_ylim(-0.7, len(ordre) - 0.3); ax.invert_yaxis() 46+ ax.set_ylim(-0.7, len(ordre) - 0.3); ax.invert_yaxis()
46− ax.set_xlim(1900, 2030); ax.set_xticks(range(1900, 2031, 10)) 47+ ax.set_xlim(1900, 2030); ax.set_xticks(range(1900, 2031, 20)); ax.tick_params(axis="x", labelsize=7)
47− ax.set_xlabel("Période de construction ou de mise en place (repères indicatifs, arrondis à la décennie sauf dates (v) vérifiées)") 48+ ax.set_xlabel("Période de mise en place (repères indicatifs arrondis ;\ndates marquées (v) : vérifiées sur une source publique)", fontsize=7.5)
48− ax.axvline(1998, color=palette.brand, lw=0.9, ls="--"); ax.text(1998.5, -0.45, "sujet cas 1 : 1998", fontsize=7, color=palette.brand, va="center") 49+ ax.axvline(1998, color=palette.brand, lw=0.9, ls="--"); ax.text(1996.5, len(ordre) - 0.6, "sujet cas 1 : 1998", fontsize=7, color=palette.brand, va="center", ha="right")
49 ax.grid(axis="y", visible=False) 50 ax.grid(axis="y", visible=False)
50 from matplotlib.patches import Patch 51 from matplotlib.patches import Patch
51− ax.legend(handles=[Patch(color=coul[f], label=f) for f in FAMILLES], loc="lower left", ncol=4, fontsize=6.6, bbox_to_anchor=(-0.95, -0.26), frameon=False) 52+ fig.legend(handles=[Patch(color=coul[f], label=f) for f in FAMILLES], loc="lower center", ncol=4, fontsize=6.6, frameon=False, bbox_to_anchor=(0.5, -0.01))
52− for s in ("left",): ax.spines[s].set_visible(False) 53+ ax.spines["left"].set_visible(False)
53− fig.tight_layout() 54+ fig.tight_layout(rect=(0, 0.06, 1, 1))
54 out = savefig(fig, "ch11/ch11-fig-frise-pathologies.pdf"); print("OK", out) 55 out = savefig(fig, "ch11/ch11-fig-frise-pathologies.pdf"); print("OK", out)
55 56
56 57
modified analysis/python/figures/ch11_matrice_age_effectif.py +1 −1
@@ -25,7 +25,7 @@ def main():
25 for e in etats: 25 for e in etats:
26 for a in (0, 15, 30, 45, 60): 26 for a in (0, 15, 30, 45, 60):
27 v = cas.age_effectif(a, L, e) 27 v = cas.age_effectif(a, L, e)
28− ax1.text(a, e, f"{v:.0f}", ha="center", va="center", fontsize=7.5, color=palette.ink if v < 0.55 * L else "white") 28+ ax1.text(min(max(a, 2), 58), e, f"{v:.0f}", ha="center", va="center", fontsize=7.5, color=palette.ink if v < 0.55 * L else "white")
29 cb = fig.colorbar(im, ax=ax1, fraction=0.05, pad=0.03); cb.set_label("Âge effectif $a_{\\mathrm{eff}}$ (années)") 29 cb = fig.colorbar(im, ax=ax1, fraction=0.05, pad=0.03); cb.set_label("Âge effectif $a_{\\mathrm{eff}}$ (années)")
30 cb.outline.set_visible(False) 30 cb.outline.set_visible(False)
31 for i, e in enumerate(etats): 31 for i, e in enumerate(etats):
added analysis/python/figures/ch19_figures.py +143 −0
@@ -0,0 +1,143 @@
1+#!/usr/bin/env python3
2+"""Figures du chapitre 19 — modèles spatiaux et temporels (cas 1, Gatineau, DONNÉES SYNTHÉTIQUES, graine 20261031).
3+Toutes les cartes sont tracées sur les coordonnées synthétiques (km est/nord autour du centroïde des ventes), sans fond de carte.
4+Sorties (assets/figures/ch19/) :
5+ ch19-fig-carte-residus.pdf résidus MCO sans indicatrices de secteur vs modèle de référence
6+ ch19-fig-correlogramme.pdf I de Moran par bande de distance
7+ ch19-fig-gwr-coefficients.pdf coefficients locaux de la GWR (localisation, superficie, âge)
8+ ch19-fig-gwr-bande.pdf score de validation croisée selon la bande passante
9+ ch19-fig-variogramme.pdf variogramme empirique et modèle exponentiel
10+ ch19-fig-krigeage.pdf surface krigée des résidus
11+ ch19-fig-sensibilite-W.pdf I, ρ et λ selon la matrice de poids
12+Usage (racine du dépôt) : PYTHONPATH=analysis/python python3 analysis/python/figures/ch19_figures.py"""
13+import sys, pathlib
14+ROOT = pathlib.Path(__file__).resolve().parents[3]
15+sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases"))
16+import numpy as np
17+import matplotlib.pyplot as plt
18+from matplotlib.ticker import FuncFormatter
19+from traite.style import setup, palette, savefig, LARGEUR, DEMI
20+from traite import hedonique as h
21+import ch19_spatial as c19
22+
23+SECTEURS = ["Hull", "Gatineau", "Aylmer", "Buckingham", "Masson-Angers"]
24+
25+def _axes_km(ax, xy):
26+ ax.set_aspect("equal"); ax.set_xlim(xy[:, 0].min() - 1.5, xy[:, 0].max() + 1.5); ax.set_ylim(xy[:, 1].min() - 1.5, xy[:, 1].max() + 1.5)
27+ ax.set_xlabel("Est (km, coordonnées synthétiques)"); ax.grid(True, lw=0.4)
28+
29+def _etiquettes_secteurs(ax, v, xy, dy=0.0):
30+ for s in SECTEURS:
31+ m = (v["secteur"] == s).values
32+ cx, cy = np.median(xy[m, 0]), np.median(xy[m, 1])
33+ ax.text(cx, cy + dy, s, fontsize=7, color=palette.ink2, ha="center", va="center",
34+ bbox=dict(boxstyle="round,pad=0.15", fc=palette.surface, ec="none", alpha=0.75))
35+
36+def fig_carte_residus(res):
37+ b = res["base"]; v, xy, cs = b["ventes"], b["xy"], b["cs"]
38+ series = [("Sans indicatrices de secteur (I = %.2f)" % res["moran"].loc[2, "I_knn"], b["mco_r"]["residus"]),
39+ ("Modèle de référence (I = %.2f)" % res["moran"].loc[3, "I_knn"], b["modele"]["residus"])]
40+ fig, axes = plt.subplots(1, 2, figsize=(LARGEUR, 3.3), sharey=True)
41+ vmax = 0.25; cmap = palette.cmap_div()
42+ for ax, (titre, e) in zip(axes, series):
43+ sc = ax.scatter(xy[:, 0], xy[:, 1], c=np.clip(e, -vmax, vmax), cmap=cmap, vmin=-vmax, vmax=vmax, s=9, lw=0)
44+ ax.scatter(cs[:, 0], cs[:, 1], marker="*", s=110, color=palette.ink, zorder=5)
45+ _axes_km(ax, xy); ax.set_title(titre, fontsize=8.5); _etiquettes_secteurs(ax, v, xy, dy=4.5)
46+ axes[0].set_ylabel("Nord (km)")
47+ cb = fig.colorbar(sc, ax=axes, orientation="horizontal", fraction=0.05, pad=0.16, aspect=40)
48+ cb.set_label("Résidu du modèle semi-logarithmique (ln P observé − ln P ajusté)", fontsize=8)
49+ cb.ax.tick_params(labelsize=7.5)
50+ savefig(fig, "ch19/ch19-fig-carte-residus.pdf")
51+
52+def fig_correlogramme(res):
53+ cg = res["correlogramme"]
54+ fig, ax = plt.subplots(figsize=(LARGEUR, 3.0))
55+ for i, (cle, nom) in enumerate([("sans_secteur", "Résidus sans indicatrices de secteur"), ("reference", "Résidus du modèle de référence")]):
56+ pts = cg[cle]; x = np.array([(p["d_min"] + p["d_max"]) / 2 for p in pts]); I = np.array([p["I"] for p in pts])
57+ sd = np.sqrt(np.array([p["Var_I"] for p in pts]))
58+ ax.errorbar(x + (i - 0.5) * 0.12, I, yerr=1.96 * sd, fmt="o-", color=palette.cat[i], ms=4.5, lw=1.4, capsize=2, label=nom)
59+ ax.axhline(cg["reference"][0]["E_I"], color=palette.ink2, lw=0.9, ls="--")
60+ ax.text(14.6, cg["reference"][0]["E_I"] + 0.012, "E[I] = −1/(n−1)", fontsize=7, color=palette.ink2, ha="right")
61+ ax.set_xlabel("Distance entre paires de ventes (km, centre de la bande)"); ax.set_ylabel("I de Moran de la bande")
62+ ax.legend(loc="upper right", fontsize=7.5)
63+ savefig(fig, "ch19/ch19-fig-correlogramme.pdf")
64+
65+def fig_gwr_coefficients(res):
66+ b = res["base"]; v, xy, cs = b["ventes"], b["xy"], b["cs"]; g = res["gwr"]["gwr"]; cols = list(b["Xr"].columns)
67+ j = cols.index("dist_centre"); dist = b["Xr"]["dist_centre"].values
68+ sect = v["secteur"].values
69+ loc = g["beta"][:, 0] + g["beta"][:, j] * dist - np.median(g["beta"][sect == "Hull", 0])
70+ panneaux = [("Effet de localisation local\n(écart à Hull, en log)", loc, palette.cmap_div(), -0.35, 0.35),
71+ ("Coefficient local de ln(superficie)\n(élasticité)", g["beta"][:, cols.index("ln_S")], palette.cmap_seq(), None, None),
72+ ("Coefficient local de l'âge\n(× 100, % par année)", 100 * g["beta"][:, cols.index("age")], palette.cmap_seq(), None, None)]
73+ fig, axes = plt.subplots(1, 3, figsize=(LARGEUR, 2.75))
74+ for ax, (titre, z, cmap, vmin, vmax) in zip(axes, panneaux):
75+ sc = ax.scatter(xy[:, 0], xy[:, 1], c=z, cmap=cmap, vmin=vmin, vmax=vmax, s=6, lw=0)
76+ ax.scatter(cs[:, 0], cs[:, 1], marker="*", s=70, color=palette.ink, zorder=5)
77+ _axes_km(ax, xy); ax.set_title(titre, fontsize=7.5); ax.tick_params(labelsize=6.5); ax.set_xlabel("Est (km)", fontsize=7)
78+ cb = fig.colorbar(sc, ax=ax, orientation="horizontal", fraction=0.06, pad=0.22, aspect=28); cb.ax.tick_params(labelsize=6.5)
79+ axes[0].set_ylabel("Nord (km)", fontsize=7)
80+ savefig(fig, "ch19/ch19-fig-gwr-coefficients.pdf")
81+
82+def fig_gwr_bande(res):
83+ sel = res["gwr"]["selection"]
84+ fig, ax = plt.subplots(figsize=(DEMI, 2.5))
85+ ax.plot(sel["grille"], sel["cv_grille"], marker="o", ms=3.5, color=palette.cat[0])
86+ ax.axvline(sel["bande"], color=palette.ink2, ls="--", lw=0.9)
87+ ax.text(sel["bande"] * 1.08, ax.get_ylim()[1] * 0.985, "h* = %.2f km" % sel["bande"], fontsize=7, color=palette.ink2, va="top")
88+ ax.set_xscale("log"); ax.set_xlabel("Bande passante h (km, échelle log)"); ax.set_ylabel("Score de validation croisée\n(somme des carrés, log)")
89+ ax.set_xticks([0.3, 0.5, 1, 2, 5, 10]); ax.get_xaxis().set_major_formatter(FuncFormatter(lambda x, p: ("%g" % x)))
90+ savefig(fig, "ch19/ch19-fig-gwr-bande.pdf")
91+
92+def fig_variogramme(res):
93+ vk = res["variogramme"]; vg, vr, p = vk["variogramme"], vk["variogramme_reference"], vk["parametres"]
94+ fig, ax = plt.subplots(figsize=(LARGEUR, 3.1))
95+ taille = 12 + 60 * vg["n"] / vg["n"].max()
96+ ax.scatter(vg["h"], vg["gamma"], s=taille, color=palette.cat[0], alpha=0.85, lw=0, label="Résidus sans indicatrices de secteur (taille ∝ nombre de paires)", zorder=3)
97+ hh = np.linspace(0.05, 16, 200)
98+ ax.plot(hh, h.variogramme_exponentiel(hh, p["pepite"], p["palier_partiel"], p["portee"]), color=palette.cat[0], lw=1.6,
99+ label="Modèle exponentiel ajusté (pépite %.4f, palier %.4f, portée pratique %.0f km)" % (p["pepite"], p["palier"], p["portee_pratique"]))
100+ ax.scatter(vr["h"], vr["gamma"], s=14, marker="s", color=palette.cat[1], lw=0, label="Résidus du modèle de référence", zorder=3)
101+ ax.axhline(vk["sigma2_reference"], color=palette.cat[1], lw=0.9, ls=":")
102+ ax.axhline(vk["variance_residus"], color=palette.cat[0], lw=0.9, ls=":")
103+ ax.text(15.8, vk["variance_residus"] + 0.0004, "variance des résidus sans secteur", fontsize=7, color=palette.ink2, ha="right")
104+ ax.text(15.8, vk["sigma2_reference"] - 0.0012, "σ² du modèle de référence", fontsize=7, color=palette.ink2, ha="right")
105+ ax.set_xlabel("Distance h entre paires de ventes (km)"); ax.set_ylabel("Semi-variance γ(h) (log²)")
106+ ax.set_ylim(0, 0.02); ax.legend(loc="upper left", fontsize=7)
107+ savefig(fig, "ch19/ch19-fig-variogramme.pdf")
108+
109+def fig_krigeage(res):
110+ b = res["base"]; v, xy, cs = b["ventes"], b["xy"], b["cs"]; gr = res["variogramme"]["grille"]
111+ GX, GY = np.meshgrid(gr["x"], gr["y"]); pts = np.column_stack([GX.ravel(), GY.ravel()])
112+ from scipy.spatial import cKDTree
113+ dmin = cKDTree(xy).query(pts)[0].reshape(GX.shape)
114+ Z = np.ma.masked_where(dmin > 2.5, gr["z"])
115+ fig, ax = plt.subplots(figsize=(LARGEUR, 3.6))
116+ vmax = 0.25
117+ cf = ax.contourf(GX, GY, np.clip(Z, -vmax, vmax), levels=np.linspace(-vmax, vmax, 21), cmap=palette.cmap_div(), vmin=-vmax, vmax=vmax)
118+ ax.scatter(xy[:, 0], xy[:, 1], s=3, color=palette.ink, alpha=0.45, lw=0)
119+ ax.scatter(cs[:, 0], cs[:, 1], marker="*", s=120, color=palette.ink, zorder=5)
120+ ax.annotate("sujet : résidu krigé %.3f" % res["variogramme"]["sujet"]["prediction"][0], (cs[0, 0], cs[0, 1]), xytext=(-70, -22), textcoords="offset points",
121+ fontsize=7, color=palette.ink, arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.7))
122+ _axes_km(ax, xy); ax.set_ylabel("Nord (km)"); _etiquettes_secteurs(ax, v, xy, dy=5.0)
123+ cb = fig.colorbar(cf, ax=ax, fraction=0.035, pad=0.02); cb.set_label("Résidu krigé (log)", fontsize=8); cb.ax.tick_params(labelsize=7.5)
124+ savefig(fig, "ch19/ch19-fig-krigeage.pdf")
125+
126+def fig_sensibilite(res):
127+ s = res["sensibilite"]; k = s[s["famille"].str.startswith("k")]
128+ fig, ax = plt.subplots(figsize=(LARGEUR, 2.9))
129+ ax.errorbar(k["parametre"], k["rho"], yerr=1.96 * k["se_rho"], fmt="o-", color=palette.cat[0], ms=4.5, capsize=2, label="ρ du SAR (± 1,96 é.-t.)")
130+ ax.errorbar(k["parametre"], k["lambda"], yerr=1.96 * k["se_lambda"], fmt="s-", color=palette.cat[1], ms=4.5, capsize=2, label="λ du SEM (± 1,96 é.-t.)")
131+ ax.plot(k["parametre"], k["I"], "^-", color=palette.cat[2], ms=4.5, label="I de Moran des résidus MCO")
132+ ax.set_xlabel("Nombre k de plus proches voisins dans W"); ax.set_ylabel("Coefficient"); ax.set_xticks(k["parametre"].astype(int))
133+ ax.set_ylim(0, 0.95); ax.legend(loc="upper left", fontsize=7.5)
134+ savefig(fig, "ch19/ch19-fig-sensibilite-W.pdf")
135+
136+def main():
137+ setup()
138+ res = c19.main(verbose=False)
139+ for f in [fig_carte_residus, fig_correlogramme, fig_gwr_coefficients, fig_gwr_bande, fig_variogramme, fig_krigeage, fig_sensibilite]:
140+ f(res); print("OK", f.__name__)
141+
142+if __name__ == "__main__":
143+ main()
modified analysis/python/tests/test_ch04.py +45 −0
@@ -225,3 +225,48 @@ class TestFiguresEtFichiers:
225 assert set(carte.CENTRES) == {"Montréal", "Québec", "Ottawa-Gatineau (partie du Québec)", "Sherbrooke", "Trois-Rivières", "Saguenay"} 225 assert set(carte.CENTRES) == {"Montréal", "Québec", "Ottawa-Gatineau (partie du Québec)", "Sherbrooke", "Trois-Rivières", "Saguenay"}
226 for lat, lon in carte.CENTRES.values(): 226 for lat, lon in carte.CENTRES.values():
227 assert 45.0 < lat < 49.0 and -76.0 < lon < -70.5 227 assert 45.0 < lat < 49.0 and -76.0 < lon < -70.5
228+
229+
230+class TestExercices:
231+ @pytest.fixture(scope="class")
232+ def ex(self):
233+ return cas.exercices()
234+
235+ def test_ex1(self, ex):
236+ e = ex["ex1"]
237+ assert e["qc_menages"] == 2053295 and e["qc_prop"] == 683170
238+ assert e["qc_part"] == pytest.approx(0.548, abs=5e-4) and e["qc_taux_prop"] == pytest.approx(0.333, abs=5e-4)
239+ assert e["ca_part"] == pytest.approx(0.462, abs=5e-4) and e["ca_taux_prop"] == pytest.approx(0.395, abs=5e-4)
240+
241+ def test_ex2(self, ex):
242+ e = ex["ex2"]
243+ assert e["sherbrooke"] == pytest.approx(4.35, abs=5e-3) and e["trois_rivieres"] == pytest.approx(3.60, abs=5e-3)
244+ assert e["sherbrooke_plus30"] == pytest.approx(5.65, abs=5e-3) and e["sherbrooke_plus30"] == pytest.approx(1.3 * e["sherbrooke"], rel=1e-12)
245+
246+ def test_ex3(self, ex):
247+ e = ex["ex3"]
248+ assert e["loyer_2025"] == pytest.approx(1105.71, abs=0.005) and e["var_brute"] == pytest.approx(0.1057, abs=5e-5)
249+ assert e["var_meme"] == 0.06 and e["univers_2025"] == 21000
250+
251+ def test_ex4(self, ex):
252+ a, b = ex["ex4_620000"], ex["ex4_560000"]
253+ assert a["base"] == 620000 and a["droit"] == pytest.approx(9210.5, abs=1e-9) and a["taux_eff_prix"] == pytest.approx(0.01486, abs=5e-5)
254+ assert b["base"] == pytest.approx(601800, abs=1e-9) and b["droit"] == pytest.approx(8664.5, abs=1e-9)
255+ assert b["taux_eff_prix"] == pytest.approx(0.01547, abs=5e-5) and b["taux_eff_base"] == pytest.approx(0.01440, abs=5e-5)
256+
257+ def test_ex5(self, ex):
258+ e = ex["ex5"]
259+ assert e["tcac"] == pytest.approx(0.0146, abs=5e-5) and e["pop_2035"] == pytest.approx(1044650, abs=1)
260+ assert e["tcac_isq"] == pytest.approx(0.00573, abs=5e-6) and e["pop_2051_isq"] == pytest.approx(1048184, abs=1) and e["pop_2051_tendance"] == pytest.approx(1317519, abs=1)
261+
262+ def test_ex6(self, ex):
263+ e = ex["ex6"]
264+ assert e["prix_412"] == pytest.approx(540666, abs=0.5) and e["prix_619"] == pytest.approx(458582, abs=0.5)
265+ assert e["capital_412"] == pytest.approx(2400 / 2130.18 * 400000, rel=1e-4)
266+ assert e["elast_3"] == pytest.approx(-0.325, abs=5e-3) and e["elast_6"] == pytest.approx(-0.557, abs=5e-3)
267+ assert e["semi_3_par_point"] == pytest.approx(-0.1084, abs=5e-4) and e["semi_6_par_point"] == pytest.approx(-0.0929, abs=5e-4)
268+ # élasticité = taux × semi-élasticité (par unité de taux)
269+ assert e["elast_3"] == pytest.approx(0.03 * e["semi_3_par_point"] * 100, rel=2e-3)
270+ assert e["elast_6"] == pytest.approx(0.06 * e["semi_6_par_point"] * 100, rel=2e-3)
271+ assert abs(e["semi_3_par_point"]) > abs(e["semi_6_par_point"]) and abs(e["elast_3"]) < abs(e["elast_6"])
272+ assert e["pente_3_35_par_point"] == pytest.approx(-0.107, abs=5e-4) and e["pente_619_7_par_point"] == pytest.approx(-0.090, abs=5e-4)
added analysis/python/tests/test_ch05.py +247 −0
@@ -0,0 +1,247 @@
1+"""Tests du chapitre 5 — modèle monocentrique simulé, gradient prix/distance du cas 1, décomposition du cas 4,
2+rente résiduelle, capitalisation fiscale et exercices.
3+Tolérances : identités à 1e-9 ; valeurs citées dans le texte à l'arrondi affiché (0,5 $ sur les montants au dollar,
4+0,005 point sur les pourcentages à deux décimales, 0,0005 sur les coefficients en log à trois décimales)."""
5+import sys, pathlib, math
6+import numpy as np, pytest
7+sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1] / "cases"))
8+import ch05_rente as c5
9+from traite import cas1, cas4
10+from traite import hedonique as h
11+
12+P = c5.PARAMS
13+
14+
15+@pytest.fixture(scope="module")
16+def data():
17+ d1 = cas1.charger(); v = d1["ventes"]; m = cas1.hedonique(v)
18+ d4 = cas4.charger()
19+ return {"v": v, "sujet": d1["sujet"], "modele": m, "tranches": c5.tranches_distance(v), "gradients": c5.gradients_cas1(v, m),
20+ "pf": d4["portefeuille"], "dec": c5.decomposition_rmr(d4["portefeuille"])}
21+
22+
23+class TestMonocentrique:
24+ def test_gradient_et_frontiere(self):
25+ g = c5.gradient_exponentiel(P)
26+ assert g == pytest.approx(0.029167, abs=5e-6) and c5.demi_distance(g) == pytest.approx(23.8, abs=0.05)
27+ dbar = c5.frontiere_urbaine(P)
28+ assert dbar == pytest.approx(32.29, abs=0.005)
29+ # identité : r(d_bar) = ra
30+ assert c5.rente_fonciere(dbar, P) == pytest.approx(P["ra"], rel=1e-9)
31+ assert c5.prix_logement(dbar, P) == pytest.approx(85.97, abs=0.005)
32+
33+ def test_condition_de_muth_numerique(self):
34+ # p'(d) q(d) = -t, vérifié par différences finies
35+ for d in (0.0, 5.0, 12.0, 25.0):
36+ eps = 1e-5
37+ dp = (c5.prix_logement(d + eps, P) - c5.prix_logement(d - eps, P)) / (2 * eps)
38+ assert dp * c5.consommation_logement(d, P) == pytest.approx(-P["t"], rel=1e-6)
39+
40+ def test_valeurs_tableau(self):
41+ tab = c5.gradient_exact_vs_exponentiel(P).set_index("d_km")
42+ assert tab.loc[10.0, "p_exact"] == pytest.approx(191.61, abs=0.005) and tab.loc[10.0, "p_exponentiel"] == pytest.approx(194.23, abs=0.005)
43+ assert tab.loc[10.0, "ecart_pct"] == pytest.approx(0.014, abs=5e-4)
44+ assert tab.loc[25.0, "p_exact"] == pytest.approx(114.18, abs=0.005) and tab.loc[25.0, "p_exponentiel"] == pytest.approx(125.40, abs=0.005)
45+ assert tab.loc[25.0, "ecart_pct"] == pytest.approx(0.098, abs=5e-4)
46+ assert tab.loc[0.0, "q_m2"] == pytest.approx(92.3, abs=0.05) and tab.loc[10.0, "q_m2"] == pytest.approx(114.3, abs=0.05)
47+ assert c5.consommation_logement(c5.frontiere_urbaine(P), P) == pytest.approx(200.3, abs=0.05)
48+ assert tab.loc[10.0, "rente_fonciere"] == pytest.approx(28.92, abs=0.005) and tab.loc[10.0, "densite_relative"] == pytest.approx(0.396, abs=5e-4)
49+ assert c5.valeur_terrain(P["r0"], P["i"]) == 1600 and c5.valeur_terrain(P["ra"], P["i"]) == 40
50+ assert c5.elasticite_rente_prix(P["alpha"]) == pytest.approx(3.333, abs=5e-4)
51+
52+ def test_identites_production(self):
53+ d = np.array([3.0, 8.0, 20.0])
54+ ratio_p = c5.prix_logement(d, P) / P["p0"]
55+ assert np.allclose(c5.rente_fonciere(d, P) / P["r0"], ratio_p ** (1 / P["alpha"]))
56+ # densité = (p/p0)^(1/alpha) * y/(y - t d)
57+ assert np.allclose(c5.densite(d, P), ratio_p ** (1 / P["alpha"]) * P["y"] / (P["y"] - P["t"] * d))
58+ # l'approximation exponentielle surestime le prix pour d > 0
59+ assert np.all(c5.prix_exponentiel(d, P) > c5.prix_logement(d, P))
60+
61+ def test_alonso(self):
62+ (R1, t1), (R2, t2), (R3, t3) = c5.ALONSO.values()
63+ assert c5.frontiere_usages(R1, t1, R2, t2) == pytest.approx(9.47, abs=0.005)
64+ assert c5.frontiere_usages(R2, t2, R3, t3) == pytest.approx(14.29, abs=0.005)
65+ assert (R3 - P["ra"]) / t3 == pytest.approx(32.22, abs=0.005)
66+ d = np.array([5.0, 12.0, 20.0, 35.0]); env, courbes = c5.enveloppe_alonso(d)
67+ assert np.all(env >= np.array([max(c[i] for c in courbes.values()) for i in range(len(d))])) and env[-1] == P["ra"]
68+
69+
70+class TestCas1:
71+ def test_tranches(self, data):
72+ tr = data["tranches"]
73+ assert int(tr["n"].sum()) == 600 and list(tr["n"]) == [116, 67, 37, 97, 100, 64, 30, 89]
74+ assert tr.loc["0-2", "prix_m2_median"] == pytest.approx(3600, abs=0.5) and tr.loc["20 et plus", "prix_m2_median"] == pytest.approx(2684, abs=0.5)
75+ assert tr.loc["10-12", "prix_m2_median"] == pytest.approx(3714, abs=0.5) and tr.loc["10-12", "prix_median"] == 548000
76+ assert tr.loc["20 et plus", "terrain_median"] == 1184 and tr.loc["0-2", "terrain_median"] == pytest.approx(535.5, abs=0.01)
77+ assert tr.loc["10-12", "secteur_dominant"] == "Aylmer" and tr.loc["20 et plus", "secteur_dominant"] == "Masson-Angers"
78+
79+ def test_gradients(self, data):
80+ g = data["gradients"]
81+ assert g["brut_prix_m2"]["gamma"] == pytest.approx(0.01020, abs=5e-6) and g["brut_prix_m2"]["se"] == pytest.approx(0.00089, abs=5e-6)
82+ assert g["brut_prix_m2"]["r2"] == pytest.approx(0.185, abs=5e-4) and c5.demi_distance(g["brut_prix_m2"]["gamma"]) == pytest.approx(68, abs=0.5)
83+ assert g["controle_lineaire"]["gamma"] == pytest.approx(0.01083, abs=5e-6) and g["controle_lineaire"]["se"] == pytest.approx(0.00067, abs=5e-6)
84+ assert g["controle_lineaire"]["r2"] == pytest.approx(0.759, abs=5e-4)
85+ u = g["controle_urbain_16km"]
86+ assert u["n"] == 511 and u["gamma"] == pytest.approx(-0.00266, abs=5e-6) and u["se"] == pytest.approx(0.00103, abs=5e-6) and u["r2"] == pytest.approx(0.771, abs=5e-4)
87+ q = g["controle_quadratique"]
88+ assert q["b1"] == pytest.approx(0.00900, abs=5e-6) and q["se1"] == pytest.approx(0.00169, abs=5e-6)
89+ assert q["b2_100"] == pytest.approx(-0.06966, abs=5e-5) and q["se2"] == pytest.approx(0.0056, abs=5e-5) and q["r2"] == pytest.approx(0.808, abs=5e-4)
90+ sommet = -q["b1"] / (2 * q["b2_100"] / 100)
91+ assert sommet == pytest.approx(6.5, abs=0.05)
92+ assert q["gamma_10"] == pytest.approx(0.00493, abs=5e-6)
93+ pente20 = -(q["b1"] + 2 * q["b2_100"] * 20 / 100)
94+ assert pente20 == pytest.approx(0.0189, abs=5e-5)
95+
96+ def test_modele_reference(self, data):
97+ r = data["gradients"]["reference"]
98+ assert r["gamma_au_dela_3km"] == pytest.approx(0.00357, abs=5e-6) and r["se"] == pytest.approx(0.00265, abs=5e-6) and r["t"] == pytest.approx(-1.35, abs=0.005)
99+ assert r["r2"] == pytest.approx(0.853, abs=5e-4)
100+ pct = r["secteurs_pct"]
101+ assert pct["Gatineau"] == pytest.approx(-0.022, abs=5e-4) and pct["Aylmer"] == pytest.approx(0.089, abs=5e-4)
102+ assert pct["Buckingham"] == pytest.approx(-0.221, abs=5e-4) and pct["Masson-Angers"] == pytest.approx(-0.231, abs=5e-4)
103+ gs = data["gradients"]["secteurs_medianes"]
104+ assert gs.loc["Hull", "dist"] == pytest.approx(1.6, abs=0.05) and gs.loc["Buckingham", "dist"] == pytest.approx(29.2, abs=0.05)
105+ p_hg = (math.log(gs.loc["Gatineau", "prix"]) - math.log(gs.loc["Hull", "prix"])) / (gs.loc["Gatineau", "dist"] - gs.loc["Hull", "dist"])
106+ p_hb = (math.log(gs.loc["Buckingham", "prix"]) - math.log(gs.loc["Hull", "prix"])) / (gs.loc["Buckingham", "dist"] - gs.loc["Hull", "dist"])
107+ assert p_hg == pytest.approx(-0.00345, abs=5e-6) and p_hb == pytest.approx(-0.00973, abs=5e-6)
108+ # effet distance nul pour le sujet (2,1 km < 3 km)
109+ assert max(data["sujet"]["dist_centre_km"] - 3, 0) == 0
110+ g = data["gradients"]["controle_lineaire"]["gamma"]
111+ assert 551029 * g == pytest.approx(5969, abs=0.5) and 551029 * (1 - math.exp(-5 * g)) == pytest.approx(29050, abs=0.5)
112+
113+
114+class TestCas4:
115+ def test_decomposition(self, data):
116+ dec = data["dec"]
117+ attendu = {"Montréal": (206237, 9270, 0.0449), "Gatineau": (184173, 10011, 0.0544), "Sherbrooke": (137364, 7884, 0.0574),
118+ "Québec": (125455, 7237, 0.0577), "Trois-Rivières": (116806, 7345, 0.0629), "Saguenay": (101969, 6520, 0.0639)}
119+ for k, (vl, rl, tx) in attendu.items():
120+ assert dec.loc[k, "valeur_par_logement"] == pytest.approx(vl, abs=0.5) and dec.loc[k, "rne_par_logement"] == pytest.approx(rl, abs=0.5)
121+ assert dec.loc[k, "taux_pondere"] == pytest.approx(tx, abs=5e-5)
122+ # identité : écart total = contribution RNE + contribution taux
123+ assert np.allclose(dec["ecart_ln_V_n"], dec["contrib_rne"] + dec["contrib_taux"], atol=1e-12)
124+ assert dec.loc["Québec", "contrib_rne"] == pytest.approx(-0.248, abs=5e-4) and dec.loc["Québec", "contrib_taux"] == pytest.approx(-0.249, abs=5e-4)
125+ assert dec.loc["Gatineau", "contrib_rne"] == pytest.approx(0.077, abs=5e-4) and dec.loc["Gatineau", "contrib_taux"] == pytest.approx(-0.190, abs=5e-4)
126+ assert dec.loc["Saguenay", "ecart_ln_V_n"] == pytest.approx(-0.704, abs=5e-4) and dec.loc["Saguenay", "ratio_valeur"] == pytest.approx(0.494, abs=5e-4)
127+ for k in ("Sherbrooke", "Trois-Rivières"):
128+ part_taux = dec.loc[k, "contrib_taux"] / dec.loc[k, "ecart_ln_V_n"]
129+ assert 0.55 < part_taux < 0.65
130+ assert list(dec.index) == ["Montréal", "Gatineau", "Sherbrooke", "Québec", "Trois-Rivières", "Saguenay"]
131+ assert int(dec["logements"].sum()) == 888 and int(dec["n"].sum()) == 48
132+
133+
134+class TestResidu:
135+ def test_valeur_residuelle(self):
136+ CN = 397567.33; dep = 0.30 * CN; V = 551029.0
137+ assert dep == pytest.approx(119270.20, abs=0.005) and CN - dep == pytest.approx(278297.13, abs=0.005)
138+ VL = c5.valeur_residuelle(V, CN, dep)
139+ assert VL == pytest.approx(272732, abs=0.5) and VL / V == pytest.approx(0.495, abs=5e-4) and c5.levier_residuel(V, VL) == pytest.approx(2.02, abs=0.005)
140+ assert c5.valeur_residuelle(0.95 * V, CN, dep) == pytest.approx(245180, abs=0.5)
141+ assert c5.valeur_residuelle(0.95 * V, CN, dep) / VL - 1 == pytest.approx(-0.101, abs=5e-4)
142+ assert c5.valeur_residuelle(0.90 * V, CN, dep) / VL - 1 == pytest.approx(-0.202, abs=5e-4)
143+ # identité du levier : dVL/VL = (V/VL) dV/V
144+ assert (c5.valeur_residuelle(0.95 * V, CN, dep) - VL) / VL == pytest.approx(c5.levier_residuel(V, VL) * (-0.05), rel=1e-12)
145+ assert 1.1 ** c5.elasticite_rente_prix(0.3) - 1 == pytest.approx(0.374, abs=5e-4)
146+
147+ def test_capozza(self):
148+ cz = c5.decomposition_capozza(P["ra"], P["i"], 25.0, c5.rente_fonciere(10.0, P), 60.0)
149+ assert cz["valeur_agricole"] == 40 and cz["accessibilite"] == pytest.approx(538.4, abs=0.05) and cz["total"] == pytest.approx(663.4, abs=0.05)
150+ assert cz["accessibilite"] / cz["total"] == pytest.approx(0.81, abs=5e-3)
151+
152+
153+class TestTaxe:
154+ def test_formule_exacte_et_approchee(self):
155+ c = c5.capitalisation_taxe(500000, 0.0070, 0.0080, 0.05)
156+ assert c["dT"] == 500 and c["dV_approx"] == -10000 and c["dV_exact"] == pytest.approx(-8621, abs=0.5) and c["dV_pct_exact"] == pytest.approx(-0.0172, abs=5e-5)
157+ # identité : dV_exact = -dT/(i + tau1) et V1 = R/(i+tau1)
158+ assert c["dV_exact"] == pytest.approx(-500 / 0.058, rel=1e-12) and c["V1_exact"] == pytest.approx(c["R"] / 0.058, rel=1e-12)
159+ assert c["dV_approx"] / c["dV_exact"] == pytest.approx(0.058 / 0.05, rel=1e-12)
160+ assert 0.6 * c["dV_approx"] == -6000
161+ c2 = c5.capitalisation_taxe(500000, 0.0070, 0.0070 + 22.4 / 1e4, 0.05)
162+ assert c2["dT"] == pytest.approx(1120, abs=1e-6) and c2["dV_approx"] == pytest.approx(-22400, abs=1e-6)
163+ assert c2["dV_exact"] == pytest.approx(-18906, abs=0.5) and c2["dV_pct_exact"] == pytest.approx(-0.0378, abs=5e-5)
164+ assert c5.valeur_avec_taxe(28500, 0.05, 0.0075) / c5.valeur_avec_taxe(28500, 0.05, 0.0) - 1 == pytest.approx(-0.13, abs=5e-3)
165+
166+ def test_taux_2026(self):
167+ T = c5.TAUX_2026
168+ ecart = (T["Québec (1 à 5 logements)"] - T["Gatineau (taux de base)"]) / 100
169+ assert ecart * 1e4 == pytest.approx(22.4, abs=0.005) and ecart * 500000 == pytest.approx(1120, abs=0.005)
170+ assert c5.taux_effectif(T["Gatineau (taux de base)"], 1.02) == pytest.approx(0.5122, abs=5e-5)
171+ assert c5.taux_effectif(T["Québec (1 à 5 logements)"], 1.10) == pytest.approx(0.6785, abs=5e-5)
172+ assert 468000 * T["Gatineau (taux de base)"] / 100 == pytest.approx(2445, abs=0.5) and 468000 * T["Taxe scolaire 2026-2027 (toute la province)"] / 100 == pytest.approx(370, abs=0.5)
173+ d6 = (T["Québec (6 logements et plus)"] - T["Québec (1 à 5 logements)"]) / 100
174+ assert d6 * 1e4 == pytest.approx(2.33, abs=0.005) and d6 * 2e6 == pytest.approx(466, abs=0.5) and d6 * 2e6 / 0.055 == pytest.approx(8473, abs=0.5)
175+ tau = c5.taux_effectif(T["Gatineau (taux de base)"], 1.02) / 100 + T["Taxe scolaire 2026-2027 (toute la province)"] / 100
176+ assert tau / (0.0412 + tau + 0.015 - 0.02) == pytest.approx(0.14, abs=5e-3)
177+
178+ def test_grille(self):
179+ G = c5.grille_capitalisation(500000, [5, 10, 25, 50, 100], [0.04, 0.05, 0.06, 0.07])
180+ assert G.loc[10, "r=5%"] == -10000 and G.loc[50, "r=4%"] == -62500 and G.loc[100, "r=7%"] == pytest.approx(-71429, abs=0.5)
181+ assert G.loc[25, "r=6%"] == pytest.approx(-20833, abs=0.5) and G.loc[5, "r=7%"] == pytest.approx(-3571, abs=0.5)
182+ assert G.loc[10, "r=4%"] / G.loc[10, "r=7%"] - 1 == pytest.approx(0.75, rel=1e-9)
183+
184+
185+class TestExercices:
186+ def test_ex1(self):
187+ a, b = c5.THUNEN["Maraîchage"], c5.THUNEN["Grandes cultures"]
188+ assert a["Y"] * (a["p"] - a["c"]) == 1000 and a["Y"] * a["f"] == 60 and b["Y"] * (b["p"] - b["c"]) == 600 and b["Y"] * b["f"] == 20
189+ assert c5.distance_limite_thunen(**a) == pytest.approx(16.67, abs=0.005) and c5.distance_limite_thunen(**b) == 30
190+ assert c5.frontiere_usages(1000, 60, 600, 20) == 10 and c5.rente_thunen(10, **a) == 400 == c5.rente_thunen(10, **b)
191+ assert c5.valeur_terrain(1000, 0.04) == 25000
192+
193+ def test_ex2(self):
194+ c = c5.capitalisation_taxe(500000, 0.0070, 0.0080, 0.05)
195+ assert c["dT"] == 500 and c["dV_approx"] == -10000 and c["dV_exact"] == pytest.approx(-8621, abs=0.5) and c["V1_exact"] == pytest.approx(491379, abs=0.5)
196+ net = c5.capitalisation_taxe(500000, 0.0070, 0.0070 + 200 / 500000, 0.05)
197+ assert net["dV_approx"] == pytest.approx(-4000, abs=1e-6) and net["dV_exact"] == pytest.approx(-3484, abs=0.5)
198+
199+ def test_ex3(self):
200+ assert c5.prix_logement(5.0, P) == pytest.approx(223.98, abs=0.005) and c5.prix_logement(10.0, P) == pytest.approx(191.61, abs=0.005)
201+ assert c5.prix_exponentiel(5.0, P) == pytest.approx(224.72, abs=0.005) and c5.prix_exponentiel(10.0, P) == pytest.approx(194.22, abs=0.005)
202+ assert c5.consommation_logement(0.0, P) == pytest.approx(92.3, abs=0.05) and c5.consommation_logement(10.0, P) == pytest.approx(114.3, abs=0.05)
203+ P2 = dict(P, t=525.0)
204+ assert c5.gradient_exponentiel(P2) == pytest.approx(0.021875, abs=1e-9) and c5.demi_distance(c5.gradient_exponentiel(P2)) == pytest.approx(31.7, abs=0.05)
205+
206+ def test_ex4(self):
207+ assert 1.1 ** (1 / 0.3) - 1 == pytest.approx(0.374, abs=5e-4) and 0.9 ** (1 / 0.3) - 1 == pytest.approx(-0.296, abs=5e-4)
208+ CN = 397567.33; dep = 0.3 * CN
209+ VL = c5.valeur_residuelle(560000, CN, dep); VL2 = c5.valeur_residuelle(532000, CN, dep)
210+ assert VL == pytest.approx(281703, abs=0.5) and c5.levier_residuel(560000, VL) == pytest.approx(1.99, abs=0.005)
211+ assert VL2 == pytest.approx(253703, abs=0.5) and VL2 / VL - 1 == pytest.approx(-0.099, abs=5e-4)
212+
213+ def test_ex5(self):
214+ tq, tg, tm = c5.taux_effectif(0.7464, 1.10), c5.taux_effectif(0.5224, 1.02), 0.4631
215+ assert tq == pytest.approx(0.6785, abs=5e-5) and tg == pytest.approx(0.5122, abs=5e-5)
216+ assert 500000 * tq / 100 == pytest.approx(3393, abs=0.5) and 500000 * tg / 100 == pytest.approx(2561, abs=0.5) and 500000 * tm / 100 == pytest.approx(2316, abs=0.5)
217+ ecart = (tq - tg) / 100 * 500000
218+ assert ecart == pytest.approx(832, abs=0.5) and ecart / 0.05 == pytest.approx(16639, abs=0.5) and 0.6 * ecart / 0.05 == pytest.approx(9983, abs=0.5)
219+
220+ def test_ex6(self, data):
221+ v = data["v"]; y = np.log(v["prix_vente"].values); d = v["dist_centre_km"].values
222+ X = cas1.matrice(v); Xa = X.copy(); Xa["dist_lin"] = d
223+ r = h.mco(Xa.values, y); cols = list(Xa.columns)
224+ assert r["beta"][cols.index("dist_centre")] == pytest.approx(0.0029, abs=5e-5) and r["se_hc1"][cols.index("dist_centre")] == pytest.approx(0.0081, abs=5e-5)
225+ assert r["beta"][cols.index("dist_lin")] == pytest.approx(-0.0064, abs=5e-5) and r["se_hc1"][cols.index("dist_lin")] == pytest.approx(0.0076, abs=5e-5)
226+ assert r["beta"][cols.index("sect_Aylmer")] == pytest.approx(0.093, abs=5e-4) and r["r2"] == pytest.approx(0.853, abs=5e-4)
227+ Xc = X.drop(columns=["dist_centre"] + [f"sect_{s}" for s in cas1.SECTEURS[1:]]); Xc["dist"] = d
228+ m = (d <= 10) & v["secteur"].isin(["Hull", "Gatineau"]).values
229+ rr = h.mco(Xc.values[m], y[m])
230+ assert int(m.sum()) == 380 and rr["beta"][-1] == pytest.approx(-0.00589, abs=5e-6) and rr["se_hc1"][-1] == pytest.approx(0.00144, abs=5e-6) and rr["r2"] == pytest.approx(0.80, abs=5e-3)
231+ m2 = (v["secteur"] == "Aylmer").values; ra = h.mco(Xc.values[m2], y[m2])
232+ assert int(m2.sum()) == 125 and ra["beta"][-1] == pytest.approx(-0.00675, abs=5e-6) and ra["se_hc1"][-1] == pytest.approx(0.00458, abs=5e-6)
233+ m3 = (v["secteur"] == "Hull").values; rh = h.mco(Xc.values[m3], y[m3])
234+ assert int(m3.sum()) == 186 and rh["beta"][-1] == pytest.approx(-0.00746, abs=5e-6) and rh["se_hc1"][-1] == pytest.approx(0.00646, abs=5e-6)
235+
236+ def test_ex7(self):
237+ E = [(0, 0, 100000), (12, 4, 30000)]; pts = {"A": (3, 0), "B": (9, 3), "C": (12, -6)}
238+ dist = {k: [math.hypot(x - cx, y - cy) for cx, cy, _ in E] for k, (x, y) in pts.items()}
239+ assert dist["A"] == pytest.approx([3.00, 9.85], abs=0.005) and dist["B"] == pytest.approx([9.49, 3.16], abs=0.005) and dist["C"] == pytest.approx([13.42, 10.00], abs=0.005)
240+ for lam, att, ab, bc in [(0.10, (85286, 60592, 37178), 0.089, 0.130), (0.20, (59066, 30935, 10894), 0.175, 0.298)]:
241+ A = {k: sum(e * math.exp(-lam * dd) for (_, _, e), dd in zip(E, dist[k])) for k in pts}
242+ assert (A["A"], A["B"], A["C"]) == pytest.approx(att, abs=0.5)
243+ assert (A["A"] / A["B"]) ** 0.25 - 1 == pytest.approx(ab, abs=5e-4) and (A["B"] / A["C"]) ** 0.25 - 1 == pytest.approx(bc, abs=5e-4)
244+ # un seul centre : theta ln A = theta ln E - theta lambda d
245+ lam, theta = 0.1, 0.25
246+ for dd in (2.0, 7.0):
247+ assert theta * math.log(100000 * math.exp(-lam * dd)) == pytest.approx(theta * math.log(100000) - theta * lam * dd, rel=1e-12)
modified analysis/python/tests/test_ch06.py +12 −8
@@ -66,12 +66,13 @@ class TestUsufruit:
66 66
67 def test_approximation_terme_fixe_sous_estime_np(self): 67 def test_approximation_terme_fixe_sous_estime_np(self):
68 u = cas.usufruit_viager(V, 65) 68 u = cas.usufruit_viager(V, 65)
69− t = cas.usufruit_terme(V, 18) # espérance de vie arrondie (17,9 → 18) 69+ a = cas.approximation_terme_espere(V, 65)
70− assert t["part_NP"] * 100 == pytest.approx(54.3, abs=0.05) 70+ assert a["n_eff"] == pytest.approx(18.36, abs=0.005) and a["n_eff"] == pytest.approx(u["esperance_vie"] + 0.5, abs=1e-9)
71− assert u["NP"] - t["NP"] == pytest.approx(11000, abs=600) # « environ 11 000 $ » 71+ assert a["part_NP"] * 100 == pytest.approx(53.7, abs=0.05)
72− for x in (55, 65, 75, 85): # Jensen : NP viager ≥ NP terme fixe e_x 72+ assert u["NP"] - a["NP"] == pytest.approx(15271, abs=TOL)
73− n = int(round(cas.esperance_vie(x))) 73+ for x in range(50, 100, 5): # Jensen : NP viager ≥ NP du terme espéré
74− assert cas.usufruit_viager(V, x)["NP"] >= cas.usufruit_terme(V, n)["NP"] 74+ for r in (0.03, 0.05, 0.08):
75+ assert cas.usufruit_viager(V, x, r)["NP"] >= cas.approximation_terme_espere(V, x, r)["NP"]
75 76
76 def test_grille_sensibilite(self): 77 def test_grille_sensibilite(self):
77 g = cas.grille_usufruit(V) 78 g = cas.grille_usufruit(V)
@@ -180,9 +181,12 @@ class TestExercices:
180 u = cas.usufruit_viager(Vx, x, r, g) 181 u = cas.usufruit_viager(Vx, x, r, g)
181 assert u["U"] == pytest.approx(158934, abs=TOL) and u["NP"] == pytest.approx(296066, abs=TOL) 182 assert u["U"] == pytest.approx(158934, abs=TOL) and u["NP"] == pytest.approx(296066, abs=TOL)
182 assert u["part_NP"] * 100 == pytest.approx(65.1, abs=0.05) and u["esperance_vie"] == pytest.approx(13.0, abs=0.05) 183 assert u["part_NP"] * 100 == pytest.approx(65.1, abs=0.05) and u["esperance_vie"] == pytest.approx(13.0, abs=0.05)
184+ a = cas.approximation_terme_espere(Vx, x, r, g)
185+ assert a["n_eff"] == pytest.approx(13.49, abs=0.005)
186+ assert a["U"] == pytest.approx(167650, abs=TOL) and a["NP"] == pytest.approx(287350, abs=TOL)
187+ assert a["part_NP"] * 100 == pytest.approx(63.2, abs=0.05) and u["NP"] - a["NP"] == pytest.approx(8716, abs=TOL)
183 t = cas.usufruit_terme(Vx, 13, r, g) 188 t = cas.usufruit_terme(Vx, 13, r, g)
184− assert t["U"] == pytest.approx(162802, abs=TOL) and t["NP"] == pytest.approx(292198, abs=TOL) 189+ assert t["NP"] == pytest.approx(292198, abs=TOL)
185− assert u["NP"] - t["NP"] == pytest.approx(3868, abs=TOL)
186 assert cas.rente_viagere_equivalente(Vx, x, r, g) == pytest.approx(17038, abs=TOL) 190 assert cas.rente_viagere_equivalente(Vx, x, r, g) == pytest.approx(17038, abs=TOL)
187 t30 = cas.usufruit_terme(Vx, 30, r, g) 191 t30 = cas.usufruit_terme(Vx, 30, r, g)
188 assert t30["U"] == pytest.approx(291257, abs=TOL) and t30["NP"] == pytest.approx(163743, abs=TOL) 192 assert t30["U"] == pytest.approx(291257, abs=TOL) and t30["NP"] == pytest.approx(163743, abs=TOL)
modified assets/figures/ch11/ch11-fig-fiche-etat.pdf +0 −0

Binary file not shown.

modified assets/figures/ch11/ch11-fig-frise-pathologies.pdf +0 −0

Binary file not shown.

modified assets/figures/ch11/ch11-fig-matrice-age-effectif.pdf +0 −0

Binary file not shown.

modified assets/figures/ch11/ch11-fig-sensibilite-age-effectif.pdf +0 −0

Binary file not shown.

modified manuscript/appendices/formulaires-inspection.tex +67 −65
@@ -4,6 +4,8 @@ L'inspection est le moment où l'évaluateur cesse de raisonner sur des document
4 4
5 \providecommand{\caseA}{$\square$} 5 \providecommand{\caseA}{$\square$}
6 \providecommand{\cinq}{$\square\,\square\,\square\,\square\,\square$} 6 \providecommand{\cinq}{$\square\,\square\,\square\,\square\,\square$}
7+\providecommand{\wide}[1]{\multicolumn{4}{L{9.4cm}@{}}{#1}}
8+\providecommand{\widex}[1]{\multicolumn{4}{L{10.2cm}@{}}{#1}}
7 \providecommand{\inc}{$\square$\,{\footnotesize$+$}\ $\square$\,{\footnotesize$-$}\ $\square$\,{\footnotesize$0$}} 9 \providecommand{\inc}{$\square$\,{\footnotesize$+$}\ $\square$\,{\footnotesize$-$}\ $\square$\,{\footnotesize$0$}}
8 10
9 \section{Objet et limites de l'inspection d'évaluation}\label{sec:appB:objet} 11 \section{Objet et limites de l'inspection d'évaluation}\label{sec:appB:objet}
@@ -69,7 +71,7 @@ ce qui montre que l'âge effectif pondéré est une statistique suffisante de la
69 Le premier formulaire couvre la maison isolée, jumelée ou en rangée, avec ou sans garage, et la partie privative d'une copropriété divise horizontale lorsque le mandat porte sur une fraction. Il se lit de haut en bas dans l'ordre de la visite. Les rubriques en italique dans la colonne des observations indiquent les constats à rechercher ; les pathologies de la \cref{sec:appB:patho} y sont rappelées par leur nom lorsque la composante est le lieu habituel de leur manifestation. 71 Le premier formulaire couvre la maison isolée, jumelée ou en rangée, avec ou sans garage, et la partie privative d'une copropriété divise horizontale lorsque le mandat porte sur une fraction. Il se lit de haut en bas dans l'ordre de la visite. Les rubriques en italique dans la colonne des observations indiquent les constats à rechercher ; les pathologies de la \cref{sec:appB:patho} y sont rappelées par leur nom lorsque la composante est le lieu habituel de leur manifestation.
70 72
71 {\small\setlength{\tabcolsep}{4pt}\renewcommand{\arraystretch}{1.45} 73 {\small\setlength{\tabcolsep}{4pt}\renewcommand{\arraystretch}{1.45}
72−\begin{longtable}{@{}L{3.1cm}c>{\centering\arraybackslash}p{1.1cm}L{4.1cm}c@{}} 74+\begin{longtable}{@{}L{3.1cm}>{\centering\arraybackslash}p{1.6cm}>{\centering\arraybackslash}p{1.1cm}L{4.1cm}>{\centering\arraybackslash}p{1.8cm}@{}}
73 \caption{Formulaire 1 — Inspection d'évaluation d'une maison unifamiliale}\label{tab:appB:f1}\\ 75 \caption{Formulaire 1 — Inspection d'évaluation d'une maison unifamiliale}\label{tab:appB:f1}\\
74 \toprule 76 \toprule
75 Élément & {État 1--5} & {Âge app.} & Observations (n\textsuperscript{o} photo) & Incidence \\ 77 Élément & {État 1--5} & {Âge app.} & Observations (n\textsuperscript{o} photo) & Incidence \\
@@ -85,10 +87,10 @@ Le premier formulaire couvre la maison isolée, jumelée ou en rangée, avec ou
85 \bottomrule 87 \bottomrule
86 \endlastfoot 88 \endlastfoot
87 \multicolumn{5}{@{}l}{\textbf{A. Identification et conditions de la visite}}\\ 89 \multicolumn{5}{@{}l}{\textbf{A. Identification et conditions de la visite}}\\
88−Adresse, lot, date et heure & \multicolumn{4}{l@{}}{\rule{0pt}{10pt}} \\ 90+Adresse, lot, date et heure & \wide{\rule{0pt}{10pt}} \\
89−Personnes présentes, météo, température & \multicolumn{4}{l@{}}{} \\ 91+Personnes présentes, météo, température & \wide{} \\
90−Parties non visitées et motif & \multicolumn{4}{l@{}}{} \\ 92+Parties non visitées et motif & \wide{} \\
91−Documents consultés avant la visite & \multicolumn{4}{l@{}}{\caseA~rôle \caseA~certificat de localisation \caseA~permis \caseA~zonage \caseA~zones inondables \caseA~DV} \\ 93+Documents consultés avant la visite & \wide{\caseA~rôle \caseA~certificat de localisation \caseA~permis \caseA~zonage \caseA~zones inondables \caseA~DV} \\
92 \midrule 94 \midrule
93 \multicolumn{5}{@{}l}{\textbf{B. Site et terrain}}\\ 95 \multicolumn{5}{@{}l}{\textbf{B. Site et terrain}}\\
94 Topographie, drainage de surface & \cinq & & \emph{pente vers la maison, eau stagnante, affaissements} & \inc \\ 96 Topographie, drainage de surface & \cinq & & \emph{pente vers la maison, eau stagnante, affaissements} & \inc \\
@@ -100,7 +102,7 @@ Nuisances et servitudes visibles & \cinq & & \emph{bruit, lignes électriques, v
100 Zone inondable ou de mobilité & \caseA~non \caseA~oui & & \emph{classe d'intensité selon la carte en vigueur ; marques de crue} & \inc \\ 102 Zone inondable ou de mobilité & \caseA~non \caseA~oui & & \emph{classe d'intensité selon la carte en vigueur ; marques de crue} & \inc \\
101 \midrule 103 \midrule
102 \multicolumn{5}{@{}l}{\textbf{C. Fondations et structure}}\\ 104 \multicolumn{5}{@{}l}{\textbf{C. Fondations et structure}}\\
103−Type et matériau des fondations & \multicolumn{4}{l@{}}{\caseA~béton coulé \caseA~blocs \caseA~pierre \caseA~pieux \caseA~dalle sur sol \caseA~vide sanitaire} \\ 105+Type et matériau des fondations & \wide{\caseA~béton coulé \caseA~blocs \caseA~pierre \caseA~pieux \caseA~dalle sur sol \caseA~vide sanitaire} \\
104 Murs de fondation (ext. et int.) & \cinq & & \emph{fissures (largeur, orientation, actives), efflorescence, déversement} & \inc \\ 106 Murs de fondation (ext. et int.) & \cinq & & \emph{fissures (largeur, orientation, actives), efflorescence, déversement} & \inc \\
105 Dalle du sous-sol et du garage & \cinq & & \emph{soulèvement, fissures en étoile, poudre blanche : \textbf{pyrite} ; dalle du garage d'abord} & \inc \\ 107 Dalle du sous-sol et du garage & \cinq & & \emph{soulèvement, fissures en étoile, poudre blanche : \textbf{pyrite} ; dalle du garage d'abord} & \inc \\
106 Drainage des fondations, puisard & \cinq & & \emph{pompe, clapet, cheminées de nettoyage ; dépôt gélatineux rouille : \textbf{ocre ferreuse}} & \inc \\ 108 Drainage des fondations, puisard & \cinq & & \emph{pompe, clapet, cheminées de nettoyage ; dépôt gélatineux rouille : \textbf{ocre ferreuse}} & \inc \\
@@ -109,27 +111,27 @@ Charpente visible, solives, poutres, colonnes & \cinq & & \emph{flèche, entaill
109 Éclatement du béton des fondations & \cinq & & \emph{fissures en carte, gonflement du béton lui-même : \textbf{pyrrhotite} (régions touchées)} & \inc \\ 111 Éclatement du béton des fondations & \cinq & & \emph{fissures en carte, gonflement du béton lui-même : \textbf{pyrrhotite} (régions touchées)} & \inc \\
110 \midrule 112 \midrule
111 \multicolumn{5}{@{}l}{\textbf{D. Enveloppe extérieure}}\\ 113 \multicolumn{5}{@{}l}{\textbf{D. Enveloppe extérieure}}\\
112−Revêtement principal & \multicolumn{4}{l@{}}{\caseA~brique \caseA~pierre \caseA~vinyle \caseA~aluminium \caseA~fibrociment \caseA~bois \caseA~acrylique/stuc \caseA~autre} \\ 114+Revêtement principal & \wide{\caseA~brique \caseA~pierre \caseA~vinyle \caseA~aluminium \caseA~fibrociment \caseA~bois \caseA~acrylique/stuc \caseA~autre} \\
113 État du revêtement & \cinq & & \emph{joints de mortier, briques éclatées, linteaux rouillés, chantepleures, fixations} & \inc \\ 115 État du revêtement & \cinq & & \emph{joints de mortier, briques éclatées, linteaux rouillés, chantepleures, fixations} & \inc \\
114 Solins, scellants, jonctions & \cinq & & \emph{autour des ouvertures, au toit, aux balcons} & \inc \\ 116 Solins, scellants, jonctions & \cinq & & \emph{autour des ouvertures, au toit, aux balcons} & \inc \\
115 Soffites, fascias, corniches & \cinq & & \emph{ventilation de l'entretoit, pourriture, nids} & \inc \\ 117 Soffites, fascias, corniches & \cinq & & \emph{ventilation de l'entretoit, pourriture, nids} & \inc \\
116 Balcons, galeries, escaliers extérieurs & \cinq & & \emph{garde-corps, ancrages, bois en contact avec le sol} & \inc \\ 118 Balcons, galeries, escaliers extérieurs & \cinq & & \emph{garde-corps, ancrages, bois en contact avec le sol} & \inc \\
117 Portes extérieures et de garage & \cinq & & \emph{étanchéité, quincaillerie, ouvre-porte} & \inc \\ 119 Portes extérieures et de garage & \cinq & & \emph{étanchéité, quincaillerie, ouvre-porte} & \inc \\
118−Isolation des murs (si visible ou déclarée) & \multicolumn{4}{l@{}}{\caseA~inconnue \caseA~laine \caseA~cellulose \caseA~mousse \caseA~\textbf{vermiculite} \caseA~\textbf{MIUF} déclarée} \\ 120+Isolation des murs (si visible ou déclarée) & \wide{\caseA~inconnue \caseA~laine \caseA~cellulose \caseA~mousse \caseA~\textbf{vermiculite} \caseA~\textbf{MIUF} déclarée} \\
119 \midrule 121 \midrule
120 \multicolumn{5}{@{}l}{\textbf{E. Toiture}}\\ 122 \multicolumn{5}{@{}l}{\textbf{E. Toiture}}\\
121−Type et matériau & \multicolumn{4}{l@{}}{\caseA~bardeau d'asphalte \caseA~membrane élastomère \caseA~gravier \caseA~tôle \caseA~autre ; pente \caseA~forte \caseA~faible \caseA~plate} \\ 123+Type et matériau & \wide{\caseA~bardeau d'asphalte \caseA~membrane élastomère \caseA~gravier \caseA~tôle \caseA~autre ; pente \caseA~forte \caseA~faible \caseA~plate} \\
122 État du couvrement & \cinq & & \emph{granules perdus, bardeaux relevés, cloques, joints ouverts, mousse} & \inc \\ 124 État du couvrement & \cinq & & \emph{granules perdus, bardeaux relevés, cloques, joints ouverts, mousse} & \inc \\
123 Solins, cheminées, évents, drains & \cinq & & \emph{rouille, scellant fissuré, drain obstrué} & \inc \\ 125 Solins, cheminées, évents, drains & \cinq & & \emph{rouille, scellant fissuré, drain obstrué} & \inc \\
124 Gouttières et descentes & \cinq & & \emph{présence, pente, rejet à distance des fondations} & \inc \\ 126 Gouttières et descentes & \cinq & & \emph{présence, pente, rejet à distance des fondations} & \inc \\
125 Entretoit (si accessible) & \cinq & & \emph{isolant (type, épaisseur), ventilation, taches, givre, \textbf{vermiculite}} & \inc \\ 127 Entretoit (si accessible) & \cinq & & \emph{isolant (type, épaisseur), ventilation, taches, givre, \textbf{vermiculite}} & \inc \\
126−Année de réfection déclarée & \multicolumn{4}{l@{}}{\rule{0pt}{10pt}} \\ 128+Année de réfection déclarée & \wide{\rule{0pt}{10pt}} \\
127 \midrule 129 \midrule
128 \multicolumn{5}{@{}l}{\textbf{F. Fenestration}}\\ 130 \multicolumn{5}{@{}l}{\textbf{F. Fenestration}}\\
129−Type et matériau & \multicolumn{4}{l@{}}{\caseA~bois \caseA~PVC \caseA~aluminium \caseA~hybride ; vitrage \caseA~simple \caseA~double \caseA~triple} \\ 131+Type et matériau & \wide{\caseA~bois \caseA~PVC \caseA~aluminium \caseA~hybride ; vitrage \caseA~simple \caseA~double \caseA~triple} \\
130 État des fenêtres & \cinq & & \emph{condensation entre les verres, mécanismes, pourriture, calfeutrage} & \inc \\ 132 État des fenêtres & \cinq & & \emph{condensation entre les verres, mécanismes, pourriture, calfeutrage} & \inc \\
131 Puits de lumière, portes-fenêtres & \cinq & & \emph{infiltration, scellants} & \inc \\ 133 Puits de lumière, portes-fenêtres & \cinq & & \emph{infiltration, scellants} & \inc \\
132−Année de remplacement déclarée & \multicolumn{4}{l@{}}{\rule{0pt}{10pt}} \\ 134+Année de remplacement déclarée & \wide{\rule{0pt}{10pt}} \\
133 \midrule 135 \midrule
134 \multicolumn{5}{@{}l}{\textbf{G. Intérieur}}\\ 136 \multicolumn{5}{@{}l}{\textbf{G. Intérieur}}\\
135 Planchers (par niveau) & \cinq & & \emph{matériau, niveau, grincement, dénivellation} & \inc \\ 137 Planchers (par niveau) & \cinq & & \emph{matériau, niveau, grincement, dénivellation} & \inc \\
@@ -139,22 +141,22 @@ Salles de bain (nombre, état) & \cinq & & \emph{étanchéité, ventilation, moi
139 Portes, boiseries, escaliers, rampes & \cinq & & \emph{conformité apparente des garde-corps} & \inc \\ 141 Portes, boiseries, escaliers, rampes & \cinq & & \emph{conformité apparente des garde-corps} & \inc \\
140 Sous-sol fini : qualité, hauteur libre & \cinq & & \emph{hauteur sous poutre, fenêtres, issue} & \inc \\ 142 Sous-sol fini : qualité, hauteur libre & \cinq & & \emph{hauteur sous poutre, fenêtres, issue} & \inc \\
141 Foyer, poêle, cheminée & \cinq & & \emph{type (bois, gaz, granules), certification visible, état du conduit} & \inc \\ 143 Foyer, poêle, cheminée & \cinq & & \emph{type (bois, gaz, granules), certification visible, état du conduit} & \inc \\
142−Odeurs, qualité de l'air, animaux & \multicolumn{4}{l@{}}{\rule{0pt}{10pt}} \\ 144+Odeurs, qualité de l'air, animaux & \wide{\rule{0pt}{10pt}} \\
143 \midrule 145 \midrule
144 \multicolumn{5}{@{}l}{\textbf{H. Électricité}}\\ 146 \multicolumn{5}{@{}l}{\textbf{H. Électricité}}\\
145−Entrée électrique et panneau & \multicolumn{4}{l@{}}{\caseA~60~A \caseA~100~A \caseA~200~A \caseA~autre ; \caseA~disjoncteurs \caseA~fusibles} \\ 147+Entrée électrique et panneau & \wide{\caseA~60~A \caseA~100~A \caseA~200~A \caseA~autre ; \caseA~disjoncteurs \caseA~fusibles} \\
146 État apparent du panneau et du câblage visible & \cinq & & \emph{fils \textbf{aluminium} (gaine marquée AL), gaines textiles, boîtes ouvertes, épissures} & \inc \\ 148 État apparent du panneau et du câblage visible & \cinq & & \emph{fils \textbf{aluminium} (gaine marquée AL), gaines textiles, boîtes ouvertes, épissures} & \inc \\
147 Prises, interrupteurs, DDFT, détecteurs & \cinq & & \emph{DDFT près de l'eau, détecteurs de fumée et de CO présents et datés} & \inc \\ 149 Prises, interrupteurs, DDFT, détecteurs & \cinq & & \emph{DDFT près de l'eau, détecteurs de fumée et de CO présents et datés} & \inc \\
148 \midrule 150 \midrule
149 \multicolumn{5}{@{}l}{\textbf{I. Plomberie}}\\ 151 \multicolumn{5}{@{}l}{\textbf{I. Plomberie}}\\
150−Entrée d'eau et distribution & \multicolumn{4}{l@{}}{\caseA~cuivre \caseA~PEX \caseA~\textbf{galvanisé} \caseA~plomb (entrée) \caseA~inconnu} \\ 152+Entrée d'eau et distribution & \wide{\caseA~cuivre \caseA~PEX \caseA~\textbf{galvanisé} \caseA~plomb (entrée) \caseA~inconnu} \\
151−Évacuation et ventilation & \multicolumn{4}{l@{}}{\caseA~ABS/PVC \caseA~fonte \caseA~\textbf{galvanisé} ; \emph{odeurs, écoulement lent}} \\ 153+Évacuation et ventilation & \wide{\caseA~ABS/PVC \caseA~fonte \caseA~\textbf{galvanisé} ; \emph{odeurs, écoulement lent}} \\
152 Chauffe-eau (type, année, capacité) & \cinq & & \emph{plaque signalétique, corrosion, bac, âge supérieur à 10~ans} & \inc \\ 154 Chauffe-eau (type, année, capacité) & \cinq & & \emph{plaque signalétique, corrosion, bac, âge supérieur à 10~ans} & \inc \\
153 Appareils et robinetterie & \cinq & & \emph{débit, fuites, pression} & \inc \\ 155 Appareils et robinetterie & \cinq & & \emph{débit, fuites, pression} & \inc \\
154 Clapet antiretour, pompe de puisard & \cinq & & \emph{présence, fonctionnement déclaré} & \inc \\ 156 Clapet antiretour, pompe de puisard & \cinq & & \emph{présence, fonctionnement déclaré} & \inc \\
155 \midrule 157 \midrule
156 \multicolumn{5}{@{}l}{\textbf{J. Chauffage, ventilation, climatisation}}\\ 158 \multicolumn{5}{@{}l}{\textbf{J. Chauffage, ventilation, climatisation}}\\
157−Système principal et énergie & \multicolumn{4}{l@{}}{\caseA~plinthes électriques \caseA~air pulsé \caseA~eau chaude \caseA~thermopompe \caseA~\textbf{mazout} \caseA~gaz \caseA~bois} \\ 159+Système principal et énergie & \wide{\caseA~plinthes électriques \caseA~air pulsé \caseA~eau chaude \caseA~thermopompe \caseA~\textbf{mazout} \caseA~gaz \caseA~bois} \\
158 État de l'appareil principal & \cinq & & \emph{plaque signalétique, année, entretien, bruit, odeur} & \inc \\ 160 État de l'appareil principal & \cinq & & \emph{plaque signalétique, année, entretien, bruit, odeur} & \inc \\
159 Réservoir de mazout (int./ext., année) & \cinq & & \emph{plaque, corrosion, âge ; déclaration de retrait d'un ancien réservoir} & \inc \\ 161 Réservoir de mazout (int./ext., année) & \cinq & & \emph{plaque, corrosion, âge ; déclaration de retrait d'un ancien réservoir} & \inc \\
160 Distribution (conduits, radiateurs) & \cinq & & \emph{isolation des conduits, équilibrage} & \inc \\ 162 Distribution (conduits, radiateurs) & \cinq & & \emph{isolation des conduits, équilibrage} & \inc \\
@@ -162,17 +164,17 @@ Ventilation (VRC, hottes, salles de bain) & \cinq & & \emph{présence, rejet à
162 Climatisation, thermopompe murale & \cinq & & \emph{année, état de l'unité extérieure} & \inc \\ 164 Climatisation, thermopompe murale & \cinq & & \emph{année, état de l'unité extérieure} & \inc \\
163 \midrule 165 \midrule
164 \multicolumn{5}{@{}l}{\textbf{K. Environnement intérieur et déclarations}}\\ 166 \multicolumn{5}{@{}l}{\textbf{K. Environnement intérieur et déclarations}}\\
165−Test de radon (déclaré) & \multicolumn{4}{l@{}}{\caseA~aucun \caseA~fait, résultat : \rule{2cm}{0.4pt} Bq/m\textsuperscript{3} ; \caseA~système d'atténuation présent} \\ 167+Test de radon (déclaré) & \wide{\caseA~aucun \caseA~fait, résultat : \rule{2cm}{0.4pt} Bq/m\textsuperscript{3} ; \caseA~système d'atténuation présent} \\
166−Matériaux susceptibles de contenir de l'amiante & \multicolumn{4}{l@{}}{\caseA~vermiculite \caseA~isolant de tuyaux \caseA~tuiles \caseA~plâtre \caseA~aucun signe} \\ 168+Matériaux susceptibles de contenir de l'amiante & \wide{\caseA~vermiculite \caseA~isolant de tuyaux \caseA~tuiles \caseA~plâtre \caseA~aucun signe} \\
167−Déclarations du vendeur ou du propriétaire & \multicolumn{4}{l@{}}{\emph{sinistres, infiltrations, réclamations, travaux sans permis, litiges}} \\ 169+Déclarations du vendeur ou du propriétaire & \wide{\emph{sinistres, infiltrations, réclamations, travaux sans permis, litiges}} \\
168 \midrule 170 \midrule
169 \multicolumn{5}{@{}l}{\textbf{L. Synthèse}}\\ 171 \multicolumn{5}{@{}l}{\textbf{L. Synthèse}}\\
170 Cote d'état générale (pondérée) & \cinq & & \emph{justification en une phrase} & \\ 172 Cote d'état générale (pondérée) & \cinq & & \emph{justification en une phrase} & \\
171−Âge chronologique / âge effectif estimé & \multicolumn{4}{l@{}}{\rule{2cm}{0.4pt} ans / \rule{2cm}{0.4pt} ans} \\ 173+Âge chronologique / âge effectif estimé & \wide{\rule{2cm}{0.4pt} ans / \rule{2cm}{0.4pt} ans} \\
172−Travaux immédiats (curables) & \multicolumn{4}{l@{}}{\rule{0pt}{10pt}} \\ 174+Travaux immédiats (curables) & \wide{\rule{0pt}{10pt}} \\
173−Travaux à moyen terme & \multicolumn{4}{l@{}}{} \\ 175+Travaux à moyen terme & \wide{} \\
174−Désordres à expertiser (hypothèses extraordinaires) & \multicolumn{4}{l@{}}{} \\ 176+Désordres à expertiser (hypothèses extraordinaires) & \wide{} \\
175−Nombre de photographies ; mesures prises & \multicolumn{4}{l@{}}{} \\ 177+Nombre de photographies ; mesures prises & \wide{} \\
176 \end{longtable} 178 \end{longtable}
177 \tabsource{conception de l'auteur ; rubriques cohérentes avec le \cref{ch:11} ; aucune donnée.} 179 \tabsource{conception de l'auteur ; rubriques cohérentes avec le \cref{ch:11} ; aucune donnée.}
178 } 180 }
@@ -182,7 +184,7 @@ Nombre de photographies ; mesures prises & \multicolumn{4}{l@{}}{} \\
182 Le second formulaire s'emploie \emph{en complément} du premier : les sections B à K du formulaire 1 sont remplies pour le bâtiment dans son ensemble, et le formulaire 2 ajoute ce qui distingue un petit immeuble locatif d'une maison : la description de chaque logement, le lien entre l'état observé et le bail, les aires communes et les équipements partagés. Le \cref{ch:32} explique pourquoi ces éléments comptent : dans un plex, la valeur dépend autant de la structure des baux et du potentiel de rattrapage des loyers que de l'état physique, et un logement rénové occupé par un locataire de longue date dont le loyer est très inférieur au marché n'a pas la même incidence qu'un logement identique loué au prix du marché depuis un an. Les règles du Code civil sur la reconduction des baux et sur la fixation des loyers (\cref{ch:26,ch:34}) font de chaque fiche de logement une pièce de l'analyse du droit évalué, non un simple inventaire. 184 Le second formulaire s'emploie \emph{en complément} du premier : les sections B à K du formulaire 1 sont remplies pour le bâtiment dans son ensemble, et le formulaire 2 ajoute ce qui distingue un petit immeuble locatif d'une maison : la description de chaque logement, le lien entre l'état observé et le bail, les aires communes et les équipements partagés. Le \cref{ch:32} explique pourquoi ces éléments comptent : dans un plex, la valeur dépend autant de la structure des baux et du potentiel de rattrapage des loyers que de l'état physique, et un logement rénové occupé par un locataire de longue date dont le loyer est très inférieur au marché n'a pas la même incidence qu'un logement identique loué au prix du marché depuis un an. Les règles du Code civil sur la reconduction des baux et sur la fixation des loyers (\cref{ch:26,ch:34}) font de chaque fiche de logement une pièce de l'analyse du droit évalué, non un simple inventaire.
183 185
184 {\small\setlength{\tabcolsep}{4pt}\renewcommand{\arraystretch}{1.45} 186 {\small\setlength{\tabcolsep}{4pt}\renewcommand{\arraystretch}{1.45}
185−\begin{longtable}{@{}L{3.1cm}c>{\centering\arraybackslash}p{1.1cm}L{4.1cm}c@{}} 187+\begin{longtable}{@{}L{3.1cm}>{\centering\arraybackslash}p{1.6cm}>{\centering\arraybackslash}p{1.1cm}L{4.1cm}>{\centering\arraybackslash}p{1.8cm}@{}}
186 \caption{Formulaire 2 — Compléments pour un immeuble de deux à cinq logements (une section M par logement)}\label{tab:appB:f2}\\ 188 \caption{Formulaire 2 — Compléments pour un immeuble de deux à cinq logements (une section M par logement)}\label{tab:appB:f2}\\
187 \toprule 189 \toprule
188 Élément & {État 1--5} & {Âge app.} & Observations (n\textsuperscript{o} photo) & Incidence \\ 190 Élément & {État 1--5} & {Âge app.} & Observations (n\textsuperscript{o} photo) & Incidence \\
@@ -198,15 +200,15 @@ Le second formulaire s'emploie \emph{en complément} du premier : les sections B
198 \bottomrule 200 \bottomrule
199 \endlastfoot 201 \endlastfoot
200 \multicolumn{5}{@{}l}{\textbf{M. Fiche de logement (reproduire pour chaque logement)}}\\ 202 \multicolumn{5}{@{}l}{\textbf{M. Fiche de logement (reproduire pour chaque logement)}}\\
201−Numéro, niveau, typologie & \multicolumn{4}{l@{}}{n\textsuperscript{o} \rule{1cm}{0.4pt} ; niveau \rule{1cm}{0.4pt} ; \caseA~studio \caseA~3½ \caseA~4½ \caseA~5½ \caseA~6½ et plus ; superficie \rule{1.2cm}{0.4pt} m\textsuperscript{2}} \\ 203+Numéro, niveau, typologie & \wide{n\textsuperscript{o} \rule{1cm}{0.4pt} ; niveau \rule{1cm}{0.4pt} ; \caseA~studio \caseA~3½ \caseA~4½ \caseA~5½ \caseA~6½ et plus ; superficie \rule{1.2cm}{0.4pt} m\textsuperscript{2}} \\
202−Occupation et accès & \multicolumn{4}{l@{}}{\caseA~visité \caseA~non visité (motif) ; \caseA~locataire \caseA~propriétaire-occupant \caseA~vacant} \\ 204+Occupation et accès & \wide{\caseA~visité \caseA~non visité (motif) ; \caseA~locataire \caseA~propriétaire-occupant \caseA~vacant} \\
203−Bail : loyer mensuel, échéance, inclusions & \multicolumn{4}{l@{}}{\rule{1.5cm}{0.4pt} \$/mois ; échéance \rule{2cm}{0.4pt} ; \caseA~chauffage \caseA~électricité \caseA~eau chaude \caseA~stationnement \caseA~électroménagers} \\ 205+Bail : loyer mensuel, échéance, inclusions & \wide{\rule{1.5cm}{0.4pt} \$/mois ; échéance \rule{2cm}{0.4pt} ; \caseA~chauffage \caseA~électricité \caseA~eau chaude \caseA~stationnement \caseA~électroménagers} \\
204−Ancienneté du locataire, avis en cours & \multicolumn{4}{l@{}}{depuis \rule{1.5cm}{0.4pt} ; \caseA~avis d'augmentation \caseA~dossier TAL \caseA~avis de reprise ou d'éviction} \\ 206+Ancienneté du locataire, avis en cours & \wide{depuis \rule{1.5cm}{0.4pt} ; \caseA~avis d'augmentation \caseA~dossier TAL \caseA~avis de reprise ou d'éviction} \\
205 Cuisine & \cinq & & \emph{année de rénovation, électroménagers fournis} & \inc \\ 207 Cuisine & \cinq & & \emph{année de rénovation, électroménagers fournis} & \inc \\
206 Salle(s) de bain & \cinq & & \emph{ventilation, étanchéité, moisissures} & \inc \\ 208 Salle(s) de bain & \cinq & & \emph{ventilation, étanchéité, moisissures} & \inc \\
207 Planchers, murs, plafonds & \cinq & & \emph{dénivellation, fissures, taches au plafond (fuite du logement supérieur)} & \inc \\ 209 Planchers, murs, plafonds & \cinq & & \emph{dénivellation, fissures, taches au plafond (fuite du logement supérieur)} & \inc \\
208 Fenêtres et portes du logement & \cinq & & \emph{voir section F ; différences entre logements} & \inc \\ 210 Fenêtres et portes du logement & \cinq & & \emph{voir section F ; différences entre logements} & \inc \\
209−Chauffage et compteur & \multicolumn{4}{l@{}}{\caseA~compteur distinct \caseA~compteur commun ; \caseA~plinthes \caseA~central ; état \cinq} \\ 211+Chauffage et compteur & \wide{\caseA~compteur distinct \caseA~compteur commun ; \caseA~plinthes \caseA~central ; état \cinq} \\
210 Électricité du logement & \cinq & & \emph{panneau distinct, ampérage, prises DDFT} & \inc \\ 212 Électricité du logement & \cinq & & \emph{panneau distinct, ampérage, prises DDFT} & \inc \\
211 Détecteurs de fumée et de CO & \caseA~oui \caseA~non & & \emph{présence dans chaque logement} & \inc \\ 213 Détecteurs de fumée et de CO & \caseA~oui \caseA~non & & \emph{présence dans chaque logement} & \inc \\
212 Issues, escaliers de secours & \cinq & & \emph{accès, garde-corps, dégagement} & \inc \\ 214 Issues, escaliers de secours & \cinq & & \emph{accès, garde-corps, dégagement} & \inc \\
@@ -219,13 +221,13 @@ Entrée électrique commune et compteurs & \cinq & & \emph{nombre de compteurs,
219 Chauffe-eau (par logement ou commun) & \cinq & & \emph{nombre, années} & \inc \\ 221 Chauffe-eau (par logement ou commun) & \cinq & & \emph{nombre, années} & \inc \\
220 Escaliers extérieurs, balcons, galeries & \cinq & & \emph{acier : corrosion aux ancrages ; bois : pourriture ; garde-corps} & \inc \\ 222 Escaliers extérieurs, balcons, galeries & \cinq & & \emph{acier : corrosion aux ancrages ; bois : pourriture ; garde-corps} & \inc \\
221 Stationnements, remises, cour & \cinq & & \emph{nombre de cases, attribution par bail} & \inc \\ 223 Stationnements, remises, cour & \cinq & & \emph{nombre de cases, attribution par bail} & \inc \\
222−Ordures, recyclage, déneigement & \multicolumn{4}{l@{}}{\emph{organisation, contrats déclarés}} \\ 224+Ordures, recyclage, déneigement & \wide{\emph{organisation, contrats déclarés}} \\
223 \midrule 225 \midrule
224 \multicolumn{5}{@{}l}{\textbf{O. Synthèse locative}}\\ 226 \multicolumn{5}{@{}l}{\textbf{O. Synthèse locative}}\\
225−Logements visités / total & \multicolumn{4}{l@{}}{\rule{1cm}{0.4pt} / \rule{1cm}{0.4pt}} \\ 227+Logements visités / total & \wide{\rule{1cm}{0.4pt} / \rule{1cm}{0.4pt}} \\
226−Loyers mensuels totaux (contractuels) & \multicolumn{4}{l@{}}{\rule{2cm}{0.4pt} \$ ; écart apparent au marché \caseA~faible \caseA~moyen \caseA~fort} \\ 228+Loyers mensuels totaux (contractuels) & \wide{\rule{2cm}{0.4pt} \$ ; écart apparent au marché \caseA~faible \caseA~moyen \caseA~fort} \\
227−Logements à rénover à la rotation & \multicolumn{4}{l@{}}{\rule{0pt}{10pt}} \\ 229+Logements à rénover à la rotation & \wide{\rule{0pt}{10pt}} \\
228−Dépenses en capital communes à prévoir & \multicolumn{4}{l@{}}{} \\ 230+Dépenses en capital communes à prévoir & \wide{} \\
229 \end{longtable} 231 \end{longtable}
230 \tabsource{conception de l'auteur ; cohérent avec les \cref{ch:26,ch:32}.} 232 \tabsource{conception de l'auteur ; cohérent avec les \cref{ch:26,ch:32}.}
231 } 233 }
@@ -235,7 +237,7 @@ Dépenses en capital communes à prévoir & \multicolumn{4}{l@{}}{} \\
235 Le troisième formulaire complète les deux premiers pour les immeubles de six logements et plus, dont le \cref{ch:33} traite l'évaluation. La différence n'est pas seulement d'échelle. À partir de ce seuil, les systèmes deviennent centraux (chauffage, eau chaude, ventilation des corridors), la sécurité incendie est organisée au niveau de l'immeuble, la réglementation de construction et de sécurité s'applique différemment, et l'exploitation suppose une gestion, des contrats d'entretien et des réserves que l'évaluateur doit retrouver dans les dépenses normalisées (\cref{ch:28}). La Loi sur le bâtiment exclut de l'application du chapitre « Bâtiment » du Code de sécurité les immeubles totalement résidentiels de moins de trois étages ou de moins de neuf logements \parencite[art.~29]{loibatiment} ; au-delà, l'immeuble est assujetti et l'évaluateur demande les documents qui en attestent (registre d'entretien du système d'alarme, rapports d'inspection des façades et des stationnements étagés lorsqu'ils s'appliquent, plan de sécurité incendie). Il ne vérifie pas lui-même la conformité ; il consigne l'existence ou l'absence des documents, ce qui, en soi, informe sur la gestion. 237 Le troisième formulaire complète les deux premiers pour les immeubles de six logements et plus, dont le \cref{ch:33} traite l'évaluation. La différence n'est pas seulement d'échelle. À partir de ce seuil, les systèmes deviennent centraux (chauffage, eau chaude, ventilation des corridors), la sécurité incendie est organisée au niveau de l'immeuble, la réglementation de construction et de sécurité s'applique différemment, et l'exploitation suppose une gestion, des contrats d'entretien et des réserves que l'évaluateur doit retrouver dans les dépenses normalisées (\cref{ch:28}). La Loi sur le bâtiment exclut de l'application du chapitre « Bâtiment » du Code de sécurité les immeubles totalement résidentiels de moins de trois étages ou de moins de neuf logements \parencite[art.~29]{loibatiment} ; au-delà, l'immeuble est assujetti et l'évaluateur demande les documents qui en attestent (registre d'entretien du système d'alarme, rapports d'inspection des façades et des stationnements étagés lorsqu'ils s'appliquent, plan de sécurité incendie). Il ne vérifie pas lui-même la conformité ; il consigne l'existence ou l'absence des documents, ce qui, en soi, informe sur la gestion.
236 238
237 {\small\setlength{\tabcolsep}{4pt}\renewcommand{\arraystretch}{1.45} 239 {\small\setlength{\tabcolsep}{4pt}\renewcommand{\arraystretch}{1.45}
238−\begin{longtable}{@{}L{3.1cm}c>{\centering\arraybackslash}p{1.1cm}L{4.1cm}c@{}} 240+\begin{longtable}{@{}L{3.1cm}>{\centering\arraybackslash}p{1.6cm}>{\centering\arraybackslash}p{1.1cm}L{4.1cm}>{\centering\arraybackslash}p{1.8cm}@{}}
239 \caption{Formulaire 3 — Compléments pour un immeuble de six logements et plus}\label{tab:appB:f3}\\ 241 \caption{Formulaire 3 — Compléments pour un immeuble de six logements et plus}\label{tab:appB:f3}\\
240 \toprule 242 \toprule
241 Élément & {État 1--5} & {Âge app.} & Observations (n\textsuperscript{o} photo) & Incidence \\ 243 Élément & {État 1--5} & {Âge app.} & Observations (n\textsuperscript{o} photo) & Incidence \\
@@ -265,7 +267,7 @@ Détecteurs, avertisseurs, éclairage d'urgence & \cinq & & \emph{présence dans
265 Séparations coupe-feu, portes à fermeture automatique & \cinq & & \emph{portes calées ouvertes, percements non scellés} & \inc \\ 267 Séparations coupe-feu, portes à fermeture automatique & \cinq & & \emph{portes calées ouvertes, percements non scellés} & \inc \\
266 Extincteurs, gicleurs, cabinets d'incendie & \cinq & & \emph{étiquettes d'inspection, dates} & \inc \\ 268 Extincteurs, gicleurs, cabinets d'incendie & \cinq & & \emph{étiquettes d'inspection, dates} & \inc \\
267 Issues, escaliers de secours, dégagements & \cinq & & \emph{encombrement, état des escaliers extérieurs d'acier} & \inc \\ 269 Issues, escaliers de secours, dégagements & \cinq & & \emph{encombrement, état des escaliers extérieurs d'acier} & \inc \\
268−Plan de sécurité incendie, documents disponibles & \multicolumn{4}{l@{}}{\caseA~plan \caseA~registre d'alarme \caseA~rapports d'inspection \caseA~aucun document fourni} \\ 270+Plan de sécurité incendie, documents disponibles & \wide{\caseA~plan \caseA~registre d'alarme \caseA~rapports d'inspection \caseA~aucun document fourni} \\
269 \midrule 271 \midrule
270 \multicolumn{5}{@{}l}{\textbf{R. Accessibilité et aires communes}}\\ 272 \multicolumn{5}{@{}l}{\textbf{R. Accessibilité et aires communes}}\\
271 Entrée principale, rampe, seuils & \cinq & & \emph{accessibilité sans obstacle, ouvre-porte} & \inc \\ 273 Entrée principale, rampe, seuils & \cinq & & \emph{accessibilité sans obstacle, ouvre-porte} & \inc \\
@@ -282,15 +284,15 @@ Aménagement, murs de soutènement, clôtures & \cinq & & \emph{stabilité, drai
282 Toiture : accès, équipements en toiture & \cinq & & \emph{unités mécaniques, ancrages, membrane autour des bases} & \inc \\ 284 Toiture : accès, équipements en toiture & \cinq & & \emph{unités mécaniques, ancrages, membrane autour des bases} & \inc \\
283 \midrule 285 \midrule
284 \multicolumn{5}{@{}l}{\textbf{T. Gestion et documents}}\\ 286 \multicolumn{5}{@{}l}{\textbf{T. Gestion et documents}}\\
285−État locatif fourni, baux consultés & \multicolumn{4}{l@{}}{\caseA~état locatif daté \caseA~copies des baux \caseA~registre des avis TAL \caseA~liste des travaux réalisés} \\ 287+État locatif fourni, baux consultés & \wide{\caseA~état locatif daté \caseA~copies des baux \caseA~registre des avis TAL \caseA~liste des travaux réalisés} \\
286−Contrats d'entretien et de service & \multicolumn{4}{l@{}}{\caseA~chauffage \caseA~alarme \caseA~ascenseur \caseA~déneigement \caseA~extermination \caseA~conciergerie} \\ 288+Contrats d'entretien et de service & \wide{\caseA~chauffage \caseA~alarme \caseA~ascenseur \caseA~déneigement \caseA~extermination \caseA~conciergerie} \\
287−Dépenses des trois derniers exercices & \multicolumn{4}{l@{}}{\caseA~fournies \caseA~partielles \caseA~refusées} \\ 289+Dépenses des trois derniers exercices & \wide{\caseA~fournies \caseA~partielles \caseA~refusées} \\
288−Travaux majeurs réalisés (10~ans) et prévus & \multicolumn{4}{l@{}}{\rule{0pt}{10pt}} \\ 290+Travaux majeurs réalisés (10~ans) et prévus & \wide{\rule{0pt}{10pt}} \\
289 \midrule 291 \midrule
290 \multicolumn{5}{@{}l}{\textbf{U. Synthèse}}\\ 292 \multicolumn{5}{@{}l}{\textbf{U. Synthèse}}\\
291−Logements visités / total ; échantillon représentatif ? & \multicolumn{4}{l@{}}{\rule{1cm}{0.4pt} / \rule{1cm}{0.4pt} ; \caseA~oui \caseA~non (hypothèse à déclarer)} \\ 293+Logements visités / total ; échantillon représentatif ? & \wide{\rule{1cm}{0.4pt} / \rule{1cm}{0.4pt} ; \caseA~oui \caseA~non (hypothèse à déclarer)} \\
292−Dépenses en capital à projeter (composante, année, ordre de grandeur) & \multicolumn{4}{l@{}}{\rule{0pt}{10pt}} \\ 294+Dépenses en capital à projeter (composante, année, ordre de grandeur) & \wide{\rule{0pt}{10pt}} \\
293−Désordres à expertiser & \multicolumn{4}{l@{}}{} \\ 295+Désordres à expertiser & \wide{} \\
294 \end{longtable} 296 \end{longtable}
295 \tabsource{conception de l'auteur ; cohérent avec les \cref{ch:28,ch:33} et avec la fiche d'inspection du dossier de cas du \cref{ch:47}.} 297 \tabsource{conception de l'auteur ; cohérent avec les \cref{ch:28,ch:33} et avec la fiche d'inspection du dossier de cas du \cref{ch:47}.}
296 } 298 }
@@ -357,7 +359,7 @@ L'exemple qui suit est entièrement fictif. Il porte sur la maison du dossier de
357 Le \cref{tab:appB:exemple} montre comment le formulaire 1 se remplit sur le terrain. On y voit le passage des faits aux codes : la toiture de 2014, cotée 3 avec un âge apparent de douze ans, n'appelle aucune incidence immédiate mais entre dans l'âge effectif ; le chauffe-eau de 2013 est en fin de vie et reçoit une incidence négative ; la fissure du mur ouest, de faible largeur et sans déversement, est consignée avec sa mesure, photographiée, et renvoyée à une réserve plutôt qu'à une hypothèse extraordinaire parce que rien n'indique un désordre structural ; le sous-sol fini de bonne qualité, le garage et la thermopompe récente donnent au sujet un avantage sur les comparables qui n'en ont pas, ce que la grille d'ajustements du \cref{ch:17} traduira en dollars. La synthèse, enfin, aboutit à une cote générale de 3 et à un âge effectif inférieur à l'âge chronologique, parce que plusieurs composantes de courte durée ont été renouvelées ; c'est ce chiffre que le \cref{ch:24} utilise. 359 Le \cref{tab:appB:exemple} montre comment le formulaire 1 se remplit sur le terrain. On y voit le passage des faits aux codes : la toiture de 2014, cotée 3 avec un âge apparent de douze ans, n'appelle aucune incidence immédiate mais entre dans l'âge effectif ; le chauffe-eau de 2013 est en fin de vie et reçoit une incidence négative ; la fissure du mur ouest, de faible largeur et sans déversement, est consignée avec sa mesure, photographiée, et renvoyée à une réserve plutôt qu'à une hypothèse extraordinaire parce que rien n'indique un désordre structural ; le sous-sol fini de bonne qualité, le garage et la thermopompe récente donnent au sujet un avantage sur les comparables qui n'en ont pas, ce que la grille d'ajustements du \cref{ch:17} traduira en dollars. La synthèse, enfin, aboutit à une cote générale de 3 et à un âge effectif inférieur à l'âge chronologique, parce que plusieurs composantes de courte durée ont été renouvelées ; c'est ce chiffre que le \cref{ch:24} utilise.
358 360
359 {\small\setlength{\tabcolsep}{4pt} 361 {\small\setlength{\tabcolsep}{4pt}
360−\begin{longtable}{@{}L{2.7cm}c>{\centering\arraybackslash}p{0.9cm}L{5.2cm}L{2.5cm}@{}} 362+\begin{longtable}{@{}L{2.7cm}>{\centering\arraybackslash}p{0.8cm}>{\centering\arraybackslash}p{0.9cm}L{5.2cm}L{2.5cm}@{}}
361 \caption{Formulaire 1 rempli pour le sujet du cas 1 (inspection fictive du 20~août 2026 ; données synthétiques)}\label{tab:appB:exemple}\\ 363 \caption{Formulaire 1 rempli pour le sujet du cas 1 (inspection fictive du 20~août 2026 ; données synthétiques)}\label{tab:appB:exemple}\\
362 \toprule 364 \toprule
363 Élément & {État} & {Âge app.} & Observations (n\textsuperscript{o} photo) & Incidence \\ 365 Élément & {État} & {Âge app.} & Observations (n\textsuperscript{o} photo) & Incidence \\
@@ -373,9 +375,9 @@ Le \cref{tab:appB:exemple} montre comment le formulaire 1 se remplit sur le terr
373 \bottomrule 375 \bottomrule
374 \endlastfoot 376 \endlastfoot
375 \multicolumn{5}{@{}l}{\textbf{A. Identification}}\\ 377 \multicolumn{5}{@{}l}{\textbf{A. Identification}}\\
376−Adresse, lot, date & \multicolumn{4}{l@{}}{123, rue des Érables (fictive), Hull ; lot fictif ; 20~août 2026, 9~h~30 à 11~h~15 ; propriétaire présent ; ensoleillé, 24~°C} \\ 378+Adresse, lot, date & \widex{123, rue des Érables (fictive), Hull ; lot fictif ; 20~août 2026, 9~h~30 à 11~h~15 ; propriétaire présent ; ensoleillé, 24~°C} \\
377−Parties non visitées & \multicolumn{4}{l@{}}{Entretoit observé depuis la trappe seulement ; remise verrouillée} \\ 379+Parties non visitées & \widex{Entretoit observé depuis la trappe seulement ; remise verrouillée} \\
378−Documents consultés & \multicolumn{4}{l@{}}{Rôle 2025, certificat de localisation (2019), permis (garage 1998, toiture 2014), zonage résidentiel, hors zone inondable selon la carte en vigueur, DV du vendeur} \\ 380+Documents consultés & \widex{Rôle 2025, certificat de localisation (2019), permis (garage 1998, toiture 2014), zonage résidentiel, hors zone inondable selon la carte en vigueur, DV du vendeur} \\
379 \midrule 381 \midrule
380 \multicolumn{5}{@{}l}{\textbf{B. Site et terrain}}\\ 382 \multicolumn{5}{@{}l}{\textbf{B. Site et terrain}}\\
381 Topographie, drainage & 4 & — & Terrain plat, pente légère vers la rue ; aucune eau stagnante (ph.~1--2) & 0 \\ 383 Topographie, drainage & 4 & — & Terrain plat, pente légère vers la rue ; aucune eau stagnante (ph.~1--2) & 0 \\
@@ -386,7 +388,7 @@ Services & 5 & — & Aqueduc et égout municipaux & 0 \\
386 Zone inondable & non & — & Carte consultée le 19~août 2026 & 0 \\ 388 Zone inondable & non & — & Carte consultée le 19~août 2026 & 0 \\
387 \midrule 389 \midrule
388 \multicolumn{5}{@{}l}{\textbf{C. Fondations et structure}}\\ 390 \multicolumn{5}{@{}l}{\textbf{C. Fondations et structure}}\\
389−Type & \multicolumn{4}{l@{}}{Béton coulé, sous-sol pleine hauteur (2,35~m libre)} \\ 391+Type & \widex{Béton coulé, sous-sol pleine hauteur (2,35~m libre)} \\
390 Murs de fondation & 3 & 28 & Fissure verticale de 1~mm au mur ouest, du haut jusqu'à 40~cm du sol, sèche, sans déversement ; efflorescence légère (ph.~7--8) & 0 (réserve) \\ 392 Murs de fondation & 3 & 28 & Fissure verticale de 1~mm au mur ouest, du haut jusqu'à 40~cm du sol, sèche, sans déversement ; efflorescence légère (ph.~7--8) & 0 (réserve) \\
391 Dalle sous-sol et garage & 4 & 28 & Aucun soulèvement ni fissure en étoile ; dalle du garage plane ; aucun signe de pyrite (ph.~9) & 0 \\ 393 Dalle sous-sol et garage & 4 & 28 & Aucun soulèvement ni fissure en étoile ; dalle du garage plane ; aucun signe de pyrite (ph.~9) & 0 \\
392 Drainage, puisard & 4 & 28 & Pompe de puisard 2021, clapet ; aucun dépôt d'ocre ; eau claire & 0 \\ 394 Drainage, puisard & 4 & 28 & Pompe de puisard 2021, clapet ; aucun dépôt d'ocre ; eau claire & 0 \\
@@ -394,23 +396,23 @@ Humidité, infiltrations & 4 & — & Aucune trace ; DV : aucune infiltration dé
394 Charpente visible & 4 & 28 & Solives de bois d'ingénierie, aucune flèche visible & 0 \\ 396 Charpente visible & 4 & 28 & Solives de bois d'ingénierie, aucune flèche visible & 0 \\
395 \midrule 397 \midrule
396 \multicolumn{5}{@{}l}{\textbf{D. Enveloppe}}\\ 398 \multicolumn{5}{@{}l}{\textbf{D. Enveloppe}}\\
397−Revêtement & \multicolumn{4}{l@{}}{Brique en façade et pignons, vinyle sur les côtés et l'arrière} \\ 399+Revêtement & \widex{Brique en façade et pignons, vinyle sur les côtés et l'arrière} \\
398 État du revêtement & 3 & 28 & Mortier sain ; deux linteaux d'acier avec rouille de surface au-dessus des fenêtres arrière (ph.~12) & $-$ (curable mineur) \\ 400 État du revêtement & 3 & 28 & Mortier sain ; deux linteaux d'acier avec rouille de surface au-dessus des fenêtres arrière (ph.~12) & $-$ (curable mineur) \\
399 Solins, scellants & 3 & 10 & Scellants durcis au pourtour de trois fenêtres & $-$ (curable mineur) \\ 401 Solins, scellants & 3 & 10 & Scellants durcis au pourtour de trois fenêtres & $-$ (curable mineur) \\
400 Soffites, fascias & 4 & 12 & Aluminium 2014, ventilés & 0 \\ 402 Soffites, fascias & 4 & 12 & Aluminium 2014, ventilés & 0 \\
401 Galerie arrière & 3 & 15 & Bois traité, garde-corps conforme en apparence, surface à teindre & 0 \\ 403 Galerie arrière & 3 & 15 & Bois traité, garde-corps conforme en apparence, surface à teindre & 0 \\
402 Porte de garage & 4 & 8 & Isolée, ouvre-porte 2018 & $+$ (garage vs comparables sans garage) \\ 404 Porte de garage & 4 & 8 & Isolée, ouvre-porte 2018 & $+$ (garage vs comparables sans garage) \\
403−Isolation des murs & \multicolumn{4}{l@{}}{Laine minérale visible à une ouverture du sous-sol ; aucune vermiculite ni MIUF déclarée} \\ 405+Isolation des murs & \widex{Laine minérale visible à une ouverture du sous-sol ; aucune vermiculite ni MIUF déclarée} \\
404 \midrule 406 \midrule
405 \multicolumn{5}{@{}l}{\textbf{E. Toiture}}\\ 407 \multicolumn{5}{@{}l}{\textbf{E. Toiture}}\\
406−Type & \multicolumn{4}{l@{}}{Bardeau d'asphalte, pente forte, refait en 2014 (permis)} \\ 408+Type & \widex{Bardeau d'asphalte, pente forte, refait en 2014 (permis)} \\
407 Couvrement & 3 & 12 & Granules intacts, aucun bardeau relevé ; mousse légère côté nord (ph.~14) & 0 \\ 409 Couvrement & 3 & 12 & Granules intacts, aucun bardeau relevé ; mousse légère côté nord (ph.~14) & 0 \\
408 Solins, évents & 4 & 12 & Évents de plastique, solins de la cheminée scellés & 0 \\ 410 Solins, évents & 4 & 12 & Évents de plastique, solins de la cheminée scellés & 0 \\
409 Gouttières & 3 & 12 & Descentes rejetant à 1~m des fondations ; rallonges recommandées & 0 \\ 411 Gouttières & 3 & 12 & Descentes rejetant à 1~m des fondations ; rallonges recommandées & 0 \\
410 Entretoit & 3 & 28 & Vu de la trappe : laine soufflée, env. 25~cm, ventilation apparente, aucune tache ; aucune vermiculite visible & 0 \\ 412 Entretoit & 3 & 28 & Vu de la trappe : laine soufflée, env. 25~cm, ventilation apparente, aucune tache ; aucune vermiculite visible & 0 \\
411 \midrule 413 \midrule
412 \multicolumn{5}{@{}l}{\textbf{F. Fenestration}}\\ 414 \multicolumn{5}{@{}l}{\textbf{F. Fenestration}}\\
413−Type & \multicolumn{4}{l@{}}{PVC, vitrage double, d'origine (1998) sauf deux fenêtres du sous-sol (2016)} \\ 415+Type & \widex{PVC, vitrage double, d'origine (1998) sauf deux fenêtres du sous-sol (2016)} \\
414 État & 3 & 28 & Un verre embué (chambre 3, ph.~16) ; mécanismes fonctionnels & $-$ (curable mineur) \\ 416 État & 3 & 28 & Un verre embué (chambre 3, ph.~16) ; mécanismes fonctionnels & $-$ (curable mineur) \\
415 \midrule 417 \midrule
416 \multicolumn{5}{@{}l}{\textbf{G. Intérieur}}\\ 418 \multicolumn{5}{@{}l}{\textbf{G. Intérieur}}\\
@@ -422,32 +424,32 @@ Sous-sol fini & 4 & 10 & Salle familiale, chambre, salle de bain ; plafond suspe
422 Foyer & 3 & 28 & Foyer au bois d'origine, conduit ramoné selon le propriétaire ; aucun certificat vu & 0 \\ 424 Foyer & 3 & 28 & Foyer au bois d'origine, conduit ramoné selon le propriétaire ; aucun certificat vu & 0 \\
423 \midrule 425 \midrule
424 \multicolumn{5}{@{}l}{\textbf{H. Électricité}}\\ 426 \multicolumn{5}{@{}l}{\textbf{H. Électricité}}\\
425−Entrée et panneau & \multicolumn{4}{l@{}}{200~A, disjoncteurs, cuivre ; espace libre pour 6 circuits} \\ 427+Entrée et panneau & \widex{200~A, disjoncteurs, cuivre ; espace libre pour 6 circuits} \\
426 Câblage visible & 4 & 28 & Aucun aluminium ; boîtes fermées & 0 \\ 428 Câblage visible & 4 & 28 & Aucun aluminium ; boîtes fermées & 0 \\
427 Prises, détecteurs & 4 & — & DDFT aux salles de bain et à la cuisine ; détecteurs de fumée à chaque niveau, CO au sous-sol & 0 \\ 429 Prises, détecteurs & 4 & — & DDFT aux salles de bain et à la cuisine ; détecteurs de fumée à chaque niveau, CO au sous-sol & 0 \\
428 \midrule 430 \midrule
429 \multicolumn{5}{@{}l}{\textbf{I. Plomberie}}\\ 431 \multicolumn{5}{@{}l}{\textbf{I. Plomberie}}\\
430−Distribution, évacuation & \multicolumn{4}{l@{}}{Cuivre et ABS d'origine ; aucun galvanisé} \\ 432+Distribution, évacuation & \widex{Cuivre et ABS d'origine ; aucun galvanisé} \\
431 Chauffe-eau & 2 & 13 & Électrique 60~gal, 2013, corrosion au raccord supérieur, sans bac (ph.~21) & $-$ (remplacement) \\ 433 Chauffe-eau & 2 & 13 & Électrique 60~gal, 2013, corrosion au raccord supérieur, sans bac (ph.~21) & $-$ (remplacement) \\
432 Appareils & 4 & — & Pression normale, aucune fuite & 0 \\ 434 Appareils & 4 & — & Pression normale, aucune fuite & 0 \\
433 \midrule 435 \midrule
434 \multicolumn{5}{@{}l}{\textbf{J. Chauffage, ventilation}}\\ 436 \multicolumn{5}{@{}l}{\textbf{J. Chauffage, ventilation}}\\
435−Système & \multicolumn{4}{l@{}}{Plinthes électriques d'origine + thermopompe murale (2022) au rez-de-chaussée ; aucun mazout} \\ 437+Système & \widex{Plinthes électriques d'origine + thermopompe murale (2022) au rez-de-chaussée ; aucun mazout} \\
436 Appareils & 4 & 4 / 28 & Thermopompe 2022 en bon état ; plinthes fonctionnelles & $+$ (vs comparables sans thermopompe) \\ 438 Appareils & 4 & 4 / 28 & Thermopompe 2022 en bon état ; plinthes fonctionnelles & $+$ (vs comparables sans thermopompe) \\
437 Ventilation & 3 & 28 & Ventilateurs de salles de bain vers l'extérieur ; aucun VRC & 0 \\ 439 Ventilation & 3 & 28 & Ventilateurs de salles de bain vers l'extérieur ; aucun VRC & 0 \\
438 \midrule 440 \midrule
439 \multicolumn{5}{@{}l}{\textbf{K. Environnement intérieur}}\\ 441 \multicolumn{5}{@{}l}{\textbf{K. Environnement intérieur}}\\
440−Radon & \multicolumn{4}{l@{}}{Aucun test déclaré ; aucun système d'atténuation ; réserve type au rapport} \\ 442+Radon & \widex{Aucun test déclaré ; aucun système d'atténuation ; réserve type au rapport} \\
441−Amiante & \multicolumn{4}{l@{}}{Aucun signe (construction 1998)} \\ 443+Amiante & \widex{Aucun signe (construction 1998)} \\
442−Déclarations & \multicolumn{4}{l@{}}{DV : aucun sinistre, aucune réclamation, aucun travail sans permis déclaré} \\ 444+Déclarations & \widex{DV : aucun sinistre, aucune réclamation, aucun travail sans permis déclaré} \\
443 \midrule 445 \midrule
444 \multicolumn{5}{@{}l}{\textbf{L. Synthèse}}\\ 446 \multicolumn{5}{@{}l}{\textbf{L. Synthèse}}\\
445 Cote générale & 3 & — & Entretien normal pour l'âge ; composantes de courte durée partiellement renouvelées ; aucun désordre structural apparent & \\ 447 Cote générale & 3 & — & Entretien normal pour l'âge ; composantes de courte durée partiellement renouvelées ; aucun désordre structural apparent & \\
446−Âges & \multicolumn{4}{l@{}}{Chronologique 28~ans ; effectif estimé 22~ans (toiture, revêtements de sol, cuisine et salle de bain de l'étage renouvelés ; fenêtres et salle de bain du sous-sol d'origine)} \\ 448+Âges & \widex{Chronologique 28~ans ; effectif estimé 22~ans (toiture, revêtements de sol, cuisine et salle de bain de l'étage renouvelés ; fenêtres et salle de bain du sous-sol d'origine)} \\
447−Travaux immédiats & \multicolumn{4}{l@{}}{Chauffe-eau ; scellants ; verre embué ; linteaux à nettoyer et peindre} \\ 449+Travaux immédiats & \widex{Chauffe-eau ; scellants ; verre embué ; linteaux à nettoyer et peindre} \\
448−Moyen terme & \multicolumn{4}{l@{}}{Fenêtres d'origine (5 à 10~ans) ; salle de bain du sous-sol ; asphalte} \\ 450+Moyen terme & \widex{Fenêtres d'origine (5 à 10~ans) ; salle de bain du sous-sol ; asphalte} \\
449−À expertiser & \multicolumn{4}{l@{}}{Aucun ; fissure du mur ouest consignée en réserve avec recommandation de suivi} \\ 451+À expertiser & \widex{Aucun ; fissure du mur ouest consignée en réserve avec recommandation de suivi} \\
450−Photographies, mesures & \multicolumn{4}{l@{}}{24 photographies ; périmètre extérieur mesuré au télémètre, conforme au certificat de localisation} \\ 452+Photographies, mesures & \widex{24 photographies ; périmètre extérieur mesuré au télémètre, conforme au certificat de localisation} \\
451 \end{longtable} 453 \end{longtable}
452 \tabsource{\synth{exemple rédigé pour l'annexe à partir de \texttt{cas1\_gatineau\_sujet.json} ; aucun montant ; la cote 3 et l'âge effectif sont ceux que les \cref{ch:21,ch:24} utilisent.}} 454 \tabsource{\synth{exemple rédigé pour l'annexe à partir de \texttt{cas1\_gatineau\_sujet.json} ; aucun montant ; la cote 3 et l'âge effectif sont ceux que les \cref{ch:21,ch:24} utilisent.}}
453 } 455 }
modified manuscript/chapters/ch03.tex +490 −2
@@ -1,2 +1,490 @@
1−\chapter{Offre, demande et cycles}\label{ch:03} 1+\chapter{Offre, demande et cycles}\label{ch:3}
2−\stubchapter 2+
3+Les deux premiers chapitres ont établi ce que l'évaluateur cherche à mesurer : une valeur marchande, c'est-à-dire le prix le plus probable d'un bien à une date donnée, pour un droit précisément défini. Le présent chapitre s'intéresse à la formation de ce prix à l'échelle du marché. Le logement est un bien durable, produit lentement et consommé pendant des décennies, de sorte que son prix résulte de la rencontre d'une demande qui bouge vite et d'une offre qui bouge lentement. Cette asymétrie explique l'essentiel de ce que l'évaluateur observe sur le terrain : des loyers qui réagissent aux pénuries avec retard, des prix qui s'emballent lorsque les taux d'intérêt baissent, des mises en chantier qui arrivent au moment où la demande s'est déjà retournée, et des marchés régionaux dont les cycles n'ont ni la même amplitude ni la même durée. Le chapitre construit ce raisonnement en trois temps : la mécanique stock-flux et le modèle des quatre quadrants qui relie loyers, prix, construction et stock ; la dynamique des cycles engendrée par les délais de construction et l'inoccupation naturelle ; enfin le coût d'usage, qui relie le prix d'un logement au loyer d'un logement équivalent et aux taux d'intérêt. Les données réelles du Québec, lues dans les tableaux de Statistique Canada et les séries de la Banque du Canada, servent de contrepoint aux modèles, et le chapitre se termine par les indicateurs qu'un évaluateur peut consulter pour qualifier l'état d'un marché à la date d'évaluation.
4+
5+\begin{objectifs}
6+\begin{itemize}
7+\item Distinguer le stock de logements et les flux qui le modifient, et expliquer pourquoi l'offre de logements est inélastique à court terme et élastique à long terme.
8+\item Exposer le modèle des quatre quadrants de DiPasquale et Wheaton, en dériver l'équilibre stationnaire et en tirer la statique comparative d'un choc de taux, de demande ou de coût.
9+\item Définir l'élasticité de l'offre et nommer ses déterminants géographiques, réglementaires et techniques, avec leurs conséquences sur l'amplitude des cycles.
10+\item Formaliser un cycle stock-flux avec délai de livraison et inoccupation naturelle, en établir la condition d'oscillation et mesurer la sensibilité du cycle aux paramètres.
11+\item Dériver le coût d'usage du logement, calculer le ratio prix/loyer qu'il implique et apprécier la sensibilité des prix aux taux d'intérêt.
12+\item Lire les séries publiques québécoises (mises en chantier, taux, inflation, inventaire) pour situer un marché dans son cycle à la date d'évaluation.
13+\end{itemize}
14+\end{objectifs}
15+
16+\section{Stock, flux et ajustement lent}\label{sec:3:stockflux}
17+
18+\subsection{Le logement comme stock}
19+
20+Le parc de logements d'une région est un \motcle{stock} : un nombre de logements existant à une date donnée. Les quantités qui le modifient sont des \motcle{flux} : les mises en chantier et les achèvements l'augmentent, les démolitions, les conversions à d'autres usages et les pertes par sinistre le réduisent. Si l'on note $S_t$ le stock au début de l'année $t$, $C_t$ les logements achevés au cours de l'année et $\delta$ le taux annuel de retrait, l'identité comptable qui gouverne l'évolution du parc s'écrit
21+\begin{equation}\label{eq:3:stockflux}
22+S_{t+1} = S_t + C_t - \delta S_t ,
23+\end{equation}
24+et le stock est stationnaire lorsque la construction compense exactement les retraits, $C = \delta S$. Cette identité, d'apparence triviale, contient la première leçon du chapitre. Au recensement de 2021, le Québec comptait \num{3749035} logements privés occupés \parencite{statcanrec2021type}. En 2025, année la plus active depuis 2021, \num{59864} logements y ont été mis en chantier, toutes régions confondues \parencite{statcanmiseschantier}. Le flux annuel représente donc environ \pct{1.6} du stock. Même si toutes ces unités étaient achevées dans l'année et qu'aucun logement n'était retiré, le parc ne croîtrait que de \pct{1.6} ; avec un taux de retrait de l'ordre d'un demi pour cent, hypothèse que l'\cref{ex:3:1} retient faute de mesure officielle, la croissance nette tombe à \pct{1.1}. Une variation même forte de la construction ne modifie le stock que marginalement d'une année à l'autre. À l'horizon d'une évaluation, qui porte sur une date, le stock est donné.
25+
26+\begin{definition}{Stock, flux et taux de retrait}{3:stock}
27+Le \emph{stock} $S_t$ est le nombre de logements existants à une date. Les \emph{flux} sont les mises en chantier (décision de construire), les achèvements $C_t$ (ajout effectif au stock) et les retraits $\delta S_t$ (démolitions, conversions, sinistres), où $\delta$ est le \emph{taux de retrait}. Le délai entre la mise en chantier et l'achèvement, noté $L$, sépare la décision d'offrir de l'offre effective ; il est de quelques mois pour une maison individuelle et de deux à quatre ans pour un immeuble d'appartements de grande hauteur.
28+\end{definition}
29+
30+La \motcle{durabilité} du logement a une seconde conséquence, soulignée par \textcite{glaeserGyourko2005} : le stock peut croître rapidement lorsque la demande augmente, puisqu'il suffit de construire, mais il ne peut pas décroître rapidement lorsque la demande diminue, puisque personne ne démolit un immeuble en bon état. L'offre est donc asymétrique. Dans une ville en croissance, le prix des logements est ancré au coût de construction, car toute hausse durable au-dessus de ce coût déclenche des mises en chantier ; dans une ville en déclin, le prix peut tomber très en deçà du coût de construction et y rester des décennies, le stock existant se dépréciant lentement. Cette asymétrie est la raison pour laquelle les cycles immobiliers ne sont pas symétriques : les hausses sont bornées par l'offre nouvelle, les baisses ne le sont pas.
31+
32+\subsection{La demande de services de logement}
33+
34+Ce que les ménages demandent n'est pas un logement en tant qu'actif, mais le service que ce logement rend pendant une période : un abri, une localisation, un ensemble d'attributs (\cref{ch:1}). Le prix de ce service est le \motcle{loyer}, qu'il soit versé à un propriétaire ou implicitement supporté par un propriétaire occupant. La demande d'espace d'une région dépend du nombre de ménages, de leurs revenus, de leurs préférences et du loyer $R$ ; dans sa forme la plus simple, on l'écrit comme une fonction décroissante du loyer,
35+\begin{equation}\label{eq:3:demande}
36+D(R) = a - bR, \qquad b > 0,
37+\end{equation}
38+où le paramètre $a$ résume la taille du marché (ménages, revenus, emplois) et où $b$ mesure la sensibilité de la demande au loyer. À court terme, le stock étant donné, le loyer s'ajuste jusqu'à ce que la demande absorbe le stock disponible, $D(R) = S$, aux frictions d'inoccupation près dont traite la \cref{sec:3:cycles}. Un afflux de ménages déplace la demande vers la droite et, le stock ne pouvant suivre, le loyer monte ; c'est le mécanisme qu'ont vécu les marchés québécois entre 2021 et 2024, lorsque la croissance démographique a rencontré un parc locatif dont le taux d'inoccupation était tombé sous un pour cent dans plusieurs régions métropolitaines \parencite{schlLocatif2025}.
39+
40+L'évaluateur retiendra de cette première section un principe simple : à court terme, c'est la demande qui fait le prix, parce que l'offre ne peut pas répondre ; à long terme, c'est le coût de l'offre nouvelle qui ancre le prix, parce que la construction finit par répondre. La durée du « court terme » est précisément ce que les sections suivantes vont mesurer.
41+
42+\section{Le modèle des quatre quadrants}\label{sec:3:quadrants}
43+
44+\subsection{Deux marchés, quatre relations}
45+
46+Le modèle de \textcite{dipasqualeWheaton1992}, développé dans leur manuel \parencite{dipasqualeWheaton1996}, articule en un seul schéma le marché de l'espace, où se forment les loyers, et le marché des actifs, où se forment les prix. Il repose sur quatre relations, chacune occupant un quadrant d'un plan dont l'axe horizontal porte le stock $S$ vers la droite et le prix $P$ vers la gauche, et dont l'axe vertical porte le loyer $R$ vers le haut et la construction $C$ vers le bas (\cref{fig:3:quadrants}).
47+
48+Le premier quadrant, au nord-est, est le marché de l'espace : il contient la courbe de demande \eqref{eq:3:demande} et détermine le loyer qui équilibre la demande et le stock existant. Le deuxième quadrant, au nord-ouest, est le marché des actifs : il convertit le loyer en prix par la capitalisation,
49+\begin{equation}\label{eq:3:actifs}
50+P = \frac{R}{i},
51+\end{equation}
52+où $i$ est le \motcle{taux de capitalisation} exigé par les investisseurs, c'est-à-dire le rendement courant qu'ils acceptent pour détenir de l'immobilier compte tenu des rendements offerts par les autres actifs, du risque et de la croissance attendue des loyers. L'\cref{eq:3:actifs} est l'équation de la capitalisation directe du \cref{ch:29} ; la fonction \texttt{capitalisation\_directe} de la bibliothèque de l'ouvrage la calcule, et le \cref{ch:30} montrera que $i$ s'interprète, sous certaines hypothèses, comme la différence entre le taux d'actualisation et le taux de croissance des loyers \parencite{gordonShapiro1956}. Le troisième quadrant, au sud-ouest, est le secteur de la construction : les promoteurs construisent lorsque le prix dépasse le coût de remplacement, et d'autant plus que l'écart est grand,
53+\begin{equation}\label{eq:3:construction}
54+C = \frac{P - c_0}{c_1} \quad \text{si } P > c_0, \qquad C = 0 \text{ sinon},
55+\end{equation}
56+où $c_0$ est le seuil de coût au-dessous duquel rien ne se construit, et où $c_1$ mesure la hausse de coût marginal qu'entraîne un rythme de construction plus soutenu : terrains plus rares, main-d'œuvre et matériaux plus chers, délais d'approbation plus longs. Le quatrième quadrant, au sud-est, est l'identité stock-flux \eqref{eq:3:stockflux} en régime stationnaire, $S = C/\delta$ : le stock que la construction courante peut entretenir à long terme.
57+
58+\begin{figure}[htbp]
59+\centering
60+\includegraphics[width=\textwidth]{ch03/ch03-fig-quatre-quadrants.pdf}
61+\caption{Le modèle des quatre quadrants pour le marché type du chapitre : le rectangle plein relie l'équilibre stationnaire de référence (loyer \dollars{14400} par an, prix \dollars{288000}, construction \num{1000} logements par an, stock \num{100000} logements) ; le rectangle en tirets est le nouvel équilibre après une baisse du taux de capitalisation de 5 à 4 \%, et le pointillé montre la réaction de court terme, lorsque le stock n'a pas encore bougé : le prix bondit à \dollars{360000} et la construction à \num{2500} logements par an. À long terme, le stock s'accroît, le loyer baisse et le prix revient près de son niveau initial.}\label{fig:3:quadrants}
62+\figsource{\synth{analysis/python/figures/ch03\_quadrants.py ; paramètres pédagogiques de analysis/python/cases/ch03\_cycles.py}}
63+\end{figure}
64+
65+\subsection{L'équilibre stationnaire en forme fermée}
66+
67+Les quatre relations forment une boucle : le stock détermine le loyer, le loyer détermine le prix, le prix détermine la construction, la construction détermine le stock. L'équilibre de long terme est le point où cette boucle se referme sur elle-même.
68+
69+\begin{proposition}{Équilibre stationnaire des quatre quadrants}{3:equilibre}
70+Avec la demande \eqref{eq:3:demande}, la capitalisation \eqref{eq:3:actifs}, l'offre de construction \eqref{eq:3:construction} et la condition stationnaire $C = \delta S$, le stock d'équilibre de long terme est
71+\begin{equation}\label{eq:3:stock-equilibre}
72+S^{*} = \frac{a - b\,i\,c_0}{1 + b\,i\,c_1\,\delta},
73+\end{equation}
74+et les autres variables s'en déduisent : $R^{*} = (a - S^{*})/b$, $P^{*} = R^{*}/i$ et $C^{*} = \delta S^{*}$. Le stock d'équilibre croît avec la demande $a$ et décroît avec le taux de capitalisation $i$, le seuil de coût $c_0$, la pente de l'offre $c_1$ et le taux de retrait $\delta$.
75+\end{proposition}
76+\begin{proof}
77+En régime stationnaire, $S = C/\delta = (P - c_0)/(c_1\delta) = (R/i - c_0)/(c_1\delta)$ et $R = (a - S)/b$. En substituant, $S\,c_1\delta = (a - S)/(bi) - c_0$, soit $S\,(c_1\delta + 1/(bi)) = a/(bi) - c_0$. En multipliant les deux membres par $bi$, on obtient \eqref{eq:3:stock-equilibre}. Les signes des dérivées partielles se lisent directement : le numérateur décroît avec $i$ et $c_0$, le dénominateur croît avec $i$, $c_1$ et $\delta$.
78+\end{proof}
79+
80+Le modèle est illustré tout au long du chapitre par un \emph{marché type} dont les paramètres sont pédagogiques et déclarés : un stock initial de \num{100000} logements, un loyer de \dollars{1200} par mois, soit \dollars{14400} par an, proche du loyer moyen de \dollars{1227} relevé par la SCHL dans la RMR de Québec en octobre 2025 \parencite{schlLocatif2025}, un taux de capitalisation de \pct{5}, à l'intérieur de la fourchette de 4,25 à 6,00 \% publiée par CBRE pour le multirésidentiel de Québec au troisième trimestre de 2026 \parencite{cbrecaprates2026q3}, un taux de retrait de \pct{1} par an et une élasticité-prix de la demande d'espace de $-0{,}5$ au point initial. Ces deux derniers paramètres ne sont pas estimés sur données québécoises ; ils fixent des ordres de grandeur plausibles. On en déduit $b = -\eta S_0/R_0 = 3{,}472$ logements par dollar de loyer annuel, $a = \num{150000}$, un prix initial $P_0 = \dollars{288000}$ par logement et une construction stationnaire $C_0 = \delta S_0 = \num{1000}$ logements par an. Le seuil de coût est fixé à $c_0 = \dollars{240000}$, et la pente $c_1 = (P_0 - c_0)/C_0 = 48$ dollars par logement et par unité de rythme annuel est celle qui rend l'état initial stationnaire. L'\cref{eq:3:stock-equilibre} redonne alors exactement $S^{*} = \num{100000}$, ce que le script \texttt{analysis/python/cases/ch03\_cycles.py} vérifie aussi par itération de point fixe.
81+
82+\subsection{Statique comparative : taux, demande, coûts}
83+
84+La force du modèle tient à ce qu'il distingue la réaction de court terme, lorsque le stock est fixe, de l'équilibre de long terme, lorsque la construction a fait son œuvre. Le \cref{tab:3:statique} présente trois chocs appliqués au marché type.
85+
86+\begin{table}[htbp]
87+\caption{Statique comparative du marché type : réaction de court terme (stock fixe) et équilibre de long terme}\label{tab:3:statique}
88+\centering
89+\small
90+\begin{tabular}{lS[table-format=6.0]S[table-format=6.0]S[table-format=6.0]S[table-format=6.0]S[table-format=6.0]S[table-format=4.0]}
91+\toprule
92+ & \multicolumn{2}{c}{Court terme} & \multicolumn{4}{c}{Long terme} \\
93+\cmidrule(lr){2-3}\cmidrule(lr){4-7}
94+Choc & {$R$ (\$/an)} & {$P$ (\$)} & {$S$ (log.)} & {$R$ (\$/an)} & {$P$ (\$)} & {$C$ (log./an)} \\
95+\midrule
96+Référence ($i$ = 5 \%, $a$ = 150 000, $c_0$ = 240 000 \$) & 14400 & 288000 & 100000 & 14400 & 288000 & 1000 \\
97+Taux de capitalisation : 5 \% $\to$ 4 \% & 14400 & 360000 & 109375 & 11700 & 292500 & 1094 \\
98+Demande $a$ : +10 \% & 18720 & 374400 & 113846 & 14732 & 294646 & 1138 \\
99+Seuil de coût $c_0$ : +10 \% & 14400 & 288000 & 96154 & 15508 & 310154 & 962 \\
100+\bottomrule
101+\end{tabular}
102+\tabsource{\synth{analysis/python/cases/ch03\_cycles.py, fonction \texttt{statique\_comparative}}}
103+\end{table}
104+
105+La baisse du taux de capitalisation de 5 à 4 \% est le choc le plus instructif pour l'évaluateur. À court terme, rien ne change sur le marché de l'espace : le stock et le loyer sont inchangés, et le prix bondit mécaniquement de \dollars{288000} à \dollars{360000}, soit \pct{25}, parce que les investisseurs capitalisent le même loyer à un taux plus bas. La construction réagit à ce prix : elle passe de \num{1000} à \num{2500} logements par an. Mais à mesure que ces logements s'ajoutent au stock, le loyer baisse, et avec lui le prix. À l'équilibre de long terme, le stock a crû de \pct{9.4}, le loyer a reculé de \pct{18.75} et le prix ne dépasse plus que de \pct{1.56} son niveau initial. Le modèle dit donc qu'une baisse durable des taux se traduit d'abord par une hausse des prix, puis par une hausse du stock et une baisse des loyers, le prix revenant près du coût de construction. La hausse initiale des prix n'est pas une erreur du marché ; c'est le signal qui déclenche la construction. Mais un évaluateur qui extrapolerait le prix de court terme comme s'il était permanent se tromperait sur le long terme, et un investisseur qui achèterait au sommet en comptant sur la stabilité des loyers découvrirait que c'est précisément la hausse des prix qui prépare la baisse des loyers.
106+
107+Le choc de demande de \pct{10} produit la séquence inverse par son origine mais semblable par sa forme : à court terme, le loyer et le prix bondissent de \pct{30}, parce que l'élasticité de la demande est faible ; à long terme, le stock a crû de \pct{13.8} et le loyer n'est plus que \pct{2.3} au-dessus de son niveau initial. Enfin, la hausse de \pct{10} du seuil de coût ne change rien à court terme, puisque le stock et la demande sont inchangés, mais réduit le stock de long terme de \pct{3.8} et relève le loyer et le prix d'équilibre de \pct{7.7} : les coûts de construction se transmettent aux prix de l'ensemble du parc, neuf et ancien, par le canal de l'offre nouvelle. C'est la raison pour laquelle le \cref{ch:21} insiste sur la mesure du coût de remplacement neuf même pour des immeubles anciens : il borne le prix de long terme de tous les substituts.
108+
109+\begin{pratique}
110+Le modèle des quatre quadrants fournit à l'évaluateur une grille de lecture de la « conjoncture » qu'il doit décrire dans son rapport. Un prix élevé par rapport au loyer signale un taux de capitalisation bas, donc une dépendance du prix aux taux d'intérêt ; un prix élevé par rapport au coût de construction signale une offre à venir ; un loyer qui monte avec un stock stable signale une pression de demande que l'offre n'a pas encore rejointe. La date d'évaluation fixe le point du cycle ; les ajustements de conditions du marché du \cref{ch:17} corrigent les ventes antérieures jusqu'à cette date, et la fourchette de valeur du \cref{ch:20} doit être d'autant plus large que le marché est loin de son équilibre de long terme.
111+\end{pratique}
112+
113+\section{Élasticités de l'offre et contraintes}\label{sec:3:elasticites}
114+
115+\subsection{Mesurer la réactivité de l'offre}
116+
117+L'\motcle{élasticité de l'offre} mesure la variation relative de la quantité offerte pour une variation relative du prix. Dans le modèle des quatre quadrants, on peut la définir à deux horizons. À court terme, l'élasticité de la construction au prix, au point initial, est
118+\begin{equation}\label{eq:3:elasticite}
119+\varepsilon_C = \frac{\dd C}{\dd P}\,\frac{P}{C} = \frac{1}{c_1}\,\frac{P_0}{C_0} = \frac{P_0}{P_0 - c_0},
120+\end{equation}
121+soit $288\,000/48\,000 = 6$ pour le marché type : une hausse de \pct{1} du prix accroît le rythme de construction de \pct{6}, ce qui est beaucoup, parce que la marge entre le prix et le seuil de coût est étroite. La réactivité de l'offre à l'échelle du stock est mieux résumée par le paramètre composite
122+\begin{equation}\label{eq:3:kappa}
123+\kappa = \frac{1}{b\,i\,c_1},
124+\end{equation}
125+qui apparaîtra dans la dynamique de la \cref{sec:3:cycles} : il mesure la fraction d'un écart de stock que la construction comble en une année, en passant par la chaîne loyer, prix, construction. Pour le marché type, $\kappa = 0{,}12$. Enfin, l'élasticité du stock stationnaire par rapport à la taille de la demande, calculée à partir de l'\cref{eq:3:stock-equilibre}, vaut $1{,}385$ : à long terme, le stock réagit plus que proportionnellement à la demande parce que le loyer d'équilibre baisse à mesure que le stock croît. Ces trois mesures renvoient à des horizons différents, et l'on ne peut pas comparer des élasticités publiées sans savoir laquelle est mesurée.
126+
127+\subsection{Les déterminants de l'élasticité}
128+
129+Qu'est-ce qui rend l'offre d'une région plus ou moins réactive ? \textcite{saiz2010} a montré, pour les aires métropolitaines américaines, que la géographie est un déterminant de premier ordre : la part du territoire rendue inconstructible par les plans d'eau, les océans et les pentes fortes dans un rayon de la ville centre réduit l'élasticité de l'offre, et cette contrainte physique renforce la contrainte réglementaire, les régions géographiquement contraintes étant aussi celles qui réglementent le plus. La réglementation de l'usage du sol, le zonage, les délais d'approbation et les redevances agissent sur le seuil $c_0$ et sur la pente $c_1$ de l'\cref{eq:3:construction}. Le coût des matériaux et de la main-d'œuvre, mesuré au Québec par l'indice des prix de la construction de bâtiments dont le \cref{ch:21} analyse la hausse de \pct{8.6} sur un an à Montréal, agit sur $c_0$. Le \cref{tab:3:determinants} classe ces déterminants selon le paramètre qu'ils affectent et le sens de leur effet.
130+
131+\begin{table}[htbp]
132+\caption{Déterminants de l'élasticité de l'offre de logements et paramètre du modèle qu'ils affectent}\label{tab:3:determinants}
133+\centering
134+\small
135+\begin{tabularx}{\textwidth}{lYcc}
136+\toprule
137+Déterminant & Mécanisme & Paramètre & Effet sur l'élasticité \\
138+\midrule
139+Plans d'eau, pentes fortes, zones inondables & Terrain constructible rare ; coût marginal du terrain croissant & $c_1$ $\uparrow$ & $\downarrow$ \\
140+Zone agricole protégée, périmètre d'urbanisation & Offre de terrain bornée par la réglementation & $c_1$ $\uparrow$ & $\downarrow$ \\
141+Zonage restrictif, hauteurs, densités, stationnement & Moins de logements par terrain ; coût par logement plus élevé & $c_0$ $\uparrow$, $c_1$ $\uparrow$ & $\downarrow$ \\
142+Délais d'approbation, consultations, référendums & Horizon $L$ plus long ; risque et coût de portage & $L$ $\uparrow$, $c_0$ $\uparrow$ & $\downarrow$ (et cycles plus amples) \\
143+Coût des matériaux et de la main-d'œuvre & Seuil de rentabilité relevé & $c_0$ $\uparrow$ & $\downarrow$ à prix donné \\
144+Capacité de l'industrie (entrepreneurs, grues, ouvriers) & Coût marginal croissant du rythme & $c_1$ $\uparrow$ & $\downarrow$ \\
145+Terrains intercalaires, requalification, densification douce & Nouvelle offre de terrain à coût modéré & $c_1$ $\downarrow$ & $\uparrow$ \\
146+\bottomrule
147+\end{tabularx}
148+\tabsource{synthèse de l'auteur d'après \textcite{saiz2010}, \textcite{glaeserGyourkoSaiz2008} et \textcite{dipasqualeWheaton1996} ; classement qualitatif, aucune valeur numérique d'élasticité n'est reproduite.}
149+\end{table}
150+
151+\begin{quebec}
152+Les contraintes recensées au \cref{tab:3:determinants} ont des traductions concrètes au Québec. Le fleuve Saint-Laurent, les rivières des Outaouais et Saint-Charles, le mont Royal et les zones inondables cartographiées par le gouvernement \parencite{zonesInond2026} bornent physiquement les trois grandes agglomérations. La Loi sur la protection du territoire et des activités agricoles \parencite{lptaa} soustrait à l'urbanisation la zone agricole, dont la Commission de protection du territoire agricole du Québec \parencite{cptaq} autorise les exclusions au compte-gouttes ; elle fait de la périphérie de Montréal et de Québec un territoire à offre bornée. La Loi sur l'aménagement et l'urbanisme \parencite{lau} confie aux municipalités le zonage, les densités et les procédures d'approbation que le \cref{ch:8} détaille. Ces institutions ne figent pas l'offre, mais elles la rendent moins élastique qu'elle ne le serait sur un territoire ouvert, et elles orientent sa forme : comme le montre la \cref{sec:3:cycles}, la construction québécoise s'est déplacée massivement de la maison individuelle vers l'appartement.
153+\end{quebec}
154+
155+\subsection{Élasticité, prix et bulles}
156+
157+\textcite{glaeserGyourkoSaiz2008} ont tiré de la relation entre élasticité et cycles une conclusion qui éclaire la lecture des marchés régionaux. Lorsque des anticipations optimistes relèvent la demande d'actifs, les régions à offre inélastique connaissent des hausses de prix fortes et longues, parce que l'offre ne vient pas les contenir ; les régions à offre élastique connaissent des hausses de prix plus courtes et plus modestes, mais une vague de construction qui laisse ensuite un excédent de logements et une baisse des prix. L'élasticité détermine donc si un choc de demande se résout par les prix ou par les quantités. L'asymétrie de \textcite{glaeserGyourko2005} s'y ajoute : dans la région élastique, l'excédent construit pendant l'emballement ne disparaît pas quand la demande se retire, et la baisse des prix peut être durable. Pour l'évaluateur, la conséquence pratique est que la volatilité attendue d'une valeur dépend du marché où se trouve le bien : à prix égal, un logement dans un marché contraint est exposé à des variations de prix plus fortes, et un logement dans un marché élastique est exposé à une concurrence de l'offre neuve qui plafonne sa valeur au coût de remplacement. La perspective historique de \textcite{knollSchularickSteger2017}, qui attribuent la hausse séculaire des prix réels des logements dans quatorze pays depuis 1870 presque entièrement au prix des terrains, et la décomposition de \textcite{davisHeathcote2007}, qui montrent que la volatilité des prix des maisons américaines vient du terrain et non de la structure, convergent vers la même idée : la composante inélastique du logement, le sol, est celle qui porte le cycle.
158+
159+\section{Cycles : mises en chantier, inoccupation naturelle et prix}\label{sec:3:cycles}
160+
161+\subsection{Pourquoi l'ajustement engendre des cycles}
162+
163+Le modèle des quatre quadrants décrit où va le marché ; il ne dit pas comment il y va. \textcite{wheaton1999} a montré que la trajectoire dépend de trois choses : le délai de livraison, la réactivité de l'offre et la manière dont les acteurs forment leurs anticipations. Lorsque les promoteurs décident de construire sur la base du prix courant et que les logements ne sont livrés que plusieurs trimestres plus tard, l'offre répond à une demande qui n'existe plus : la construction décidée au sommet des loyers arrive quand les loyers ont commencé à baisser, elle accentue la baisse, puis l'absence de mises en chantier pendant la baisse prépare la pénurie suivante. Des anticipations rationnelles, qui tiendraient compte des logements en construction, amortiraient ces oscillations ; des anticipations myopes ou extrapolatives les amplifient. L'analyse empirique de \textcite{sivitanidesTortoWheaton2003} sur les marchés commerciaux américains conclut que les taux de capitalisation eux-mêmes se comportent de façon extrapolative, ce qui ajoute au cycle de l'espace un cycle des actifs.
164+
165+Le marché de l'espace n'est pas non plus un marché d'enchères qui se vide à chaque période. Il existe un \motcle{taux d'inoccupation naturel} $v^{*}$, fraction du stock qui demeure vacante en régime normal parce que les ménages déménagent, que les logements se libèrent et se relouent avec délai, et que les propriétaires préfèrent une vacance courte à une baisse immédiate du loyer. Lorsque l'inoccupation observée $v_t$ est inférieure au taux naturel, les loyers montent ; lorsqu'elle lui est supérieure, ils baissent. La forme la plus simple de cet ajustement est proportionnelle,
166+\begin{equation}\label{eq:3:loyer}
167+\frac{R_{t+1} - R_t}{R_t} = -\lambda\,(v_t - v^{*}), \qquad v_t = 1 - \frac{D_t}{S_t},
168+\end{equation}
169+où $\lambda$ mesure la vitesse de réaction des loyers à un point d'inoccupation excédentaire. Cette équation, qui remonte aux travaux sur les marchés de bureaux des années 1980 et que \textcite{dipasqualeWheaton1996} présentent pour le logement, introduit un second délai dans le système : même sans construction, le loyer ne saute pas à son niveau d'équilibre, il s'y rend graduellement.
170+
171+\subsection{Un modèle dynamique et sa condition d'oscillation}
172+
173+Réunissons les éléments. En temps discret annuel, avec un délai de livraison $L$, la construction décidée en $t$ s'ajoute au stock en $t + L$ : $S_{t+1} = (1 - \delta) S_t + C_{t-L+1}$. En substituant la chaîne loyer, prix, construction du modèle statique, on obtient une équation aux différences linéaire pour le stock,
174+\begin{equation}\label{eq:3:dynamique}
175+S_{t+1} = (1 - \delta)\,S_t + \kappa\,(a - S_{t-L}) - \frac{c_0}{c_1}, \qquad \kappa = \frac{1}{b\,i\,c_1},
176+\end{equation}
177+où $\kappa$ est la réactivité définie par l'\cref{eq:3:kappa}. Le comportement de cette équation dépend des racines de son polynôme caractéristique.
178+
179+\begin{proposition}{Condition d'oscillation du modèle stock-flux}{3:oscillation}
180+Pour un délai d'un an ($L = 1$), l'\cref{eq:3:dynamique} a pour polynôme caractéristique $r^{2} - (1 - \delta)\,r + \kappa = 0$. Le stock converge sans oscillation si $\kappa \le (1 - \delta)^{2}/4$ ; il oscille autour de l'équilibre si $\kappa > (1 - \delta)^{2}/4$, avec un module $\sqrt{\kappa}$ et une période de
181+\begin{equation}\label{eq:3:periode}
182+T = \frac{2\pi}{\arccos\!\left(\dfrac{1 - \delta}{2\sqrt{\kappa}}\right)}
183+\end{equation}
184+années ; les oscillations sont amorties si $\kappa < 1$ et explosives si $\kappa > 1$. Pour un délai $L$ quelconque, le polynôme devient $r^{L+1} - (1 - \delta)\,r^{L} + \kappa = 0$ et, à $\kappa$ donné, l'allongement du délai accroît le module de la racine dominante et allonge la période.
185+\end{proposition}
186+\begin{proof}
187+En posant $s_t = S_t - S^{*}$, l'écart à l'équilibre stationnaire, l'\cref{eq:3:dynamique} devient homogène : $s_{t+1} = (1 - \delta)\,s_t - \kappa\,s_{t-L}$. On cherche des solutions de la forme $s_t = r^{t}$, d'où $r^{L+1} - (1 - \delta)\,r^{L} + \kappa = 0$. Pour $L = 1$, le discriminant est $(1 - \delta)^{2} - 4\kappa$ ; les racines sont complexes conjuguées lorsqu'il est négatif, et leur produit vaut $\kappa$, de sorte que leur module commun est $\sqrt{\kappa}$. En écrivant $r = \sqrt{\kappa}\,e^{\pm i\theta}$, la somme des racines $2\sqrt{\kappa}\cos\theta = 1 - \delta$ donne $\theta$, et la période est $2\pi/\theta$. La solution générale $s_t = A\,\kappa^{t/2}\cos(\theta t + \varphi)$ converge si $\sqrt{\kappa} < 1$. Pour $L > 1$, le résultat sur le module s'obtient numériquement ; le script du chapitre le calcule par les racines du polynôme.
188+\end{proof}
189+
190+Pour le marché type ($\delta = 0{,}01$), le seuil d'oscillation est $(1-\delta)^{2}/4 = 0{,}245$. Avec la pente d'offre $c_1 = 48$, la réactivité $\kappa = 0{,}12$ est inférieure au seuil : le stock converge de façon monotone, avec une racine dominante de module $0{,}849$. Si l'offre est quatre fois plus réactive, $c_1 = 12$ et $\kappa = 0{,}48$, les racines sont complexes, de module $0{,}693$, et la période des oscillations est de $8{,}1$ ans pour un délai d'un an, de $10{,}7$ ans pour un délai de deux ans, avec un module qui passe à $0{,}928$ ; à trois ans de délai, le module dépasse l'unité et le système devient instable. Une offre très réactive combinée à des délais longs est la recette des cycles amples et persistants ; une offre peu réactive donne des marchés qui s'ajustent lentement mais sans excès. C'est le résultat central de \textcite{wheaton1999}, et il renverse une intuition courante : ce ne sont pas les marchés contraints qui « cyclent » le plus par les quantités, ce sont les marchés élastiques ; les marchés contraints, eux, cyclent par les prix.
191+
192+\subsection{Simulation d'un cycle}
193+
194+\begin{synthetique}
195+La simulation de cette sous-section est synthétique. Elle est produite par la fonction \texttt{simuler\_cycle} du script \texttt{analysis/python/cases/ch03\_cycles.py}, qui est déterministe (aucun tirage aléatoire ; la graine conventionnelle de l'ouvrage, 20261031, n'intervient pas). Le marché type trimestriel reprend les paramètres de la \cref{sec:3:quadrants} avec une pente d'offre $c_1 = 12$ (réactivité $\kappa = 0{,}48$), le seuil de coût étant recalibré à $c_0 = \dollars{276000}$ pour que l'état initial soit stationnaire ; un taux d'inoccupation naturel $v^{*} = \pct{3}$, entre les taux de 2,4 \% et 2,9 \% observés par la SCHL dans les RMR de Québec et de Montréal en octobre 2025 \parencite{schlLocatif2025} ; une vitesse d'ajustement des loyers $\lambda = 0{,}75$ par trimestre ; un délai de livraison $L = 6$ trimestres. Le choc est une hausse permanente de \pct{6} de la demande, étalée linéairement sur douze trimestres à partir du huitième. Ces valeurs sont des hypothèses pédagogiques, non des estimations ; elles ne décrivent aucun marché réel.
196+\end{synthetique}
197+
198+La \cref{fig:3:cycle} montre la réponse du marché type. La montée de la demande fait d'abord tomber l'inoccupation, de \pct{3} à un creux de \pct{1.17}, parce que le stock ne bouge pas tant que les chantiers décidés en réaction ne sont pas livrés. Les loyers montent en réponse à la pénurie et culminent à \pct{15.0} au-dessus de leur nouveau niveau stationnaire, treize trimestres après le début du choc ; le prix suit le loyer, et les mises en chantier, qui réagissent au prix, atteignent un rythme annuel de \num{4711} logements, soit plus de quatre fois le rythme stationnaire de \num{1089}. Puis les livraisons affluent : le stock dépasse la demande, l'inoccupation grimpe jusqu'à \pct{5.0}, les loyers refluent et passent sous leur niveau d'équilibre, atteignant un creux de \pct{7.0} en deçà trente-cinq trimestres après le début du choc. Les mises en chantier s'arrêtent complètement pendant plusieurs années, le stock se résorbe par les retraits et par la croissance de la demande, et un second cycle, d'amplitude réduite à \pct{17} du premier, s'amorce. La période du cycle est d'environ 47 trimestres, soit près de douze ans. Tous les éléments d'un cycle immobilier observé sont là : la pénurie qui précède la hausse des loyers, la vague de construction qui arrive en retard, la surabondance qui suit, l'arrêt des chantiers et le retour lent à l'équilibre.
199+
200+\begin{figure}[htbp]
201+\centering
202+\includegraphics[width=\textwidth]{ch03/ch03-fig-cycle-simule.pdf}
203+\caption{Simulation d'un cycle stock-flux dans le marché type après une hausse permanente de 6 \% de la demande étalée sur trois ans (zone grisée) : A, le stock rattrape puis dépasse la demande occupée ; B, l'inoccupation tombe sous son taux naturel de 3 \%, puis le dépasse ; C, le loyer culmine à 15 \% au-dessus de son nouveau niveau stationnaire avant de passer 7 \% en deçà ; D, les mises en chantier bondissent puis s'arrêtent complètement pendant plusieurs années.}\label{fig:3:cycle}
204+\figsource{\synth{analysis/python/figures/ch03\_cycle.py ; paramètres pédagogiques, simulation déterministe}}
205+\end{figure}
206+
207+\subsection{Sensibilité du cycle au délai et à la réactivité}
208+
209+La \cref{fig:3:sensibilite} et le \cref{tab:3:sensibilite} font varier les deux paramètres que la \cref{prop:3:oscillation} désigne comme décisifs. Avec un délai de deux trimestres, le loyer ne dépasse son équilibre que de \pct{12.0} et ne passe que \pct{1.2} en deçà : le marché s'ajuste presque sans excès, parce que l'offre arrive avant que les loyers n'aient eu le temps de s'emballer. Avec un délai de douze trimestres, caractéristique des tours d'habitation, le dépassement atteint \pct{16.9} et le creux \pct{18.1}, la période s'allonge à 76 trimestres et l'amortissement d'un cycle à l'autre faiblit. La réactivité de l'offre agit dans le même sens : avec $\kappa = 0{,}12$, le loyer monte de \pct{15.1} mais ne repasse jamais sous son équilibre, parce que l'offre ne construit pas assez pour créer un excédent ; avec $\kappa = 0{,}24$, un léger creux de \pct{1.0} apparaît ; avec $\kappa = 0{,}48$, le cycle complet se déploie. La vitesse d'ajustement des loyers $\lambda$ a un effet plus modeste et ambigu : des loyers plus réactifs montent plus vite et plus haut, mais raccourcissent la période et réduisent la pointe d'inoccupation.
210+
211+\begin{table}[htbp]
212+\caption{Sensibilité du cycle simulé au délai de livraison $L$ et à la réactivité de l'offre $\kappa$ ($\lambda = 0{,}75$ ; écarts du loyer à son niveau stationnaire final)}\label{tab:3:sensibilite}
213+\centering
214+\small
215+\begin{tabular}{S[table-format=2.0]S[table-format=1.2]S[table-format=2.1]S[table-format=-2.1]S[table-format=1.1]S[table-format=4.0]S[table-format=2.0]S[table-format=1.2]}
216+\toprule
217+{$L$ (trim.)} & {$\kappa$} & {Pointe du loyer (\%)} & {Creux du loyer (\%)} & {Inoccupation max. (\%)} & {Chantiers max. (log./an)} & {Période (trim.)} & {Amortissement} \\
218+\midrule
219+2 & 0.48 & 12.0 & -1.2 & 4.5 & 3985 & 39 & 0.01 \\
220+6 & 0.48 & 15.0 & -7.0 & 5.0 & 4711 & 47 & 0.17 \\
221+12 & 0.48 & 16.9 & -18.1 & 5.4 & 5156 & 76 & 0.28 \\
222+6 & 0.24 & 15.4 & -1.0 & 4.0 & 2942 & 70 & 0.00 \\
223+6 & 0.12 & 15.1 & 0.5 & 3.5 & 2001 & {---} & {---} \\
224+12 & 0.12 & 15.8 & -0.2 & 3.6 & 2047 & {---} & {---} \\
225+\bottomrule
226+\end{tabular}
227+\tabsource{\synth{analysis/python/cases/ch03\_cycles.py, fonction \texttt{sensibilite\_cycle} ; l'amortissement est le rapport de la seconde pointe à la première ; « --- » : aucun second cycle}}
228+\end{table}
229+
230+\begin{figure}[htbp]
231+\centering
232+\includegraphics[width=\textwidth]{ch03/ch03-fig-cycle-sensibilite.pdf}
233+\caption{Trajectoire du loyer après le choc de demande selon le délai de livraison (A) et la réactivité de l'offre (B). Les délais longs creusent le cycle et l'allongent ; une offre peu réactive ($\kappa$ = 0,12) s'ajuste lentement mais sans jamais passer sous l'équilibre.}\label{fig:3:sensibilite}
234+\figsource{\synth{analysis/python/figures/ch03\_cycle.py}}
235+\end{figure}
236+
237+\subsection{Le cycle québécois des mises en chantier}
238+
239+Les données réelles ne reproduisent pas la régularité d'une simulation, mais elles en portent les traces. La \cref{fig:3:chantiers} présente les logements mis en chantier au Québec depuis 1990, d'après le tableau 34-10-0135-01 de Statistique Canada, qui diffuse les relevés trimestriels de la SCHL pour toutes les régions \parencite{statcanmiseschantier}. La série décrit trois grands mouvements. Le creux du milieu des années 1990, avec \num{21885} mises en chantier en 1995, suit une période de taux d'intérêt élevés et de faible croissance démographique. La reprise des années 2000 porte la construction à \num{58448} logements en 2004, puis la maintient autour de \num{50000} jusqu'en 2012, avant un repli vers \num{38000} au milieu de la décennie 2010. Le troisième mouvement est le plus brutal : de \num{54066} en 2020, les mises en chantier bondissent à \num{67810} en 2021, record de la période, sous l'effet des taux d'intérêt historiquement bas et d'une demande soutenue, puis s'effondrent à \num{38912} en 2023, soit une baisse de \pct{42.6} en deux ans, au moment même où la pénurie de logements locatifs était la plus aiguë. Elles remontent ensuite à \num{48713} en 2024 et à \num{59864} en 2025, et les trois premiers trimestres de 2026 totalisent \num{42159} logements.
240+
241+\begin{figure}[htbp]
242+\centering
243+\includegraphics[width=\textwidth]{ch03/ch03-fig-mises-chantier-quebec.pdf}
244+\caption{A : logements mis en chantier au Québec, toutes régions, 1990-2026 (totaux annuels et somme mobile sur quatre trimestres ; 2026 compte trois trimestres), avec la période de resserrement monétaire de mars 2022 à juillet 2023 en grisé. B : composition par type d'unité ; la part des maisons individuelles passe de 47 \% en 2005 à 14 \% en 2025.}\label{fig:3:chantiers}
245+\figsource{Statistique Canada, tableau 34-10-0135-01 (SCHL), données trimestrielles non désaisonnalisées, consulté le 2026-10-31 ; Banque du Canada, série V39079 pour la période de resserrement ; calculs de l'auteur (analysis/python/figures/ch03\_mises\_chantier.py).}
246+\end{figure}
247+
248+L'effondrement de 2022-2023 illustre le canal du prix des actifs du modèle des quatre quadrants. Le \cref{tab:3:directeur} retrace la trajectoire du taux directeur de la Banque du Canada : abaissé à \pct{0.25} en mars 2020, il a été relevé dix fois entre mars 2022 et juillet 2023, de 475 points de base au total, jusqu'à \pct{5.00}, puis abaissé neuf fois entre juin 2024 et octobre 2025, jusqu'à \pct{2.25}, avant une première hausse de 25 points de base le 28 octobre 2026 qui l'a porté à \pct{2.50} \parencite{bdcvalet,bdc20261028}. La hausse des taux a relevé le taux de capitalisation exigé et le coût du financement des promoteurs, ce qui, dans le troisième quadrant, a réduit l'écart entre le prix et le coût de construction, lui-même en forte hausse, et donc la construction, alors même que la demande d'espace restait forte et que l'inoccupation tombait. Le rebond de 2024-2025 suit la détente monétaire avec le délai que le modèle prévoit. La composition des mises en chantier, au panneau B, montre une transformation structurelle qui se superpose au cycle : en 2005, \num{23930} maisons individuelles représentaient \pct{47.0} des \num{50910} logements mis en chantier ; en 2025, \num{8477} maisons individuelles n'en représentent plus que \pct{14.2}, et les logements collectifs, appartements, jumelés et maisons en rangée, en représentent \num{51387}, soit \pct{85.8}. Le \cref{tab:3:types} détaille cette évolution. Elle traduit la rareté croissante du terrain constructible dans les agglomérations, la réglementation favorisant la densification et l'évolution des coûts ; elle allonge aussi le délai moyen de livraison, puisque les appartements se construisent plus lentement que les maisons, ce qui, d'après la \cref{sec:3:cycles}, accroît l'amplitude potentielle des cycles.
249+
250+\begin{table}[htbp]
251+\caption{Logements mis en chantier au Québec par type d'unité, années choisies (toutes régions)}\label{tab:3:types}
252+\centering
253+\small
254+\begin{tabular}{lS[table-format=5.0]S[table-format=5.0]S[table-format=5.0]S[table-format=5.0]S[table-format=2.1]}
255+\toprule
256+Année & {Total} & {Maisons individuelles} & {Jumelés et en bande} & {Appartements et autres} & {Part des individuelles (\%)} \\
257+\midrule
258+1990 & 48070 & 24942 & 4830 & 18298 & 51.9 \\
259+2005 & 50910 & 23930 & 3752 & 23228 & 47.0 \\
260+2015 & 37926 & 9698 & 3895 & 24333 & 25.6 \\
261+2021 & 67810 & 14826 & 5105 & 47879 & 21.9 \\
262+2023 & 38912 & 8601 & 2342 & 27969 & 22.1 \\
263+2025 & 59864 & 8477 & 3716 & 47671 & 14.2 \\
264+\bottomrule
265+\end{tabular}
266+\tabsource{Statistique Canada, tableau 34-10-0135-01 (SCHL), sommes annuelles des données trimestrielles non désaisonnalisées, consulté le 2026-10-31 ; calculs de l'auteur (\texttt{mises\_en\_chantier\_annuelles}).}
267+\end{table}
268+
269+\begin{table}[htbp]
270+\caption{Trajectoire du taux cible du financement à un jour de la Banque du Canada, 2020-2026 (dates d'effet dans la série Valet, lendemain de l'annonce)}\label{tab:3:directeur}
271+\centering
272+\small
273+\begin{tabular}{llS[table-format=1.2]S[table-format=1.2]S[table-format=-3.0]}
274+\toprule
275+Phase & Dates & {Taux initial (\%)} & {Taux final (\%)} & {Variation (pb)} \\
276+\midrule
277+Détente pandémique (3 baisses) & 4 mars 2020 -- 27 mars 2020 & 1.75 & 0.25 & -150 \\
278+Resserrement (10 hausses) & 3 mars 2022 -- 13 juillet 2023 & 0.25 & 5.00 & 475 \\
279+Détente (9 baisses) & 6 juin 2024 -- 30 octobre 2025 & 5.00 & 2.25 & -275 \\
280+Première hausse du cycle suivant & 29 octobre 2026 & 2.25 & 2.50 & 25 \\
281+\bottomrule
282+\end{tabular}
283+\tabsource{Banque du Canada, série V39079 (API Valet), observations jusqu'au 2026-10-29, consultée le 2026-10-31 \parencite{bdcvalet,bdc20261028} ; calculs de l'auteur (\texttt{changements\_taux\_directeur}).}
284+\end{table}
285+
286+\begin{quebec}
287+L'inoccupation naturelle et l'ajustement des loyers de l'\cref{eq:3:loyer} se lisent dans l'Enquête sur les logements locatifs de la SCHL, menée chaque octobre dans les immeubles d'initiative privée de trois logements et plus. En octobre 2025, le taux d'inoccupation de la RMR de Québec était de \pct{2.4}, contre \pct{0.9} un an plus tôt, et celui de la RMR de Montréal de \pct{2.9}, contre \pct{2.1} ; le loyer moyen des logements de deux chambres avait progressé de \pct{6.1} à Québec et de \pct{7.2} à Montréal \parencite{schlLocatif2025}. Une inoccupation très inférieure à son niveau naturel, puis une hausse des loyers bien supérieure à l'inflation, puis une remontée de l'inoccupation à mesure que les livraisons de 2021-2022 arrivent sur le marché : c'est la séquence du panneau B de la \cref{fig:3:cycle}. Au Québec, toutefois, l'ajustement des loyers des logements occupés est encadré par les critères de fixation du Tribunal administratif du logement \parencite{talIndices2026}, de sorte que l'\cref{eq:3:loyer} décrit mieux les loyers des logements qui changent de locataire que ceux des baux reconduits ; le \cref{ch:34} analyse cette dualité et ses conséquences pour la valeur des immeubles.
288+\end{quebec}
289+
290+\section{Taux d'intérêt, coût d'usage et prix}\label{sec:3:coutusage}
291+
292+\subsection{L'arbitrage entre louer et posséder}
293+
294+Le marché des actifs du modèle des quatre quadrants capitalise le loyer à un taux $i$ sans dire d'où vient ce taux. Pour un logement occupé par son propriétaire, la relation entre le prix et le loyer d'un logement équivalent s'obtient par un raisonnement d'arbitrage que \textcite{poterba1984} a formalisé et que \textcite{himmelbergMayerSinai2005} ont popularisé comme instrument de diagnostic des marchés. Un ménage qui achète un logement de prix $P$ pour l'occuper pendant un an supporte le coût d'opportunité des fonds immobilisés, $iP$, qu'il s'agisse d'intérêts hypothécaires versés ou de rendement auquel il renonce sur sa mise de fonds ; il paie les taxes foncières, $\tau P$ ; il supporte l'entretien, la dépréciation et le risque de détenir un actif peu liquide, $\delta P$ ; et il bénéficie de la plus-value attendue, $gP$. Le \motcle{coût d'usage} annuel de la propriété est donc
295+\begin{equation}\label{eq:3:cout-usage}
296+u = P\,(i + \tau + \delta - g),
297+\end{equation}
298+et le ménage est indifférent entre louer et posséder lorsque ce coût égale le loyer $R$ d'un logement équivalent. À l'équilibre, il en résulte un ratio prix/loyer qui ne dépend que des taux,
299+\begin{equation}\label{eq:3:prix-loyer}
300+\frac{P}{R} = \frac{1}{i + \tau + \delta - g}.
301+\end{equation}
302+L'\cref{eq:3:prix-loyer} est l'\cref{eq:3:actifs} du marché des actifs, le taux de capitalisation $i$ de DiPasquale et Wheaton étant remplacé par le taux de coût d'usage $i + \tau + \delta - g$ ; elle reprend la formule introduite à la \cref{sec:1:actif} et lui donne un contenu empirique. Au Canada, contrairement aux États-Unis qu'étudie Poterba, les intérêts hypothécaires d'une résidence principale ne sont pas déductibles du revenu imposable, mais le gain en capital sur la résidence principale est exonéré ; le terme $i$ est donc un taux avant impôt, et le terme $g$ un gain net d'impôt, ce qui simplifie la formule par rapport à sa version américaine.
303+
304+\subsection{La sensibilité des prix aux taux}
305+
306+La conséquence la plus importante de l'\cref{eq:3:prix-loyer} pour l'évaluation tient à la petitesse du dénominateur. Si l'on différencie le logarithme du ratio prix/loyer par rapport au taux d'intérêt, à loyer donné,
307+\begin{equation}\label{eq:3:semi-elasticite}
308+\frac{\partial \ln (P/R)}{\partial i} = -\frac{1}{i + \tau + \delta - g},
309+\end{equation}
310+ce qui signifie qu'une hausse d'un point de pourcentage du taux réduit le prix d'équilibre d'un pourcentage égal à l'inverse du taux de coût d'usage. Lorsque ce taux est de \pct{8}, une hausse de 100 points de base fait baisser le prix d'environ \pct{12} ; lorsqu'il est de \pct{4}, la même hausse le fait baisser d'environ \pct{25}. \textcite{himmelbergMayerSinai2005} ont tiré de ce résultat une mise en garde : les marchés où le coût d'usage est bas, parce que les taux sont bas ou les anticipations de plus-value élevées, sont ceux où le prix est le plus sensible aux variations de taux, et un ratio prix/loyer élevé n'y est pas en soi le signe d'une bulle, mais le signe d'une exposition. Le \cref{ch:40} reprendra cette idée pour construire des tests de résistance.
311+
312+La variable la plus délicate de la formule est $g$, la plus-value anticipée. Si les ménages anticipent la poursuite de la hausse récente des prix, $g$ est élevé, le coût d'usage est bas et le prix d'équilibre est élevé : les anticipations extrapolatives sont autoréalisatrices à court terme, ce qui est la mécanique des bulles que décrivent \textcite{caseShiller2003} et \textcite{shiller2015}. Si les ménages anticipent une appréciation égale à l'inflation générale, ce qui est l'hypothèse la plus prudente et celle qui s'accorde avec la perspective historique de \textcite{knollSchularickSteger2017} sur le très long terme, $g$ est stable et le ratio prix/loyer varie surtout avec le taux d'intérêt réel. La \cref{fig:3:coutusage} applique ces deux hypothèses aux données québécoises.
313+
314+\subsection{Le coût d'usage au Québec, 2001-2026}
315+
316+La \cref{fig:3:coutusage} et le \cref{tab:3:coutusage} reconstituent mensuellement le taux de coût d'usage et le ratio prix/loyer qu'il implique, à partir de séries réelles : le taux hypothécaire affiché pour un terme de cinq ans par les banques à charte, série V80691335 de la Banque du Canada ; l'inflation sur douze mois de l'indice des prix à la consommation du Québec, tableau 18-10-0004-01 ; la croissance annualisée sur cinq ans de l'indice des prix des logements neufs du Québec, tableau 18-10-0205-01 \parencite{bdcvalet,statcanipc,statcanipln}. Les deux paramètres fiscaux et techniques sont fixés et déclarés : $\tau = \pct{0.825}$, somme du taux de la taxe foncière générale de la Ville de Québec pour les immeubles de un à cinq logements en 2026 (\num{0.7464} \$ par 100 \$) et de la taxe scolaire 2026-2027 (\num{0.07899} \$ par 100 \$), et $\delta = \pct{2.5}$ pour l'entretien, la dépréciation et la prime de risque, hypothèse pédagogique sans source empirique directe. Le taux affiché surestime le taux effectivement payé ; en août 2026, le taux effectif des fonds avancés pour un terme fixe de cinq ans et plus était de \pct{4.12} pour les prêts assurés et de \pct{4.58} pour les prêts non assurés, contre un taux affiché de \pct{6.19} \parencite{bdctauxhypothecaires2026}. La série du taux affiché a toutefois l'avantage de remonter à 2000 et d'être homogène ; le niveau du coût d'usage doit donc se lire comme une borne supérieure, et c'est sa variation dans le temps qui est instructive.
317+
318+\begin{figure}[htbp]
319+\centering
320+\includegraphics[width=\textwidth]{ch03/ch03-fig-cout-usage.pdf}
321+\caption{Coût d'usage du logement au Québec, janvier 2001 à septembre 2026. A : taux hypothécaire affiché 5 ans, rendement de l'obligation du Canada 5 ans, taux directeur et inflation de l'IPC du Québec sur douze mois. B : taux de coût d'usage $u = i + \tau + \delta - g$ sous deux hypothèses d'anticipation, $g$ égal à l'inflation courante ou à la croissance de l'IPLN sur cinq ans. C : ratio prix/loyer implicite $1/u$ (la courbe IPLN est tronquée à 40 en 2021-2022, lorsque $u$ approche de zéro). La zone grisée marque le resserrement monétaire de 2022-2023.}\label{fig:3:coutusage}
322+\figsource{Banque du Canada, API Valet, séries V80691335, BD.CDN.5YR.DQ.YLD et V39079, observations au 2026-10-29 ; Statistique Canada, tableaux 18-10-0004-01 et 18-10-0205-01, septembre 2026 ; consultés le 2026-10-31 ; paramètres $\tau$ = 0,825 \% et $\delta$ = 2,5 \% déclarés ; calculs de l'auteur (analysis/python/figures/ch03\_cout\_usage.py).}
323+\end{figure}
324+
325+\begin{table}[htbp]
326+\caption{Taux de coût d'usage et ratio prix/loyer implicite au Québec à six dates (taux hypothécaire affiché 5 ans ; $\tau$ = 0,825 \%, $\delta$ = 2,5 \%)}\label{tab:3:coutusage}
327+\centering
328+\small
329+\begin{tabular}{lS[table-format=1.2]S[table-format=1.2]S[table-format=1.2]S[table-format=1.2]S[table-format=1.2]S[table-format=2.1]S[table-format=1.2]S[table-format=2.1]}
330+\toprule
331+ & & & & & \multicolumn{2}{c}{$g$ = inflation IPC} & \multicolumn{2}{c}{$g$ = IPLN 5 ans} \\
332+\cmidrule(lr){6-7}\cmidrule(lr){8-9}
333+Mois & {Taux hyp. (\%)} & {Oblig. 5 ans (\%)} & {Inflation (\%)} & {IPLN 5 ans (\%)} & {$u$ (\%)} & {$P/R$} & {$u$ (\%)} & {$P/R$} \\
334+\midrule
335+Janvier 2001 & 7.79 & 5.22 & 2.76 & 1.63 & 8.35 & 12.0 & 9.49 & 10.5 \\
336+Janvier 2008 & 7.49 & 3.55 & 2.02 & 4.98 & 8.79 & 11.4 & 5.84 & 17.1 \\
337+Janvier 2012 & 5.29 & 1.31 & 2.84 & 3.42 & 5.78 & 17.3 & 5.19 & 19.3 \\
338+Juillet 2020 & 4.94 & 0.35 & 0.30 & 2.35 & 7.96 & 12.6 & 5.91 & 16.9 \\
339+Octobre 2023 & 7.04 & 4.23 & 4.16 & 6.58 & 6.21 & 16.1 & 3.79 & 26.4 \\
340+Septembre 2026 & 6.09 & 3.57 & 3.14 & 2.39 & 6.28 & 15.9 & 7.03 & 14.2 \\
341+\bottomrule
342+\end{tabular}
343+\tabsource{Banque du Canada (Valet : V80691335, BD.CDN.5YR.DQ.YLD, moyennes mensuelles) et Statistique Canada (18-10-0004-01, Québec, ensemble ; 18-10-0205-01, Québec, total maison et terrain), consultés le 2026-10-31 ; calculs de l'auteur (\texttt{serie\_cout\_usage}).}
344+\end{table}
345+
346+Trois lectures se dégagent. D'abord, sous l'hypothèse prudente d'une appréciation égale à l'inflation, le ratio prix/loyer d'équilibre est passé d'environ 12 au début des années 2000 à plus de 17 au début des années 2010, lorsque les taux hypothécaires ont baissé de près de deux points et demi ; cette hausse de près de la moitié du multiple est, à elle seule, une part importante de la hausse des prix relativement aux loyers observée durant la décennie. Ensuite, l'hypothèse extrapolative produit des résultats instables : en octobre 2023, la croissance de l'IPLN sur cinq ans, de \pct{6.58} par an, abaissait le coût d'usage à \pct{3.79} et portait le multiple implicite à 26, et la courbe B de la \cref{fig:3:coutusage} frôle zéro en 2021-2022, ce qui signifie que des ménages anticipant la poursuite des hausses passées pouvaient justifier à peu près n'importe quel prix. C'est exactement le mécanisme que \textcite{caseShiller2003} identifient comme le cœur d'une bulle : non pas un prix élevé, mais un prix soutenu par l'anticipation de sa propre hausse. Enfin, le resserrement de 2022-2023 a relevé le coût d'usage sous l'hypothèse IPC de près de deux points en dix-huit mois, ce qui correspond, par l'\cref{eq:3:semi-elasticite}, à une baisse du prix d'équilibre de l'ordre d'un quart à loyer constant ; les prix québécois n'ont pas baissé d'autant, parce que les loyers ont fortement monté au même moment, que le taux effectif a moins augmenté que le taux affiché et que le stock, on l'a vu, ne s'est pas accru. Le coût d'usage n'est pas un modèle de prévision des prix ; c'est un instrument pour décomposer un niveau de prix en ses composantes, taux, taxes, entretien et anticipations, et pour juger laquelle porte le niveau observé.
347+
348+\subsection{Exemple intégral : une unifamiliale de la région de Québec en octobre 2026}
349+
350+\begin{exemple}{Coût d'usage et ratio prix/loyer d'une unifamiliale au prix médian de la RMR de Québec}{3:coutusage}
351+Au troisième trimestre de 2026, le prix médian des unifamiliales vendues par courtier dans la RMR de Québec était de \dollars{463500} \parencite{apciqt32026}. On cherche le coût annuel qu'un ménage supporte en possédant une telle maison, et le ratio prix/loyer qu'implique ce coût, à la date du 31 octobre 2026. Les paramètres sont les suivants : taux hypothécaire affiché 5 ans de \pct{6.19} (Banque du Canada, semaine du 28 octobre 2026) ou taux effectif non assuré à terme fixe de cinq ans et plus de \pct{4.58} (août 2026) ; taxes $\tau = \pct{0.825}$ (Ville de Québec, 1 à 5 logements, et taxe scolaire) ; entretien, dépréciation et risque $\delta = \pct{2.5}$ (hypothèse) ; plus-value anticipée $g$ égale à l'inflation de l'IPC du Québec de \pct{3.1} (septembre 2026) ou à la variation annuelle de l'IPLN du Québec de \pct{1.3} (septembre 2026). Tous les chiffres sont calculés par la fonction \texttt{exemple\_cout\_usage} du script du chapitre.
352+
353+\emph{Étape 1 — Taux de coût d'usage.} Avec le taux affiché et l'anticipation IPC, $u = 6{,}19 + 0{,}825 + 2{,}5 - 3{,}1 = \pct{6.415}$. Avec le taux effectif, $u = 4{,}58 + 0{,}825 + 2{,}5 - 3{,}1 = \pct{4.805}$. Avec le taux effectif et l'anticipation IPLN, $u = \pct{6.605}$.
354+
355+\emph{Étape 2 — Coût annuel et mensuel.} Au taux affiché, le coût d'usage de la maison médiane est de $\num{463500} \times 0{,}06415 = \dollars{29735}$ par an, soit \dollars{2478} par mois. Au taux effectif, il tombe à \dollars{22273} par an, soit \dollars{1856} par mois ; avec l'anticipation IPLN, il remonte à \dollars{2551} par mois. L'écart entre le taux affiché et le taux effectif vaut à lui seul plus de \dollars{600} par mois, ce qui rappelle que le taux pertinent pour l'arbitrage est celui que le ménage paie réellement, non celui qui est affiché.
356+
357+\emph{Étape 3 — Ratio prix/loyer implicite.} Par l'\cref{eq:3:prix-loyer}, le multiple d'équilibre est de $1/0{,}06415 = 15{,}6$ fois le loyer annuel au taux affiché, de $20{,}8$ au taux effectif avec anticipation IPC et de $15{,}1$ au taux effectif avec anticipation IPLN. Le loyer mensuel d'équilibre qui rendrait un ménage indifférent entre louer et acheter la maison médiane est donc compris entre \dollars{1856} et \dollars{2551} selon les hypothèses. À titre de repère, le loyer moyen d'un appartement de trois chambres et plus dans la RMR de Québec était de \dollars{1475} en octobre 2025 \parencite{schlLocatif2025} ; un tel appartement n'est pas un substitut d'une maison médiane, et la comparaison n'indique qu'un ordre de grandeur. Lue dans l'autre sens, l'\cref{eq:3:prix-loyer} dit qu'un loyer de \dollars{1475} par mois, capitalisé au taux de coût d'usage effectif de \pct{4.805}, justifie un prix de $1\,475 \times 12 / 0{,}04805 = \dollars{368336}$.
358+
359+\emph{Étape 4 — Sensibilité au taux.} Si le taux effectif passait de \pct{4.58} à \pct{5.58}, le multiple d'équilibre tomberait de $20{,}8$ à $17{,}2$, une baisse de \pct{17.2} à loyer constant ; la semi-élasticité de l'\cref{eq:3:semi-elasticite} vaut $-1/0{,}04805 = -20{,}8$, c'est-à-dire qu'une hausse de 10 points de base réduit le prix d'équilibre d'environ \pct{2.1}. Le \cref{tab:3:sens-taux} étend ce calcul à une grille de taux et d'anticipations.
360+\end{exemple}
361+
362+\begin{table}[htbp]
363+\caption{Sensibilité du ratio prix/loyer implicite au taux d'intérêt et à la plus-value anticipée ($\tau$ = 0,825 \%, $\delta$ = 2,5 \%)}\label{tab:3:sens-taux}
364+\centering
365+\small
366+\begin{tabular}{S[table-format=1.2]S[table-format=2.1]S[table-format=2.1]S[table-format=2.1]S[table-format=2.1]}
367+\toprule
368+ & \multicolumn{4}{c}{Plus-value anticipée $g$} \\
369+\cmidrule(lr){2-5}
370+{Taux $i$ (\%)} & {1,3 \%} & {2,0 \%} & {3,1 \%} & {4,0 \%} \\
371+\midrule
372+3.58 & 17.7 & 20.4 & 26.1 & 34.4 \\
373+4.58 & 15.1 & 17.0 & 20.8 & 25.3 \\
374+5.58 & 13.2 & 14.7 & 17.2 & 20.1 \\
375+6.19 & 12.2 & 13.4 & 15.6 & 17.9 \\
376+7.19 & 10.8 & 11.8 & 13.5 & 15.2 \\
377+\bottomrule
378+\end{tabular}
379+\tabsource{calculs de l'auteur, fonction \texttt{ratio\_prix\_loyer} du script \texttt{analysis/python/cases/ch03\_cycles.py} ; 3,58 \% = rendement de l'obligation du Canada 5 ans au 2026-10-29, 4,58 \% = taux effectif non assuré 5 ans et plus (août 2026), 6,19 \% = taux affiché 5 ans (2026-10-28).}
380+\end{table}
381+
382+Le \cref{tab:3:sens-taux} montre que le multiple d'équilibre varie du simple au triple sur une plage de taux et d'anticipations que le Québec a effectivement parcourue en cinq ans. Ce résultat a une portée directe sur la pratique : une évaluation par comparaison qui retient des ventes conclues à un taux de financement très différent de celui de la date d'évaluation doit corriger les conditions du marché, et l'ajustement n'est pas une simple tendance des prix, c'est une variation de la relation entre le prix et le loyer. Le \cref{ch:17} en traite l'exécution, le \cref{ch:31} les conditions de financement, en particulier le taux admissible minimal qui, en imposant aux emprunteurs une qualification à un taux supérieur au taux contractuel, atténue la transmission des baisses de taux aux prix.
383+
384+\section{Indicateurs d'alerte}\label{sec:3:indicateurs}
385+
386+\subsection{Les indicateurs de tension}
387+
388+L'évaluateur doit qualifier, dans son rapport, les conditions du marché à la date d'évaluation. Les sections précédentes fournissent les grandeurs à surveiller ; les sources publiques québécoises les mesurent avec des définitions qu'il faut connaître. Le premier indicateur est le \motcle{nombre de mois d'inventaire}, rapport entre les inscriptions en vigueur à la fin d'une période et le rythme mensuel des ventes,
389+\begin{equation}\label{eq:3:inventaire}
390+\mathit{MI} = \frac{\text{inscriptions en vigueur}}{\text{ventes du trimestre}/3},
391+\end{equation}
392+qui mesure le temps nécessaire pour écouler le stock de propriétés à vendre au rythme courant. Il est d'usage, dans la pratique canadienne du courtage, de qualifier de favorable aux vendeurs un marché qui compte moins d'environ quatre mois d'inventaire, d'équilibré un marché qui en compte de quatre à six, et de favorable aux acheteurs un marché qui en compte plus de six ; ces seuils sont des conventions de métier, non des résultats établis, et ils varient selon le segment. Le second indicateur est le délai de vente médian, que l'APCIQ publie par catégorie de propriété. Le troisième est le ratio des ventes aux nouvelles inscriptions, qui mesure la vitesse à laquelle l'offre nouvelle de propriétés trouve preneur. Le \cref{tab:3:inventaire} calcule le nombre de mois d'inventaire au troisième trimestre de 2026 pour les sept marchés métropolitains du Québec à partir des chiffres de ventes et d'inscriptions publiés par l'APCIQ.
393+
394+\begin{table}[htbp]
395+\caption{Ventes, inscriptions en vigueur et mois d'inventaire, troisième trimestre de 2026, propriétés résidentielles vendues par courtier}\label{tab:3:inventaire}
396+\centering
397+\small
398+\begin{tabular}{lS[table-format=5.0]S[table-format=5.0]S[table-format=4.0]S[table-format=1.1]S[table-format=6.0]}
399+\toprule
400+Territoire & {Ventes T3} & {Inscriptions en vigueur} & {Ventes par mois} & {Mois d'inventaire} & {Médiane unifamiliale (\$)} \\
401+\midrule
402+Province de Québec & 20935 & 42408 & 6978 & 6.1 & 500000 \\
403+RMR de Montréal & 9265 & 20350 & 3088 & 6.6 & 645500 \\
404+RMR de Québec & 2161 & 2204 & 720 & 3.1 & 463500 \\
405+RMR de Gatineau & 1044 & 2256 & 348 & 6.5 & 480000 \\
406+RMR de Sherbrooke & 569 & 825 & 190 & 4.3 & 490750 \\
407+RMR de Trois-Rivières & 372 & 447 & 124 & 3.6 & 395000 \\
408+RMR de Saguenay & 371 & 498 & 124 & 4.0 & 365500 \\
409+\bottomrule
410+\end{tabular}
411+\tabsource{ventes, inscriptions et médianes : APCIQ par le système Centris, communiqué du 14 octobre 2026 et baromètres FSMI du troisième trimestre de 2026 \parencite{apciqt32026} ; mois d'inventaire : calculs de l'auteur (\texttt{indicateurs\_apciq}), inscriptions en vigueur rapportées aux ventes mensuelles moyennes du trimestre.}
412+\end{table}
413+
414+Le tableau révèle une province à deux vitesses. La RMR de Québec, avec 3,1 mois d'inventaire, et celles de Trois-Rivières et de Saguenay, avec 3,6 et 4,0 mois, demeurent des marchés tendus où l'offre de propriétés à vendre est insuffisante ; l'APCIQ y notait en septembre 2026 que l'offre restait de moitié inférieure à sa moyenne historique malgré une hausse de \pct{35} des inscriptions \parencite{apciqsept2026}. Les RMR de Montréal et de Gatineau, avec 6,6 et 6,5 mois, sont passées dans la zone favorable aux acheteurs, après quatorze mois consécutifs de hausse de l'offre à Montréal ; la hausse de \pct{42} des inscriptions à Gatineau sur un an et la baisse de \pct{3} du prix médian des unifamiliales y signalent un retournement que les comparables du cas 1 du \cref{ch:16} devront refléter. Les indicateurs de tension ne mesurent pas la valeur, mais ils déterminent la direction et la vitesse de l'ajustement des prix dans les mois qui suivent la date d'évaluation, et donc le sens de l'ajustement de conditions du marché à appliquer aux ventes antérieures.
415+
416+\subsection{Les indicateurs de valorisation}
417+
418+Les indicateurs de tension décrivent le marché des transactions ; les indicateurs de \motcle{valorisation} comparent le niveau des prix à ses fondamentaux. Le ratio prix/loyer, examiné à la \cref{sec:3:coutusage}, compare le prix au service rendu ; sa déviation par rapport au multiple d'équilibre $1/(i + \tau + \delta - g)$ mesure l'écart entre le prix et le coût d'usage. Le ratio prix/revenu compare le prix médian des logements au revenu médian des ménages ; il mesure l'accessibilité plutôt que la valeur, et il peut rester durablement élevé lorsque les taux sont bas sans qu'il y ait surévaluation, ce qui est l'avertissement de \textcite{himmelbergMayerSinai2005}. Le ratio du prix au coût de remplacement, enfin, mesure l'incitation à construire du troisième quadrant : un prix durablement supérieur au coût de remplacement dans un marché où l'offre peut répondre annonce une vague de construction ; un prix inférieur au coût annonce l'arrêt des chantiers, comme en 2023.
419+
420+\begin{definition}{Bulle immobilière}{3:bulle}
421+Selon \textcite{caseShiller2003}, une \emph{bulle} est une situation où les prix sont soutenus principalement par l'anticipation de hausses futures plutôt que par les fondamentaux, de sorte que des ménages achètent à un prix qu'ils jugeraient excessif s'ils n'attendaient pas de plus-value. Dans l'\cref{eq:3:prix-loyer}, elle correspond à un terme $g$ anticipé supérieur à la croissance que les loyers et les revenus peuvent justifier. Son diagnostic exige des données sur les anticipations, non seulement sur les prix.
422+\end{definition}
423+
424+Le diagnostic d'une bulle n'appartient pas à l'évaluateur, dont la mission est d'estimer le prix le plus probable à la date d'évaluation, quel que soit le jugement que l'on porte sur ce prix. Mais la connaissance du cycle entre dans son rapport de deux manières. D'une part, la définition de la valeur marchande suppose une exposition raisonnable au marché et des parties informées ; lorsque le marché est en retournement rapide, le délai d'exposition s'allonge et la fourchette de prix probables s'élargit, ce que le \cref{ch:20} traduit en incertitude déclarée. D'autre part, les normes de pratique exigent que le rapport décrive les conditions du marché et les tendances pertinentes à la date d'évaluation \parencite{oeaqNormes} ; les indicateurs de ce chapitre, cités avec leur source et leur date, en sont la matière.
425+
426+\begin{quebec}
427+Les séries publiques nécessaires au suivi du cycle au Québec sont, pour les transactions, les statistiques Centris de l'APCIQ (ventes, inscriptions, prix médians, délais de vente, par RMR, par secteur et par catégorie ; diffusion mensuelle et trimestrielle, attribution obligatoire et reproduction des tableaux soumise à autorisation) et les rapports mensuels de JLR fondés sur les actes publiés au Registre foncier \parencite{jlr202609} ; pour les prix, l'indice Teranet--Banque Nationale, construit par la méthode des ventes répétées pour les RMR de Montréal et de Québec \parencite{teranet202609}, dont le \cref{ch:35} examine la méthode, et l'indice des prix des logements neufs de Statistique Canada ; pour le locatif, l'Enquête sur les logements locatifs de la SCHL d'octobre et ses perspectives \parencite{schlLocatif2025,schlpmh2026ete} ; pour la construction, les tableaux 34-10-0135-01 et 34-10-0143-01 de Statistique Canada, qui diffusent les relevés de la SCHL ; pour les taux, l'API Valet de la Banque du Canada, dont le calendrier des huit annonces annuelles est publié d'avance \parencite{bdccalendrier2026}. L'évaluateur qui cite ces sources indique le tableau ou la série, la période et la date de consultation, comme le font les tableaux de ce chapitre.
428+\end{quebec}
429+
430+\begin{erreurs}
431+\begin{itemize}
432+\item Extrapoler le prix de court terme d'un choc de taux comme s'il était permanent : le modèle des quatre quadrants montre que la baisse des taux relève d'abord les prix, puis le stock, puis fait baisser les loyers, le prix revenant vers le coût de construction.
433+\item Confondre élasticité de la construction, réactivité du stock et élasticité de long terme : trois horizons, trois mesures, et des chiffres publiés qui ne sont comparables qu'à horizon égal.
434+\item Lire un ratio prix/loyer ou prix/revenu élevé comme la preuve d'une surévaluation sans le rapporter au coût d'usage : à taux bas, un multiple élevé est un multiple d'équilibre, mais il signale une forte sensibilité aux taux.
435+\item Utiliser le taux hypothécaire affiché comme taux de coût d'usage : l'écart avec le taux effectivement payé dépassait un point et demi en 2026 et change le multiple d'équilibre de plusieurs unités.
436+\item Appliquer une tendance de prix uniforme comme ajustement de conditions du marché lorsque le cycle a changé la relation entre prix et loyers ; l'ajustement doit refléter la variation du coût d'usage, non seulement celle des médianes.
437+\item Prendre une somme partielle pour un total annuel : les fichiers mensuels de Statistique Canada peuvent comporter des mois manquants, et le script du chapitre vérifie le nombre de périodes avant toute somme.
438+\end{itemize}
439+\end{erreurs}
440+
441+\begin{limites}
442+Les modèles de ce chapitre sont linéaires et agrégés. Le marché type est calibré sur des ordres de grandeur publics, mais son élasticité de la demande, son taux de retrait, sa pente d'offre, son taux d'inoccupation naturel et sa vitesse d'ajustement des loyers sont des hypothèses pédagogiques, non des estimations québécoises ; les amplitudes et les périodes du cycle simulé n'ont donc aucune valeur prédictive, et seules les relations qualitatives entre paramètres et cycle sont à retenir. Les anticipations y sont myopes ; des anticipations tournées vers l'avenir amortiraient les oscillations, comme l'a montré Wheaton. La décomposition du coût d'usage repose sur un taux affiché qui surestime le taux effectif, sur un paramètre $\delta$ de \pct{2.5} posé sans source empirique et sur un taux de taxe propre à la Ville de Québec ; les multiples implicites sont des bornes et des ordres de grandeur, non des cibles de prix. Les élasticités de l'offre estimées par Saiz pour les aires métropolitaines américaines n'ont pas été reproduites parce que l'article n'a pu être relu dans sa version intégrale au moment de la rédaction, et aucune estimation comparable n'existe, à notre connaissance, pour les régions métropolitaines du Québec. Les séries de logements en construction et d'achèvements du tableau 34-10-0135-01 s'arrêtent, pour le Québec, au quatrième trimestre de 2022, et la série mensuelle de la RMR de Montréal du tableau 34-10-0143-01 ne comporte pas les mois de juillet à septembre 2025 dans le fichier consulté ; le chapitre n'en cite donc aucun total annuel pour 2025. Les seuils de mois d'inventaire qui qualifient un marché de favorable aux vendeurs ou aux acheteurs sont des conventions de métier non normées.
443+\end{limites}
444+
445+\begin{synthese}
446+\begin{itemize}
447+\item Le logement est un stock que des flux modifient lentement : au Québec, les mises en chantier d'une année représentent environ \pct{1.6} du parc. À court terme, la demande fait le prix ; à long terme, le coût de l'offre nouvelle l'ancre.
448+\item Le modèle des quatre quadrants relie loyer, prix, construction et stock ; son équilibre stationnaire est $S^{*} = (a - bic_0)/(1 + bic_1\delta)$. Une baisse des taux relève d'abord les prix, puis le stock, et finit par faire baisser les loyers ; une hausse des coûts de construction relève les prix de tout le parc.
449+\item L'élasticité de l'offre dépend de la géographie, de la réglementation et des coûts ; les marchés inélastiques résolvent les chocs par les prix, les marchés élastiques par les quantités et la surconstruction.
450+\item Les cycles naissent de la combinaison d'une offre réactive et de délais de livraison : le stock oscille si $\kappa > (1-\delta)^{2}/4$, avec une période $2\pi/\arccos[(1-\delta)/(2\sqrt{\kappa})]$ ; l'inoccupation naturelle et l'ajustement graduel des loyers allongent le cycle.
451+\item Le coût d'usage $u = P(i + \tau + \delta - g)$ relie prix et loyer ; le multiple d'équilibre $1/(i+\tau+\delta-g)$ est d'autant plus sensible aux taux qu'il est élevé, et les anticipations extrapolatives de plus-value sont le ressort des bulles.
452+\item Les indicateurs publics québécois (mises en chantier, inoccupation, loyers, inventaire, taux, inflation) permettent de situer la date d'évaluation dans le cycle ; ils se citent avec tableau, série, période et date de consultation.
453+\end{itemize}
454+\end{synthese}
455+
456+\section*{Exercices}
457+\addcontentsline{toc}{section}{Exercices}
458+
459+\begin{exercice}[1]{Stock et flux au Québec}{ex:3:1}
460+Le Québec comptait \num{3749035} logements privés occupés au recensement de 2021 et \num{59864} logements y ont été mis en chantier en 2025. En supposant que toutes les unités mises en chantier sont achevées dans l'année et que le taux de retrait est de \pct{0.5} par an, calculez le flux brut et le flux net en pourcentage du stock, le nombre d'années nécessaire pour accroître le parc de \pct{10} à ce rythme, et le stock stationnaire que ce rythme de construction pourrait entretenir à long terme. Commentez la vraisemblance de ce dernier chiffre et ce qu'il révèle sur le rôle du taux de retrait.
461+\end{exercice}
462+
463+\begin{exercice}[1]{Mois d'inventaire}{ex:3:2}
464+À partir des ventes et des inscriptions en vigueur du \cref{tab:3:inventaire}, recalculez le nombre de mois d'inventaire des RMR de Québec, de Montréal et de Gatineau. Si les ventes de la RMR de Montréal reculaient de \pct{10} au trimestre suivant sans changement des inscriptions, que deviendrait l'indicateur ? Expliquez pourquoi il faut rapporter les inscriptions en vigueur, qui sont un stock, aux ventes mensuelles, qui sont un flux, et quelle convention sur le nombre de mois du trimestre vous avez adoptée.
465+\end{exercice}
466+
467+\begin{exercice}[2]{Équilibre des quatre quadrants}{ex:3:3}
468+Un marché est décrit par la demande $D = \num{150000} - 3{,}4722\,R$, un taux de capitalisation de \pct{5}, une offre de construction $C = (P - \num{240000})/48$ et un taux de retrait de \pct{1}. Calculez le stock, le loyer, le prix et la construction d'équilibre stationnaire à l'aide de l'\cref{eq:3:stock-equilibre}, puis vérifiez que les quatre relations sont satisfaites. Recalculez l'équilibre si le seuil de coût augmente de \pct{10} et interprétez la variation du prix d'équilibre en termes de transmission des coûts de construction aux prix du parc existant.
469+\end{exercice}
470+
471+\begin{exercice}[2]{Baisse des taux : court terme et long terme}{ex:3:4}
472+Dans le marché de l'\cref{ex:3:3}, le taux de capitalisation passe de 5 à \pct{4}. Calculez le prix et la construction de court terme, le stock étant fixe, puis le stock, le loyer, le prix et la construction d'équilibre de long terme. Expliquez pourquoi le loyer de long terme est inférieur au loyer initial et ce que cela implique pour un investisseur qui achèterait un immeuble locatif au prix de court terme en supposant les loyers stables.
473+\end{exercice}
474+
475+\begin{exercice}[2]{Coût d'usage d'une unifamiliale montréalaise}{ex:3:5}
476+Le prix médian des unifamiliales de la RMR de Montréal était de \dollars{645500} au troisième trimestre de 2026. Avec un taux effectif de \pct{4.58}, un taux de taxe foncière et scolaire combiné de \pct{0.9} (hypothèse de l'exercice), un terme $\delta$ de \pct{2.5} et une plus-value anticipée de \pct{3.1}, calculez le taux de coût d'usage, le coût mensuel d'occupation et le ratio prix/loyer implicite. Refaites le calcul avec une plus-value anticipée de \pct{1.3}, puis avec un taux de \pct{5.58} et $g = \pct{3.1}$. Comparez le coût mensuel au loyer moyen des appartements de trois chambres et plus de la RMR de Montréal en octobre 2025, \dollars{1626}, et discutez les limites de cette comparaison. Quel prix ce loyer justifierait-il au taux de coût d'usage initial ?
477+\end{exercice}
478+
479+\begin{exercice}[3]{Simulation : délais et réactivité}{ex:3:6}
480+À l'aide du script \texttt{analysis/python/cases/ch03\_cycles.py}, simulez le marché type avec un délai de livraison de douze trimestres et une réactivité $\kappa = 0{,}24$ (pente d'offre doublée), puis avec un délai de deux trimestres et $\kappa = 0{,}48$. Pour chaque variante, relevez la pointe et le creux du loyer, l'inoccupation maximale, la période et l'amortissement du cycle, et comparez-les à la simulation de référence. Rédigez une note de 150 mots expliquant pourquoi la construction de tours d'habitation, dont les délais sont longs, tend à produire des cycles plus amples que celle de maisons individuelles dans un marché à offre réactive.
481+\end{exercice}
482+
483+\begin{exercice}[3]{Condition d'oscillation}{ex:3:7}
484+Démontrez la \cref{prop:3:oscillation} pour $L = 1$ à partir de l'\cref{eq:3:dynamique}. Pour le marché type ($\delta = 0{,}01$), calculez le seuil d'oscillation, puis le module et la période des oscillations pour $\kappa = 0{,}48$ et pour $\kappa = 0{,}30$. Déterminez la pente d'offre $c_1$ en deçà de laquelle le marché devient instable ($\kappa > 1$) et celle en deçà de laquelle il commence à osciller, sachant que $\kappa = 1/(b\,i\,c_1)$ avec $b = 3{,}4722$ et $i = 0{,}05$. Interprétez ces seuils : quelle politique d'offre réduit l'amplitude des cycles sans sacrifier l'élasticité de long terme ?
485+\end{exercice}
486+
487+\section*{Pour aller plus loin}
488+\addcontentsline{toc}{section}{Pour aller plus loin}
489+
490+Le cadre de ce chapitre est celui de \textcite{dipasqualeWheaton1992}, dont l'article fondateur présente les quatre quadrants et leur statique comparative, et du manuel \textcite{dipasqualeWheaton1996}, qui en développe les applications au logement, aux bureaux et à la dynamique des loyers et de l'inoccupation. \textcite{wheaton1999} est la référence sur l'origine des cycles dans les délais et l'élasticité de l'offre, et sur le rôle des anticipations ; \textcite{sivitanidesTortoWheaton2003} et \textcite{chervachidzeWheaton2013} prolongent l'analyse au cycle des taux de capitalisation. Sur l'offre, \textcite{saiz2010} établit le lien entre géographie, réglementation et élasticité, \textcite{glaeserGyourkoSaiz2008} en tirent les conséquences pour l'amplitude et la durée des bulles, et \textcite{glaeserGyourko2005} expliquent l'asymétrie des cycles par la durabilité du logement ; la théorie du prix des terrains sous incertitude de \textcite{titman1985} et le modèle de croissance urbaine de \textcite{capozzaHelsley1989} relient l'option de construire au cycle, et \textcite{durantonPuga2015} offrent une synthèse de l'usage du sol urbain. Sur le coût d'usage et le diagnostic des marchés, on lira \textcite{poterba1984}, \textcite{himmelbergMayerSinai2005} et \textcite{caseShiller2003}, puis \textcite{shiller2015} pour la dimension psychologique des bulles ; \textcite{knollSchularickSteger2017} et \textcite{davisHeathcote2007} situent le rôle du terrain dans la hausse séculaire et la volatilité des prix. Le manuel de \textcite{geltnerMillerClaytonEichholtz2014} présente l'ensemble de ces thèmes dans une perspective d'investissement, et \textcite{appraisal2026} les traduit en exigences d'analyse de marché pour le rapport d'évaluation.
modified manuscript/chapters/ch06.tex +4 −4
Large diff (32 lines) is not loaded by default to keep the page fast.Load diff
modified manuscript/chapters/ch07.tex +9 −9
Large diff (57 lines) is not loaded by default to keep the page fast.Load diff
modified manuscript/chapters/ch08.tex +4 −4
Large diff (32 lines) is not loaded by default to keep the page fast.Load diff
modified manuscript/chapters/ch09.tex +2 −2
Large diff (16 lines) is not loaded by default to keep the page fast.Load diff
added references/lib-ch05.bib +103 −0
Large diff (103 lines) is not loaded by default to keep the page fast.Load diff
added references/lib-ch06.bib +12 −0
Large diff (12 lines) is not loaded by default to keep the page fast.Load diff
modified references/library.bib +96 −0
Large diff (102 lines) is not loaded by default to keep the page fast.Load diff
modified solutions/ch06.tex +1 −1
Large diff (8 lines) is not loaded by default to keep the page fast.Load diff
modified solutions/ch09.tex +63 −0
Large diff (64 lines) is not loaded by default to keep the page fast.Load diff
modified sources/registry.csv +9 −0
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
modified verification/calculations.csv +30 −0
Large diff (33 lines) is not loaded by default to keep the page fast.Load diff
added verification/chapters/ch05-calculations.csv +16 −0
Large diff (16 lines) is not loaded by default to keep the page fast.Load diff
added verification/chapters/ch05-claims.csv +18 −0
Large diff (18 lines) is not loaded by default to keep the page fast.Load diff
added verification/chapters/ch05-figures.csv +6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
added verification/chapters/ch05-registry.csv +8 −0
Large diff (8 lines) is not loaded by default to keep the page fast.Load diff
added verification/chapters/ch06-calculations.csv +16 −0
Large diff (16 lines) is not loaded by default to keep the page fast.Load diff
added verification/chapters/ch06-figures.csv +5 −0
Large diff (5 lines) is not loaded by default to keep the page fast.Load diff
added verification/chapters/ch06-registry.csv +3 −0
Large diff (3 lines) is not loaded by default to keep the page fast.Load diff
modified verification/chapters/ch08-claims.csv +2 −2
Large diff (14 lines) is not loaded by default to keep the page fast.Load diff
added verification/chapters/ch08.md +39 −0
Large diff (39 lines) is not loaded by default to keep the page fast.Load diff
modified verification/claims.csv +17 −0
Large diff (20 lines) is not loaded by default to keep the page fast.Load diff
modified verification/figures.csv +9 −0
Large diff (13 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme