spb/traite-evaluation-qc
Public
1#!/usr/bin/env python32"""Figure ch05 — valeur par logement par RMR du portefeuille du cas 4 (DONNÉES SYNTHÉTIQUES, graine 20261031) et3décomposition de l'écart logarithmique avec Montréal entre le RNE par logement et le taux de capitalisation.4Sortie : assets/figures/ch05/ch05-fig-valeur-logement-rmr.pdf"""5import sys, pathlib6ROOT = pathlib.Path(__file__).resolve().parents[3]7sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases"))8import numpy as np9import matplotlib.pyplot as plt10from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars11from traite import cas412import ch05_rente as c51314def main():15 setup()16 dec = c5.decomposition_rmr(cas4.charger()["portefeuille"])17 fig, (a1, a2) = plt.subplots(1, 2, figsize=(LARGEUR, 3.0), gridspec_kw={"wspace": 0.45, "width_ratios": [1, 1.15]})18 y = np.arange(len(dec))[::-1]19 a1.barh(y, dec["valeur_par_logement"], color=palette.cat[0], height=0.62)20 for yi, (rmr, row) in zip(y, dec.iterrows()):21 a1.text(row["valeur_par_logement"] + 3000, yi, f"{fmt_dollars(row['valeur_par_logement'])} ({row['taux_pondere']*100:.2f} %)", va="center", fontsize=7, color=palette.ink)22 a1.set_yticks(y); a1.set_yticklabels(dec.index); a1.set_xlim(0, 330000)23 a1.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: f"{x/1000:.0f} k$"))24 a1.set_xlabel("Valeur par logement (taux global pondéré)"); a1.grid(axis="y", visible=False)25 a1.set_title("A. Valeur par logement, 2026", loc="left", fontsize=8.5)26 sub = dec.drop(index="Montréal"); y2 = np.arange(len(sub))[::-1]27 a2.barh(y2, sub["contrib_rne"], color=palette.cat[1], height=0.62, label="Effet du RNE par logement")28 a2.barh(y2, sub["contrib_taux"], left=np.where(sub["contrib_rne"] < 0, sub["contrib_rne"], 0), color=palette.cat[2], height=0.62, label="Effet du taux de capitalisation")29 for yi, (rmr, row) in zip(y2, sub.iterrows()):30 a2.plot(row["ecart_ln_V_n"], yi, marker="D", ms=5, color=palette.ink, mec=palette.surface)31 a2.axvline(0, color=palette.ink2, lw=0.8)32 a2.set_yticks(y2); a2.set_yticklabels(sub.index); a2.set_xlim(-0.8, 0.15)33 a2.set_xlabel("Écart logarithmique avec Montréal"); a2.grid(axis="y", visible=False)34 a2.set_title("B. Décomposition de l'écart (losange = total)", loc="left", fontsize=8.5)35 a2.legend(fontsize=6.8, loc="upper left")36 out = savefig(fig, "ch05/ch05-fig-valeur-logement-rmr.pdf"); print("OK", out)3738if __name__ == "__main__":39 main()40