SPB Git
3.7 KB · 51 lines python
1#!/usr/bin/env python32"""Figure ch44 — (a) quatre lectures de ce que la thermopompe « vaut » pour le sujet du cas 1 : coût installé, coût net de3la subvention, valeur actuelle des économies, primes vertes de la littérature appliquées à la valeur hédonique ;4(b) paires de ventes « qualité 4 vs 3 » du cas 1 : dispersion des écarts, médiane, moyenne et intervalle, prix implicite5hédonique. DONNÉES SYNTHÉTIQUES. Sortie : assets/figures/ch44/ch44-fig-capitalisation.pdf"""6import sys, pathlib7ROOT = pathlib.Path(__file__).resolve().parents[3]8sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases"))9import numpy as np, matplotlib.pyplot as plt10from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars11import ch44_renovation as cas12from traite import cas1131415def main():16    setup()17    mm = cas.mesures(); d = cas1.charger(); mod = cas1.hedonique(d["ventes"])18    vs = float(cas1.predire(mod, cas1.sujet_df(d["sujet"]))[0])19    fa = cas.flux_mesure(mm["A"]); L = cas.lectures_contribution(mm["A"], fa, vs)20    fig, (a, b) = plt.subplots(1, 2, figsize=(LARGEUR, 3.4), gridspec_kw={"wspace": 0.45, "width_ratios": [1.15, 1]})21    # (a) lectures22    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)"]23    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)"]]24    cols = [palette.ink2, palette.ink2, palette.cat[0], palette.cat[3], palette.cat[3], palette.cat[3]]25    y = np.arange(len(etiq))[::-1]26    a.barh(y, vals, color=cols, height=0.62)27    for yi, v in zip(y, vals): a.text(v + 500, yi, fmt_dollars(v), va="center", fontsize=7.5, color=palette.ink)28    a.set_yticks(y); a.set_yticklabels(etiq, fontsize=7.5); a.set_xlim(0, 44000)29    a.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: f"{x/1000:.0f} k$")); a.grid(axis="y", visible=False)30    a.set_title("(a) Thermopompe : quatre lectures", loc="left", fontsize=9)31    # (b) paires32    P = cas.paires_qualite(d["ventes"], mod); diff = P["paires"]["difference_pct"].values * 10033    rng = np.random.default_rng(20261031); jitter = rng.uniform(-0.18, 0.18, size=len(diff))34    b.scatter(jitter, diff, s=18, color=palette.cat[0], alpha=0.75, edgecolor="white", lw=0.4, zorder=3)35    b.hlines(P["mediane_pct"] * 100, -0.3, 0.3, color=palette.ink, lw=1.6, label="Médiane des paires")36    b.hlines(P["moyenne_pct"] * 100, -0.3, 0.3, color=palette.ink2, lw=1.2, ls="--", label="Moyenne des paires")37    lo, hi = [x * 100 for x in P["ic95_pct"]]38    b.fill_between([-0.3, 0.3], lo, hi, color=palette.ink2, alpha=0.12, label="IC à 95 % de la moyenne")39    b.hlines(P["effet_hedonique_pct"] * 100, -0.45, 0.45, color=palette.cat[1], lw=1.6, ls="-.", label="Prix implicite hédonique")40    b.axhline(0, color=palette.ink2, lw=0.6)41    b.set_xlim(-0.6, 0.6); b.set_xticks([]); b.set_ylabel("Écart de prix (qualité 4 vs 3), en %")42    b.set_title(f"(b) {P['resultat']['n']} paires, qualité 4 vs 3", loc="left", fontsize=9); b.grid(axis="x", visible=False)43    b.legend(loc="upper center", fontsize=6.8, ncol=2, bbox_to_anchor=(0.5, -0.04), frameon=False)44    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)45    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)46    out = savefig(fig, "ch44/ch44-fig-capitalisation.pdf"); print("OK", out)474849if __name__ == "__main__":50    main()51
Files · main
Menu

Theme