#!/usr/bin/env python3 """Figure ch05 — valeur par logement par RMR du portefeuille du cas 4 (DONNÉES SYNTHÉTIQUES, graine 20261031) et décomposition de l'écart logarithmique avec Montréal entre le RNE par logement et le taux de capitalisation. Sortie : assets/figures/ch05/ch05-fig-valeur-logement-rmr.pdf""" import sys, pathlib ROOT = pathlib.Path(__file__).resolve().parents[3] sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases")) import numpy as np import matplotlib.pyplot as plt from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars from traite import cas4 import ch05_rente as c5 def main(): setup() dec = c5.decomposition_rmr(cas4.charger()["portefeuille"]) fig, (a1, a2) = plt.subplots(1, 2, figsize=(LARGEUR, 3.0), gridspec_kw={"wspace": 0.45, "width_ratios": [1, 1.15]}) y = np.arange(len(dec))[::-1] a1.barh(y, dec["valeur_par_logement"], color=palette.cat[0], height=0.62) for yi, (rmr, row) in zip(y, dec.iterrows()): 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) a1.set_yticks(y); a1.set_yticklabels(dec.index); a1.set_xlim(0, 330000) a1.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: f"{x/1000:.0f} k$")) a1.set_xlabel("Valeur par logement (taux global pondéré)"); a1.grid(axis="y", visible=False) a1.set_title("A. Valeur par logement, 2026", loc="left", fontsize=8.5) sub = dec.drop(index="Montréal"); y2 = np.arange(len(sub))[::-1] a2.barh(y2, sub["contrib_rne"], color=palette.cat[1], height=0.62, label="Effet du RNE par logement") 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") for yi, (rmr, row) in zip(y2, sub.iterrows()): a2.plot(row["ecart_ln_V_n"], yi, marker="D", ms=5, color=palette.ink, mec=palette.surface) a2.axvline(0, color=palette.ink2, lw=0.8) a2.set_yticks(y2); a2.set_yticklabels(sub.index); a2.set_xlim(-0.8, 0.15) a2.set_xlabel("Écart logarithmique avec Montréal"); a2.grid(axis="y", visible=False) a2.set_title("B. Décomposition de l'écart (losange = total)", loc="left", fontsize=8.5) a2.legend(fontsize=6.8, loc="upper center", bbox_to_anchor=(0.45, -0.2), ncol=2) out = savefig(fig, "ch05/ch05-fig-valeur-logement-rmr.pdf"); print("OK", out) if __name__ == "__main__": main()