{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "d8fc68ff", "metadata": {}, "outputs": [], "source": [ "# Préparation commune des TP Python\n", "# Le notebook utilise uniquement les ressources fournies dans le dossier codes/.\n", "from pathlib import Path\n", "import importlib.util\n", "import subprocess\n", "import sys\n", "\n", "REQUIRED_PACKAGES = {'numpy': 'numpy', 'pandas': 'pandas', 'matplotlib': 'matplotlib'}\n", "missing = [package for module, package in REQUIRED_PACKAGES.items()\n", " if importlib.util.find_spec(module) is None]\n", "if missing:\n", " print(\"Installation des paquets manquants :\", \", \".join(missing))\n", " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", *missing])\n", "\n", "WORKDIR = Path.cwd().resolve()\n", "CODES_DIR = WORKDIR.parent if WORKDIR.name == \"correction\" else WORKDIR\n", "TOOLBOX_DIR = CODES_DIR / \"toolbox\"\n", "DATA_DIR = CODES_DIR / \"data\"\n", "if not CODES_DIR.is_dir():\n", " raise FileNotFoundError(\"Exécutez le notebook depuis le dossier codes/.\" )\n", "if TOOLBOX_DIR.is_dir():\n", " sys.path.insert(0, str(TOOLBOX_DIR))\n", "\n", "DICE_FILE = TOOLBOX_DIR / \"DICE.py\"\n", "if not DICE_FILE.is_file():\n", " raise FileNotFoundError(\n", " f\"Module du cours introuvable : {DICE_FILE}. \"\n", " \"Téléchargez le dossier codes complet, avec toolbox/.\"\n", " )\n", "\n", "DATA_FILE = DATA_DIR / \"SSP_scenarios.csv\"\n", "if not DATA_FILE.is_file():\n", " raise FileNotFoundError(\n", " f\"Donnée du cours introuvable : {DATA_FILE}. \"\n", " \"Téléchargez le dossier codes complet, avec data/.\"\n", " )\n", "\n", "print(\"Environnement prêt :\", CODES_DIR)\n" ] }, { "cell_type": "markdown", "id": "b4080fff", "metadata": {}, "source": [ "# TP3 — Génération de scénarios physiques SSP\n", "\n", "**Date de la séance :** mercredi 9 septembre 2026, 08:30–10:30\n", "\n", "**Objectifs**\n", "- Manipuler les scénarios SSP (Shared Socioeconomic Pathways)\n", "- Simuler plusieurs scénarios physiques avec DICE\n", "- Calculer des probabilités de dépassement de seuils de température\n", "- Identifier les années de dépassement de +1,5°C et +2°C selon le scénario\n", "\n", "**Prérequis** : TP2 (prise en main de DICE)." ] }, { "cell_type": "code", "execution_count": null, "id": "4b1d6351", "metadata": {}, "outputs": [], "source": [ "import numpy as np, pandas as pd, matplotlib.pyplot as plt\n", "import DICE" ] }, { "cell_type": "markdown", "id": "21703bb5", "metadata": {}, "source": [ "## Partie 1 — Scénarios SSP" ] }, { "cell_type": "markdown", "id": "2110c610", "metadata": {}, "source": [ "**Question 1.** Chargez le fichier SSP_scenarios.csv. Affichez les premières lignes et les colonnes disponibles." ] }, { "cell_type": "code", "execution_count": null, "id": "2e96fb42", "metadata": {}, "outputs": [], "source": [ "# Expected output: colonnes ['year', 'scenario', 'emissions_gtco2'], 5 scénarios SSP1-SSP5\n", "df_ssp = pd.read_csv(DATA_DIR / \"SSP_scenarios.csv\")\n", "print(df_ssp.columns.tolist())\n", "print(df_ssp['scenario'].unique())\n", "df_ssp.head()" ] }, { "cell_type": "markdown", "id": "216a7be4", "metadata": {}, "source": [ "## Partie 2 — Simulation des scénarios SSP avec DICE" ] }, { "cell_type": "markdown", "id": "acc29e88", "metadata": {}, "source": [ "**Question 2.** Simulez trois scénarios avec DICE en faisant varier les paramètres :\n", "- SSP1 (soutenabilité) : `gA=0.04`, `Linf=8500`, `gsig=0.025`\n", "- SSP2 (référence) : paramètres par défaut\n", "- SSP5 (fossile) : `gA=0.10`, `Linf=12000`, `gsig=0.008`" ] }, { "cell_type": "code", "execution_count": null, "id": "23161a71", "metadata": {}, "outputs": [], "source": [ "ssp_params = {\n", " 'SSP1': dict(gA=0.04, Linf=8500, gsig=0.025),\n", " 'SSP2': dict(), # default\n", " 'SSP5': dict(gA=0.10, Linf=12000, gsig=0.008)\n", "}\n", "ssp_paths = {}\n", "for name, kwargs in ssp_params.items():\n", " p = DICE.Params(**kwargs)\n", " path = DICE.init_states(p)\n", " timevec = range(1, p.nT)\n", " path[1:, p.i_mu] = 0.03\n", " path = DICE.update_path(path, timevec, p)\n", " ssp_paths[name] = (p, path)" ] }, { "cell_type": "code", "execution_count": null, "id": "994bfb2a", "metadata": {}, "outputs": [], "source": [ "# Expected output: SSP5 réchauffe le plus vite, SSP1 le moins vite\n", "plt.figure(figsize=(9, 5))\n", "for name, (p, path) in ssp_paths.items():\n", " plt.plot(path[:, p.i_time], path[:, p.i_T_AT], label=name, linewidth=2)\n", "plt.xlabel('Année'); plt.ylabel('T_AT (°C)')\n", "plt.title('Trajectoires de température par scénario SSP')\n", "plt.legend(); plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "1e5fdb28", "metadata": {}, "source": [ "**Question 3.** Calculez la probabilité de dépasser +1,5°C, +2°C et +3°C en 2100 pour chaque scénario (à ce stade, avec 3 scénarios déterministes, la 'probabilité' est 0 ou 1 — discutez pourquoi une vraie distribution nécessite Monte Carlo)." ] }, { "cell_type": "code", "execution_count": null, "id": "c067cbd9", "metadata": {}, "outputs": [], "source": [ "# Expected output: tableau binaire 0/1 par scénario et seuil\n", "thresholds = [1.5, 2.0, 3.0]\n", "rows = []\n", "for name, (p, path) in ssp_paths.items():\n", " T_2100 = path[-1, p.i_T_AT]\n", " row = {'scenario': name, 'T_AT_2100': T_2100}\n", " for th in thresholds:\n", " row[f'P(T>{th})'] = int(T_2100 > th)\n", " rows.append(row)\n", "df_proba = pd.DataFrame(rows)\n", "df_proba" ] }, { "cell_type": "markdown", "id": "c773043e", "metadata": {}, "source": [ "## Partie 3 — Analyse des risques chroniques et aigus" ] }, { "cell_type": "markdown", "id": "c128e408", "metadata": {}, "source": [ "**Question 4.** Pour chaque scénario, calculez la première année de dépassement de +1,5°C et de +2°C. Présentez les résultats dans un tableau." ] }, { "cell_type": "code", "execution_count": null, "id": "7d719fd1", "metadata": {}, "outputs": [], "source": [ "# Expected output: SSP5 dépasse les seuils plus tôt que SSP1 ; certains scénarios ne dépassent jamais +2°C sur l'horizon simulé\n", "rows = []\n", "for name, (p, path) in ssp_paths.items():\n", " years = path[:, p.i_time]\n", " T = path[:, p.i_T_AT]\n", " row = {'scenario': name}\n", " for th in [1.5, 2.0]:\n", " above = years[T > th]\n", " row[f'année_depassement_{th}'] = int(above[0]) if len(above) > 0 else np.nan\n", " rows.append(row)\n", "df_years = pd.DataFrame(rows)\n", "df_years" ] }, { "cell_type": "markdown", "id": "d7346cb1", "metadata": {}, "source": [ "## Interprétation" ] }, { "cell_type": "markdown", "id": "904d1b8e", "metadata": {}, "source": [ "### Éléments de réponse\n", "\n", "- Les scénarios SSP se distinguent par leurs hypothèses socio-économiques (croissance de la productivité, démographie, intensité carbone), qui déterminent la trajectoire d'émissions et donc de température.\n", "- Avec seulement 3 trajectoires déterministes, la « probabilité » de dépassement d'un seuil est artificiellement binaire (0 ou 1) : elle ne reflète pas l'incertitude réelle (sensibilité climatique, hypothèses socio-économiques, variabilité naturelle). Une vraie distribution de probabilité nécessite un tirage Monte Carlo sur les paramètres incertains, ce qui est l'objet du TP5.\n", "- La distinction risques chroniques (élévation progressive du niveau moyen de température, montée des eaux) et risques aigus (événements extrêmes) est essentielle en actuariat : les scénarios SSP renseignent surtout sur la trajectoire moyenne (risques chroniques), alors que les risques aigus nécessitent des modèles complémentaires (catastrophe models)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.10" } }, "nbformat": 4, "nbformat_minor": 5 }