#!/usr/bin/env python3 """Figure ch44 — (a) quatre lectures de ce que la thermopompe « vaut » pour le sujet du cas 1 : coût installé, coût net de la subvention, valeur actuelle des économies, primes vertes de la littérature appliquées à la valeur hédonique ; (b) paires de ventes « qualité 4 vs 3 » du cas 1 : dispersion des écarts, médiane, moyenne et intervalle, prix implicite hédonique. DONNÉES SYNTHÉTIQUES. Sortie : assets/figures/ch44/ch44-fig-capitalisation.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 ch44_renovation as cas from traite import cas1 def main(): setup() mm = cas.mesures(); d = cas1.charger(); mod = cas1.hedonique(d["ventes"]) vs = float(cas1.predire(mod, cas1.sujet_df(d["sujet"]))[0]) fa = cas.flux_mesure(mm["A"]); L = cas.lectures_contribution(mm["A"], fa, vs) fig, (a, b) = plt.subplots(1, 2, figsize=(LARGEUR, 3.4), gridspec_kw={"wspace": 0.45, "width_ratios": [1.15, 1]}) # (a) lectures etiq = ["Coût installé", "Coût net\n(après LogisVert)", "VA des économies\n(15 ans, 4,58 %)", "Prime 2,32 %\n(Europe)", "Prime 4,20 %\n(monde)", "Prime 5,36 %\n(Amérique)"] vals = [L["cout"], L["cout_net"], L["va_economies"], L["primes_dollars"]["Europe (méta-analyse)"], L["primes_dollars"]["Monde (méta-analyse)"], L["primes_dollars"]["Amérique du Nord (méta-analyse)"]] cols = [palette.ink2, palette.ink2, palette.cat[0], palette.cat[3], palette.cat[3], palette.cat[3]] y = np.arange(len(etiq))[::-1] a.barh(y, vals, color=cols, height=0.62) for yi, v in zip(y, vals): a.text(v + 500, yi, fmt_dollars(v), va="center", fontsize=7.5, color=palette.ink) a.set_yticks(y); a.set_yticklabels(etiq, fontsize=7.5); a.set_xlim(0, 44000) a.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: f"{x/1000:.0f} k$")); a.grid(axis="y", visible=False) a.set_title("(a) Thermopompe : quatre lectures", loc="left", fontsize=9) # (b) paires P = cas.paires_qualite(d["ventes"], mod); diff = P["paires"]["difference_pct"].values * 100 rng = np.random.default_rng(20261031); jitter = rng.uniform(-0.18, 0.18, size=len(diff)) b.scatter(jitter, diff, s=18, color=palette.cat[0], alpha=0.75, edgecolor="white", lw=0.4, zorder=3) b.hlines(P["mediane_pct"] * 100, -0.3, 0.3, color=palette.ink, lw=1.6, label="Médiane des paires") b.hlines(P["moyenne_pct"] * 100, -0.3, 0.3, color=palette.ink2, lw=1.2, ls="--", label="Moyenne des paires") lo, hi = [x * 100 for x in P["ic95_pct"]] b.fill_between([-0.3, 0.3], lo, hi, color=palette.ink2, alpha=0.12, label="IC à 95 % de la moyenne") b.hlines(P["effet_hedonique_pct"] * 100, -0.45, 0.45, color=palette.cat[1], lw=1.6, ls="-.", label="Prix implicite hédonique") b.axhline(0, color=palette.ink2, lw=0.6) b.set_xlim(-0.6, 0.6); b.set_xticks([]); b.set_ylabel("Écart de prix (qualité 4 vs 3), en %") b.set_title(f"(b) {P['resultat']['n']} paires, qualité 4 vs 3", loc="left", fontsize=9); b.grid(axis="x", visible=False) b.legend(loc="upper center", fontsize=6.8, ncol=2, bbox_to_anchor=(0.5, -0.04), frameon=False) b.text(0.33, P["mediane_pct"] * 100 - 1.6, f"médiane {P['mediane_pct']*100:.1f} %".replace(".", ","), va="top", ha="left", fontsize=7.2, color=palette.ink) b.text(-0.47, P["effet_hedonique_pct"] * 100 + 1.2, f"hédonique {P['effet_hedonique_pct']*100:.1f} %".replace(".", ","), va="bottom", ha="left", fontsize=7.2, color=palette.ink) out = savefig(fig, "ch44/ch44-fig-capitalisation.pdf"); print("OK", out) if __name__ == "__main__": main()