SPB Git
3.7 KB · 51 lines python
1#!/usr/bin/env python32"""Figure ch43 — décote d'une zone inondable mesurée par quatre méthodes sur les ventes de Rivière-Fictive (DONNÉES SYNTHÉTIQUES).3(a) estimation (ln P) et IC à 95 % par méthode, avec la vérité du générateur pour la cible de chaque méthode ;4(b) décote par classe d'exposition avant l'inondation et stigmate (classe × après), estimées vs déclarées.5Sortie : assets/figures/ch43/ch43-fig-effets-methodes.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, LARGEUR11import ch43_risques as cas121314def main():15    setup()16    lots, ventes = cas.charger_ou_generer(ecrire=False)17    paires = cas.apparier(ventes); t = cas.effets_par_methode(ventes, paires); he = cas.hedoniques(ventes)18    fig, (a, b) = plt.subplots(1, 2, figsize=(LARGEUR, 3.6), gridspec_kw={"width_ratios": [1.35, 1]})19    # (a) méthodes20    etiq = ["Paires\n(après 2019)", "Hédonique\nexposé", "Hédonique\nexposé + vue", "DiD rég. :\nexposé (avant)", "DiD rég. :\nexposé × après", "DiD rég. :\nsomme (après)", "DiD 2 × 2\n(stigmate)"]21    y = np.arange(len(t))[::-1]22    for i, (_, r) in enumerate(t.iterrows()):23        c = palette.cat[0] if np.isfinite(r["se"]) else palette.cat[2]24        if np.isfinite(r["se"]):25            a.plot([r["ic_bas"] * 100, r["ic_haut"] * 100], [y[i], y[i]], color=c, linewidth=1.4)26        a.plot(r["coef"] * 100, y[i], "o", color=c, markersize=5.5, zorder=3)27        a.plot(r["verite"] * 100, y[i], marker="|", color=palette.ink, markersize=11, markeredgewidth=1.6, linestyle="none", zorder=4)28    a.set_yticks(y); a.set_yticklabels(etiq, fontsize=7.5); a.axvline(0, color=palette.ink2, linewidth=0.8)29    a.set_xlabel("Effet sur ln P (points de pourcentage)"); a.set_title("(a) Sept estimations, quatre méthodes", loc="left")30    a.plot([], [], "o", color=palette.cat[0], label="estimation et IC à 95 %"); a.plot([], [], "o", color=palette.cat[2], label="estimation sans erreur-type")31    a.plot([], [], marker="|", color=palette.ink, linestyle="none", markersize=10, markeredgewidth=1.6, label="vérité du générateur (cible)")32    a.set_xlim(-8.6, 4.2); a.legend(loc="upper right", fontsize=6.8, handlelength=1.2)33    # (b) classes34    cl = ["très élevée", "élevée", "modérée", "faible"]; cc = he["c_classes"]35    x = np.arange(len(cl)); w = 0.3636    av = cc.loc[cl]; ap = cc.loc[[f"{c} × après" for c in cl]]37    b.bar(x - w / 2, av["coef"] * 100, w, color=palette.cat[0], label="avant 2019 (estimé)")38    b.bar(x + w / 2, ap["coef"] * 100, w, color=palette.cat[1], label="stigmate × après (estimé)")39    b.errorbar(x - w / 2, av["coef"] * 100, yerr=1.96 * av["se"] * 100, fmt="none", ecolor=palette.ink2, elinewidth=0.9, capsize=2)40    b.errorbar(x + w / 2, ap["coef"] * 100, yerr=1.96 * ap["se"] * 100, fmt="none", ecolor=palette.ink2, elinewidth=0.9, capsize=2)41    b.plot(x - w / 2, av["verite"] * 100, marker="_", color=palette.ink, markersize=12, markeredgewidth=1.8, linestyle="none", label="déclaré", zorder=4)42    b.plot(x + w / 2, ap["verite"] * 100, marker="_", color=palette.ink, markersize=12, markeredgewidth=1.8, linestyle="none", zorder=4)43    b.set_xticks(x); b.set_xticklabels([c.replace(" ", "\n") for c in cl], fontsize=7.5); b.axhline(0, color=palette.ink2, linewidth=0.8)44    b.set_ylabel("Effet sur ln P (points de pourcentage)"); b.set_title("(b) Par classe d'exposition", loc="left"); b.set_ylim(-17.5, 3.5); b.legend(loc="lower center", fontsize=7)45    fig.tight_layout()46    savefig(fig, "ch43/ch43-fig-effets-methodes.pdf")474849if __name__ == "__main__":50    main()51
Files · 031fae1bd368de12dc60ff542f1be9a8fd73e699
Menu

Theme