#!/usr/bin/env python3 """Figure ch02 — cas 3 (DONNÉES SYNTHÉTIQUES) : (a) ratio loyer contractuel / loyer de marché selon l'ancienneté du locataire, avec la loi de génération déclarée (0,98^ancienneté) ; (b) valeur du bail pour le locataire selon la durée de maintien attendue, r = 7,25 %, pour quatre logements. Sortie : assets/figures/ch02/ch02-fig-ecart-logements.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, matplotlib.pyplot as plt from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars import ch02_droits as cas def main(): setup() res = cas.main(verbose=False) e = res["ecarts"]; r = res["d"]["hyp"]["taux_actualisation"] fig, (a, b) = plt.subplots(1, 2, figsize=(LARGEUR, 3.1), gridspec_kw={"width_ratios": [1, 1.1]}) # (a) ratio vs ancienneté x = np.linspace(0, 20, 100) a.plot(x, 0.98 ** x, color=palette.ink2, lw=1.0, ls="--", label="loi de génération $0{,}98^{\\,a}$") a.scatter(e["anciennete"], e["ratio_contrat_marche"], color=palette.cat[0], s=28, zorder=3, label="logements du cas 3") for anc, grp in e.groupby("anciennete"): # une étiquette par ancienneté (plusieurs logements partagent la même) lab = ", ".join(str(int(x)) for x in sorted(grp["logement"])) a.annotate(lab, (anc, grp["ratio_contrat_marche"].mean()), xytext=(anc + 0.45, grp["ratio_contrat_marche"].mean() + 0.004), fontsize=6.8, color=palette.ink) a.set_xlabel("Ancienneté du locataire (années, au 1$^{\\rm er}$ sept. 2026)"); a.set_ylabel("Loyer contractuel / loyer de marché") a.set_ylim(0.62, 1.02); a.set_xlim(-0.5, 20); a.legend(loc="lower left") a.set_title("(a) Écart au marché et ancienneté", loc="left") # (b) valeur du bail pour le locataire selon n n = np.arange(1, 11) for k, lg in enumerate([103, 102, 302, 101]): row = e.loc[e["logement"] == lg].iloc[0] va = [cas.valeur_bail_locataire(row["ecart_annuel"], int(j), r) for j in n] b.plot(n, np.array(va) / 1000, marker="o", ms=3.5, color=palette.cat[k], label=f"log. {lg} ({row['ecart_mensuel']:.0f} $/mois)") b.set_xlabel("Durée de maintien dans les lieux $n$ (années)"); b.set_ylabel("Valeur du bail pour le locataire (milliers de $)") b.set_xticks(n); b.legend(loc="upper left", fontsize=7.2) b.set_title("(b) $\\sum_{t \\leq n} (L^m_t - L^c_t)/(1{,}0725)^t$", loc="left") fig.tight_layout(w_pad=2.2) out = savefig(fig, "ch02/ch02-fig-ecart-logements.pdf"); print("OK", out) if __name__ == "__main__": main()