SPB Git

Ch. 31 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 8cb0de6 Browse files

9 changed files +419 −29

modified analysis/python/tests/test_ch28.py +1 −1
@@ -177,7 +177,7 @@ def test_sensibilites(res):
177 assert (np.diff(r["rne"].values) < 0).all() 177 assert (np.diff(r["rne"].values) < 0).all()
178 t = s["taxe"].set_index("scenario") 178 t = s["taxe"].set_index("scenario")
179 assert t.iloc[1]["taxe"] == pytest.approx(11194.44, abs=0.01) and t.iloc[1]["dV_pct"] == pytest.approx(-0.011, abs=5e-4) 179 assert t.iloc[1]["taxe"] == pytest.approx(11194.44, abs=0.01) and t.iloc[1]["dV_pct"] == pytest.approx(-0.011, abs=5e-4)
180− assert t.iloc[3]["dV_pct"] == pytest.approx(-0.057, abs=5e-4) and t.iloc[4]["dV_pct"] == pytest.approx(-0.075, abs=5e-4) 180+ assert t.iloc[2]["dV_pct"] == pytest.approx(-0.057, abs=5e-4) and t.iloc[3]["dV_pct"] == pytest.approx(-0.075, abs=5e-4)
181 g = s["gestion"].set_index("gestion_pct") 181 g = s["gestion"].set_index("gestion_pct")
182 assert g.loc[0.0, "dV_pct"] == pytest.approx(0.075, abs=5e-4) and g.loc[0.10, "dV_pct"] == pytest.approx(-0.112, abs=5e-4) 182 assert g.loc[0.0, "dV_pct"] == pytest.approx(0.075, abs=5e-4) and g.loc[0.10, "dV_pct"] == pytest.approx(-0.112, abs=5e-4)
183 assert s["dV_dDE"] == pytest.approx(-1 / R, rel=1e-12) and abs(s["dV_dDE"]) == pytest.approx(22.65, abs=0.01) 183 assert s["dV_dDE"] == pytest.approx(-1 / R, rel=1e-12) and abs(s["dV_dDE"]) == pytest.approx(22.65, abs=0.01)
added analysis/python/traite/panel.py +276 −0
@@ -0,0 +1,276 @@
1+"""Données de panel et identification causale (chapitre 36) : transformation within, erreurs-types en grappes (CR1),
2+effets fixes bidirectionnels par indicatrices (via hedonique.mco), doubles différences 2 × 2, étude d'événement,
3+estimateur de Callaway–Sant'Anna (2021) par cohortes avec contrôles « jamais traités », décomposition de
4+Goodman-Bacon (2021), contrôle synthétique (Abadie–Diamond–Hainmueller 2010) et discontinuité locale linéaire.
5+
6+Toutes les fonctions sont pures (numpy/pandas/scipy) et testées dans analysis/python/tests/test_ch36.py.
7+Conventions : un panel « long » est un DataFrame avec une colonne d'unité, une colonne de période entière (0, 1, …, T−1),
8+une variable dépendante et, pour les plans échelonnés, une colonne `g` = première période traitée (NaN si jamais traité)."""
9+from __future__ import annotations
10+import numpy as np, pandas as pd
11+from scipy import optimize
12+from . import hedonique as h
13+
14+# ----------------------------------------------------------------------------- MCO en grappes et within
15+
16+def mco_grappes(X: np.ndarray, y: np.ndarray, grappes: np.ndarray) -> dict:
17+ """MCO avec erreurs-types classiques, HC1 et robustes aux grappes (CR1 : facteur G/(G−1)·(N−1)/(N−K)).
18+ X contient la constante (ou les indicatrices qui en tiennent lieu)."""
19+ X = np.asarray(X, float); y = np.asarray(y, float); grappes = np.asarray(grappes)
20+ base = h.mco(X, y)
21+ n, k = X.shape; e = base["residus"]
22+ bread = np.linalg.pinv(X.T @ X)
23+ ids = np.unique(grappes); G = len(ids)
24+ meat = np.zeros((k, k))
25+ for gid in ids:
26+ m = grappes == gid
27+ s = X[m].T @ e[m]
28+ meat += np.outer(s, s)
29+ c = G / (G - 1) * (n - 1) / (n - k)
30+ V = c * bread @ meat @ bread
31+ out = dict(base); out.update({"se_grappes": np.sqrt(np.diag(V)), "V_grappes": V, "G": G, "correction_cr1": c})
32+ return out
33+
34+def within(y: np.ndarray, X: np.ndarray, unites: np.ndarray) -> tuple[np.ndarray, np.ndarray]:
35+ """Transformation within (écarts aux moyennes d'unité) de y et de chaque colonne de X."""
36+ df = pd.DataFrame(np.column_stack([y, X])); g = df.groupby(np.asarray(unites))
37+ Z = (df - g.transform("mean")).to_numpy()
38+ return Z[:, 0], Z[:, 1:]
39+
40+def within_deux_voies(y: np.ndarray, X: np.ndarray, unites: np.ndarray, temps: np.ndarray) -> tuple[np.ndarray, np.ndarray]:
41+ """Transformation within bidirectionnelle (panel cylindré) : z − z̄_i − z̄_t + z̄."""
42+ df = pd.DataFrame(np.column_stack([y, X])); u = np.asarray(unites); t = np.asarray(temps)
43+ Z = (df - df.groupby(u).transform("mean") - df.groupby(t).transform("mean") + df.mean()).to_numpy()
44+ return Z[:, 0], Z[:, 1:]
45+
46+def estimateur_within(y, X, unites, grappes=None) -> dict:
47+ """Estimateur within (effets fixes d'unité) : MCO sur les données transformées, ddl corrigés du nombre d'unités,
48+ erreurs-types en grappes par unité (par défaut)."""
49+ yw, Xw = within(y, X, unites)
50+ grappes = np.asarray(unites) if grappes is None else np.asarray(grappes)
51+ r = mco_grappes(Xw, yw, grappes)
52+ n, k = Xw.shape; N = len(np.unique(unites))
53+ # correction des degrés de liberté pour les erreurs-types classiques (N constantes éliminées)
54+ s2 = r["residus"] @ r["residus"] / (n - k - N)
55+ r["se"] = np.sqrt(np.diag(s2 * np.linalg.pinv(Xw.T @ Xw))); r["sigma2"] = s2
56+ return r
57+
58+def indicatrices(codes, omettre_premiere: bool = True, prefixe: str = "") -> pd.DataFrame:
59+ """Indicatrices (0/1) d'un vecteur de codes, dans l'ordre trié ; la première modalité est omise par défaut."""
60+ s = pd.Series(np.asarray(codes))
61+ D = pd.get_dummies(s, prefix=prefixe, prefix_sep="" if prefixe == "" else ":", dtype=float)
62+ if omettre_premiere: D = D.iloc[:, 1:]
63+ return D.reset_index(drop=True)
64+
65+def twfe(df: pd.DataFrame, y: str, regresseurs: list[str], unite: str, temps: str, fe_supp: str | None = None,
66+ grappes: str | None = None) -> dict:
67+ """Effets fixes bidirectionnels par indicatrices : y = Σ β_r x_r + α_i + λ_t (+ θ_{s,t} si fe_supp) + ε.
68+ fe_supp : colonne de strate (ex. RMR) → indicatrices strate × période (période 0 omise dans chaque strate), qui
69+ remplacent les effets de période communs. Erreurs-types en grappes par `grappes` (défaut : l'unité)."""
70+ d = df.reset_index(drop=True)
71+ parts = [pd.DataFrame({"const": np.ones(len(d))}), d[regresseurs].astype(float).reset_index(drop=True),
72+ indicatrices(d[unite], prefixe="u")]
73+ if fe_supp is None:
74+ parts.append(indicatrices(d[temps], prefixe="t"))
75+ else:
76+ st = d[fe_supp].astype(str) + "@" + d[temps].astype(int).astype(str)
77+ D = indicatrices(st, omettre_premiere=False, prefixe="st")
78+ t0 = d[temps].min()
79+ D = D[[c for c in D.columns if not c.endswith(f"@{int(t0)}")]]
80+ parts.append(D.reset_index(drop=True))
81+ X = pd.concat(parts, axis=1)
82+ cl = d[unite].values if grappes is None else d[grappes].values
83+ r = mco_grappes(X.values, d[y].values, cl)
84+ idx = {nom: i for i, nom in enumerate(X.columns)}
85+ coef = pd.DataFrame({"coef": [r["beta"][idx[v]] for v in regresseurs], "se": [r["se"][idx[v]] for v in regresseurs],
86+ "se_hc1": [r["se_hc1"][idx[v]] for v in regresseurs], "se_grappes": [r["se_grappes"][idx[v]] for v in regresseurs]},
87+ index=regresseurs)
88+ return {"coef": coef, "n": r["n"], "k": r["k"], "G": r["G"], "sigma2": r["sigma2"], "r2": r["r2"], "residus": r["residus"], "colonnes": list(X.columns), "beta": r["beta"]}
89+
90+# ----------------------------------------------------------------------------- doubles différences 2 × 2
91+
92+def did_2x2(df: pd.DataFrame, y: str, unite: str, temps: str, traite: str, avant, apres) -> dict:
93+ """DiD à deux périodes : quatre moyennes de cellule (fenêtres `avant` et `apres` = listes de périodes), estimateur
94+ (ȳ_tr,ap − ȳ_tr,av) − (ȳ_té,ap − ȳ_té,av), et version agrégée par unité (différence longue Δy_i régressée sur
95+ l'indicatrice de traitement, erreurs-types HC1 : robustes à l'autocorrélation intra-unité)."""
96+ d = df[df[temps].isin(list(avant) + list(apres))].copy()
97+ d["periode"] = np.where(d[temps].isin(list(apres)), 1, 0)
98+ cell = d.groupby([traite, "periode"])[y].mean().unstack()
99+ est = (cell.loc[1, 1] - cell.loc[1, 0]) - (cell.loc[0, 1] - cell.loc[0, 0])
100+ # agrégation par unité : Δy_i = ȳ_i,après − ȳ_i,avant
101+ u = d.groupby([unite, traite, "periode"])[y].mean().unstack("periode")
102+ delta = (u[1] - u[0]).reset_index(); delta.columns = [unite, traite, "dy"]
103+ X = np.column_stack([np.ones(len(delta)), delta[traite].values.astype(float)])
104+ r = h.mco(X, delta["dy"].values)
105+ return {"cellules": cell, "estimateur": float(est), "coef_reg": float(r["beta"][1]), "se_hc1": float(r["se_hc1"][1]),
106+ "se_classique": float(r["se"][1]), "n_traites": int(delta[traite].sum()), "n_temoins": int((delta[traite] == 0).sum()),
107+ "deltas": delta}
108+
109+# ----------------------------------------------------------------------------- étude d'événement
110+
111+def event_study(df: pd.DataFrame, y: str, unite: str, temps: str, g: str, fenetre: tuple[int, int] = (-8, 8), ref: int = -1,
112+ fe_supp: str | None = None, cohortes=None) -> pd.DataFrame:
113+ """Étude d'événement par effets fixes bidirectionnels : indicatrices du temps relatif k = t − g (bornes de `fenetre`
114+ regroupées : « ≤ kmin » et « ≥ kmax »), période de référence `ref` omise, unités jamais traitées (g NaN) à zéro.
115+ `cohortes` : restreint les unités traitées à ces valeurs de g (les autres cohortes sont exclues du panel)."""
116+ d = df.copy()
117+ if cohortes is not None:
118+ d = d[d[g].isna() | d[g].isin(list(cohortes))].copy()
119+ kmin, kmax = fenetre
120+ k = d[temps] - d[g]
121+ k = k.where(d[g].notna())
122+ kb = k.clip(lower=kmin, upper=kmax)
123+ noms = []
124+ for j in range(kmin, kmax + 1):
125+ if j == ref: continue
126+ nom = f"k{j:+d}"; d[nom] = ((kb == j) & d[g].notna()).astype(float); noms.append(nom)
127+ r = twfe(d, y, noms, unite, temps, fe_supp=fe_supp)
128+ out = r["coef"].copy(); out["k"] = [int(n[1:]) for n in out.index]
129+ out = pd.concat([out, pd.DataFrame({"coef": [0.0], "se": [0.0], "se_hc1": [0.0], "se_grappes": [0.0], "k": [ref]}, index=[f"k{ref:+d}"])]).sort_values("k")
130+ out["ic_bas"] = out["coef"] - 1.96 * out["se_grappes"]; out["ic_haut"] = out["coef"] + 1.96 * out["se_grappes"]
131+ return out.set_index("k")
132+
133+# ----------------------------------------------------------------------------- Callaway–Sant'Anna (simplifié)
134+
135+def callaway_santanna(df: pd.DataFrame, y: str, unite: str, temps: str, g: str, strate: str | None = None,
136+ controle: str = "jamais", B: int = 999, graine: int = 20261031) -> dict:
137+ """ATT(g, t) = E[y_t − y_{g−1} | G = g] − E[y_t − y_{g−1} | C], période de base universelle g − 1, contrôles
138+ « jamais traités » (controle='jamais') ou « pas encore traités à t » (controle='pas_encore') ; si `strate` est donnée,
139+ les contrôles sont restreints à la strate de la cohorte (ex. même RMR). Agrégations : dynamique (par k), par cohorte,
140+ globale (pondérée par la taille des cohortes). Erreurs-types : bootstrap par blocs d'unités (B tirages)."""
141+ W = df.pivot(index=unite, columns=temps, values=y)
142+ G = df.groupby(unite)[g].first().reindex(W.index)
143+ S = df.groupby(unite)[strate].first().reindex(W.index) if strate else None
144+ periodes = list(W.columns); cohortes = sorted(G.dropna().unique())
145+
146+ def _att_table(W, G, S):
147+ rows = []
148+ for gg in cohortes:
149+ tr = G.index[G == gg]
150+ base = int(gg) - 1
151+ for t in periodes:
152+ if controle == "jamais":
153+ ctl = G.index[G.isna()]
154+ else:
155+ ctl = G.index[G.isna() | (G > max(t, gg))]
156+ if S is not None:
157+ s_g = S.loc[tr].mode().iloc[0]; ctl = [c for c in ctl if S.loc[c] == s_g]
158+ dy_tr = W.loc[tr, t] - W.loc[tr, base]; dy_c = W.loc[ctl, t] - W.loc[ctl, base]
159+ att = dy_tr.mean() - dy_c.mean()
160+ se = np.sqrt(dy_tr.var(ddof=1) / len(dy_tr) + dy_c.var(ddof=1) / len(dy_c)) if len(dy_tr) > 1 and len(dy_c) > 1 else np.nan
161+ rows.append({"g": int(gg), "t": int(t), "k": int(t) - int(gg), "att": float(att), "se_analytique": float(se), "n_g": len(tr), "n_c": len(ctl)})
162+ return pd.DataFrame(rows)
163+
164+ def _agreger(tab):
165+ post = tab[tab["k"] >= 0]
166+ par_cohorte = post.groupby("g").apply(lambda d: d["att"].mean(), include_groups=False)
167+ taille = post.groupby("g")["n_g"].first()
168+ globale = float((par_cohorte * taille).sum() / taille.sum())
169+ dyn = tab.groupby("k").apply(lambda d: float((d["att"] * d["n_g"]).sum() / d["n_g"].sum()), include_groups=False)
170+ return par_cohorte, globale, dyn
171+
172+ tab = _att_table(W, G, S)
173+ par_cohorte, globale, dyn = _agreger(tab)
174+ rng = np.random.default_rng(graine)
175+ boot_c, boot_g, boot_d = [], [], []
176+ unites = np.array(W.index)
177+ for _ in range(B):
178+ # bootstrap stratifié : on rééchantillonne séparément chaque cohorte et les contrôles pour conserver le plan
179+ idx = []
180+ for gg in cohortes + [np.nan]:
181+ m = G.isna().values if np.isnan(gg) else (G == gg).values
182+ u = unites[m]; idx += list(rng.choice(u, size=len(u), replace=True))
183+ Wb = W.loc[idx].reset_index(drop=True); Gb = G.loc[idx].reset_index(drop=True); Sb = S.loc[idx].reset_index(drop=True) if S is not None else None
184+ Wb.index = range(len(Wb)); Gb.index = range(len(Gb))
185+ if Sb is not None: Sb.index = range(len(Sb))
186+ tb = _att_table(Wb, Gb, Sb); pc, gl, dn = _agreger(tb)
187+ boot_c.append(pc.reindex(par_cohorte.index).values); boot_g.append(gl); boot_d.append(dn.reindex(dyn.index).values)
188+ boot_c = np.array(boot_c); boot_d = np.array(boot_d)
189+ cohortes_df = pd.DataFrame({"att": par_cohorte, "se_boot": boot_c.std(axis=0, ddof=1), "n_g": taille})
190+ dyn_df = pd.DataFrame({"att": dyn, "se_boot": np.nanstd(boot_d, axis=0, ddof=1)})
191+ dyn_df["ic_bas"] = dyn_df["att"] - 1.96 * dyn_df["se_boot"]; dyn_df["ic_haut"] = dyn_df["att"] + 1.96 * dyn_df["se_boot"]
192+ return {"att_gt": tab, "par_cohorte": cohortes_df, "globale": globale, "globale_se_boot": float(np.std(boot_g, ddof=1)), "dynamique": dyn_df}
193+
194+# ----------------------------------------------------------------------------- décomposition de Goodman-Bacon
195+
196+def bacon(df: pd.DataFrame, y: str, unite: str, temps: str, g: str) -> dict:
197+ """Décomposition de Goodman-Bacon (2021) de l'estimateur TWFE statique (panel cylindré, sans covariable) en
198+ comparaisons 2 × 2 : chaque cohorte vs jamais traités ; cohorte précoce (traitée) vs cohorte tardive (témoin, avant
199+ son traitement) ; cohorte tardive (traitée) vs cohorte précoce (témoin déjà traité). Vérifie Σ s = 1 et
200+ Σ s·β_2x2 = β_TWFE."""
201+ W = df.pivot(index=unite, columns=temps, values=y)
202+ G = df.groupby(unite)[g].first().reindex(W.index)
203+ T = W.shape[1]; periodes = np.array(W.columns); N = W.shape[0]
204+ cohortes = sorted(G.dropna().unique())
205+ n = {gg: (G == gg).sum() / N for gg in cohortes}; n_U = G.isna().sum() / N
206+ Dbar = {gg: (periodes >= gg).mean() for gg in cohortes}
207+ # variance de D doublement centré
208+ d = df.copy(); d["D"] = ((d[temps] >= d[g]) & d[g].notna()).astype(float)
209+ Dt = d["D"] - d.groupby(unite)["D"].transform("mean") - d.groupby(temps)["D"].transform("mean") + d["D"].mean()
210+ VD = float((Dt ** 2).mean())
211+
212+ def m(ids, mask_t):
213+ return W.loc[ids, periodes[mask_t]].values.mean()
214+ rows = []
215+ U = G.index[G.isna()]
216+ for gg in cohortes:
217+ tr = G.index[G == gg]
218+ if len(U) > 0:
219+ b = (m(tr, periodes >= gg) - m(tr, periodes < gg)) - (m(U, periodes >= gg) - m(U, periodes < gg))
220+ nkU = n[gg] / (n[gg] + n_U)
221+ s = (n[gg] + n_U) ** 2 * nkU * (1 - nkU) * Dbar[gg] * (1 - Dbar[gg]) / VD
222+ rows.append({"traites": int(gg), "temoins": "jamais", "type": "traités vs jamais traités", "beta": float(b), "poids": float(s)})
223+ for i, gk in enumerate(cohortes):
224+ for gl in cohortes[i + 1:]:
225+ k_ids = G.index[G == gk]; l_ids = G.index[G == gl]
226+ nkl = n[gk] / (n[gk] + n[gl])
227+ # précoce (k) traité, tardif (l) témoin : fenêtre t < gl
228+ b_kl = (m(k_ids, (periodes >= gk) & (periodes < gl)) - m(k_ids, periodes < gk)) - (m(l_ids, (periodes >= gk) & (periodes < gl)) - m(l_ids, periodes < gk))
229+ s_kl = ((n[gk] + n[gl]) * (1 - Dbar[gl])) ** 2 * nkl * (1 - nkl) * ((Dbar[gk] - Dbar[gl]) / (1 - Dbar[gl])) * ((1 - Dbar[gk]) / (1 - Dbar[gl])) / VD
230+ rows.append({"traites": int(gk), "temoins": int(gl), "type": "précoce vs tardive (pas encore traitée)", "beta": float(b_kl), "poids": float(s_kl)})
231+ # tardif (l) traité, précoce (k) témoin déjà traité : fenêtre t ≥ gk
232+ b_lk = (m(l_ids, periodes >= gl) - m(l_ids, (periodes >= gk) & (periodes < gl))) - (m(k_ids, periodes >= gl) - m(k_ids, (periodes >= gk) & (periodes < gl)))
233+ s_lk = ((n[gk] + n[gl]) * Dbar[gk]) ** 2 * nkl * (1 - nkl) * (Dbar[gl] / Dbar[gk]) * ((Dbar[gk] - Dbar[gl]) / Dbar[gk]) / VD
234+ rows.append({"traites": int(gl), "temoins": int(gk), "type": "tardive vs précoce (déjà traitée)", "beta": float(b_lk), "poids": float(s_lk)})
235+ tab = pd.DataFrame(rows)
236+ tw = twfe(d, y, ["D"], unite, temps)
237+ return {"table": tab, "somme_poids": float(tab["poids"].sum()), "beta_pondere": float((tab["beta"] * tab["poids"]).sum()),
238+ "beta_twfe": float(tw["coef"].loc["D", "coef"]), "var_D": VD}
239+
240+# ----------------------------------------------------------------------------- contrôle synthétique
241+
242+def controle_synthetique(Y0: np.ndarray, y1: np.ndarray, T0: int) -> dict:
243+ """Poids w ≥ 0, Σ w = 1, minimisant Σ_{t<T0} (y1_t − Y0_t w)² (Abadie, Diamond et Hainmueller 2010, sans prédicteurs
244+ auxiliaires). Y0 : (T × J) donneurs ; y1 : (T,) unité traitée. Retourne poids, trajectoire synthétique, écarts,
245+ RMSPE pré et post."""
246+ Y0 = np.asarray(Y0, float); y1 = np.asarray(y1, float); J = Y0.shape[1]
247+ A = Y0[:T0]; b = y1[:T0]
248+ def f(w): r = A @ w - b; return float(r @ r)
249+ def grad(w): return 2 * A.T @ (A @ w - b)
250+ cons = ({"type": "eq", "fun": lambda w: w.sum() - 1.0, "jac": lambda w: np.ones(J)},)
251+ w0 = np.ones(J) / J
252+ res = optimize.minimize(f, w0, jac=grad, bounds=[(0, 1)] * J, constraints=cons, method="SLSQP", options={"maxiter": 2000, "ftol": 1e-14})
253+ w = np.clip(res.x, 0, None); w = w / w.sum()
254+ synth = Y0 @ w; gap = y1 - synth
255+ return {"poids": w, "synthetique": synth, "ecarts": gap, "rmspe_pre": float(np.sqrt(np.mean(gap[:T0] ** 2))),
256+ "rmspe_post": float(np.sqrt(np.mean(gap[T0:] ** 2))), "effet_moyen_post": float(gap[T0:].mean()), "convergence": bool(res.success)}
257+
258+def placebos_synthetiques(Y0: np.ndarray, T0: int) -> pd.DataFrame:
259+ """Placebos « dans l'espace » : chaque donneur devient à son tour l'unité traitée, les autres forment le bassin."""
260+ Y0 = np.asarray(Y0, float); J = Y0.shape[1]; rows = []
261+ for j in range(J):
262+ r = controle_synthetique(np.delete(Y0, j, axis=1), Y0[:, j], T0)
263+ rows.append({"donneur": j, "rmspe_pre": r["rmspe_pre"], "rmspe_post": r["rmspe_post"], "ratio": r["rmspe_post"] / r["rmspe_pre"], "effet_moyen_post": r["effet_moyen_post"]})
264+ return pd.DataFrame(rows)
265+
266+# ----------------------------------------------------------------------------- discontinuité (locale linéaire)
267+
268+def rdd_local_lineaire(x: np.ndarray, y: np.ndarray, h_bande: float, c: float = 0.0) -> dict:
269+ """Saut à la frontière c par régression locale linéaire à noyau triangulaire de bande h : y = a + τ·1[x ≥ c] + b(x−c)
270+ + d·1[x ≥ c](x−c), pondérée par K((x−c)/h). Erreur-type HC1 de τ."""
271+ x = np.asarray(x, float); y = np.asarray(y, float); u = (x - c) / h_bande
272+ w = np.clip(1 - np.abs(u), 0, None); m = w > 0
273+ D = (x[m] >= c).astype(float); xc = x[m] - c
274+ X = np.column_stack([np.ones(m.sum()), D, xc, D * xc]); sw = np.sqrt(w[m])
275+ r = h.mco(X * sw[:, None], y[m] * sw)
276+ return {"tau": float(r["beta"][1]), "se_hc1": float(r["se_hc1"][1]), "n_eff": int(m.sum()), "beta": r["beta"], "bande": h_bande}
renamed manuscript/_wrap_ch33.tex → manuscript/_wrap_ch25.tex +4 −4
@@ -3,10 +3,10 @@
3 \newif\ifLogoAutorise\LogoAutorisefalse\def\PALETTE{uqo} 3 \newif\ifLogoAutorise\LogoAutorisefalse\def\PALETTE{uqo}
4 \usepackage{traite-qc} 4 \usepackage{traite-qc}
5 \input{../manuscript/frontmatter/metadata.tex} 5 \input{../manuscript/frontmatter/metadata.tex}
6−\input{/Users/simon-pierreboucher/Desktop/UQO/Traite-Evaluation-QC/build/ch33/_labels.tex} 6+\input{/Users/simon-pierreboucher/Desktop/UQO/Traite-Evaluation-QC/build/ch25/_labels.tex}
7 \begin{document} 7 \begin{document}
8−\setcounter{chapter}{32} 8+\setcounter{chapter}{24}
9−\input{chapters/ch33.tex} 9+\input{chapters/ch25.tex}
10−\appendix\chapter{Solutions du chapitre}\input{../solutions/ch33.tex} 10+\appendix\chapter{Solutions du chapitre}\input{../solutions/ch25.tex}
11 \printbibliography 11 \printbibliography
12 \end{document} 12 \end{document}
added manuscript/_wrap_ch28.tex +12 −0
@@ -0,0 +1,12 @@
1+\providecommand{\BUILDVARIANT}{uqo}\providecommand{\BUILDMEDIA}{numerique}
2+\documentclass[10pt,twoside,openright]{book}
3+\newif\ifLogoAutorise\LogoAutorisefalse\def\PALETTE{uqo}
4+\usepackage{traite-qc}
5+\input{../manuscript/frontmatter/metadata.tex}
6+\input{/Users/simon-pierreboucher/Desktop/UQO/Traite-Evaluation-QC/build/ch28/_labels.tex}
7+\begin{document}
8+\setcounter{chapter}{27}
9+\input{chapters/ch28.tex}
10+\appendix\chapter{Solutions du chapitre}\input{../solutions/ch28.tex}
11+\printbibliography
12+\end{document}
modified manuscript/chapters/ch25.tex +23 −23
@@ -72,7 +72,7 @@ décroît avec $T$ à un rythme donné par $\varepsilon_T - 1 < 0$. Avec $\varep
72 72
73 \subsection{Façade, profondeur et règles conventionnelles} 73 \subsection{Façade, profondeur et règles conventionnelles}
74 74
75−Dans les tissus urbains anciens, où les lots sont étroits et profonds, le prix par mètre de façade a longtemps servi d'unité, parce que la façade commande l'accès, la visibilité et la largeur du bâtiment possible. Des règles de profondeur conventionnelles, dont la plus connue attribue à quatre tranches égales de profondeur des parts décroissantes de la valeur, ont été élaborées pour corriger les écarts de profondeur à façade donnée ; la littérature professionnelle les présente comme des conventions d'un autre âge, utiles pour comprendre la logique de la valeur décroissante en s'éloignant de la rue, mais que rien n'autorise à appliquer sans vérification sur le marché local \parencite{appraisal2026}. Dans l'approche moderne, la façade entre comme une caractéristique parmi d'autres dans la grille d'ajustements ou dans le modèle hédonique, à superficie donnée ; l'exemple intégral montre que son effet, une fois la superficie prise en compte, est faible et mal déterminé pour des terrains unifamiliaux de banlieue, ce qui est attendu lorsque la façade minimale imposée par le règlement de lotissement est respectée par presque tous les lots. 75+Dans les tissus urbains anciens, où les lots sont étroits et profonds, le prix par mètre de façade a longtemps servi d'unité, parce que la façade commande l'accès, la visibilité et la largeur du bâtiment possible. Des règles de profondeur conventionnelles, dont la plus connue attribue à quatre tranches égales de profondeur des parts décroissantes de la valeur, servaient à corriger les écarts de profondeur à façade donnée ; la littérature professionnelle les présente comme des conventions d'un autre âge, que rien n'autorise à appliquer sans vérification sur le marché local \parencite{appraisal2026}. Dans l'approche moderne, la façade entre comme une caractéristique parmi d'autres dans la grille d'ajustements ou dans le modèle hédonique, à superficie donnée ; l'exemple intégral montre que son effet y est faible et mal déterminé pour des terrains unifamiliaux de banlieue, ce qui est attendu lorsque presque tous les lots respectent la façade minimale du règlement de lotissement.
76 76
77 \subsection{Le logement constructible comme unité} 77 \subsection{Le logement constructible comme unité}
78 78
@@ -207,7 +207,7 @@ Contraintes & Zone inondable, servitudes, milieu humide, bande riveraine & Déco
207 207
208 L'ajustement de \emph{services} est le plus lourd en dollars et le plus facile à borner. Un terrain non desservi oblige l'acheteur à forer un puits et à installer un système de traitement des eaux usées, dont le coût dépend du sol et de la réglementation applicable ; la décote de marché devrait être voisine de ce coût, augmentée du délai et du risque, et c'est ce que l'on vérifie en comparant la décote estimée au coût des installations. Dans le jeu synthétique du chapitre, la décote est de l'ordre du quart du prix d'un terrain desservi, mais les terrains non desservis y sont aussi beaucoup plus grands et périurbains, ce qui illustre la difficulté : le non-desservi se vend dans d'autres secteurs, à d'autres acheteurs, et la comparaison directe entre les deux marchés est rarement nécessaire. 208 L'ajustement de \emph{services} est le plus lourd en dollars et le plus facile à borner. Un terrain non desservi oblige l'acheteur à forer un puits et à installer un système de traitement des eaux usées, dont le coût dépend du sol et de la réglementation applicable ; la décote de marché devrait être voisine de ce coût, augmentée du délai et du risque, et c'est ce que l'on vérifie en comparant la décote estimée au coût des installations. Dans le jeu synthétique du chapitre, la décote est de l'ordre du quart du prix d'un terrain desservi, mais les terrains non desservis y sont aussi beaucoup plus grands et périurbains, ce qui illustre la difficulté : le non-desservi se vend dans d'autres secteurs, à d'autres acheteurs, et la comparaison directe entre les deux marchés est rarement nécessaire.
209 209
210−L'ajustement de \emph{topographie} se raisonne de la même façon, par le coût des travaux qu'une pente marquée, un roc affleurant ou un remblai imposent au constructeur : excavation supplémentaire, dynamitage, murs de soutènement, fondations spéciales, drainage. Une pente peut aussi apporter une vue ou un sous-sol à aire ouverte que le marché paie ; le signe n'est donc pas toujours négatif, et l'évaluateur documente ce que la pente coûte et ce qu'elle offre. 210+L'ajustement de \emph{topographie} se raisonne de la même façon, par le coût des travaux qu'une pente marquée, un roc affleurant ou un remblai imposent au constructeur : excavation, dynamitage, murs de soutènement, fondations spéciales, drainage. Une pente peut aussi apporter une vue ou un sous-sol à aire ouverte que le marché paie ; le signe n'est pas toujours négatif.
211 211
212 L'ajustement de \emph{zonage}, enfin, change la nature du bien plus qu'il ne le corrige : un terrain où trois logements sont permis ne se compare à un terrain unifamilial qu'après conversion en valeur par logement constructible, et un ajustement en pourcentage par logement supplémentaire, comme celui qu'estime l'exemple, n'est qu'une approximation valable pour de faibles différences de densité. Au-delà, on change d'unité et de comparables. 212 L'ajustement de \emph{zonage}, enfin, change la nature du bien plus qu'il ne le corrige : un terrain où trois logements sont permis ne se compare à un terrain unifamilial qu'après conversion en valeur par logement constructible, et un ajustement en pourcentage par logement supplémentaire, comme celui qu'estime l'exemple, n'est qu'une approximation valable pour de faibles différences de densité. Au-delà, on change d'unité et de comparables.
213 213
@@ -223,9 +223,9 @@ L'analyse procède alors par la plus haute et meilleure utilisation, que le \cre
223 \begin{equation}\label{eq:25:densification} 223 \begin{equation}\label{eq:25:densification}
224 \hat V_L^{\,\text{dens}} = \frac{V_{\text{achevé}}(n) - C_N(n)\,(1+\tau_E) - C_{\text{démol}}}{(1+r)^{T}}, 224 \hat V_L^{\,\text{dens}} = \frac{V_{\text{achevé}}(n) - C_N(n)\,(1+\tau_E) - C_{\text{démol}}}{(1+r)^{T}},
225 \end{equation} 225 \end{equation}
226−où $T$ est le délai jusqu'à la livraison et $r$ le taux qui reflète le risque du projet. L'évaluateur compare $\hat V_L^{\,\text{dens}}$ à la valeur du terrain pour l'usage unifamilial et à la valeur de la propriété dans son usage actuel ; le terrain intercalaire vaut la plus grande des trois, et la différence entre la valeur de densification et la valeur unifamiliale mesure ce que le marché paie pour le droit de densifier. La littérature a montré que ce droit est une option : les travaux de \textcite{rosenthalHelsley1994} et de \textcite{munneke1996} sur la décision de redéveloppement, ceux de \textcite{dyeMcmillen2007} et de \textcite{mcmillenOsullivan2013} sur les démolitions-reconstructions résidentielles et ceux de \textcite{clappSalavei2010}, \textcite{clappBardosWong2012} et \textcite{munnekeWomack2020} sur la prime d'option dans les prix des propriétés bâties établissent que la valeur d'un terrain susceptible de densification excède la valeur résiduelle de son meilleur projet immédiat, parce que le propriétaire peut attendre un meilleur moment. Pour l'évaluateur, la conséquence pratique est double : les ventes de propriétés « à démolir » dans un quartier en densification sont des ventes de terrains, et elles constituent souvent les meilleurs comparables d'un terrain intercalaire une fois le coût de démolition ajouté au prix ; et la prime observée sur ces ventes, par rapport à la valeur résiduelle du projet le plus probable, mesure l'option que le marché attribue au site. 226+où $T$ est le délai jusqu'à la livraison et $r$ le taux qui reflète le risque du projet. Le terrain intercalaire vaut la plus grande des trois valeurs que lui confèrent la densification, l'usage unifamilial et l'usage actuel de la propriété ; la différence entre la valeur de densification et la valeur unifamiliale mesure ce que le marché paie pour le droit de densifier. La littérature a montré que ce droit est une option : les travaux de \textcite{rosenthalHelsley1994} et de \textcite{munneke1996} sur la décision de redéveloppement, ceux de \textcite{dyeMcmillen2007} et de \textcite{mcmillenOsullivan2013} sur les démolitions-reconstructions résidentielles et ceux de \textcite{clappSalavei2010}, \textcite{clappBardosWong2012} et \textcite{munnekeWomack2020} sur la prime d'option dans les prix des propriétés bâties établissent que la valeur d'un terrain susceptible de densification excède la valeur résiduelle de son meilleur projet immédiat, parce que le propriétaire peut attendre un meilleur moment. Pour l'évaluateur, la conséquence pratique est double : les ventes de propriétés « à démolir » dans un quartier en densification sont des ventes de terrains, et elles constituent souvent les meilleurs comparables d'un terrain intercalaire une fois le coût de démolition ajouté au prix ; et la prime observée sur ces ventes, par rapport à la valeur résiduelle du projet le plus probable, mesure l'option que le marché attribue au site.
227 227
228−Dans le jeu synthétique du chapitre, le prix implicite d'un logement constructible supplémentaire est estimé à environ 15 \% du prix d'un terrain unifamilial, ce qui signifie qu'un terrain où trois logements sont permis vaut un tiers de plus que le même terrain limité à un seul. Ce chiffre est une hypothèse de génération, non une mesure du marché de Gatineau ; il illustre la logique de l'unité par logement constructible plus qu'il ne renseigne sur un marché réel, et il est très inférieur à ce qu'un passage de un à trois logements vaut dans les quartiers centraux de Montréal, où le terrain unifamilial est lui-même rare. 228+Dans le jeu synthétique du chapitre, le prix implicite d'un logement constructible supplémentaire est estimé à environ 15 \% du prix d'un terrain unifamilial : un terrain où trois logements sont permis y vaut un tiers de plus que le même terrain limité à un seul. Ce chiffre est une hypothèse de génération, non une mesure d'un marché réel ; il illustre la logique de l'unité par logement constructible.
229 229
230 \section{Exemple intégral : le terrain du sujet du cas 1}\label{sec:25:exemple} 230 \section{Exemple intégral : le terrain du sujet du cas 1}\label{sec:25:exemple}
231 231
@@ -257,8 +257,8 @@ arrondie au \dollars{5000} près, avec une fourchette raisonnable de \dollars{24
257 257
258 \begin{table}[htbp] 258 \begin{table}[htbp]
259 \caption{Modèle hédonique des terrains vacants (données synthétiques, $n = 200$) : coefficients, erreurs-types robustes (HC1) et effets en pourcentage}\label{tab:25:hedonique} 259 \caption{Modèle hédonique des terrains vacants (données synthétiques, $n = 200$) : coefficients, erreurs-types robustes (HC1) et effets en pourcentage}\label{tab:25:hedonique}
260−\centering\small 260+\centering\footnotesize
261−\begin{tabular}{@{}l S[table-format=-1.4] S[table-format=1.4] S[table-format=-2.1] l@{}} 261+\begin{tabularx}{\textwidth}{@{}l S[table-format=-2.4] S[table-format=1.4] S[table-format=-2.1] X@{}}
262 \toprule 262 \toprule
263 Variable & {Coefficient} & {Erreur-type} & {Effet (\%)} & Lecture \\ 263 Variable & {Coefficient} & {Erreur-type} & {Effet (\%)} & Lecture \\
264 \midrule 264 \midrule
@@ -276,9 +276,9 @@ Secteur Buckingham & -0.1870 & 0.0355 & -17.1 & \\
276 Secteur Masson-Angers & -0.2303 & 0.0292 & -20.6 & \\ 276 Secteur Masson-Angers & -0.2303 & 0.0292 & -20.6 & \\
277 Mois depuis juillet 2024 & 0.0028 & 0.0005 & 0.3 & tendance mensuelle \\ 277 Mois depuis juillet 2024 & 0.0028 & 0.0005 & 0.3 & tendance mensuelle \\
278 \midrule 278 \midrule
279−\multicolumn{5}{@{}l}{$R^2 = 0{,}895$ ; écart-type résiduel 0,089 ; facteur de Duan 1,004 ; effets en pourcentage : $100\,[\exp(\hat\beta) - 1]$ \parencite{halvorsenPalmquist1980}} \\ 279+\multicolumn{5}{@{}p{\textwidth}}{$R^2 = 0{,}895$ ; écart-type résiduel 0,089 ; facteur de Duan 1,004 ; effets en pourcentage : $100\,[\exp(\hat\beta) - 1]$ \parencite{halvorsenPalmquist1980}.} \\
280 \bottomrule 280 \bottomrule
281−\end{tabular} 281+\end{tabularx}
282 \tabsource{\synth{\texttt{analysis/python/cases/ch25\_terrain.py}, fonction \texttt{hedonique\_terrains} ; MCO de \texttt{traite.hedonique.mco}}.} 282 \tabsource{\synth{\texttt{analysis/python/cases/ch25\_terrain.py}, fonction \texttt{hedonique\_terrains} ; MCO de \texttt{traite.hedonique.mco}}.}
283 \end{table} 283 \end{table}
284 284
@@ -416,26 +416,26 @@ Le revenu net stabilisé de \dollars{89956} est celui de \texttt{traite.cas3},
416 Le revenu requis par le bâtiment, $R_B C_B = \dollars{71250}$, absorbe 79 \% du revenu net ; le revenu résiduel du terrain, \dollars{18706}, capitalisé à 3,75 \%, donne une valeur résiduelle de \dollars{498820}, soit \parmsq{674} et 30,4 \% de la somme terrain plus bâtiment. Cette somme, \dollars{1638820}, est inférieure de 19,6 \% à la valeur par capitalisation directe, et l'écart est instructif : le taux global de 4,415 \% extrait du marché montréalais incorpore des anticipations de croissance des loyers et une prime d'option de redéveloppement que la récupération linéaire du bâtiment ignore. Si l'on impose la cohérence avec la capitalisation directe, c'est-à-dire $V_L + C_B = \dollars{2037503}$, le taux du terrain implicite tombe à 2,08 \%, valeur qu'aucun investisseur n'accepterait comme rendement courant mais qui s'interprète comme $r - g$ avec une croissance attendue de la rente foncière plus forte que celle des loyers ; et l'extraction sur la valeur capitalisée, $\dollars{2037503} - \dollars{1140000} = \dollars{897503}$, donne un terrain de \parmsq{1213}, près du double du résultat résiduel. Entre \dollars{499000} et \dollars{898000}, l'écart tient tout entier aux hypothèses sur le bâtiment et sur les taux, non au terrain. 416 Le revenu requis par le bâtiment, $R_B C_B = \dollars{71250}$, absorbe 79 \% du revenu net ; le revenu résiduel du terrain, \dollars{18706}, capitalisé à 3,75 \%, donne une valeur résiduelle de \dollars{498820}, soit \parmsq{674} et 30,4 \% de la somme terrain plus bâtiment. Cette somme, \dollars{1638820}, est inférieure de 19,6 \% à la valeur par capitalisation directe, et l'écart est instructif : le taux global de 4,415 \% extrait du marché montréalais incorpore des anticipations de croissance des loyers et une prime d'option de redéveloppement que la récupération linéaire du bâtiment ignore. Si l'on impose la cohérence avec la capitalisation directe, c'est-à-dire $V_L + C_B = \dollars{2037503}$, le taux du terrain implicite tombe à 2,08 \%, valeur qu'aucun investisseur n'accepterait comme rendement courant mais qui s'interprète comme $r - g$ avec une croissance attendue de la rente foncière plus forte que celle des loyers ; et l'extraction sur la valeur capitalisée, $\dollars{2037503} - \dollars{1140000} = \dollars{897503}$, donne un terrain de \parmsq{1213}, près du double du résultat résiduel. Entre \dollars{499000} et \dollars{898000}, l'écart tient tout entier aux hypothèses sur le bâtiment et sur les taux, non au terrain.
417 417
418 \begin{table}[htbp] 418 \begin{table}[htbp]
419−\caption{Technique résiduelle du terrain sur le cas 3 : cas de base et sensibilité à la dépréciation du bâtiment, à sa durée de vie restante et au taux du terrain (valeur du terrain en dollars)}\label{tab:25:residuelle} 419+\caption{Technique résiduelle du terrain sur le cas 3 : cas de base et sensibilité à la dépréciation du bâtiment, à sa durée de vie restante et au taux du terrain (valeur du terrain en milliers de dollars)}\label{tab:25:residuelle}
420−\centering\small 420+\centering\footnotesize\setlength{\tabcolsep}{4pt}
421−\begin{tabular}{@{}l S[table-format=2.0] S[table-format=-7.0] S[table-format=-7.0] S[table-format=-7.0] S[table-format=-7.0] S[table-format=-7.0]@{}} 421+\begin{tabular}{@{}l S[table-format=2.0] S[table-format=-4.0] S[table-format=-4.0] S[table-format=-4.0] S[table-format=-4.0] S[table-format=-4.0]@{}}
422 \toprule 422 \toprule
423 Dépréciation ; $C_B$ (\$) & {$n$ (ans)} & {$R_L$ 3,25 \%} & {3,50 \%} & {3,75 \%} & {4,00 \%} & {4,25 \%} \\ 423 Dépréciation ; $C_B$ (\$) & {$n$ (ans)} & {$R_L$ 3,25 \%} & {3,50 \%} & {3,75 \%} & {4,00 \%} & {4,25 \%} \\
424 \midrule 424 \midrule
425−44 \% ; 1 330 000 & 30 & 73767 & -26502 & -113402 & -189440 & -256531 \\ 425+44 \% ; 1 330 000 & 30 & 74 & -27 & -113 & -189 & -257 \\
426− & 40 & 414792 & 290164 & 182153 & 87644 & 4253 \\ 426+ & 40 & 415 & 290 & 182 & 88 & 4253 \\
427− & 50 & 619408 & 480164 & 359487 & 253894 & 160724 \\ 427+ & 50 & 619 & 480 & 359 & 254 & 161 \\
428 \addlinespace 428 \addlinespace
429−52 \% ; 1 140 000 & 30 & 458639 & 344450 & 245487 & 158894 & 82488 \\ 429+52 \% ; 1 140 000 & 30 & 459 & 344 & 245 & 159 & 82 \\
430− & 40 & 750946 & 615879 & \bfseries 498820 & 396394 & 306018 \\ 430+ & 40 & 751 & 616 & \bfseries 499 & 396 & 306 \\
431− & 50 & 926331 & 778736 & 650820 & 538894 & 440135 \\ 431+ & 50 & 926 & 779 & 651 & 539 & 440 \\
432 \addlinespace 432 \addlinespace
433−60 \% ; 950 000 & 30 & 843510 & 715402 & 604376 & 507227 & 421508 \\ 433+60 \% ; 950 000 & 30 & 844 & 715 & 604 & 507 & 422 \\
434− & 40 & 1087100 & 941593 & 815487 & 705144 & 607782 \\ 434+ & 40 & 1087 & 942 & 815 & 705 & 608 \\
435− & 50 & 1233254 & 1077307 & 942153 & 823894 & 719547 \\ 435+ & 50 & 1233 & 1077 & 942 & 824 & 720 \\
436 \bottomrule 436 \bottomrule
437 \end{tabular} 437 \end{tabular}
438−\tabsource{\synth{\texttt{analysis/python/cases/ch25\_terrain.py}, fonction \texttt{sensibilite\_residuelle} ; RNE de \texttt{traite.cas3}} ; $R_B = R_L + 1/n$ ; le cas de base est en gras.} 438+\tabsource{\synth{\texttt{analysis/python/cases/ch25\_terrain.py}, fonction \texttt{sensibilite\_residuelle} ; RNE de \texttt{traite.cas3}} ; $R_B = R_L + 1/n$ ; montants arrondis au millier ; le cas de base est en gras.}
439 \end{table} 439 \end{table}
440 440
441 \begin{figure}[htbp] 441 \begin{figure}[htbp]
@@ -483,7 +483,7 @@ Le \cref{tab:25:lotissement} déroule le calcul. La valeur actualisée des flux
483 \figsource{\synth{script \texttt{analysis/python/figures/ch25\_figures.py}, graine 20261031}.} 483 \figsource{\synth{script \texttt{analysis/python/figures/ch25\_figures.py}, graine 20261031}.}
484 \end{figure} 484 \end{figure}
485 485
486−La \cref{fig:25:lotissement} montre ce qui pèse. Une variation de 10 \% du prix des lots déplace la valeur du site de 16,7 \% (\dollars{1025828} à \dollars{1435927}) : c'est l'effet de levier de l'\cref{eq:25:lotissement}, le terrain brut n'étant que 40 \% du produit. Une absorption de deux lots par année au lieu de quatre, qui porte le développement à six ans, ramène la valeur à \dollars{963545} (moins 21,7 \%), tandis qu'une absorption de six lots par année la porte à \dollars{1331556} ; le rythme d'absorption est une hypothèse de marché, à documenter par les ventes des projets voisins, non un paramètre technique. Le coût de viabilisation (\dollars{50000} à \dollars{80000} par lot) et le profit (10 à 20 \%) ont des effets symétriques d'environ \dollars{130000} à \dollars{165000} ; le taux d'actualisation (8 à 15 \%) a l'effet le moins marqué, parce que l'horizon est court. L'ordre des sensibilités s'inverserait pour un grand lotissement étalé sur dix ans, où le taux et l'absorption domineraient. Enfin, la cession de \msq{1000} pour fins de parcs a un coût d'opportunité que l'on peut chiffrer : ces mille mètres carrés auraient formé 1,6 lot de plus, dont le produit net de frais et de profit, encaissé la troisième année, vaut aujourd'hui quelque \dollars{248000} ; c'est le prix du parc pour le promoteur, et une municipalité qui exigerait la contribution en argent plutôt qu'en terrain obtiendrait, au plafond de 10 \% de la valeur du site, environ \dollars{123000}, soit la moitié. La forme de la contribution n'est donc pas neutre, et le promoteur comme l'évaluateur ont intérêt à lire le règlement municipal avant de poser l'hypothèse. 486+La \cref{fig:25:lotissement} montre ce qui pèse. Une variation de 10 \% du prix des lots déplace la valeur du site de 16,7 \% (\dollars{1025828} à \dollars{1435927}) : c'est l'effet de levier de l'\cref{eq:25:lotissement}, le terrain brut n'étant que 40 \% du produit. Une absorption de deux lots par année au lieu de quatre, qui porte le développement à six ans, ramène la valeur à \dollars{963545} (moins 21,7 \%), tandis qu'une absorption de six lots par année la porte à \dollars{1331556} ; le rythme d'absorption est une hypothèse de marché, à documenter par les ventes des projets voisins, non un paramètre technique. Le coût de viabilisation (\dollars{50000} à \dollars{80000} par lot) et le profit (10 à 20 \%) ont des effets symétriques d'environ \dollars{130000} à \dollars{165000} ; le taux d'actualisation (8 à 15 \%) a l'effet le moins marqué, parce que l'horizon est court. L'ordre des sensibilités s'inverserait pour un grand lotissement étalé sur dix ans, où le taux et l'absorption domineraient. Enfin, la cession de \msq{1000} pour fins de parcs a un coût d'opportunité que l'on peut chiffrer : ces mille mètres carrés auraient formé 1,6 lot de plus, dont le produit net de frais et de profit, encaissé la troisième année, vaut aujourd'hui quelque \dollars{248000} ; c'est le prix du parc pour le promoteur, et une municipalité qui exigerait la contribution en argent plutôt qu'en terrain obtiendrait, au plafond de 10 \% de la valeur du site, environ \dollars{123000}, soit la moitié. La forme de la contribution n'est donc pas neutre, et le règlement municipal doit être lu avant de poser l'hypothèse.
487 487
488 \section{Sensibilité : ce qui pèse le plus}\label{sec:25:sensibilite} 488 \section{Sensibilité : ce qui pèse le plus}\label{sec:25:sensibilite}
489 489
@@ -498,7 +498,7 @@ Les trois exemples du chapitre mesurent, chacun à sa manière, le même phénom
498 \item \emph{Appliquer la technique résiduelle à un bâtiment ancien et en présenter le résultat comme une valeur.} Elle teste la cohérence des hypothèses ; elle ne les remplace pas. Une valeur négative signale des hypothèses incompatibles, non un terrain sans valeur. 498 \item \emph{Appliquer la technique résiduelle à un bâtiment ancien et en présenter le résultat comme une valeur.} Elle teste la cohérence des hypothèses ; elle ne les remplace pas. Une valeur négative signale des hypothèses incompatibles, non un terrain sans valeur.
499 \item \emph{Lotir sans actualiser.} La version statique de la méthode du lotissement surestime le terrain de 28 \% dans l'exemple, davantage si l'absorption est lente ; et la contribution pour fins de parcs, en terrain ou en argent, change le résultat. 499 \item \emph{Lotir sans actualiser.} La version statique de la méthode du lotissement surestime le terrain de 28 \% dans l'exemple, davantage si l'absorption est lente ; et la contribution pour fins de parcs, en terrain ou en argent, change le résultat.
500 \item \emph{Ignorer les contraintes du site.} Un terrain en zone inondable de classe élevée, en zone agricole sans autorisation ou grevé d'une servitude qui réduit l'enveloppe constructible n'est pas comparable à un terrain libre, quelle que soit sa superficie. 500 \item \emph{Ignorer les contraintes du site.} Un terrain en zone inondable de classe élevée, en zone agricole sans autorisation ou grevé d'une servitude qui réduit l'enveloppe constructible n'est pas comparable à un terrain libre, quelle que soit sa superficie.
501−\item \emph{Lire la valeur du terrain au rôle comme une valeur marchande à la date d'évaluation.} Elle est établie à la date de référence du rôle, selon l'utilisation la plus probable et les conventions du Manuel ; elle informe sur la part du terrain dans un secteur, non sur la valeur d'un terrain donné aujourd'hui. 501+\item \emph{Lire la valeur du terrain au rôle comme une valeur marchande à la date d'évaluation.} Elle est établie à la date de référence du rôle et selon les conventions du Manuel ; elle informe sur la part du terrain dans un secteur, non sur un terrain donné aujourd'hui.
502 \end{itemize} 502 \end{itemize}
503 \end{erreurs} 503 \end{erreurs}
504 504
modified solutions/ch28.tex +1 −1
@@ -26,5 +26,5 @@ Sans gestion imputée, les dépenses totales du triplex tombent de \dollars{1854
26 \end{solution} 26 \end{solution}
27 27
28 \begin{solution}{ex:28:7}{Réserve, dépenses en capital et double comptage} 28 \begin{solution}{ex:28:7}{Réserve, dépenses en capital et double comptage}
29−Les dépenses en capital surviennent aux années 2, 4 et 7 de l'horizon (2027, 2029 et 2032 pour une évaluation en 2026). Valeur actuelle à \pct{7.25} : $\dollars{85000}/1{,}0725^2 + \dollars{40000}/1{,}0725^4 + \dollars{120000}/1{,}0725^7 = \dollars{73898} + \dollars{30232} + \dollars{73518} = \dollars{177648}$. Annuité équivalente sur dix ans : facteur de recouvrement $0{,}0725/[1 - 1{,}0725^{-10}] = \num{0.144027}$, d'où $\dollars{177648} \times \num{0.144027} = \dollars{25586}$ par année, légèrement supérieure à la moyenne simple de \dollars{24500} parce que les travaux sont concentrés en début d'horizon. L'évaluateur qui retranche cette annuité du revenu net en plus de la réserve obtient $\dollars{89955.75} - \dollars{25586.15} = \dollars{64369.60}$ et, à \pct{4.415}, une valeur de \dollars{1457975}, inférieure de \pct{28.4} à la valeur cohérente de \dollars{2037503}. L'erreur est double : d'une part les travaux sont comptés une fois dans les flux actualisés et une fois dans le revenu capitalisé ; d'autre part le taux de \pct{4.415} a été extrait de ventes dont le revenu net ne comportait qu'une réserve pour composantes à vie courte, de sorte que même sans flux actualisés, une réserve « pour gros travaux » exigerait un taux plus bas. Équivalence pour la composante de \dollars{2200} par logement : $C = 12 \times \dollars{2200} = \dollars{26400}$ tous les douze ans. Valeur actuelle des remplacements perpétuels à \pct{3} : $C/[(1{,}03)^{12} - 1] = \dollars{26400}/\num{0.425761} = \dollars{62006.64}$. Réserve au fonds d'amortissement : $RR = C \times 0{,}03/\num{0.425761} = \dollars{1860.20}$ par année, dont la valeur actuelle perpétuelle est $RR/0{,}03 = \dollars{62006.64}$. Les deux coïncident exactement, ce qui est la \cref{eq:28:va-capex} : capitaliser un revenu diminué de la réserve du fonds d'amortissement, ou actualiser des flux diminués des remplacements datés, au même taux, donne la même valeur, à condition de ne le faire qu'une fois. 29+Les dépenses en capital surviennent aux années 2, 4 et 7 de l'horizon (2027, 2029 et 2032 pour une évaluation en 2026). Valeur actuelle à \pct{7.25} : $\dollars{85000}/1{,}0725^2 + \dollars{40000}/1{,}0725^4 + \dollars{120000}/1{,}0725^7 = \dollars{73897} + \dollars{30232} + \dollars{73519} = \dollars{177648}$. Annuité équivalente sur dix ans : facteur de recouvrement $0{,}0725/[1 - 1{,}0725^{-10}] = \num{0.144027}$, d'où $\dollars{177648} \times \num{0.144027} = \dollars{25586}$ par année, légèrement supérieure à la moyenne simple de \dollars{24500} parce que les travaux sont concentrés en début d'horizon. L'évaluateur qui retranche cette annuité du revenu net en plus de la réserve obtient $\dollars{89955.75} - \dollars{25586.15} = \dollars{64369.60}$ et, à \pct{4.415}, une valeur de \dollars{1457975}, inférieure de \pct{28.4} à la valeur cohérente de \dollars{2037503}. L'erreur est double : d'une part les travaux sont comptés une fois dans les flux actualisés et une fois dans le revenu capitalisé ; d'autre part le taux de \pct{4.415} a été extrait de ventes dont le revenu net ne comportait qu'une réserve pour composantes à vie courte, de sorte que même sans flux actualisés, une réserve « pour gros travaux » exigerait un taux plus bas. Équivalence pour la composante de \dollars{2200} par logement : $C = 12 \times \dollars{2200} = \dollars{26400}$ tous les douze ans. Valeur actuelle des remplacements perpétuels à \pct{3} : $C/[(1{,}03)^{12} - 1] = \dollars{26400}/\num{0.425761} = \dollars{62006.64}$. Réserve au fonds d'amortissement : $RR = C \times 0{,}03/\num{0.425761} = \dollars{1860.20}$ par année, dont la valeur actuelle perpétuelle est $RR/0{,}03 = \dollars{62006.64}$. Les deux coïncident exactement, ce qui est la \cref{eq:28:va-capex} : capitaliser un revenu diminué de la réserve du fonds d'amortissement, ou actualiser des flux diminués des remplacements datés, au même taux, donne la même valeur, à condition de ne le faire qu'une fois.
30 \end{solution} 30 \end{solution}
added verification/chapters/ch24.md +45 −0
@@ -0,0 +1,45 @@
1+# Chapitre 24 — Dépréciation et désuétudes : bilan de rédaction (2026-10-31)
2+
3+## Compteurs
4+- Prose : ≈ 14 100 mots (regex de `tools/check_manuscript.py` sur `manuscript/chapters/ch24.tex`, tableaux et légendes compris ; ≈ 12 500 mots de prose hors tableaux) ; 37 pages compilées (chapitre + solutions + bibliographie du chapitre).
5+- Figures : 4 PDF Matplotlib (toutes synthétiques, cas 1) — `ch24-fig-courbes.pdf` (extraction sur 600 ventes + profils comparés), `ch24-fig-composantes.pdf`, `ch24-fig-decomposition.pdf` (deux cascades), `ch24-fig-sensibilite.pdf` (grille + tornade).
6+- Tableaux : 8 (taxonomie ; composantes de courte durée ; quatre lectures physiques ; terrain par secteur ; tranches d'âge ; doubles comptages ; récapitulatif des deux lectures ; variantes d'extraction).
7+- Équations numérotées : 18 (définition, vie restante, âge effectif, curabilité, âge-vie, modifiée, ventilée, écart, fonctionnelle curable, loyer, RNE, paires, externe RNE, extraction, quadratique, profil hédonique, conversion, valeur du cas 1) ; 1 définition, 2 propositions démontrées (écart ventilée/âge-vie ; ordre des déductions).
8+- Exercices : 7 (niveaux 1, 1, 2, 2, 2, 3, 3) ; solutions détaillées dans `solutions/ch24.tex`, chiffres testés (`TestExercices`).
9+- Encadrés : objectifs, pratique (inspection → âge effectif, ch. 11), quebec, synthetique, exemple intégral (7 étapes), erreurs, limites, synthese.
10+- Citations : 27 clés, toutes dans `references/library.bib` ; `references/lib-ch24.bib` ne contient aucune entrée (aucune source web nouvelle consultée ; `ch24-registry.csv` = en-tête seul).
11+
12+## Contrôles
13+- `tools/compile_chapter.sh 24` → `OK ch24 : 37 pages, 0 references/citations non definies, 0 overfull hbox`.
14+- `python3 -m pytest -q analysis/python/tests/test_ch24.py` → 23 passed (et test_ch11 + test_ch21 toujours verts : 59 passed au total).
15+- `python3 tools/check_manuscript.py --no-log` : seules remarques pour ch24 = 4 figures non inscrites dans `verification/figures.csv` global (attendu : règle de collision, elles sont dans `ch24-figures.csv`).
16+- PDF relu : planche de contact des 37 pages + pages 8, 15, 22, 25 à 70 dpi ; aucun débordement.
17+- Convention `\cref` sans article : vérifiée par grep (article/préposition écrits ; renvois entre parenthèses sans article comme au ch. 21).
18+- Renvois fins vers d'autres chapitres compilés : `eq:11:aeff`, `sec:11:etat`, `tab:11:fiche`, `tab:11:travaux`, `prop:equivalence` (ch. 21), `ch:17/18/20/21/25/28/29/32/45`.
19+
20+## Cohérence inter-chapitres (demande de la coordination)
21+- `ch24_depreciation.py` **importe** `ch11_inspection` (fiche de 20 composantes, convention a_eff = (1−λ)a + λφ(c)L, λ = 0,5, L = 60) et `ch21_cout_neuf` (C_N = 397 567,33 $) : âge effectif de la structure 29 ans, vie restante 31 ans, curable 10 479,98 $, courte durée 130 584,55 $ (18 composantes après retrait de l'entrée asphaltée), longue durée 80 025,35 $, ventilée 221 089,88 $ = 55,61 % — chiffres identiques au ch. 11, repris dans tab. 24.2-24.3 et fig. 24.2-24.3. Aucun écart.
22+- Le ch. 24 ajoute : désuétude fonctionnelle curable 7 605,31 $ (carence de salle d'eau, constat fictif propre au ch. 24) ; D_ext = 0 ; extraction de marché ; rapprochement chiffré (étape 6 de l'exemple) entre la lecture ventilée (57,52 %, V = 445 872 $) et la lecture extraite (23,91 %, V = 579 501 $).
23+
24+## Chiffres à reprendre par les ch. 20, 25 et 45
25+- **Valeur du terrain retenue : V_L = 277 000 $** (447 $/m² pour 620 m²). Justification : médiane de la valeur extraite des 13 ventes récentes (≤ 10 ans) du secteur Hull, V_L = P_adj − C_N(1 − âge/60), prix ramenés au 2026-09-01 par la tendance hédonique (0,364 %/mois), C_N transposé du sujet (élasticité −0,10, ±5 %/classe de qualité) ; médiane brute 276 953,99 $, part médiane du prix des maisons récentes 50,5 %, α = V_L / prix neuf hédonique (720 727 $) = 0,384. Variantes : 271 528 $ (≤ 5 ans) à 303 775 $ (≤ 15 ans). Le ch. 25 doit la confronter aux méthodes propres au terrain (ou calibrer son jeu de terrains synthétique dessus) et la confirmer ou la réviser explicitement.
26+- **Dépréciation totale retenue : 95 066,36 $ = 23,91 % de C_N** (extraite du marché à 28 ans : 22,00 % × 397 567,33 = 87 461,05 $, + désuétude fonctionnelle 7 605,31 $ ; D_ext = 0). Contribution du bâtiment 302 500,97 $.
27+- **Indication par le coût : 579 500,97 $, arrondie 580 000 $** (lecture ventilée : 445 872,14 $, présentée comme borne basse de méthode, non retenue). À confronter au ch. 45 avec 581 595 $ (moyenne des prix ajustés, ch. 17) et 637 953 $ (hédonique, ch. 18).
28+- Courbe de dépréciation extraite : δ̂(a) = 0,0107 + 0,00891 a − 0,0000514 a² (R² 0,250) ; 0,619 %/an par l'origine (vie linéaire implicite 162 ans) ; hédonique converti au bâtiment 18,65 % à 28 ans ; profil du générateur 19,86 %.
29+
30+## Points non vérifiés ou hypothèses déclarées (voir ch24-claims.csv)
31+1. Vies utiles, φ(c), λ, vie économique 60 ans : hypothèses du ch. 11 réutilisées (CLM-24-013).
32+2. Carence de salle d'eau et soumission de 16 000 $ ; condition de curabilité non testable sur les données (CLM-24-012).
33+3. Paramètres de l'extraction (élasticité, qualité, fenêtre ≤ 10 ans) et V_L = 277 000 $ : allocation implicite du marché synthétique, pas de vente de terrain vacant (CLM-24-014, -015).
34+4. Exemples incurables (75 $/mois, 6 000 $/an, parts 60/70 %, paires) : illustrations hypothétiques ; seuls le MRB 19,82 (cas 2) et le taux 4,50 % (CBRE, SRC-E-045) sont ancrés (CLM-24-016).
35+5. Ordres de grandeur de la littérature (Malpezzi et al. ≈ 0,5-1 %/an) repris des notes D, articles non relus (CLM-24-003, -004, partiellement_verifie).
36+6. Tables de dépréciation 3E du MEFQ non dépouillées ; aucune étude arbitrée québécoise sur la dépréciation des logements repérée (CLM-24-017).
37+
38+## Fichiers livrés
39+`manuscript/chapters/ch24.tex`, `solutions/ch24.tex`, `analysis/python/cases/ch24_depreciation.py`, `analysis/python/figures/ch24_{courbes,decomposition,composantes,sensibilite}.py`, `analysis/python/tests/test_ch24.py`, `assets/figures/ch24/*.pdf` (4), `verification/chapters/ch24-{figures,calculations,claims,registry}.csv`, `references/lib-ch24.bib` (vide), ce bilan. Rien n'a été écrit dans les CSV globaux, `library.bib`, `traite/*.py` ni dans les fichiers d'autres chapitres.
40+
41+## Suggestions pour l'harmonisation
42+- Reporter dans l'annexe des conventions : « la dépréciation extraite du marché est totale ; seules les pertes atypiques propres au sujet s'y ajoutent » et la proposition d'ordre (désuétude proportionnelle sur la base restante).
43+- Candidats à `traite.cout` si d'autres chapitres en ont besoin : `cout_neuf_ventes` (transposition par élasticité et qualité), `valeur_terrain_par_secteur` (extraction sur ventes récentes), `ajuster_profil` / `taux_quadratique`, `total_vers_batiment` (conversion d_B = d_tot/(1−α)).
44+- Le ch. 20 (réconciliation, encore stub) peut citer directement 580 000 $ (coût) ; le ch. 25 doit publier une valeur de terrain finale et, si elle diffère de 277 000 $, le ch. 45 recalculera l'indication par `valeur_par_cout` (sensibilité : ±15 % de terrain → 537 951 à 621 051 $).
45+- Titres d'encadrés tcolorbox : une virgule dans l'argument optionnel de `quebec`/`pratique` casse pgfkeys (`title=#1` sans accolades dans `styles/traite-qc.sty`) ; à corriger dans le style lors de l'harmonisation (`title={#1}`).
added verification/chapters/ch27-claims.csv +29 −0
@@ -0,0 +1,29 @@
1+id,chapitre,affirmation,source_id,verification,date,statut,notes
2+CLM-27-001,27,"SCHL oct. 2025 : inoccupation tous appartements par RMR — Montréal 2,9 (2,1) ; Québec 2,4 (0,9) ; Gatineau QC 3,8 (1,9) ; Sherbrooke 2,7 (1,4) ; Trois-Rivières 2,7 (0,9) ; Saguenay 1,3 (1,6) ; 2 ch. 2025 : 2,9/2,5/2,6/3,0/2,5/0,6",SRC-E-007,Tableau 1.1.1 du fichier rmr-quebec-2025-fr.xlsx lu par script (data/raw/schl_rml_2025),2026-10-31,verifie,Chiffres cités avec attribution (conditions SCHL)
3+CLM-27-002,27,"SCHL oct. 2025 : taux de rotation tous appartements — Montréal 9,4 (11,1) ; Québec 13,0 (13,9) ; Gatineau 16,2 (17,3 ; qualité d) ; Sherbrooke 12,0 (10,4) ; Trois-Rivières 10,1 (10,2) ; Saguenay 12,6 (13,3)",SRC-E-007,Tableau 1.1.6 du fichier rmr-quebec-2025-fr.xlsx,2026-10-31,verifie,
4+CLM-27-003,27,"SCHL oct. 2025, île de Montréal, inoccupation selon la taille : 3-5 : 2,3 ; 6-19 : 2,2 ; 20-49 : 3,9 ; 50-99 : 3,8 ; 100+ : 5,1 ; tous 3,1 ; RMR : 2,1/2,1/3,4/3,7/5,7/2,9 ; rotation RMR : 7,6/8,5/9,4/12,3/14,2/9,4",SRC-E-007,Tableaux 1.3.1 et 1.3.4 du fichier rmr-montreal-2025-fr.xlsx,2026-10-31,verifie,Cellule 3-5 unités 2024 (île) supprimée (**)
5+CLM-27-004,27,"SCHL oct. 2025, RMR Montréal, inoccupation par quartile de loyer : Q1 1,3 ; Q2 1,9 ; Q3 3,0 ; Q4 4,9 (2024 : 0,5/0,7/1,6/4,4)",SRC-E-007,Tableau 1.4 du fichier Montréal,2026-10-31,verifie,
6+CLM-27-005,27,"SCHL oct. 2025, île de Montréal, loyer moyen des logements inoccupés vs occupés : tous 1 573 vs 1 275 $ (+23,4 %) ; 2 ch. 1 815 vs 1 349 $ (+34,5 %) ; studio 1 091/1 009 ; 1 ch. 1 305/1 113 ; 3 ch.+ 2 138/1 693",SRC-E-007,Tableau 1.1.9 du fichier Montréal,2026-10-31,verifie,Écarts statistiquement significatifs (O) pour l'île
7+CLM-27-006,27,"SCHL oct. 2025, île de Montréal, inoccupation selon l'année de construction : avant 1940 2,2 ; 1940-59 2,6 ; 1960-74 3,3 ; 1975-89 2,8 ; 2015+ 5,6 ; cellules 1990-2014 supprimées",SRC-E-007,Tableau 1.2.1 du fichier Montréal,2026-10-31,verifie,
8+CLM-27-007,27,"Univers de l'ELL : appartements d'initiative privée dans les immeubles de 3 logements et plus, centres de 10 000 habitants et plus ; enquête en octobre ; copropriétés louées dans une enquête distincte (tableaux 4) ; définitions géographiques du Recensement 2021",SRC-E-007,En-têtes et notes des tableaux Excel ; notes-E.md ; ch. 4 (définition 4.x),2026-10-31,verifie,
9+CLM-27-008,27,"Indicateurs de qualité SCHL : a excellent, b très bon, c bon, d passable ; ** données supprimées ; flèches = variation significative ; « – » = échantillon insuffisant pour interpréter la variation",SRC-E-007,Notes de bas de tableau des fichiers Excel (lues par script),2026-10-31,verifie,Le motif précis de suppression (fiabilité ou confidentialité) n'est pas explicité dans les tableaux : formulé comme « échantillon ne permettant pas d'estimation fiable »
10+CLM-27-009,27,"SCHL, variation « même échantillon » des loyers oct. 2024→2025 : Montréal 2 ch. +7,2 %, tous +7,4 % ; ensemble des RMR de +4,5 % (Gatineau) à +12,5 % (Saguenay)",SRC-E-007,notes-E.md §ch. 4 (tableau 1.1.5),2026-10-31,verifie,
11+CLM-27-010,27,"SCHL Perspectives été 2026 : inoccupation RMR Montréal 3,8 % (2026), 4,5 % (2027), 4,8 % (2028)",SRC-C-045,notes-C.md §4.6 (schlpmh2026ete),2026-10-31,partiellement_verifie,Extraction du rapport ; à relire sur le PDF (même statut qu'au ch. 30)
12+CLM-27-011,27,"IPC Québec « Loyer » (18-10-0004-01) : 174,2 (sept. 2026) / 168,6 (sept. 2025) = +3,32 % ; TCAC 10 ans 4,02 %",SRC-E-015,Calcul du script sur data/raw/statcan_18100004/18100004.csv,2026-10-31,verifie,Cohérent avec notes-E (+3,3 %)
13+CLM-27-012,27,"TAL : pourcentage de base 3,1 % pour 2026 et 4,5 % pour 2025 (avis à compter du 1er janvier 2026) ; 2027 non publié au 2026-10-31",SRC-A-005,notes-A.md §6.2,2026-10-31,verifie,
14+CLM-27-013,27,"TAL, communiqué du 21 janvier 2025 : moyenne de 3,8 % d'ajustement accordé de 2015 à 2024 (ancienne méthode)",SRC-A-007,notes-A.md §6.2,2026-10-31,verifie,
15+CLM-27-014,27,"Règlement sur les critères de fixation de loyer (D. 1455-2025, en vigueur 2026-01-01) : art. 3 six critères ; art. 3.1 pourcentage de base = moyenne des trois dernières variations annuelles de l'IPC Québec, négatif réputé nul ; art. 4 taxes et assurances au-delà de la base ; 5 % des dépenses d'immobilisation",SRC-A-003;SRC-A-004,notes-A.md §6.2,2026-10-31,verifie,
16+CLM-27-015,27,"Formulaire RN 2026-2027 (TAL-004-E RN) : revenus de décembre 2025 × 12 par logement ; ligne « autres revenus » distincte",SRC-A-009,notes-A.md §6.2,2026-10-31,verifie,
17+CLM-27-016,27,"TAL (résumés) : la valeur locative de marché « n'est pas un critère à prendre en considération » en fixation",SRC-A-011,notes-A.md §6.3 (Société de financement alouette inc. c. A., 2022),2026-10-31,partiellement_verifie,Source secondaire officielle ; décision non lue
18+CLM-27-017,27,"C.c.Q. art. 1937 : l'aliénation de l'immeuble ne permet pas au nouveau locateur de résilier le bail ; art. 1941-1947 : reconduction, avis de 3 à 6 mois, refus, demande au TAL",SRC-A-001,notes-A.md §4,2026-10-31,verifie,
19+CLM-27-018,27,"C.c.Q. art. 1896 et 1950 : déclaration du loyer le plus bas des 12 derniers mois (section G) ; demande de fixation du nouveau locataire dans les 10 jours",SRC-A-001,notes-A.md §4,2026-10-31,verifie,
20+CLM-27-019,27,"C.c.Q. art. 1904 : aucun dépôt ni somme autre que le loyer ne peut être exigé",SRC-A-001,notes-A.md §4,2026-10-31,verifie,
21+CLM-27-020,27,"C.c.Q. art. 1971 : résiliation possible si le locataire est en retard de plus de trois semaines pour le paiement du loyer",SRC-A-001,Article dans la plage 1936-1979 lue par le lot A mais non relevé dans notes-A ; formulation courante,2026-10-31,partiellement_verifie,Déclaré dans « limites » ; à relire sur LégisQuébec avant publication
22+CLM-27-021,27,"C.c.Q. art. 1955 : immeubles neufs exclus de la fixation pendant 5 ans si le bail indique le loyer maximal (depuis 2024)",SRC-A-001,notes-A.md §5,2026-10-31,verifie,
23+CLM-27-022,27,"Loi 31 (2024, c. 2) / art. 1978.2 C.c.Q. : refus de cession pour un motif autre qu'un motif sérieux, bail résilié à la date de cession",SRC-A-001;SRC-A-013,notes-A.md §4 et §8,2026-10-31,verifie,
24+CLM-27-023,27,"Loi 65 (2024, c. 23) : moratoire sur les évictions de l'art. 1959 jusqu'au 6 juin 2027 (art. 1) ; fin anticipée si inoccupation SCHL ≥ 3 % dans les centres de 10 000+ (art. 11) ; aucun avis de fin anticipée repéré au 2026-10-31",SRC-A-014,notes-A.md §5 et points non vérifiés n° 10,2026-10-31,verifie,
25+CLM-27-024,27,"Cas 3 : état locatif, loyers de marché calibrés sur SCHL zone Rosemont, décote 2 %/an d'ancienneté ; v = 3,9 % ; autres revenus 9 360 $ ; rotation 15 % ; g_c 3,1 % ; g_m 3,5 % — hypothèses synthétiques",—,data/synthetic/README.md ; cas3_montreal_hypotheses_dcf.json,2026-10-31,verifie,Déclarées synthétiques dans l'encadré ; même dossier que ch. 29/30/47
26+CLM-27-025,27,"Décomposition de v (cas 3) : 2,2 % segment + frictionnel 1,25 % + créances ≈ 1 pt ; cas 2 : 2,4 % + 0,6 % — conventions des dossiers",—,Hypothèses de l'auteur (cohérentes avec ch. 47 §vacance économique),2026-10-31,verifie,Présentées comme conventions déclarées
27+CLM-27-026,27,"Provision pour mauvaises créances « d'un demi à un point » du RBP courante pour les petits immeubles bien tenus",—,Aucune statistique publique (notes-E : taux d'inoccupation économique NON_VERIFIE),2026-10-31,non_verifie,Formulé comme pratique et non comme norme ; déclaré dans « limites »
28+CLM-27-027,27,"Concordance de la provision du cas 3 avec les données SCHL = calibration, non validation",—,CONVENTIONS §8,2026-10-31,verifie,
29+CLM-27-028,27,"Théorie : vacance naturelle et cycle (Wheaton 1999 ; DiPasquale–Wheaton 1996) ; vacance et taux de capitalisation (Sivitanidou–Sivitanides 1999) ; contrôle des loyers de 2e génération (Arnott 1995 ; Kholodilin 2024)",—,notes-D.md §ch. 27 et §ch. 34 ; clés library.bib,2026-10-31,verifie,Attributions générales, aucune citation textuelle
modified verification/claims.csv +28 −0
@@ -658,3 +658,31 @@ CLM-25-015,25,"Primauté de la comparaison directe pour les terrains ; six méth
658 CLM-25-016,25,Quigg (1993) : prime d'option (valeur d'attente) ≈ 6 % du prix des terrains,SRC-D-QUIGG,notes-D.md §ch. 25,2026-10-31,partiellement_verifie,Chiffre repris des notes D ; article non relu 658 CLM-25-016,25,Quigg (1993) : prime d'option (valeur d'attente) ≈ 6 % du prix des terrains,SRC-D-QUIGG,notes-D.md §ch. 25,2026-10-31,partiellement_verifie,Chiffre repris des notes D ; article non relu
659 CLM-25-017,25,"Dépréciation du logement entretenu de l'ordre de 0,5 à 1 %/an (Malpezzi–Ozanne–Thibodeau 1987 ; Harding–Rosenthal–Sirmans 2007)",SRC-D-MOT1987,notes-D.md §ch. 24,2026-10-31,partiellement_verifie,Ordre de grandeur ; voir ch. 24 659 CLM-25-017,25,"Dépréciation du logement entretenu de l'ordre de 0,5 à 1 %/an (Malpezzi–Ozanne–Thibodeau 1987 ; Harding–Rosenthal–Sirmans 2007)",SRC-D-MOT1987,notes-D.md §ch. 24,2026-10-31,partiellement_verifie,Ordre de grandeur ; voir ch. 24
660 CLM-25-018,25,"Hypothèses pédagogiques du chapitre : prix de référence des terrains 225 000 $ (560 m², Hull, 2024-07) ; élasticités et décotes du jeu synthétique ; coût neuf 2 500 $/m² × 950 m² et dépréciation 52 % du 12 logements ; R_L = 3,75 % ; paramètres du lotissement ; façade du sujet 20 m ; C_N des comparables transposé (ε = 0,90 ; ±10 %/classe)",NON_VERIFIE,Déclarées comme hypothèses dans l'encadré synthetique et dans limites,2026-10-31,non_verifie,Aucune source publique ; coût multilogement introuvable (notes-E) ; la grille de terrains de l'auteur n'est pas dans le dépôt 660 CLM-25-018,25,"Hypothèses pédagogiques du chapitre : prix de référence des terrains 225 000 $ (560 m², Hull, 2024-07) ; élasticités et décotes du jeu synthétique ; coût neuf 2 500 $/m² × 950 m² et dépréciation 52 % du 12 logements ; R_L = 3,75 % ; paramètres du lotissement ; façade du sujet 20 m ; C_N des comparables transposé (ε = 0,90 ; ±10 %/classe)",NON_VERIFIE,Déclarées comme hypothèses dans l'encadré synthetique et dans limites,2026-10-31,non_verifie,Aucune source publique ; coût multilogement introuvable (notes-E) ; la grille de terrains de l'auteur n'est pas dans le dépôt
661+CLM-27-001,27,"SCHL oct. 2025 : inoccupation tous appartements par RMR — Montréal 2,9 (2,1) ; Québec 2,4 (0,9) ; Gatineau QC 3,8 (1,9) ; Sherbrooke 2,7 (1,4) ; Trois-Rivières 2,7 (0,9) ; Saguenay 1,3 (1,6) ; 2 ch. 2025 : 2,9/2,5/2,6/3,0/2,5/0,6",SRC-E-007,Tableau 1.1.1 du fichier rmr-quebec-2025-fr.xlsx lu par script (data/raw/schl_rml_2025),2026-10-31,verifie,Chiffres cités avec attribution (conditions SCHL)
662+CLM-27-002,27,"SCHL oct. 2025 : taux de rotation tous appartements — Montréal 9,4 (11,1) ; Québec 13,0 (13,9) ; Gatineau 16,2 (17,3 ; qualité d) ; Sherbrooke 12,0 (10,4) ; Trois-Rivières 10,1 (10,2) ; Saguenay 12,6 (13,3)",SRC-E-007,Tableau 1.1.6 du fichier rmr-quebec-2025-fr.xlsx,2026-10-31,verifie,
663+CLM-27-003,27,"SCHL oct. 2025, île de Montréal, inoccupation selon la taille : 3-5 : 2,3 ; 6-19 : 2,2 ; 20-49 : 3,9 ; 50-99 : 3,8 ; 100+ : 5,1 ; tous 3,1 ; RMR : 2,1/2,1/3,4/3,7/5,7/2,9 ; rotation RMR : 7,6/8,5/9,4/12,3/14,2/9,4",SRC-E-007,Tableaux 1.3.1 et 1.3.4 du fichier rmr-montreal-2025-fr.xlsx,2026-10-31,verifie,Cellule 3-5 unités 2024 (île) supprimée (**)
664+CLM-27-004,27,"SCHL oct. 2025, RMR Montréal, inoccupation par quartile de loyer : Q1 1,3 ; Q2 1,9 ; Q3 3,0 ; Q4 4,9 (2024 : 0,5/0,7/1,6/4,4)",SRC-E-007,Tableau 1.4 du fichier Montréal,2026-10-31,verifie,
665+CLM-27-005,27,"SCHL oct. 2025, île de Montréal, loyer moyen des logements inoccupés vs occupés : tous 1 573 vs 1 275 $ (+23,4 %) ; 2 ch. 1 815 vs 1 349 $ (+34,5 %) ; studio 1 091/1 009 ; 1 ch. 1 305/1 113 ; 3 ch.+ 2 138/1 693",SRC-E-007,Tableau 1.1.9 du fichier Montréal,2026-10-31,verifie,Écarts statistiquement significatifs (O) pour l'île
666+CLM-27-006,27,"SCHL oct. 2025, île de Montréal, inoccupation selon l'année de construction : avant 1940 2,2 ; 1940-59 2,6 ; 1960-74 3,3 ; 1975-89 2,8 ; 2015+ 5,6 ; cellules 1990-2014 supprimées",SRC-E-007,Tableau 1.2.1 du fichier Montréal,2026-10-31,verifie,
667+CLM-27-007,27,"Univers de l'ELL : appartements d'initiative privée dans les immeubles de 3 logements et plus, centres de 10 000 habitants et plus ; enquête en octobre ; copropriétés louées dans une enquête distincte (tableaux 4) ; définitions géographiques du Recensement 2021",SRC-E-007,En-têtes et notes des tableaux Excel ; notes-E.md ; ch. 4 (définition 4.x),2026-10-31,verifie,
668+CLM-27-008,27,"Indicateurs de qualité SCHL : a excellent, b très bon, c bon, d passable ; ** données supprimées ; flèches = variation significative ; « – » = échantillon insuffisant pour interpréter la variation",SRC-E-007,Notes de bas de tableau des fichiers Excel (lues par script),2026-10-31,verifie,Le motif précis de suppression (fiabilité ou confidentialité) n'est pas explicité dans les tableaux : formulé comme « échantillon ne permettant pas d'estimation fiable »
669+CLM-27-009,27,"SCHL, variation « même échantillon » des loyers oct. 2024→2025 : Montréal 2 ch. +7,2 %, tous +7,4 % ; ensemble des RMR de +4,5 % (Gatineau) à +12,5 % (Saguenay)",SRC-E-007,notes-E.md §ch. 4 (tableau 1.1.5),2026-10-31,verifie,
670+CLM-27-010,27,"SCHL Perspectives été 2026 : inoccupation RMR Montréal 3,8 % (2026), 4,5 % (2027), 4,8 % (2028)",SRC-C-045,notes-C.md §4.6 (schlpmh2026ete),2026-10-31,partiellement_verifie,Extraction du rapport ; à relire sur le PDF (même statut qu'au ch. 30)
671+CLM-27-011,27,"IPC Québec « Loyer » (18-10-0004-01) : 174,2 (sept. 2026) / 168,6 (sept. 2025) = +3,32 % ; TCAC 10 ans 4,02 %",SRC-E-015,Calcul du script sur data/raw/statcan_18100004/18100004.csv,2026-10-31,verifie,Cohérent avec notes-E (+3
672+CLM-27-012,27,"TAL : pourcentage de base 3,1 % pour 2026 et 4,5 % pour 2025 (avis à compter du 1er janvier 2026) ; 2027 non publié au 2026-10-31",SRC-A-005,notes-A.md §6.2,2026-10-31,verifie,
673+CLM-27-013,27,"TAL, communiqué du 21 janvier 2025 : moyenne de 3,8 % d'ajustement accordé de 2015 à 2024 (ancienne méthode)",SRC-A-007,notes-A.md §6.2,2026-10-31,verifie,
674+CLM-27-014,27,"Règlement sur les critères de fixation de loyer (D. 1455-2025, en vigueur 2026-01-01) : art. 3 six critères ; art. 3.1 pourcentage de base = moyenne des trois dernières variations annuelles de l'IPC Québec, négatif réputé nul ; art. 4 taxes et assurances au-delà de la base ; 5 % des dépenses d'immobilisation",SRC-A-003;SRC-A-004,notes-A.md §6.2,2026-10-31,verifie,
675+CLM-27-015,27,Formulaire RN 2026-2027 (TAL-004-E RN) : revenus de décembre 2025 × 12 par logement ; ligne « autres revenus » distincte,SRC-A-009,notes-A.md §6.2,2026-10-31,verifie,
676+CLM-27-016,27,TAL (résumés) : la valeur locative de marché « n'est pas un critère à prendre en considération » en fixation,SRC-A-011,notes-A.md §6.3 (Société de financement alouette inc. c. A.,2022),2026-10-31,partiellement_verifie
677+CLM-27-017,27,"C.c.Q. art. 1937 : l'aliénation de l'immeuble ne permet pas au nouveau locateur de résilier le bail ; art. 1941-1947 : reconduction, avis de 3 à 6 mois, refus, demande au TAL",SRC-A-001,notes-A.md §4,2026-10-31,verifie,
678+CLM-27-018,27,C.c.Q. art. 1896 et 1950 : déclaration du loyer le plus bas des 12 derniers mois (section G) ; demande de fixation du nouveau locataire dans les 10 jours,SRC-A-001,notes-A.md §4,2026-10-31,verifie,
679+CLM-27-019,27,C.c.Q. art. 1904 : aucun dépôt ni somme autre que le loyer ne peut être exigé,SRC-A-001,notes-A.md §4,2026-10-31,verifie,
680+CLM-27-020,27,C.c.Q. art. 1971 : résiliation possible si le locataire est en retard de plus de trois semaines pour le paiement du loyer,SRC-A-001,Article dans la plage 1936-1979 lue par le lot A mais non relevé dans notes-A ; formulation courante,2026-10-31,partiellement_verifie,Déclaré dans « limites » ; à relire sur LégisQuébec avant publication
681+CLM-27-021,27,C.c.Q. art. 1955 : immeubles neufs exclus de la fixation pendant 5 ans si le bail indique le loyer maximal (depuis 2024),SRC-A-001,notes-A.md §5,2026-10-31,verifie,
682+CLM-27-022,27,"Loi 31 (2024, c. 2) / art. 1978.2 C.c.Q. : refus de cession pour un motif autre qu'un motif sérieux, bail résilié à la date de cession",SRC-A-001;SRC-A-013,notes-A.md §4 et §8,2026-10-31,verifie,
683+CLM-27-023,27,"Loi 65 (2024, c. 23) : moratoire sur les évictions de l'art. 1959 jusqu'au 6 juin 2027 (art. 1) ; fin anticipée si inoccupation SCHL ≥ 3 % dans les centres de 10 000+ (art. 11) ; aucun avis de fin anticipée repéré au 2026-10-31",SRC-A-014,notes-A.md §5 et points non vérifiés n° 10,2026-10-31,verifie,
684+CLM-27-024,27,"Cas 3 : état locatif, loyers de marché calibrés sur SCHL zone Rosemont, décote 2 %/an d'ancienneté ; v = 3,9 % ; autres revenus 9 360 $ ; rotation 15 % ; g_c 3,1 % ; g_m 3,5 % — hypothèses synthétiques",—,data/synthetic/README.md ; cas3_montreal_hypotheses_dcf.json,2026-10-31,verifie,Déclarées synthétiques dans l'encadré ; même dossier que ch. 29/30/47
685+CLM-27-025,27,"Décomposition de v (cas 3) : 2,2 % segment + frictionnel 1,25 % + créances ≈ 1 pt ; cas 2 : 2,4 % + 0,6 % — conventions des dossiers",—,Hypothèses de l'auteur (cohérentes avec ch. 47 §vacance économique),2026-10-31,verifie,Présentées comme conventions déclarées
686+CLM-27-026,27,Provision pour mauvaises créances « d'un demi à un point » du RBP courante pour les petits immeubles bien tenus,—,Aucune statistique publique (notes-E : taux d'inoccupation économique NON_VERIFIE),2026-10-31,non_verifie,Formulé comme pratique et non comme norme ; déclaré dans « limites »
687+CLM-27-027,27,"Concordance de la provision du cas 3 avec les données SCHL = calibration, non validation",—,CONVENTIONS §8,2026-10-31,verifie,
688+CLM-27-028,27,Théorie : vacance naturelle et cycle (Wheaton 1999 ; DiPasquale–Wheaton 1996) ; vacance et taux de capitalisation (Sivitanidou–Sivitanides 1999) ; contrôle des loyers de 2e génération (Arnott 1995 ; Kholodilin 2024),—,notes-D.md §ch. 27 et §ch. 34 ; clés library.bib,2026-10-31,verifie,Attributions générales
661 689
Menu

Theme