SPB Git

Ch. 9 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 a075a42 Browse files

21 changed files +833 −18

modified analysis/python/cases/ch17_ajustements.py +20 −1
@@ -79,6 +79,22 @@ def temps(b: dict, id_vente: str = "G0404") -> dict:
79 "indices": cp.ajustement_temps(P, 100.0, 100.0 * (1 + b["g_annuel"]) ** (mois / 12)), 79 "indices": cp.ajustement_temps(P, 100.0, 100.0 * (1 + b["g_annuel"]) ** (mois / 12)),
80 "g_mensuel": g, "g_annuel": b["g_annuel"], "taux_generation": TAUX_GENERATION} 80 "g_mensuel": g, "g_annuel": b["g_annuel"], "taux_generation": TAUX_GENERATION}
81 81
82+# ---------------------------------------------------------------- 3b. ajustement de financement (balance de prix de vente)
83+def financement(prix: float = 620000.0, montant: float = 150000.0, taux_contrat: float = 0.02, taux_marche: float = 0.05, mois: int = 60, amortissement_mois: int | None = None) -> dict:
84+ """Avantage de financement = montant prêté − valeur actualisée (au taux du marché) des paiements promis ; taux nominaux à composition
85+ semestrielle (convention canadienne). Intérêts seulement + capital au terme si amortissement_mois est None, sinon mensualités amorties
86+ et solde dû au terme."""
87+ from traite import finance as f
88+ im, ic = f.taux_mensuel_canadien(taux_marche), f.taux_mensuel_canadien(taux_contrat)
89+ if amortissement_mois is None:
90+ paiement = montant * ic; solde = montant
91+ else:
92+ paiement = montant * f.facteur_recouvrement(ic, amortissement_mois); solde = paiement * f.facteur_va_annuite(ic, amortissement_mois - mois)
93+ va = paiement * f.facteur_va_annuite(im, mois) + solde * f.facteur_va(im, mois)
94+ avantage = montant - va
95+ return {"paiement_mensuel": paiement, "solde_terme": solde, "valeur_actualisee": va, "avantage": avantage, "ajustement": -avantage,
96+ "ajustement_pct": -avantage / prix, "prix_comptant": prix - avantage, "i_m_contrat": ic, "i_m_marche": im}
97+
82 # ---------------------------------------------------------------- 4. ventes appariées 98 # ---------------------------------------------------------------- 4. ventes appariées
83 CRITERES = {"superficie_pct": 0.05, "age_ans": 5, "mois_max": 12} 99 CRITERES = {"superficie_pct": 0.05, "age_ans": 5, "mois_max": 12}
84 100
@@ -201,7 +217,8 @@ def sensibilite(b: dict) -> pd.DataFrame:
201 def tout() -> dict: 217 def tout() -> dict:
202 b = base() 218 b = base()
203 r = {"base": b, "cascade_G0404": cascade(b, "G0404"), "cascade_G0404_ordre_inverse": cascade(b, "G0404", list(reversed(GROUPES))), 219 r = {"base": b, "cascade_G0404": cascade(b, "G0404"), "cascade_G0404_ordre_inverse": cascade(b, "G0404", list(reversed(GROUPES))),
204− "formes": formes(b), "temps": temps(b), "hp_kennedy": hp_kennedy(b)} 220+ "formes": formes(b), "temps": temps(b), "hp_kennedy": hp_kennedy(b),
221+ "financement": financement(), "financement_amorti": financement(amortissement_mois=300)}
205 r["paires_garage"] = paires(b, "garage_places", **{"superficie_pct": CRITERES["superficie_pct"], "age_ans": CRITERES["age_ans"], "mois_max": CRITERES["mois_max"]}) 222 r["paires_garage"] = paires(b, "garage_places", **{"superficie_pct": CRITERES["superficie_pct"], "age_ans": CRITERES["age_ans"], "mois_max": CRITERES["mois_max"]})
206 r["paires_sous_sol"] = paires(b, "sous_sol_fini", **{"superficie_pct": CRITERES["superficie_pct"], "age_ans": CRITERES["age_ans"], "mois_max": CRITERES["mois_max"]}) 223 r["paires_sous_sol"] = paires(b, "sous_sol_fini", **{"superficie_pct": CRITERES["superficie_pct"], "age_ans": CRITERES["age_ans"], "mois_max": CRITERES["mois_max"]})
207 r["resume_garage"] = resume_paires(r["paires_garage"]); r["resume_sous_sol"] = resume_paires(r["paires_sous_sol"]) 224 r["resume_garage"] = resume_paires(r["paires_garage"]); r["resume_sous_sol"] = resume_paires(r["paires_sous_sol"])
@@ -235,6 +252,8 @@ def main():
235 print("== Cascade G0404, ordre inverse (même total, répartition différente) :\n", r["cascade_G0404_ordre_inverse"].round(1).to_string(index=False)) 252 print("== Cascade G0404, ordre inverse (même total, répartition différente) :\n", r["cascade_G0404_ordre_inverse"].round(1).to_string(index=False))
236 print("== Formes additive / multiplicative / mixte :\n", r["formes"].round(4).to_string(index=False)) 253 print("== Formes additive / multiplicative / mixte :\n", r["formes"].round(4).to_string(index=False))
237 t = r["temps"]; print("== Ajustement de temps G0404 (%.1f mois) : coefficient %.0f ; taux composé estimé %.0f ; taux de génération 4,43 %% %.0f ; linéaire %.0f ; indices %.0f" % (t["mois"], t["coefficient"], t["taux_compose_estime"], t["taux_compose_generation"], t["lineaire_simple"], t["indices"])) 254 t = r["temps"]; print("== Ajustement de temps G0404 (%.1f mois) : coefficient %.0f ; taux composé estimé %.0f ; taux de génération 4,43 %% %.0f ; linéaire %.0f ; indices %.0f" % (t["mois"], t["coefficient"], t["taux_compose_estime"], t["taux_compose_generation"], t["lineaire_simple"], t["indices"]))
255+ fi = r["financement"]; fa = r["financement_amorti"]
256+ print("== Financement (balance 150 000 $ à 2 %% c. marché 5 %%, 5 ans, intérêts seulement) : intérêt mensuel %.2f ; VA %.0f ; avantage %.0f ; ajustement %.2f %% ; prix comptant %.0f ; variante amortie 25 ans : avantage %.0f" % (fi["paiement_mensuel"], fi["valeur_actualisee"], fi["avantage"], 100 * fi["ajustement_pct"], fi["prix_comptant"], fa["avantage"]))
238 for attr in ("garage", "sous_sol"): 257 for attr in ("garage", "sous_sol"):
239 rs = r[f"resume_{attr}"]; im = r[f"implicite_{attr}"] 258 rs = r[f"resume_{attr}"]; im = r[f"implicite_{attr}"]
240 print("== Paires %s : n = %d, moyenne %.0f, médiane %.0f, écart-type %.0f, erreur-type %.0f, pct moyen %.2f %% ; prix implicite hédonique %.2f %% soit %.0f au prix médian des paires (%.0f) et %.0f au niveau du sujet" % (attr, rs["n"], rs["moyenne"], rs["mediane"], rs["ecart_type"], rs["erreur_type"], 100 * rs["pct_moyen"], 100 * im["effet_pct"], im["au_prix_median_paires"], im["prix_median_paires"], im["au_sujet"])) 259 print("== Paires %s : n = %d, moyenne %.0f, médiane %.0f, écart-type %.0f, erreur-type %.0f, pct moyen %.2f %% ; prix implicite hédonique %.2f %% soit %.0f au prix médian des paires (%.0f) et %.0f au niveau du sujet" % (attr, rs["n"], rs["moyenne"], rs["mediane"], rs["ecart_type"], rs["erreur_type"], 100 * rs["pct_moyen"], 100 * im["effet_pct"], im["au_prix_median_paires"], im["prix_median_paires"], im["au_sujet"]))
added analysis/python/cases/ch22_metre.py +426 −0
@@ -0,0 +1,426 @@
1+#!/usr/bin/env python3
2+"""Chapitre 22 — métré et quantités du sujet du cas 1 (Gatineau, DONNÉES SYNTHÉTIQUES).
3+
4+Le devis de 38 postes (data/synthetic/cas1_gatineau_couts.csv) est celui du chapitre 21 : mêmes postes, mêmes
5+quantités, mêmes montants (D = 298 826,17 $, I = 62 598,68 $, C_N = 397 567,33 $). Le présent script :
6+ * fixe la géométrie du sujet (plan coté : empreinte 12,00 × 7,92 m = 95,0 m², garage intégré 3,96 × 6,20 m,
7+ deux étages, sous-sol sous la partie habitable) et en déduit les superficies selon plusieurs conventions
8+ (aire au sol et aire des étages au sens du MEFQ, superficie habitable, aire nette intérieure) ;
9+ * recalcule, par des règles géométriques déclarées, la quantité de chacun des postes « mesurés » du devis
10+ (m³, m², m lin.) et dénombre les postes « comptés » (unités, appareils) ; compare au devis (écart, verdict) ;
11+ * chiffre l'effet des écarts du métré de contrôle et d'erreurs de quantité sur D et C_N (via ch21_cout_neuf) ;
12+ * illustre les pertes et chutes (taux déclarés, hypothèses pédagogiques) et la propagation des erreurs de mesure ;
13+ * imprime le code TikZ du plan coté (--tikz) pour le chapitre.
14+
15+Usage (racine du dépôt) : PYTHONPATH=analysis/python python3 analysis/python/cases/ch22_metre.py [--tikz]
16+Fonctions de coût : traite.cout (cout_neuf, cout_par_composantes) et ch21_cout_neuf (CORPS, regrouper, cout_neuf_sujet)."""
17+from __future__ import annotations
18+import sys, math, pathlib
19+import numpy as np, pandas as pd
20+sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1]))
21+sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent))
22+from traite import cout as ct
23+import ch21_cout_neuf as c21
24+
25+ROOT = pathlib.Path(__file__).resolve().parents[3]
26+PI2_PAR_M2 = c21.PI2_PAR_M2
27+MULT = None # (1+τI)(1+τE) du cas de base, rempli par cout_neuf_sujet
28+
29+# ----------------------------------------------------------------------------- géométrie du sujet (hypothèses du plan)
30+PLAN = {
31+ "L": 12.00, # façade (m), face externe des murs
32+ "W": 7.92, # profondeur (m)
33+ "gx": 3.96, "gy": 6.20, # garage intégré (coin avant gauche), face externe
34+ "t_ext": 0.30, # épaisseur des murs extérieurs hors sol (ossature 2×6, revêtement, finition)
35+ "t_sep": 0.15, # séparation garage / maison
36+ "t_int": 0.10, # cloisons intérieures
37+ "t_fond": 0.25, # murs de fondation (10 po)
38+ "h_fond": 2.44, # hauteur des murs de fondation (dalle → dessus du mur)
39+ "sem_l": 0.60, "sem_h": 0.30, # semelles filantes (largeur × hauteur)
40+ "n_col": 4, "sem_col": 0.90 * 0.90 * 0.30, # semelles de colonnes
41+ "h_mur": 2.44, # hauteur d'ossature d'un étage (murs)
42+ "h_etage": 2.75, # plancher à plancher
43+ "h_revet": 5.60, # hauteur revêtue (dessus de fondation → soffite), deux étages
44+ "pente": 0.5, # 6:12
45+ "debord": 0.40, # débords de toit
46+ "prof_exc": 2.60, # profondeur d'excavation (sous-sol + semelle + pierre nette)
47+ "degag": 0.90, # dégagement de travail au pied des murs
48+ "talus": 0.5, # pente des talus (horizontal / vertical)
49+ "gar_h_gel": 1.50, "gar_t": 0.25, "gar_sem_l": 0.50, "gar_sem_h": 0.25, # murs hors gel du garage
50+ "tranchee_gar": (1.00, 1.50), # largeur, profondeur de la tranchée des murs hors gel
51+ "tranchee_racc": (15.0, 0.90, 1.80), # longueur, largeur, profondeur de la tranchée aqueduc/égout
52+ "fen_hs": (14, 1.20 * 1.40), "fen_ss": (2, 1.70), # fenêtres hors sol / sous-sol (nombre, aire unitaire m²)
53+ "porte_ext": (3, 0.91 * 2.03), "porte_gar": (1, 2.74 * 2.13), "porte_int": (14, 0.91 * 2.03),
54+ "descentes": (4, 5.80), # descentes pluviales (nombre, longueur)
55+ "rive": 0.30, # hauteur des solives de rive (isolation)
56+ "perron": (1.50, 2.40), "balcon": (3.00, 3.50), "entree": (5.00, 11.00),
57+ "drain_raccord": 1.00, # raccord du drain au puisard
58+}
59+
60+# Pièces : (x0, y0, x1, y1) en coordonnées de face externe (origine : coin avant gauche ; x le long de la façade),
61+# nom, type de plancher. Les cloisons sont déduites des limites communes entre pièces d'un même niveau.
62+PIECES = {
63+ "rez": [
64+ (0.00, 0.00, 3.96, 6.20, "Garage", "béton"),
65+ (0.00, 6.20, 3.96, 7.92, "Buanderie", "céramique"),
66+ (3.96, 0.00, 6.30, 3.10, "Vestibule et escaliers", "céramique"),
67+ (3.96, 3.10, 5.60, 4.70, "Salle d'eau", "céramique"),
68+ (5.60, 3.10, 6.30, 4.70, "Garde-robe", "bois franc"),
69+ (3.96, 4.70, 7.50, 7.92, "Cuisine", "céramique"),
70+ (6.30, 0.00, 12.00, 4.70, "Salon", "bois franc"),
71+ (7.50, 4.70, 12.00, 7.92, "Salle à manger", "bois franc"),
72+ ],
73+ "etage": [
74+ (0.00, 0.00, 2.70, 3.10, "Salle de bain", "céramique"),
75+ (2.70, 0.00, 3.96, 3.10, "Lingerie", "bois franc"),
76+ (3.96, 0.00, 5.00, 3.10, "Trémie d'escalier", "trémie"),
77+ (5.00, 0.00, 6.30, 3.10, "Palier", "bois franc"),
78+ (6.30, 0.00, 12.00, 3.10, "Chambre principale", "bois franc"),
79+ (0.00, 3.10, 2.70, 4.10, "Garde-robe", "bois franc"),
80+ (2.70, 3.10, 8.30, 4.10, "Corridor", "bois franc"),
81+ (8.30, 3.10, 12.00, 7.92, "Chambre 2", "bois franc"),
82+ (4.90, 4.10, 8.30, 7.92, "Chambre 3", "bois franc"),
83+ (0.00, 4.10, 4.90, 7.92, "Chambre 4", "bois franc"),
84+ ],
85+ "soussol": [ # sous la partie habitable seulement (le garage est sur dalle au sol)
86+ (0.00, 6.20, 3.96, 7.92, "Rangement", "flottant"),
87+ (3.96, 0.00, 5.00, 3.10, "Escalier", "escalier"),
88+ (5.00, 0.00, 12.00, 4.70, "Salle familiale", "flottant"),
89+ (3.96, 3.10, 7.50, 5.60, "Hall", "flottant"),
90+ (3.96, 5.60, 7.50, 7.92, "Salle mécanique", "béton"),
91+ (7.50, 4.70, 12.00, 7.92, "Bureau", "flottant"),
92+ ],
93+}
94+# placards et walk-in (cloisons supplémentaires, m linéaires, étage)
95+CLOISONS_SUPPL = {"rez": 0.0, "etage": 1.50 + 1.80 + 3 * 1.80, "soussol": 0.0}
96+FENETRES = {"rez": {"Salon": 2, "Salle à manger": 2, "Cuisine": 1, "Salle d'eau": 1},
97+ "etage": {"Chambre principale": 2, "Chambre 2": 2, "Chambre 3": 1, "Chambre 4": 2, "Salle de bain": 1},
98+ "soussol": {"Salle familiale": 1, "Bureau": 1}}
99+PORTES_INT = {"rez": ["Salle d'eau", "Garde-robe", "Buanderie", "Garage (porte coupe-feu)"],
100+ "etage": ["Chambre principale", "Chambre 2", "Chambre 3", "Chambre 4", "Salle de bain", "Lingerie", "Walk-in"],
101+ "soussol": ["Bureau", "Salle mécanique", "Rangement"]}
102+APPAREILS = ["Évier de cuisine", "Lave-vaisselle (raccord)", "Réfrigérateur (raccord d'eau)", "Laveuse (raccord)", "Cuve de buanderie",
103+ "Lavabo (salle d'eau)", "Toilette (salle d'eau)", "Lavabo (salle de bain)", "Toilette (salle de bain)", "Baignoire", "Douche",
104+ "Robinet extérieur avant", "Robinet extérieur arrière", "Drain de plancher"]
105+
106+# Taux de pertes et chutes (HYPOTHÈSES PÉDAGOGIQUES déclarées, non sourcées) : quantité à commander = quantité mesurée × (1 + w)
107+PERTES = {"Gypse et tirage de joints": 0.12, "Couverture bardeaux d'asphalte": 0.10, "Planchers bois franc": 0.08,
108+ "Planchers céramique": 0.10, "Planchers flottants (sous-sol)": 0.08, "Revêtement extérieur (brique 40 % / fibrociment 60 %)": 0.10,
109+ "Isolation et pare-vapeur": 0.05, "Charpente murs et planchers": 0.10, "Fondations béton (semelles, murs)": 0.05, "Dalle de sous-sol": 0.05}
110+
111+TOL_CONFORME, TOL_PRECISER = 0.05, 0.10 # verdicts du métré de contrôle
112+
113+
114+# ----------------------------------------------------------------------------- géométrie élémentaire
115+
116+def aire(p): return (p[2] - p[0]) * (p[3] - p[1])
117+
118+def empreinte() -> dict:
119+ P = PLAN
120+ brute = P["L"] * P["W"]; garage = P["gx"] * P["gy"]
121+ perim = 2 * (P["L"] + P["W"]) # le périmètre d'une forme en L découpée dans un rectangle est celui du rectangle
122+ return {"aire_au_sol": brute, "garage": garage, "aire_sous_sol": brute - garage, "perimetre": perim,
123+ "aire_etages_mefq": 2 * brute, "perimetre_etages_mefq": 2 * perim}
124+
125+def _epaisseur_cote(x0, y0, x1, y1, cote) -> float:
126+ """Demi-épaisseur du mur à déduire sur un côté d'une pièce : mur extérieur (face externe → face interne : t_ext),
127+ séparation garage (t_sep/2) ou cloison (t_int/2)."""
128+ P = PLAN
129+ if cote == "x0" and x0 == 0.0: return P["t_ext"]
130+ if cote == "x1" and x1 == P["L"]: return P["t_ext"]
131+ if cote == "y0" and y0 == 0.0: return P["t_ext"]
132+ if cote == "y1" and y1 == P["W"]: return P["t_ext"]
133+ # séparation garage/maison : x = gx pour y < gy ; y = gy pour x < gx
134+ if (cote in ("x0", "x1") and (x0 == P["gx"] or x1 == P["gx"]) and y0 < P["gy"]) or \
135+ (cote in ("y0", "y1") and (y0 == P["gy"] or y1 == P["gy"]) and x0 < P["gx"]):
136+ return P["t_sep"] / 2
137+ return P["t_int"] / 2
138+
139+def pieces_nettes(niveau: str) -> pd.DataFrame:
140+ rows = []
141+ for (x0, y0, x1, y1, nom, fini) in PIECES[niveau]:
142+ w = (x1 - x0) - _epaisseur_cote(x0, y0, x1, y1, "x0") - _epaisseur_cote(x0, y0, x1, y1, "x1")
143+ h = (y1 - y0) - _epaisseur_cote(x0, y0, x1, y1, "y0") - _epaisseur_cote(x0, y0, x1, y1, "y1")
144+ rows.append({"niveau": niveau, "piece": nom, "fini": fini, "brute": (x1 - x0) * (y1 - y0), "nette": w * h,
145+ "perimetre_net": 2 * (w + h), "largeur": w, "profondeur": h, "x0": x0, "y0": y0, "x1": x1, "y1": y1})
146+ return pd.DataFrame(rows)
147+
148+def cloisons(niveau: str) -> float:
149+ """Longueur des cloisons intérieures (m) : limites communes entre pièces, hors murs extérieurs et hors séparation garage."""
150+ P = PLAN; segs = []
151+ pcs = PIECES[niveau]
152+ for i, a in enumerate(pcs):
153+ for b in pcs[i + 1:]:
154+ # côtés verticaux communs
155+ for xa, xb in ((a[2], b[0]), (a[0], b[2])):
156+ if abs(xa - xb) < 1e-9:
157+ lo, hi = max(a[1], b[1]), min(a[3], b[3])
158+ if hi - lo > 1e-9:
159+ if abs(xa - P["gx"]) < 1e-9 and lo < P["gy"]: continue # séparation garage
160+ segs.append(hi - lo)
161+ for ya, yb in ((a[3], b[1]), (a[1], b[3])):
162+ if abs(ya - yb) < 1e-9:
163+ lo, hi = max(a[0], b[0]), min(a[2], b[2])
164+ if hi - lo > 1e-9:
165+ if abs(ya - P["gy"]) < 1e-9 and lo < P["gx"]: continue
166+ segs.append(hi - lo)
167+ return sum(segs) + CLOISONS_SUPPL[niveau]
168+
169+def separation_garage() -> float:
170+ return PLAN["gx"] + PLAN["gy"]
171+
172+
173+def superficies() -> dict:
174+ """Superficies du sujet selon les conventions : MEFQ (aire au sol, aire des étages), habitable (brute hors garage),
175+ nette intérieure (pièces hors murs, hors trémie), sous-sol."""
176+ e = empreinte()
177+ rez, et, ss = pieces_nettes("rez"), pieces_nettes("etage"), pieces_nettes("soussol")
178+ nette_rez = rez.loc[rez["piece"] != "Garage", "nette"].sum()
179+ nette_etage = et.loc[et["fini"] != "trémie", "nette"].sum()
180+ return {"aire_au_sol": e["aire_au_sol"], "aire_etages_mefq": e["aire_etages_mefq"], "perimetre_etages_mefq": e["perimetre_etages_mefq"],
181+ "garage_brut": e["garage"], "habitable": e["aire_etages_mefq"] - e["garage"],
182+ "nette_rez": nette_rez, "nette_etage": nette_etage, "nette_hors_sol": nette_rez + nette_etage,
183+ "sous_sol_brut": e["aire_sous_sol"], "sous_sol_net": ss["nette"].sum(),
184+ "sous_sol_fini_net": ss.loc[ss["fini"] == "flottant", "nette"].sum(),
185+ "trémie": et.loc[et["fini"] == "trémie", "nette"].sum(), "pieces": pd.concat([rez, et, ss], ignore_index=True)}
186+
187+
188+# ----------------------------------------------------------------------------- règles de mesure (quantités géométriques)
189+
190+def aire_decalee(A: float, P: float, d: float) -> float:
191+ """Aire d'un polygone rectiligne décalé vers l'extérieur de d (angles droits) : A + P·d + 4·d² (4 coins nets)."""
192+ return A + P * d + 4 * d * d
193+
194+def volume_prismoidal(A_bas: float, A_mi: float, A_haut: float, h: float) -> float:
195+ return h / 6.0 * (A_bas + 4 * A_mi + A_haut)
196+
197+def quantites_geometriques() -> dict[str, dict]:
198+ """Quantité recalculée pour chaque poste mesuré ou dénombré du devis, avec la règle appliquée (texte) et le détail."""
199+ P = PLAN; e = empreinte(); S = superficies(); q = {}
200+ # --- excavation (prismoïde à talus) + tranchées
201+ A_b = aire_decalee(e["aire_sous_sol"], e["perimetre"], P["degag"])
202+ A_m = aire_decalee(e["aire_sous_sol"], e["perimetre"], P["degag"] + P["talus"] * P["prof_exc"] / 2)
203+ A_t = aire_decalee(e["aire_sous_sol"], e["perimetre"], P["degag"] + P["talus"] * P["prof_exc"])
204+ V_ss = volume_prismoidal(A_b, A_m, A_t, P["prof_exc"])
205+ V_gar = separation_garage() * 0 + (P["gx"] + P["gy"]) * P["tranchee_gar"][0] * P["tranchee_gar"][1]
206+ V_racc = P["tranchee_racc"][0] * P["tranchee_racc"][1] * P["tranchee_racc"][2]
207+ q["Excavation et remblai"] = {"q": V_ss + V_gar + V_racc, "regle": "prismoïde (fond, mi-hauteur, surface) + tranchées du garage et des raccordements",
208+ "detail": {"A_bas": A_b, "A_mi": A_m, "A_haut": A_t, "V_sous_sol": V_ss, "V_garage": V_gar, "V_racc": V_racc}}
209+ # --- fondations : murs à l'axe, semelles filantes, semelles de colonnes, murs hors gel du garage
210+ L_axe = e["perimetre"] - 4 * P["t_fond"]
211+ V_murs = L_axe * P["h_fond"] * P["t_fond"]; V_sem = L_axe * P["sem_l"] * P["sem_h"]; V_col = P["n_col"] * P["sem_col"]
212+ L_gar = P["gx"] + P["gy"]
213+ V_gar_m = L_gar * P["gar_h_gel"] * P["gar_t"]; V_gar_s = L_gar * P["gar_sem_l"] * P["gar_sem_h"]
214+ q["Fondations béton (semelles, murs)"] = {"q": V_murs + V_sem + V_col + V_gar_m + V_gar_s,
215+ "regle": "longueur à l'axe × hauteur × épaisseur (murs) + longueur × section (semelles) + semelles de colonnes + murs hors gel du garage",
216+ "detail": {"L_axe": L_axe, "V_murs": V_murs, "V_semelles": V_sem, "V_colonnes": V_col, "L_garage": L_gar, "V_garage_murs": V_gar_m, "V_garage_semelles": V_gar_s}}
217+ # --- dalle : aire au sol brute (sous-sol + garage sur sol), convention du devis
218+ q["Dalle de sous-sol"] = {"q": e["aire_sous_sol"] + e["garage"], "regle": "aire au sol brute (dalle du sous-sol + dalle du garage sur sol)",
219+ "detail": {"sous_sol": e["aire_sous_sol"], "garage": e["garage"]}}
220+ # --- drain : périmètre à la face externe des semelles + raccord
221+ d_sem = (P["sem_l"] - P["t_fond"]) / 2
222+ L_drain = e["perimetre"] + 8 * d_sem + P["drain_raccord"]
223+ q["Drain français et imperméabilisation"] = {"q": L_drain, "regle": "périmètre à la face externe des semelles (+ 8 × débord de semelle) + raccord au puisard",
224+ "detail": {"debord_semelle": d_sem}}
225+ # --- charpente : planchers en bois (rez hors garage + étage, aire brute) + murs extérieurs nets d'ouvertures (2 étages)
226+ A_planchers = e["aire_sous_sol"] + e["aire_au_sol"]
227+ A_murs_brut = e["perimetre"] * P["h_mur"] * 2
228+ ouv_hs = P["fen_hs"][0] * P["fen_hs"][1] + P["porte_ext"][0] * P["porte_ext"][1] + P["porte_gar"][0] * P["porte_gar"][1]
229+ A_murs_net = A_murs_brut - ouv_hs
230+ q["Charpente murs et planchers"] = {"q": A_planchers + A_murs_net, "regle": "aire brute des planchers en bois (rez hors garage + étage) + périmètre × 2,44 m × 2 − ouvertures",
231+ "detail": {"planchers": A_planchers, "murs_brut": A_murs_brut, "ouvertures": ouv_hs, "murs_net": A_murs_net}}
232+ # --- toit
233+ A_proj = (P["L"] + 2 * P["debord"]) * (P["W"] + 2 * P["debord"])
234+ fact = math.sqrt(1 + P["pente"] ** 2)
235+ q["Fermes de toit"] = {"q": A_proj, "regle": "projection horizontale du toit, débords compris", "detail": {"L": P["L"] + 2 * P["debord"], "W": P["W"] + 2 * P["debord"]}}
236+ q["Couverture bardeaux d'asphalte"] = {"q": A_proj * fact, "regle": "projection horizontale × √(1 + pente²), pente 6:12", "detail": {"facteur_pente": fact}}
237+ # --- revêtement : brut (ouvertures non déduites) + pignons
238+ h_pignon = P["W"] / 2 * P["pente"]; A_pignons = 2 * 0.5 * P["W"] * h_pignon
239+ q["Revêtement extérieur (brique 40 % / fibrociment 60 %)"] = {"q": e["perimetre"] * P["h_revet"] + A_pignons,
240+ "regle": "périmètre × hauteur revêtue + deux pignons ; ouvertures non déduites (convention du devis)", "detail": {"murs": e["perimetre"] * P["h_revet"], "pignons": A_pignons, "h_pignon": h_pignon}}
241+ # --- isolation : murs ext nets + plafond de l'étage + murs de fondation nets + séparation garage (murs, plafond) + solives de rive
242+ A_fond = L_axe * P["h_fond"] - P["fen_ss"][0] * P["fen_ss"][1]
243+ A_sep = separation_garage() * P["h_mur"]; A_rive = 2 * e["perimetre"] * P["rive"]
244+ q["Isolation et pare-vapeur"] = {"q": A_murs_net + e["aire_au_sol"] + A_fond + A_sep + e["garage"] + A_rive,
245+ "regle": "murs extérieurs nets + plafond de l'étage + murs de fondation nets + séparation garage (murs et plafond) + solives de rive",
246+ "detail": {"murs_net": A_murs_net, "plafond": e["aire_au_sol"], "fondation": A_fond, "sep_murs": A_sep, "sep_plafond": e["garage"], "rive": A_rive}}
247+ # --- gypse et peinture : plafonds des pièces finies + murs des pièces (périmètre net × 2,44) − ouvertures ; garage : plafond + séparation
248+ pcs = S["pieces"]
249+ g_plafonds = pcs.loc[(pcs["fini"].isin(["céramique", "bois franc", "flottant"])), "nette"].sum() + e["garage"]
250+ g_murs = pcs.loc[(pcs["fini"].isin(["céramique", "bois franc", "flottant"])), "perimetre_net"].sum() * P["h_mur"]
251+ g_sep_garage = separation_garage() * P["h_mur"] # face côté garage (la face côté maison est dans les périmètres des pièces)
252+ g_ouv = (P["fen_hs"][0] * P["fen_hs"][1] + P["fen_ss"][0] * P["fen_ss"][1] + P["porte_ext"][0] * P["porte_ext"][1]
253+ + 2 * P["porte_int"][0] * P["porte_int"][1])
254+ g_total = g_plafonds + g_murs + g_sep_garage - g_ouv
255+ q["Gypse et tirage de joints"] = {"q": g_total, "regle": "plafonds des pièces finies + périmètre net des pièces × 2,44 m + séparation côté garage − ouvertures (portes intérieures : deux faces)",
256+ "detail": {"plafonds": g_plafonds, "murs": g_murs, "sep_garage": g_sep_garage, "ouvertures": g_ouv}}
257+ q["Peinture intérieure"] = {"q": g_total, "regle": "surface de gypse (même mesure)", "detail": {}}
258+ # --- planchers
259+ for fini, poste in (("bois franc", "Planchers bois franc"), ("céramique", "Planchers céramique")):
260+ s = pcs.loc[pcs["fini"] == fini, "nette"].sum()
261+ q[poste] = {"q": s, "regle": f"aire nette des pièces finies en {fini}", "detail": dict(zip(pcs.loc[pcs["fini"] == fini, "piece"], pcs.loc[pcs["fini"] == fini, "nette"]))}
262+ q["Planchers flottants (sous-sol)"] = {"q": e["aire_sous_sol"], "regle": "aire brute du sous-sol (convention du devis ; aire finie nette en détail)",
263+ "detail": {"brute": e["aire_sous_sol"], "finie_nette": S["sous_sol_fini_net"]}}
264+ # --- gouttières : deux rives + descentes
265+ q["Gouttières et solins"] = {"q": 2 * (P["L"] + 2 * P["debord"]) + P["descentes"][0] * P["descentes"][1], "regle": "deux rives (façade + débords) + descentes",
266+ "detail": {"rives": 2 * (P["L"] + 2 * P["debord"]), "descentes": P["descentes"][0] * P["descentes"][1]}}
267+ q["Balcon et perron"] = {"q": P["perron"][0] * P["perron"][1] + P["balcon"][0] * P["balcon"][1], "regle": "perron avant + balcon arrière (aires)", "detail": {}}
268+ q["Entrée asphaltée"] = {"q": P["entree"][0] * P["entree"][1], "regle": "largeur × longueur de l'entrée", "detail": {}}
269+ # --- dénombrés
270+ q["Fenêtres (PVC double vitrage)"] = {"q": sum(sum(v.values()) for v in FENETRES.values()), "regle": "dénombrement sur plan (rez, étage, sous-sol)", "detail": {k: sum(v.values()) for k, v in FENETRES.items()}}
271+ q["Portes extérieures"] = {"q": 3, "regle": "entrée principale, porte-patio, porte de service du garage", "detail": {}}
272+ q["Porte de garage"] = {"q": 1, "regle": "garage simple", "detail": {}}
273+ q["Escaliers"] = {"q": 2, "regle": "rez → étage, rez → sous-sol", "detail": {}}
274+ q["Portes intérieures et moulures"] = {"q": sum(len(v) for v in PORTES_INT.values()), "regle": "dénombrement des portes intérieures", "detail": {k: len(v) for k, v in PORTES_INT.items()}}
275+ q["Plomberie brute et finition"] = {"q": len(APPAREILS), "regle": "dénombrement des appareils et raccords", "detail": {}}
276+ q["Supervision de chantier (salaires)"] = {"q": 26, "regle": "durée du chantier : 6 mois = 26 semaines", "detail": {}}
277+ return q
278+
279+
280+def verification(devis: pd.DataFrame) -> pd.DataFrame:
281+ """Tableau du métré de contrôle : quantité du devis, quantité recalculée, écart relatif, verdict ; 'forfait' pour les postes non mesurables."""
282+ q = quantites_geometriques(); rows = []
283+ for _, r in devis.iterrows():
284+ if r["poste"] in q:
285+ qc = q[r["poste"]]["q"]; ecart = qc / r["quantite"] - 1
286+ classe = "dénombré" if r["unite"] in ("unité", "appareil", "semaine") else "mesuré"
287+ verdict = "conforme" if abs(ecart) <= TOL_CONFORME else ("à préciser" if abs(ecart) <= TOL_PRECISER else "à justifier")
288+ rows.append({"poste": r["poste"], "corps": c21.CORPS[r["poste"]], "unite": r["unite"], "classe": classe, "q_devis": r["quantite"], "q_calc": qc,
289+ "ecart": ecart, "verdict": verdict, "prix_unitaire": r["prix_unitaire"], "montant": r["montant"],
290+ "delta_montant": (qc - r["quantite"]) * r["prix_unitaire"], "regle": q[r["poste"]]["regle"]})
291+ else:
292+ rows.append({"poste": r["poste"], "corps": c21.CORPS[r["poste"]], "unite": r["unite"], "classe": "forfait", "q_devis": r["quantite"], "q_calc": np.nan,
293+ "ecart": np.nan, "verdict": "ratio", "prix_unitaire": r["prix_unitaire"], "montant": r["montant"], "delta_montant": 0.0,
294+ "regle": "non mesurable : contrôle par ratio ($/m² habitable, part de D)"})
295+ return pd.DataFrame(rows)
296+
297+
298+def effet_metre_controle(devis: pd.DataFrame, verif: pd.DataFrame) -> dict:
299+ """D et C_N si les quantités mesurées du devis étaient remplacées par les quantités du métré de contrôle (postes directs)."""
300+ cn = c21.cout_neuf_sujet(devis)
301+ mult = (1 + cn["taux_indirects"]) * (1 + cn["taux_incitatif"])
302+ directs = verif[(verif["classe"] != "forfait") & (~verif["poste"].isin([p for p, c in c21.CORPS.items() if c == "Coûts indirects"]))]
303+ delta_D = float(directs["delta_montant"].sum())
304+ # indirects du devis inchangés (en dollars) : seul l'incitatif suit (assiette D + I)
305+ D2 = cn["direct"] + delta_D; I2 = cn["indirects"]
306+ CN2 = (D2 + I2) * (1 + cn["taux_incitatif"])
307+ return {"delta_D": delta_D, "D": cn["direct"], "D2": D2, "CN": cn["total"], "CN2": CN2, "delta_CN": CN2 - cn["total"],
308+ "mult": mult, "delta_CN_si_taux": delta_D * mult, "part_D": delta_D / cn["direct"], "part_CN": (CN2 - cn["total"]) / cn["total"]}
309+
310+
311+def sensibilite_quantites(devis: pd.DataFrame, erreurs=(-0.10, -0.05, 0.05, 0.10)) -> pd.DataFrame:
312+ """Effet sur C_N d'une erreur relative uniforme sur les quantités d'un corps de métier (indirects du devis en dollars fixes,
313+ incitatif 10 % sur D + I), et d'une erreur uniforme sur tous les postes directs."""
314+ cn = c21.cout_neuf_sujet(devis); g = c21.regrouper(devis); rows = []
315+ for corps in c21.ORDRE_CORPS[:-1] + ["Tous les postes directs"]:
316+ base = cn["direct"] if corps == "Tous les postes directs" else float(g.loc[corps, "montant"])
317+ row = {"corps": corps, "montant": base, "part_D": base / cn["direct"]}
318+ for e in erreurs:
319+ D2 = cn["direct"] + e * base
320+ CN2 = (D2 + cn["indirects"]) * (1 + cn["taux_incitatif"])
321+ row[f"dCN_{e:+.2f}"] = CN2 - cn["total"]
322+ row[f"pct_{e:+.2f}"] = CN2 / cn["total"] - 1
323+ rows.append(row)
324+ return pd.DataFrame(rows)
325+
326+
327+def propagation(devis: pd.DataFrame, sigma_rel: float = 0.05) -> dict:
328+ """Propagation d'erreurs de mesure indépendantes : σ_D/D = σ_rel · √(Σ ω_k²) pour les postes directs (ω_k = part du poste dans D)."""
329+ d = devis[~devis["indirect"]]
330+ w = (d["montant"] / d["montant"].sum()).to_numpy()
331+ H = float((w ** 2).sum())
332+ return {"herfindahl": H, "sigma_D_rel": sigma_rel * math.sqrt(H), "sigma_D": sigma_rel * math.sqrt(H) * float(d["montant"].sum()),
333+ "n": len(d), "equiv_uniforme": 1 / H, "max_part": float(w.max()), "poste_max": d.loc[d["montant"].idxmax(), "poste"],
334+ "sigma_si_parfaitement_correle": sigma_rel}
335+
336+
337+def pertes(devis: pd.DataFrame) -> pd.DataFrame:
338+ rows = []
339+ for poste, w in PERTES.items():
340+ r = devis[devis["poste"] == poste].iloc[0]
341+ rows.append({"poste": poste, "unite": r["unite"], "q_mesuree": r["quantite"], "taux": w, "q_commander": r["quantite"] * (1 + w),
342+ "surplus": r["quantite"] * w, "cout_pertes_si_prix_pose": r["quantite"] * w * r["prix_unitaire"] / (1 + w)})
343+ return pd.DataFrame(rows)
344+
345+
346+def repartition_par_type(devis: pd.DataFrame) -> pd.DataFrame:
347+ """Montant par corps de métier et par type d'unité (mesuré en volume/surface/longueur, dénombré, forfait)."""
348+ def typ(u):
349+ if u in ("m³", "m²", "m lin."): return "mesuré"
350+ if u in ("unité", "appareil", "semaine"): return "dénombré"
351+ return "forfait"
352+ d = devis.copy(); d["type"] = d["unite"].map(typ); d["corps"] = d["poste"].map(c21.CORPS)
353+ t = d.pivot_table(index="corps", columns="type", values="montant", aggfunc="sum", fill_value=0.0).reindex(c21.ORDRE_CORPS)
354+ return t[[c for c in ("mesuré", "dénombré", "forfait") if c in t.columns]]
355+
356+
357+# ----------------------------------------------------------------------------- TikZ du plan coté
358+
359+def tikz_plan(niveau: str, echelle: float = 0.42) -> str:
360+ """Code TikZ du plan d'un niveau (coordonnées en mètres × échelle cm)."""
361+ P = PLAN; s = echelle; out = []
362+ out.append(f"\\begin{{scope}}[scale={s}]")
363+ out.append(f"\\draw[line width=1.4pt] (0,0) rectangle ({P['L']},{P['W']});")
364+ for (x0, y0, x1, y1, nom, fini) in PIECES[niveau]:
365+ if niveau == "soussol" and nom == "Rangement":
366+ pass
367+ out.append(f"\\draw[line width=0.5pt] ({x0},{y0}) rectangle ({x1},{y1});")
368+ cx, cy = (x0 + x1) / 2, (y0 + y1) / 2
369+ lab = nom.replace("'", "'")
370+ a = (x1 - x0) * (y1 - y0)
371+ out.append(f"\\node[font=\\sffamily\\tiny, align=center] at ({cx:.2f},{cy:.2f}) {{{lab}\\\\{a:.1f}\\,m\\textsuperscript{{2}}}};")
372+ if niveau in ("rez",):
373+ out.append(f"\\draw[line width=1.1pt] ({P['gx']},0) -- ({P['gx']},{P['gy']}) -- (0,{P['gy']});")
374+ out.append("\\end{scope}")
375+ return "\n".join(out)
376+
377+
378+# ----------------------------------------------------------------------------- impression
379+
380+def main(tikz: bool = False) -> dict:
381+ devis, sujet = c21.charger()
382+ e = empreinte(); S = superficies(); q = quantites_geometriques(); V = verification(devis)
383+ eff = effet_metre_controle(devis, V); sens = sensibilite_quantites(devis); prop = propagation(devis); per = pertes(devis); rep = repartition_par_type(devis)
384+ cn = c21.cout_neuf_sujet(devis)
385+ f = lambda x: f"{x:,.2f}".replace(",", " ")
386+ if tikz:
387+ for n in ("rez", "etage", "soussol"):
388+ print(f"% ---- {n}"); print(tikz_plan(n))
389+ return {}
390+ print("== DONNÉES SYNTHÉTIQUES — sujet cas 1 : plan coté", PLAN["L"], "×", PLAN["W"], "m ; garage", PLAN["gx"], "×", PLAN["gy"], "m")
391+ print(f"== Empreinte (aire au sol MEFQ) {e['aire_au_sol']:.2f} m² ; périmètre au sol {e['perimetre']:.2f} m ; garage {e['garage']:.2f} m² ; sous-sol {e['aire_sous_sol']:.2f} m²")
392+ print(f"== Aire des étages (MEFQ, 2 étages) {S['aire_etages_mefq']:.2f} m² = {S['aire_etages_mefq']*PI2_PAR_M2:.0f} pi² ; périmètre des étages {S['perimetre_etages_mefq']:.2f} m")
393+ print(f"== Superficie habitable (brute hors garage) {S['habitable']:.2f} m² = {S['habitable']*PI2_PAR_M2:.0f} pi² ; sujet.json : {sujet['superficie_habitable_m2']} m²")
394+ print(f"== Aire nette intérieure hors sol {S['nette_hors_sol']:.2f} m² (rez {S['nette_rez']:.2f} + étage {S['nette_etage']:.2f}, trémie {S['trémie']:.2f} déduite) ; sous-sol net {S['sous_sol_net']:.2f} m², fini net {S['sous_sol_fini_net']:.2f} m²")
395+ print(f"== Cloisons : rez {cloisons('rez'):.2f} m ; étage {cloisons('etage'):.2f} m ; sous-sol {cloisons('soussol'):.2f} m ; séparation garage {separation_garage():.2f} m")
396+ print("== Pièces (aire brute / nette, m²) :")
397+ for _, r in S["pieces"].iterrows():
398+ print(f" {r['niveau']:8s} {r['piece']:24s} {r['fini']:10s} {r['brute']:6.2f} {r['nette']:6.2f} ({r['largeur']:.2f} × {r['profondeur']:.2f})")
399+ print("== Quantités géométriques (détail) :")
400+ for k, v in q.items():
401+ print(f" {k:56s} {v['q']:9.2f} {v['regle']}")
402+ if v["detail"]:
403+ print(" ", {kk: (round(vv, 2) if isinstance(vv, float) else vv) for kk, vv in v["detail"].items()})
404+ print("== Métré de contrôle (devis vs recalcul) :")
405+ for _, r in V.iterrows():
406+ if r["classe"] != "forfait":
407+ print(f" {r['poste']:56s} {r['unite']:8s} devis {r['q_devis']:8.2f} calc {r['q_calc']:8.2f} écart {r['ecart']*100:+6.1f} % {r['verdict']:11s} Δ$ {r['delta_montant']:+9.2f}")
408+ nb = V["verdict"].value_counts().to_dict(); print(" verdicts :", nb)
409+ print(f"== Effet du métré de contrôle : ΔD = {f(eff['delta_D'])} $ ({eff['part_D']*100:+.2f} % de D) ; D' = {f(eff['D2'])} $ ; C_N' = {f(eff['CN2'])} $ (Δ {f(eff['delta_CN'])} $, {eff['part_CN']*100:+.2f} %) ; multiplicateur (1+τI)(1+τE) = {eff['mult']:.4f}")
410+ print(f"== Rappel ch. 21 : D = {f(cn['direct'])} $, I = {f(cn['indirects'])} $, C_N = {f(cn['total'])} $")
411+ print("== Sensibilité aux erreurs de quantité (ΔC_N en $, par corps, erreur uniforme) :")
412+ for _, r in sens.iterrows():
413+ print(f" {r['corps']:28s} part de D {r['part_D']*100:5.1f} % " + " ".join(f"{c[4:]}: {r[c]:+9.0f} ({r['pct_'+c[4:]]*100:+.2f} %)" for c in sens.columns if c.startswith("dCN_")))
414+ print(f"== Propagation (σ = 5 % par poste direct, indépendants) : Herfindahl {prop['herfindahl']:.4f} (≈ {prop['equiv_uniforme']:.1f} postes équivalents), σ_D/D = {prop['sigma_D_rel']*100:.2f} %, σ_D = {f(prop['sigma_D'])} $ ; poste max {prop['poste_max']} ({prop['max_part']*100:.1f} %) ; si erreurs parfaitement corrélées : {prop['sigma_si_parfaitement_correle']*100:.1f} %")
415+ print("== Pertes et chutes (hypothèses pédagogiques) :")
416+ for _, r in per.iterrows():
417+ print(f" {r['poste']:56s} {r['q_mesuree']:7.1f} {r['unite']:6s} × (1 + {r['taux']*100:.0f} %) = {r['q_commander']:7.1f} (surplus {r['surplus']:.1f})")
418+ print(f" surplus total valorisé au prix posé : {f(per['cout_pertes_si_prix_pose'].sum())} $")
419+ print("== Répartition par corps et par type d'unité ($) :"); print(rep.round(2).to_string())
420+ tot = rep.sum(); print(" totaux :", {k: round(v, 2) for k, v in tot.items()}, " parts :", {k: f"{v/tot.sum()*100:.1f} %" for k, v in tot.items()})
421+ return {"devis": devis, "sujet": sujet, "empreinte": e, "superficies": S, "quantites": q, "verification": V, "effet": eff,
422+ "sensibilite": sens, "propagation": prop, "pertes": per, "repartition": rep, "cout_neuf": cn}
423+
424+
425+if __name__ == "__main__":
426+ main(tikz="--tikz" in sys.argv)
modified analysis/python/tests/test_ch17.py +7 −0
@@ -75,6 +75,13 @@ def test_ajustement_de_temps(r):
75 assert t["indices"] == pytest.approx(t["coefficient"], abs=1) 75 assert t["indices"] == pytest.approx(t["coefficient"], abs=1)
76 assert t["taux_compose_generation"] == pytest.approx(28558, abs=1) and t["lineaire_simple"] == pytest.approx(27998, abs=1) 76 assert t["taux_compose_generation"] == pytest.approx(28558, abs=1) and t["lineaire_simple"] == pytest.approx(27998, abs=1)
77 77
78+def test_financement(r):
79+ fi = r["financement"]; fa = r["financement_amorti"]
80+ assert fi["paiement_mensuel"] == pytest.approx(248.96, abs=0.01) and fi["valeur_actualisee"] == pytest.approx(130389, abs=1)
81+ assert fi["avantage"] == pytest.approx(19611, abs=1) and 100 * fi["ajustement_pct"] == pytest.approx(-3.16, abs=0.01) and fi["prix_comptant"] == pytest.approx(600389, abs=1)
82+ assert fa["avantage"] == pytest.approx(18138, abs=1)
83+ assert 100 * fi["i_m_contrat"] == pytest.approx(0.1660, abs=0.0001) and 100 * fi["i_m_marche"] == pytest.approx(0.4124, abs=0.0001)
84+
78 def test_paires(r): 85 def test_paires(r):
79 g = r["resume_garage"]; s = r["resume_sous_sol"] 86 g = r["resume_garage"]; s = r["resume_sous_sol"]
80 assert g["n"] == 15 and s["n"] == 14 87 assert g["n"] == 15 and s["n"] == 14
modified manuscript/chapters/ch09.tex +2 −2
@@ -30,7 +30,7 @@ Le rôle « indique la valeur de chaque unité d'évaluation, sur la base de sa
30 La valeur réelle d'une unité d'évaluation est « sa valeur d'échange sur un marché libre et ouvert à la concurrence, soit le prix le plus probable » d'une vente de gré à gré dans laquelle les parties ne sont pas obligées de conclure et sont « raisonnablement informés de l'état de l'unité d'évaluation, de l'utilisation qui peut le plus probablement en être faite et des conditions du marché » \parencite[art.~43]{lfm}. Lorsqu'une unité n'est pas susceptible de faire l'objet d'une vente de gré à gré, sa valeur réelle est le prix qu'une personne « serait justifiée de payer et d'exiger si elle était à la fois l'acheteur et le vendeur » \parencite[art.~44]{lfm}. 30 La valeur réelle d'une unité d'évaluation est « sa valeur d'échange sur un marché libre et ouvert à la concurrence, soit le prix le plus probable » d'une vente de gré à gré dans laquelle les parties ne sont pas obligées de conclure et sont « raisonnablement informés de l'état de l'unité d'évaluation, de l'utilisation qui peut le plus probablement en être faite et des conditions du marché » \parencite[art.~43]{lfm}. Lorsqu'une unité n'est pas susceptible de faire l'objet d'une vente de gré à gré, sa valeur réelle est le prix qu'une personne « serait justifiée de payer et d'exiger si elle était à la fois l'acheteur et le vendeur » \parencite[art.~44]{lfm}.
31 \end{definition} 31 \end{definition}
32 32
33−La définition de l'art.~43 est l'exacte parente de la valeur marchande des normes professionnelles examinée au \cref{ch:2} et au \cref{ch:16} : prix le plus probable, marché ouvert, parties informées et non contraintes. Trois précisions la complètent. L'art.~45 impose de tenir compte des avantages et désavantages de l'unité « en les considérant de façon objective », ce qui exclut la valeur subjective pour le propriétaire actuel. L'art.~45.1, dans sa rédaction issue d'une modification de 2025, répute que « le vendeur est réputé détenir tous les droits du locataire », de sorte qu'un immeuble locatif est évalué au rôle comme s'il était libre de baux, hormis les logements à loyer modique, les logements abordables conventionnés et ceux inscrits au nom d'un office d'habitation \parencite[art.~45.1]{lfm} ; cette fiction est une seconde source d'écart entre la valeur au rôle d'un immeuble locatif et son prix de vente, lequel reflète les baux en place (\cref{ch:26,ch:33,ch:34}). L'art.~44, enfin, légitime la méthode du coût pour les immeubles à vocation unique qui n'ont pas de marché, dans la ligne tracée par la Cour suprême dans l'affaire \emph{Sun Life} dès 1950, où la valeur réelle de la charte de Montréal fut comprise comme une valeur d'échange, et le coût de remplacement admis pour l'immeuble sans marché \parencite{sunlife1950} ; ce résumé repose sur les sommaires disponibles et non sur le texte de l'arrêt, que nous n'avons pu consulter. 33+La définition de l'art.~43 est l'exacte parente de la valeur marchande des normes professionnelles examinée au \cref{ch:02} et au \cref{ch:16} : prix le plus probable, marché ouvert, parties informées et non contraintes. Trois précisions la complètent. L'art.~45 impose de tenir compte des avantages et désavantages de l'unité « en les considérant de façon objective », ce qui exclut la valeur subjective pour le propriétaire actuel. L'art.~45.1, dans sa rédaction issue d'une modification de 2025, répute que « le vendeur est réputé détenir tous les droits du locataire », de sorte qu'un immeuble locatif est évalué au rôle comme s'il était libre de baux, hormis les logements à loyer modique, les logements abordables conventionnés et ceux inscrits au nom d'un office d'habitation \parencite[art.~45.1]{lfm} ; cette fiction est une seconde source d'écart entre la valeur au rôle d'un immeuble locatif et son prix de vente, lequel reflète les baux en place (\cref{ch:26,ch:33,ch:34}). L'art.~44, enfin, légitime la méthode du coût pour les immeubles à vocation unique qui n'ont pas de marché, dans la ligne tracée par la Cour suprême dans l'affaire \emph{Sun Life} dès 1950, où la valeur réelle de la charte de Montréal fut comprise comme une valeur d'échange, et le coût de remplacement admis pour l'immeuble sans marché \parencite{sunlife1950} ; ce résumé repose sur les sommaires disponibles et non sur le texte de l'arrêt, que nous n'avons pu consulter.
34 34
35 \subsection{La date de référence et l'état de l'unité} 35 \subsection{La date de référence et l'état de l'unité}
36 36
@@ -79,7 +79,7 @@ Gatineau & 2027-2028-2029, en vigueur le 2027-01-01 (rôle 2024-2026 jusqu'au 20
79 \tabsource{\textcite{montrealrole2026,quebecrole2025,gatineaurole2027} ; statistiques de presse pour Québec et pour le détail de Gatineau (sources/notes-E.md), consultées le 2026-10-31 ; le dépôt de Gatineau après le 15 septembre relève du report de l'art.~71.} 79 \tabsource{\textcite{montrealrole2026,quebecrole2025,gatineaurole2027} ; statistiques de presse pour Québec et pour le détail de Gatineau (sources/notes-E.md), consultées le 2026-10-31 ; le dépôt de Gatineau après le 15 septembre relève du report de l'art.~71.}
80 \end{table} 80 \end{table}
81 81
82−La date de référence a trois conséquences pratiques. D'abord, la valeur au rôle est toujours « en retard » sur le marché : à la fin d'un cycle, elle décrit des conditions vieilles de quatre ans et demi, et dans un marché qui progresse de 4 à 5 \% par an, le prix de vente d'une maison dépasse alors sa valeur au rôle d'une quinzaine de pour cent sans qu'il y ait la moindre erreur d'évaluation. JLR relevait ainsi, pour la partie québécoise de la RMR d'Ottawa-Gatineau en août 2026, sous un rôle dont la référence était le 1\textsuperscript{er} juillet 2022, un ratio prix de vente sur évaluation municipale de 111 \% pour les unifamiliales \parencite{jlr202608}. Ensuite, l'état de l'unité est lui aussi figé à la date de référence : l'art.~46 al.~3 précise que cet état « comprend, outre son état physique, sa situation au point de vue économique et juridique » et l'environnement, ce qui fait entrer le zonage, les servitudes, la contamination et les nuisances dans la valeur réelle (\cref{ch:8,ch:43}). Seuls les événements énumérés à l'art.~174, comme un incendie, des travaux substantiellement terminés ou une nouvelle restriction juridique, autorisent une modification en cours de cycle, et l'état est alors apprécié « immédiatement après l'événement » tandis que les conditions du marché restent celles de la date de référence \parencite[art.~46 al.~2 et 174]{lfm}. Enfin, l'al.~5 de l'art.~46 permet de tenir compte « des transferts de propriété survenus avant et après cette date », ce qui autorise l'évaluateur, et le contribuable qui conteste, à utiliser des ventes postérieures au 1\textsuperscript{er} juillet, pourvu qu'elles soient ramenées aux conditions du marché de cette date. 82+La date de référence a trois conséquences pratiques. D'abord, la valeur au rôle est toujours « en retard » sur le marché : à la fin d'un cycle, elle décrit des conditions vieilles de quatre ans et demi, et dans un marché qui progresse de 4 à 5 \% par an, le prix de vente d'une maison dépasse alors sa valeur au rôle d'une quinzaine de pour cent sans qu'il y ait la moindre erreur d'évaluation. JLR relevait ainsi, pour la partie québécoise de la RMR d'Ottawa-Gatineau en août 2026, sous un rôle dont la référence était le 1\textsuperscript{er} juillet 2022, un ratio prix de vente sur évaluation municipale de 111 \% pour les unifamiliales \parencite{jlr202608}. Ensuite, l'état de l'unité est lui aussi figé à la date de référence : l'art.~46 al.~3 précise que cet état « comprend, outre son état physique, sa situation au point de vue économique et juridique » et l'environnement, ce qui fait entrer le zonage, les servitudes, la contamination et les nuisances dans la valeur réelle (\cref{ch:08,ch:43}). Seuls les événements énumérés à l'art.~174, comme un incendie, des travaux substantiellement terminés ou une nouvelle restriction juridique, autorisent une modification en cours de cycle, et l'état est alors apprécié « immédiatement après l'événement » tandis que les conditions du marché restent celles de la date de référence \parencite[art.~46 al.~2 et 174]{lfm}. Enfin, l'al.~5 de l'art.~46 permet de tenir compte « des transferts de propriété survenus avant et après cette date », ce qui autorise l'évaluateur, et le contribuable qui conteste, à utiliser des ventes postérieures au 1\textsuperscript{er} juillet, pourvu qu'elles soient ramenées aux conditions du marché de cette date.
83 83
84 L'\motcle{équilibration}, prévue à l'art.~46.1, est l'opération par laquelle l'évaluateur modifie « tout ou partie des valeurs inscrites au rôle en vigueur dans le but d'éliminer le plus possible les écarts entre les proportions » ; elle est obligatoire à chaque rôle, sauf pour une municipalité de moins de 5~000 habitants dont le rôle en vigueur résultait déjà d'une équilibration \parencite[art.~46.1]{lfm}. En pratique, l'équilibration est la réévaluation générale triennale, et le Règlement sur le rôle lui impose des résultats mesurables, que la section suivante expose. 84 L'\motcle{équilibration}, prévue à l'art.~46.1, est l'opération par laquelle l'évaluateur modifie « tout ou partie des valeurs inscrites au rôle en vigueur dans le but d'éliminer le plus possible les écarts entre les proportions » ; elle est obligatoire à chaque rôle, sauf pour une municipalité de moins de 5~000 habitants dont le rôle en vigueur résultait déjà d'une équilibration \parencite[art.~46.1]{lfm}. En pratique, l'équilibration est la réévaluation générale triennale, et le Règlement sur le rôle lui impose des résultats mesurables, que la section suivante expose.
85 85
modified manuscript/chapters/ch17.tex +20 −14
@@ -17,7 +17,7 @@ Le \cref{ch:16} a laissé le lecteur devant cinq ventes vérifiées, voisines du
17 17
18 \subsection{Ce qu'est un ajustement} 18 \subsection{Ce qu'est un ajustement}
19 19
20−Le \cref{ch:16} a défini le prix ajusté d'un comparable comme son prix de vente corrigé de la contribution de ses différences avec le sujet, de sorte que $P^{\text{aj}}_j = V_s + \varepsilon_j$ sous le modèle local de l'\cref{eq:16:local}. Cette écriture fixe trois choses que la pratique perd parfois de vue. D'abord, c'est le \emph{comparable} que l'on ajuste vers le sujet, jamais l'inverse : on se demande ce que le comparable se serait vendu s'il avait eu les caractéristiques du sujet. Ensuite, le signe d'un ajustement est celui du point de vue du sujet : si le sujet est supérieur au comparable sur une caractéristique, le comparable se serait vendu plus cher en la possédant, et l'ajustement est positif ; si le sujet est inférieur, l'ajustement est négatif. Enfin, un ajustement est le produit d'un prix implicite par un écart de caractéristique, $A_{jk} = \beta_k (x_{sk} - x_{jk})$ ; il n'existe donc pas de « valeur d'un garage » dans l'absolu, mais un prix implicite propre à un marché, à une date et à un niveau de prix. 20+Le \cref{ch:16} a défini le prix ajusté d'un comparable comme son prix de vente corrigé de la contribution de ses différences avec le sujet, de sorte que $P^{\text{aj}}_j = V_s + \varepsilon_j$ sous le modèle local linéaire du \cref{ch:16}. Cette écriture fixe trois choses que la pratique perd parfois de vue. D'abord, c'est le \emph{comparable} que l'on ajuste vers le sujet, jamais l'inverse : on se demande ce que le comparable se serait vendu s'il avait eu les caractéristiques du sujet. Ensuite, le signe d'un ajustement est celui du point de vue du sujet : si le sujet est supérieur au comparable sur une caractéristique, le comparable se serait vendu plus cher en la possédant, et l'ajustement est positif ; si le sujet est inférieur, l'ajustement est négatif. Enfin, un ajustement est le produit d'un prix implicite par un écart de caractéristique, $A_{jk} = \beta_k (x_{sk} - x_{jk})$ ; il n'existe donc pas de « valeur d'un garage » dans l'absolu, mais un prix implicite propre à un marché, à une date et à un niveau de prix.
21 21
22 \begin{definition}{Ajustement, ajustement brut et ajustement net}{ajustement} 22 \begin{definition}{Ajustement, ajustement brut et ajustement net}{ajustement}
23 L'\motcle{ajustement} $A_{jk}$ est le montant qu'il faut ajouter au prix du comparable $j$ pour neutraliser sa différence avec le sujet sur l'élément de comparaison $k$ ; il est positif lorsque le sujet est supérieur au comparable sur cet élément. L'\motcle{ajustement brut} du comparable est la somme des valeurs absolues de ses ajustements rapportée à son prix, $\sum_k \abs{A_{jk}} / P_j$ ; l'\motcle{ajustement net} est la somme algébrique rapportée au prix, $\sum_k A_{jk} / P_j$. Le premier mesure l'éloignement total du comparable, le second le déséquilibre entre ses supériorités et ses infériorités. 23 L'\motcle{ajustement} $A_{jk}$ est le montant qu'il faut ajouter au prix du comparable $j$ pour neutraliser sa différence avec le sujet sur l'élément de comparaison $k$ ; il est positif lorsque le sujet est supérieur au comparable sur cet élément. L'\motcle{ajustement brut} du comparable est la somme des valeurs absolues de ses ajustements rapportée à son prix, $\sum_k \abs{A_{jk}} / P_j$ ; l'\motcle{ajustement net} est la somme algébrique rapportée au prix, $\sum_k A_{jk} / P_j$. Le premier mesure l'éloignement total du comparable, le second le déséquilibre entre ses supériorités et ses infériorités.
@@ -72,6 +72,12 @@ Usage et zonage & Usage permis, densité, droits de développement & $+$ si le s
72 72
73 Cet ordre n'est pas une exigence normative. Les Normes de pratique professionnelle de l'OEAQ exigent que le rapport expose « le traitement de l'information et le raisonnement » qui conduisent à la conclusion de valeur (règle 2.3), et que la définition de la valeur retenue soit celle d'un prix épuré des incitatifs et des conditions de financement avantageuses \parencite{oeaqNormes} ; elles ne prescrivent ni la forme ni l'ordre des ajustements. L'ordre conventionnel est une pratique courante, justifiée par trois arguments. Le premier est logique : on ne peut comparer les caractéristiques de deux biens qu'après avoir ramené leurs prix à une même définition, celle d'une vente sincère, au comptant, de la pleine propriété, à la date d'évaluation. Le deuxième est arithmétique : les ajustements de propriété tirés du marché le sont à la date d'évaluation, sur des prix actuels ; les appliquer à un prix de 2025 non actualisé mélangerait deux niveaux de prix. Le troisième est statistique, et il sera développé à la \cref{sec:17:cascade} : la cascade en pourcentage puis l'addition en dollars est une approximation d'un modèle multiplicatif dont les propriétés sont connues. 73 Cet ordre n'est pas une exigence normative. Les Normes de pratique professionnelle de l'OEAQ exigent que le rapport expose « le traitement de l'information et le raisonnement » qui conduisent à la conclusion de valeur (règle 2.3), et que la définition de la valeur retenue soit celle d'un prix épuré des incitatifs et des conditions de financement avantageuses \parencite{oeaqNormes} ; elles ne prescrivent ni la forme ni l'ordre des ajustements. L'ordre conventionnel est une pratique courante, justifiée par trois arguments. Le premier est logique : on ne peut comparer les caractéristiques de deux biens qu'après avoir ramené leurs prix à une même définition, celle d'une vente sincère, au comptant, de la pleine propriété, à la date d'évaluation. Le deuxième est arithmétique : les ajustements de propriété tirés du marché le sont à la date d'évaluation, sur des prix actuels ; les appliquer à un prix de 2025 non actualisé mélangerait deux niveaux de prix. Le troisième est statistique, et il sera développé à la \cref{sec:17:cascade} : la cascade en pourcentage puis l'addition en dollars est une approximation d'un modèle multiplicatif dont les propriétés sont connues.
74 74
75+\subsection{Les ajustements de transaction autres que le temps}
76+
77+Quatre ajustements de transaction précèdent celui des conditions du marché, et la pratique québécoise les rencontre moins souvent qu'on ne le croit, parce que la vérification du \cref{ch:16} conduit le plus souvent à écarter la vente plutôt qu'à l'ajuster. L'ajustement de \emph{droits transmis} corrige une vente qui n'a pas porté sur la pleine propriété libre de charges : un immeuble grevé d'un bail commercial de longue durée à loyer inférieur au marché, une emphytéose, une fraction indivise ; son montant est la valeur actualisée de l'écart de droits (\cref{ch:2,ch:6}) et, pour une maison unifamiliale, il est presque toujours préférable de remplacer le comparable. L'ajustement de \emph{conditions de vente} corrige une vente qui n'a pas été sincère ou pleinement exposée ; il ne se mesure pas directement, et le seul procédé défendable est de comparer la vente suspecte à des ventes sincères de biens semblables, ce qui revient à une analyse de paires. L'ajustement de \emph{dépenses après l'achat} ajoute au prix du comparable le coût des travaux que l'acheteur savait devoir engager immédiatement et dont il a tenu compte dans son offre : un toit à refaire, une installation septique à remplacer ; il est positif du point de vue du sujet si celui-ci n'exige pas ces travaux, et le dossier doit établir, par l'historique de courtage ou l'entretien avec une partie, que le prix convenu en tenait compte. L'ajustement d'\emph{éléments non immobiliers}, enfin, retranche du prix du comparable la contrepartie des meubles et des électroménagers compris dans la vente ; la valeur déclarée dans l'acte à cet effet est souvent fixée pour des raisons fiscales et ne lie pas l'évaluateur.
78+
79+L'ajustement de \emph{financement} est le seul de ces quatre qui se calcule plutôt qu'il ne se constate, et il mérite un exemple. Lorsque le vendeur consent une balance de prix de vente à un taux inférieur au marché, l'acheteur reçoit un avantage qu'il paie par un prix plus élevé ; le prix comptant équivalent est le prix convenu diminué de la valeur de cet avantage, c'est-à-dire de la différence entre le montant prêté et la valeur actualisée, au taux du marché, des paiements effectivement promis. Soit une vente de \dollars{620000} dont \dollars{150000} sont financés par le vendeur à \pct{2} pendant cinq ans, intérêts seulement payés mensuellement et capital remboursé au terme, alors que le marché exige \pct{5} pour un prêt hypothécaire de même terme, les deux taux étant des taux nominaux à composition semestrielle selon la convention canadienne. Le taux mensuel équivalent du contrat est $(1{,}01)^{1/6} - 1 = 0{,}1660$ \%, d'où un intérêt mensuel de \dollars{248.96} ; celui du marché est $(1{,}025)^{1/6} - 1 = 0{,}4124$ \%. La valeur actualisée au taux du marché des soixante intérêts et du capital vaut \dollars{130389}, de sorte que le vendeur a consenti un avantage de \dollars{19611} ; l'ajustement de financement est de $-\dollars{19611}$, soit \pct{-3.16} du prix, et le prix comptant équivalent du comparable est de \dollars{600389}. Si la balance était plutôt amortie sur vingt-cinq ans avec un terme de cinq ans, le même calcul, appliqué aux soixante mensualités et au solde dû au terme, donnerait un avantage de \dollars{18138}. Le calcul suppose que l'acheteur valorise l'avantage à sa valeur actualisée complète, ce qui n'est vrai que s'il aurait emprunté la même somme aux conditions du marché ; lorsque l'avantage dépasse quelques points de pourcentage du prix, l'incertitude de cette hypothèse justifie, là encore, de remplacer le comparable. Les fonctions \texttt{taux\_mensuel\_canadien}, \texttt{facteur\_va} et \texttt{facteur\_va\_annuite} du module \texttt{traite.finance} reproduisent ce calcul (\texttt{analysis/python/cases/ch17\_ajustements.py}, fonction \texttt{financement}).
80+
75 \subsection{Trois formes du prix ajusté} 81 \subsection{Trois formes du prix ajusté}
76 82
77 Trois écritures du prix ajusté coexistent dans la littérature et dans la pratique, et il importe de les distinguer avant de calculer. La \emph{forme additive} applique tous les ajustements en dollars sur le prix de vente : 83 Trois écritures du prix ajusté coexistent dans la littérature et dans la pratique, et il importe de les distinguer avant de calculer. La \emph{forme additive} applique tous les ajustements en dollars sur le prix de vente :
@@ -233,7 +239,7 @@ La grille remplie fournit, pour chaque comparable, l'ajustement brut et l'ajuste
233 \begin{equation}\label{eq:17:brut-net} 239 \begin{equation}\label{eq:17:brut-net}
234 \mathrm{brut}_j = \frac{\sum_k \abs{A_{jk}}}{P_j}, \qquad \mathrm{net}_j = \frac{\sum_k A_{jk}}{P_j} = \frac{P^{\text{aj}}_j - P_j}{P_j}. 240 \mathrm{brut}_j = \frac{\sum_k \abs{A_{jk}}}{P_j}, \qquad \mathrm{net}_j = \frac{\sum_k A_{jk}}{P_j} = \frac{P^{\text{aj}}_j - P_j}{P_j}.
235 \end{equation} 241 \end{equation}
236−Le \cref{ch:16} a établi que les pondérations optimales des comparables sont inversement proportionnelles à leur variance (\cref{prop:indication}) et que l'ajustement brut est le substitut usuel de cette variance, parce que l'incertitude des prix implicites s'ajoute au bruit de transaction en proportion de l'ampleur des ajustements. La règle de pondération correspondante est 242+Le \cref{ch:16} a établi que les pondérations optimales des comparables sont inversement proportionnelles à leur variance (proposition sur les propriétés de l'indication de valeur) et que l'ajustement brut est le substitut usuel de cette variance, parce que l'incertitude des prix implicites s'ajoute au bruit de transaction en proportion de l'ampleur des ajustements. La règle de pondération correspondante est
237 \begin{equation}\label{eq:17:poids} 243 \begin{equation}\label{eq:17:poids}
238 w_j = \frac{1/\max(\mathrm{brut}_j, b_0)}{\sum_{i=1}^{n} 1/\max(\mathrm{brut}_i, b_0)}, \qquad \hat V_s = \sum_{j=1}^{n} w_j\,P^{\text{aj}}_j, 244 w_j = \frac{1/\max(\mathrm{brut}_j, b_0)}{\sum_{i=1}^{n} 1/\max(\mathrm{brut}_i, b_0)}, \qquad \hat V_s = \sum_{j=1}^{n} w_j\,P^{\text{aj}}_j,
239 \end{equation} 245 \end{equation}
@@ -246,7 +252,7 @@ Le dossier du cas 1 est synthétique. Les 600 ventes de \texttt{data/synthetic/c
246 \end{synthetique} 252 \end{synthetique}
247 253
248 \begin{exemple}{Ajustements et valeur par comparaison du cottage de Hull}{cas1} 254 \begin{exemple}{Ajustements et valeur par comparaison du cottage de Hull}{cas1}
249−Le sujet est le cottage à étages de \msq{165} sur un terrain de \msq{620}, construit en 1998, de qualité 3, avec garage simple et sous-sol fini, évalué au 1\ier{} septembre 2026 (\cref{tab:16:comparables}). L'exemple procède en sept étapes : estimation des prix implicites, ajustement de conditions du marché, cascade pour un comparable, grille complète, recoupement par ventes appariées, analyse relative, pondération et réconciliation partielle. 255+Le sujet est le cottage à étages de \msq{165} sur un terrain de \msq{620}, construit en 1998, de qualité 3, avec garage simple et sous-sol fini, évalué au 1\ier{} septembre 2026 (tableau des comparables retenus du \cref{ch:16}). L'exemple procède en sept étapes : estimation des prix implicites, ajustement de conditions du marché, cascade pour un comparable, grille complète, recoupement par ventes appariées, analyse relative, pondération et réconciliation partielle.
250 256
251 \emph{Étape 1 : les prix implicites.} Le modèle hédonique de référence de l'ouvrage (\texttt{traite.cas1.hedonique}, détaillé au \cref{ch:18}) régresse le logarithme du prix des 600 ventes sur seize régresseurs ; il explique \pct{85.3} de la variance et laisse un écart-type résiduel de 0,083, soit un bruit de transaction d'environ \pct{8.3} du prix. Les coefficients utiles à la grille sont les suivants, avec leurs erreurs-types robustes : 0,539 (0,013) pour le logarithme de la superficie habitable, 0,094 (0,011) pour celui du terrain, $-0{,}00510$ (0,00056) par année d'âge avec un terme quadratique de 0,00264 (0,00064) par centaine d'années au carré, 0,061 (0,004) par échelon de qualité, 0,032 (0,005) par place de garage, 0,022 (0,007) pour le sous-sol fini, 0,026 (0,008) pour la piscine, 0,030 (0,007) pour le type à étages, et 0,00364 (0,00027) par mois. Les cinq comparables étant du secteur de Hull, comme le sujet, et à moins de trois kilomètres du centre, seuil au-delà duquel le modèle fait jouer la distance, l'ajustement de localisation est nul pour chacun : c'est une conséquence de la sélection du \cref{ch:16}, qui a choisi des ventes du même micro-marché, et une limite du modèle, qui ne distingue pas les rues à l'intérieur d'un secteur. 257 \emph{Étape 1 : les prix implicites.} Le modèle hédonique de référence de l'ouvrage (\texttt{traite.cas1.hedonique}, détaillé au \cref{ch:18}) régresse le logarithme du prix des 600 ventes sur seize régresseurs ; il explique \pct{85.3} de la variance et laisse un écart-type résiduel de 0,083, soit un bruit de transaction d'environ \pct{8.3} du prix. Les coefficients utiles à la grille sont les suivants, avec leurs erreurs-types robustes : 0,539 (0,013) pour le logarithme de la superficie habitable, 0,094 (0,011) pour celui du terrain, $-0{,}00510$ (0,00056) par année d'âge avec un terme quadratique de 0,00264 (0,00064) par centaine d'années au carré, 0,061 (0,004) par échelon de qualité, 0,032 (0,005) par place de garage, 0,022 (0,007) pour le sous-sol fini, 0,026 (0,008) pour la piscine, 0,030 (0,007) pour le type à étages, et 0,00364 (0,00027) par mois. Les cinq comparables étant du secteur de Hull, comme le sujet, et à moins de trois kilomètres du centre, seuil au-delà duquel le modèle fait jouer la distance, l'ajustement de localisation est nul pour chacun : c'est une conséquence de la sélection du \cref{ch:16}, qui a choisi des ventes du même micro-marché, et une limite du modèle, qui ne distingue pas les rues à l'intérieur d'un secteur.
252 258
@@ -265,10 +271,10 @@ Le sujet est le cottage à étages de \msq{165} sur un terrain de \msq{620}, con
265 271
266 \begin{table}[htbp] 272 \begin{table}[htbp]
267 \caption{Ajustement de conditions du marché du comparable G0404 (\dollars{506500}, vendu 15,2 mois avant la date d'évaluation) selon cinq écritures}\label{tab:17:temps} 273 \caption{Ajustement de conditions du marché du comparable G0404 (\dollars{506500}, vendu 15,2 mois avant la date d'évaluation) selon cinq écritures}\label{tab:17:temps}
268−\centering\small 274+\centering\footnotesize
269 \begin{tabular}{@{}lS[table-format=1.3]S[table-format=5.0]S[table-format=1.2]@{}} 275 \begin{tabular}{@{}lS[table-format=1.3]S[table-format=5.0]S[table-format=1.2]@{}}
270 \toprule 276 \toprule
271−Écriture & {Paramètre} & {Ajustement (\$)} & {En \% du prix} \\ 277+Écriture & {Paramètre} & {Ajustement (\$)} & {\% du prix} \\
272 \midrule 278 \midrule
273 Coefficient mensuel du modèle, \cref{eq:17:temps-coef} ($\beta_m = 0{,}00364$) & 0.364 & 28733 & 5.67 \\ 279 Coefficient mensuel du modèle, \cref{eq:17:temps-coef} ($\beta_m = 0{,}00364$) & 0.364 & 28733 & 5.67 \\
274 Taux annuel composé estimé, \cref{eq:17:temps-taux} ($g = \pct{4.46}$) & 4.459 & 28733 & 5.67 \\ 280 Taux annuel composé estimé, \cref{eq:17:temps-taux} ($g = \pct{4.46}$) & 4.459 & 28733 & 5.67 \\
@@ -282,10 +288,10 @@ Approximation linéaire $P\,\beta_m\,m$ & 0.364 & 27998 & 5.53 \\
282 288
283 \begin{table}[htbp] 289 \begin{table}[htbp]
284 \caption{Cascade d'ajustements du comparable G0404 vers le sujet, dans l'ordre conventionnel}\label{tab:17:cascade} 290 \caption{Cascade d'ajustements du comparable G0404 vers le sujet, dans l'ordre conventionnel}\label{tab:17:cascade}
285−\centering\small 291+\centering\footnotesize
286 \begin{tabular}{@{}lS[table-format=-1.4]S[table-format=-1.2]S[table-format=-5.0]S[table-format=6.0]@{}} 292 \begin{tabular}{@{}lS[table-format=-1.4]S[table-format=-1.2]S[table-format=-5.0]S[table-format=6.0]@{}}
287 \toprule 293 \toprule
288−Étape & {$\Delta_{jk}$ (log)} & {Effet (\%)} & {Ajustement (\$)} & {Base après l'étape (\$)} \\ 294+Étape & {$\Delta_{jk}$ (log)} & {Effet (\%)} & {Ajustement (\$)} & {Base après (\$)} \\
289 \midrule 295 \midrule
290 Prix de vente (27 mai 2025) & {---} & {---} & {---} & 506500 \\ 296 Prix de vente (27 mai 2025) & {---} & {---} & {---} & 506500 \\
291 Conditions du marché (15,2 mois) & 0.0552 & 5.67 & 28733 & 535233 \\ 297 Conditions du marché (15,2 mois) & 0.0552 & 5.67 & 28733 & 535233 \\
@@ -293,7 +299,7 @@ Localisation (même secteur) & 0 & 0 & 0 & 535233 \\
293 Superficie habitable (165 c. 160 m\textsuperscript{2}) & 0.0166 & 1.67 & 8953 & 544185 \\ 299 Superficie habitable (165 c. 160 m\textsuperscript{2}) & 0.0166 & 1.67 & 8953 & 544185 \\
294 Terrain (620 c. 538 m\textsuperscript{2}) & 0.0133 & 1.34 & 7279 & 551464 \\ 300 Terrain (620 c. 538 m\textsuperscript{2}) & 0.0133 & 1.34 & 7279 & 551464 \\
295 Âge (28 c. 23 ans) & -0.0187 & -1.86 & -10242 & 541222 \\ 301 Âge (28 c. 23 ans) & -0.0187 & -1.86 & -10242 & 541222 \\
296−Qualité, garage, sous-sol, piscine, type (identiques) & 0 & 0 & 0 & 541222 \\ 302+Qualité, garage, sous-sol, piscine, type (égaux) & 0 & 0 & 0 & 541222 \\
297 \midrule 303 \midrule
298 Prix ajusté & 0.0663 & 6.86 & 34722 & 541222 \\ 304 Prix ajusté & 0.0663 & 6.86 & 34722 & 541222 \\
299 \bottomrule 305 \bottomrule
@@ -350,19 +356,19 @@ Résidu du modèle à la vente (\%) & {$+0{,}7$} & {$-14{,}9$} & {$-9{,}9$} & {$
350 356
351 \begin{table}[htbp] 357 \begin{table}[htbp]
352 \caption{Ventes appariées pour le garage et le sous-sol fini : résultats selon les critères de pairage, et prix implicites hédoniques correspondants}\label{tab:17:paires} 358 \caption{Ventes appariées pour le garage et le sous-sol fini : résultats selon les critères de pairage, et prix implicites hédoniques correspondants}\label{tab:17:paires}
353−\centering\footnotesize 359+\centering\footnotesize\setlength{\tabcolsep}{3pt}
354 \begin{tabular}{@{}lS[table-format=1.1]S[table-format=1.0]S[table-format=2.0]S[table-format=2.0]S[table-format=-5.0]S[table-format=5.0]S[table-format=5.0]S[table-format=5.0]@{}} 360 \begin{tabular}{@{}lS[table-format=1.1]S[table-format=1.0]S[table-format=2.0]S[table-format=2.0]S[table-format=-5.0]S[table-format=5.0]S[table-format=5.0]S[table-format=5.0]@{}}
355 \toprule 361 \toprule
356−Élément & {Superficie (± \%)} & {Âge (± ans)} & {Dates (mois)} & {$n$} & {Moyenne (\$)} & {Médiane (\$)} & {Écart-type (\$)} & {Erreur-type (\$)} \\ 362+Élément & {Sup. (± \%)} & {Âge (± ans)} & {Dates (mois)} & {$n$} & {Moy. (\$)} & {Méd. (\$)} & {É.-t. (\$)} & {E.-t. moy. (\$)} \\
357 \midrule 363 \midrule
358−Garage (critères retenus) & 5.0 & 5 & 12 & 15 & 7991 & 6034 & 64270 & 16594 \\ 364+Garage (retenu) & 5.0 & 5 & 12 & 15 & 7991 & 6034 & 64270 & 16594 \\
359 Garage & 5.0 & 5 & 6 & 9 & 6052 & 6034 & 61147 & 20382 \\ 365 Garage & 5.0 & 5 & 6 & 9 & 6052 & 6034 & 61147 & 20382 \\
360 Garage & 5.0 & 5 & 18 & 23 & 3793 & 2501 & 62246 & 12979 \\ 366 Garage & 5.0 & 5 & 18 & 23 & 3793 & 2501 & 62246 & 12979 \\
361 Garage & 7.5 & 5 & 12 & 23 & 21494 & 44659 & 58908 & 12283 \\ 367 Garage & 7.5 & 5 & 12 & 23 & 21494 & 44659 & 58908 & 12283 \\
362 Garage & 5.0 & 7 & 12 & 22 & -2555 & 11915 & 68210 & 14542 \\ 368 Garage & 5.0 & 7 & 12 & 22 & -2555 & 11915 & 68210 & 14542 \\
363 Garage & 7.5 & 7 & 18 & 45 & 5956 & 10389 & 61611 & 9184 \\ 369 Garage & 7.5 & 7 & 18 & 45 & 5956 & 10389 & 61611 & 9184 \\
364 \addlinespace 370 \addlinespace
365−Sous-sol fini (critères retenus) & 5.0 & 5 & 12 & 14 & 23623 & 30789 & 23402 & 6255 \\ 371+Sous-sol fini (retenu) & 5.0 & 5 & 12 & 14 & 23623 & 30789 & 23402 & 6255 \\
366 Sous-sol fini & 5.0 & 5 & 6 & 6 & 25486 & 30789 & 28063 & 11457 \\ 372 Sous-sol fini & 5.0 & 5 & 6 & 6 & 25486 & 30789 & 28063 & 11457 \\
367 Sous-sol fini & 5.0 & 5 & 18 & 18 & 13784 & 25165 & 34423 & 8114 \\ 373 Sous-sol fini & 5.0 & 5 & 18 & 18 & 13784 & 25165 & 34423 & 8114 \\
368 Sous-sol fini & 7.5 & 5 & 12 & 18 & 7976 & 17903 & 38122 & 8985 \\ 374 Sous-sol fini & 7.5 & 5 & 12 & 18 & 7976 & 17903 & 38122 & 8985 \\
@@ -370,7 +376,7 @@ Sous-sol fini & 5.0 & 7 & 12 & 17 & 37253 & 35153 & 49194 & 11931 \\
370 Sous-sol fini & 7.5 & 7 & 18 & 27 & 16039 & 29331 & 54539 & 10496 \\ 376 Sous-sol fini & 7.5 & 7 & 18 & 27 & 16039 & 29331 & 54539 & 10496 \\
371 \bottomrule 377 \bottomrule
372 \end{tabular} 378 \end{tabular}
373−\tabsource{\synth{analysis/python/cases/ch17\_ajustements.py, fonctions \texttt{paires} et \texttt{variantes\_paires}} ; prix implicites hédoniques : garage \pct{3.30} du prix, soit \dollars{17155} au prix médian des paires (\dollars{520388}) ; sous-sol fini \pct{2.22}, soit \dollars{10394} au prix médian des paires (\dollars{467529}). Les différences sont calculées après alignement des dates par le taux mensuel du modèle.} 379+\tabsource{\synth{analysis/python/cases/ch17\_ajustements.py, fonctions \texttt{paires} et \texttt{variantes\_paires}} ; « retenu » : critères déclarés dans le texte ; É.-t. : écart-type des différences ; E.-t. moy. : erreur-type de la moyenne ; prix implicites hédoniques : garage \pct{3.30} du prix, soit \dollars{17155} au prix médian des paires (\dollars{520388}) ; sous-sol fini \pct{2.22}, soit \dollars{10394} au prix médian des paires (\dollars{467529}). Les différences sont calculées après alignement des dates par le taux mensuel du modèle.}
374 \end{table} 380 \end{table}
375 381
376 \begin{figure}[htbp] 382 \begin{figure}[htbp]
@@ -442,7 +448,7 @@ Par \eqref{eq:17:commutativite}, $P^{\text{aj}}_j = P_j \exp(\hat{\boldsymbol\be
442 448
443 Sur le cas 1, la prédiction ponctuelle est de \dollars{635821} et la correction de Duan, égale à la moyenne de $\exp(\hat e_i)$ sur les 600 ventes, vaut 1,0034, d'où \dollars{637953}. Les résidus des cinq comparables, eux, valent $+0{,}007$, $-0{,}161$, $-0{,}104$, $-0{,}111$ et $-0{,}084$ en logarithme : quatre des cinq se sont vendus nettement moins cher que ce que le modèle prédit pour leurs caractéristiques, et la moyenne de $\exp(\hat e_j) - 1$ sur les cinq est de \pct{-8.5}. La dernière ligne du \cref{tab:17:grille} donne ces résidus, et l'identité \eqref{eq:17:residus} se vérifie au dollar près : $635\,821 \times \exp(0{,}0069) = 640\,247$ pour G0574, $635\,821 \times \exp(-0{,}1611) = 541\,222$ pour G0404. 449 Sur le cas 1, la prédiction ponctuelle est de \dollars{635821} et la correction de Duan, égale à la moyenne de $\exp(\hat e_i)$ sur les 600 ventes, vaut 1,0034, d'où \dollars{637953}. Les résidus des cinq comparables, eux, valent $+0{,}007$, $-0{,}161$, $-0{,}104$, $-0{,}111$ et $-0{,}084$ en logarithme : quatre des cinq se sont vendus nettement moins cher que ce que le modèle prédit pour leurs caractéristiques, et la moyenne de $\exp(\hat e_j) - 1$ sur les cinq est de \pct{-8.5}. La dernière ligne du \cref{tab:17:grille} donne ces résidus, et l'identité \eqref{eq:17:residus} se vérifie au dollar près : $635\,821 \times \exp(0{,}0069) = 640\,247$ pour G0574, $635\,821 \times \exp(-0{,}1611) = 541\,222$ pour G0404.
444 450
445−Deux leçons s'en dégagent. La première est que la méthode de comparaison, même outillée d'une grille hédonique, n'estime pas la même chose que le modèle. Le modèle estime l'espérance conditionnelle de l'\cref{eq:16:esperance} à partir de 600 ventes ; la grille l'estime à partir de cinq, et elle conserve dans chaque prix ajusté le bruit de transaction du comparable. Si les cinq comparables avaient été tirés au hasard parmi les ventes semblables, leurs résidus seraient centrés sur zéro et la moyenne des prix ajustés serait proche de la prédiction. Ils ne l'ont pas été : la sélection du \cref{ch:16} a retenu les ventes les plus proches du sujet par leurs \emph{attributs}, sans regarder les prix, et il se trouve, dans cet échantillon synthétique, que ces ventes-là ont des résidus négatifs. Il n'y a là aucun biais de la procédure, puisque la sélection par attributs est indépendante des résidus en espérance ; il y a la variance d'une moyenne de cinq bruits de \pct{8.3} chacun, soit un écart-type d'environ \pct{3.7}, dont l'écart observé de \pct{8.5} est une réalisation à deux écarts-types. C'est exactement l'arbitrage biais--variance de l'\cref{eq:16:kopt} : peu de comparables très proches, et une estimation bruitée ; beaucoup de comparables régressés, et une estimation précise mais dépendante de la spécification. 451+Deux leçons s'en dégagent. La première est que la méthode de comparaison, même outillée d'une grille hédonique, n'estime pas la même chose que le modèle. Le modèle estime l'espérance conditionnelle du prix définie au \cref{ch:16} à partir de 600 ventes ; la grille l'estime à partir de cinq, et elle conserve dans chaque prix ajusté le bruit de transaction du comparable. Si les cinq comparables avaient été tirés au hasard parmi les ventes semblables, leurs résidus seraient centrés sur zéro et la moyenne des prix ajustés serait proche de la prédiction. Ils ne l'ont pas été : la sélection du \cref{ch:16} a retenu les ventes les plus proches du sujet par leurs \emph{attributs}, sans regarder les prix, et il se trouve, dans cet échantillon synthétique, que ces ventes-là ont des résidus négatifs. Il n'y a là aucun biais de la procédure, puisque la sélection par attributs est indépendante des résidus en espérance ; il y a la variance d'une moyenne de cinq bruits de \pct{8.3} chacun, soit un écart-type d'environ \pct{3.7}, dont l'écart observé de \pct{8.5} est une réalisation à deux écarts-types. C'est exactement l'arbitrage biais--variance du nombre optimal de comparables établi au \cref{ch:16} : peu de comparables très proches, et une estimation bruitée ; beaucoup de comparables régressés, et une estimation précise mais dépendante de la spécification.
446 452
447 La seconde leçon concerne la réconciliation. Lorsque la comparaison et le modèle hédonique divergent de la sorte, l'évaluateur dispose de deux lectures défendables. Ou bien les cinq comparables, vérifiés un à un, révèlent une information que le modèle ignore : un micro-marché local moins cher que le reste du secteur de Hull, une rue moins recherchée, un état des bâtiments inférieur à ce que l'âge et la qualité codée laissent croire ; les résidus négatifs sont alors un signal et l'indication par comparaison est la bonne. Ou bien les comparables se sont simplement vendus à des prix bas par les aléas de la négociation, et le modèle, qui lisse ces aléas sur 600 ventes, est plus près de la valeur. Dans un jeu synthétique, on sait que la seconde lecture est la vraie, puisque le bruit a été généré indépendamment de toute caractéristique ; dans un dossier réel, on ne le sait pas, et c'est l'objet du \cref{ch:20} que de combiner les deux indications en tenant compte de leur incertitude respective, et d'examiner si le bootstrap des comparables et l'élargissement de l'échantillon rapprochent les deux lectures. Le présent chapitre se borne à livrer l'indication par comparaison, \dollars{575565} pondérée, avec son étendue de \pct{17.2} et la connaissance de ce qui la sépare du modèle. 453 La seconde leçon concerne la réconciliation. Lorsque la comparaison et le modèle hédonique divergent de la sorte, l'évaluateur dispose de deux lectures défendables. Ou bien les cinq comparables, vérifiés un à un, révèlent une information que le modèle ignore : un micro-marché local moins cher que le reste du secteur de Hull, une rue moins recherchée, un état des bâtiments inférieur à ce que l'âge et la qualité codée laissent croire ; les résidus négatifs sont alors un signal et l'indication par comparaison est la bonne. Ou bien les comparables se sont simplement vendus à des prix bas par les aléas de la négociation, et le modèle, qui lisse ces aléas sur 600 ventes, est plus près de la valeur. Dans un jeu synthétique, on sait que la seconde lecture est la vraie, puisque le bruit a été généré indépendamment de toute caractéristique ; dans un dossier réel, on ne le sait pas, et c'est l'objet du \cref{ch:20} que de combiner les deux indications en tenant compte de leur incertitude respective, et d'examiner si le bootstrap des comparables et l'élargissement de l'échantillon rapprochent les deux lectures. Le présent chapitre se borne à livrer l'indication par comparaison, \dollars{575565} pondérée, avec son étendue de \pct{17.2} et la connaissance de ce qui la sépare du modèle.
448 454
added references/lib-appB.bib +94 −0
@@ -0,0 +1,94 @@
1+% Nouvelles références de l'annexe B (Formulaires d'inspection) — à fusionner dans library.bib par l'orchestrateur.
2+% Non citées par \parencite dans formulaires-inspection.tex (citées en notes de bas de page avec URL et date de consultation)
3+% afin d'éviter toute citation non définie avant la fusion. Voir verification/chapters/appB-registry.csv.
4+
5+@online{santecanadaradon2025,
6+ author = {{Santé Canada}},
7+ title = {Lignes directrices sur le radon},
8+ year = {2025},
9+ url = {https://www.canada.ca/fr/sante-canada/services/securite-et-risque-pour-sante/radiation/radon/lignes-directrices-gouvernement-canada.html},
10+ urldate = {2026-10-31},
11+ note = {Page modifiée le 15 octobre 2025 ; ligne directrice de 200~Bq/m\textsuperscript{3} (moyenne annuelle) ; mesures correctives recommandées dans l'année}
12+}
13+
14+@online{santecanadavermiculite2004,
15+ author = {{Santé Canada}},
16+ title = {Santé Canada avise les Canadiens que l'isolant de vermiculite peut contenir de l'amiante et peut être nocif},
17+ year = {2004},
18+ url = {https://www.canada.ca/fr/nouvelles/archive/2004/04/sante-canada-avise-canadiens-isolant-vermiculite-peut-contenir-amiante-peut-etre-nocif.html},
19+ urldate = {2026-10-31},
20+ note = {Avis du 3 avril 2004 ; vérification partielle (extrait)}
21+}
22+
23+@online{rncanemprisonnons3,
24+ author = {{Ressources naturelles Canada}},
25+ title = {Emprisonnons la chaleur --- Section 3 : Les matériaux : l'ajout d'isolant thermique, de coupe-bise et de produits de calfeutrage},
26+ year = {2025},
27+ url = {https://ressources-naturelles.canada.ca/efficacite-energetique/efficacite-energetique-maison/emprisonnons-chaleur-section-3},
28+ urldate = {2026-10-31},
29+ note = {Page modifiée le 31 janvier 2025 ; MIUF interdite au Canada depuis 1980 ; amiante interdit dans les produits de consommation depuis 2018}
30+}
31+
32+@online{acqcpyrite,
33+ author = {{Association des consommateurs pour la qualité dans la construction}},
34+ title = {La pyrite},
35+ year = {2026},
36+ url = {https://www.acqc.ca/fr/info/pyrite},
37+ urldate = {2026-10-31},
38+ note = {Page sans date de mise à jour ; mécanisme, signes, délais, normes CTQ-M100 et CTQ-M200, remblai certifié DB, programme SHQ 2001-2011}
39+}
40+
41+@manual{bnq2560500,
42+ author = {{Bureau de normalisation du Québec}},
43+ title = {BNQ 2560-500/2022 --- Indice pétrographique du potentiel de gonflement sulfatique (IPPG) des matériaux granulaires : méthode d'essai},
44+ organization = {Bureau de normalisation du Québec},
45+ year = {2022},
46+ url = {https://bnq.qc.ca/images/pdf/Sommaire_SOD/SOD_2560-500_FR_2022.pdf},
47+ urldate = {2026-10-31},
48+ note = {Sommaire public consulté ; norme protégée, non reproduite}
49+}
50+
51+@online{rbqocre,
52+ author = {{Régie du bâtiment du Québec}},
53+ title = {Dépôt d'ocre},
54+ year = {2026},
55+ url = {https://www.rbq.gouv.qc.ca/vous-etes/citoyen/problemes-avec-votre-residence/depot-docre},
56+ urldate = {2026-10-31},
57+ note = {Signes, origine chimique et biologique, conséquences et solutions ; page sans date de mise à jour}
58+}
59+
60+@online{acqcocre,
61+ author = {{Association des consommateurs pour la qualité dans la construction}},
62+ title = {Ocre ferreuse},
63+ year = {2026},
64+ url = {https://acqc.ca/fr/ocre-ferreuse},
65+ urldate = {2026-10-31},
66+ note = {Norme BNQ 3661-500 publiée en février 2012 ; vérification partielle (extrait)}
67+}
68+
69+@online{shqpyrrhotite2026,
70+ author = {{Société d'habitation du Québec}},
71+ title = {Programme pour les résidences endommagées par la pyrrhotite},
72+ year = {2026},
73+ url = {https://www.quebec.ca/habitation-territoire/construction-renovation/renovation-residentielle/programme-residences-endommagees-pyrrhotite},
74+ urldate = {2026-10-31},
75+ note = {Page mise à jour le 8 octobre 2026 ; programme mis en œuvre en 2011, terminé le 30 septembre 2026 ; volet I : taux minimal de 0,23~\% de pyrrhotite}
76+}
77+
78+@online{qcmazout2026,
79+ author = {{Gouvernement du Québec}},
80+ title = {Chauffage au mazout résidentiel},
81+ year = {2026},
82+ url = {https://www.quebec.ca/habitation-territoire/chauffage-consommation-energie/chauffage-mazout},
83+ urldate = {2026-10-31},
84+ note = {Dernière mise à jour : 8 juin 2026 ; résumé du Règlement sur les appareils de chauffage au mazout (texte réglementaire non relu)}
85+}
86+
87+@online{qcmazoutcommunique2021,
88+ author = {{Gouvernement du Québec}},
89+ title = {Québec adopte un règlement afin d'éliminer le recours au mazout pour le chauffage résidentiel},
90+ year = {2021},
91+ url = {https://www.quebec.ca/nouvelles/actualites/details/quebec-adopte-un-reglement-afin-deliminer-le-recours-au-mazout-pour-le-chauffage-residentiel-36186},
92+ urldate = {2026-10-31},
93+ note = {Interdictions à compter du 31 décembre 2021 (neuf) et du 31 décembre 2023 (remplacements dans l'existant)}
94+}
modified references/library.bib +91 −0
@@ -4442,6 +4442,97 @@
4442 note = {Frais de gestion : forfait de 5~\%, frais réels admissibles jusqu'à 10~\% des revenus annuels de l'immeuble} 4442 note = {Frais de gestion : forfait de 5~\%, frais réels admissibles jusqu'à 10~\% des revenus annuels de l'immeuble}
4443 } 4443 }
4444 4444
4445+@online{santecanadaradon2025,
4446+ author = {{Santé Canada}},
4447+ title = {Lignes directrices sur le radon},
4448+ year = {2025},
4449+ url = {https://www.canada.ca/fr/sante-canada/services/securite-et-risque-pour-sante/radiation/radon/lignes-directrices-gouvernement-canada.html},
4450+ urldate = {2026-10-31},
4451+ note = {Page modifiée le 15 octobre 2025 ; ligne directrice de 200~Bq/m\textsuperscript{3} (moyenne annuelle) ; mesures correctives recommandées dans l'année}
4452+}
4453+
4454+@online{santecanadavermiculite2004,
4455+ author = {{Santé Canada}},
4456+ title = {Santé Canada avise les Canadiens que l'isolant de vermiculite peut contenir de l'amiante et peut être nocif},
4457+ year = {2004},
4458+ url = {https://www.canada.ca/fr/nouvelles/archive/2004/04/sante-canada-avise-canadiens-isolant-vermiculite-peut-contenir-amiante-peut-etre-nocif.html},
4459+ urldate = {2026-10-31},
4460+ note = {Avis du 3 avril 2004 ; vérification partielle (extrait)}
4461+}
4462+
4463+@online{rncanemprisonnons3,
4464+ author = {{Ressources naturelles Canada}},
4465+ title = {Emprisonnons la chaleur --- Section 3 : Les matériaux : l'ajout d'isolant thermique, de coupe-bise et de produits de calfeutrage},
4466+ year = {2025},
4467+ url = {https://ressources-naturelles.canada.ca/efficacite-energetique/efficacite-energetique-maison/emprisonnons-chaleur-section-3},
4468+ urldate = {2026-10-31},
4469+ note = {Page modifiée le 31 janvier 2025 ; MIUF interdite au Canada depuis 1980 ; amiante interdit dans les produits de consommation depuis 2018}
4470+}
4471+
4472+@online{acqcpyrite,
4473+ author = {{Association des consommateurs pour la qualité dans la construction}},
4474+ title = {La pyrite},
4475+ year = {2026},
4476+ url = {https://www.acqc.ca/fr/info/pyrite},
4477+ urldate = {2026-10-31},
4478+ note = {Page sans date de mise à jour ; mécanisme, signes, délais, normes CTQ-M100 et CTQ-M200, remblai certifié DB, programme SHQ 2001-2011}
4479+}
4480+
4481+@manual{bnq2560500,
4482+ author = {{Bureau de normalisation du Québec}},
4483+ title = {BNQ 2560-500/2022 --- Indice pétrographique du potentiel de gonflement sulfatique (IPPG) des matériaux granulaires : méthode d'essai},
4484+ organization = {Bureau de normalisation du Québec},
4485+ year = {2022},
4486+ url = {https://bnq.qc.ca/images/pdf/Sommaire_SOD/SOD_2560-500_FR_2022.pdf},
4487+ urldate = {2026-10-31},
4488+ note = {Sommaire public consulté ; norme protégée, non reproduite}
4489+}
4490+
4491+@online{rbqocre,
4492+ author = {{Régie du bâtiment du Québec}},
4493+ title = {Dépôt d'ocre},
4494+ year = {2026},
4495+ url = {https://www.rbq.gouv.qc.ca/vous-etes/citoyen/problemes-avec-votre-residence/depot-docre},
4496+ urldate = {2026-10-31},
4497+ note = {Signes, origine chimique et biologique, conséquences et solutions ; page sans date de mise à jour}
4498+}
4499+
4500+@online{acqcocre,
4501+ author = {{Association des consommateurs pour la qualité dans la construction}},
4502+ title = {Ocre ferreuse},
4503+ year = {2026},
4504+ url = {https://acqc.ca/fr/ocre-ferreuse},
4505+ urldate = {2026-10-31},
4506+ note = {Norme BNQ 3661-500 publiée en février 2012 ; vérification partielle (extrait)}
4507+}
4508+
4509+@online{shqpyrrhotite2026,
4510+ author = {{Société d'habitation du Québec}},
4511+ title = {Programme pour les résidences endommagées par la pyrrhotite},
4512+ year = {2026},
4513+ url = {https://www.quebec.ca/habitation-territoire/construction-renovation/renovation-residentielle/programme-residences-endommagees-pyrrhotite},
4514+ urldate = {2026-10-31},
4515+ note = {Page mise à jour le 8 octobre 2026 ; programme mis en œuvre en 2011, terminé le 30 septembre 2026 ; volet I : taux minimal de 0,23~\% de pyrrhotite}
4516+}
4517+
4518+@online{qcmazout2026,
4519+ author = {{Gouvernement du Québec}},
4520+ title = {Chauffage au mazout résidentiel},
4521+ year = {2026},
4522+ url = {https://www.quebec.ca/habitation-territoire/chauffage-consommation-energie/chauffage-mazout},
4523+ urldate = {2026-10-31},
4524+ note = {Dernière mise à jour : 8 juin 2026 ; résumé du Règlement sur les appareils de chauffage au mazout (texte réglementaire non relu)}
4525+}
4526+
4527+@online{qcmazoutcommunique2021,
4528+ author = {{Gouvernement du Québec}},
4529+ title = {Québec adopte un règlement afin d'éliminer le recours au mazout pour le chauffage résidentiel},
4530+ year = {2021},
4531+ url = {https://www.quebec.ca/nouvelles/actualites/details/quebec-adopte-un-reglement-afin-deliminer-le-recours-au-mazout-pour-le-chauffage-residentiel-36186},
4532+ urldate = {2026-10-31},
4533+ note = {Interdictions à compter du 31 décembre 2021 (neuf) et du 31 décembre 2023 (remplacements dans l'existant)}
4534+}
4535+
4445 @online{patterson2024demenagement, 4536 @online{patterson2024demenagement,
4446 author = {Patterson, Jessica}, 4537 author = {Patterson, Jessica},
4447 title = {Jour du déménagement au Québec}, 4538 title = {Jour du déménagement au Québec},
modified solutions/ch17.tex +1 −1
@@ -22,7 +22,7 @@ Forme multiplicative, \cref{eq:17:multiplicatif} : $500\,000 \times 1{,}06 \time
22 \end{solution} 22 \end{solution}
23 23
24 \begin{solution}{ex:17:6}{Pondération inverse du brut et réconciliation} 24 \begin{solution}{ex:17:6}{Pondération inverse du brut et réconciliation}
25−Prix ajustés : A, $600\,000 + 30\,000 - 60\,000 = \dollars{570000}$ ; B, $520\,000 + 26\,000 + 13\,000 = \dollars{559000}$ ; C, $575\,000 - 23\,000 + 46\,000 + 23\,000 = \dollars{621000}$. Ajustements bruts : $90\,000/600\,000 = \pct{15.0}$, $39\,000/520\,000 = \pct{7.5}$, $92\,000/575\,000 = \pct{16.0}$ ; nets : \pct{-5.0}, \pct{+7.5}, \pct{+8.0}. Les inverses des bruts sont $6{,}667$, $13{,}333$ et $6{,}25$, de somme $26{,}25$, d'où les poids $w_A = 0{,}254$, $w_B = 0{,}508$ et $w_C = 0{,}238$ (\cref{eq:17:poids} ; le plancher de \pct{1} n'intervient pas). La valeur pondérée est $0{,}254 \times 570\,000 + 0{,}508 \times 559\,000 + 0{,}238 \times 621\,000 = \dollars{576556}$, contre une moyenne simple de \dollars{583333} et une médiane de \dollars{570000} ; la fonction \texttt{reconciliation} donne aussi un écart-type pondéré de \dollars{25254} et une étendue de \pct{10.8} de la valeur pondérée. A et C reçoivent des poids voisins parce que la règle ne regarde que le brut, c'est-à-dire la somme des valeurs absolues : que les ajustements de A se compensent (net $-5$ \%) et que ceux de C s'additionnent (net $+8$ \%) ne change pas leur éloignement total, donc pas la variance que le brut est censé approximer. La règle est critiquable lorsque le comparable le moins ajusté, B, est aussi la vente la plus ancienne : son faible brut tient alors à ce que l'ajustement de temps, bien que grand en incertitude (choix de l'indice, \cref{tab:17:sensibilite}), est petit en montant si le marché a peu bougé, ou à ce qu'il est compté comme un seul élément alors qu'il contamine tous les autres. Dans ce cas, l'évaluateur devrait soit majorer le brut de B d'une pénalité d'ancienneté, soit revenir à la pondération par la variance de la \cref{prop:indication} en attribuant à l'ajustement de temps une variance propre. 25+Prix ajustés : A, $600\,000 + 30\,000 - 60\,000 = \dollars{570000}$ ; B, $520\,000 + 26\,000 + 13\,000 = \dollars{559000}$ ; C, $575\,000 - 23\,000 + 46\,000 + 23\,000 = \dollars{621000}$. Ajustements bruts : $90\,000/600\,000 = \pct{15.0}$, $39\,000/520\,000 = \pct{7.5}$, $92\,000/575\,000 = \pct{16.0}$ ; nets : \pct{-5.0}, \pct{+7.5}, \pct{+8.0}. Les inverses des bruts sont $6{,}667$, $13{,}333$ et $6{,}25$, de somme $26{,}25$, d'où les poids $w_A = 0{,}254$, $w_B = 0{,}508$ et $w_C = 0{,}238$ (\cref{eq:17:poids} ; le plancher de \pct{1} n'intervient pas). La valeur pondérée est $0{,}254 \times 570\,000 + 0{,}508 \times 559\,000 + 0{,}238 \times 621\,000 = \dollars{576556}$, contre une moyenne simple de \dollars{583333} et une médiane de \dollars{570000} ; la fonction \texttt{reconciliation} donne aussi un écart-type pondéré de \dollars{25254} et une étendue de \pct{10.8} de la valeur pondérée. A et C reçoivent des poids voisins parce que la règle ne regarde que le brut, c'est-à-dire la somme des valeurs absolues : que les ajustements de A se compensent (net $-5$ \%) et que ceux de C s'additionnent (net $+8$ \%) ne change pas leur éloignement total, donc pas la variance que le brut est censé approximer. La règle est critiquable lorsque le comparable le moins ajusté, B, est aussi la vente la plus ancienne : son faible brut tient alors à ce que l'ajustement de temps, bien que grand en incertitude (choix de l'indice, \cref{tab:17:sensibilite}), est petit en montant si le marché a peu bougé, ou à ce qu'il est compté comme un seul élément alors qu'il contamine tous les autres. Dans ce cas, l'évaluateur devrait soit majorer le brut de B d'une pénalité d'ancienneté, soit revenir à la pondération par la variance (proposition du \cref{ch:16}) en attribuant à l'ajustement de temps une variance propre.
26 \end{solution} 26 \end{solution}
27 27
28 \begin{solution}{ex:17:7}{Remplacer les prix implicites par les paires} 28 \begin{solution}{ex:17:7}{Remplacer les prix implicites par les paires}
modified sources/registry.csv +5 −0
@@ -311,5 +311,10 @@ SRC-A-CCQ,loi,"Code civil du Québec, RLRQ c. CCQ-1991 — art. 1457, 2098-2100,
311 SRC-CH17-001,article,Smearing Estimate: A Nonparametric Retransformation Method (Duan),Journal of the American Statistical Association,1983 vol. 78 no 383 p. 605-610,https://doi.org/10.1080/01621459.1983.10478017,2026-10-31,verifie,ch17,Crossref ; references/lib-ch17.bib (duan1983) ; non cité par clé 311 SRC-CH17-001,article,Smearing Estimate: A Nonparametric Retransformation Method (Duan),Journal of the American Statistical Association,1983 vol. 78 no 383 p. 605-610,https://doi.org/10.1080/01621459.1983.10478017,2026-10-31,verifie,ch17,Crossref ; references/lib-ch17.bib (duan1983) ; non cité par clé
312 SRC-CH17-002,article,The Interpretation of Dummy Variables in Semilogarithmic Equations (Giles),Economics Letters,1982 vol. 10 no 1-2 p. 77-79,https://doi.org/10.1016/0165-1765(82)90119-7,2026-10-31,verifie,ch17,Crossref ; references/lib-ch17.bib (giles1982) ; non cité par clé 312 SRC-CH17-002,article,The Interpretation of Dummy Variables in Semilogarithmic Equations (Giles),Economics Letters,1982 vol. 10 no 1-2 p. 77-79,https://doi.org/10.1016/0165-1765(82)90119-7,2026-10-31,verifie,ch17,Crossref ; references/lib-ch17.bib (giles1982) ; non cité par clé
313 SRC-CH17-003,article,Exact Interpretation of Dummy Variables in Semilogarithmic Equations (van Garderen & Shah),The Econometrics Journal,2002 vol. 5 no 1 p. 149-159,https://doi.org/10.1111/1368-423X.00078,2026-10-31,verifie,ch17,Crossref ; references/lib-ch17.bib (vanGarderenShah2002) ; non cité par clé 313 SRC-CH17-003,article,Exact Interpretation of Dummy Variables in Semilogarithmic Equations (van Garderen & Shah),The Econometrics Journal,2002 vol. 5 no 1 p. 149-159,https://doi.org/10.1111/1368-423X.00078,2026-10-31,verifie,ch17,Crossref ; references/lib-ch17.bib (vanGarderenShah2002) ; non cité par clé
314+SRC-18-001,article,"Smearing Estimate: A Nonparametric Retransformation Method (Duan, N.)",Journal of the American Statistical Association 78(383) 605-610,1983,https://doi.org/10.1080/01621459.1983.10478017,2026-10-31,verifie,18,Vérifié via api.crossref.org ; clé duan1983 (lib-ch18.bib)
315+SRC-18-002,article,"A Heteroskedasticity-Consistent Covariance Matrix Estimator and a Direct Test for Heteroskedasticity (White, H.)",Econometrica 48(4) 817-838,1980,https://doi.org/10.2307/1912934,2026-10-31,verifie,18,Vérifié via api.crossref.org ; clé white1980
316+SRC-18-003,article,"A Simple Test for Heteroscedasticity and Random Coefficient Variation (Breusch, T. S. ; Pagan, A. R.)",Econometrica 47(5) 1287-1294,1979,https://doi.org/10.2307/1911963,2026-10-31,verifie,18,Vérifié via api.crossref.org ; clé breuschPagan1979
317+SRC-18-004,article,"Detection of Influential Observation in Linear Regression (Cook, R. D.)",Technometrics 19(1) 15-18,1977,https://doi.org/10.1080/00401706.1977.10489493,2026-10-31,verifie,18,Vérifié via api.crossref.org ; clé cook1977
318+SRC-18-005,livre,"Regression Diagnostics: Identifying Influential Data and Sources of Collinearity (Belsley, Kuh, Welsch)",John Wiley & Sons,1980 (DOI de la réimpression Wiley 2005),https://doi.org/10.1002/0471725153,2026-10-31,partiellement_verifie,18,Notice Wiley non ouverte à la page ; clé belsleyKuhWelsch1980
314 SRC-21-001,guide,RC4028 — Remboursement de la TPS/TVH pour habitations neuves,Agence du revenu du Canada,Rév. 10/2026,https://www.canada.ca/fr/agence-revenu/services/formulaires-publications/publications/rc4028/remboursement-tps-tvh-habitations-neuves.html,2026-10-31,partiellement_verifie,21,"Lu par agent web-fetch le 2026-10-31 : seuil 450 000 $ (maison construite par le propriétaire) verbatim ; remboursement premiers acheteurs (travaux dès le 20 mars 2025, 1 M$ / 1,5 M$) verbatim ; 36 % / 6 300 $ / 350 000 $ non vérifiés mot à mot. Pages Revenu Québec (TVQ) HTTP 403." 319 SRC-21-001,guide,RC4028 — Remboursement de la TPS/TVH pour habitations neuves,Agence du revenu du Canada,Rév. 10/2026,https://www.canada.ca/fr/agence-revenu/services/formulaires-publications/publications/rc4028/remboursement-tps-tvh-habitations-neuves.html,2026-10-31,partiellement_verifie,21,"Lu par agent web-fetch le 2026-10-31 : seuil 450 000 $ (maison construite par le propriétaire) verbatim ; remboursement premiers acheteurs (travaux dès le 20 mars 2025, 1 M$ / 1,5 M$) verbatim ; 36 % / 6 300 $ / 350 000 $ non vérifiés mot à mot. Pages Revenu Québec (TVQ) HTTP 403."
315 # Aucune nouvelle source : le chapitre 47 ne cite que des clés déjà présentes dans references/library.bib (voir ch47.md).,,,,,,,,, 320 # Aucune nouvelle source : le chapitre 47 ne cite que des clés déjà présentes dans references/library.bib (voir ch47.md).,,,,,,,,,
modified verification/calculations.csv +18 −0
@@ -234,3 +234,21 @@ CALC-17-10,17,Poids inverse du brut et réconciliation,analysis/python/cases/ch1
234 CALC-17-11,17,Analyse relative et encadrement,analysis/python/cases/ch17_ajustements.py,analysis/python/tests/test_ch17.py::test_analyse_qualitative,4 inférieurs + G0468 supérieur ; encadrement [598000 ; 624500],idem,verifie,2026-10-31 234 CALC-17-11,17,Analyse relative et encadrement,analysis/python/cases/ch17_ajustements.py,analysis/python/tests/test_ch17.py::test_analyse_qualitative,4 inférieurs + G0468 supérieur ; encadrement [598000 ; 624500],idem,verifie,2026-10-31
235 CALC-17-12,17,Sensibilité de la valeur pondérée (coefficients ±1,96 ET ; taux 3–6 % ; omissions),analysis/python/cases/ch17_ajustements.py,analysis/python/tests/test_ch17.py::test_sensibilite,omission temps 545208 ; omission qualité 597252 ; taux 3–6 % étendue 16734 ; superficie étendue < 1000 ; max étendue 30357,idem,verifie 235 CALC-17-12,17,Sensibilité de la valeur pondérée (coefficients ±1,96 ET ; taux 3–6 % ; omissions),analysis/python/cases/ch17_ajustements.py,analysis/python/tests/test_ch17.py::test_sensibilite,omission temps 545208 ; omission qualité 597252 ; taux 3–6 % étendue 16734 ; superficie étendue < 1000 ; max étendue 30357,idem,verifie
236 CALC-17-13,17,Solutions des exercices 17.1 à 17.7,analysis/python/cases/ch17_ajustements.py,analysis/python/tests/test_ch17.py::test_solutions_exercices,"17.1 551500 ; 17.2 28587/28954/28039 ; 17.3 15083/15250/11151/4552 ; 17.4 4,60/4,58 et −22,12/−22,37 ; 17.5 523640/525000/524700 ; 17.6 poids 0,254/0,508/0,238 valeur 576556 ; 17.7 moyenne 579001 pondérée 573963",idem,verifie,2026-10-31 236 CALC-17-13,17,Solutions des exercices 17.1 à 17.7,analysis/python/cases/ch17_ajustements.py,analysis/python/tests/test_ch17.py::test_solutions_exercices,"17.1 551500 ; 17.2 28587/28954/28039 ; 17.3 15083/15250/11151/4552 ; 17.4 4,60/4,58 et −22,12/−22,37 ; 17.5 523640/525000/524700 ; 17.6 poids 0,254/0,508/0,238 valeur 576556 ; 17.7 moyenne 579001 pondérée 573963",idem,verifie,2026-10-31
237+CALC-18-01,18,"Modèle de référence (traite.cas1.hedonique) : n, k, R², R² ajusté, σ",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_modele_reference_retrouve_les_lois,"600 ; 16 ; 0,853 ; 0,849 ; 0,083","600 ; 16 ; 0,8530 ; 0,8492 ; 0,0830",verifie,2026-10-31
238+CALC-18-02,18,Coefficients clés et couverture des paramètres de génération (IC 95 %),analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_modele_reference_retrouve_les_lois,"ln_S 0,5391 (0,0127) ; ln_T 0,0937 ; qualité 0,0611 ; garage 0,0324 ; Buckingham −0,2504 (0,0718) ; const 13,2074 → 544 400 $ ; 15/15 couverts",idem,verifie,2026-10-31
239+CALC-18-03,18,Croissance mensuelle et annuelle implicites vs croissance de génération,analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_modele_reference_retrouve_les_lois,"0,364 %/mois ; 4,46 %/an ; vraie 4,43 %",idem,verifie,2026-10-31
240+CALC-18-04,18,"Diagnostics : Breusch–Pagan (Koenker), Jarque–Bera, asymétrie, aplatissement, étendue des résidus",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_diagnostics,"LM 16,09 ddl 15 p 0,38 ; JB 2,11 p 0,35 ; −0,07 ; 2,75 ; [−0,238 ; 0,224] ; 7,0 % > 0,15",idem,verifie,2026-10-31
241+CALC-18-05,18,"VIF (âge 11,85 ; distance 43,7 ; Buckingham 30,3 ; Masson-Angers 28,0 ; Aylmer 8,0 ; Gatineau 4,15 ; physiques < 2)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_diagnostics,voir description,idem,verifie,2026-10-31
242+CALC-18-06,18,"Distances de Cook (seuil 4/n = 0,0067 ; 29 au-dessus ; max 0,022 G0541) et I de Moran des résidus (8 voisins)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_diagnostics,"29 ; 0,022 ; G0541 ; I −0,013 z −0,59 p 0,56",idem,verifie,2026-10-31
243+CALC-18-07,18,"Six variantes : R², EQM $, COD, prédiction du sujet (semi-log 637 953 ; linéaire 615 985 ; log-log 627 260 ; Box–Cox 635 171 ; sans secteurs 664 342 ; trimestrielles 649 980)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_variantes,voir tab:18:variantes,idem,verifie,2026-10-31
244+CALC-18-08,18,"Box–Cox : λ̂ 0,157 ; IC 95 % [−0,036 ; 0,353] ; RV vs λ=0 : 2,5 ; vs λ=1 : 66",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_variantes,"0,157 ; [−0,036 ; 0,353] ; 2,5 ; 66",idem,verifie,2026-10-31
245+CALC-18-09,18,"Omission des secteurs : distance −0,0036 → −0,0117 ; terrain 0,0937 → 0,0419 ; σ 0,083 → 0,104 ; sujet +4,1 %",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_variantes,voir description,idem,verifie,2026-10-31
246+CALC-18-10,18,Prix implicites au sujet (2 084 $/m² ; 96 $/m² terrain ; −2 308 $/an ; 2 319 $/mois ; qualité 40 182 ; garage 21 031 ; sous-sol 14 183 ; piscine 17 023 ; étages 19 502 ; Aylmer 56 886 ; Gatineau −14 070) et corrections de Kennedy,analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_prix_implicites,voir tab:18:prix-implicites,idem,verifie,2026-10-31
247+CALC-18-11,18,"Prédiction du sujet : ln 13,3627 ; naïve 635 821 ; Duan ×1,00335 = 637 953 ; log-normale 638 016 ; x'Vx 0,000105 (1,5 %) ; s_p 0,0836 ; IC 95 % [539 682 ; 749 087] ; IC 80 % [571 192 ; 707 764]",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_prediction_et_intervalle,voir description,idem,verifie,2026-10-31
248+CALC-18-12,18,"Prédiction au 2024-07-01 (580 375 $) et ratio rôle fictif du sujet 468 000 / 580 375 = 0,81",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_prediction_et_intervalle,"580 375 ; 0,806",idem,verifie,2026-10-31
249+CALC-18-13,18,"Statistiques de ratio du modèle : in-sample COD 6,68 PRD 1,007 PRB −0,058 médiane 0,997 ; validation croisée 10 plis COD 6,83 RMSE 40 888 erreur abs. médiane 5,67 %",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_ratios_et_validation_croisee,voir tab:18:ratios,idem,verifie,2026-10-31
250+CALC-18-14,18,"Rôle fictif vs prix ramenés au 2024-07-01 : médiane 0,925 COD 6,12 PRD 0,999 PRB 0,064 ; sans rajustement : 0,914 / 6,90",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_ratios_et_validation_croisee,voir description,idem,verifie,2026-10-31
251+CALC-18-15,18,"Indice trimestriel (15 trimestres, 2026T3 = 122,0 vs tendance 116,5 ; 22 ventes ; IC +3,6 %) ; écart abs moyen 2,57 % max 5,03 %",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_indice_et_sensibilite,voir fig:18:indice,idem,verifie,2026-10-31
252+CALC-18-16,18,"Sensibilité à l'échantillon : Hull 186 → 625 967 ; 18 mois 236 → 640 098 ; étages 330 → 629 272 ; sans Cook 571 → 636 872 ; 110-230 m² 495 → 635 048 ; étendue 2,2 %",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_indice_et_sensibilite,voir tab:18:sensibilite,idem,verifie,2026-10-31
253+CALC-18-17,18,"Résidus des cinq comparables du ch. 16 (G0574 +0,007 ; G0404 −0,161 ; G0468 −0,104 ; G0477 −0,111 ; G0575 −0,084 ; moyenne −8,7 %)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_residus_des_comparables,voir description,idem,verifie,2026-10-31
254+CALC-18-18,18,Solutions des exercices 18.1 à 18.8 (chiffres des solutions/ch18.tex),analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_solutions_exercices,voir solutions/ch18.tex,idem,verifie,2026-10-31
added verification/chapters/appB-registry.csv +11 −0
@@ -0,0 +1,11 @@
1+id,type,titre,organisme,version_ou_date,url,date_consultation,statut,utilise_dans,notes
2+SRC-APPB-001,page_web,Lignes directrices sur le radon,Santé Canada (Canada.ca),Page modifiée le 2025-10-15,https://www.canada.ca/fr/sante-canada/services/securite-et-risque-pour-sante/radiation/radon/lignes-directrices-gouvernement-canada.html,2026-10-31,verifie,appB,"Ligne directrice 200 Bq/m3 (moyenne annuelle, aires normalement occupées) ; mesures correctives recommandées dans l'année ; pas de durée de test précisée sur la page"
3+SRC-APPB-002,communique,Santé Canada avise les Canadiens que l'isolant de vermiculite peut contenir de l'amiante et peut être nocif,Santé Canada (archives Canada.ca),2004-04-03,https://www.canada.ca/fr/nouvelles/archive/2004/04/sante-canada-avise-canadiens-isolant-vermiculite-peut-contenir-amiante-peut-etre-nocif.html,2026-10-31,partiellement_verifie,appB,"Extrait de recherche lu (titre, date, première phrase) ; page non ouverte intégralement"
4+SRC-APPB-003,guide,"Emprisonnons la chaleur — Section 3 : Les matériaux (produits interdits et réglementés)",Ressources naturelles Canada,Page modifiée le 2025-01-31,https://ressources-naturelles.canada.ca/efficacite-energetique/efficacite-energetique-maison/emprisonnons-chaleur-section-3,2026-10-31,verifie,appB,"MIUF injectée sur place interdite au Canada depuis 1980 ; produits de consommation contenant de l'amiante interdits depuis 2018 ; vermiculite : renvoi à un avertissement de sécurité (partie 1.4 non lue)"
5+SRC-APPB-004,page_web,La pyrite,Association des consommateurs pour la qualité dans la construction (ACQC),Sans date de mise à jour affichée,https://www.acqc.ca/fr/info/pyrite,2026-10-31,verifie,appB,"Mécanisme, signes (dalle du garage d'abord, fissures en étoile, poudre blanche), délais 10-25+ ans, CTQ-M100/M200, remblai DB, programme SHQ 2001-2011 (fin 26 oct. 2011) ; source d'association, non gouvernementale"
6+SRC-APPB-005,norme,BNQ 2560-500/2022 — Indice pétrographique du potentiel de gonflement sulfatique (IPPG) : méthode d'essai (sommaire),Bureau de normalisation du Québec,2022,https://bnq.qc.ca/images/pdf/Sommaire_SOD/SOD_2560-500_FR_2022.pdf,2026-10-31,partiellement_verifie,appB,"Sommaire public seulement (norme protégée, non reproduite) ; BNQ 2560-510/2022 (remblais) également listée"
7+SRC-APPB-006,page_web,Dépôt d'ocre,Régie du bâtiment du Québec,Sans date de mise à jour (date d'impression 2026-10-30),https://www.rbq.gouv.qc.ca/vous-etes/citoyen/problemes-avec-votre-residence/depot-docre,2026-10-31,verifie,appB,"Signes, origine chimique/biologique, conséquences, solutions avant/après construction ; ne mentionne pas la norme BNQ"
8+SRC-APPB-007,page_web,Ocre ferreuse,ACQC,Sans date,https://acqc.ca/fr/ocre-ferreuse,2026-10-31,partiellement_verifie,appB,"Extrait de recherche : norme BNQ 3661-500 publiée en février 2012 ; page non ouverte intégralement"
9+SRC-APPB-008,programme,Programme pour les résidences endommagées par la pyrrhotite (+ volet I ; normes du programme SHQ),Société d'habitation du Québec / Québec.ca,Page mise à jour le 2026-10-08 ; programme terminé le 2026-09-30,https://www.quebec.ca/habitation-territoire/construction-renovation/renovation-residentielle/programme-residences-endommagees-pyrrhotite,2026-10-31,verifie,appB,"Programme mis en œuvre en 2011 ; volet I : taux minimal de 0,23 % de pyrrhotite ; normes : https://cdn-contenu.quebec.ca/cdn-contenu/adm/org/shq/Documents/SHQ/acces/prise-de-decision/normes-programme-pyrrhotite.pdf"
10+SRC-APPB-009,page_web,Chauffage au mazout résidentiel,Gouvernement du Québec (Québec.ca),Dernière mise à jour : 8 juin 2026,https://www.quebec.ca/habitation-territoire/chauffage-consommation-energie/chauffage-mazout,2026-10-31,verifie,appB,"Règlement sur les appareils de chauffage au mazout : interdictions (neuf ; remplacement par combustible fossile dans l'existant ≤ 600 m2 et ≤ 3 étages), entretien < 20 ans (chauffe-eau < 10 ans), déclaration des travaux et du retrait du réservoir ; texte réglementaire non relu"
11+SRC-APPB-010,communique,Québec adopte un règlement afin d'éliminer le recours au mazout pour le chauffage résidentiel,Cabinet du ministre de l'Environnement (Québec.ca),2021,https://www.quebec.ca/nouvelles/actualites/details/quebec-adopte-un-reglement-afin-deliminer-le-recours-au-mazout-pour-le-chauffage-residentiel-36186,2026-10-31,verifie,appB,"Interdictions à compter du 31 déc. 2021 (neuf) et du 31 déc. 2023 (remplacement dans l'existant) ; réparation interdite des appareils de plus de 20 ans et chauffe-eau de plus de 10 ans"
added verification/chapters/appC-claims.csv +16 −0
@@ -0,0 +1,16 @@
1+id,chapitre,affirmation,source_id,verification,date,statut,notes
2+CLM-APPC-01,appC,Trois formes de rapport écrit (narratif complet ; abrégé ; mise à jour) avec le même contenu minimal ; verbes décrire / résumer / mentionner (règles 2.2-2.3 et annexe B des NPP),SRC-C-001,NPP (notes-C §2.1) ; cohérent avec ch. 10 tab. 10.3,2026-10-31,verifie,paraphrase ; annexe B non reproduite
3+CLM-APPC-02,appC,Douze éléments du contenu minimal du rapport écrit (règle 2.3) : identification ; droits ; but et fin ; définition ; date ; étendue ; réserves et hypothèses ; traitement et raisonnement ; usage le meilleur ; rejet d'une méthode ; conformité ; attestation,SRC-C-001,NPP (notes-C §2.1),2026-10-31,verifie,liste paraphrasée ; correspondance sections-éléments = interprétation de l'auteur (déclarée)
4+CLM-APPC-03,appC,Code de déontologie : art. 34 signer et indiquer sa qualité ; art. 41 méthodologie et étendue des recherches ; art. 32 pas d'exclusion de responsabilité ; art. 24.1 honoraires conditionnels interdits ; art. 33 supervision du travail délégué,SRC-C-003,LégisQuébec C-26 r. 123 à jour au 2026-07-01 (notes-C §2.2),2026-10-31,verifie,id source approximatif : voir registry fusionné
5+CLM-APPC-04,appC,Règle 2.5 : le signataire accepte l'entière responsabilité du contenu et des conclusions,SRC-C-001,NPP (notes-C §2.1),2026-10-31,verifie,
6+CLM-APPC-05,appC,Tenue des dossiers (C-26 r. 133) art. 6 : conservation au moins 5 ans,SRC-C-004,notes-C §2.3,2026-10-31,verifie,
7+CLM-APPC-06,appC,CUSPAP 2026 : norme distincte « Reporting » ; définitions Extraordinary Assumption / Hypothetical Condition / Extraordinary Limiting Condition (s. 3),SRC-C-0xx (cuspap2026),notes-C §2.5,2026-10-31,verifie,id source à compléter par l'orchestrateur
8+CLM-APPC-07,appC,IVS 2025 : documentation des données et intrants et des modèles (IVS 104-105),SRC-C-014,notes-C §1.2 et ch. 10 §10.5.3,2026-10-31,verifie,numérotation 104/105 reprise du ch. 10 (édition 2025)
9+CLM-APPC-08,appC,RICS Red Book 2025 : VPS 6 Valuation reports,SRC-C-0xx (rics2025),notes-C §2.5,2026-10-31,partiellement_verifie,page RICS lue et PDF non téléchargé (notes-C point 5)
10+CLM-APPC-09,appC,LFM art. 43-46 : valeur réelle ; date de référence antérieure à l'entrée en vigueur du rôle ; immeuble supposé libre de baux (art. 45.1 cité au ch. 47),SRC-B-001,notes-B et ch. 47,2026-10-31,verifie,formulation volontairement non chiffrée (« antérieure ») ; le délai exact (18 mois) non vérifié dans les notes
11+CLM-APPC-10,appC,Art. 1936-1937 C.c.Q. : reconduction de plein droit ; l'aliénation ne résilie pas les baux,SRC-A-001,texte lu (notes-A ; articles 1936-1979 lus),2026-10-31,verifie,
12+CLM-APPC-11,appC,Code des professions art. 36 j) et 37 j) : titre réservé d'évaluateur agréé et champ d'exercice,SRC-C-009,notes-C §1.4,2026-10-31,verifie,
13+CLM-APPC-12,appC,Règle 2.3 élément 7 : réserves et hypothèses de base ; annexe E = modèle non contraignant quant à la forme ; élément 12 : attestation à formule imposée commençant par « J'atteste par la présente au mieux de ma connaissance et de ma conviction » (non reproduite au-delà de la paraphrase),SRC-C-001,NPP (notes-C §2.1),2026-10-31,verifie,texte de l'attestation et de l'annexe E non reproduits (paraphrase de la structure)
14+CLM-APPC-13,appC,Règle 2.3 élément 10 : justifier le rejet d'une méthode traditionnelle ; élément 11 : conformité à la substance et écarts aux directives,SRC-C-001,NPP (notes-C §3.1),2026-10-31,verifie,
15+CLM-APPC-14,appC,Convention de l'ouvrage : réserve incluse dans le RNE de la capitalisation directe ; CAPEX explicites dans le DCF ; composition semestrielle des hypothèques,CONV,manuscript/appendices/conventions-calcul.tex,2026-10-31,verifie,cohérence interne de l'ouvrage (pas une source externe)
16+CLM-APPC-15,appC,Identités (C.1)-(C.4) : RBE = RBP(1−v)+autres ; RNE = RBE−DE−RR ; V = RNE/R ; RCD = RNE/SD ; RPV = M0/V,CONV,CONVENTIONS.md §4 et traite/finance,2026-10-31,verifie,notation de l'ouvrage
added verification/chapters/appC-registry.csv +1 −0
@@ -0,0 +1 @@
1+id,type,titre,organisme,version_ou_date,url,date_consultation,statut,utilise_dans,notes
added verification/chapters/ch03.md +9 −0
@@ -0,0 +1,9 @@
1+# Chapitre 3 — Offre, demande et cycles (bilan, 2026-10-31)
2+
3+- Rédigé par l'agent du chapitre 3 (phase 4). `tools/compile_chapter.sh 3` : **OK ch03 : 34 pages, 0 references/citations non definies, 0 overfull hbox**. `python3 -m pytest -q analysis/python/tests/test_ch03.py` : **19 tests verts**. `tools/check_manuscript.py --no-log` : seules remarques pour ch03 = « figure non inscrite dans verification/figures.csv » (attendu : règle de collision, les lignes sont dans `verification/chapters/ch03-figures.csv`, à fusionner par l'orchestrateur). Inspection visuelle du PDF faite (planches de contact des 34 pages + figures en PNG).
4+- Compteurs : ≈ 11 100 mots (detex, prose + légendes + tableaux ; ≈ 9 200 mots de prose pure) ; 5 figures PDF Matplotlib (3 synthétiques : quatre quadrants, cycle simulé, sensibilité du cycle ; 2 réelles : mises en chantier Québec 1990-2026, coût d'usage 2001-2026) ; 8 tableaux (3 synthétiques, 5 sur données réelles ou paramètres déclarés) ; 14 équations numérotées ; 2 définitions ; 2 propositions démontrées ; 1 exemple intégral ; 7 exercices (2 × niveau 1, 3 × niveau 2, 2 × niveau 3) avec solutions ; encadrés quebec × 3, pratique, synthetique, erreurs, limites, synthese.
5+- Données : réelles lues dans `data/raw` (Statistique Canada 34-10-0135-01, 34-10-0143-01, 18-10-0004-01, 18-10-0205-01 ; Banque du Canada Valet V39079, BD.CDN.5YR.DQ.YLD, BD.CDN.10YR.DQ.YLD, V80691335, groupe A4) ; chiffres SCHL/APCIQ/CBRE cités depuis `sources/notes-E.md` avec attribution ; marché type et simulation = paramètres pédagogiques déclarés (encadré synthétique), simulation déterministe (aucune graine nécessaire).
6+- Scripts : `analysis/python/cases/ch03_cycles.py` (quatre quadrants, dynamique, racines caractéristiques, lecture des séries réelles, coût d'usage, indicateurs, `exercices()`) ; `analysis/python/figures/ch03_{quadrants,cycle,mises_chantier,cout_usage}.py` ; `analysis/python/tests/test_ch03.py`. Registres : `verification/chapters/ch03-{figures,calculations,claims,registry}.csv`. Aucune nouvelle clé bib (toutes les citations existent dans `references/library.bib`) → pas de `references/lib-ch03.bib`.
7+- Points non vérifiés (claims `non_verifie`) : élasticités numériques de Saiz 2010 (texte intégral inaccessible ; non citées) ; non-déductibilité des intérêts / exemption du gain sur résidence principale (règle fiscale générale, à faire confirmer par le lot fiscalité) ; seuils de mois d'inventaire 4/6 (convention de métier) ; paramètres pédagogiques (élasticité −0,5, δ, v*, λ, L) ; ordres de grandeur des délais de livraison par type.
8+- **Anomalies de données découvertes** : (1) dans `data/raw/statcan_34100143/34100143.csv`, la RMR de Montréal n'a pas de valeurs pour juillet–septembre 2025 → la somme « Montréal RMR 2025 : 21 138 » de `notes-E.md` et de `sources/registry-E.csv` (SRC-E-019) couvre 9 mois, pas l'année ; à corriger dans ces fichiers et à ne pas citer comme total annuel (ch. 4). (2) Les séries « en construction » et « achèvements » du Québec dans 34-10-0135-01 s'arrêtent au T4 2022. (3) La série Valet V39079 téléchargée commence le 2009-04-21 (et non 2000 comme l'indique `data/raw/SOURCES.md`).
9+- Suggestions pour l'harmonisation : le ch. 4 peut réutiliser `mises_en_chantier_annuelles()` et `indicateurs_apciq()` ; le ch. 29/30 peuvent renvoyer à `\cref{eq:3:actifs}` et `\cref{eq:3:prix-loyer}` ; le ch. 31 au tableau 3.5 (taux directeur) et aux taux effectifs A4 ; le ch. 35 à la série IPLN ; le ch. 1 cite déjà le coût d'usage (`eq:1:cout-usage`) — vérifier la cohérence des notations ($L$ pour le loyer au ch. 1 vs $R$ au ch. 3). Mots : viser +500 si la relecture souhaite un développement sur le ratio prix/revenu avec une source de revenu médian (aucune dans les notes).
added verification/chapters/ch09.md +41 −0
@@ -0,0 +1,41 @@
1+# Chapitre 9 — Évaluation foncière municipale et contestation : bilan de rédaction (2026-10-31)
2+
3+## Compteurs
4+- Prose : ≈ 13 500 mots (hors tableaux, figures, équations et TikZ ; ≈ 16 400 mots avec la regex brute de `tools/check_manuscript.py`) ; 43 pages compilées (chapitre + solutions + bibliographie du chapitre).
5+- Figures : 5 — 1 schéma TikZ (chronologie du rôle triennal) + 4 PDF Matplotlib (`ch09-fig-ratios-distribution`, `ch09-fig-ratios-temps`, `ch09-fig-prb`, `ch09-fig-sensibilite-contestation`), toutes synthétiques (cas 1) ; la dernière combine le jeu synthétique et les taux réels 2026 de Gatineau.
6+- Tableaux : 10 (rôles en vigueur, seuils IAAO vs r. 13, taux de taxes 2026, barèmes de mutation 2026, frais de révision/TAQ, échéancier des recours, étude de ratios, comparables à la date de référence, deux dossiers en regard, sensibilité).
7+- Équations numérotées : 14 (ratio, PM et facteur, valeur à inscrire art. 147, liste de base, épuration, écart type relatif, COD, PRD, PRB, compte de taxes, droit de mutation, gain net et seuil, rajustement temporel, écart attendu prix/rôle) ; 1 définition, 1 encadré `formule`, 1 proposition avec démonstration (PRD et régressivité).
8+- Exercices : 7 (niveaux 1, 1, 2, 2, 2, 3, 3) ; solutions détaillées dans `solutions/ch09.tex`, chiffres testés (`TestExercices`).
9+- Encadrés : objectifs, synthetique, exemple intégral (5 étapes, deux dossiers), 2 × quebec (proportion médiane ; rôle 2027-2029 de Gatineau), pratique, erreurs, limites, synthese.
10+- Citations : 47 clés, toutes dans `references/library.bib` (aucune nouvelle clé ; `references/lib-ch09.bib` ne contient qu'un commentaire et une proposition de complément de note pour `gatineaureglement994`).
11+
12+## Contrôles
13+- `tools/compile_chapter.sh 9` → `OK ch09 : 43 pages, 0 references/citations non definies, 2 overfull hbox` (2,7 pt et 2,6 pt, deux paragraphes de prose ; aucun tableau ni figure ne déborde). Avertissement résiduel « Label ch:09 multiply defined », artefact du script de compilation (présent aussi pour ch16/ch21).
14+- `python3 -m pytest -q analysis/python/tests/test_ch09.py` → 26 passed.
15+- `python3 tools/check_manuscript.py --no-log` : seules remarques pour ch09 = les 4 figures « non inscrites dans verification/figures.csv », attendu puisque la règle de collision impose `verification/chapters/ch09-figures.csv` (à fusionner par l'orchestrateur).
16+- PDF relu (planches de contact de toutes les pages + pages 14 et 25 en détail) : tableaux dans la justification, figures lisibles, chronologie TikZ dans la largeur du texte.
17+- Convention `\cref` sans article : toutes les occurrences portent article/préposition (grep vérifié).
18+
19+## Scripts et données
20+- `analysis/python/cases/ch09_ratios.py` : étude de ratios (bruts, rajustés au 2024-07-01 par le taux mensuel du modèle hédonique partagé `traite.cas1.hedonique`, épuration r. 10, proportion médiane, facteur, écart type relatif annexe III, sous-groupes), dossier du sujet (prédiction hédonique + 5 comparables centrés sur la date de référence, ajustements `traite.cas1.ajustements_hedoniques`), dossier de l'acheteur G0258, compte de taxes Gatineau 2026, droits de mutation, échéancier, sensibilité, exercices. Aucun module de `traite/` modifié (statistiques IAAO = `traite.hedonique.statistiques_ratio`). Fonctions candidates à la bibliothèque si d'autres chapitres en ont besoin : `epuration_r10`, `ecart_type_relatif`, `liste_de_base`, `droits_mutation`, `compte_taxes_gatineau`, `prb_proxy_prix`.
21+- `analysis/python/figures/ch09_ratios.py` (4 figures, `from traite.style import …`).
22+- Nouvelle donnée réelle : `data/raw/gatineau_r994_2025/annexe1_taux_voisinage.csv` + `README.md` — les 1 092 taux de voisinage de l'annexe I du règlement 994-2025 de Gatineau, extraits du PDF officiel lu intégralement le 2026-10-31 (source SRC-09-001 dans `ch09-registry.csv`). **À ajouter à `data/raw/SOURCES.md` par l'orchestrateur** (fichier global non modifié).
23+
24+## Points non vérifiés ou partiellement vérifiés (voir ch09-claims.csv)
25+1. Proportions médianes officielles de Montréal (2026), Québec (2025-2027) et Gatineau : outil Québec.ca protégé par reCAPTCHA ; déduites des facteurs comparatifs publiés par Montréal (1,00) et Gatineau (1,00 / 0,98 / 1,02) ; Québec non trouvé (non_verifie, dit explicitement dans le chapitre).
26+2. Taux de taxe foncière résidentielle 2026 de Montréal (0,4631 $/100 $) : Le Devoir seulement ; non utilisé dans les calculs (partiellement_verifie).
27+3. Taux de taxe scolaire 2026-2027 (0,07899 $) : communiqué de CSS ; avis officiel (2026) 158 G.O. 1, 520 non consulté ; mécanisme d'« ajustement » de l'évaluation uniformisée non détaillé, calculs sans ajustement (partiellement_verifie).
28+4. Jurisprudence *Sun Life* (1950), *Notre-Dame de Bon-Secours* (1994) et 2026 QCCA 1106 : résumés de sources secondaires, aucun extrait textuel ; *Jardins de Vérone* (CSC 41748) en délibéré — à mettre à jour avant publication.
29+5. Statistiques des rôles de Québec (+23,5 %) et de Gatineau 2027-2029 (détail par secteur, médianes) : presse ; écarts entre sources signalés dans notes-E.
30+6. Normes OEAQ 19 à 22 (rôle foncier, révision, recours) : titres vérifiés dans la table des matières des NPP, contenu non dépouillé.
31+7. Règles particulières des art. 244.45 et s. LFM (coefficients entre catégories) non examinées ; les taux de Gatineau sont rapportés tels que fixés par règlement.
32+8. Cohérence interne du jeu synthétique : la colonne `valeur_role_2025` a pour date de référence le 2024-07-01, ce qui correspond selon l'art. 46 al. 1 à un rôle 2026-2028 ; le chapitre l'interprète ainsi (millésime = année de dépôt) et le signale dans l'encadré synthétique. Le commentaire de `synth.py` (« rôle 2025-2027 fictif ») et le chapitre 16 (« rôle fictif ») devraient être harmonisés sur « rôle fictif 2026-2028 ».
33+9. Le PRB rajusté (0,064) excède le seuil IAAO alors que le rôle fictif est uniforme par construction : artefact de la proxy (erreur du rôle = seule source de dispersion), démontré par simulation dans `test_ch09.py::test_biais_du_proxy` et expliqué dans le texte ; à ne pas lire comme une propriété des rôles réels.
34+
35+## Suggestions pour l'harmonisation
36+- Ch. 2 et ch. 16 : citer la date de référence comme « art. 46 al. 1 » (ch16.tex l. 29 renvoie correctement aux art. 43-45 ; vérifier les autres chapitres pour « 46.1 »).
37+- Ch. 13 : réutiliser `dqroles`/`mamhroles2026` et la description des données ouvertes faite ici (§ 9.3) sans la dupliquer ; ch. 35 : `clappGiaccotto1992` et l'équation de l'écart attendu prix/rôle (éq. 9.14) comme pont vers les indices.
38+- Ch. 45 (maison à Gatineau) : reprendre la valeur réelle du sujet au 2024-07-01 (573 000 $) et le compte de taxes 2026 (4 076,01 $ au taux de voisinage médian) ; le ch. 45 devra fixer une unité de voisinage fictive si l'on veut un taux précis.
39+- Ch. 46/47 : les taux 2026 de Québec (0,7464 / 0,7697) et les tranches de mutation de Montréal sont déjà dans `tab:9:taux` et `tab:9:mutations` ; y renvoyer par `\cref{tab:9:taux}`.
40+- `library.bib` : compléter la note de `gatineaureglement994` (proposition dans `lib-ch09.bib`) ; corriger la note de `lfm` comme proposé dans notes-B (art. 46 al. 1).
41+- Fusion des CSV par chapitre dans les registres globaux : `ch09-figures.csv` (5 lignes), `ch09-calculations.csv` (18), `ch09-claims.csv` (30), `ch09-registry.csv` (1).
added verification/chapters/ch18-calculations.csv +19 −0
@@ -0,0 +1,19 @@
1+id,chapitre,description,script,test,resultat_attendu,resultat_obtenu,statut,date
2+CALC-18-01,18,"Modèle de référence (traite.cas1.hedonique) : n, k, R², R² ajusté, σ",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_modele_reference_retrouve_les_lois,"600 ; 16 ; 0,853 ; 0,849 ; 0,083","600 ; 16 ; 0,8530 ; 0,8492 ; 0,0830",verifie,2026-10-31
3+CALC-18-02,18,"Coefficients clés et couverture des paramètres de génération (IC 95 %)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_modele_reference_retrouve_les_lois,"ln_S 0,5391 (0,0127) ; ln_T 0,0937 ; qualité 0,0611 ; garage 0,0324 ; Buckingham −0,2504 (0,0718) ; const 13,2074 → 544 400 $ ; 15/15 couverts",idem,verifie,2026-10-31
4+CALC-18-03,18,"Croissance mensuelle et annuelle implicites vs croissance de génération",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_modele_reference_retrouve_les_lois,"0,364 %/mois ; 4,46 %/an ; vraie 4,43 %",idem,verifie,2026-10-31
5+CALC-18-04,18,"Diagnostics : Breusch–Pagan (Koenker), Jarque–Bera, asymétrie, aplatissement, étendue des résidus",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_diagnostics,"LM 16,09 ddl 15 p 0,38 ; JB 2,11 p 0,35 ; −0,07 ; 2,75 ; [−0,238 ; 0,224] ; 7,0 % > 0,15",idem,verifie,2026-10-31
6+CALC-18-05,18,"VIF (âge 11,85 ; distance 43,7 ; Buckingham 30,3 ; Masson-Angers 28,0 ; Aylmer 8,0 ; Gatineau 4,15 ; physiques < 2)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_diagnostics,"voir description",idem,verifie,2026-10-31
7+CALC-18-06,18,"Distances de Cook (seuil 4/n = 0,0067 ; 29 au-dessus ; max 0,022 G0541) et I de Moran des résidus (8 voisins)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_diagnostics,"29 ; 0,022 ; G0541 ; I −0,013 z −0,59 p 0,56",idem,verifie,2026-10-31
8+CALC-18-07,18,"Six variantes : R², EQM $, COD, prédiction du sujet (semi-log 637 953 ; linéaire 615 985 ; log-log 627 260 ; Box–Cox 635 171 ; sans secteurs 664 342 ; trimestrielles 649 980)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_variantes,"voir tab:18:variantes",idem,verifie,2026-10-31
9+CALC-18-08,18,"Box–Cox : λ̂ 0,157 ; IC 95 % [−0,036 ; 0,353] ; RV vs λ=0 : 2,5 ; vs λ=1 : 66",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_variantes,"0,157 ; [−0,036 ; 0,353] ; 2,5 ; 66",idem,verifie,2026-10-31
10+CALC-18-09,18,"Omission des secteurs : distance −0,0036 → −0,0117 ; terrain 0,0937 → 0,0419 ; σ 0,083 → 0,104 ; sujet +4,1 %",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_variantes,"voir description",idem,verifie,2026-10-31
11+CALC-18-10,18,"Prix implicites au sujet (2 084 $/m² ; 96 $/m² terrain ; −2 308 $/an ; 2 319 $/mois ; qualité 40 182 ; garage 21 031 ; sous-sol 14 183 ; piscine 17 023 ; étages 19 502 ; Aylmer 56 886 ; Gatineau −14 070) et corrections de Kennedy",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_prix_implicites,"voir tab:18:prix-implicites",idem,verifie,2026-10-31
12+CALC-18-11,18,"Prédiction du sujet : ln 13,3627 ; naïve 635 821 ; Duan ×1,00335 = 637 953 ; log-normale 638 016 ; x'Vx 0,000105 (1,5 %) ; s_p 0,0836 ; IC 95 % [539 682 ; 749 087] ; IC 80 % [571 192 ; 707 764]",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_prediction_et_intervalle,"voir description",idem,verifie,2026-10-31
13+CALC-18-12,18,"Prédiction au 2024-07-01 (580 375 $) et ratio rôle fictif du sujet 468 000 / 580 375 = 0,81",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_prediction_et_intervalle,"580 375 ; 0,806",idem,verifie,2026-10-31
14+CALC-18-13,18,"Statistiques de ratio du modèle : in-sample COD 6,68 PRD 1,007 PRB −0,058 médiane 0,997 ; validation croisée 10 plis COD 6,83 RMSE 40 888 erreur abs. médiane 5,67 %",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_ratios_et_validation_croisee,"voir tab:18:ratios",idem,verifie,2026-10-31
15+CALC-18-14,18,"Rôle fictif vs prix ramenés au 2024-07-01 : médiane 0,925 COD 6,12 PRD 0,999 PRB 0,064 ; sans rajustement : 0,914 / 6,90",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_ratios_et_validation_croisee,"voir description",idem,verifie,2026-10-31
16+CALC-18-15,18,"Indice trimestriel (15 trimestres, 2026T3 = 122,0 vs tendance 116,5 ; 22 ventes ; IC +3,6 %) ; écart abs moyen 2,57 % max 5,03 %",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_indice_et_sensibilite,"voir fig:18:indice",idem,verifie,2026-10-31
17+CALC-18-16,18,"Sensibilité à l'échantillon : Hull 186 → 625 967 ; 18 mois 236 → 640 098 ; étages 330 → 629 272 ; sans Cook 571 → 636 872 ; 110-230 m² 495 → 635 048 ; étendue 2,2 %",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_indice_et_sensibilite,"voir tab:18:sensibilite",idem,verifie,2026-10-31
18+CALC-18-17,18,"Résidus des cinq comparables du ch. 16 (G0574 +0,007 ; G0404 −0,161 ; G0468 −0,104 ; G0477 −0,111 ; G0575 −0,084 ; moyenne −8,7 %)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_residus_des_comparables,"voir description",idem,verifie,2026-10-31
19+CALC-18-18,18,"Solutions des exercices 18.1 à 18.8 (chiffres des solutions/ch18.tex)",analysis/python/cases/ch18_hedonique.py,analysis/python/tests/test_ch18.py::test_solutions_exercices,"voir solutions/ch18.tex",idem,verifie,2026-10-31
added verification/chapters/ch18-claims.csv +17 −0
@@ -0,0 +1,17 @@
1+id,chapitre,affirmation,source_id,verification,date,statut,notes
2+CLM-18-01,18,"IAAO Standard on Ratio Studies (2013) : COD unifamilial 5,0-10,0 (secteurs récents/homogènes) et 5,0-15,0 (anciens/hétérogènes) ; niveau 0,90-1,10 ; PRD 0,98-1,03 ; PRB ±0,05, inacceptable si IC 95 % hors ±0,10 ; COD < 5,0 peut indiquer sales chasing",SRC-C-024,notes-C.md §3.3 ; table 1-3 et §9.2 de la copie 2013 (audits2.ga.gov),2026-10-31,verifie,"Page IAAO : révision en cours de finalisation (SRC-C-063) ; citer 2013 avec réserve"
3+CLM-18-02,18,"IAAO Standard on Mass Appraisal (Revised 2025) et Standard on AVMs (2018) renvoient au Standard on Ratio Studies pour les seuils",SRC-C-025;SRC-C-026,notes-C.md §3.3,2026-10-31,verifie,
4+CLM-18-03,18,"LFM art. 264 : l'évaluateur établit la proportion médiane et le facteur comparatif (inverse)",SRC-B-001,notes-B.md §9.3 (LégisQuébec F-2.1 à jour au 15 oct. 2026),2026-10-31,verifie,
5+CLM-18-04,18,"Règlement F-2.1 r. 10 : ventes ≥ 5 000 $ (art. 2) ; liste de base ≥ 30 (art. 5) ; ventes du 2e exercice précédent (art. 6) ; rajustement au 1er juillet (art. 11-12) ; épuration ±2 écarts-types (art. 15-16) ; médiane des ratios restants (art. 18-19)",SRC-B-003,notes-B.md §9.3 ; registry SRC-B-003 (art. 1-20 lus),2026-10-31,verifie,
6+CLM-18-05,18,"Règlement F-2.1 r. 13 : proportion médiane après équilibration entre 95 % et 105 % (art. 13 al. 2) ; écart-type relatif plafonné de 14 % à 36 % selon l'indice de concentration unifamiliale (art. 14, annexe III)",SRC-B-002,notes-B.md §9.3,2026-10-31,verifie,
7+CLM-18-06,18,"MEFQ édition 2026, partie 3 : 3A taux de variation du marché, 3B équilibration, 3C comparaison (structure) ; droit d'auteur du gouvernement du Québec, non reproduit",SRC-B-007;SRC-B-010;SRC-B-077,notes-B.md (structure MEFQ) ; clé mefqpartie3,2026-10-31,verifie,"Contenu des modèles du MEFQ non dépouillé"
8+CLM-18-07,18,"Ville de Gatineau : facteurs comparatifs 1,00 (2024), 0,98 (2025), 1,02 (2026) → proportions médianes 100 %, ≈102 %, ≈98 %",SRC-B-011,notes-B.md §9.3 ; clé gatmutations (page Base d'imposition),2026-10-31,verifie,"Lecture indirecte via la page des droits de mutation ; lettre d'approbation MAMH non consultée"
9+CLM-18-08,18,"APCIQ T3 2026 : médianes unifamiliales par secteur de Gatineau (Hull 475 000 ; Aylmer 530 000 ; Gatineau 464 900 ; Buckingham/Masson-Angers 395 000) servant aux primes de secteur du jeu synthétique",SRC-E-002,calibration.json ; data/synthetic/README.md,2026-10-31,verifie,"Source d'industrie, citée avec attribution"
10+CLM-18-09,18,"Rôle 2027-2029 de Gatineau : variation de la médiane unifamiliale +9,06 % sur deux ans → croissance annuelle composée 4,43 % du jeu synthétique",SRC-E-054,calibration.json ; clé gatineaurole2027,2026-10-31,verifie,
11+CLM-18-10,18,"Duan (1983) JASA 78(383) 605-610 ; White (1980) Econometrica 48(4) 817-838 ; Breusch & Pagan (1979) Econometrica 47(5) 1287-1294 ; Cook (1977) Technometrics 19(1) 15-18",SRC-18-001;SRC-18-002;SRC-18-003;SRC-18-004,API Crossref (DOI) le 2026-10-31 ; entrées dans references/lib-ch18.bib,2026-10-31,verifie,"Citées en toutes lettres (notes de bas de page) car absentes de library.bib"
12+CLM-18-11,18,"Belsley, Kuh & Welsch (1980) Regression Diagnostics, Wiley, DOI 10.1002/0471725153 ; seuil VIF > 10 présenté comme convention d'usage",SRC-18-005,DOI Wiley (notice, non ouverte à la page),2026-10-31,partiellement_verifie,"Seuil 10 : usage, non norme"
13+CLM-18-12,18,"Rosen (1974) : fonction de prix = enveloppe des enchères/offres ; deux stades ; Epple (1987), Ekeland–Heckman–Nesheim (2004), Bajari–Benkard (2005) sur l'identification du second stade",SRC-D (lib-D),notes-D.md §ch. 18 ; clés library.bib,2026-10-31,verifie,
14+CLM-18-13,18,"Cropper, Deck & McConnell (1988) : formes simples (linéaire, semi-log, Box–Cox linéaire) plus robustes aux variables omises/mal mesurées que les formes flexibles (Box–Cox quadratique)",SRC-D (lib-D),notes-D.md §ch. 18 ; résumé de l'article (Review of Economics and Statistics 70(4)),2026-10-31,verifie,"Paraphrase du résultat principal"
15+CLM-18-14,18,"Court (1939) a forgé le terme « hédonique » (indices automobiles GM) ; Griliches (1961, 1971) a relancé la méthode",SRC-D (lib-D),notes-D.md §ch. 18 ; goodman1998,2026-10-31,partiellement_verifie,"Pagination de Court (1939) issue de la littérature secondaire (notes-D)"
16+CLM-18-15,18,"Version studentisée de Koenker du test de Breusch–Pagan (LM = n·R² de e² sur X)",—,Formule standard (Koenker 1981, Journal of Econometrics) non ajoutée à la bibliographie,2026-10-31,non_verifie,"Référence Koenker (1981) non vérifiée ni citée ; mention nominale seulement"
17+CLM-18-16,18,"Seuil 4/n pour la distance de Cook : convention d'usage",—,Convention répandue ; aucune norme,2026-10-31,non_verifie,"Déclaré comme convention dans le texte et dans limites"
added verification/chapters/ch18-figures.csv +7 −0
@@ -0,0 +1,7 @@
1+fichier,chapitre,script,donnees,type_donnees,legende_courte,statut
2+ch18/ch18-fig-formes.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix prédit selon la superficie sous quatre formes fonctionnelles (linéaire, semi-log, log-log, Box–Cox) [données synthétiques]",verifie
3+ch18/ch18-fig-diagnostics.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Résidus vs valeurs ajustées et diagramme quantile-quantile du modèle de référence [données synthétiques]",verifie
4+ch18/ch18-fig-predit-observe.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix prédit (Duan) vs prix observé, 600 ventes, cinq comparables du ch. 16 encerclés [données synthétiques]",verifie
5+ch18/ch18-fig-surface.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Surface du prix prédit selon superficie habitable et âge, autres attributs du sujet [données synthétiques]",verifie
6+ch18/ch18-fig-prix-implicites.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix implicites au sujet en dollars avec barres ± 1,96 e.-t. HC1 [données synthétiques]",verifie
7+ch18/ch18-fig-indice.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Indice trimestriel par indicatrices (IC 95 %) vs tendance linéaire, base 2023T1 = 100 [données synthétiques]",verifie
added verification/chapters/ch18-registry.csv +6 −0
@@ -0,0 +1,6 @@
1+id,type,titre,organisme,version_ou_date,url,date_consultation,statut,utilise_dans,notes
2+SRC-18-001,article,"Smearing Estimate: A Nonparametric Retransformation Method (Duan, N.)",Journal of the American Statistical Association 78(383) 605-610,1983,https://doi.org/10.1080/01621459.1983.10478017,2026-10-31,verifie,18,"Vérifié via api.crossref.org ; clé duan1983 (lib-ch18.bib)"
3+SRC-18-002,article,"A Heteroskedasticity-Consistent Covariance Matrix Estimator and a Direct Test for Heteroskedasticity (White, H.)",Econometrica 48(4) 817-838,1980,https://doi.org/10.2307/1912934,2026-10-31,verifie,18,"Vérifié via api.crossref.org ; clé white1980"
4+SRC-18-003,article,"A Simple Test for Heteroscedasticity and Random Coefficient Variation (Breusch, T. S. ; Pagan, A. R.)",Econometrica 47(5) 1287-1294,1979,https://doi.org/10.2307/1911963,2026-10-31,verifie,18,"Vérifié via api.crossref.org ; clé breuschPagan1979"
5+SRC-18-004,article,"Detection of Influential Observation in Linear Regression (Cook, R. D.)",Technometrics 19(1) 15-18,1977,https://doi.org/10.1080/00401706.1977.10489493,2026-10-31,verifie,18,"Vérifié via api.crossref.org ; clé cook1977"
6+SRC-18-005,livre,"Regression Diagnostics: Identifying Influential Data and Sources of Collinearity (Belsley, Kuh, Welsch)",John Wiley & Sons,1980 (DOI de la réimpression Wiley 2005),https://doi.org/10.1002/0471725153,2026-10-31,partiellement_verifie,18,"Notice Wiley non ouverte à la page ; clé belsleyKuhWelsch1980"
modified verification/claims.csv +16 −0
@@ -392,3 +392,19 @@ CLM-17-10,17,"Rôle 2027-2029 de Gatineau : médiane unifamiliale +9,06 % (454 6
392 CLM-17-11,17,Duan (1983) : correction de retransformation (smearing) utilisée par traite.cas1.predire,lib-ch17:duan1983,"JASA 78(383) 605-610, DOI 10.1080/01621459.1983.10478017 vérifié Crossref 2026-10-31 ; non cité (clé absente de library.bib), mentionné en toutes lettres",2026-10-31,verifie, 392 CLM-17-11,17,Duan (1983) : correction de retransformation (smearing) utilisée par traite.cas1.predire,lib-ch17:duan1983,"JASA 78(383) 605-610, DOI 10.1080/01621459.1983.10478017 vérifié Crossref 2026-10-31 ; non cité (clé absente de library.bib), mentionné en toutes lettres",2026-10-31,verifie,
393 CLM-17-12,17,"Northcraft & Neale (1987), Diaz (1997) : ancrage des évaluateurs sur un prix demandé / sur l'opinion préalable",lib:northcraftNeale1987,notes-D §ch. 16-17 ; déjà cités au ch. 16,2026-10-31,verifie, 393 CLM-17-12,17,"Northcraft & Neale (1987), Diaz (1997) : ancrage des évaluateurs sur un prix demandé / sur l'opinion préalable",lib:northcraftNeale1987,notes-D §ch. 16-17 ; déjà cités au ch. 16,2026-10-31,verifie,
394 CLM-17-13,17,"Pace (1998) GAM pour ajustements non linéaires ; Pace (1998) total grid estimation ; Cropper, Deck & McConnell (1988) robustesse des formes simples aux variables omises ; Malpezzi (2003) biais d'omission",lib:pace1998grid,notes-D §ch. 17-18 ; clés présentes dans library.bib,2026-10-31,verifie,"résumés de portée générale, pas de chiffre repris" 394 CLM-17-13,17,"Pace (1998) GAM pour ajustements non linéaires ; Pace (1998) total grid estimation ; Cropper, Deck & McConnell (1988) robustesse des formes simples aux variables omises ; Malpezzi (2003) biais d'omission",lib:pace1998grid,notes-D §ch. 17-18 ; clés présentes dans library.bib,2026-10-31,verifie,"résumés de portée générale, pas de chiffre repris"
395+CLM-18-01,18,"IAAO Standard on Ratio Studies (2013) : COD unifamilial 5,0-10,0 (secteurs récents/homogènes) et 5,0-15,0 (anciens/hétérogènes) ; niveau 0,90-1,10 ; PRD 0,98-1,03 ; PRB ±0,05, inacceptable si IC 95 % hors ±0,10 ; COD < 5,0 peut indiquer sales chasing",SRC-C-024,notes-C.md §3.3 ; table 1-3 et §9.2 de la copie 2013 (audits2.ga.gov),2026-10-31,verifie,Page IAAO : révision en cours de finalisation (SRC-C-063) ; citer 2013 avec réserve
396+CLM-18-02,18,IAAO Standard on Mass Appraisal (Revised 2025) et Standard on AVMs (2018) renvoient au Standard on Ratio Studies pour les seuils,SRC-C-025;SRC-C-026,notes-C.md §3.3,2026-10-31,verifie,
397+CLM-18-03,18,LFM art. 264 : l'évaluateur établit la proportion médiane et le facteur comparatif (inverse),SRC-B-001,notes-B.md §9.3 (LégisQuébec F-2.1 à jour au 15 oct. 2026),2026-10-31,verifie,
398+CLM-18-04,18,Règlement F-2.1 r. 10 : ventes ≥ 5 000 $ (art. 2) ; liste de base ≥ 30 (art. 5) ; ventes du 2e exercice précédent (art. 6) ; rajustement au 1er juillet (art. 11-12) ; épuration ±2 écarts-types (art. 15-16) ; médiane des ratios restants (art. 18-19),SRC-B-003,notes-B.md §9.3 ; registry SRC-B-003 (art. 1-20 lus),2026-10-31,verifie,
399+CLM-18-05,18,"Règlement F-2.1 r. 13 : proportion médiane après équilibration entre 95 % et 105 % (art. 13 al. 2) ; écart-type relatif plafonné de 14 % à 36 % selon l'indice de concentration unifamiliale (art. 14, annexe III)",SRC-B-002,notes-B.md §9.3,2026-10-31,verifie,
400+CLM-18-06,18,"MEFQ édition 2026, partie 3 : 3A taux de variation du marché, 3B équilibration, 3C comparaison (structure) ; droit d'auteur du gouvernement du Québec, non reproduit",SRC-B-007;SRC-B-010;SRC-B-077,notes-B.md (structure MEFQ) ; clé mefqpartie3,2026-10-31,verifie,Contenu des modèles du MEFQ non dépouillé
401+CLM-18-07,18,"Ville de Gatineau : facteurs comparatifs 1,00 (2024), 0,98 (2025), 1,02 (2026) → proportions médianes 100 %, ≈102 %, ≈98 %",SRC-B-011,notes-B.md §9.3 ; clé gatmutations (page Base d'imposition),2026-10-31,verifie,Lecture indirecte via la page des droits de mutation ; lettre d'approbation MAMH non consultée
402+CLM-18-08,18,APCIQ T3 2026 : médianes unifamiliales par secteur de Gatineau (Hull 475 000 ; Aylmer 530 000 ; Gatineau 464 900 ; Buckingham/Masson-Angers 395 000) servant aux primes de secteur du jeu synthétique,SRC-E-002,calibration.json ; data/synthetic/README.md,2026-10-31,verifie,"Source d'industrie, citée avec attribution"
403+CLM-18-09,18,"Rôle 2027-2029 de Gatineau : variation de la médiane unifamiliale +9,06 % sur deux ans → croissance annuelle composée 4,43 % du jeu synthétique",SRC-E-054,calibration.json ; clé gatineaurole2027,2026-10-31,verifie,
404+CLM-18-10,18,Duan (1983) JASA 78(383) 605-610 ; White (1980) Econometrica 48(4) 817-838 ; Breusch & Pagan (1979) Econometrica 47(5) 1287-1294 ; Cook (1977) Technometrics 19(1) 15-18,SRC-18-001;SRC-18-002;SRC-18-003;SRC-18-004,API Crossref (DOI) le 2026-10-31 ; entrées dans references/lib-ch18.bib,2026-10-31,verifie,Citées en toutes lettres (notes de bas de page) car absentes de library.bib
405+CLM-18-11,18,"Belsley, Kuh & Welsch (1980) Regression Diagnostics, Wiley, DOI 10.1002/0471725153 ; seuil VIF > 10 présenté comme convention d'usage",SRC-18-005,DOI Wiley (notice,non ouverte à la page),2026-10-31,partiellement_verifie
406+CLM-18-12,18,"Rosen (1974) : fonction de prix = enveloppe des enchères/offres ; deux stades ; Epple (1987), Ekeland–Heckman–Nesheim (2004), Bajari–Benkard (2005) sur l'identification du second stade",SRC-D (lib-D),notes-D.md §ch. 18 ; clés library.bib,2026-10-31,verifie,
407+CLM-18-13,18,"Cropper, Deck & McConnell (1988) : formes simples (linéaire, semi-log, Box–Cox linéaire) plus robustes aux variables omises/mal mesurées que les formes flexibles (Box–Cox quadratique)",SRC-D (lib-D),notes-D.md §ch. 18 ; résumé de l'article (Review of Economics and Statistics 70(4)),2026-10-31,verifie,Paraphrase du résultat principal
408+CLM-18-14,18,"Court (1939) a forgé le terme « hédonique » (indices automobiles GM) ; Griliches (1961, 1971) a relancé la méthode",SRC-D (lib-D),notes-D.md §ch. 18 ; goodman1998,2026-10-31,partiellement_verifie,Pagination de Court (1939) issue de la littérature secondaire (notes-D)
409+CLM-18-15,18,Version studentisée de Koenker du test de Breusch–Pagan (LM = n·R² de e² sur X),—,Formule standard (Koenker 1981,Journal of Econometrics) non ajoutée à la bibliographie,2026-10-31,non_verifie
410+CLM-18-16,18,Seuil 4/n pour la distance de Cook : convention d'usage,—,Convention répandue ; aucune norme,2026-10-31,non_verifie,Déclaré comme convention dans le texte et dans limites
modified verification/figures.csv +6 −0
@@ -80,3 +80,9 @@ ch17/ch17-fig-cascade-g0404.pdf,17,analysis/python/figures/ch17_figures.py,data/
80 ch17/ch17-fig-bruts-ajustes.pdf,17,analysis/python/figures/ch17_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix bruts vs prix ajustés des cinq comparables, valeur pondérée et prédiction hédonique [données synthétiques]",verifie 80 ch17/ch17-fig-bruts-ajustes.pdf,17,analysis/python/figures/ch17_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix bruts vs prix ajustés des cinq comparables, valeur pondérée et prédiction hédonique [données synthétiques]",verifie
81 ch17/ch17-fig-paires.pdf,17,analysis/python/figures/ch17_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Dispersion des différences de prix des paires garage et sous-sol, moyenne ± 1,96 ET, prix implicite hédonique [données synthétiques]",verifie 81 ch17/ch17-fig-paires.pdf,17,analysis/python/figures/ch17_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Dispersion des différences de prix des paires garage et sous-sol, moyenne ± 1,96 ET, prix implicite hédonique [données synthétiques]",verifie
82 ch17/ch17-fig-sensibilite.pdf,17,analysis/python/figures/ch17_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Tornade de la valeur pondérée : coefficients ±1,96 ET, taux de croissance, omission d'un ajustement [données synthétiques]",verifie 82 ch17/ch17-fig-sensibilite.pdf,17,analysis/python/figures/ch17_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Tornade de la valeur pondérée : coefficients ±1,96 ET, taux de croissance, omission d'un ajustement [données synthétiques]",verifie
83+ch18/ch18-fig-formes.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix prédit selon la superficie sous quatre formes fonctionnelles (linéaire, semi-log, log-log, Box–Cox) [données synthétiques]",verifie
84+ch18/ch18-fig-diagnostics.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,Résidus vs valeurs ajustées et diagramme quantile-quantile du modèle de référence [données synthétiques],verifie
85+ch18/ch18-fig-predit-observe.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix prédit (Duan) vs prix observé, 600 ventes, cinq comparables du ch. 16 encerclés [données synthétiques]",verifie
86+ch18/ch18-fig-surface.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Surface du prix prédit selon superficie habitable et âge, autres attributs du sujet [données synthétiques]",verifie
87+ch18/ch18-fig-prix-implicites.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix implicites au sujet en dollars avec barres ± 1,96 e.-t. HC1 [données synthétiques]",verifie
88+ch18/ch18-fig-indice.pdf,18,analysis/python/figures/ch18_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Indice trimestriel par indicatrices (IC 95 %) vs tendance linéaire, base 2023T1 = 100 [données synthétiques]",verifie
83 89
Menu

Theme