diff --git a/L3/Calculs Numériques/DM3.ipynb b/L3/Calculs Numériques/DM3.ipynb index d4c39f0..abfcf6a 100644 --- a/L3/Calculs Numériques/DM3.ipynb +++ b/L3/Calculs Numériques/DM3.ipynb @@ -715,10 +715,7 @@ " I_exact = 2 / (k + 1) if k % 2 == 0 else 0\n", " approx_error = np.abs(I_approx - I_exact)\n", " approx_errors.append(approx_error)\n", - " print(\n", - " f\"{N:5d} | \"\n", - " + \" \".join(f\"{e:.3f} \" for e in approx_errors)\n", - " )" + " print(f\"{N:5d} | \" + \" \".join(f\"{e:.3f} \" for e in approx_errors))" ] }, { @@ -773,10 +770,7 @@ " I_exact = 2 / (k + 1) if k % 2 == 0 else 0\n", " approx_error = np.abs(I_approx - I_exact)\n", " approx_errors.append(approx_error)\n", - " print(\n", - " f\"{N:5d} | \"\n", - " + \" \".join(f\"{e:.3f} \" for e in approx_errors)\n", - " )" + " print(f\"{N:5d} | \" + \" \".join(f\"{e:.3f} \" for e in approx_errors))" ] }, { diff --git a/L3/Calculs Numériques/Interpolation_2.ipynb b/L3/Calculs Numériques/Interpolation_2.ipynb index de1ea90..5989aad 100644 --- a/L3/Calculs Numériques/Interpolation_2.ipynb +++ b/L3/Calculs Numériques/Interpolation_2.ipynb @@ -333,6 +333,8 @@ "source": [ "def f(x):\n", " return 1 / (1 + x**2)\n", + "\n", + "\n", "a, b = -5, 5\n", "xx = np.linspace(a, b, 200)\n", "\n", @@ -375,6 +377,8 @@ "source": [ "def f(x):\n", " return 1 / (1 + x**2)\n", + "\n", + "\n", "a, b = -5, 5\n", "xx = np.linspace(a, b, 200)\n", "\n", diff --git a/L3/Calculs Numériques/Point_Fixe.ipynb b/L3/Calculs Numériques/Point_Fixe.ipynb index 9ffa61e..4772663 100644 --- a/L3/Calculs Numériques/Point_Fixe.ipynb +++ b/L3/Calculs Numériques/Point_Fixe.ipynb @@ -65,12 +65,20 @@ "source": [ "def f1(x):\n", " return np.exp(x) - 1 - x\n", + "\n", + "\n", "def f2(x):\n", " return x - np.sin(x)\n", + "\n", + "\n", "def f3(x):\n", " return x + np.sin(x)\n", + "\n", + "\n", "def f4(x):\n", " return x + np.cos(x) - 1\n", + "\n", + "\n", "def f5(x):\n", " return x - np.cos(x) + 1" ] diff --git a/M1/Numerical Methods/TP_DANJOU_Arthur.ipynb b/M1/Numerical Methods/TP_DANJOU_Arthur.ipynb index c1e64b3..55b131b 100644 --- a/M1/Numerical Methods/TP_DANJOU_Arthur.ipynb +++ b/M1/Numerical Methods/TP_DANJOU_Arthur.ipynb @@ -159,11 +159,15 @@ "\n", " for n in range(N - 1):\n", " p1 = f(vt[n], yn[:, n])\n", + "\n", " def F1(p2):\n", " return f(vt[n] + h / 3, yn[:, n] + h / 6 * (p1 + p2)) - p2\n", + "\n", " p2 = newton(F1, yn[:, n], fprime=None, tol=tol, maxiter=itmax)\n", + "\n", " def F2(yn1):\n", " return yn[:, n] + h / 4 * (3 * p2 + f(vt[n + 1], yn1)) - yn1\n", + "\n", " yn[:, n + 1] = newton(F2, yn[:, n], fprime=None, tol=tol, maxiter=itmax)\n", " return yn" ] diff --git a/M1/Numerical Optimisation/ComputerSession2.ipynb b/M1/Numerical Optimisation/ComputerSession2.ipynb index 687b975..365d0fb 100644 --- a/M1/Numerical Optimisation/ComputerSession2.ipynb +++ b/M1/Numerical Optimisation/ComputerSession2.ipynb @@ -66,6 +66,8 @@ "\n", "def f(x):\n", " return np.tanh(x)\n", + "\n", + "\n", "aL, aR = -20, 3\n", "print(dichotomy(f, aL, aR))" ] @@ -135,9 +137,15 @@ "\n", "def f(x):\n", " return np.log(np.exp(x) + np.exp(-x))\n", + "\n", + "\n", "x0 = 1.8\n", + "\n", + "\n", "def df(x):\n", " return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))\n", + "\n", + "\n", "print(Newton(f, df, x0))" ] }, @@ -188,6 +196,8 @@ "\n", "def f(x):\n", " return np.log(np.exp(x) + np.exp(-x))\n", + "\n", + "\n", "xx = [(1, 1.9), (1, 2.3), (1, 2.4)]\n", "\n", "for x0, x1 in xx:\n", @@ -265,8 +275,12 @@ "\n", "def f(x):\n", " return np.log(np.exp(x) + np.exp(-x))\n", + "\n", + "\n", "def df(x):\n", " return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))\n", + "\n", + "\n", "print(DichotomyNewton(f, df, -20, 3))" ] }, diff --git a/M1/Statistical Learning/TP2_KNN.ipynb b/M1/Statistical Learning/TP2_KNN.ipynb index 972399c..ea6653e 100644 --- a/M1/Statistical Learning/TP2_KNN.ipynb +++ b/M1/Statistical Learning/TP2_KNN.ipynb @@ -1412,7 +1412,10 @@ "f, axarr = plt.subplots(2, 3, sharex=\"col\", sharey=\"row\", figsize=(15, 12))\n", "\n", "for idx, clf, tt in zip(\n", - " product([0, 1, 2], [0, 1, 2]), KNNs, [f\"KNN (k={k})\" for k in nb_neighbors], strict=False\n", + " product([0, 1, 2], [0, 1, 2]),\n", + " KNNs,\n", + " [f\"KNN (k={k})\" for k in nb_neighbors],\n", + " strict=False,\n", "):\n", " Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n", " Z = Z.reshape(xx.shape)\n", diff --git a/M1/Statistical Learning/TP4_Ridge_Lasso_and_CV.ipynb b/M1/Statistical Learning/TP4_Ridge_Lasso_and_CV.ipynb index e4e9e51..59d535f 100644 --- a/M1/Statistical Learning/TP4_Ridge_Lasso_and_CV.ipynb +++ b/M1/Statistical Learning/TP4_Ridge_Lasso_and_CV.ipynb @@ -2545,7 +2545,9 @@ "\n", "MSEs = []\n", "for name, estimator in zip(\n", - " [\"LassoCV\", \"LassoBIC\", \"RidgeCV\", \"OLS\"], [lassoCV, lassoBIC, ridgeCV, linReg], strict=False\n", + " [\"LassoCV\", \"LassoBIC\", \"RidgeCV\", \"OLS\"],\n", + " [lassoCV, lassoBIC, ridgeCV, linReg],\n", + " strict=False,\n", "):\n", " y_pred = estimator.predict(Xtest)\n", " MSE = mean_squared_error(Ytest, y_pred)\n", diff --git a/M2/Deep Learning/TP1 - Dense/TP1 - Bonus Starter _ Régularisation.ipynb b/M2/Deep Learning/TP1 - Dense/TP1 - Bonus Starter _ Régularisation.ipynb index bcec6a8..be4321d 100644 --- a/M2/Deep Learning/TP1 - Dense/TP1 - Bonus Starter _ Régularisation.ipynb +++ b/M2/Deep Learning/TP1 - Dense/TP1 - Bonus Starter _ Régularisation.ipynb @@ -24,20 +24,29 @@ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", - "sns.set(style='whitegrid')\n", + "\n", + "sns.set(style=\"whitegrid\")\n", "\n", "import tensorflow as tf\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "from tensorflow import keras\n", "\n", - "(X_train_full, y_train_full), (X_test, y_test) = (keras.datasets.mnist.load_data())\n", - "X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full, train_size=0.8)\n", + "(X_train_full, y_train_full), (X_test, y_test) = keras.datasets.mnist.load_data()\n", + "X_train, X_valid, y_train, y_valid = train_test_split(\n", + " X_train_full, y_train_full, train_size=0.8\n", + ")\n", "\n", "scaler = StandardScaler()\n", - "X_train = scaler.fit_transform(X_train.astype(np.float32).reshape(-1, 28 * 28)).reshape(-1, 28, 28)\n", - "X_valid = scaler.transform(X_valid.astype(np.float32).reshape(-1, 28 * 28)).reshape(-1, 28, 28)\n", - "X_test = scaler.transform(X_test.astype(np.float32).reshape(-1, 28 * 28)).reshape(-1, 28, 28)" + "X_train = scaler.fit_transform(X_train.astype(np.float32).reshape(-1, 28 * 28)).reshape(\n", + " -1, 28, 28\n", + ")\n", + "X_valid = scaler.transform(X_valid.astype(np.float32).reshape(-1, 28 * 28)).reshape(\n", + " -1, 28, 28\n", + ")\n", + "X_test = scaler.transform(X_test.astype(np.float32).reshape(-1, 28 * 28)).reshape(\n", + " -1, 28, 28\n", + ")" ] }, { @@ -69,11 +78,15 @@ " [\n", " keras.layers.Input(shape=[28, 28]),\n", " keras.layers.Flatten(),\n", - " keras.layers.Dense(256, activation=\"relu\", kernel_regularizer=keras.regularizers.l2(0.001)),\n", - " keras.layers.Dense(128, activation=\"relu\", kernel_regularizer=keras.regularizers.l2(0.001)),\n", + " keras.layers.Dense(\n", + " 256, activation=\"relu\", kernel_regularizer=keras.regularizers.l2(0.001)\n", + " ),\n", + " keras.layers.Dense(\n", + " 128, activation=\"relu\", kernel_regularizer=keras.regularizers.l2(0.001)\n", + " ),\n", " keras.layers.Dense(10, activation=\"softmax\"),\n", " ]\n", - ")\n" + ")" ] }, { @@ -150,8 +163,16 @@ " [\n", " keras.layers.Input(shape=[28, 28]),\n", " keras.layers.Flatten(),\n", - " keras.layers.Dense(256, activation=\"relu\", kernel_regularizer=keras.regularizers.l2(lambda_l2)),\n", - " keras.layers.Dense(128, activation=\"relu\", kernel_regularizer=keras.regularizers.l2(lambda_l2)),\n", + " keras.layers.Dense(\n", + " 256,\n", + " activation=\"relu\",\n", + " kernel_regularizer=keras.regularizers.l2(lambda_l2),\n", + " ),\n", + " keras.layers.Dense(\n", + " 128,\n", + " activation=\"relu\",\n", + " kernel_regularizer=keras.regularizers.l2(lambda_l2),\n", + " ),\n", " keras.layers.Dense(10, activation=\"softmax\"),\n", " ]\n", " )\n", @@ -218,20 +239,28 @@ " lambda_l2 = result[\"lambda_l2\"]\n", "\n", " plt.subplot(1, 2, 1)\n", - " plt.plot(history_df[\"val_loss\"], label=f\"LR={learning_rate}, L2={lambda_l2}\", color=colors[_])\n", + " plt.plot(\n", + " history_df[\"val_loss\"],\n", + " label=f\"LR={learning_rate}, L2={lambda_l2}\",\n", + " color=colors[_],\n", + " )\n", " plt.plot(history_df[\"loss\"], linestyle=\"--\", color=colors[_])\n", " plt.xlabel(\"Epochs\")\n", " plt.ylabel(\"Loss\")\n", " plt.legend()\n", "\n", " plt.subplot(1, 2, 2)\n", - " plt.plot(history_df[\"val_accuracy\"], label=f\"LR={learning_rate}, L2={lambda_l2}\", color=colors[_])\n", + " plt.plot(\n", + " history_df[\"val_accuracy\"],\n", + " label=f\"LR={learning_rate}, L2={lambda_l2}\",\n", + " color=colors[_],\n", + " )\n", " plt.plot(history_df[\"accuracy\"], linestyle=\"--\", color=colors[_])\n", " plt.xlabel(\"Epochs\")\n", " plt.ylabel(\"Accuracy\")\n", " plt.legend()\n", "\n", - " plt.show()\n" + " plt.show()" ] }, { diff --git a/M2/Deep Learning/TP1 - Dense/TP1 - Starter.ipynb b/M2/Deep Learning/TP1 - Dense/TP1 - Starter.ipynb index 14f0adb..0266657 100644 --- a/M2/Deep Learning/TP1 - Dense/TP1 - Starter.ipynb +++ b/M2/Deep Learning/TP1 - Dense/TP1 - Starter.ipynb @@ -26,11 +26,11 @@ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", - "sns.set(style='whitegrid')\n", + "sns.set(style=\"whitegrid\")\n", "\n", "from tensorflow import keras\n", "\n", - "(X_train_full, y_train_full), (X_test, y_test) = (keras.datasets.mnist.load_data())" + "(X_train_full, y_train_full), (X_test, y_test) = keras.datasets.mnist.load_data()" ] }, { @@ -61,7 +61,7 @@ " X_train_full, y_train_full, test_size=0.2, random_state=42\n", ")\n", "print(X_train.shape, y_train.shape)\n", - "print(X_valid.shape, y_valid.shape)\n" + "print(X_valid.shape, y_valid.shape)" ] }, { @@ -88,9 +88,9 @@ } ], "source": [ - "plt.figure(figsize=(10,10))\n", + "plt.figure(figsize=(10, 10))\n", "for i in range(25):\n", - " plt.subplot(5,5,i+1)\n", + " plt.subplot(5, 5, i + 1)\n", " plt.xticks([])\n", " plt.yticks([])\n", " plt.grid(False)\n", @@ -174,13 +174,15 @@ "metadata": {}, "outputs": [], "source": [ - "model = keras.models.Sequential([\n", - " keras.layers.Input(shape=[28, 28]),\n", - " keras.layers.Flatten(),\n", - " keras.layers.Dense(256, activation=\"relu\"),\n", - " keras.layers.Dense(128, activation=\"relu\"),\n", - " keras.layers.Dense(10, activation=\"softmax\")\n", - "])" + "model = keras.models.Sequential(\n", + " [\n", + " keras.layers.Input(shape=[28, 28]),\n", + " keras.layers.Flatten(),\n", + " keras.layers.Dense(256, activation=\"relu\"),\n", + " keras.layers.Dense(128, activation=\"relu\"),\n", + " keras.layers.Dense(10, activation=\"softmax\"),\n", + " ]\n", + ")" ] }, { @@ -293,7 +295,7 @@ } ], "source": [ - "print(28*28)\n", + "print(28 * 28)\n", "print(256)\n", "print(128)\n", "print(10)\n", @@ -332,7 +334,7 @@ " loss=\"sparse_categorical_crossentropy\",\n", " optimizer=keras.optimizers.SGD(learning_rate=1e-3),\n", " metrics=[\"accuracy\"],\n", - ")\n" + ")" ] }, { @@ -379,7 +381,7 @@ " epochs=epochs,\n", " batch_size=batch_size,\n", " validation_data=(X_valid, y_valid),\n", - ")\n" + ")" ] }, { @@ -435,17 +437,17 @@ " plt.figure(figsize=(12, 4))\n", "\n", " plt.subplot(1, 2, 1)\n", - " plt.plot(history_df['loss'], label='Training Loss')\n", + " plt.plot(history_df[\"loss\"], label=\"Training Loss\")\n", " plt.plot(history_df[\"val_loss\"], label=\"Validation Loss\")\n", " plt.xlabel(\"Epochs\")\n", " plt.ylabel(\"Loss\")\n", " plt.legend()\n", "\n", " plt.subplot(1, 2, 2)\n", - " plt.plot(history_df['accuracy'], label='Accuracy')\n", + " plt.plot(history_df[\"accuracy\"], label=\"Accuracy\")\n", " plt.plot(history_df[\"val_accuracy\"], label=\"Validation Accuracy\")\n", - " plt.xlabel('Epochs')\n", - " plt.ylabel('Accuracy')\n", + " plt.xlabel(\"Epochs\")\n", + " plt.ylabel(\"Accuracy\")\n", " plt.legend()" ] }, @@ -645,7 +647,7 @@ " \"n_epochs\": n_epochs,\n", " \"history\": pd.DataFrame(history.history),\n", " }\n", - " results.append(result)\n" + " results.append(result)" ] }, { @@ -669,36 +671,27 @@ " learning_rate = result[\"learning_rate\"]\n", "\n", " plt.subplot(1, 2, 1)\n", + " plt.plot(history_df[\"val_loss\"], linestyle=\"--\", color=colors[_])\n", " plt.plot(\n", - " history_df[\"val_loss\"],\n", - " linestyle=\"--\",\n", - " color=colors[_]\n", - " )\n", - " plt.plot(\n", - " history_df[\"loss\"], label=f\"LR={learning_rate}\", alpha=0.5,\n", - " color=colors[_]\n", + " history_df[\"loss\"], label=f\"LR={learning_rate}\", alpha=0.5, color=colors[_]\n", " )\n", " plt.xlabel(\"Epochs\")\n", " plt.ylabel(\"Loss\")\n", " plt.legend()\n", "\n", " plt.subplot(1, 2, 2)\n", - " plt.plot(\n", - " history_df[\"val_accuracy\"],\n", - " linestyle=\"--\",\n", - " color=colors[_]\n", - " )\n", + " plt.plot(history_df[\"val_accuracy\"], linestyle=\"--\", color=colors[_])\n", " plt.plot(\n", " history_df[\"accuracy\"],\n", " label=f\"LR={learning_rate}\",\n", " alpha=0.5,\n", - " color=colors[_]\n", + " color=colors[_],\n", " )\n", " plt.xlabel(\"Epochs\")\n", " plt.ylabel(\"Accuracy\")\n", " plt.legend()\n", "\n", - " plt.show()\n" + " plt.show()" ] }, { @@ -767,7 +760,7 @@ " \"n_epochs\": n_epochs,\n", " \"history\": pd.DataFrame(history.history),\n", " }\n", - " results.append(result)\n" + " results.append(result)" ] }, { diff --git a/M2/Deep Learning/TP2 - Convolution/TP2 - Bonus Starter _ ResNet.ipynb b/M2/Deep Learning/TP2 - Convolution/TP2 - Bonus Starter _ ResNet.ipynb index b1f53a9..f037926 100644 --- a/M2/Deep Learning/TP2 - Convolution/TP2 - Bonus Starter _ ResNet.ipynb +++ b/M2/Deep Learning/TP2 - Convolution/TP2 - Bonus Starter _ ResNet.ipynb @@ -24,20 +24,30 @@ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", - "sns.set(style='whitegrid')\n", + "sns.set(style=\"whitegrid\")\n", "\n", "import tensorflow as tf\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "from tensorflow import keras\n", "\n", - "(X_train_full, y_train_full), (X_test, y_test) = (keras.datasets.fashion_mnist.load_data())\n", - "X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full, train_size=0.8)\n", + "(X_train_full, y_train_full), (X_test, y_test) = (\n", + " keras.datasets.fashion_mnist.load_data()\n", + ")\n", + "X_train, X_valid, y_train, y_valid = train_test_split(\n", + " X_train_full, y_train_full, train_size=0.8\n", + ")\n", "\n", "scaler = StandardScaler()\n", - "X_train = scaler.fit_transform(X_train.astype(np.float32).reshape(-1, 28 * 28)).reshape(-1, 28, 28, 1)\n", - "X_valid = scaler.transform(X_valid.astype(np.float32).reshape(-1, 28 * 28)).reshape(-1, 28, 28, 1)\n", - "X_test = scaler.transform(X_test.astype(np.float32).reshape(-1, 28 * 28)).reshape(-1, 28, 28, 1)" + "X_train = scaler.fit_transform(X_train.astype(np.float32).reshape(-1, 28 * 28)).reshape(\n", + " -1, 28, 28, 1\n", + ")\n", + "X_valid = scaler.transform(X_valid.astype(np.float32).reshape(-1, 28 * 28)).reshape(\n", + " -1, 28, 28, 1\n", + ")\n", + "X_test = scaler.transform(X_test.astype(np.float32).reshape(-1, 28 * 28)).reshape(\n", + " -1, 28, 28, 1\n", + ")" ] }, { diff --git a/M2/Deep Learning/TP2 - Convolution/TP2 - Starter.ipynb b/M2/Deep Learning/TP2 - Convolution/TP2 - Starter.ipynb index 521904a..7966c0e 100644 --- a/M2/Deep Learning/TP2 - Convolution/TP2 - Starter.ipynb +++ b/M2/Deep Learning/TP2 - Convolution/TP2 - Starter.ipynb @@ -26,11 +26,13 @@ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", - "sns.set(style='whitegrid')\n", + "sns.set(style=\"whitegrid\")\n", "\n", "from tensorflow import keras\n", "\n", - "(X_train_full, y_train_full), (X_test, y_test) = (keras.datasets.fashion_mnist.load_data())" + "(X_train_full, y_train_full), (X_test, y_test) = (\n", + " keras.datasets.fashion_mnist.load_data()\n", + ")" ] }, { @@ -186,7 +188,7 @@ " keras.layers.Dense(units=64, activation=\"relu\"),\n", " keras.layers.Dense(units=10, activation=\"softmax\"),\n", " ]\n", - ")\n" + ")" ] }, { @@ -627,10 +629,7 @@ " batch_size=batch_size,\n", " validation_data=(X_valid, y_valid),\n", " )\n", - " training_curves.append({\n", - " 'history': history,\n", - " 'normalization': normalized\n", - " })" + " training_curves.append({\"history\": history, \"normalization\": normalized})" ] }, { @@ -653,7 +652,9 @@ "metadata": {}, "outputs": [], "source": [ - "def agregate_result(results: list, normalized: bool, metric_name: str = 'accuracy') -> pd.DataFrame:\n", + "def agregate_result(\n", + " results: list, normalized: bool, metric_name: str = \"accuracy\"\n", + ") -> pd.DataFrame:\n", " train_curves = []\n", " val_curves = []\n", "\n", @@ -663,7 +664,7 @@ " train_curves.append(hist_obj.history[metric_name])\n", " val_curves.append(hist_obj.history[f\"val_{metric_name}\"])\n", "\n", - " return np.array(train_curves).flatten(), np.array(val_curves).flatten()\n" + " return np.array(train_curves).flatten(), np.array(val_curves).flatten()" ] }, { @@ -697,7 +698,9 @@ "for idx, metric in enumerate(metrics):\n", " ax = axs[idx]\n", " for normalized in [True, False]:\n", - " train, val = agregate_result(training_curves, normalized=normalized, metric_name=metric)\n", + " train, val = agregate_result(\n", + " training_curves, normalized=normalized, metric_name=metric\n", + " )\n", " train_runs = train.reshape(-1, epochs)\n", " val_runs = val.reshape(-1, epochs)\n", "\n", @@ -710,10 +713,22 @@ " label_prefix = \"With BN\" if normalized else \"Without BN\"\n", "\n", " ax.plot(mean_train, label=label_prefix, color=color, linestyle=\"-\")\n", - " ax.fill_between(range(epochs), mean_train - std_train, mean_train + std_train, color=color, alpha=0.2)\n", + " ax.fill_between(\n", + " range(epochs),\n", + " mean_train - std_train,\n", + " mean_train + std_train,\n", + " color=color,\n", + " alpha=0.2,\n", + " )\n", "\n", " ax.plot(mean_val, color=color, linestyle=\"--\")\n", - " ax.fill_between(range(epochs), mean_val - std_val, mean_val + std_val, color=color, alpha=0.2)\n", + " ax.fill_between(\n", + " range(epochs),\n", + " mean_val - std_val,\n", + " mean_val + std_val,\n", + " color=color,\n", + " alpha=0.2,\n", + " )\n", "\n", " ax.set_title(f\"Training and Validation {metric.capitalize()}\")\n", " ax.set_xlabel(\"Epochs\")\n", @@ -721,7 +736,7 @@ " ax.legend()\n", "\n", "plt.tight_layout()\n", - "plt.show()\n" + "plt.show()" ] }, { diff --git a/M2/Deep Learning/TP3 - Compléments/TP3 - Starter.ipynb b/M2/Deep Learning/TP3 - Compléments/TP3 - Starter.ipynb index 9f296cf..2948095 100644 --- a/M2/Deep Learning/TP3 - Compléments/TP3 - Starter.ipynb +++ b/M2/Deep Learning/TP3 - Compléments/TP3 - Starter.ipynb @@ -43,7 +43,7 @@ " 7: \"horse\",\n", " 8: \"ship\",\n", " 9: \"truck \",\n", - "}\n" + "}" ] }, { @@ -299,13 +299,21 @@ " model = keras.Sequential(\n", " [\n", " keras.layers.InputLayer(shape=(32, 32, 3)),\n", - " keras.layers.Conv2D(filters=32, kernel_size=3, activation=\"relu\", padding=\"same\"),\n", + " keras.layers.Conv2D(\n", + " filters=32, kernel_size=3, activation=\"relu\", padding=\"same\"\n", + " ),\n", " keras.layers.Dropout(0.2),\n", - " keras.layers.Conv2D(filters=32, kernel_size=3, activation=\"relu\", padding=\"same\"),\n", + " keras.layers.Conv2D(\n", + " filters=32, kernel_size=3, activation=\"relu\", padding=\"same\"\n", + " ),\n", " keras.layers.MaxPooling2D(pool_size=2),\n", - " keras.layers.Conv2D(filters=16, kernel_size=3, activation=\"relu\", padding=\"same\"),\n", + " keras.layers.Conv2D(\n", + " filters=16, kernel_size=3, activation=\"relu\", padding=\"same\"\n", + " ),\n", " keras.layers.Dropout(0.2),\n", - " keras.layers.Conv2D(filters=16, kernel_size=3, activation=\"relu\", padding=\"same\"),\n", + " keras.layers.Conv2D(\n", + " filters=16, kernel_size=3, activation=\"relu\", padding=\"same\"\n", + " ),\n", " keras.layers.Flatten(),\n", " keras.layers.Dense(10, activation=\"softmax\"),\n", " ]\n", @@ -316,7 +324,7 @@ "\n", "model = get_model()\n", "model.compile(optimizer=\"adam\", loss=\"categorical_crossentropy\", metrics=[\"accuracy\"])\n", - "model.summary()\n" + "model.summary()" ] }, { @@ -339,7 +347,9 @@ "metadata": {}, "outputs": [], "source": [ - "def compile_train(optimizer_function: str, learning_rate: float, **kwargs) -> keras.callbacks.History:\n", + "def compile_train(\n", + " optimizer_function: str, learning_rate: float, **kwargs\n", + ") -> keras.callbacks.History:\n", " model = get_model()\n", " optimizer = optimizer_function(learning_rate=learning_rate)\n", " model.compile(\n", @@ -388,9 +398,11 @@ } ], "source": [ - "epochs=5\n", - "batch_size=64\n", - "history_adam = compile_train(keras.optimizers.Adam, learning_rate=0.001, epochs=epochs, batch_size=batch_size)" + "epochs = 5\n", + "batch_size = 64\n", + "history_adam = compile_train(\n", + " keras.optimizers.Adam, learning_rate=0.001, epochs=epochs, batch_size=batch_size\n", + ")" ] }, { @@ -603,7 +615,7 @@ "plt.xlabel(\"Epochs\")\n", "plt.ylabel(\"Validation Loss\")\n", "plt.legend()\n", - "plt.show()\n" + "plt.show()" ] }, { diff --git a/M2/Machine Learning/TP_1/2025_TP_1_M2_ISF.ipynb b/M2/Machine Learning/TP_1/2025_TP_1_M2_ISF.ipynb index cc5401f..a4a66f0 100644 --- a/M2/Machine Learning/TP_1/2025_TP_1_M2_ISF.ipynb +++ b/M2/Machine Learning/TP_1/2025_TP_1_M2_ISF.ipynb @@ -60,11 +60,11 @@ } ], "source": [ - "print(3+4)\n", - "print(5*2.5)\n", + "print(3 + 4)\n", + "print(5 * 2.5)\n", "print(int)\n", "print(float)\n", - "a=2**90\n", + "a = 2**90\n", "print(a)\n", "print(type(a))" ] @@ -90,11 +90,11 @@ "\n", "import pandas as pd\n", "\n", - "#from math import *\n", - "#help(math)\n", - "print (math.sqrt(3))\n", - "print (math.floor(3.2))\n", - "print (math.cos(math.pi/3.0))" + "# from math import *\n", + "# help(math)\n", + "print(math.sqrt(3))\n", + "print(math.floor(3.2))\n", + "print(math.cos(math.pi / 3.0))" ] }, { @@ -121,11 +121,11 @@ } ], "source": [ - "print('33' + \"42\")\n", - "a=\"toto est toto\"\n", + "print(\"33\" + \"42\")\n", + "a = \"toto est toto\"\n", "a[4:]\n", - "#Tout est objet\n", - "print(a.split(' '))" + "# Tout est objet\n", + "print(a.split(\" \"))" ] }, { @@ -143,7 +143,9 @@ } ], "source": [ - "salutation = \"Bonjour, monsieur {}. Comment allez vous en ce {}?\".format(\"XX\", \"Mardi 19 septembre\")\n", + "salutation = \"Bonjour, monsieur {}. Comment allez vous en ce {}?\".format(\n", + " \"XX\", \"Mardi 19 septembre\"\n", + ")\n", "print(salutation)" ] }, @@ -195,12 +197,12 @@ } ], "source": [ - "a = [1,'q',2,3,5,8,'TOTO']\n", - "print (a[1])\n", - "print (a[-1])\n", - "print (a[1:3])\n", - "print (a[-4:-2])\n", - "print([5]*4)" + "a = [1, \"q\", 2, 3, 5, 8, \"TOTO\"]\n", + "print(a[1])\n", + "print(a[-1])\n", + "print(a[1:3])\n", + "print(a[-4:-2])\n", + "print([5] * 4)" ] }, { @@ -221,10 +223,10 @@ } ], "source": [ - "print (range(4, 10))\n", - "print (range(5, 50, 3))\n", - "print ([3,1,4] + [1,5,9])\n", - "print (len(range(4, 10)))" + "print(range(4, 10))\n", + "print(range(5, 50, 3))\n", + "print([3, 1, 4] + [1, 5, 9])\n", + "print(len(range(4, 10)))" ] }, { @@ -258,28 +260,28 @@ "source": [ "a = 2\n", "if 5 > a:\n", - " print (\"Cinq!\")\n", + " print(\"Cinq!\")\n", "else:\n", - " print (\"a!\")\n", + " print(\"a!\")\n", "\n", - "#Zoom sur indentation\n", - "num=3\n", + "# Zoom sur indentation\n", + "num = 3\n", "if num == 1:\n", - " print (\"C'est 1\")\n", + " print(\"C'est 1\")\n", "elif num == 2:\n", - " print (\"C'est 2\")\n", + " print(\"C'est 2\")\n", "elif num == 3:\n", - " print (\"C'est 3\")\n", - "else :\n", - " print (\"Autre que 1, 2 et 3\")\n", + " print(\"C'est 3\")\n", + "else:\n", + " print(\"Autre que 1, 2 et 3\")\n", "\n", - "print(num in [1,2,3])\n", - "print(num not in [1,2,3])\n", + "print(num in [1, 2, 3])\n", + "print(num not in [1, 2, 3])\n", "print(num != 5)\n", "\n", - "print(num in [1,2,3] and num >0)\n", + "print(num in [1, 2, 3] and num > 0)\n", "\n", - "print(not 5==3)" + "print(not 5 == 3)" ] }, { @@ -313,21 +315,21 @@ } ], "source": [ - "a=[3,4,5]\n", - "#Boucle for\n", + "a = [3, 4, 5]\n", + "# Boucle for\n", "for i in range(len(a)):\n", " a[i] += 3\n", - "print (a)\n", + "print(a)\n", "%timeit for i in range(len(a)):a[i] += 3\n", - "print (a)\n", + "print(a)\n", "\n", - "b=[3,4,5]\n", - "print([i+3 for i in b])\n", + "b = [3, 4, 5]\n", + "print([i + 3 for i in b])\n", "%timeit [i+3 for i in b]\n", - "print (b)\n", + "print(b)\n", "\n", - "for i,item in enumerate(b):\n", - " print(i,item)" + "for i, item in enumerate(b):\n", + " print(i, item)" ] }, { @@ -369,18 +371,18 @@ } ], "source": [ - "#Boucle While , break et continue\n", + "# Boucle While , break et continue\n", "print(\"démarrage boucle\")\n", - "i=0\n", - "while i<100:\n", + "i = 0\n", + "while i < 100:\n", " print(i)\n", - " i+=1\n", - " if i==52:\n", - " i+=10\n", + " i += 1\n", + " if i == 52:\n", + " i += 10\n", " print(\"increment de 10\")\n", " continue\n", - " i+=2\n", - " if i ==77:\n", + " i += 2\n", + " if i == 77:\n", " break" ] }, @@ -408,8 +410,10 @@ ], "source": [ "def square(x):\n", - " return x*x\n", - "print (square(3))" + " return x * x\n", + "\n", + "\n", + "print(square(3))" ] }, { @@ -486,14 +490,14 @@ } ], "source": [ - "#Ecrivez votre code ici\n", + "# Ecrivez votre code ici\n", "\n", - "serie = pd.Series({'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5})\n", + "serie = pd.Series({\"a\": 1, \"b\": 2, \"c\": 3, \"d\": 4, \"e\": 5})\n", "\n", "print(serie)\n", "print(serie.index)\n", "print(serie.mean())\n", - "print(serie['b'])\n", + "print(serie[\"b\"])\n", "print(serie.b)" ] }, @@ -594,11 +598,8 @@ } ], "source": [ - "#Ecrivez votre code ici\n", - "df = pd.DataFrame({\n", - " 's': s,\n", - " 't': t\n", - "})\n", + "# Ecrivez votre code ici\n", + "df = pd.DataFrame({\"s\": s, \"t\": t})\n", "\n", "print(df)" ] @@ -633,8 +634,8 @@ } ], "source": [ - "#Ecrivez votre code ici\n", - "df['SUM'] = df['s'] + df['t']\n", + "# Ecrivez votre code ici\n", + "df[\"SUM\"] = df[\"s\"] + df[\"t\"]\n", "\n", "print(df)" ] @@ -662,8 +663,8 @@ } ], "source": [ - "#Ecrivez votre code ici\n", - "print(df['SUM'].mean())" + "# Ecrivez votre code ici\n", + "print(df[\"SUM\"].mean())" ] }, { @@ -774,7 +775,7 @@ } ], "source": [ - "#Ecrivez votre code ici\n", + "# Ecrivez votre code ici\n", "import numpy as np\n", "\n", "X = np.random.standard_normal(size=250)\n", @@ -809,7 +810,7 @@ } ], "source": [ - "index = pd.date_range('2012-01-01', periods=250, freq='D')\n", + "index = pd.date_range(\"2012-01-01\", periods=250, freq=\"D\")\n", "\n", "serie = pd.Series(X, index=index)\n", "print(serie)" @@ -872,7 +873,7 @@ "metadata": {}, "outputs": [], "source": [ - "#Data frame\n", + "# Data frame\n", "import pandas as pd\n", "import plotly.express as px\n", "import plotly.graph_objects as gp\n", @@ -923,8 +924,8 @@ "metadata": {}, "outputs": [], "source": [ - "path = input_path + '/base_modelisation.csv'\n", - "data_set = pd.read_csv(path,sep=\";\",decimal=\",\")" + "path = input_path + \"/base_modelisation.csv\"\n", + "data_set = pd.read_csv(path, sep=\";\", decimal=\",\")" ] }, { @@ -2413,7 +2414,7 @@ } ], "source": [ - "#Dimensions\n", + "# Dimensions\n", "data_set.shape" ] }, @@ -2568,7 +2569,7 @@ } ], "source": [ - "#Liste des colonnes selon leur type\n", + "# Liste des colonnes selon leur type\n", "data_set.dtypes" ] }, @@ -2600,13 +2601,13 @@ } ], "source": [ - "#Ecrivez votre code ici\n", + "# Ecrivez votre code ici\n", "quantitatives = []\n", "categorielles = []\n", "binaires = []\n", "\n", "for col in data_set.columns:\n", - " if data_set[col].dtype in ['int64', 'float64']:\n", + " if data_set[col].dtype in [\"int64\", \"float64\"]:\n", " if len(data_set[col].dropna().unique()) == 2:\n", " binaires.append(col)\n", " else:\n", @@ -2619,7 +2620,7 @@ "\n", "print(\"Variables quantitatives :\", quantitatives)\n", "print(\"\\nVariables catégorielles :\", categorielles)\n", - "print(\"\\nVariables binaires :\", binaires)\n" + "print(\"\\nVariables binaires :\", binaires)" ] }, { @@ -2638,7 +2639,7 @@ } ], "source": [ - "#Ecrivez votre code ici\n", + "# Ecrivez votre code ici\n", "variables_avec_na = []\n", "\n", "for col in data_set.columns:\n", @@ -3524,8 +3525,10 @@ } ], "source": [ - "fig = px.histogram(data_set.sort_values('ANNEE_CTR'), x=\"ANNEE_CTR\")\n", - "fig.update_xaxes(type='category') #Cette ligne permet de forcer la variable comme variable catégorielle et non numérique\n", + "fig = px.histogram(data_set.sort_values(\"ANNEE_CTR\"), x=\"ANNEE_CTR\")\n", + "fig.update_xaxes(\n", + " type=\"category\"\n", + ") # Cette ligne permet de forcer la variable comme variable catégorielle et non numérique\n", "\n", "fig.show()" ] @@ -18655,8 +18658,13 @@ } ], "source": [ - "fig = px.histogram(data_set, x=\"CONTRAT_ANCIENNETE\",\n", - " category_orders={'CONTRAT_ANCIENNETE': ['(-1,0]','(0,1]',\"(1,2]\",\"(2,5]\",\"(5,10]\"]})\n", + "fig = px.histogram(\n", + " data_set,\n", + " x=\"CONTRAT_ANCIENNETE\",\n", + " category_orders={\n", + " \"CONTRAT_ANCIENNETE\": [\"(-1,0]\", \"(0,1]\", \"(1,2]\", \"(2,5]\", \"(5,10]\"]\n", + " },\n", + ")\n", "fig.show()" ] }, @@ -48890,8 +48898,13 @@ } ], "source": [ - "fig = px.histogram(data_set, x=\"GROUPE_KM\",\n", - " category_orders={'GROUPE_KM': [\"[0;20000[\",\"[20000;40000[\",\"[40000;60000[\",\"[60000;99999[\"]})\n", + "fig = px.histogram(\n", + " data_set,\n", + " x=\"GROUPE_KM\",\n", + " category_orders={\n", + " \"GROUPE_KM\": [\"[0;20000[\", \"[20000;40000[\", \"[40000;60000[\", \"[60000;99999[\"]\n", + " },\n", + ")\n", "fig.show()" ] }, @@ -64005,9 +64018,11 @@ } ], "source": [ - "#Ecrivez votre code ici\n", - "fig = px.histogram(data_set.sort_values('ZONE_RISQUE'), x=\"ZONE_RISQUE\")\n", - "fig.update_xaxes(type='category') #Cette ligne permet de forcer la variable comme variable catégorielle et non numérique\n", + "# Ecrivez votre code ici\n", + "fig = px.histogram(data_set.sort_values(\"ZONE_RISQUE\"), x=\"ZONE_RISQUE\")\n", + "fig.update_xaxes(\n", + " type=\"category\"\n", + ") # Cette ligne permet de forcer la variable comme variable catégorielle et non numérique\n", "\n", "fig.show()" ] @@ -64860,9 +64875,13 @@ } ], "source": [ - "#Ecrivez votre code ici\n", - "fig = px.histogram(data_set.sort_values('AGE_ASSURE_PRINCIPAL'), x=\"AGE_ASSURE_PRINCIPAL\")\n", - "fig.update_xaxes(type='category') #Cette ligne permet de forcer la variable comme variable catégorielle et non numérique\n", + "# Ecrivez votre code ici\n", + "fig = px.histogram(\n", + " data_set.sort_values(\"AGE_ASSURE_PRINCIPAL\"), x=\"AGE_ASSURE_PRINCIPAL\"\n", + ")\n", + "fig.update_xaxes(\n", + " type=\"category\"\n", + ") # Cette ligne permet de forcer la variable comme variable catégorielle et non numérique\n", "\n", "fig.show()" ] @@ -79977,9 +79996,11 @@ } ], "source": [ - "#Ecrivez votre code ici\n", - "fig = px.histogram(data_set.sort_values('GENRE'), x=\"GENRE\")\n", - "fig.update_xaxes(type='category') #Cette ligne permet de forcer la variable comme variable catégorielle et non numérique\n", + "# Ecrivez votre code ici\n", + "fig = px.histogram(data_set.sort_values(\"GENRE\"), x=\"GENRE\")\n", + "fig.update_xaxes(\n", + " type=\"category\"\n", + ") # Cette ligne permet de forcer la variable comme variable catégorielle et non numérique\n", "\n", "fig.show()" ] @@ -80010,14 +80031,19 @@ } ], "source": [ - "#Préparation des données : compter le nombre de femmes et hommes par âge\n", - "tmp = data_set[[\"AGE_ASSURE_PRINCIPAL\",\"GENRE\"]].value_counts().to_frame('counts').reset_index()\n", + "# Préparation des données : compter le nombre de femmes et hommes par âge\n", + "tmp = (\n", + " data_set[[\"AGE_ASSURE_PRINCIPAL\", \"GENRE\"]]\n", + " .value_counts()\n", + " .to_frame(\"counts\")\n", + " .reset_index()\n", + ")\n", "data_f = tmp[tmp[\"GENRE\"] == \"F\"]\n", "data_h = tmp[tmp[\"GENRE\"] == \"M\"]\n", "\n", - "#Comparaison des âges\n", - "list_1=sorted(data_f[\"AGE_ASSURE_PRINCIPAL\"].unique())\n", - "list_2=sorted(data_h[\"AGE_ASSURE_PRINCIPAL\"].unique())\n", + "# Comparaison des âges\n", + "list_1 = sorted(data_f[\"AGE_ASSURE_PRINCIPAL\"].unique())\n", + "list_2 = sorted(data_h[\"AGE_ASSURE_PRINCIPAL\"].unique())\n", "\n", "print(\"Eléments dans la liste 2 mais pas dans la liste 1 \")\n", "print(list(set(list_2) - set(list_1)))\n", @@ -80034,11 +80060,19 @@ "outputs": [], "source": [ "# Il faut ajouter l'âge 13 dans la liste 2 (data_h)\n", - "data_h = pd.concat([data_h, pd.DataFrame([[13, \"M\",0]],columns=['AGE_ASSURE_PRINCIPAL', 'GENRE','counts'])], ignore_index=True)\n", + "data_h = pd.concat(\n", + " [\n", + " data_h,\n", + " pd.DataFrame(\n", + " [[13, \"M\", 0]], columns=[\"AGE_ASSURE_PRINCIPAL\", \"GENRE\", \"counts\"]\n", + " ),\n", + " ],\n", + " ignore_index=True,\n", + ")\n", "\n", - "#On ordonne les dataframes\n", - "data_h = data_h.sort_values('AGE_ASSURE_PRINCIPAL', ascending = True)\n", - "data_f = data_f.sort_values('AGE_ASSURE_PRINCIPAL', ascending = True)" + "# On ordonne les dataframes\n", + "data_h = data_h.sort_values(\"AGE_ASSURE_PRINCIPAL\", ascending=True)\n", + "data_f = data_f.sort_values(\"AGE_ASSURE_PRINCIPAL\", ascending=True)" ] }, { @@ -80049,9 +80083,9 @@ "outputs": [], "source": [ "# Graphique\n", - "y_age = data_h['AGE_ASSURE_PRINCIPAL']\n", - "x_M = data_h['counts']\n", - "x_F = data_f['counts'] * -1" + "y_age = data_h[\"AGE_ASSURE_PRINCIPAL\"]\n", + "x_M = data_h[\"counts\"]\n", + "x_F = data_f[\"counts\"] * -1" ] }, { @@ -80907,23 +80941,21 @@ "fig = gp.Figure()\n", "\n", "# Ajout des données H\n", - "fig.add_trace(gp.Bar(y= y_age, x = x_M,\n", - " name = 'Hommes',\n", - " orientation = 'h'))\n", + "fig.add_trace(gp.Bar(y=y_age, x=x_M, name=\"Hommes\", orientation=\"h\"))\n", "\n", "# Ajout des données F\n", - "fig.add_trace(gp.Bar(y = y_age, x = x_F,\n", - " name = 'Femmes', orientation = 'h'))\n", + "fig.add_trace(gp.Bar(y=y_age, x=x_F, name=\"Femmes\", orientation=\"h\"))\n", "\n", "# layout du graphique\n", - "fig.update_layout(title = 'Population du portefeuille',\n", - " title_font_size = 22, barmode = 'relative',\n", - " bargap = 0.0, bargroupgap = 0,\n", - " xaxis = {'title': 'Count',\n", - " 'title_font_size': 14},\n", - " yaxis = {'title': 'Age',\n", - " 'title_font_size': 14}\n", - " )\n", + "fig.update_layout(\n", + " title=\"Population du portefeuille\",\n", + " title_font_size=22,\n", + " barmode=\"relative\",\n", + " bargap=0.0,\n", + " bargroupgap=0,\n", + " xaxis={\"title\": \"Count\", \"title_font_size\": 14},\n", + " yaxis={\"title\": \"Age\", \"title_font_size\": 14},\n", + ")\n", "\n", "fig.show()" ] @@ -81795,7 +81827,7 @@ } ], "source": [ - "fig = px.histogram(data_set[data_set['CHARGE'] >= 0], x=\"CHARGE\", nbins=50)\n", + "fig = px.histogram(data_set[data_set[\"CHARGE\"] >= 0], x=\"CHARGE\", nbins=50)\n", "fig.update_layout(title=\"Distribution des coûts des sinistres\")\n", "fig.show()" ] @@ -81859,8 +81891,8 @@ "# Nombre de NA par variable\n", "nan_count = pd.DataFrame(data_set.isna().sum(), columns=[\"Nombre_NA\"])\n", "\n", - "#Ajout du % par rapport à la taille de la BD\n", - "nan_count[\"Pourcentage\"]= nan_count.divide(data_set.shape[0])*100\n", + "# Ajout du % par rapport à la taille de la BD\n", + "nan_count[\"Pourcentage\"] = nan_count.divide(data_set.shape[0]) * 100\n", "\n", "print(nan_count)" ] @@ -82271,7 +82303,7 @@ "data_retraitee = data_set\n", "\n", "# Option 1 : Suppression des variables avec trop de NA (PUISSANCE_VEHICULE)\n", - "data_retraitee = data_retraitee.drop(\"PUISSANCE_VEHICULE\", axis='columns')\n", + "data_retraitee = data_retraitee.drop(\"PUISSANCE_VEHICULE\", axis=\"columns\")\n", "data_retraitee.head()" ] }, @@ -82293,14 +82325,22 @@ } ], "source": [ - "#Option 2 : Remplacer par la classe la plus représentée/valeur moyenne (GROUPE_KM,GENRE,\n", + "# Option 2 : Remplacer par la classe la plus représentée/valeur moyenne (GROUPE_KM,GENRE,\n", "# ANNEE_CONSTRUCTION,VALEUR_DU_BIEN,DEUXIEME_CONDUCTEUR)\n", "\n", - "data_retraitee[\"GROUPE_KM\"] = data_retraitee[\"GROUPE_KM\"].fillna(data_retraitee[\"GROUPE_KM\"].mode()[0])\n", + "data_retraitee[\"GROUPE_KM\"] = data_retraitee[\"GROUPE_KM\"].fillna(\n", + " data_retraitee[\"GROUPE_KM\"].mode()[0]\n", + ")\n", "data_retraitee[\"GENRE\"] = data_retraitee[\"GENRE\"].fillna(\"M\")\n", - "data_retraitee[\"ANNEE_CONSTRUCTION\"] = data_retraitee[\"ANNEE_CONSTRUCTION\"].fillna(data_retraitee[\"ANNEE_CONSTRUCTION\"].median())\n", - "data_retraitee[\"VALEUR_DU_BIEN\"] = data_retraitee[\"VALEUR_DU_BIEN\"].fillna(data_retraitee[\"VALEUR_DU_BIEN\"].mode()[0])\n", - "data_retraitee[\"DEUXIEME_CONDUCTEUR\"] = data_retraitee[\"DEUXIEME_CONDUCTEUR\"].fillna(False)" + "data_retraitee[\"ANNEE_CONSTRUCTION\"] = data_retraitee[\"ANNEE_CONSTRUCTION\"].fillna(\n", + " data_retraitee[\"ANNEE_CONSTRUCTION\"].median()\n", + ")\n", + "data_retraitee[\"VALEUR_DU_BIEN\"] = data_retraitee[\"VALEUR_DU_BIEN\"].fillna(\n", + " data_retraitee[\"VALEUR_DU_BIEN\"].mode()[0]\n", + ")\n", + "data_retraitee[\"DEUXIEME_CONDUCTEUR\"] = data_retraitee[\"DEUXIEME_CONDUCTEUR\"].fillna(\n", + " False\n", + ")" ] }, { @@ -82310,11 +82350,13 @@ "metadata": {}, "outputs": [], "source": [ - "#Option 3 : Remplacer par une valeur prudente (ZONE_RISQUE,DEUXIEME_CONDUCTEUR)\n", + "# Option 3 : Remplacer par une valeur prudente (ZONE_RISQUE,DEUXIEME_CONDUCTEUR)\n", "\n", - "#Remplacer par la zone avec le plus de sinistres\n", - "zone_plus_sinsitree = data_retraitee[[\"ZONE_RISQUE\", \"NB\"]].groupby([\"ZONE_RISQUE\"]).sum()\n", - "zone_plus_sinsitree.sort_values(\"NB\",ascending = False)\n", + "# Remplacer par la zone avec le plus de sinistres\n", + "zone_plus_sinsitree = (\n", + " data_retraitee[[\"ZONE_RISQUE\", \"NB\"]].groupby([\"ZONE_RISQUE\"]).sum()\n", + ")\n", + "zone_plus_sinsitree.sort_values(\"NB\", ascending=False)\n", "\n", "data_retraitee[\"ZONE_RISQUE\"] = data_retraitee[\"ZONE_RISQUE\"].fillna(\"C\")" ] @@ -82781,7 +82823,7 @@ } ], "source": [ - "data_retraitee.to_csv(\"./2_outputs/base_retraitee.csv\", index = False)" + "data_retraitee.to_csv(\"./2_outputs/base_retraitee.csv\", index=False)" ] }, { @@ -82809,11 +82851,11 @@ "metadata": {}, "outputs": [], "source": [ - "#Calcul de la fréquence\n", + "# Calcul de la fréquence\n", "data_retraitee[\"FREQ\"] = data_retraitee[\"NB\"] / data_retraitee[\"EXPO\"]\n", "data_retraitee[\"FREQ\"] = data_retraitee[\"FREQ\"].fillna(0)\n", "\n", - "#Calcul du coût moyen\n", + "# Calcul du coût moyen\n", "data_retraitee[\"CM\"] = data_retraitee[\"CHARGE\"] / data_retraitee[\"NB\"]\n", "data_retraitee[\"CM\"] = data_retraitee[\"CM\"].fillna(0)" ] @@ -82846,11 +82888,11 @@ "metadata": {}, "outputs": [], "source": [ - "#Agrégation selon la variable d'intérêt\n", - "plot_data = data_retraitee[[\"AGE_ASSURE_PRINCIPAL\", \"NB\",\"EXPO\"]]\n", + "# Agrégation selon la variable d'intérêt\n", + "plot_data = data_retraitee[[\"AGE_ASSURE_PRINCIPAL\", \"NB\", \"EXPO\"]]\n", "plot_data = plot_data.groupby([\"AGE_ASSURE_PRINCIPAL\"], as_index=False).sum()\n", "\n", - "#Calcul de la fréquence\n", + "# Calcul de la fréquence\n", "plot_data[\"FREQ\"] = plot_data[\"NB\"] / plot_data[\"EXPO\"]\n", "plot_data[\"FREQ\"] = plot_data[\"FREQ\"].fillna(0)" ] @@ -83706,8 +83748,10 @@ } ], "source": [ - "#Représentation graphique\n", - "fig = px.line(plot_data, x=\"AGE_ASSURE_PRINCIPAL\", y=\"FREQ\", title=\"Sinistralité selon l'âge\")\n", + "# Représentation graphique\n", + "fig = px.line(\n", + " plot_data, x=\"AGE_ASSURE_PRINCIPAL\", y=\"FREQ\", title=\"Sinistralité selon l'âge\"\n", + ")\n", "fig.show()" ] }, @@ -84567,16 +84611,16 @@ } ], "source": [ - "#Agrégation selon la variable d'intérêt\n", - "plot_data = data_retraitee[[\"GENRE\", \"NB\",\"EXPO\"]]\n", + "# Agrégation selon la variable d'intérêt\n", + "plot_data = data_retraitee[[\"GENRE\", \"NB\", \"EXPO\"]]\n", "plot_data = plot_data.groupby([\"GENRE\"], as_index=False).sum()\n", "\n", - "#Calcul de la fréquence\n", + "# Calcul de la fréquence\n", "plot_data[\"FREQ\"] = plot_data[\"NB\"] / plot_data[\"EXPO\"]\n", "plot_data[\"FREQ\"] = plot_data[\"FREQ\"].fillna(0)\n", "print(plot_data)\n", "\n", - "#Représentation graphique\n", + "# Représentation graphique\n", "fig = px.scatter(plot_data, x=\"GENRE\", y=\"FREQ\", title=\"Sinistralité selon le genre\")\n", "fig.show()" ] @@ -84608,17 +84652,22 @@ } ], "source": [ - "#Agrégation selon la variable d'intérêt\n", - "plot_data = data_retraitee[[\"ZONE_RISQUE\", \"NB\",\"EXPO\"]]\n", + "# Agrégation selon la variable d'intérêt\n", + "plot_data = data_retraitee[[\"ZONE_RISQUE\", \"NB\", \"EXPO\"]]\n", "plot_data = plot_data.groupby([\"ZONE_RISQUE\"], as_index=False).sum()\n", "\n", - "#Calcul de la fréquence\n", + "# Calcul de la fréquence\n", "plot_data[\"FREQ\"] = plot_data[\"NB\"] / plot_data[\"EXPO\"]\n", "plot_data[\"FREQ\"] = plot_data[\"FREQ\"].fillna(0)\n", "print(plot_data)\n", "\n", - "#Représentation graphique\n", - "fig = px.scatter(plot_data, x=\"ZONE_RISQUE\", y=\"FREQ\", title=\"Sinistralité selon la zone géographique\")\n", + "# Représentation graphique\n", + "fig = px.scatter(\n", + " plot_data,\n", + " x=\"ZONE_RISQUE\",\n", + " y=\"FREQ\",\n", + " title=\"Sinistralité selon la zone géographique\",\n", + ")\n", "fig.show()" ] }, @@ -85479,17 +85528,19 @@ } ], "source": [ - "#Agrégation selon la variable d'intérêt\n", - "plot_data = data_retraitee[[\"ENERGIE\", \"NB\",\"EXPO\"]]\n", + "# Agrégation selon la variable d'intérêt\n", + "plot_data = data_retraitee[[\"ENERGIE\", \"NB\", \"EXPO\"]]\n", "plot_data = plot_data.groupby([\"ENERGIE\"], as_index=False).sum()\n", "\n", - "#Calcul de la fréquence\n", + "# Calcul de la fréquence\n", "plot_data[\"FREQ\"] = plot_data[\"NB\"] / plot_data[\"EXPO\"]\n", "plot_data[\"FREQ\"] = plot_data[\"FREQ\"].fillna(0)\n", "print(plot_data)\n", "\n", - "#Représentation graphique\n", - "fig = px.scatter(plot_data, x=\"ENERGIE\", y=\"FREQ\", title=\"Sinistralité selon le carburant\")\n", + "# Représentation graphique\n", + "fig = px.scatter(\n", + " plot_data, x=\"ENERGIE\", y=\"FREQ\", title=\"Sinistralité selon le carburant\"\n", + ")\n", "fig.show()" ] }, @@ -86353,18 +86404,20 @@ } ], "source": [ - "#Agrégation selon la variable d'intérêt\n", - "plot_data = data_retraitee[[\"VALEUR_DU_BIEN\", \"CHARGE\",\"NB\"]]\n", - "plot_data= plot_data[plot_data['CHARGE'] > 0]\n", + "# Agrégation selon la variable d'intérêt\n", + "plot_data = data_retraitee[[\"VALEUR_DU_BIEN\", \"CHARGE\", \"NB\"]]\n", + "plot_data = plot_data[plot_data[\"CHARGE\"] > 0]\n", "plot_data = plot_data.groupby([\"VALEUR_DU_BIEN\"], as_index=False).sum()\n", "\n", - "#Calcul du CM\n", + "# Calcul du CM\n", "plot_data[\"CM\"] = plot_data[\"CHARGE\"] / plot_data[\"NB\"]\n", "plot_data[\"CM\"] = plot_data[\"CM\"].fillna(0)\n", "print(plot_data)\n", "\n", - "#Représentation graphique\n", - "fig = px.scatter(plot_data, x=\"VALEUR_DU_BIEN\", y=\"CM\", title=\"Coût moyen selon le prix\")\n", + "# Représentation graphique\n", + "fig = px.scatter(\n", + " plot_data, x=\"VALEUR_DU_BIEN\", y=\"CM\", title=\"Coût moyen selon le prix\"\n", + ")\n", "fig.show()" ] }, @@ -87227,18 +87280,23 @@ } ], "source": [ - "#Agrégation selon la variable d'intérêt\n", - "plot_data = data_retraitee[[\"ANNEE_CONSTRUCTION\", \"CHARGE\",\"NB\"]]\n", - "plot_data= plot_data[plot_data['CHARGE'] > 0]\n", + "# Agrégation selon la variable d'intérêt\n", + "plot_data = data_retraitee[[\"ANNEE_CONSTRUCTION\", \"CHARGE\", \"NB\"]]\n", + "plot_data = plot_data[plot_data[\"CHARGE\"] > 0]\n", "plot_data = plot_data.groupby([\"ANNEE_CONSTRUCTION\"], as_index=False).sum()\n", "\n", - "#Calcul du CM\n", + "# Calcul du CM\n", "plot_data[\"CM\"] = plot_data[\"CHARGE\"] / plot_data[\"NB\"]\n", "plot_data[\"CM\"] = plot_data[\"CM\"].fillna(0)\n", "print(plot_data)\n", "\n", - "#Représentation graphique\n", - "fig = px.line(plot_data, x=\"ANNEE_CONSTRUCTION\", y=\"CM\", title=\"Coût moyen selon l'ancienneté du bien\")\n", + "# Représentation graphique\n", + "fig = px.line(\n", + " plot_data,\n", + " x=\"ANNEE_CONSTRUCTION\",\n", + " y=\"CM\",\n", + " title=\"Coût moyen selon l'ancienneté du bien\",\n", + ")\n", "fig.show()" ] }, @@ -88098,18 +88156,23 @@ } ], "source": [ - "#Agrégation selon la variable d'intérêt\n", - "plot_data = data_retraitee[[\"AGE_ASSURE_PRINCIPAL\", \"CHARGE\",\"NB\"]]\n", - "plot_data= plot_data[plot_data['CHARGE'] > 0]\n", + "# Agrégation selon la variable d'intérêt\n", + "plot_data = data_retraitee[[\"AGE_ASSURE_PRINCIPAL\", \"CHARGE\", \"NB\"]]\n", + "plot_data = plot_data[plot_data[\"CHARGE\"] > 0]\n", "plot_data = plot_data.groupby([\"AGE_ASSURE_PRINCIPAL\"], as_index=False).sum()\n", "\n", - "#Calcul du CM\n", + "# Calcul du CM\n", "plot_data[\"CM\"] = plot_data[\"CHARGE\"] / plot_data[\"NB\"]\n", "plot_data[\"CM\"] = plot_data[\"CM\"].fillna(0)\n", "print(plot_data)\n", "\n", - "#Représentation graphique\n", - "fig = px.scatter(plot_data, x=\"AGE_ASSURE_PRINCIPAL\", y=\"CM\", title=\"Coût moyen selon l'âge de l'assuré\")\n", + "# Représentation graphique\n", + "fig = px.scatter(\n", + " plot_data,\n", + " x=\"AGE_ASSURE_PRINCIPAL\",\n", + " y=\"CM\",\n", + " title=\"Coût moyen selon l'âge de l'assuré\",\n", + ")\n", "fig.show()" ] }, @@ -88969,18 +89032,20 @@ } ], "source": [ - "#Agrégation selon la variable d'intérêt\n", - "plot_data = data_retraitee[[\"GENRE\", \"CHARGE\",\"NB\"]]\n", - "plot_data= plot_data[plot_data['CHARGE'] > 0]\n", + "# Agrégation selon la variable d'intérêt\n", + "plot_data = data_retraitee[[\"GENRE\", \"CHARGE\", \"NB\"]]\n", + "plot_data = plot_data[plot_data[\"CHARGE\"] > 0]\n", "plot_data = plot_data.groupby([\"GENRE\"], as_index=False).sum()\n", "\n", - "#Calcul du CM\n", + "# Calcul du CM\n", "plot_data[\"CM\"] = plot_data[\"CHARGE\"] / plot_data[\"NB\"]\n", "plot_data[\"CM\"] = plot_data[\"CM\"].fillna(0)\n", "print(plot_data)\n", "\n", - "#Représentation graphique\n", - "fig = px.scatter(plot_data, x=\"GENRE\", y=\"CM\", title=\"Coût moyen selon l'âge de l'assuré\")\n", + "# Représentation graphique\n", + "fig = px.scatter(\n", + " plot_data, x=\"GENRE\", y=\"CM\", title=\"Coût moyen selon l'âge de l'assuré\"\n", + ")\n", "fig.show()" ] }, diff --git a/M2/Machine Learning/TP_2/2025_TP_2_M2_ISF.ipynb b/M2/Machine Learning/TP_2/2025_TP_2_M2_ISF.ipynb index 219d332..2c1f48f 100644 --- a/M2/Machine Learning/TP_2/2025_TP_2_M2_ISF.ipynb +++ b/M2/Machine Learning/TP_2/2025_TP_2_M2_ISF.ipynb @@ -1,7009 +1,7009 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "8750d15b", - "metadata": {}, - "source": [ - "# Cours 2 : Algorithmes non supervisés " - ] - }, - { - "cell_type": "markdown", - "id": "f7c08ae5", - "metadata": {}, - "source": [ - "## Préambule" - ] - }, - { - "cell_type": "markdown", - "id": "ec7ecb4b", - "metadata": {}, - "source": [ - "Les objectifs de cette séance (3h) sont :\n", - "* Mettre en application un modèle non-supervisé (K-means et C.A.H)" - ] - }, - { - "cell_type": "markdown", - "id": "4e99c600", - "metadata": {}, - "source": [ - "## Préparation du workspace" - ] - }, - { - "cell_type": "markdown", - "id": "c1b01045", - "metadata": {}, - "source": [ - "### Import de librairies " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f6e62631", - "metadata": {}, - "outputs": [], - "source": [ - "# Données\n", - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "# Graphiques\n", - "import seaborn as sns\n", - "\n", - "sns.set()\n", - "import matplotlib.pyplot as plt # noqa: E402\n", - "import plotly.express as px\n", - "import plotly.graph_objects as gp\n", - "from scipy.cluster.hierarchy import dendrogram, linkage # noqa: E402\n", - "\n", - "# Statistiques\n", - "from scipy.stats import chi2_contingency # noqa: E402, F401\n", - "\n", - "# Machine Learning\n", - "from sklearn.cluster import AgglomerativeClustering, KMeans # noqa: E402\n" - ] - }, - { - "cell_type": "markdown", - "id": "985e4e97", - "metadata": {}, - "source": [ - "### Constantes" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "c9597b48", - "metadata": {}, - "outputs": [], - "source": [ - "input_path = \"./1_inputs\"\n", - "output_path = \"./2_outputs\"" - ] - }, - { - "cell_type": "markdown", - "id": "b2ff398d", - "metadata": {}, - "source": [ - "## Exercice (implémentation des exercices du support de cours)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ea2a0164", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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ItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMhKxcPN+vXrY/r06TFp0qTYZ5994pxzzom6urotbvPqq6/GKaecEuPGjYsDDjggrr/++mhoaGhev27durjmmmvi4IMPLp7zyCOPjEcffbTSuw4AZKDi4ebiiy+Oxx9/PG644Ya48847Y/HixXH66ae32/6dd96JE044ofj5nnvuKba/++674/vf/35zm+985ztx//33xz//8z/HvffeG1OmTImvf/3rMWfOnErvPgDQzfWs5JMtW7asCB8333xz7LvvvsWya6+9NqZNmxZPP/100euyuYcffjhee+21+MlPfhLbbbddjBw5Mt5888248sor4ytf+UrRg5Oe87vf/W586lOfKrY59dRTi2Dz85//PPbbb79K/hcAgG6uouFm/vz5xeP+++/fvGzXXXeNYcOGxdy5c9sMN/PmzYu99tqrCDZN0vZvv/12LFy4MEaNGlWEpY9//OMttqutrY36+voPtL89e7buuOrRo7bFI+1Tq45Rr/KpVfnUqnxqVT21qnjPzaBBg6JPnz4tlg8dOjSWLl3a5jZp+fDhw1u1T5YsWRJjxowp5uFs6tlnn40nnngiLrzwwve9r7W1NTFo0IB21w8c2O99P3e1UauOUa/yqVX51Kp8apV/rToUbtLE30MOOaTd9WeccUb07t271fIUdtJE47akycIDBw5s1T5pa5s0h+drX/ta7L333nHUUUfF+9XYWIr6+jWtlqeUml7M+vq10dDQ+L6fvxqoVceoV/nUqnxqVT616v61SvtUTm9Sh8JNGl568MEH210/e/bs2LBhQ6vlKaT069d2+uvbt2+rbZpCTf/+/Vssf+qpp4r5NqmnJw1V9erVKz6IjRvbf8HSi7ml9bxLrTpGvcqnVuVTq/KpVf616lC4SWFixIgR7a5/7rnnYuXKlUVY2bQHZ/ny5UUwaksKKs8//3yLZal9suk2jzzySJx77rnFMNVNN90U2267bUd2HQCoEhWdKTR+/PhobGxsnlicvPjii8VcnAkTJrS5TVq+YMGCYgJxkzSfZsCAATF69Oji99/85jdx1llnxeTJk+O2224TbACADyfcpJ6Www47rJjomy7VThN/zz777Jg4cWKMHTu2aJN6dV5//fXmoah0z5ohQ4bEmWeeGYsWLYpZs2YVl48ff/zxRe/PqlWr4rzzziuuqLrggguK39P26V/qJQIA2FTFr/G69NJLi7sTp5vspZvz7bbbbjFjxozm9el+N+nqp/TYNHn41ltvLXp80gThdHfjo48+uphbk/z2t78tLvl+5pln4qCDDiq2bfp32mmnVXr3AYBurqZUKpWiSidJ1dWtbvPeN+kS8RUrVnfLSVQfJrXqGPUqn1qVT63Kp1bdv1aDBw8o62qp7nl3HgCAdgg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyUvFws379+pg+fXpMmjQp9tlnnzjnnHOirq5ui9u8+uqrccopp8S4cePigAMOiOuvvz4aGhrabJueK7W54YYbKr3rAEAGKh5uLr744nj88ceL8HHnnXfG4sWL4/TTT2+3/TvvvBMnnHBC8fM999xTbH/33XfH97///TbbX3jhhfH6669XercBgEz0rOSTLVu2LO699964+eabY9999y2WXXvttTFt2rR4+umni56czT388MPx2muvxU9+8pPYbrvtYuTIkfHmm2/GlVdeGV/5yleid+/ezW3//d//PV566aUYMmRIJXcbAMhIRcPN/Pnzi8f999+/edmuu+4aw4YNi7lz57YZbubNmxd77bVXEWyapO3ffvvtWLhwYYwZM6ZY9uKLL8bVV18dd9xxR5x22mkV2d+ePVt3XPXoUdvikfapVceoV/nUqnxqVT61qp5aVbznZtCgQdGnT58Wy4cOHRpLly5tc5u0fPjw4a3aJ0uWLCnCTRq6SnN30vBVCkKVUFtbE4MGDWh3/cCB/Sryd6qBWnWMepVPrcqnVuVTq/xr1aFwkyb+HnLIIe2uP+OMM1oMIzVJYSdNNG7LunXrYuDAga3aJ03bzJgxo1h20kknRaU0Npaivn5Nq+UppaYXs75+bTQ0NFbs7+VIrTpGvcqnVuVTq/KpVfevVdqncnqTOhRu0vDSgw8+2O762bNnx4YNG1otTyGlX7+201/fvn1bbdMUavr37x9PPvlkMcH4l7/8ZfTo0SMqaePG9l+w9GJuaT3vUquOUa/yqVX51Kp8apV/rToUbnr16hUjRoxod/1zzz0XK1euLMLKpj04y5cvL4JRW9KQ1PPPP99iWWqfpG1SsFmzZk389V//dfP6tWvXxi233BK//vWv44EHHujIfwEAyFxF59yMHz8+Ghsbi4nF6T43SZoInObiTJgwoc1t0vJ0hVWaQLzNNtsUy5544okYMGBAjB49Os4999ziqqlNfelLX4qpU6fGcccdV8ndBwAyUNFp0Kmn5bDDDivuRTNnzpx49tln4+yzz46JEyfG2LFjizapVyfdp6ZpKGrKlCnFpd1nnnlmLFq0KGbNmlVcPn788ccXvT877LBDfPSjH23xr2fPnsXVVTvttFMldx8AyEDFr/G69NJLi16br3/968XVTbvttlsxIbhJut9NusNwekzSROFbb7216PE56qijirsbH3300XHqqadWetcAgCpQUyqVSlGlk6Tq6la3ee+bdIn4ihWru+Ukqg+TWnWMepVPrcqnVuVTq+5fq8GDB5R1tVT3vDsPAEA7hBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICs1pVKpFFUo/bcbG9v+r/foURsNDY0f+j51R2rVMepVPrUqn1qVT626d61qa2uipqbmPdtVbbgBAPJkWAoAyIpwAwBkRbgBALIi3AAAWRFuAICsCDcAQFaEGwAgK8INAJAV4QYAyIpwAwBkRbgBALIi3AAAWRFuAICsCDebaGxsjBkzZsSBBx4YY8eOjZNOOileeeWVzt6tLmnZsmUxatSoVv9+8YtfdPaudSm33HJLfOlLX2qxbOHChXHMMccUx9jBBx8cP/rRjzpt/7p6rS688MJWx1iqWTVauXJlXHTRRXHQQQfFuHHj4otf/GLMmzevef3vfve7OPLII2PMmDExbdq0eOCBB6JavVetjjvuuFbH1ebHXrV488034xvf+Ebsv//+sc8++8TJJ58cL7zwQvc/X5VodsMNN5T222+/0n/8x3+UFi5cWDr++ONLU6dOLa1fv76zd63L+c///M/SJz7xidKyZctKy5cvb/63du3azt61LuPHP/5xafTo0aVjjjmmeVldXV1xjJ1//vmlP/3pT6Wf/exnRR3TYzVrq1bJ5z//+dK1117b4hh78803S9XouOOOK332s58tzZ07t7R48eLS9OnTS3vvvXfphRdeKI6ldBylWqWfb7311tKee+5Z+q//+q9SNdpSrZJJkyaVZs6c2eK4WrFiRakafeELXyj93d/9XemZZ54pjp3TTjutdMABB5TWrFnTrc9Xws2fpQCzzz77lO66667mZatWrSreEPfff3+n7ltX9IMf/KB0+OGHd/ZudElLly4tnXLKKaWxY8eWpk2b1uID++abby5OHO+8807zsmuuuaYI0dVoS7VqbGwslj/yyCOlavfSSy+VRo4cWZo3b16L+kyZMqV0/fXXl7797W8XQXBTZ599dvEFrdq8V63eeOONYv0f/vCHUrVbuXJlcZw899xzzcvSF/tUnxR2uvP5yrDUny1atChWr14dkyZNal42cODA2HPPPWPu3Lmdum9d0XPPPRcjRozo7N3okv7whz9Er1694le/+lUxRLCp1DU+ceLE6NmzZ/Oy1B380ksvxRtvvBHVZku1+t///d9Ys2ZN7LbbblHtBg0aFD/4wQ/iE5/4RPOympqa4l99fX1xXG167mo6rubPn5++wEY1ea9apXNX+nnXXXeNarfddtvFNddcEyNHjix+r6urizvuuCOGDx8eu+++e7c+Xwk3f7Z06dLicccdd2yxfOjQoc3reNfzzz9fvBH+4R/+IT75yU8WY9q//e1vO3u3uoQ0Ln3DDTfERz7ykVbr0rGUThybH2PJkiVLotpsqVbpGEv+7d/+rWg3ZcqUuOSSS+Ktt96KapO+aH3qU5+K3r17Ny97+OGH4+WXXy7mCLZ3XK1duzZWrFgR1eS9apWOq2233bY4ltKcnDQ/6frrr48NGzZENfv2t79dBOQ0V+tf/uVfon///t36fCXc/Fk6CSSbviGSPn36xPr16ztpr7qmjRs3xuLFi2PVqlVx2mmnFd+S0mSzNBEtTWqkfevWrWvzGEscZy2lD6Ha2triZHrzzTfHt771rXj88cfj1FNPLSb/V7Onnnoqzj///Jg6dWpMnjy5zeOq6fdq/9DevFbpuErvtb333jtuvfXW+OpXvxo//elPi8nr1ezYY4+Nn//85/HZz342vva1rxW9qt35fPVuX1OV69u3b/OJoOnnphewX79+nbhnXU/qopwzZ0706NGjuVYf//jH449//GPcdtttrbrHeVeq1+YfNk0nifRNiXelD52jjz66GGZIUtf5kCFD4qijjor/+Z//aTWMVS1mzZoV5557bnEV0NVXX938gbP5cdX0ezWfv9qqVeqxOe+884ohmabjKg2NnnXWWfHNb34z/uIv/iKq0e677148pl6bZ555Jn784x936/OVnps/axqOWr58eYvl6fdhw4Z10l51XQMGDGgRApM99tijuESc9qUu3raOscRx1lLqtWkKNpseY0m1DhWnD5zUW/rpT3+66M1q+hadzl9tHVfpAygNwVSj9mqVvpw1BZtqP67q6uqKYajUG7/p+y4FnXT8dOfzlXDzZ6NHj45tttmm6JFokiafLViwICZMmNCp+9bVpB6a9E1o01olv//975vTP21Lx1Ka5NnQ0NC87IknnigmN+6www6dum9dTfoW/Y//+I8tlqUem6Qaj7OZM2fGpZdeWsxzu/baa1sMF+y7777x5JNPtmifjqv0Pk0fVtVmS7VK97NJw1SbH1ep9+ZjH/tYVJM33ngjzj777BbTCd55553icy9dMNKdz1fVd9S3Ix386UZFqevy0UcfLa6eSt2UKbmmsVrelQ76dAVL6t5Ns+nTDZ8uu+yy+O///u9iKIH2/e3f/m28/fbbccEFF8Sf/vSn4qaH6eqEU045pbN3rcv5zGc+U5x0b7zxxuLKqdmzZ8c//dM/FXMCqu1KvRdffDG++93vxl/91V8Vx0r6UHr99deLf2mCdfrAfvbZZ4vzV3o/3n777fHrX/86TjzxxKg271WrdFzdd999cffddxc3aX3wwQfjyiuvjBNOOKH4gltNRo4cWUyq/s53vlNcFZzmI6W5bemLffpi0Z3PVzXpevDO3omuIqXTlPLTC5gmUqXUmu5yufPOO3f2rnU56YSRLiF87LHHijdCumQ+jW2nb5C8K50o/u///q+44qdJ+hBK49rp21GaQ3L88ccXwbratVWrhx56qJiwniawp+GVww8/PM4888zmIYZqkYZVrrvuujbXfe5zn4vLL7+8uFrxqquuKi7TTeesNCRz6KGHRrUpp1Z33XVX8S+Fm6Z5XOmCiGrs5XrrrbeKc3man5R+Tufw9F5sGqrrrucr4QYAyEr1xVQAIGvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAIic/P+otduPdHIbxgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Défintion de E\n", - "x = [1, 2, 18, 20, 31]\n", - "\n", - "#Représentation graphique\n", - "y=[0, 0, 0, 0, 0]\n", - "plt.scatter(x, y)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "5e4abc23", - "metadata": {}, - "source": [ - "### K-means : Question 1 " - ] - }, - { - "cell_type": "markdown", - "id": "5dea6f90", - "metadata": {}, - "source": [ - "**Déterminer la partition optimale par k-means en prenant pour centres initiaux les éléments 1, 2, 18**" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "41cc10ba", - "metadata": {}, - "outputs": [], - "source": [ - "#Définition des centres initiaux\n", - "init_points = np.array([1, 2, 18])\n", - "\n", - "#Itinitialisation algo\n", - "kmeans = KMeans(init=init_points.reshape(-1,1),\n", - " n_clusters=3,\n", - " n_init = 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "54857e7b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
KMeans(init=array([[ 1],\n",
-                            "       [ 2],\n",
-                            "       [18]]), n_clusters=3, n_init=1)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" - ], - "text/plain": [ - "KMeans(init=array([[ 1],\n", - " [ 2],\n", - " [18]]), n_clusters=3, n_init=1)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Transformation des données : plusieurs échantillons de 1 dimension\n", - "data_x = np.array(x)\n", - "data_x = data_x.reshape(-1,1)\n", - "\n", - "# Fitting\n", - "kmeans.fit(data_x)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "72efd783", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 1.],\n", - " [ 2.],\n", - " [23.]])" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Centroides finaux\n", - "final_centroids = kmeans.cluster_centers_\n", - "labels = kmeans.labels_\n", - "\n", - "final_centroids" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "3110c8ca", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGgCAYAAABWo0bIAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJ4JJREFUeJzt3At0VNXZ//FnJgkhCQSDAuEFtVwEXlDuoLGIKBT5i7ZKrVaLWhDEG8jNCy9IuXjlLiALLVC0ClTFgi5RWGiL2pY7hVZuFZBKTQiQhEBuJJnzX3uXGRJmBiY4IZlnvp+1spLsc87MyTMnZ36z9z7H5TiOIwAAAEq4q3oHAAAAwolwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAECVWIlS5t6FHk/g+xe63a6gy1AetaoY6hU6ahU6ahU6ahXZtTL75HK5zrte1IYb84JlZeX5tcfGuiUlJUlyc/OlpMRTJfsWKahVxVCv0FGr0FGr0FGryK9V3bpJEhNz/nDDsBQAAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAlUoJNx6PR2bPni033HCDtG/fXgYPHizfffdd0PWzs7Nl1KhR0qVLF+natatMnDhRCgoKAq576tQpuf322+XZZ5+tjF0HAAARrlLCzbx582TJkiUyefJkWbZsmQ07gwYNssEkkGHDhsnBgwdl8eLF8uqrr8q6detkwoQJAdedMmWK7N27tzJ2GwAAKBD2cGMCzKJFi2xg6dGjh7Rq1UpmzpwpGRkZsmbNGr/1t23bJhs3bpRXXnlF2rRpI2lpaTJp0iRZuXKlHD58uNy6X375pXzyySdy1VVXhXu3AQCAEmEPN7t375a8vDwbUrySk5OldevWsmnTJr/1N2/eLPXq1ZNmzZr52szQlMvlki1btvjasrKyZMyYMbY3KCUlJdy7DQAAlIgN9wOaHhqjYcOG5drr16/vW1aW6Z05e90aNWrIJZdcIunp6b62sWPHyk033SQ333yz/O53vwvLvsbG+me7mBh3ue8IjlpVDPUKHbUKHbUKHbWKnlqFPdx4JwKbgFJWfHy8HD9+POD6Z6/rXb+oqMj+bObt7Nu3T6ZPnx62/XS7XZKSkhR0eXJyQtieSztqVTHUK3TUKnTUKnTUSn+twh5uatas6Zt74/3ZMEElIcG/SGadQBONzfqJiYmyf/9+mTp1qixcuND+Hi4ejyO5ufl+7SalmhczN7dASks9YXs+jahVxVCv0FGr0FGr0FGryK+V2adQepPCHm68Q0yZmZlyxRVX+NrN7y1btvRbPzU1VdauXVuuzYSdnJwcO5S1atUqO4dnwIABvuWFhYWydetWWb16tZ2QfKFKSoK/YObFPNdynEGtKoZ6hY5ahY5ahY5a6a9V2MONuTqqVq1asmHDBl+4yc3NlZ07d0r//v391jf3tpk2bZq9FPzKK6+0bebqKaNTp05y/fXX2/valDV69Ggbisx3AACASg03Zv6MCTEmsNStW1caNWpkh5VMGOndu7eUlpbaK59q165th6TatWsnHTt2lBEjRth72+Tn58v48ePljjvukAYNGtjHNJOLyzLbJSUl+cIQAACAV6VMgzb3uLnrrrtk3Lhxcu+990pMTIydMxMXF2evgOrWrZsdbjLMJd9z586Vxo0by4MPPijDhw+X7t27B72JHwAAwLm4HMdxJErHEbOy8gJeHm6uosrOzovIccaLiVpVDPUKHbUKHbUKHbWK/FrVrZsU0oTiyLyAHQAAIAjCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUqZRw4/F4ZPbs2XLDDTdI+/btZfDgwfLdd98FXT87O1tGjRolXbp0ka5du8rEiROloKCg3OMtWLBAbrnlFvt4ffv2lffee68ydh0AAES4Sgk38+bNkyVLlsjkyZNl2bJlNpwMGjRITp06FXD9YcOGycGDB2Xx4sXy6quvyrp162TChAm+5a+//rr9evLJJ+XDDz+UBx54wC5fsWJFZew+AACIYGEPNybALFq0yAaWHj16SKtWrWTmzJmSkZEha9as8Vt/27ZtsnHjRnnllVekTZs2kpaWJpMmTZKVK1fK4cOH7TpLly6VgQMHyq233ipXXHGF3HPPPfKzn/2M3hsAAFD54Wb37t2Sl5dnQ4pXcnKytG7dWjZt2uS3/ubNm6VevXrSrFkzX5sZmnK5XLJlyxbb62OCz5133ll+x91uyc3NDffuAwCACBcb7gc0PTRGw4YNy7XXr1/ft6ws0ztz9ro1atSQSy65RNLT022IKRuUjO+//14+/vhj+eUvf/mD9jU21j/bxcS4y31HcNSqYqhX6KhV6KhV6KhV9NQq7OHGOxHYBJSy4uPj5fjx4wHXP3td7/pFRUV+7UePHrUTlC+99FJ59NFHL3g/3W6XpKQkBV2enJxwwY8dbahVxVCv0FGr0FGr0FEr/bUKe7ipWbOmb+6N92fDBJWEBP8imXUCTTQ26ycmJpZr279/vzz88MNSWloqb731lh3uulAejyO5ufl+7SalmhczN7dASks9F/z40YBaVQz1Ch21Ch21Ch21ivxamX0KpTcp7OHGO8SUmZlpJ/96md9btmzpt35qaqqsXbu2XJsJOzk5OXYoy8vMvzE9NQ0aNLCXhZvvP1RJSfAXzLyY51qOM6hVxVCv0FGr0FGr0FEr/bUK+2CauTqqVq1asmHDBl+bmfi7c+dOex+bs5k2MxfHXAruZa6eMjp16mS/79ixw15KftVVV8k777wTlmADAAB0CnvPjZk/079/f5k2bZrUrVtXGjVqJFOnTrU9NL1797ZDSllZWVK7dm07JNWuXTvp2LGjjBgxwt67Jj8/X8aPHy933HGHDTElJSUyevRoO8fm5ZdftsNVR44csc8VExNjnwMAAKDSwo1h7nFjQsm4ceOksLDQ9s4sXLhQ4uLi5NChQ9KzZ0956aWXpF+/fvaS77lz59q7Ej/44IN2InGfPn1kzJgxvl4bb69Or169yj2PCU6ff/55ZfwJAAAgQrkcx3EkSscRs7LyAl4ebq6iys7Oi8hxxouJWlUM9QodtQodtQodtYr8WtWtmxTShOLIvIAdAAAgCMINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFSJrYwH9Xg8MnfuXHnvvffkxIkT0qVLFxk/frxcfvnlAdfPzs6W559/Xr744gtxuVzSt29fefrppyUhIcG3zieffCJz5syRQ4cOSdOmTeWZZ56RtLQ0qQ7yTxTIl3/4i3z5/t/kZNZJSW3aQHo+cKN0uqWDuGPOnR/zi4tl1bd7ZdWBvZJdWCiNayfLHc3+V3o0/pHEuMmeQHUX6/xT4j3vSpxsF0dqSLGruxS67hKPq2GlPm+Ms1dqmuf1bBHPkVipKWmS7/xCPK7A51mgsrmcHIl3Vki8s1pcki8l0kyK3HdJsaSJuFwXeV8cxwn3g5pg8/bbb8vLL78sqampMnXqVBtKPvroI6lRo4bf+vfff78UFBTIxIkTJTc3V8aOHWsD0SuvvGKXr1+/XgYNGmQDz49//GN5//337eOvWLFCmjVrdkH7WFrqkaysPL/22Fi3pKQkSXZ2npSUeM77OEe+OyqT73hFjv3nmNhCOmIDjafUI51uaS9PLnxMYuMCZ8jM/Dx59LOP5D8nc+3vZnu3yyUex5HrGjaWqTfcIjViYqS6qmitoh310lermp7FkuTMEUdixCWlts2xHeKxcsI9S4pd11bK88Z73pMkx5wf3WWe15wrXHLC/bIUu26qlOeNdJFyXEVirWKcfZLseVhcYt7PPGKijPf/olB+JnnucSKuH/6BvW7dJIk5T6eBEfaugVOnTsmiRYtk2LBh0qNHD2nVqpXMnDlTMjIyZM2aNX7rb9u2TTZu3GiDTJs2bWxvzKRJk2TlypVy+PBhu85vf/tb6dWrlzzwwAM2zJheG7Pum2++KVXJ5MJZD70mWenZYiPi6Zhogo2xdc12+eOMj4JuP+4vayU974TdzJswTbAxNqQfktd3bKr8PwLABYlzNthgY3gDxn9/Nv//xVLbM1JcTnbYnzfW+YcNNi5xznpe83OJ1PY8K24nPezPCwTlmOPuSROt7fHv7aPxHp/xslLinfflYgp7uNm9e7fk5eWVGzJKTk6W1q1by6ZN/m/Wmzdvlnr16pXrgenatasdntqyZYsd4tq6davfENS1114b8PEupn1b98uB7Qd9YSZQ+Fm98DMpLir2W7Y3+6hsP3pYSoN0nJnW5d/slIIS/20BVL2anrdP95b4M8FDpEjinQ8r4XmXBT11//dNxSPxzvKwPy8QTJx8JTGSXi5sl+eSBOf35k1RInbOjemhMRo2LD/eXL9+fd+yskzvzNnrmqGrSy65RNLT0+0wVX5+vh3eCuXxKtrtdjZvd1co3V671+/1DUEFk388XzL2ZUiTtleWa//70YzT3XbBFZSUyIET2dK2Xvm/vbqoSK1AvbTVKq50yzlO5oaZgbNFSmIHhPl5N57zec0n5xqySYoDnN+iXSQcV5FYq/iSreJIrLikJGjYj5HvJS72mDiu+hKR4cbMnTHOnlsTHx8vx48fD7h+oHk4Zv2ioiIpLCwM+nhm+YVyu112PDGY5OQzk5mDSUjw3+9gj3X2c5ltTe/U+aY81a7tv211E0qtcAb10lErz3k+W5kPL3FxMWH///VkukznTEjzJRB5x1Uk1sqTGyeSf/7HqlMnUVwxSZEZbmrWrOmbe+P92TBBpOzVT2XXN+uezayfmJhoQ4z38c5eHujxQuXxOJKb6/9qmJRqXszc3AI76fhcmnRocs5eGyMxOUFqp15iJ2WV9b/Jl/nm1wSTEBsrqTGJfttWFxWpFaiXtlolujpJrLMhaC+KmRFTWNpeToX5/zdBOkucrD3H87qlyNNJiqrpeaMqRcJxFYm1ii1tK0lBem28/wseaSgnjyeKuH7YcWn2KZTepLCHG+8QU2ZmplxxxRW+dvN7y5Yt/dY3w01r164t12aCTE5Ojh16MsNTJuSY7csyvzdo0OAH7eu5ZoCbF/N8M8SbtG8iP2p7pfz76+8ChhyX2yW9B/YUd2ys32M1T64rbS9rIF8fyww478ZcA3Fn89YS54qp9rP6Q6kVzqBeOmpV4LpPkp2/Bj2Zm2mUBc5PxQnz/hfIvVJDVp/jed1S4PxcPNW0btVBdT6uIrFWJc6PpaakilsyT0+oP5sjha5fSYnN4xen7mEfeDRXR9WqVUs2bNjgazPzZnbu3Gkv7z6baTNzZw4ePOhrM1dPGZ06dbJDNx07dvS1eZnH79y5s1Qls28jFj4uKamX2J+9vPe2ad+zrfQb9dOg2z//456SmljLN7Pcbnv6ty6p/yOPtvWvF4DqodiVJnmux+3PZScW//fnODnhniaOKyXsz1viukZOup4J8rxuOel+qdLvsQOU4zK3PnhVHKltew69H9e9x2eR3C6FrrvlYgp7z42ZG9O/f3+ZNm2a1K1bVxo1amTvc2N6aHr37i2lpaWSlZUltWvXtkNS7dq1s+FlxIgRMmHCBDt52Nzw74477vD1zAwYMEAefvhhe8VV9+7dZfny5bJr1y554YUXpKrVu+IyeeXPk2Tdsr/IV+/9VU5m50lq0/py8/09pMutHc95E78GibXk9//v5/YGfh8f2Cs5RYXSqNZ/b+J30+VNJJab+AHVWqF7oJQ4XezN9GLtTfzipNh14+mb+P1PpT1vkftuKXHa/vcmfrJFYmJi5ZTvJn7lL14ALoZSV3PJcS+XeOePvpv4lUpzKbQ38btex038TICZMWOGfPDBB3ZCsPcOxY0bN7Y38+vZs6e89NJL0q9fP7v+sWPH7A38vvzySzvHpk+fPjJmzBjffBvD3LBv3rx5tpenefPm8tRTT/2gOxSH6yZ+0YxaVQz1Ch21Ch21Ch21ivxahXoTv0oJN5GAcPPDUauKoV6ho1aho1aho1aRX6squ0MxAABAVSLcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFAl7OGmqKhIJk6cKGlpadKhQwcZNWqUZGVlnXObQ4cOyZAhQ6Rjx47SrVs3mTVrlpSWlvqWFxYWyvTp0+Xmm2+2j9mvXz/57LPPwr3rAABAgbCHmwkTJshXX30lc+bMkTfffFP2798vw4YNC7p+cXGxPPTQQ/bnZcuW2e2XLl0qr732mm+d559/Xj766CP5zW9+IytWrJBevXrJE088IRs2bAj37gMAgAgXG84HO3z4sA0f8+fPl86dO9u2GTNmSJ8+fWTbtm221+Vsq1evlu+//17effddqVOnjrRo0UKOHTsmU6ZMkUceecT24JjHfPHFF+XGG2+02zz22GM22CxfvlyuvfbacP4JAAAgwoU13GzZssV+v+6663xtTZo0kQYNGsimTZsChpvNmzdLmzZtbLDxMtufPHlSdu3aJS1btrRh6eqrry63ndvtltzc3B+0v7Gx/h1XMTHuct8RHLWqGOoVOmoVOmoVOmoVPbUKe89NSkqKxMfHl2uvX7++ZGRkBNzGtKempvqtb6Snp0u7du3sPJyyduzYIevXr5dx48Zd8L663S5JSUkKujw5OeGCHzvaUKuKoV6ho1aho1aho1b6a1WhcGMm/vbs2TPo8ieffFJq1Kjh127CjploHIiZLJycnOy3vhFoGzOH5/HHH5e2bdvK3XffLRfK43EkNzffr92kVPNi5uYWSGmp54IfPxpQq4qhXqGjVqGjVqGjVpFfK7NPofQmVSjcmOGlVatWBV2+bt06OXXqlF+7CSkJCYHTX82aNf228YaaxMTEcu1bt261821MT48ZqoqLi5MfoqQk+AtmXsxzLccZ1KpiqFfoqFXoqFXoqJX+WlUo3Jgw0axZs6DL9+zZIzk5OTaslO3ByczMtMEoEBNU9u7dW67NrG+U3WbNmjUyevRoO0w1b948qV27dkV2HQAARImwzhTq1KmTeDwe38Ri48CBA3YuTpcuXQJuY9p37txpJxB7mfk0SUlJ0qpVK/v7559/LiNGjJAePXrIwoULCTYAAODihBvT09K3b1870ddcqm0m/o4cOVK6du0q7du3t+uYXp0jR474hqLMPWvq1asnw4cPl927d8vatWvt5eMDBw60vT/Hjx+XZ555xl5RNXbsWPu72d58mV4iAACAssJ+jdfkyZPt3YnNTfbMzfmaNm0qs2fP9i0397sxVz+Z797JwwsWLLA9PmaCsLm78X333Wfn1hhffPGFveR7+/bt0r17d7ut92vo0KHh3n0AABDhXI7jOBKlk6SysvIC3vvGXCKenZ0XkZOoLiZqVTHUK3TUKnTUKnTUKvJrVbduUkhXS0Xm3XkAAACCINwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3AAAAFUINwAAQJWwh5uioiKZOHGipKWlSYcOHWTUqFGSlZV1zm0OHTokQ4YMkY4dO0q3bt1k1qxZUlpaGnBd81hmnTlz5oR71wEAgAJhDzcTJkyQr776yoaPN998U/bv3y/Dhg0Lun5xcbE89NBD9udly5bZ7ZcuXSqvvfZawPXHjRsnR44cCfduAwAAJWLD+WCHDx+WFStWyPz586Vz5862bcaMGdKnTx/Ztm2b7ck52+rVq+X777+Xd999V+rUqSMtWrSQY8eOyZQpU+SRRx6RGjVq+Nb9wx/+IN9++63Uq1cvnLsNAAAUCWu42bJli/1+3XXX+dqaNGkiDRo0kE2bNgUMN5s3b5Y2bdrYYONltj958qTs2rVL2rVrZ9sOHDgg06ZNk8WLF8vQoUPDsr+xsf4dVzEx7nLfERy1qhjqFTpqFTpqFTpqFT21CnvPTUpKisTHx5drr1+/vmRkZATcxrSnpqb6rW+kp6fbcGOGrszcHTN8ZYJQOLjdLklJSQq6PDk5ISzPEw2oVcVQr9BRq9BRq9BRK/21qlC4MRN/e/bsGXT5k08+WW4YycuEHTPROJDCwkJJTk72W9/wbjN79mzbNnjwYAkXj8eR3Nx8v3aTUs2LmZtbIKWlnrA9n0bUqmKoV+ioVeioVeioVeTXyuxTKL1JFQo3Znhp1apVQZevW7dOTp065dduQkpCQuD0V7NmTb9tvKEmMTFRNm7caCcY//GPf5SYmBgJp5KS4C+YeTHPtRxnUKuKoV6ho1aho1aho1b6a1WhcBMXFyfNmjULunzPnj2Sk5Njw0rZHpzMzEwbjAIxQ1J79+4t12bWN8w2Jtjk5+fLT3/6U9/ygoICef311+XTTz+Vjz/+uCJ/AgAAUC6sc246deokHo/HTiw297kxzERgMxenS5cuAbcx7eYKKzOBuFatWrZt/fr1kpSUJK1atZLRo0fbq6bKuv/++6V3794yYMCAcO4+AABQIKzToE1PS9++fe29aDZs2CA7duyQkSNHSteuXaV9+/Z2HdOrY+5T4x2K6tWrl720e/jw4bJ7925Zu3atvXx84MCBtvfn0ksvlSuvvLLcV2xsrL26qlGjRuHcfQAAoEDYr/GaPHmy7bV54okn7NVNTZs2tROCvcz9bswdhs13w0wUXrBgge3xufvuu+3dje+77z557LHHwr1rAAAgCrgcx3EkSidJZWXlBbz3jblEPDs7LyInUV1M1KpiqFfoqFXoqFXoqFXk16pu3aSQrpaKzLvzAAAABEG4AQAAqhBuAACAKoQbAACgCuEGAACoQrgBAACqEG4AAIAqhBsAAKAK4QYAAKhCuAEAAKoQbgAAgCqEGwAAoArhBgAAqEK4AQAAqhBuAACAKoQbAACgCuEGAACoQrgBAACqEG4AAIAqhBsAAKAK4QYAAKhCuAEAAKoQbgAAgCqEGwAAoArhBgAAqEK4AQAAqhBuAACAKoQbAACgCuEGAACoQrgBAACqEG4AAIAqhBsAAKAK4QYAAKhCuAEAAKoQbgAAgCqEGwAAoArhBgAAqEK4AQAAqhBuAACAKoQbAACgCuEGAACoQrgBAACquBzHcSQKmT/b4wn8p8fEuKW01HPR9ykSUauKoV6ho1aho1aho1aRXSu32yUul+u860VtuAEAADoxLAUAAFQh3AAAAFUINwAAQBXCDQAAUIVwAwAAVCHcAAAAVQg3AABAFcINAABQhXADAABUIdwAAABVCDcAAEAVwg0AAFCFcAMAAFQh3JTh8Xhk9uzZcsMNN0j79u1l8ODB8t1331X1blVLhw8flpYtW/p9ffDBB1W9a9XK66+/Lvfff3+5tl27dkn//v3tMXbzzTfLW2+9VWX7V91rNW7cOL9jzNQsGuXk5Mj48eOle/fu0rFjR7n33ntl8+bNvuV/+9vfpF+/ftKuXTvp06ePfPzxxxKtzlerAQMG+B1XZx970eLYsWPy1FNPyXXXXScdOnSQhx9+WPbt2xf55ysHPnPmzHGuvfZa509/+pOza9cuZ+DAgU7v3r2doqKiqt61aufPf/6zc8011ziHDx92MjMzfV8FBQVVvWvVxttvv+20atXK6d+/v68tKyvLHmNjxoxxvvnmG+f999+3dTTfo1mgWhl33XWXM2PGjHLH2LFjx5xoNGDAAOe2225zNm3a5Ozfv9+ZOHGi07ZtW2ffvn32WDLHkamV+XnBggVO69atnb/+9a9ONDpXrYy0tDRnyZIl5Y6r7OxsJxrdc889zi9+8Qtn+/bt9tgZOnSo061bNyc/Pz+iz1eEm9NMgOnQoYPzzjvv+NqOHz9u/yE++uijKt236uiNN95wbr/99qrejWopIyPDGTJkiNO+fXunT58+5d6w58+fb08cxcXFvrbp06fbEB2NzlUrj8dj29esWeNEu2+//dZp0aKFs3nz5nL16dWrlzNr1iznueees0GwrJEjR9oPaNHmfLU6evSoXf7111870S4nJ8ceJ3v27PG1mQ/2pj4m7ETy+YphqdN2794teXl5kpaW5mtLTk6W1q1by6ZNm6p036qjPXv2SLNmzap6N6qlr7/+WuLi4uTDDz+0QwRlma7xrl27SmxsrK/NdAd/++23cvToUYk256rVv//9b8nPz5emTZtKtEtJSZE33nhDrrnmGl+by+WyX7m5ufa4Knvu8h5XW7ZsMR9gJZqcr1bm3GV+btKkiUS7OnXqyPTp06VFixb296ysLFm8eLGkpqZK8+bNI/p8Rbg5LSMjw35v2LBhufb69ev7luGMvXv32n+EX/3qV3L99dfbMe0vvviiqnerWjDj0nPmzJHLL7/cb5k5lsyJ4+xjzEhPT5doc65amWPM+P3vf2/X69Wrl0yaNElOnDgh0cZ80LrxxhulRo0avrbVq1fLwYMH7RzBYMdVQUGBZGdnSzQ5X63McVW7dm17LJk5OWZ+0qxZs+TUqVMSzZ577jkbkM1crRdeeEESExMj+nxFuDnNnASMsv8QRnx8vBQVFVXRXlVPJSUlsn//fjl+/LgMHTrUfkoyk83MRDQzqRHBFRYWBjzGDI6z8sybkNvttifT+fPny7PPPitfffWVPPbYY3byfzTbunWrjBkzRnr37i09evQIeFx5f4/2N+2za2WOK/O/1rZtW1mwYIE8+uij8t5779nJ69HswQcflOXLl8ttt90mjz/+uO1VjeTz1Zm+pihXs2ZN34nA+7P3BUxISKjCPat+TBflhg0bJCYmxlerq6++Wv71r3/JwoUL/brHcYap19lvNt6ThPmkhDPMm859991nhxkM03Ver149ufvuu+Uf//iH3zBWtFi7dq2MHj3aXgU0bdo03xvO2ceV9/doPn8FqpXpsXnmmWfskIz3uDJDoyNGjJCnn35aLrvsMolGzZs3t99Nr8327dvl7bffjujzFT03p3mHozIzM8u1m98bNGhQRXtVfSUlJZULgcZVV11lLxFHcKaLN9AxZnCclWd6bbzBpuwxZkTrULF5wzG9pTfddJPtzfJ+ijbnr0DHlXkDMkMw0ShYrcyHM2+wifbjKisryw5Dmd74sv93JuiY4yeSz1eEm9NatWoltWrVsj0SXmby2c6dO6VLly5Vum/VjemhMZ+EytbK+Oc//+lL/wjMHEtmkmdpaamvbf369XZy46WXXlql+1bdmE/Rv/71r8u1mR4bIxqPsyVLlsjkyZPtPLcZM2aUGy7o3LmzbNy4sdz65rgy/6fmzSranKtW5n42Zpjq7OPK9N786Ec/kmhy9OhRGTlyZLnpBMXFxfZ9z1wwEsnnq+g76oMwB7+5UZHpuvzss8/s1VOmm9IkVzNWizPMQW+uYDHdu2Y2vbnh00svvSR///vf7VACgvv5z38uJ0+elLFjx8o333xjb3pork4YMmRIVe9atXPLLbfYk+7cuXPtlVPr1q2T//u//7NzAqLtSr0DBw7Iiy++KD/5yU/ssWLelI4cOWK/zARr84a9Y8cOe/4y/4+LFi2STz/9VAYNGiTR5ny1MsfVypUrZenSpfYmratWrZIpU6bIQw89ZD/gRpMWLVrYSdXPP/+8vSrYzEcyc9vMB3vzwSKSz1cucz14Ve9EdWHSqUn55gU0E6lMajV3uWzcuHFV71q1Y04Y5hLCL7/80v4jmEvmzdi2+QSJM8yJ4j//+Y+94sfLvAmZcW3z6cjMIRk4cKAN1tEuUK0++eQTO2HdTGA3wyu33367DB8+3DfEEC3MsMrMmTMDLrvzzjvl5ZdftlcrTp061V6ma85ZZkjm1ltvlWgTSq3eeecd+2XCjXcel7kgIhp7uU6cOGHP5WZ+kvnZnMPN/6J3qC5Sz1eEGwAAoEr0xVQAAKAa4QYAAKhCuAEAAKoQbgAAgCqEGwAAoArhBgAAqEK4AQAAqhBuAACAKoQbAACgCuEGAACoQrgBAACiyf8HmqT8cidZhlkAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Représentation Graphique\n", - "plt.scatter(x, y, c=labels, cmap='viridis')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "a24927bc", - "metadata": {}, - "source": [ - "### K-means : Question 2" - ] - }, - { - "cell_type": "markdown", - "id": "c18297ba", - "metadata": {}, - "source": [ - "**Déterminer la partition optimale par k-means en prenant pour centres initiaux les éléments 18, 20, 31**" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "d0ccbcf3-a06f-4757-bdd8-2cc3bd1626c6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 1.5],\n", - " [19. ],\n", - " [31. ]])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Définition des centres initiaux\n", - "init_points = np.array([18, 20, 31])\n", - "\n", - "#Itinitialisation algo\n", - "kmeans = KMeans(init=init_points.reshape(-1,1),\n", - " n_clusters=3,\n", - " n_init = 1)\n", - "\n", - "#Transformation des données : plusieurs échantillons de 1 dimension\n", - "data_x = np.array(x)\n", - "data_x = data_x.reshape(-1,1)\n", - "\n", - "# Fitting\n", - "kmeans.fit(data_x)\n", - "\n", - "#Centroides finaux\n", - "final_centroids = kmeans.cluster_centers_\n", - "labels = kmeans.labels_\n", - "\n", - "final_centroids" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b957bbe8", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Représentation Graphique\n", - "plt.scatter(x, y, c=labels, cmap='viridis')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "2b85bc73", - "metadata": {}, - "source": [ - "### K-means : Question 3" - ] - }, - { - "cell_type": "markdown", - "id": "0c085473", - "metadata": {}, - "source": [ - "**Déterminer la partition optimale par k-means en prenant comme partition initiale {{1},{2,18},{20,31}}**" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "0047b80a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 1.5],\n", - " [19. ],\n", - " [31. ]])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Définition des centres initiaux\n", - "init_points = np.array([1, np.mean([2, 18]), np.mean([20, 31])])\n", - "\n", - "#Itinitialisation algo\n", - "kmeans = KMeans(init=init_points.reshape(-1,1),\n", - " n_clusters=3,\n", - " n_init=1)\n", - "\n", - "#Transformation des données : plusieurs échantillons de 1 dimension\n", - "data_x = np.array(x)\n", - "data_x = data_x.reshape(-1,1)\n", - "\n", - "# Fitting\n", - "kmeans.fit(data_x)\n", - "\n", - "#Centroides finaux\n", - "final_centroids = kmeans.cluster_centers_\n", - "labels = kmeans.labels_\n", - "\n", - "final_centroids" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "d0776ee3", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Représentation Graphique\n", - "plt.scatter(x, y, c=labels, cmap='viridis')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "5eaad20e", - "metadata": {}, - "source": [ - "### Classification Ascendante Hiérarchique avec le lien simple" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "1ebaaa05", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGgCAYAAABWo0bIAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAKAhJREFUeJzt3Al4VNUZ//E3C2sgkli2v/61igIFZV8rIAoiFa2IPqgURTZRK5vgQqHIUhcWEUERLQhuQF1RCxYabVFa2alU2SoghbJKEiIBAmTu/3nP88z8s0xilAmZee/38zwx5M6Z8b5z7sz85pxzb5zneZ4AAAAYEV/WOwAAABBJhBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAApiSKT+m1CwOByF+/MD4+rlQeNxZQu/9q92vdfq7dr3UraveiYj/i4uJ+sJ1vw412Unp6dkQfMzExXlJSkiQr67icORMQP6F2/9Xu17r9XLtf61bUnhQVtaemJklCwg+HG6alAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKaUSrgJBAIyY8YMad++vTRp0kQGDhwoe/bsKbJ9RkaGjBgxQlq2bCmtWrWS8ePHy4kTJ8K2PXXqlNx0003y2GOPlcauAwCAGFcq4WbWrFmyYMECmThxoixatMiFnQEDBrhgEs6QIUNk9+7dMn/+fHnuuedkxYoVMm7cuLBtJ0+eLNu3by+N3QYAAAZEPNxogHnllVdcYOnYsaPUr19fnn32WTlw4IAsX768UPuNGzfKmjVrZNKkSdKwYUNp27atTJgwQT744AM5ePBgvraff/65fPzxx3L55ZdHercBAIAREQ83W7dulezsbBdSgpKTk6VBgwaydu3aQu3XrVsn1atXlzp16oS26dRUXFycrF+/PrQtPT1dRo0a5UaDUlJSIr3bAADAiMRIP6CO0KjatWvn216jRo3QbXnp6EzBtuXLl5dq1arJ/v37Q9tGjx4t11xzjVx77bUyb968iOxrYmJks11CQny+335C7f6r3a91+7l2v9atqF1iqvaIh5vgQmANKHlVqFBBjh49GrZ9wbbB9jk5Oe7fum5nx44d8swzz0RsP+Pj4yQlJUlKQ3JyJfEravcfv9bt59r9Wreidp+Gm4oVK4bW3gT/rTSoVKpU+InRNuEWGmv7ypUry86dO2XKlCkyd+5c93ekBAKeZGUdl0jSVKudn5V1QnJzA+In1O6/2v1at59r92vditorRUXtuh8lGUGKeLgJTjEdOnRILrrootB2/btevXqF2teqVUvS0tLybdOwk5mZ6aayli5d6tbw9O3bN3T7yZMnZcOGDbJs2TK3IPmnOnOmdDpJO7+0HjvaUbv/avdr3X6u3a91K2oPSCyIeLjRs6OqVKkiq1evDoWbrKws2bx5s/Tu3btQe722zdSpU92p4BdffLHbpmdPqebNm8svf/lLd12bvEaOHOlCkf4GAAAo1XCj62c0xGhgSU1NlQsuuMBNK2kY6dKli+Tm5rozn6pWreqmpBo3bizNmjWT4cOHu2vbHD9+XMaOHSvdu3eXmjVrusfUxcV56f2SkpJCYQgAACCoVJY+6zVubrvtNhkzZozceeedkpCQ4NbMlCtXzp0B1a5dOzfdpPSU7+eff14uvPBC6dOnjwwbNkw6dOhQ5EX8AAAAihPneZ4nPp07TE/Pjuhj6qnlegZWRkZ2zMxLRgq1+692v9bt59r9Wrei9qSoqD01NalEC4pj56R1AACAEiDcAAAAUwg3AADAFMINAAAwhXADAABMIdwAAABTCDcAAMAUwg0AADCFcAMAAEwh3AAAAFMINwAAwBTCDQAAMIVwAwAATCHcAAAAUwg3AADAFMINAAAwhXADAABMIdwAAABTCDcAAMAUwg0AADCFcAMAAEwh3AAAAFMINwAAwBTCDQAAMIVwAwAATCHcAAAAUwg3AADAFMINAAAwhXADAABMIdwAAABTCDcAAMAUwg0AADCFcAMAAEwh3AAAAFMINwAAwBTCDQAAMIVwAwAATCHcAAAAUwg3AADAFMINAAAwhXADAABMIdwAAABTCDcAAMAUwg0AADCFcAMAAEwh3AAAAFMINwAAwBTCDQAAMIVwAwAATCHcAAAAUwg3AADAFMINAAAwhXADAABMIdwAAABTCDcAAMCUUgk3gUBAZsyYIe3bt5cmTZrIwIEDZc+ePUW2z8jIkBEjRkjLli2lVatWMn78eDlx4kS+x5szZ45cf/317vG6desmb7/9dmnsOgAAiHGlEm5mzZolCxYskIkTJ8qiRYtcOBkwYICcOnUqbPshQ4bI7t27Zf78+fLcc8/JihUrZNy4caHbX3rpJfczdOhQ+fDDD+Xuu+92ty9evLg0dh8AAMSwiIcbDTCvvPKKCywdO3aU+vXry7PPPisHDhyQ5cuXF2q/ceNGWbNmjUyaNEkaNmwobdu2lQkTJsgHH3wgBw8edG0WLlwo/fr1kxtuuEEuuugiuf322+Xmm29m9AYAAJR+uNm6datkZ2e7kBKUnJwsDRo0kLVr1xZqv27dOqlevbrUqVMntE2npuLi4mT9+vVu1EeDzy233JJ/x+PjJSsrK9K7DwAAYlxipB9QR2hU7dq1822vUaNG6La8dHSmYNvy5ctLtWrVZP/+/S7E5A1Kat++fbJkyRK54447zmpfExMjm+0SEuLz/fYTavdf7X6t28+1+7VuRe0SU7VHPNwEFwJrQMmrQoUKcvTo0bDtC7YNts/JySm0/bvvvnMLlM8//3y5//77f/J+xsfHSUpKkpSG5ORK4lfU7j9+rdvPtfu1bkXtPg03FStWDK29Cf5baVCpVKnwE6Ntwi001vaVK1fOt23nzp1y7733Sm5urrz22mtuuuunCgQ8yco6LpGkqVY7PyvrhOTmBsRPqN1/tfu1bj/X7te6FbVXioradT9KMoIU8XATnGI6dOiQW/wbpH/Xq1evUPtatWpJWlpavm0adjIzM91UVpCuv9GRmpo1a7rTwvX32TpzpnQ6STu/tB472lG7/2r3a91+rt2vdStqj43aIz6BpmdHValSRVavXh3apgt/N2/e7K5jU5Bu07U4eip4kJ49pZo3b+5+b9q0yZ1Kfvnll8ubb74ZkWADAABsivjIja6f6d27t0ydOlVSU1PlggsukClTprgRmi5durgppfT0dKlataqbkmrcuLE0a9ZMhg8f7q5dc/z4cRk7dqx0797dhZgzZ87IyJEj3Rqbp59+2k1XHT582P2/EhIS3P8DAACg1MKN0mvcaCgZM2aMnDx50o3OzJ07V8qVKyd79+6VTp06yVNPPSU9evRwp3w///zz7qrEffr0cQuJu3btKqNGjQqN2gRHdTp37pzv/6PB6dNPPy2NEgAAQIyK8zzPE5/OHaanZ0f0MfXUcj0DKyMjO2bmJSOF2v1Xu1/r9nPtfq1bUXtSVNSemppUogXFsXPSOgAAQAkQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgSqmEm0AgIDNmzJD27dtLkyZNZODAgbJnz54i22dkZMiIESOkZcuW0qpVKxk/frycOHEiX5uPP/5YbrjhBmnUqJF0795dvvjiC4kmgYAnW75NlxUb9rrf+ncs0v3eujtDVm0+4H7Hah3nipV+t3JscfxGF/rDfwJR0ueJpfGgs2bNkgULFsjTTz8ttWrVkilTpsiAAQPko48+kvLlyxdqP2TIEBdm5s+fL1lZWTJ69Gg5fvy4TJo0yd2+atUqefjhh+WRRx6Rq666St555x259957ZfHixVKnTh0pa+u3HZIFaf+RjO9zQttSqlaQXp0vl+b1akissFLHucLzFV3PFf0RXegP/1kfRX0e53leRGPVqVOnpE2bNjJy5Ejp1auX26aBRUdxnnjiCbnxxhvztd+4caPccccdsnTp0lBQWblypQtDK1askJo1a0r//v2latWqMn369ND99D5169aVCRMm/KT9zM0NSHp6tkSiM194/6sib//tLVfExAv5bOtITIyXlJQkycjIljNnAmKdlX4/GyXt83PxXJ3r/vDb8R6NfX6u+bXPS1r7uerz1NQkSUiIP/fTUlu3bpXs7Gxp27ZtaFtycrI0aNBA1q5dW6j9unXrpHr16vlGYHRqKi4uTtavX++muDZs2JDv8VTr1q3DPt65pMNtmlKLszDtP1E/FGuljnOF5yu6niv6I7rQH/4TiMI+j/i01IEDB9zv2rVr59teo0aN0G15HTx4sFBbnbqqVq2a7N+/34366BSVTm+V5PF+bBo9G7rGIu/wWzjp3+fIjn1H5Rc/T5VoFYk6gkm6JIk61lnp97NVkj4/F89VWfSHn473aOzzsuDXPi9J7dHY5xEPN8GFwAXX1lSoUEGOHj0atn24dTjaPicnR06ePFnk4+ntP1V8fJwbZjsbp3dllKydd/b/r9IUyTqSkyuJdVb6PVKK6/Nz8VyVZX/44XiPxj4vS37t8+Jqj8Y+j3i4qVixYmjtTfDfSoNIpUqFnxhto20L0vaVK1d2ISb4eAVvD/d4JaXDY1lZx+VslIvzStxO5yqjVSTq0ESvB35W1gm3nskyK/1+tkrS5+fiuSqL/vDT8R6NfV4W/NrnJan9XPa57kdJRs8iHm6CU0yHDh2Siy66KLRd/65Xr16h9jrdlJaWlm+bBpnMzEw39aTTUxpy9P556d+62PhsnO2isDr/5zy3Ery44bjUqhVcu2hegBbJOvTAj+ZaI8FKv0dKcX1+Lp6rsuwPPxzv0djnZcmvfV5c7dHY5xGfPKxfv75UqVJFVq9eHdqm62Y2b97srmNTkG7TtTO7d+8ObVuzZo373bx5c7ewuFmzZqFtQfr4LVq0kLKkU1t6iltx7ux8uWsXzazUca7wfEXXc0V/RBf6w3/io7DPIx5udG1M7969ZerUqfLJJ5+4s6eGDx/uRmi6dOkiubm5cvjw4dBamsaNG7vwom02bdrkrmkzduxYd6G+4MhM3759ZcmSJTJv3jzZsWOHTJ48WbZs2SJ9+vSRsqantukpbppaC6bUWDrd0Uod5wrPV3Q9V/RHdKE//Kd5lPV5xK9zozTATJs2Td577z0XYnR0RgPLhRdeKHv37pVOnTrJU089JT169HDtjxw54q5K/Pnnn7s1Nl27dpVRo0aF1tsovWCfXhxQR3kuu+wyd1G/gqeHl8V1bvKu4dGV4LpgSucVdfgtFr+ZaB3b92RKZnaOVEuqIHX/b7US1eHXa0BY6fef4sf2+U89tn6Mc/H/8PPxHo19fq74tc9/bO2l3eclvc5NqYSbWBDpcKM4+KndT7X7tW4/1+7XuhW1J0VF7WV2ET8AAICyRLgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYErEw01OTo6MHz9e2rZtK02bNpURI0ZIenp6sffZu3evDBo0SJo1aybt2rWT6dOnS25ubuj2kydPyjPPPCPXXnute8wePXrIJ598EuldBwAABkQ83IwbN05WrlwpM2fOlFdffVV27twpQ4YMKbL96dOnpX///u7fixYtcvdfuHChvPDCC6E2f/jDH+Sjjz6Sxx9/XBYvXiydO3eWBx98UFavXh3p3QcAADEuMZIPdvDgQRc+Zs+eLS1atHDbpk2bJl27dpWNGze6UZeCli1bJvv27ZO33npLzjvvPKlbt64cOXJEJk+eLPfdd58bwdHHfPLJJ+Xqq69293nggQdcsHn33XeldevWkSwBAADEuIiGm/Xr17vfbdq0CW275JJLpGbNmrJ27dqw4WbdunXSsGFDF2yC9P7Hjh2TLVu2SL169VxYuuKKK/LdLz4+XrKyss5qfxMTIztwlZAQn++3n1C7/2r3a91+rt2vdStql5iqPeIjNykpKVKhQoV822vUqCEHDhwIex/dXqtWrULt1f79+6Vx48ZuHU5emzZtklWrVsmYMWN+8r7Gx8dJSkqSlIbk5EriV9TuP36t28+1+7VuRe0Gw40u/O3UqVORtw8dOlTKly9faLuGHV1oHI4uFk5OTi7UXoW7j67h+e1vfyuNGjWSnj17yk8VCHiSlXVcIklTrXZ+VtYJyc0NiJ9Qu/9q92vdfq7dr3Uraq8UFbXrfpRkBOlHhRudXlq6dGmRt69YsUJOnTpVaLuGlEqVwie+ihUrFrpPMNRUrlw53/YNGza49TY60qNTVeXKlZOzceZM6XSSdn5pPXa0o3b/1e7Xuv1cu1/rVtQekFjwo8KNhok6deoUefu2bdskMzPThZW8IziHDh1ywSgcDSrbt2/Pt03bq7z3Wb58uYwcOdJNU82aNUuqVq36Y3YdAAD4RERXBzVv3lwCgUBoYbHatWuXW4vTsmXLsPfR7Zs3b3YLiIN0PU1SUpLUr1/f/f3pp5/K8OHDpWPHjjJ37lyCDQAAODfhRkdaunXr5hb66qnauvD3oYceklatWkmTJk1cGx3VOXz4cGgqSq9ZU716dRk2bJhs3bpV0tLS3Onj/fr1c6M/R48elUcffdSdUTV69Gj3t95ff3SUCAAAIK+In9c1ceJEd3VivcieXpzv0ksvlRkzZoRu1+vd6NlP+ju4eHjOnDluxEcXCOvVjXv16uXW1qjPPvvMnfL95ZdfSocOHdx9gz+DBw+O9O4DAIAYF+d5nic+XRiVnp4d0cfU6+bo6eUZGdkxs+gqUqjdf7X7tW4/1+7XuhW1J0VF7ampSSU6Wyp2rsgDAABQAoQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJgS8XCTk5Mj48ePl7Zt20rTpk1lxIgRkp6eXux99u7dK4MGDZJmzZpJu3btZPr06ZKbmxu2rT6Wtpk5c2akdx0AABgQ8XAzbtw4WblypQsfr776quzcuVOGDBlSZPvTp09L//793b8XLVrk7r9w4UJ54YUXwrYfM2aMHD58ONK7DQAAjEiM5IMdPHhQFi9eLLNnz5YWLVq4bdOmTZOuXbvKxo0b3UhOQcuWLZN9+/bJW2+9Jeedd57UrVtXjhw5IpMnT5b77rtPypcvH2r7pz/9Sb799lupXr16JHcbAAAYEtFws379eve7TZs2oW2XXHKJ1KxZU9auXRs23Kxbt04aNmzogk2Q3v/YsWOyZcsWady4sdu2a9cumTp1qsyfP18GDx4ckf1NTIzswFVCQny+335C7f6r3a91+7l2v9atqF1iqvaIj9ykpKRIhQoV8m2vUaOGHDhwIOx9dHutWrUKtVf79+934UanrnTtjk5faRCKhPj4OElJSZLSkJxcSfyK2v3Hr3X7uXa/1q2o3WC40YW/nTp1KvL2oUOH5ptGCtKwowuNwzl58qQkJycXaq+C95kxY4bbNnDgQImUQMCTrKzjEkmaarXzs7JOSG5uQPyE2v1Xu1/r9nPtfq1bUXulqKhd96MkI0g/Ktzo9NLSpUuLvH3FihVy6tSpQts1pFSqFD7xVaxYsdB9gqGmcuXKsmbNGrfA+P3335eEhASJpDNnSqeTtPNL67GjHbX7r3a/1u3n2v1at6L2gMSCHxVuypUrJ3Xq1Cny9m3btklmZqYLK3lHcA4dOuSCUTg6JbV9+/Z827S90vtosDl+/Lj8+te/Dt1+4sQJeemll+Qvf/mLLFmy5MeUAAAAjIvompvmzZtLIBBwC4v1OjdKFwLrWpyWLVuGvY9u1zOsdAFxlSpV3LZVq1ZJUlKS1K9fX0aOHOnOmsrrrrvuki5dukjfvn0jufsAAMCAiC591pGWbt26uWvRrF69WjZt2iQPPfSQtGrVSpo0aeLa6KiOXqcmOBXVuXNnd2r3sGHDZOvWrZKWluZOH+/Xr58b/Tn//PPl4osvzveTmJjozq664IILIrn7AADAgIif1zVx4kQ3avPggw+6s5suvfRStyA4SK93o1cY1t9KFwrPmTPHjfj07NnTXd24V69e8sADD0R61wAAgA/EeZ7niU8XRqWnZ0f0MfW6OXp6eUZGdswsuooUavdf7X6t28+1+7VuRe1JUVF7ampSic6Wip0r8gAAAJQA4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmBLneZ4nPqRlBwKRLz0hIV5ycwPiR9Tuv9r9Wrefa/dr3YraA2W9GxIfHydxcXE/2M634QYAANjEtBQAADCFcAMAAEwh3AAAAFMINwAAwBTCDQAAMIVwAwAATCHcAAAAUwg3AADAFMINAAAwhXADAABMIdwAAABTCDcAAMAUwg0AADCFcPMjBAIBmTFjhrRv316aNGkiAwcOlD179hTZPiMjQ0aMGCEtW7aUVq1ayfjx4+XEiRMSizIzM2Xs2LHSoUMHadasmdx5552ybt26Itu/+OKLUq9evUI/sejgwYNha3nvvffM9vvq1avD1qw/nTp1Cnuf9evXh22vjxVLXnrpJbnrrrvybduyZYv07t3bve6vvfZaee21137wcT7++GO54YYbpFGjRtK9e3f54osvJNbq/vTTT+XWW2+Vpk2buronTZokJ0+eLPIxcnNzXb0Fj4GZM2dKrNU+ZsyYQnXoc2C5z++6664iX/eLFy8u8nH69u1bqH3B5/Oc81BiM2fO9Fq3bu397W9/87Zs2eL169fP69Kli5eTkxO2fe/evb1bb73V++qrr7x//vOf3jXXXOM98sgjXizq27evd+ONN3pr1671du7c6Y0fP95r1KiRt2PHjrDthw4d6j388MPeoUOH8v3Eor///e/elVde6R08eDBfLSdOnDDb73pMF+y75cuXe/Xq1fPeeeedsPd58803vc6dOxe6X1Gvj2j0xhtvePXr13d9GJSenu5e96NGjfK++eYbV78eD0U9D+qLL77wGjZs6L366qvuPk8//bR3xRVXuH/HSt36Wv/FL37hvfjii96uXbvc66BDhw7eY489VuTjaH1169Z17495j4Fjx4550Spc7eq2227zpk2blq+OI0eOmO7zjIyMfPXqe16vXr28bt26FduHbdu29RYsWJDvvvpYZYlwU0L6Bt20aVP3Bh509OhR9wH/0UcfFWq/YcMG9yLPe2B//vnn7sPhwIEDXiz59ttvXS3r1q0LbQsEAu6DbPr06WHv86tf/cqbN2+eZ8HLL7/s3XTTTSVqa6nf88rOznYhrbgPtscff9y77777vFikfTNo0CCvSZMmXteuXfO94c+ePdtr166dd/r06dC2Z555xn2xKYp+8dGAn9ftt9/u/f73v/dipe4RI0Z499xzT77277//vvsALyqwLlmyxGvWrJkXC4qrXd/fdLsG+pKy0OcFvf766y6gFfUlVn333XfuPe/rr7/2ognTUiW0detWyc7OlrZt24a2JScnS4MGDWTt2rWF2uuUTfXq1aVOnTqhbTpFERcX54bvY0lKSoq8/PLLcuWVV4a2aR36k5WVVaj9qVOn5Ntvv5VLL71ULNi2bVu+fiyOpX7Pa/bs2W5q7dFHH43I8xRtvv76aylXrpx8+OGH0rhx40J9qn2YmJgY2tamTRt3jH/33Xdhp683bNiQ771CtW7dOux7RbTW3a9fv0L9HR8fL6dPn5Zjx47F/DFQXO3//e9/5fjx4yV+D7PS53mlp6fL9OnT5f777y/2edA+1/e3Sy65RKLJ/3+1olgHDhxwv2vXrp1ve40aNUK3FVynUbBt+fLlpVq1arJ//36JJRrirr766nzbli1bJrt375bf/e53hdp/8803bu5d2zzxxBOSk5Pj1p88/PDD7vmKNdu3b3cB7ze/+Y3s2rVLLr74YveC1/VHlvs975vc/Pnz3ToiraMo//nPf9zz1KNHD/c81K1bV4YPH+7WH0Q7XUtR1HoKfX1rLXkFj2Pt05/97Gf5btPArx+MtWrVKtF7RbTWrV/c8tJQo8fBFVdcIampqUW+Vs6cOSP9+/d3Xwhr1qwpffr0kZtvvlmiTXG1ax3q9ddfl88++8yFOn296/FctWrVQu2t9Hlef/zjH6VixYquL4ujz5U+JxMmTJB//OMfUrlyZenatas88MAD7r2vrDByU0LBBaEFO6tChQruwztc+3AdW1T7WKLfUEaNGiVdunSRjh07FvnGUKlSJXnuuedcwNm5c6fcfffdxS5GjEb6Rq37fvToURk8eLAbwdJFpffee2/YxYIW+33BggXuzev2228vso1+yH///ffuDV4XYs6aNct96OsiXA27sUyP2XCvexWuT4PHeEnfK2LldfDII4+4APv4448X2U5v15MPdDHp3Llz5frrr3fvFe+8847EEn0P00Cj4URHLR977DFZuXKl+8DWURrrfX7s2DF56623XLAJHuvFPVdao36JmTNnjvvi9/bbb7v3gbLEyE0JaYINTrkE/620U/VDPFx7bVuQttdkG6vS0tJk5MiR7oypqVOnhm2jZwnot5y83+4uv/xyt03PvtCzCWKFTkXo2T4JCQmhftdvrvomrm/eBYehLfa7niWhfZr3uC9IR6t0+F1fCzrkrXQac/Pmze7br54xFqvC9WnwAytcnwY/DMLdJ9x7RSx80A0bNkzWrFkjzz//fLEjcX/+85/dqG1SUpL7u379+rJv3z73WrntttskVugHdK9evdxIpNKRO51u7tmzp/z73/8uNJ1jrc/T0tJcLXqm3A/RERudvjzvvPNCz5W+B+golwbigiOb5wojNyUUnGo4dOhQvu36tw69FqTDkwXb6sGi32picWpGvfHGG2704pprrnHfZopL9AWHrbVmndKItiHaktA36oIf7BrWdOrFer/r1IJe7uCmm24q0fRlMNgo/ear6y/CPU+xJFyfBv8O99rX41xDT0nfK6KZ7rNOx/7rX/9yAaXg9HRB+joJBpsg/bCLtde9HrvBYJP3Na/C1WKpz4PhRvtaX9Ml+QIYDDYlea7OFcJNCek3kCpVquS7ZofOs+o3U11PUpBu047VdSlB+s1HNW/eXGJxamLixInujW7atGnFzqU+++yzbjhaz8YL2rt3r7v+y2WXXSaxREdodJSq4LVavvrqq7C1WOt3XUx7/vnnu+O/OLouQa+Fkve6TzqVoeEo1vo8XJ/qYnAdkQhatWqVW0Cpz01BurhSj5lgvwfpMdSiRQuJFToVq+tldM3Vm2++GfZ9Li99P9SF1wWv/6QjHcEPu1ihIw733HNPoTpUuOPZSp/nfd0XHJUuik5B6tRjwedKv+j8/Oc/l7JCuCkh/TDX9QM6FfPJJ5+4N20ddtNvdbr2RN/4Dh8+HJp71WFLPdi1zaZNm9yboV4ET4f3Yy3J6yLaJ598Uq677joZNGiQO0NEa9UfXWehIxP67+CQrLb73//+J+PGjXP31ekKHfHR50MvgBhLdORBzxTQoVd9we/YsUOeeuop901Wh64t97vS8F7UxRe1bj2DUGnN+k1Xh6c1+OkZFPpvHbEq+CERa3RoXqdmRo8e7dYP6Ye3LqzV10KQvg40BOS9qNmSJUtk3rx57piZPHmyuxCghoVYoce5htUpU6a4kdjga15/gkFP+1d/lH7L17PI9MvNihUr3NlkukZNz8rR138s0S9nuqZOp+H0zCmtR0+euPHGG0Nng1ns8+D6Of0iWtQXGn3N6zGQ97n64IMPZOHChe54Wbp0qatd1+vogECZKetz0WPJmTNnvMmTJ3tt2rRx1wgYOHCgt2fPHneb/tZz/d9999185/8PHjzYtdWLgOl1QE6ePOnFGr2Il9YW7ufRRx/1Vq1a5f6tv4P04nV6jQetvVWrVu4CaJmZmV4sOnz4sLu+y1VXXeUu3qZ16QXOrPe7GjBggDds2LCwt2ndM2bMCP29e/duV7f2d+PGjd11P7Zt2+bFGj2mC17748svv/R69uzprvmh1/vR638UvI9uL3hNmOuuu84dM7fccot7TcRK3fpep/td1Os++L6n7fM+V99//7335JNPeldffbV7rm6++Wbvr3/9qxeLfb506VKve/fu7lpm+trXi/LlfR1b6/O8x3rBa3Xlpa95vb3gBQH12mbB14d+ZuTm5nplKU7/U3bRCgAAILKYlgIAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAACCW/D+YrMV2Fx7pCgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Défintion de E\n", - "x = [0, 2, 5, 8, 9, 13, 18]\n", - "\n", - "#Représentation graphique\n", - "y=[0, 0, 0, 0, 0, 0, 0]\n", - "plt.scatter(x, y)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "5e96f7f3", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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9re/jd133z023XTT2G677eLSSy99zxfmNYo777wzPv/5zxe1+NznPhe33HJLuO1MRKVSKW7Qt8MOO8TGG29c1Obmm2+udbPqQvoyyY022ig+9rGPzfczduzYWjetLjz88MPF/uUTn/hEbL/99kU/avTPVKVSidtuuy122WWXop985jOfiXPPPXfAHJP6fcfPweLf//53HHjggTFt2rT5tk+ePDm+8Y1vxCc/+cm45JJL4vXXXy9uo/7qq6/GVVddFY1cm7QDOPTQQ2PXXXeN73znO/HSSy/FxIkT480334yzzjorGslPfvKTOO2002LfffctPvQpmKYapIPIAQccEI3s/PPPjx/96Efx1a9+tQga//jHP+IHP/hB8Rk68cQTo5E9//zzxR2T09cxfPSjH527vVxu6PO9whNPPBGHHHJIEUqPPvro+POf/1zUqaenJw4++OBoVNdee21xLEr75HHjxsWUKVOKk7t0rLr++uujVCpFXas2mJ6enurdd99d3XLLLYuf0aNHV//4xz/O/fOJEydWN9544+r06dPnbrvtttuKv/fqq69WG7k2++yzT3X33Xef799ceuml1Q033LA6Y8aMaiPZc889q3vttdd824455pjqdtttV21kb7/9dtEfTjnllPm2/+Y3v6lusMEG1RdeeKHayO68887qmDFjql1dXbVuSt054IADql/5ylfm23bBBRdUx44dW+3s7Kw2op6enurmm29enTBhwnzb77333mL//Je//KVa7xouPj/33HNxxhlnFGfjF1xwwXv+PJ2JNjc3x/Dhw+duW2655YrH9vb2aOTapCG6Bben76xJw3np7KyRpH6SvpG4r9RPBnsf+V/+/ve/F2eeaSqtr0996lNFP/nd734Xjexvf/tbrLPOOsWXTTJPmnJNU7Np5KuvnXbaKWbMmFGMajSi6dOnx5e+9KX4whe+MN/21IeSV155Jepdw4WMVVddNR588ME46aSToqWl5T1/nuYDk/POOy/+85//FENSl19+eYwePbr4qvtGrs1HPvKRuZ07df4HHnigGK5L6xLa2tqikXz9618vpo9+8YtfFNNK6eD5s5/9rNghNLJRo0YVj//617/m256mTJI0ZdLoIaOpqamYUktrebbccss4/fTTB8z8ei7pYDlnzpxYa6215tu+5pprFo9piqARtbW1FV9Gmqbv+3rooYeKx/XWWy/qXcOtyegdlViUFCaOP/74OPPMM+Omm24qtqWvtE+L+tLOoZFr0+uNN96Irbfeem7wOOaYY6LRpGD1pz/9KU444YS52z796U/HySefHI1s7bXXLnaIl112Wayyyiqx1VZbFQeQtH4lnb3PnDkzGlVawJhGC9PjHnvsUaxv+utf/xo//OEP44UXXigWxzbq2oze9V8Ljg6OGDGieGz0ENbXk08+Gddcc00xWpiOV/WuMXv0+0hv3oQJE2KvvfaKG2+8MS6++OKio++///7x1ltv1bp5dSGNcqTapMVI6cCx5557FgtkG8lhhx0Wv/71r4tA+uMf/7g4iD711FPFgrVGXw2fFqWlK5OOOOKI4nG//fYr+kgKsX2nIRtN6hdXXnllcVXS3nvvHVtssUUxopH2N2k6oJGnktJU2vtp1PC1oNRPDjrooFhjjTWK0faBoOFGMt5PWldwxRVXFJcKpSHMvvPJn/3sZ4vLqb773e9Go0tDeGmVc5IuUUy1SVdbpINKI3jssceKA0K6tDmdkSZp2DuN6qRV8Oky3wXXJDSSFVdcsfgcdXR0FKNe6SqKdJBI632WXXbZaFSpBmlfsqB0mXySRjm23XbbaEStra3FY1p/0VfvCMaCIxyN6L777iuuzkpTSumKk96pyXonHvbxzjvvRGdnZ3F/jL5WWGGFYhg4rc9oVGkxX+rkzzzzzHzbU6JOB450MGkUvesNFuwn6aw9aeR+ktx7773x7LPPFmE0zRmn0a60FiGdrY4ZMyYaVRrtS6MYC65XmTVrVvE4UA4aOaQgmqajX3755YWu5Vl33XWjkV133XVx7LHHFut40tT9SiutFAOFkLFAmEhDuguuZE7hI62aT2eqjSrtANI9MdJPX08//XRxRUW6oVCj6F38mu6NseAIR9LI/SRJUwJp2rGvNL2WzlYXdibfSEE9Tavdcccd821P4T19vnpDaiMaNmxY8f+fFp73nW68//77i36zySabRKO6/fbbi6v60v1D0ghG76jPQGG6pI/0QT/yyCOLmyqldRjpTU1XmFx99dVzV4Q3slSbNF2Uhr133nnnYkFfmn9Pi496r8ppBOlsPF1al246NXXq1OLuhGnhXlrsmO7muOBleI0m3aAs9ZH111+/uENhOoj+6le/KtYeDLQd5NK02mqrxW677VaclaaDaqpNOqFJN/lLazTSaGkjSwth040Q07qmtD95/PHHi1qlG/816lqeN998s1h7kS4+SH1kwZHkNAK0/PLLRz0rpZtlRINK12WnSxHTVSR9z7DSZYk33HBDceBIQ5gpYaehqkY6Q11UbdJix3SWmu72ucwyyxTrMdJOoNHm2tN1/emMPfWVNFWUDiCpFocffvjcFfGNLN3xM10tkXaS6eCZ7la44LX+jSj1m3Q2mvpNmjZJV+CkdT1pMZ/FjVGMZKQTl3TJ6sorr1wcWBv55O6uu+6KU045ZZF/ngJICq71rKFDBgCQj+gMAGQhZAAAWQgZAEAWQgYAkIWQAQBkIWQAAFkIGQBAFkIGAJCFkAEAZCFkAABZCBkAQOTw/wGT5waPeBdakgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Calcul de CAH avec lien simple\n", - "data = list(zip(x, strict=False))\n", - "\n", - "linkage_data = linkage(data, method='single', metric='euclidean')\n", - "dendrogram(linkage_data, labels=x)\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "874c878c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0 0 0 0 0 2 1]\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Calcul de la partition de l'espace\n", - "hierarchical_cluster = AgglomerativeClustering(n_clusters=3, metric='euclidean', linkage='single')\n", - "\n", - "labels = hierarchical_cluster.fit_predict(data)\n", - "print(labels)\n", - "\n", - "#Représentation Graphique\n", - "plt.scatter(x, y, c=labels, cmap='viridis')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "75420ae4", - "metadata": {}, - "source": [ - "### Classification Ascendante Hiérarchique avec le lien complet" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "8f098bc3", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Calcul de CAH avec lien complet\n", - "data = list(zip(x, strict=False))\n", - "\n", - "linkage_data = linkage(data, method='complete', metric='euclidean')\n", - "dendrogram(linkage_data, labels=x)\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "68ccdf5c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2 2 1 1 1 0 0]\n" - ] - }, - { - "data": { - "image/png": "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uWYekdZRmm+//dY8Tn379jWPQ5MmTWT48OFm/kFlp3MpSptPoa9vraUw//NYj+l5551X5Hca+PWNsW7duuU6V1TWuvWDW2EaavR50KJFC0lKSir1tZKfny933323+UBYp04dufPOO+XGG2+Uyqas2rUO9cYbb8jKlStNqNPXuz6fq1WrVqK9Lce8sFdffVWqVKlijmVZ9LHSx2T8+PHyj3/8Q+Li4qRXr15y//33m3PfuULPTTn5J4QWP1gxMTHmzTtY+2AHtrT24UQ/oYwaNUp69uwpXbt2LfXEEBsbK88995wJODt37pQ77rijzMmIlZGeqHXfjx07Jg888IDpwdJJpffcc0/QyYI2HvcFCxaYk9ctt9xSaht9kz9+/Lg5wetEzFmzZpk3fZ2Eq2E3nOlzNtjrXgU7pv7neHnPFeHyOnjkkUdMgH3yySdLbae/14sPdDLpnDlz5NprrzXninfffVfCiZ7DNNBoONFey8cee0xWrVpl3rC1l8b2Y37ixAl5++23TbDxP9fLeqy0Rv0QM3v2bPPB75133jHngXOJnpty0gTrH3Lx/6z0oOqbeLD22rY4ba/JNlwtX75cRo4caa6YmjJlStA2epWAfsop/Onu4osvNtv06gu9miBc6FCEXu0TEREROO76yVVP4nryLt4NbeNx16sk9JgWft4Xp71V2v2urwXt8lY6jLllyxbz6VevGAtXwY6p/w0r2DH1vxkEu02wc0U4vNENGzZM1q5dK88//3yZPXEff/yx6bWNj483/09OTpb9+/eb18rNN98s4ULfoPv37296IpX23Olwc79+/eTf//53ieEc24758uXLTS16pdypaI+NDl9Wr1498FjpOUB7uTQQF+/ZPFvouSkn/1DDoUOHimzX/2vXa3HaPVm8rT5Z9FNNOA7NqDfffNP0Xlx99dXm00xZib54t7XWrEMala2Ltjz0RF38jV3Dmg692H7cdWhBlzu44YYbyjV86Q82Sj/56vyLYI9TOAl2TP3/D/ba1+e5hp7ynisqM91nHY7917/+ZQJK8eHp4vR14g82fvpmF26ve33u+oNN4de8ClaLTcfcH270WOtrujwfAP3BpjyP1dlCuCkn/QRStWrVImt26DirfjLV+STF6TY9sDovxU8/+ai2bdtKOA5NTJgwwZzopk6dWuZY6rRp00x3tF6N57dv3z6z/kvjxo0lnGgPjfZSFV+r5euvvw5ai23HXSfT1qxZ0zz/y6LzEnQtlMLrPulQhoajcDvmwY6pTgbXHgm/1atXmwmU+tgUp5Mr9TnjP+5++hxq166dhAsditX5Mjrnav78+UHPc4Xp+VAnXhdf/0l7OvxvduFCexzuuuuuEnWoYM9nW4554dd98V7p0ugQpA49Fn+s9IPOz372MzlXCDflpG/mOn9Ah2I+/fRTc9LWbjf9VKdzT/TEd/jw4cDYq3Zb6pNd22zevNmcDHURPO3eD7ckr5Non3rqKbnmmmtkyJAh5goRrVW/dJ6F9kzoz/4uWW33ww8/yNixY81tdbhCe3z08dAFEMOJ9jzolQLa9aov+O+//16efvpp80lWu65tPu5Kw3tpiy9q3XoFodKa9ZOudk9r8NMrKPRn7bEq/iYRbrRrXodmnnjiCTN/SN+8dWKtvhb89HWgIaDwomaLFy+W119/3TxnJk2aZBYC1LAQLvR5rmF18uTJpifW/5rXL3/Q0+OrX0o/5etVZPrhZsWKFeZqMp2jplfl6Os/nOiHM51Tp8NweuWU1qMXT1x//fWBq8FsPOb++XP6QbS0DzT6mtfnQOHH6oMPPpC33nrLPF+WLFliatf5OtohcM6c62vRw0l+fr4zadIk5/LLLzdrBAwePNjZu3ev+Z1+12v933vvvSLX/z/wwAOmrS4CpuuA5OTkOOFGF/HS2oJ9Pfroo87q1avNz/rdTxev0zUetPYOHTqYBdDS09OdcHT48GGzvssVV1xhFm/TunSBM9uPuxo0aJAzbNiwoL/TumfMmBH4/549e0zderxbtWpl1v3Yvn27E270OV187Y+vvvrK6devn1nzQ9f70fU/it9GtxdfE+aaa64xz5mbbrrJvCbCpW491+l+l/a695/3tH3hx+r48ePOU0895Vx11VXmsbrxxhudv/3tb044HvMlS5Y4ffr0MWuZ6WtfF+Ur/Dq27ZgXfq4XX6urMH3N6++LLwioa5v5Xx/6nlFQUOCcSx7959xFKwAAgNBiWAoAAFiFcAMAAKxCuAEAAFYh3AAAAKsQbgAAgFUINwAAwCqEGwAAYBXCDQAAsArhBgAAWIVwAwAArEK4AQAAYpP/B99OWNlCrUV2AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Calcul de la partition de l'espace\n", - "hierarchical_cluster = AgglomerativeClustering(n_clusters=3, metric='euclidean', linkage='complete')\n", - "\n", - "labels = hierarchical_cluster.fit_predict(data)\n", - "print(labels)\n", - "\n", - "#Représentation Graphique\n", - "plt.scatter(x, y, c=labels, cmap='viridis')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "99bc3508", - "metadata": {}, - "source": [ - "## K-means: Cas pratique" - ] - }, - { - "cell_type": "markdown", - "id": "b2b035d2", - "metadata": {}, - "source": [ - "### Import des données" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "8051b5f4", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.microsoft.datawrangler.viewer.v0+json": { - "columns": [ - { - "name": "index", - "rawType": "int64", - "type": "integer" - }, - { - "name": "ZONE_RISQUE", - "rawType": "object", - "type": "string" - }, - { - "name": "NB", - "rawType": "int64", - "type": "integer" - }, - { - "name": "CHARGE", - "rawType": "float64", - "type": "float" - }, - { - "name": "EXPO", - "rawType": "float64", - "type": "float" - }, - { - "name": "FREQ", - "rawType": "float64", - "type": "float" - }, - { - "name": "CM", - "rawType": "float64", - "type": "float" - }, - { - "name": "FREQxCHARGE", - "rawType": "float64", - "type": "float" - } - ], - "ref": "96564cd0-30e4-4347-a31a-4e7519cd4c0b", - "rows": [ - [ - "0", - "A", - "236", - "1174911.57", - "986430.8907103825", - "0.00023924636000606546", - "4978.438855932203", - "281.0933164515116" - ], - [ - "1", - "B", - "181", - "1146823.23", - "909243.3551912569", - "0.00019906661837735087", - "6336.039944751381", - "228.2942222726909" - ], - [ - "2", - "C", - "284", - "1926300.0", - "1356654.5300546447", - "0.00020933848205892237", - "6782.7464788732395", - "403.24871799010214" - ], - [ - "3", - "D", - "83", - "455800.64", - "314767.9918032787", - "0.00026368627738957876", - "5491.573975903615", - "120.18837399338753" - ], - [ - "4", - "E", - "20", - "181747.82", - "137874.1612021858", - "0.00014505981269884912", - "9087.391", - "26.364304727624145" - ], - [ - "5", - "F", - "1", - "19418.42", - "12129.715846994535", - "8.244216209300377e-05", - "19418.42", - "1.6008965292300261" - ], - [ - "6", - "G", - "5", - "29820.87", - "26935.5", - "0.000185628631360101", - "5964.174", - "5.535607284067495" - ], - [ - "7", - "H", - "14", - "86476.9", - "46174.15300546448", - "0.00030319993088651065", - "6176.921428571428", - "26.219790103279692" - ], - [ - "8", - "I", - "4", - "32686.63", - "13981.37431693989", - "0.0002860949080773543", - "8171.6575", - "9.351478405208491" - ], - [ - "9", - "J", - "12", - "75580.99", - "28698.71857923497", - "0.00041813713622330966", - "6298.4158333333335", - "31.603218711522608" - ], - [ - "10", - "K", - "17", - "87411.64", - "72896.8743169399", - "0.00023320615814181092", - "5141.861176470588", - "20.384932741275044" - ], - [ - "11", - "L", - "7", - "22684.079999999998", - "24877.61202185792", - "0.0002813774888783406", - "3240.582857142857", - "6.382789467915388" - ], - [ - "12", - "M", - "1", - "6352.66", - "1010.7759562841533", - "0.0009893389269727308", - "6352.66", - "6.284933827822588" - ], - [ - "13", - "R", - "0", - "0.0", - "729.1994535519125", - "0.0", - "0.0", - "0.0" - ], - [ - "14", - "S", - "0", - "0.0", - "1783.620218579235", - "0.0", - "0.0", - "0.0" - ], - [ - "15", - "T", - "1", - "3053.17", - "3044.155737704918", - "0.00032849830500259836", - "3053.17", - "1.0029611698847833" - ], - [ - "16", - "X", - "0", - "0.0", - "1627.1803278688521", - "0.0", - "0.0", - "0.0" - ] - ], - "shape": { - "columns": 7, - "rows": 17 - } - }, - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ZONE_RISQUENBCHARGEEXPOFREQCMFREQxCHARGE
0A2361174911.579.864309e+050.0002394978.438856281.093316
1B1811146823.239.092434e+050.0001996336.039945228.294222
2C2841926300.001.356655e+060.0002096782.746479403.248718
3D83455800.643.147680e+050.0002645491.573976120.188374
4E20181747.821.378742e+050.0001459087.39100026.364305
5F119418.421.212972e+040.00008219418.4200001.600897
6G529820.872.693550e+040.0001865964.1740005.535607
7H1486476.904.617415e+040.0003036176.92142926.219790
8I432686.631.398137e+040.0002868171.6575009.351478
9J1275580.992.869872e+040.0004186298.41583331.603219
10K1787411.647.289687e+040.0002335141.86117620.384933
11L722684.082.487761e+040.0002813240.5828576.382789
12M16352.661.010776e+030.0009896352.6600006.284934
13R00.007.291995e+020.0000000.0000000.000000
14S00.001.783620e+030.0000000.0000000.000000
15T13053.173.044156e+030.0003283053.1700001.002961
16X00.001.627180e+030.0000000.0000000.000000
\n", - "
" - ], - "text/plain": [ - " ZONE_RISQUE NB CHARGE EXPO FREQ CM \\\n", - "0 A 236 1174911.57 9.864309e+05 0.000239 4978.438856 \n", - "1 B 181 1146823.23 9.092434e+05 0.000199 6336.039945 \n", - "2 C 284 1926300.00 1.356655e+06 0.000209 6782.746479 \n", - "3 D 83 455800.64 3.147680e+05 0.000264 5491.573976 \n", - "4 E 20 181747.82 1.378742e+05 0.000145 9087.391000 \n", - "5 F 1 19418.42 1.212972e+04 0.000082 19418.420000 \n", - "6 G 5 29820.87 2.693550e+04 0.000186 5964.174000 \n", - "7 H 14 86476.90 4.617415e+04 0.000303 6176.921429 \n", - "8 I 4 32686.63 1.398137e+04 0.000286 8171.657500 \n", - "9 J 12 75580.99 2.869872e+04 0.000418 6298.415833 \n", - "10 K 17 87411.64 7.289687e+04 0.000233 5141.861176 \n", - "11 L 7 22684.08 2.487761e+04 0.000281 3240.582857 \n", - "12 M 1 6352.66 1.010776e+03 0.000989 6352.660000 \n", - "13 R 0 0.00 7.291995e+02 0.000000 0.000000 \n", - "14 S 0 0.00 1.783620e+03 0.000000 0.000000 \n", - "15 T 1 3053.17 3.044156e+03 0.000328 3053.170000 \n", - "16 X 0 0.00 1.627180e+03 0.000000 0.000000 \n", - "\n", - " FREQxCHARGE \n", - "0 281.093316 \n", - "1 228.294222 \n", - "2 403.248718 \n", - "3 120.188374 \n", - "4 26.364305 \n", - "5 1.600897 \n", - "6 5.535607 \n", - "7 26.219790 \n", - "8 9.351478 \n", - "9 31.603219 \n", - "10 20.384933 \n", - "11 6.382789 \n", - "12 6.284934 \n", - "13 0.000000 \n", - "14 0.000000 \n", - "15 1.002961 \n", - "16 0.000000 " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "path = input_path + '/base_retraitee.csv'\n", - "data_retraitee = pd.read_csv(path, sep=\",\", decimal=\".\")\n", - "\n", - "# Group by ZONE_RISQUE and aggregate the necessary columns\n", - "data = data_retraitee.groupby([\"ZONE_RISQUE\"], as_index=False).agg({\n", - " 'NB': 'sum',\n", - " 'CHARGE': 'sum',\n", - " 'EXPO': 'sum'\n", - "})\n", - "\n", - "# Calculate derived metrics\n", - "data[\"FREQ\"] = data[\"NB\"] / data[\"EXPO\"]\n", - "data[\"FREQ\"] = data[\"FREQ\"].fillna(0)\n", - "\n", - "data[\"CM\"] = data[\"CHARGE\"] / data[\"NB\"]\n", - "data[\"CM\"] = data[\"CM\"].fillna(0)\n", - "\n", - "data[\"FREQxCHARGE\"] = data[\"FREQ\"] * data[\"CHARGE\"]\n", - "data[\"FREQxCHARGE\"] = data[\"FREQxCHARGE\"].fillna(0)\n", - "\n", - "data" - ] - }, - { - "cell_type": "markdown", - "id": "aeff9cff", - "metadata": {}, - "source": [ - "**Exercice :** Regrouper les zones géographiques en 5 zones homogènes en termes :\n", - "* Fréquence de sinistres (La fréquence est égale au Nombre de sinistres divisé par l'exposition)\n", - "* Charge \n", - "* Fréquence de sinistres x Charge \n", - " \n", - "A chaque fois :\n", - "* Afficher les coordonnées des centroïdes\n", - "* Représenter graphiquement la partition obtenue" - ] - }, - { - "cell_type": "markdown", - "id": "1c4333b8", - "metadata": {}, - "source": [ - "### Regroupement de zones selon la fréquence" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "6e35f286", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Coordonnées des centroïdes : \n", - "[[1.45059813e-04]\n", - " [2.06105405e-05]\n", - " [9.89338927e-04]\n", - " [3.13499008e-04]\n", - " [2.13297250e-04]]\n", - "Nombre d'itérations réalisées : \n", - "3\n", - "Partition : \n", - "[4 4 4 3 0 1 4 3 3 3 4 3 2 1 1 3 1]\n" - ] - } - ], - "source": [ - "# Initialisation de l'algorithme\n", - "kmeans_FREQ = KMeans(init='random', n_clusters=5, n_init=1, random_state=42, max_iter=300)\n", - "\n", - "# Transformation des données : plusieurs échantillons de 1 dimension\n", - "data_freq = data[\"FREQ\"].to_numpy()\n", - "data_freq = data_freq.reshape(-1, 1)\n", - "\n", - "# Fitting\n", - "kmeans_FREQ.fit(data_freq)\n", - "\n", - "# Centroïdes\n", - "print(\"Coordonnées des centroïdes : \")\n", - "print(kmeans_FREQ.cluster_centers_)\n", - "# Itérations nécessaire pour la résolution\n", - "print(\"Nombre d'itérations réalisées : \")\n", - "print(kmeans_FREQ.n_iter_)\n", - "# Classes\n", - "print(\"Partition : \")\n", - "print(kmeans_FREQ.labels_)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "277e3d46", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "Cluster_FREQ=4
FREQ=%{x}
Y=%{y}", - "legendgroup": "4", - "marker": { - "color": "#636efa", - "symbol": "circle" - }, - "mode": "markers", - "name": "4", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/rNRBzalUKD/efhelGZEuPw==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAAAAAA=", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ=3
FREQ=%{x}
Y=%{y}", - "legendgroup": "3", - "marker": { - "color": "#EF553B", - "symbol": "circle" - }, - "mode": "markers", - "name": "3", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "uSYT8OtHMT/+84zJ2d4zP04cFEbgvzI/BVFIUy1nOz8N79Acu3AyP6oYDnpJhzU/", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAAAAAAA", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ=0
FREQ=%{x}
Y=%{y}", - "legendgroup": "0", - "marker": { - "color": "#00cc96", - "symbol": "circle" - }, - "mode": "markers", - "name": "0", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "ER+STWYDIz8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AA==", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ=1
FREQ=%{x}
Y=%{y}", - "legendgroup": "1", - "marker": { - "color": "#ab63fa", - "symbol": "circle" - }, - "mode": "markers", - "name": "1", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "3mpcj5mcFT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAAAAA==", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ=2
FREQ=%{x}
Y=%{y}", - "legendgroup": "2", - "marker": { - "color": "#FFA15A", - "symbol": "circle" - }, - "mode": "markers", - "name": "2", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "ESaBlZY1UD8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AA==", - "dtype": "i1" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "Cluster_FREQ" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "FREQ" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Y" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Visualisation\n", - "data[\"Cluster_FREQ\"] = kmeans_FREQ.labels_\n", - "data[\"Cluster_FREQ\"] = data[\"Cluster_FREQ\"].astype(str)\n", - "data[\"Y\"] = 0\n", - "\n", - "fig = px.scatter(data, x=\"FREQ\", y=\"Y\", color=\"Cluster_FREQ\")\n", - "fig.show()" - ] - }, - { - "cell_type": "markdown", - "id": "9c738659", - "metadata": {}, - "source": [ - "### Regroupement de zones selon le coût moyen" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "f461bfb8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Coordonnées des centroïdes : \n", - "[[ 5946.98129932]\n", - " [ 0. ]\n", - " [ 8629.52425 ]\n", - " [ 3146.87642857]\n", - " [19418.42 ]]\n", - "Nombre d'itérations réalisées : \n", - "6\n", - "Partition : \n", - "[0 0 0 0 2 4 0 0 2 0 0 3 0 1 1 3 1]\n" - ] - } - ], - "source": [ - "# Initialisation de l'algorithme\n", - "kmeans_CM = KMeans(init='random', n_clusters=5, n_init=1, random_state=42)\n", - "\n", - "# Transformation des données : plusieurs échantillons de 1 dimension\n", - "data_cm = data['CM'].to_numpy()\n", - "data_cm = data_cm.reshape(-1,1)\n", - "\n", - "# Fitting\n", - "kmeans_CM.fit(data_cm)\n", - "\n", - "# Centroïdes\n", - "print(\"Coordonnées des centroïdes : \")\n", - "print(kmeans_CM.cluster_centers_)\n", - "# Itérations nécessaire pour la résolution\n", - "print(\"Nombre d'itérations réalisées : \")\n", - "print(kmeans_CM.n_iter_)\n", - "# Classes\n", - "print(\"Partition : \")\n", - "print(kmeans_CM.labels_)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "98b2a0bf", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "Cluster_CM=0
FREQ=%{x}
Y=%{y}", - "legendgroup": "0", - "marker": { - "color": "#636efa", - "symbol": "circle" - }, - "mode": "markers", - "name": "0", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/uSYT8OtHMT+s1EHNqVQoP/7zjMnZ3jM/BVFIUy1nOz/efhelGZEuPxEmgZWWNVA/", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAAAAAAAAAAA", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_CM=2
FREQ=%{x}
Y=%{y}", - "legendgroup": "2", - "marker": { - "color": "#EF553B", - "symbol": "circle" - }, - "mode": "markers", - "name": "2", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "ER+STWYDIz9OHBRG4L8yPw==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAA=", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_CM=4
FREQ=%{x}
Y=%{y}", - "legendgroup": "4", - "marker": { - "color": "#00cc96", - "symbol": "circle" - }, - "mode": "markers", - "name": "4", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "3mpcj5mcFT8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AA==", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_CM=3
FREQ=%{x}
Y=%{y}", - "legendgroup": "3", - "marker": { - "color": "#ab63fa", - "symbol": "circle" - }, - "mode": "markers", - "name": "3", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "De/QHLtwMj+qGA56SYc1Pw==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAA=", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_CM=1
FREQ=%{x}
Y=%{y}", - "legendgroup": "1", - "marker": { - "color": "#FFA15A", - "symbol": "circle" - }, - "mode": "markers", - "name": "1", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAAA", - "dtype": "i1" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "Cluster_CM" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "FREQ" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Y" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Visualisation\n", - "data[\"Cluster_CM\"] = kmeans_CM.labels_\n", - "data[\"Cluster_CM\"] = data[\"Cluster_CM\"].astype(str)\n", - "data[\"Y\"] = 0\n", - "\n", - "fig = px.scatter(data, x=\"FREQ\", y=\"Y\", color=\"Cluster_CM\")\n", - "fig.show()" - ] - }, - { - "cell_type": "markdown", - "id": "6b154f4a", - "metadata": {}, - "source": [ - "### Regroupement de zones selon (fréquence; le coût moyen)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "1d89f70e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Coordonnées des centroïdes : \n", - "[[ 6.88870225]\n", - " [ 0.52077154]\n", - " [ 26.14306157]\n", - " [120.18837399]\n", - " [304.21208557]]\n", - "Nombre d'itérations réalisées : \n", - "4\n", - "Partition : \n", - "[4 4 4 3 2 1 0 2 0 2 2 0 0 1 1 1 1]\n" - ] - } - ], - "source": [ - "# Initialisation de l'algorithme\n", - "kmeans_FREQ_CM = KMeans(init='random', n_clusters=5, n_init=1, random_state=42, max_iter=300)\n", - "\n", - "# Transformation des données : plusieurs échantillons de 1 dimension\n", - "data_x = data['FREQxCHARGE'].to_numpy()\n", - "data_x = data_x.reshape(-1,1)\n", - "\n", - "# Fitting\n", - "kmeans_FREQ_CM.fit(data_x)\n", - "\n", - "# Centroïdes\n", - "print(\"Coordonnées des centroïdes : \")\n", - "print(kmeans_FREQ_CM.cluster_centers_)\n", - "# Itérations nécessaire pour la résolution\n", - "print(\"Nombre d'itérations réalisées : \")\n", - "print(kmeans_FREQ_CM.n_iter_)\n", - "# Classes\n", - "print(\"Partition : \")\n", - "print(kmeans_FREQ_CM.labels_)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "48aa493b", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "Cluster_FREQ_CM=4
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "4", - "marker": { - "color": "#636efa", - "symbol": "circle" - }, - "mode": "markers", - "name": "4", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "H4XrkX/tMUGuR+E6x38xQQAAAACcZD1B", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ_CM=3
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "3", - "marker": { - "color": "#EF553B", - "symbol": "circle" - }, - "mode": "markers", - "name": "3", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "uSYT8OtHMT8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "9ihcj+LRG0E=", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ_CM=2
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "2", - "marker": { - "color": "#00cc96", - "symbol": "circle" - }, - "mode": "markers", - "name": "2", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "ER+STWYDIz/+84zJ2d4zPwVRSFMtZzs/3n4XpRmRLj8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "9ihcj54vBkFmZmZmzhz1QHE9CtfPc/JA16NwPTpX9UA=", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ_CM=1
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "1", - "marker": { - "color": "#ab63fa", - "symbol": "circle" - }, - "mode": "markers", - "name": "1", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "3mpcj5mcFT8AAAAAAAAAAAAAAAAAAAAAqhgOekmHNT8AAAAAAAAAAA==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "FK5H4Zr20kAAAAAAAAAAAAAAAAAAAAAApHA9Clfap0AAAAAAAAAAAA==", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ_CM=0
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "0", - "marker": { - "color": "#FFA15A", - "symbol": "circle" - }, - "mode": "markers", - "name": "0", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "rNRBzalUKD9OHBRG4L8yPw3v0By7cDI/ESaBlZY1UD8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "4XoUrjcf3UAfhetRqOvfQOtRuB4FJ9ZAXI/C9ajQuEA=", - "dtype": "f8" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "Cluster_FREQ_CM" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "FREQ" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "CHARGE" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Visualisation\n", - "data[\"Cluster_FREQ_CM\"] = kmeans_FREQ_CM.labels_\n", - "data[\"Cluster_FREQ_CM\"] = data[\"Cluster_FREQ_CM\"].astype(str)\n", - "\n", - "fig = px.scatter(data, x=\"FREQ\", y=\"CHARGE\", color=\"Cluster_FREQ_CM\")\n", - "fig.show()" - ] - }, - { - "cell_type": "markdown", - "id": "f1cac03f", - "metadata": {}, - "source": [ - "## C.A.H : Cas pratique" - ] - }, - { - "cell_type": "markdown", - "id": "bffff328", - "metadata": {}, - "source": [ - "**Exercice :** Comparer les résultats obtenus via K-means à ceux d'une C.A.H (lien simple) pour la fréquence et (fréquence; coût moyen)\n", - " \n", - "A chaque fois :\n", - "* Tracer le dendrogramme associé\n", - "* Représenter graphiquement la partition obtenue" - ] - }, - { - "cell_type": "markdown", - "id": "8453bf02", - "metadata": {}, - "source": [ - "### Regroupement de zones selon la fréquence" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "341bf2b2", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#Calcul de CAH avec lien simple\n", - "data_x = data['FREQ'].to_numpy()\n", - "data_x = data_x.reshape(-1,1)\n", - "\n", - "linkage_data = linkage(data_x, method='single', metric='euclidean')\n", - "dendrogram(linkage_data, labels=np.array(data['ZONE_RISQUE']))\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1f0c9650", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " ZONE_RISQUE Cluster\n", - "0 A 0\n", - "1 B 0\n", - "2 C 0\n", - "3 D 0\n", - "4 E 0\n", - "5 F 4\n", - "6 G 0\n", - "7 H 0\n", - "8 I 0\n", - "9 J 2\n", - "10 K 0\n", - "11 L 0\n", - "12 M 3\n", - "13 R 1\n", - "14 S 1\n", - "15 T 0\n", - "16 X 1\n" - ] - } - ], - "source": [ - "# Calcul de la partition de l'espace\n", - "hierarchical_cluster = AgglomerativeClustering(\n", - " n_clusters=5, metric=\"euclidean\", linkage=\"single\"\n", - ")\n", - "\n", - "labels = hierarchical_cluster.fit_predict(data_x)\n", - "print(pd.DataFrame({\"ZONE_RISQUE\": data['ZONE_RISQUE'], \"Cluster\": labels}))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "3d77b67c", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "Cluster_FREQ=0
FREQ=%{x}
Y=%{y}", - "legendgroup": "0", - "marker": { - "color": "#636efa", - "symbol": "circle" - }, - "mode": "markers", - "name": "0", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/uSYT8OtHMT8RH5JNZgMjP6zUQc2pVCg//vOMydneMz9OHBRG4L8yP95+F6UZkS4/De/QHLtwMj+qGA56SYc1Pw==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAAAAAAAAAAAAAA=", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ=4
FREQ=%{x}
Y=%{y}", - "legendgroup": "4", - "marker": { - "color": "#EF553B", - "symbol": "circle" - }, - "mode": "markers", - "name": "4", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "3mpcj5mcFT8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AA==", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ=2
FREQ=%{x}
Y=%{y}", - "legendgroup": "2", - "marker": { - "color": "#00cc96", - "symbol": "circle" - }, - "mode": "markers", - "name": "2", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "BVFIUy1nOz8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AA==", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ=3
FREQ=%{x}
Y=%{y}", - "legendgroup": "3", - "marker": { - "color": "#ab63fa", - "symbol": "circle" - }, - "mode": "markers", - "name": "3", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "ESaBlZY1UD8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AA==", - "dtype": "i1" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ=1
FREQ=%{x}
Y=%{y}", - "legendgroup": "1", - "marker": { - "color": "#FFA15A", - "symbol": "circle" - }, - "mode": "markers", - "name": "1", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAAA", - "dtype": "i1" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "Cluster_FREQ" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "FREQ" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Y" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Visualisation\n", - "data[\"Cluster_FREQ\"] = labels\n", - "data[\"Cluster_FREQ\"] = data[\"Cluster_FREQ\"].astype(str)\n", - "data[\"Y\"] = 0\n", - "\n", - "fig = px.scatter(data, x=\"FREQ\", y=\"Y\", color=\"Cluster_FREQ\")\n", - "fig.show()" - ] - }, - { - "cell_type": "markdown", - "id": "6ace7bc5", - "metadata": {}, - "source": [ - "### Regroupement de zones selon (fréquence; le coût moyen)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "16103b5b", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Calcul de CAH avec lien simple\n", - "data_x = data[[\"FREQ\", \"CM\"]].to_numpy()\n", - "data_x = data_x.reshape(-1, 2)\n", - "\n", - "linkage_data = linkage(data_x, method=\"single\", metric=\"euclidean\")\n", - "dendrogram(linkage_data, labels=np.array(data[\"ZONE_RISQUE\"]))\n", - "\n", - "plt.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "67bf3800", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " ZONE_RISQUE Cluster\n", - "0 A 1\n", - "1 B 1\n", - "2 C 1\n", - "3 D 1\n", - "4 E 0\n", - "5 F 3\n", - "6 G 1\n", - "7 H 1\n", - "8 I 0\n", - "9 J 1\n", - "10 K 1\n", - "11 L 4\n", - "12 M 1\n", - "13 R 2\n", - "14 S 2\n", - "15 T 4\n", - "16 X 2\n" - ] - } - ], - "source": [ - "# Calcul de la partition de l'espace\n", - "hierarchical_cluster = AgglomerativeClustering(\n", - " n_clusters=5, metric=\"euclidean\", linkage=\"single\"\n", - ")\n", - "\n", - "labels = hierarchical_cluster.fit_predict(data_x)\n", - "print(pd.DataFrame({\"ZONE_RISQUE\": data[\"ZONE_RISQUE\"], \"Cluster\": labels}))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0efdf7c1", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "Cluster_FREQ_CHARGE=1
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "1", - "marker": { - "color": "#636efa", - "symbol": "circle" - }, - "mode": "markers", - "name": "1", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/uSYT8OtHMT+s1EHNqVQoP/7zjMnZ3jM/BVFIUy1nOz/efhelGZEuPxEmgZWWNVA/", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "H4XrkX/tMUGuR+E6x38xQQAAAACcZD1B9ihcj+LRG0HhehSuNx/dQGZmZmbOHPVAcT0K189z8kDXo3A9Olf1QFyPwvWo0LhA", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ_CHARGE=0
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "0", - "marker": { - "color": "#EF553B", - "symbol": "circle" - }, - "mode": "markers", - "name": "0", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "ER+STWYDIz9OHBRG4L8yPw==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "9ihcj54vBkEfhetRqOvfQA==", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ_CHARGE=3
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "3", - "marker": { - "color": "#00cc96", - "symbol": "circle" - }, - "mode": "markers", - "name": "3", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "3mpcj5mcFT8=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "FK5H4Zr20kA=", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ_CHARGE=4
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "4", - "marker": { - "color": "#ab63fa", - "symbol": "circle" - }, - "mode": "markers", - "name": "4", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "De/QHLtwMj+qGA56SYc1Pw==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "61G4HgUn1kCkcD0KV9qnQA==", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "Cluster_FREQ_CHARGE=2
FREQ=%{x}
CHARGE=%{y}", - "legendgroup": "2", - "marker": { - "color": "#FFA15A", - "symbol": "circle" - }, - "mode": "markers", - "name": "2", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "dtype": "f8" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "Cluster_FREQ_CHARGE" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "FREQ" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "CHARGE" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Visualisation\n", - "data[\"Cluster_FREQ_CHARGE\"] = labels\n", - "data[\"Cluster_FREQ_CHARGE\"] = data[\"Cluster_FREQ_CHARGE\"].astype(str)\n", - "\n", - "fig = px.scatter(data, x=\"FREQ\", y=\"CHARGE\", color=\"Cluster_FREQ_CHARGE\")\n", - "fig.show()" - ] - }, - { - "cell_type": "markdown", - "id": "12961201", - "metadata": {}, - "source": [ - "## Application : création de Model Points (K-means)" - ] - }, - { - "cell_type": "markdown", - "id": "6567c970", - "metadata": {}, - "source": [ - "Dans certains cas, il se peut que la modélisation ligne par ligne ne soit pas adaptée. C'est le cas des produits collectifs en assurance ou lorsque le nombre d'individus est trop important. \n", - "Dans ce cas de figure, il est nécessaire d'agréger l'information afin d'avoir des \"individus type\". Chacun de ces individus est appelé *Model Point*. \n", - "L'algorithme des k-means peut s'avérer utile pour le regroupement d'individus sous forme de *Mode Points* lorsque les variables explicatives sont numériques. \n", - " \n", - "Afin d'illustre ce propos, nous agrègerons la base de données selon les variables ANNEE_CTR, AGE_ASSURE_PRINCIPAL, ANCIENNETE_PERMIS et ANNEE_CONSTRUCTION afin de créer 100 Model Points. " - ] - }, - { - "cell_type": "markdown", - "id": "a250bff9", - "metadata": {}, - "source": [ - "**Exercice :** Construire la nouvelle base de modélisation (les nouveaux individus deviennent les Model Points et chacune de modalités devient le centroïde de la classe)." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "5b42c2b5", - "metadata": {}, - "outputs": [], - "source": [ - "# Sélection des variables\n", - "data_source_MP = data_retraitee[\n", - " [\n", - " \"ANNEE_CTR\",\n", - " \"AGE_ASSURE_PRINCIPAL\",\n", - " \"ANCIENNETE_PERMIS\",\n", - " \"ANNEE_CONSTRUCTION\",\n", - " \"NB\",\n", - " \"EXPO\",\n", - " \"CHARGE\",\n", - " ]\n", - "]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "0777373f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Nombre d'itérations réalisées : \n", - "41\n" - ] - } - ], - "source": [ - "# Agrégation sous forme de MP\n", - "# Itinitialisation\n", - "kmeans = KMeans(n_clusters=100, max_iter=500)\n", - "\n", - "# Sélection des données\n", - "data_x = data_source_MP[\n", - " [\"ANNEE_CTR\", \"AGE_ASSURE_PRINCIPAL\", \"ANCIENNETE_PERMIS\", \"ANNEE_CONSTRUCTION\"]\n", - "]\n", - "# Fitting\n", - "kmeans.fit(data_x)\n", - "\n", - "# Centroïdes\n", - "print(\"Nombre d'itérations réalisées : \")\n", - "print(kmeans.n_iter_)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "5fd7d737", - "metadata": {}, - "outputs": [], - "source": [ - "# Construction de la nouvelle base de modélisation\n", - "\n", - "# Nouvelles variables explicatives\n", - "base_MP = pd.DataFrame(\n", - " kmeans.cluster_centers_,\n", - " columns=[\n", - " \"ANNEE_CTR\",\n", - " \"AGE_ASSURE_PRINCIPAL\",\n", - " \"ANCIENNETE_PERMIS\",\n", - " \"ANNEE_CONSTRUCTION\",\n", - " ],\n", - ")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "39e674dd", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/tp/_ld5_pzs6nx6mv1pbjhq1l740000gn/T/ipykernel_60807/1945959780.py:2: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n" - ] - } - ], - "source": [ - "# Ajout du nombre de sinistres, exposition et CHARGE par classe\n", - "data_source_MP[\"Cluster\"] = kmeans.labels_\n", - "data_sinistralite_MP = data_source_MP[[\"Cluster\", \"NB\", \"EXPO\", \"CHARGE\"]]\n", - "\n", - "data_sinistralite_MP = data_sinistralite_MP.groupby([\"Cluster\"], as_index=False).sum()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "8115717e", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.microsoft.datawrangler.viewer.v0+json": { - "columns": [ - { - "name": "index", - "rawType": "int64", - "type": "integer" - }, - { - "name": "Cluster", - "rawType": "int32", - "type": "integer" - }, - { - "name": "ANNEE_CTR", - "rawType": "float64", - "type": "float" - }, - { - "name": "AGE_ASSURE_PRINCIPAL", - "rawType": "float64", - "type": "float" - }, - { - "name": "ANCIENNETE_PERMIS", - "rawType": "float64", - "type": "float" - }, - { - "name": "ANNEE_CONSTRUCTION", - "rawType": "float64", - "type": "float" - }, - { - "name": "NB", - "rawType": "int64", - "type": "integer" - }, - { - "name": "EXPO", - "rawType": "float64", - "type": "float" - }, - { - "name": "CHARGE", - "rawType": "float64", - "type": "float" - } - ], - "ref": "7165b46e-7eb6-49d2-a196-5f1042af8126", - "rows": [ - [ - "0", - "0", - "2019.307392996109", - "26.02334630350193", - "13.019455252918299", - "2017.307392996109", - "14", - "70582.72677595628", - "76623.37" - ], - [ - "1", - "1", - "2019.185628742515", - "56.634730538922156", - "34.64071856287425", - "2017.3233532934132", - "13", - "48258.04644808743", - "94446.05" - ], - [ - "2", - "2", - "2019.251282051282", - "45.44615384615385", - "63.061538461538476", - "2017.2205128205128", - "18", - "52378.40983606557", - "180511.41" - ], - [ - "3", - "3", - "2019.4968944099378", - "43.17391304347826", - "27.515527950310556", - "2017.2422360248447", - "8", - "43450.14480874316", - "70994.73999999999" - ], - [ - "4", - "4", - "2018.0091743119267", - "63.30275229357798", - "48.211009174311926", - "2014.4587155963302", - "3", - "31148.94262295082", - "14771.7" - ] - ], - "shape": { - "columns": 8, - "rows": 5 - } - }, - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ClusterANNEE_CTRAGE_ASSURE_PRINCIPALANCIENNETE_PERMISANNEE_CONSTRUCTIONNBEXPOCHARGE
002019.30739326.02334613.0194552017.3073931470582.72677676623.37
112019.18562956.63473134.6407192017.3233531348258.04644894446.05
222019.25128245.44615463.0615382017.2205131852378.409836180511.41
332019.49689443.17391327.5155282017.242236843450.14480970994.74
442018.00917463.30275248.2110092014.458716331148.94262314771.70
\n", - "
" - ], - "text/plain": [ - " Cluster ANNEE_CTR AGE_ASSURE_PRINCIPAL ANCIENNETE_PERMIS \\\n", - "0 0 2019.307393 26.023346 13.019455 \n", - "1 1 2019.185629 56.634731 34.640719 \n", - "2 2 2019.251282 45.446154 63.061538 \n", - "3 3 2019.496894 43.173913 27.515528 \n", - "4 4 2018.009174 63.302752 48.211009 \n", - "\n", - " ANNEE_CONSTRUCTION NB EXPO CHARGE \n", - "0 2017.307393 14 70582.726776 76623.37 \n", - "1 2017.323353 13 48258.046448 94446.05 \n", - "2 2017.220513 18 52378.409836 180511.41 \n", - "3 2017.242236 8 43450.144809 70994.74 \n", - "4 2014.458716 3 31148.942623 14771.70 " - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Joiture des tables\n", - "base_MP = base_MP.merge(data_sinistralite_MP, left_index=True, right_on=\"Cluster\")\n", - "\n", - "base_MP = base_MP.iloc[:, [4, 0, 1, 2, 3, 5, 6, 7]]\n", - "base_MP.head()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b99a8316", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "studies", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.3" - } + "cells": [ + { + "cell_type": "markdown", + "id": "8750d15b", + "metadata": {}, + "source": [ + "# Cours 2 : Algorithmes non supervisés " + ] + }, + { + "cell_type": "markdown", + "id": "f7c08ae5", + "metadata": {}, + "source": [ + "## Préambule" + ] + }, + { + "cell_type": "markdown", + "id": "ec7ecb4b", + "metadata": {}, + "source": [ + "Les objectifs de cette séance (3h) sont :\n", + "* Mettre en application un modèle non-supervisé (K-means et C.A.H)" + ] + }, + { + "cell_type": "markdown", + "id": "4e99c600", + "metadata": {}, + "source": [ + "## Préparation du workspace" + ] + }, + { + "cell_type": "markdown", + "id": "c1b01045", + "metadata": {}, + "source": [ + "### Import de librairies " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6e62631", + "metadata": {}, + "outputs": [], + "source": [ + "# Données\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# Graphiques\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "import matplotlib.pyplot as plt # noqa: E402\n", + "import plotly.express as px\n", + "import plotly.graph_objects as gp\n", + "from scipy.cluster.hierarchy import dendrogram, linkage # noqa: E402\n", + "\n", + "# Statistiques\n", + "from scipy.stats import chi2_contingency # noqa: E402, F401\n", + "\n", + "# Machine Learning\n", + "from sklearn.cluster import AgglomerativeClustering, KMeans # noqa: E402" + ] + }, + { + "cell_type": "markdown", + "id": "985e4e97", + "metadata": {}, + "source": [ + "### Constantes" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c9597b48", + "metadata": {}, + "outputs": [], + "source": [ + "input_path = \"./1_inputs\"\n", + "output_path = \"./2_outputs\"" + ] + }, + { + "cell_type": "markdown", + "id": "b2ff398d", + "metadata": {}, + "source": [ + "## Exercice (implémentation des exercices du support de cours)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ea2a0164", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMhKxcPN+vXrY/r06TFp0qTYZ5994pxzzom6urotbvPqq6/GKaecEuPGjYsDDjggrr/++mhoaGhev27durjmmmvi4IMPLp7zyCOPjEcffbTSuw4AZKDi4ebiiy+Oxx9/PG644Ya48847Y/HixXH66ae32/6dd96JE044ofj5nnvuKba/++674/vf/35zm+985ztx//33xz//8z/HvffeG1OmTImvf/3rMWfOnErvPgDQzfWs5JMtW7asCB8333xz7LvvvsWya6+9NqZNmxZPP/100euyuYcffjhee+21+MlPfhLbbbddjBw5Mt5888248sor4ytf+UrRg5Oe87vf/W586lOfKrY59dRTi2Dz85//PPbbb79K/hcAgG6uouFm/vz5xeP+++/fvGzXXXeNYcOGxdy5c9sMN/PmzYu99tqrCDZN0vZvv/12LFy4MEaNGlWEpY9//OMttqutrY36+voPtL89e7buuOrRo7bFI+1Tq45Rr/KpVfnUqnxqVT21qnjPzaBBg6JPnz4tlg8dOjSWLl3a5jZp+fDhw1u1T5YsWRJjxowp5uFs6tlnn40nnngiLrzwwve9r7W1NTFo0IB21w8c2O99P3e1UauOUa/yqVX51Kp8apV/rToUbtLE30MOOaTd9WeccUb07t271fIUdtJE47akycIDBw5s1T5pa5s0h+drX/ta7L333nHUUUfF+9XYWIr6+jWtlqeUml7M+vq10dDQ+L6fvxqoVceoV/nUqnxqVT616v61SvtUTm9Sh8JNGl568MEH210/e/bs2LBhQ6vlKaT069d2+uvbt2+rbZpCTf/+/Vssf+qpp4r5NqmnJw1V9erVKz6IjRvbf8HSi7ml9bxLrTpGvcqnVuVTq/KpVf616lC4SWFixIgR7a5/7rnnYuXKlUVY2bQHZ/ny5UUwaksKKs8//3yLZal9suk2jzzySJx77rnFMNVNN90U2267bUd2HQCoEhWdKTR+/PhobGxsnlicvPjii8VcnAkTJrS5TVq+YMGCYgJxkzSfZsCAATF69Oji99/85jdx1llnxeTJk+O2224TbACADyfcpJ6Www47rJjomy7VThN/zz777Jg4cWKMHTu2aJN6dV5//fXmoah0z5ohQ4bEmWeeGYsWLYpZs2YVl48ff/zxRe/PqlWr4rzzziuuqLrggguK39P26V/qJQIA2FTFr/G69NJLi7sTp5vspZvz7bbbbjFjxozm9el+N+nqp/TYNHn41ltvLXp80gThdHfjo48+uphbk/z2t78tLvl+5pln4qCDDiq2bfp32mmnVXr3AYBurqZUKpWiSidJ1dWtbvPeN+kS8RUrVnfLSVQfJrXqGPUqn1qVT63Kp1bdv1aDBw8o62qp7nl3HgCAdgg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyUvFws379+pg+fXpMmjQp9tlnnzjnnHOirq5ui9u8+uqrccopp8S4cePigAMOiOuvvz4aGhrabJueK7W54YYbKr3rAEAGKh5uLr744nj88ceL8HHnnXfG4sWL4/TTT2+3/TvvvBMnnHBC8fM999xTbH/33XfH97///TbbX3jhhfH6669XercBgEz0rOSTLVu2LO699964+eabY9999y2WXXvttTFt2rR4+umni56czT388MPx2muvxU9+8pPYbrvtYuTIkfHmm2/GlVdeGV/5yleid+/ezW3//d//PV566aUYMmRIJXcbAMhIRcPN/Pnzi8f999+/edmuu+4aw4YNi7lz57YZbubNmxd77bVXEWyapO3ffvvtWLhwYYwZM6ZY9uKLL8bVV18dd9xxR5x22mkV2d+ePVt3XPXoUdvikfapVceoV/nUqnxqVT61qp5aVbznZtCgQdGnT58Wy4cOHRpLly5tc5u0fPjw4a3aJ0uWLCnCTRq6SnN30vBVCkKVUFtbE4MGDWh3/cCB/Sryd6qBWnWMepVPrcqnVuVTq/xr1aFwkyb+HnLIIe2uP+OMM1oMIzVJYSdNNG7LunXrYuDAga3aJ03bzJgxo1h20kknRaU0Npaivn5Nq+UppaYXs75+bTQ0NFbs7+VIrTpGvcqnVuVTq/KpVfevVdqncnqTOhRu0vDSgw8+2O762bNnx4YNG1otTyGlX7+201/fvn1bbdMUavr37x9PPvlkMcH4l7/8ZfTo0SMqaePG9l+w9GJuaT3vUquOUa/yqVX51Kp8apV/rToUbnr16hUjRoxod/1zzz0XK1euLMLKpj04y5cvL4JRW9KQ1PPPP99iWWqfpG1SsFmzZk389V//dfP6tWvXxi233BK//vWv44EHHujIfwEAyFxF59yMHz8+Ghsbi4nF6T43SZoInObiTJgwoc1t0vJ0hVWaQLzNNtsUy5544okYMGBAjB49Os4999ziqqlNfelLX4qpU6fGcccdV8ndBwAyUNFp0Kmn5bDDDivuRTNnzpx49tln4+yzz46JEyfG2LFjizapVyfdp6ZpKGrKlCnFpd1nnnlmLFq0KGbNmlVcPn788ccXvT877LBDfPSjH23xr2fPnsXVVTvttFMldx8AyEDFr/G69NJLi16br3/968XVTbvttlsxIbhJut9NusNwekzSROFbb7216PE56qijirsbH3300XHqqadWetcAgCpQUyqVSlGlk6Tq6la3ee+bdIn4ihWru+Ukqg+TWnWMepVPrcqnVuVTq+5fq8GDB5R1tVT3vDsPAEA7hBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICs1pVKpFFUo/bcbG9v+r/foURsNDY0f+j51R2rVMepVPrUqn1qVT626d61qa2uipqbmPdtVbbgBAPJkWAoAyIpwAwBkRbgBALIi3AAAWRFuAICsCDcAQFaEGwAgK8INAJAV4QYAyIpwAwBkRbgBALIi3AAAWRFuAICsCDebaGxsjBkzZsSBBx4YY8eOjZNOOileeeWVzt6tLmnZsmUxatSoVv9+8YtfdPaudSm33HJLfOlLX2qxbOHChXHMMccUx9jBBx8cP/rRjzpt/7p6rS688MJWx1iqWTVauXJlXHTRRXHQQQfFuHHj4otf/GLMmzevef3vfve7OPLII2PMmDExbdq0eOCBB6JavVetjjvuuFbH1ebHXrV488034xvf+Ebsv//+sc8++8TJJ58cL7zwQvc/X5VodsMNN5T222+/0n/8x3+UFi5cWDr++ONLU6dOLa1fv76zd63L+c///M/SJz7xidKyZctKy5cvb/63du3azt61LuPHP/5xafTo0aVjjjmmeVldXV1xjJ1//vmlP/3pT6Wf/exnRR3TYzVrq1bJ5z//+dK1117b4hh78803S9XouOOOK332s58tzZ07t7R48eLS9OnTS3vvvXfphRdeKI6ldBylWqWfb7311tKee+5Z+q//+q9SNdpSrZJJkyaVZs6c2eK4WrFiRakafeELXyj93d/9XemZZ54pjp3TTjutdMABB5TWrFnTrc9Xws2fpQCzzz77lO66667mZatWrSreEPfff3+n7ltX9IMf/KB0+OGHd/ZudElLly4tnXLKKaWxY8eWpk2b1uID++abby5OHO+8807zsmuuuaYI0dVoS7VqbGwslj/yyCOlavfSSy+VRo4cWZo3b16L+kyZMqV0/fXXl7797W8XQXBTZ599dvEFrdq8V63eeOONYv0f/vCHUrVbuXJlcZw899xzzcvSF/tUnxR2uvP5yrDUny1atChWr14dkyZNal42cODA2HPPPWPu3Lmdum9d0XPPPRcjRozo7N3okv7whz9Er1694le/+lUxRLCp1DU+ceLE6NmzZ/Oy1B380ksvxRtvvBHVZku1+t///d9Ys2ZN7LbbblHtBg0aFD/4wQ/iE5/4RPOympqa4l99fX1xXG167mo6rubPn5++wEY1ea9apXNX+nnXXXeNarfddtvFNddcEyNHjix+r6urizvuuCOGDx8eu+++e7c+Xwk3f7Z06dLicccdd2yxfOjQoc3reNfzzz9fvBH+4R/+IT75yU8WY9q//e1vO3u3uoQ0Ln3DDTfERz7ykVbr0rGUThybH2PJkiVLotpsqVbpGEv+7d/+rWg3ZcqUuOSSS+Ktt96KapO+aH3qU5+K3r17Ny97+OGH4+WXXy7mCLZ3XK1duzZWrFgR1eS9apWOq2233bY4ltKcnDQ/6frrr48NGzZENfv2t79dBOQ0V+tf/uVfon///t36fCXc/Fk6CSSbviGSPn36xPr16ztpr7qmjRs3xuLFi2PVqlVx2mmnFd+S0mSzNBEtTWqkfevWrWvzGEscZy2lD6Ha2triZHrzzTfHt771rXj88cfj1FNPLSb/V7Onnnoqzj///Jg6dWpMnjy5zeOq6fdq/9DevFbpuErvtb333jtuvfXW+OpXvxo//elPi8nr1ezYY4+Nn//85/HZz342vva1rxW9qt35fPVuX1OV69u3b/OJoOnnphewX79+nbhnXU/qopwzZ0706NGjuVYf//jH449//GPcdtttrbrHeVeq1+YfNk0nifRNiXelD52jjz66GGZIUtf5kCFD4qijjor/+Z//aTWMVS1mzZoV5557bnEV0NVXX938gbP5cdX0ezWfv9qqVeqxOe+884ohmabjKg2NnnXWWfHNb34z/uIv/iKq0e677148pl6bZ555Jn784x936/OVnps/axqOWr58eYvl6fdhw4Z10l51XQMGDGgRApM99tijuESc9qUu3raOscRx1lLqtWkKNpseY0m1DhWnD5zUW/rpT3+66M1q+hadzl9tHVfpAygNwVSj9mqVvpw1BZtqP67q6uqKYajUG7/p+y4FnXT8dOfzlXDzZ6NHj45tttmm6JFokiafLViwICZMmNCp+9bVpB6a9E1o01olv//975vTP21Lx1Ka5NnQ0NC87IknnigmN+6www6dum9dTfoW/Y//+I8tlqUem6Qaj7OZM2fGpZdeWsxzu/baa1sMF+y7777x5JNPtmifjqv0Pk0fVtVmS7VK97NJw1SbH1ep9+ZjH/tYVJM33ngjzj777BbTCd55553icy9dMNKdz1fVd9S3Ix386UZFqevy0UcfLa6eSt2UKbmmsVrelQ76dAVL6t5Ns+nTDZ8uu+yy+O///u9iKIH2/e3f/m28/fbbccEFF8Sf/vSn4qaH6eqEU045pbN3rcv5zGc+U5x0b7zxxuLKqdmzZ8c//dM/FXMCqu1KvRdffDG++93vxl/91V8Vx0r6UHr99deLf2mCdfrAfvbZZ4vzV3o/3n777fHrX/86TjzxxKg271WrdFzdd999cffddxc3aX3wwQfjyiuvjBNOOKH4gltNRo4cWUyq/s53vlNcFZzmI6W5bemLffpi0Z3PVzXpevDO3omuIqXTlPLTC5gmUqXUmu5yufPOO3f2rnU56YSRLiF87LHHijdCumQ+jW2nb5C8K50o/u///q+44qdJ+hBK49rp21GaQ3L88ccXwbratVWrhx56qJiwniawp+GVww8/PM4888zmIYZqkYZVrrvuujbXfe5zn4vLL7+8uFrxqquuKi7TTeesNCRz6KGHRrUpp1Z33XVX8S+Fm6Z5XOmCiGrs5XrrrbeKc3man5R+Tufw9F5sGqrrrucr4QYAyEr1xVQAIGvCDQCQFeEGAMiKcAMAZEW4AQCyItwAAFkRbgCArAg3AEBWhBsAICvCDQCQFeEGAIic/P+otduPdHIbxgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Défintion de E\n", + "x = [1, 2, 18, 20, 31]\n", + "\n", + "# Représentation graphique\n", + "y = [0, 0, 0, 0, 0]\n", + "plt.scatter(x, y)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5e4abc23", + "metadata": {}, + "source": [ + "### K-means : Question 1 " + ] + }, + { + "cell_type": "markdown", + "id": "5dea6f90", + "metadata": {}, + "source": [ + "**Déterminer la partition optimale par k-means en prenant pour centres initiaux les éléments 1, 2, 18**" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "41cc10ba", + "metadata": {}, + "outputs": [], + "source": [ + "# Définition des centres initiaux\n", + "init_points = np.array([1, 2, 18])\n", + "\n", + "# Itinitialisation algo\n", + "kmeans = KMeans(init=init_points.reshape(-1, 1), n_clusters=3, n_init=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "54857e7b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
KMeans(init=array([[ 1],\n",
+       "       [ 2],\n",
+       "       [18]]), n_clusters=3, n_init=1)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "KMeans(init=array([[ 1],\n", + " [ 2],\n", + " [18]]), n_clusters=3, n_init=1)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Transformation des données : plusieurs échantillons de 1 dimension\n", + "data_x = np.array(x)\n", + "data_x = data_x.reshape(-1, 1)\n", + "\n", + "# Fitting\n", + "kmeans.fit(data_x)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "72efd783", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.],\n", + " [ 2.],\n", + " [23.]])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Centroides finaux\n", + "final_centroids = kmeans.cluster_centers_\n", + "labels = kmeans.labels_\n", + "\n", + "final_centroids" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3110c8ca", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Représentation Graphique\n", + "plt.scatter(x, y, c=labels, cmap=\"viridis\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "a24927bc", + "metadata": {}, + "source": [ + "### K-means : Question 2" + ] + }, + { + "cell_type": "markdown", + "id": "c18297ba", + "metadata": {}, + "source": [ + "**Déterminer la partition optimale par k-means en prenant pour centres initiaux les éléments 18, 20, 31**" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d0ccbcf3-a06f-4757-bdd8-2cc3bd1626c6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.5],\n", + " [19. ],\n", + " [31. ]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Définition des centres initiaux\n", + "init_points = np.array([18, 20, 31])\n", + "\n", + "# Itinitialisation algo\n", + "kmeans = KMeans(init=init_points.reshape(-1, 1), n_clusters=3, n_init=1)\n", + "\n", + "# Transformation des données : plusieurs échantillons de 1 dimension\n", + "data_x = np.array(x)\n", + "data_x = data_x.reshape(-1, 1)\n", + "\n", + "# Fitting\n", + "kmeans.fit(data_x)\n", + "\n", + "# Centroides finaux\n", + "final_centroids = kmeans.cluster_centers_\n", + "labels = kmeans.labels_\n", + "\n", + "final_centroids" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b957bbe8", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Représentation Graphique\n", + "plt.scatter(x, y, c=labels, cmap=\"viridis\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2b85bc73", + "metadata": {}, + "source": [ + "### K-means : Question 3" + ] + }, + { + "cell_type": "markdown", + "id": "0c085473", + "metadata": {}, + "source": [ + "**Déterminer la partition optimale par k-means en prenant comme partition initiale {{1},{2,18},{20,31}}**" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0047b80a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.5],\n", + " [19. ],\n", + " [31. ]])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Définition des centres initiaux\n", + "init_points = np.array([1, np.mean([2, 18]), np.mean([20, 31])])\n", + "\n", + "# Itinitialisation algo\n", + "kmeans = KMeans(init=init_points.reshape(-1, 1), n_clusters=3, n_init=1)\n", + "\n", + "# Transformation des données : plusieurs échantillons de 1 dimension\n", + "data_x = np.array(x)\n", + "data_x = data_x.reshape(-1, 1)\n", + "\n", + "# Fitting\n", + "kmeans.fit(data_x)\n", + "\n", + "# Centroides finaux\n", + "final_centroids = kmeans.cluster_centers_\n", + "labels = kmeans.labels_\n", + "\n", + "final_centroids" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d0776ee3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Représentation Graphique\n", + "plt.scatter(x, y, c=labels, cmap=\"viridis\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5eaad20e", + "metadata": {}, + "source": [ + "### Classification Ascendante Hiérarchique avec le lien simple" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "1ebaaa05", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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GwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAAGAK4QYAAJhCuAEAAKYQbgAAgCmEGwAAYArhBgAAmBLneZ4nPqRlBwKRLz0hIV5ycwPiR9Tuv9r9Wrefa/dr3YraA2W9GxIfHydxcXE/2M634QYAANjEtBQAADCFcAMAAEwh3AAAAFMINwAAwBTCDQAAMIVwAwAATCHcAAAAUwg3AADAFMINAAAwhXADAABMIdwAAABTCDcAAMAUwg0AADCFcPMjBAIBmTFjhrRv316aNGkiAwcOlD179hTZPiMjQ0aMGCEtW7aUVq1ayfjx4+XEiRMSizIzM2Xs2LHSoUMHadasmdx5552ybt26Itu/+OKLUq9evUI/sejgwYNha3nvvffM9vvq1avD1qw/nTp1Cnuf9evXh22vjxVLXnrpJbnrrrvybduyZYv07t3bve6vvfZaee21137wcT7++GO54YYbpFGjRtK9e3f54osvJNbq/vTTT+XWW2+Vpk2buronTZokJ0+eLPIxcnNzXb0Fj4GZM2dKrNU+ZsyYQnXoc2C5z++6664iX/eLFy8u8nH69u1bqH3B5/Oc81BiM2fO9Fq3bu397W9/87Zs2eL169fP69Kli5eTkxO2fe/evb1bb73V++qrr7x//vOf3jXXXOM98sgjXizq27evd+ONN3pr1671du7c6Y0fP95r1KiRt2PHjrDthw4d6j388MPeoUOH8v3Eor///e/elVde6R08eDBfLSdOnDDb73pMF+y75cuXe/Xq1fPeeeedsPd58803vc6dOxe6X1Gvj2j0xhtvePXr13d9GJSenu5e96NGjfK++eYbV78eD0U9D+qLL77wGjZs6L366qvuPk8//bR3xRVXuH/HSt36Wv/FL37hvfjii96uXbvc66BDhw7eY489VuTjaH1169Z17495j4Fjx4550Spc7eq2227zpk2blq+OI0eOmO7zjIyMfPXqe16vXr28bt26FduHbdu29RYsWJDvvvpYZYlwU0L6Bt20aVP3Bh509OhR9wH/0UcfFWq/YcMG9yLPe2B//vnn7sPhwIEDXiz59ttvXS3r1q0LbQsEAu6DbPr06WHv86tf/cqbN2+eZ8HLL7/s3XTTTSVqa6nf88rOznYhrbgPtscff9y77777vFikfTNo0CCvSZMmXteuXfO94c+ePdtr166dd/r06dC2Z555xn2xKYp+8dGAn9ftt9/u/f73v/dipe4RI0Z499xzT77277//vvsALyqwLlmyxGvWrJkXC4qrXd/fdLsG+pKy0OcFvf766y6gFfUlVn333XfuPe/rr7/2ognTUiW0detWyc7OlrZt24a2JScnS4MGDWTt2rWF2uuUTfXq1aVOnTqhbTpFERcX54bvY0lKSoq8/PLLcuWVV4a2aR36k5WVVaj9qVOn5Ntvv5VLL71ULNi2bVu+fiyOpX7Pa/bs2W5q7dFHH43I8xRtvv76aylXrpx8+OGH0rhx40J9qn2YmJgY2tamTRt3jH/33Xdhp683bNiQ771CtW7dOux7RbTW3a9fv0L9HR8fL6dPn5Zjx47F/DFQXO3//e9/5fjx4yV+D7PS53mlp6fL9OnT5f777y/2edA+1/e3Sy65RKLJ/3+1olgHDhxwv2vXrp1ve40aNUK3FVynUbBt+fLlpVq1arJ//36JJRrirr766nzbli1bJrt375bf/e53hdp/8803bu5d2zzxxBOSk5Pj1p88/PDD7vmKNdu3b3cB7ze/+Y3s2rVLLr74YveC1/VHlvs975vc/Pnz3ToiraMo//nPf9zz1KNHD/c81K1bV4YPH+7WH0Q7XUtR1HoKfX1rLXkFj2Pt05/97Gf5btPArx+MtWrVKtF7RbTWrV/c8tJQo8fBFVdcIampqUW+Vs6cOSP9+/d3Xwhr1qwpffr0kZtvvlmiTXG1ax3q9ddfl88++8yFOn296/FctWrVQu2t9Hlef/zjH6VixYquL4ujz5U+JxMmTJB//OMfUrlyZenatas88MAD7r2vrDByU0LBBaEFO6tChQruwztc+3AdW1T7WKLfUEaNGiVdunSRjh07FvnGUKlSJXnuuedcwNm5c6fcfffdxS5GjEb6Rq37fvToURk8eLAbwdJFpffee2/YxYIW+33BggXuzev2228vso1+yH///ffuDV4XYs6aNct96OsiXA27sUyP2XCvexWuT4PHeEnfK2LldfDII4+4APv4448X2U5v15MPdDHp3Llz5frrr3fvFe+8847EEn0P00Cj4URHLR977DFZuXKl+8DWURrrfX7s2DF56623XLAJHuvFPVdao36JmTNnjvvi9/bbb7v3gbLEyE0JaYINTrkE/620U/VDPFx7bVuQttdkG6vS0tJk5MiR7oypqVOnhm2jZwnot5y83+4uv/xyt03PvtCzCWKFTkXo2T4JCQmhftdvrvomrm/eBYehLfa7niWhfZr3uC9IR6t0+F1fCzrkrXQac/Pmze7br54xFqvC9WnwAytcnwY/DMLdJ9x7RSx80A0bNkzWrFkjzz//fLEjcX/+85/dqG1SUpL7u379+rJv3z73WrntttskVugHdK9evdxIpNKRO51u7tmzp/z73/8uNJ1jrc/T0tJcLXqm3A/RERudvjzvvPNCz5W+B+golwbigiOb5wojNyUUnGo4dOhQvu36tw69FqTDkwXb6sGi32picWpGvfHGG2704pprrnHfZopL9AWHrbVmndKItiHaktA36oIf7BrWdOrFer/r1IJe7uCmm24q0fRlMNgo/ear6y/CPU+xJFyfBv8O99rX41xDT0nfK6KZ7rNOx/7rX/9yAaXg9HRB+joJBpsg/bCLtde9HrvBYJP3Na/C1WKpz4PhRvtaX9Ml+QIYDDYlea7OFcJNCek3kCpVquS7ZofOs+o3U11PUpBu047VdSlB+s1HNW/eXGJxamLixInujW7atGnFzqU+++yzbjhaz8YL2rt3r7v+y2WXXSaxREdodJSq4LVavvrqq7C1WOt3XUx7/vnnu+O/OLouQa+Fkve6TzqVoeEo1vo8XJ/qYnAdkQhatWqVW0Cpz01BurhSj5lgvwfpMdSiRQuJFToVq+tldM3Vm2++GfZ9Li99P9SF1wWv/6QjHcEPu1ihIw733HNPoTpUuOPZSp/nfd0XHJUuik5B6tRjwedKv+j8/Oc/l7JCuCkh/TDX9QM6FfPJJ5+4N20ddtNvdbr2RN/4Dh8+HJp71WFLPdi1zaZNm9yboV4ET4f3Yy3J6yLaJ598Uq677joZNGiQO0NEa9UfXWehIxP67+CQrLb73//+J+PGjXP31ekKHfHR50MvgBhLdORBzxTQoVd9we/YsUOeeuop901Wh64t97vS8F7UxRe1bj2DUGnN+k1Xh6c1+OkZFPpvHbEq+CERa3RoXqdmRo8e7dYP6Ye3LqzV10KQvg40BOS9qNmSJUtk3rx57piZPHmyuxCghoVYoce5htUpU6a4kdjga15/gkFP+1d/lH7L17PI9MvNihUr3NlkukZNz8rR138s0S9nuqZOp+H0zCmtR0+euPHGG0Nng1ns8+D6Of0iWtQXGn3N6zGQ97n64IMPZOHChe54Wbp0qatd1+vogECZKetz0WPJmTNnvMmTJ3tt2rRx1wgYOHCgt2fPHneb/tZz/d9999185/8PHjzYtdWLgOl1QE6ePOnFGr2Il9YW7ufRRx/1Vq1a5f6tv4P04nV6jQetvVWrVu4CaJmZmV4sOnz4sLu+y1VXXeUu3qZ16QXOrPe7GjBggDds2LCwt2ndM2bMCP29e/duV7f2d+PGjd11P7Zt2+bFGj2mC17748svv/R69uzprvmh1/vR638UvI9uL3hNmOuuu84dM7fccot7TcRK3fpep/td1Os++L6n7fM+V99//7335JNPeldffbV7rm6++Wbvr3/9qxeLfb506VKve/fu7lpm+trXi/LlfR1b6/O8x3rBa3Xlpa95vb3gBQH12mbB14d+ZuTm5nplKU7/U3bRCgAAILKYlgIAAKYQbgAAgCmEGwAAYArhBgAAmEK4AQAAphBuAACAKYQbAABgCuEGAACYQrgBAACmEG4AAIAphBsAACCW/D+YrMV2Fx7pCgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Défintion de E\n", + "x = [0, 2, 5, 8, 9, 13, 18]\n", + "\n", + "# Représentation graphique\n", + "y = [0, 0, 0, 0, 0, 0, 0]\n", + "plt.scatter(x, y)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "5e96f7f3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9re/jd133z023XTT2G677eLSSy99zxfmNYo777wzPv/5zxe1+NznPhe33HJLuO1MRKVSKW7Qt8MOO8TGG29c1Obmm2+udbPqQvoyyY022ig+9rGPzfczduzYWjetLjz88MPF/uUTn/hEbL/99kU/avTPVKVSidtuuy122WWXop985jOfiXPPPXfAHJP6fcfPweLf//53HHjggTFt2rT5tk+ePDm+8Y1vxCc/+cm45JJL4vXXXy9uo/7qq6/GVVddFY1cm7QDOPTQQ2PXXXeN73znO/HSSy/FxIkT480334yzzjorGslPfvKTOO2002LfffctPvQpmKYapIPIAQccEI3s/PPPjx/96Efx1a9+tQga//jHP+IHP/hB8Rk68cQTo5E9//zzxR2T09cxfPSjH527vVxu6PO9whNPPBGHHHJIEUqPPvro+POf/1zUqaenJw4++OBoVNdee21xLEr75HHjxsWUKVOKk7t0rLr++uujVCpFXas2mJ6enurdd99d3XLLLYuf0aNHV//4xz/O/fOJEydWN9544+r06dPnbrvtttuKv/fqq69WG7k2++yzT3X33Xef799ceuml1Q033LA6Y8aMaiPZc889q3vttdd824455pjqdtttV21kb7/9dtEfTjnllPm2/+Y3v6lusMEG1RdeeKHayO68887qmDFjql1dXbVuSt054IADql/5ylfm23bBBRdUx44dW+3s7Kw2op6enurmm29enTBhwnzb77333mL//Je//KVa7xouPj/33HNxxhlnFGfjF1xwwXv+PJ2JNjc3x/Dhw+duW2655YrH9vb2aOTapCG6Bben76xJw3np7KyRpH6SvpG4r9RPBnsf+V/+/ve/F2eeaSqtr0996lNFP/nd734Xjexvf/tbrLPOOsWXTTJPmnJNU7Np5KuvnXbaKWbMmFGMajSi6dOnx5e+9KX4whe+MN/21IeSV155Jepdw4WMVVddNR588ME46aSToqWl5T1/nuYDk/POOy/+85//FENSl19+eYwePbr4qvtGrs1HPvKRuZ07df4HHnigGK5L6xLa2tqikXz9618vpo9+8YtfFNNK6eD5s5/9rNghNLJRo0YVj//617/m256mTJI0ZdLoIaOpqamYUktrebbccss4/fTTB8z8ei7pYDlnzpxYa6215tu+5pprFo9piqARtbW1FV9Gmqbv+3rooYeKx/XWWy/qXcOtyegdlViUFCaOP/74OPPMM+Omm24qtqWvtE+L+tLOoZFr0+uNN96Irbfeem7wOOaYY6LRpGD1pz/9KU444YS52z796U/HySefHI1s7bXXLnaIl112Wayyyiqx1VZbFQeQtH4lnb3PnDkzGlVawJhGC9PjHnvsUaxv+utf/xo//OEP44UXXigWxzbq2oze9V8Ljg6OGDGieGz0ENbXk08+Gddcc00xWpiOV/WuMXv0+0hv3oQJE2KvvfaKG2+8MS6++OKio++///7x1ltv1bp5dSGNcqTapMVI6cCx5557FgtkG8lhhx0Wv/71r4tA+uMf/7g4iD711FPFgrVGXw2fFqWlK5OOOOKI4nG//fYr+kgKsX2nIRtN6hdXXnllcVXS3nvvHVtssUUxopH2N2k6oJGnktJU2vtp1PC1oNRPDjrooFhjjTWK0faBoOFGMt5PWldwxRVXFJcKpSHMvvPJn/3sZ4vLqb773e9Go0tDeGmVc5IuUUy1SVdbpINKI3jssceKA0K6tDmdkSZp2DuN6qRV8Oky3wXXJDSSFVdcsfgcdXR0FKNe6SqKdJBI632WXXbZaFSpBmlfsqB0mXySRjm23XbbaEStra3FY1p/0VfvCMaCIxyN6L777iuuzkpTSumKk96pyXonHvbxzjvvRGdnZ3F/jL5WWGGFYhg4rc9oVGkxX+rkzzzzzHzbU6JOB450MGkUvesNFuwn6aw9aeR+ktx7773x7LPPFmE0zRmn0a60FiGdrY4ZMyYaVRrtS6MYC65XmTVrVvE4UA4aOaQgmqajX3755YWu5Vl33XWjkV133XVx7LHHFut40tT9SiutFAOFkLFAmEhDuguuZE7hI62aT2eqjSrtANI9MdJPX08//XRxRUW6oVCj6F38mu6NseAIR9LI/SRJUwJp2rGvNL2WzlYXdibfSEE9Tavdcccd821P4T19vnpDaiMaNmxY8f+fFp73nW68//77i36zySabRKO6/fbbi6v60v1D0ghG76jPQGG6pI/0QT/yyCOLmyqldRjpTU1XmFx99dVzV4Q3slSbNF2Uhr133nnnYkFfmn9Pi496r8ppBOlsPF1al246NXXq1OLuhGnhXlrsmO7muOBleI0m3aAs9ZH111+/uENhOoj+6le/KtYeDLQd5NK02mqrxW677VaclaaDaqpNOqFJN/lLazTSaGkjSwth040Q07qmtD95/PHHi1qlG/816lqeN998s1h7kS4+SH1kwZHkNAK0/PLLRz0rpZtlRINK12WnSxHTVSR9z7DSZYk33HBDceBIQ5gpYaehqkY6Q11UbdJix3SWmu72ucwyyxTrMdJOoNHm2tN1/emMPfWVNFWUDiCpFocffvjcFfGNLN3xM10tkXaS6eCZ7la44LX+jSj1m3Q2mvpNmjZJV+CkdT1pMZ/FjVGMZKQTl3TJ6sorr1wcWBv55O6uu+6KU045ZZF/ngJICq71rKFDBgCQj+gMAGQhZAAAWQgZAEAWQgYAkIWQAQBkIWQAAFkIGQBAFkIGAJCFkAEAZCFkAABZCBkAQOTw/wGT5waPeBdakgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Calcul de CAH avec lien simple\n", + "data = list(zip(x, strict=False))\n", + "\n", + "linkage_data = linkage(data, method=\"single\", metric=\"euclidean\")\n", + "dendrogram(linkage_data, labels=x)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "874c878c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0 0 0 0 0 2 1]\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Calcul de la partition de l'espace\n", + "hierarchical_cluster = AgglomerativeClustering(\n", + " n_clusters=3, metric=\"euclidean\", linkage=\"single\"\n", + ")\n", + "\n", + "labels = hierarchical_cluster.fit_predict(data)\n", + "print(labels)\n", + "\n", + "# Représentation Graphique\n", + "plt.scatter(x, y, c=labels, cmap=\"viridis\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "75420ae4", + "metadata": {}, + "source": [ + "### Classification Ascendante Hiérarchique avec le lien complet" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "8f098bc3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Calcul de CAH avec lien complet\n", + "data = list(zip(x, strict=False))\n", + "\n", + "linkage_data = linkage(data, method=\"complete\", metric=\"euclidean\")\n", + "dendrogram(linkage_data, labels=x)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68ccdf5c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2 2 1 1 1 0 0]\n" + ] + }, + { + "data": { + "image/png": "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uWYekdZRmm+//dY8Tn379jWPQ5MmTWT48OFm/kFlp3MpSptPoa9vraUw//NYj+l5551X5Hca+PWNsW7duuU6V1TWuvWDW2EaavR50KJFC0lKSir1tZKfny933323+UBYp04dufPOO+XGG2+Uyqas2rUO9cYbb8jKlStNqNPXuz6fq1WrVqK9Lce8sFdffVWqVKlijmVZ9LHSx2T8+PHyj3/8Q+Li4qRXr15y//33m3PfuULPTTn5J4QWP1gxMTHmzTtY+2AHtrT24UQ/oYwaNUp69uwpXbt2LfXEEBsbK88995wJODt37pQ77rijzMmIlZGeqHXfjx07Jg888IDpwdJJpffcc0/QyYI2HvcFCxaYk9ctt9xSaht9kz9+/Lg5wetEzFmzZpk3fZ2Eq2E3nOlzNtjrXgU7pv7neHnPFeHyOnjkkUdMgH3yySdLbae/14sPdDLpnDlz5NprrzXninfffVfCiZ7DNNBoONFey8cee0xWrVpl3rC1l8b2Y37ixAl5++23TbDxP9fLeqy0Rv0QM3v2bPPB75133jHngXOJnpty0gTrH3Lx/6z0oOqbeLD22rY4ba/JNlwtX75cRo4caa6YmjJlStA2epWAfsop/Onu4osvNtv06gu9miBc6FCEXu0TEREROO76yVVP4nryLt4NbeNx16sk9JgWft4Xp71V2v2urwXt8lY6jLllyxbz6VevGAtXwY6p/w0r2DH1vxkEu02wc0U4vNENGzZM1q5dK88//3yZPXEff/yx6bWNj483/09OTpb9+/eb18rNN98s4ULfoPv37296IpX23Olwc79+/eTf//53ieEc24758uXLTS16pdypaI+NDl9Wr1498FjpOUB7uTQQF+/ZPFvouSkn/1DDoUOHimzX/2vXa3HaPVm8rT5Z9FNNOA7NqDfffNP0Xlx99dXm00xZib54t7XWrEMala2Ltjz0RF38jV3Dmg692H7cdWhBlzu44YYbyjV86Q82Sj/56vyLYI9TOAl2TP3/D/ba1+e5hp7ynisqM91nHY7917/+ZQJK8eHp4vR14g82fvpmF26ve33u+oNN4de8ClaLTcfcH270WOtrujwfAP3BpjyP1dlCuCkn/QRStWrVImt26DirfjLV+STF6TY9sDovxU8/+ai2bdtKOA5NTJgwwZzopk6dWuZY6rRp00x3tF6N57dv3z6z/kvjxo0lnGgPjfZSFV+r5euvvw5ai23HXSfT1qxZ0zz/y6LzEnQtlMLrPulQhoajcDvmwY6pTgbXHgm/1atXmwmU+tgUp5Mr9TnjP+5++hxq166dhAsditX5Mjrnav78+UHPc4Xp+VAnXhdf/0l7OvxvduFCexzuuuuuEnWoYM9nW4554dd98V7p0ugQpA49Fn+s9IPOz372MzlXCDflpG/mOn9Ah2I+/fRTc9LWbjf9VKdzT/TEd/jw4cDYq3Zb6pNd22zevNmcDHURPO3eD7ckr5Non3rqKbnmmmtkyJAh5goRrVW/dJ6F9kzoz/4uWW33ww8/yNixY81tdbhCe3z08dAFEMOJ9jzolQLa9aov+O+//16efvpp80lWu65tPu5Kw3tpiy9q3XoFodKa9ZOudk9r8NMrKPRn7bEq/iYRbrRrXodmnnjiCTN/SN+8dWKtvhb89HWgIaDwomaLFy+W119/3TxnJk2aZBYC1LAQLvR5rmF18uTJpifW/5rXL3/Q0+OrX0o/5etVZPrhZsWKFeZqMp2jplfl6Os/nOiHM51Tp8NweuWU1qMXT1x//fWBq8FsPOb++XP6QbS0DzT6mtfnQOHH6oMPPpC33nrLPF+WLFliatf5OtohcM6c62vRw0l+fr4zadIk5/LLLzdrBAwePNjZu3ev+Z1+12v933vvvSLX/z/wwAOmrS4CpuuA5OTkOOFGF/HS2oJ9Pfroo87q1avNz/rdTxev0zUetPYOHTqYBdDS09OdcHT48GGzvssVV1xhFm/TunSBM9uPuxo0aJAzbNiwoL/TumfMmBH4/549e0zderxbtWpl1v3Yvn27E270OV187Y+vvvrK6devn1nzQ9f70fU/it9GtxdfE+aaa64xz5mbbrrJvCbCpW491+l+l/a695/3tH3hx+r48ePOU0895Vx11VXmsbrxxhudv/3tb044HvMlS5Y4ffr0MWuZ6WtfF+Ur/Dq27ZgXfq4XX6urMH3N6++LLwioa5v5Xx/6nlFQUOCcSx7959xFKwAAgNBiWAoAAFiFcAMAAKxCuAEAAFYh3AAAAKsQbgAAgFUINwAAwCqEGwAAYBXCDQAAsArhBgAAWIVwAwAArEK4AQAAYpP/B99OWNlCrUV2AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Calcul de la partition de l'espace\n", + "hierarchical_cluster = AgglomerativeClustering(\n", + " n_clusters=3, metric=\"euclidean\", linkage=\"complete\"\n", + ")\n", + "\n", + "labels = hierarchical_cluster.fit_predict(data)\n", + "print(labels)\n", + "\n", + "# Représentation Graphique\n", + "plt.scatter(x, y, c=labels, cmap=\"viridis\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "99bc3508", + "metadata": {}, + "source": [ + "## K-means: Cas pratique" + ] + }, + { + "cell_type": "markdown", + "id": "b2b035d2", + "metadata": {}, + "source": [ + "### Import des données" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "8051b5f4", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "int64", + "type": "integer" + }, + { + "name": "ZONE_RISQUE", + "rawType": "object", + "type": "string" + }, + { + "name": "NB", + "rawType": "int64", + "type": "integer" + }, + { + "name": "CHARGE", + "rawType": "float64", + "type": "float" + }, + { + "name": "EXPO", + "rawType": "float64", + "type": "float" + }, + { + "name": "FREQ", + "rawType": "float64", + "type": "float" + }, + { + "name": "CM", + "rawType": "float64", + "type": "float" + }, + { + "name": "FREQxCHARGE", + "rawType": "float64", + "type": "float" + } + ], + "ref": "96564cd0-30e4-4347-a31a-4e7519cd4c0b", + "rows": [ + [ + "0", + "A", + "236", + "1174911.57", + "986430.8907103825", + "0.00023924636000606546", + "4978.438855932203", + "281.0933164515116" + ], + [ + "1", + "B", + "181", + "1146823.23", + "909243.3551912569", + "0.00019906661837735087", + "6336.039944751381", + "228.2942222726909" + ], + [ + "2", + "C", + "284", + "1926300.0", + "1356654.5300546447", + "0.00020933848205892237", + "6782.7464788732395", + "403.24871799010214" + ], + [ + "3", + "D", + "83", + "455800.64", + "314767.9918032787", + "0.00026368627738957876", + "5491.573975903615", + "120.18837399338753" + ], + [ + "4", + "E", + "20", + "181747.82", + "137874.1612021858", + "0.00014505981269884912", + "9087.391", + "26.364304727624145" + ], + [ + "5", + "F", + "1", + "19418.42", + "12129.715846994535", + "8.244216209300377e-05", + "19418.42", + "1.6008965292300261" + ], + [ + "6", + "G", + "5", + "29820.87", + "26935.5", + "0.000185628631360101", + "5964.174", + "5.535607284067495" + ], + [ + "7", + "H", + "14", + "86476.9", + "46174.15300546448", + "0.00030319993088651065", + "6176.921428571428", + "26.219790103279692" + ], + [ + "8", + "I", + "4", + "32686.63", + "13981.37431693989", + "0.0002860949080773543", + "8171.6575", + "9.351478405208491" + ], + [ + "9", + "J", + "12", + "75580.99", + "28698.71857923497", + "0.00041813713622330966", + "6298.4158333333335", + "31.603218711522608" + ], + [ + "10", + "K", + "17", + "87411.64", + "72896.8743169399", + "0.00023320615814181092", + "5141.861176470588", + "20.384932741275044" + ], + [ + "11", + "L", + "7", + "22684.079999999998", + "24877.61202185792", + "0.0002813774888783406", + "3240.582857142857", + "6.382789467915388" + ], + [ + "12", + "M", + "1", + "6352.66", + "1010.7759562841533", + "0.0009893389269727308", + "6352.66", + "6.284933827822588" + ], + [ + "13", + "R", + "0", + "0.0", + "729.1994535519125", + "0.0", + "0.0", + "0.0" + ], + [ + "14", + "S", + "0", + "0.0", + "1783.620218579235", + "0.0", + "0.0", + "0.0" + ], + [ + "15", + "T", + "1", + "3053.17", + "3044.155737704918", + "0.00032849830500259836", + "3053.17", + "1.0029611698847833" + ], + [ + "16", + "X", + "0", + "0.0", + "1627.1803278688521", + "0.0", + "0.0", + "0.0" + ] + ], + "shape": { + "columns": 7, + "rows": 17 + } + }, + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ZONE_RISQUENBCHARGEEXPOFREQCMFREQxCHARGE
0A2361174911.579.864309e+050.0002394978.438856281.093316
1B1811146823.239.092434e+050.0001996336.039945228.294222
2C2841926300.001.356655e+060.0002096782.746479403.248718
3D83455800.643.147680e+050.0002645491.573976120.188374
4E20181747.821.378742e+050.0001459087.39100026.364305
5F119418.421.212972e+040.00008219418.4200001.600897
6G529820.872.693550e+040.0001865964.1740005.535607
7H1486476.904.617415e+040.0003036176.92142926.219790
8I432686.631.398137e+040.0002868171.6575009.351478
9J1275580.992.869872e+040.0004186298.41583331.603219
10K1787411.647.289687e+040.0002335141.86117620.384933
11L722684.082.487761e+040.0002813240.5828576.382789
12M16352.661.010776e+030.0009896352.6600006.284934
13R00.007.291995e+020.0000000.0000000.000000
14S00.001.783620e+030.0000000.0000000.000000
15T13053.173.044156e+030.0003283053.1700001.002961
16X00.001.627180e+030.0000000.0000000.000000
\n", + "
" + ], + "text/plain": [ + " ZONE_RISQUE NB CHARGE EXPO FREQ CM \\\n", + "0 A 236 1174911.57 9.864309e+05 0.000239 4978.438856 \n", + "1 B 181 1146823.23 9.092434e+05 0.000199 6336.039945 \n", + "2 C 284 1926300.00 1.356655e+06 0.000209 6782.746479 \n", + "3 D 83 455800.64 3.147680e+05 0.000264 5491.573976 \n", + "4 E 20 181747.82 1.378742e+05 0.000145 9087.391000 \n", + "5 F 1 19418.42 1.212972e+04 0.000082 19418.420000 \n", + "6 G 5 29820.87 2.693550e+04 0.000186 5964.174000 \n", + "7 H 14 86476.90 4.617415e+04 0.000303 6176.921429 \n", + "8 I 4 32686.63 1.398137e+04 0.000286 8171.657500 \n", + "9 J 12 75580.99 2.869872e+04 0.000418 6298.415833 \n", + "10 K 17 87411.64 7.289687e+04 0.000233 5141.861176 \n", + "11 L 7 22684.08 2.487761e+04 0.000281 3240.582857 \n", + "12 M 1 6352.66 1.010776e+03 0.000989 6352.660000 \n", + "13 R 0 0.00 7.291995e+02 0.000000 0.000000 \n", + "14 S 0 0.00 1.783620e+03 0.000000 0.000000 \n", + "15 T 1 3053.17 3.044156e+03 0.000328 3053.170000 \n", + "16 X 0 0.00 1.627180e+03 0.000000 0.000000 \n", + "\n", + " FREQxCHARGE \n", + "0 281.093316 \n", + "1 228.294222 \n", + "2 403.248718 \n", + "3 120.188374 \n", + "4 26.364305 \n", + "5 1.600897 \n", + "6 5.535607 \n", + "7 26.219790 \n", + "8 9.351478 \n", + "9 31.603219 \n", + "10 20.384933 \n", + "11 6.382789 \n", + "12 6.284934 \n", + "13 0.000000 \n", + "14 0.000000 \n", + "15 1.002961 \n", + "16 0.000000 " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "path = input_path + \"/base_retraitee.csv\"\n", + "data_retraitee = pd.read_csv(path, sep=\",\", decimal=\".\")\n", + "\n", + "# Group by ZONE_RISQUE and aggregate the necessary columns\n", + "data = data_retraitee.groupby([\"ZONE_RISQUE\"], as_index=False).agg(\n", + " {\"NB\": \"sum\", \"CHARGE\": \"sum\", \"EXPO\": \"sum\"}\n", + ")\n", + "\n", + "# Calculate derived metrics\n", + "data[\"FREQ\"] = data[\"NB\"] / data[\"EXPO\"]\n", + "data[\"FREQ\"] = data[\"FREQ\"].fillna(0)\n", + "\n", + "data[\"CM\"] = data[\"CHARGE\"] / data[\"NB\"]\n", + "data[\"CM\"] = data[\"CM\"].fillna(0)\n", + "\n", + "data[\"FREQxCHARGE\"] = data[\"FREQ\"] * data[\"CHARGE\"]\n", + "data[\"FREQxCHARGE\"] = data[\"FREQxCHARGE\"].fillna(0)\n", + "\n", + "data" + ] + }, + { + "cell_type": "markdown", + "id": "aeff9cff", + "metadata": {}, + "source": [ + "**Exercice :** Regrouper les zones géographiques en 5 zones homogènes en termes :\n", + "* Fréquence de sinistres (La fréquence est égale au Nombre de sinistres divisé par l'exposition)\n", + "* Charge \n", + "* Fréquence de sinistres x Charge \n", + " \n", + "A chaque fois :\n", + "* Afficher les coordonnées des centroïdes\n", + "* Représenter graphiquement la partition obtenue" + ] + }, + { + "cell_type": "markdown", + "id": "1c4333b8", + "metadata": {}, + "source": [ + "### Regroupement de zones selon la fréquence" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6e35f286", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Coordonnées des centroïdes : \n", + "[[1.45059813e-04]\n", + " [2.06105405e-05]\n", + " [9.89338927e-04]\n", + " [3.13499008e-04]\n", + " [2.13297250e-04]]\n", + "Nombre d'itérations réalisées : \n", + "3\n", + "Partition : \n", + "[4 4 4 3 0 1 4 3 3 3 4 3 2 1 1 3 1]\n" + ] + } + ], + "source": [ + "# Initialisation de l'algorithme\n", + "kmeans_FREQ = KMeans(\n", + " init=\"random\", n_clusters=5, n_init=1, random_state=42, max_iter=300\n", + ")\n", + "\n", + "# Transformation des données : plusieurs échantillons de 1 dimension\n", + "data_freq = data[\"FREQ\"].to_numpy()\n", + "data_freq = data_freq.reshape(-1, 1)\n", + "\n", + "# Fitting\n", + "kmeans_FREQ.fit(data_freq)\n", + "\n", + "# Centroïdes\n", + "print(\"Coordonnées des centroïdes : \")\n", + "print(kmeans_FREQ.cluster_centers_)\n", + "# Itérations nécessaire pour la résolution\n", + "print(\"Nombre d'itérations réalisées : \")\n", + "print(kmeans_FREQ.n_iter_)\n", + "# Classes\n", + "print(\"Partition : \")\n", + "print(kmeans_FREQ.labels_)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "277e3d46", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Cluster_FREQ=4
FREQ=%{x}
Y=%{y}", + "legendgroup": "4", + "marker": { + "color": "#636efa", + "symbol": "circle" + }, + "mode": "markers", + "name": "4", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/rNRBzalUKD/efhelGZEuPw==", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAAAAAA=", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ=3
FREQ=%{x}
Y=%{y}", + "legendgroup": "3", + "marker": { + "color": "#EF553B", + "symbol": "circle" + }, + "mode": "markers", + "name": "3", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "uSYT8OtHMT/+84zJ2d4zP04cFEbgvzI/BVFIUy1nOz8N79Acu3AyP6oYDnpJhzU/", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAAAAAAA", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ=0
FREQ=%{x}
Y=%{y}", + "legendgroup": "0", + "marker": { + "color": "#00cc96", + "symbol": "circle" + }, + "mode": "markers", + "name": "0", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "ER+STWYDIz8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AA==", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ=1
FREQ=%{x}
Y=%{y}", + "legendgroup": "1", + "marker": { + "color": "#ab63fa", + "symbol": "circle" + }, + "mode": "markers", + "name": "1", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "3mpcj5mcFT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAAAAA==", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ=2
FREQ=%{x}
Y=%{y}", + "legendgroup": "2", + "marker": { + "color": "#FFA15A", + "symbol": "circle" + }, + "mode": "markers", + "name": "2", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "ESaBlZY1UD8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AA==", + "dtype": "i1" + }, + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "Cluster_FREQ" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "FREQ" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Y" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualisation\n", + "data[\"Cluster_FREQ\"] = kmeans_FREQ.labels_\n", + "data[\"Cluster_FREQ\"] = data[\"Cluster_FREQ\"].astype(str)\n", + "data[\"Y\"] = 0\n", + "\n", + "fig = px.scatter(data, x=\"FREQ\", y=\"Y\", color=\"Cluster_FREQ\")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "9c738659", + "metadata": {}, + "source": [ + "### Regroupement de zones selon le coût moyen" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "f461bfb8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Coordonnées des centroïdes : \n", + "[[ 5946.98129932]\n", + " [ 0. ]\n", + " [ 8629.52425 ]\n", + " [ 3146.87642857]\n", + " [19418.42 ]]\n", + "Nombre d'itérations réalisées : \n", + "6\n", + "Partition : \n", + "[0 0 0 0 2 4 0 0 2 0 0 3 0 1 1 3 1]\n" + ] + } + ], + "source": [ + "# Initialisation de l'algorithme\n", + "kmeans_CM = KMeans(init=\"random\", n_clusters=5, n_init=1, random_state=42)\n", + "\n", + "# Transformation des données : plusieurs échantillons de 1 dimension\n", + "data_cm = data[\"CM\"].to_numpy()\n", + "data_cm = data_cm.reshape(-1, 1)\n", + "\n", + "# Fitting\n", + "kmeans_CM.fit(data_cm)\n", + "\n", + "# Centroïdes\n", + "print(\"Coordonnées des centroïdes : \")\n", + "print(kmeans_CM.cluster_centers_)\n", + "# Itérations nécessaire pour la résolution\n", + "print(\"Nombre d'itérations réalisées : \")\n", + "print(kmeans_CM.n_iter_)\n", + "# Classes\n", + "print(\"Partition : \")\n", + "print(kmeans_CM.labels_)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "98b2a0bf", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Cluster_CM=0
FREQ=%{x}
Y=%{y}", + "legendgroup": "0", + "marker": { + "color": "#636efa", + "symbol": "circle" + }, + "mode": "markers", + "name": "0", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/uSYT8OtHMT+s1EHNqVQoP/7zjMnZ3jM/BVFIUy1nOz/efhelGZEuPxEmgZWWNVA/", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAAAAAAAAAAA", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_CM=2
FREQ=%{x}
Y=%{y}", + "legendgroup": "2", + "marker": { + "color": "#EF553B", + "symbol": "circle" + }, + "mode": "markers", + "name": "2", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "ER+STWYDIz9OHBRG4L8yPw==", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAA=", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_CM=4
FREQ=%{x}
Y=%{y}", + "legendgroup": "4", + "marker": { + "color": "#00cc96", + "symbol": "circle" + }, + "mode": "markers", + "name": "4", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "3mpcj5mcFT8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AA==", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_CM=3
FREQ=%{x}
Y=%{y}", + "legendgroup": "3", + "marker": { + "color": "#ab63fa", + "symbol": "circle" + }, + "mode": "markers", + "name": "3", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "De/QHLtwMj+qGA56SYc1Pw==", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAA=", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_CM=1
FREQ=%{x}
Y=%{y}", + "legendgroup": "1", + "marker": { + "color": "#FFA15A", + "symbol": "circle" + }, + "mode": "markers", + "name": "1", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAAA", + "dtype": "i1" + }, + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "Cluster_CM" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "FREQ" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Y" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualisation\n", + "data[\"Cluster_CM\"] = kmeans_CM.labels_\n", + "data[\"Cluster_CM\"] = data[\"Cluster_CM\"].astype(str)\n", + "data[\"Y\"] = 0\n", + "\n", + "fig = px.scatter(data, x=\"FREQ\", y=\"Y\", color=\"Cluster_CM\")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "6b154f4a", + "metadata": {}, + "source": [ + "### Regroupement de zones selon (fréquence; le coût moyen)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "1d89f70e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Coordonnées des centroïdes : \n", + "[[ 6.88870225]\n", + " [ 0.52077154]\n", + " [ 26.14306157]\n", + " [120.18837399]\n", + " [304.21208557]]\n", + "Nombre d'itérations réalisées : \n", + "4\n", + "Partition : \n", + "[4 4 4 3 2 1 0 2 0 2 2 0 0 1 1 1 1]\n" + ] + } + ], + "source": [ + "# Initialisation de l'algorithme\n", + "kmeans_FREQ_CM = KMeans(\n", + " init=\"random\", n_clusters=5, n_init=1, random_state=42, max_iter=300\n", + ")\n", + "\n", + "# Transformation des données : plusieurs échantillons de 1 dimension\n", + "data_x = data[\"FREQxCHARGE\"].to_numpy()\n", + "data_x = data_x.reshape(-1, 1)\n", + "\n", + "# Fitting\n", + "kmeans_FREQ_CM.fit(data_x)\n", + "\n", + "# Centroïdes\n", + "print(\"Coordonnées des centroïdes : \")\n", + "print(kmeans_FREQ_CM.cluster_centers_)\n", + "# Itérations nécessaire pour la résolution\n", + "print(\"Nombre d'itérations réalisées : \")\n", + "print(kmeans_FREQ_CM.n_iter_)\n", + "# Classes\n", + "print(\"Partition : \")\n", + "print(kmeans_FREQ_CM.labels_)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "48aa493b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Cluster_FREQ_CM=4
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "4", + "marker": { + "color": "#636efa", + "symbol": "circle" + }, + "mode": "markers", + "name": "4", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "H4XrkX/tMUGuR+E6x38xQQAAAACcZD1B", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ_CM=3
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "3", + "marker": { + "color": "#EF553B", + "symbol": "circle" + }, + "mode": "markers", + "name": "3", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "uSYT8OtHMT8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "9ihcj+LRG0E=", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ_CM=2
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "2", + "marker": { + "color": "#00cc96", + "symbol": "circle" + }, + "mode": "markers", + "name": "2", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "ER+STWYDIz/+84zJ2d4zPwVRSFMtZzs/3n4XpRmRLj8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "9ihcj54vBkFmZmZmzhz1QHE9CtfPc/JA16NwPTpX9UA=", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ_CM=1
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "1", + "marker": { + "color": "#ab63fa", + "symbol": "circle" + }, + "mode": "markers", + "name": "1", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "3mpcj5mcFT8AAAAAAAAAAAAAAAAAAAAAqhgOekmHNT8AAAAAAAAAAA==", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "FK5H4Zr20kAAAAAAAAAAAAAAAAAAAAAApHA9Clfap0AAAAAAAAAAAA==", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ_CM=0
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "0", + "marker": { + "color": "#FFA15A", + "symbol": "circle" + }, + "mode": "markers", + "name": "0", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "rNRBzalUKD9OHBRG4L8yPw3v0By7cDI/ESaBlZY1UD8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "4XoUrjcf3UAfhetRqOvfQOtRuB4FJ9ZAXI/C9ajQuEA=", + "dtype": "f8" + }, + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "Cluster_FREQ_CM" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "FREQ" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "CHARGE" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualisation\n", + "data[\"Cluster_FREQ_CM\"] = kmeans_FREQ_CM.labels_\n", + "data[\"Cluster_FREQ_CM\"] = data[\"Cluster_FREQ_CM\"].astype(str)\n", + "\n", + "fig = px.scatter(data, x=\"FREQ\", y=\"CHARGE\", color=\"Cluster_FREQ_CM\")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f1cac03f", + "metadata": {}, + "source": [ + "## C.A.H : Cas pratique" + ] + }, + { + "cell_type": "markdown", + "id": "bffff328", + "metadata": {}, + "source": [ + "**Exercice :** Comparer les résultats obtenus via K-means à ceux d'une C.A.H (lien simple) pour la fréquence et (fréquence; coût moyen)\n", + " \n", + "A chaque fois :\n", + "* Tracer le dendrogramme associé\n", + "* Représenter graphiquement la partition obtenue" + ] + }, + { + "cell_type": "markdown", + "id": "8453bf02", + "metadata": {}, + "source": [ + "### Regroupement de zones selon la fréquence" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "341bf2b2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Calcul de CAH avec lien simple\n", + "data_x = data[\"FREQ\"].to_numpy()\n", + "data_x = data_x.reshape(-1, 1)\n", + "\n", + "linkage_data = linkage(data_x, method=\"single\", metric=\"euclidean\")\n", + "dendrogram(linkage_data, labels=np.array(data[\"ZONE_RISQUE\"]))\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f0c9650", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ZONE_RISQUE Cluster\n", + "0 A 0\n", + "1 B 0\n", + "2 C 0\n", + "3 D 0\n", + "4 E 0\n", + "5 F 4\n", + "6 G 0\n", + "7 H 0\n", + "8 I 0\n", + "9 J 2\n", + "10 K 0\n", + "11 L 0\n", + "12 M 3\n", + "13 R 1\n", + "14 S 1\n", + "15 T 0\n", + "16 X 1\n" + ] + } + ], + "source": [ + "# Calcul de la partition de l'espace\n", + "hierarchical_cluster = AgglomerativeClustering(\n", + " n_clusters=5, metric=\"euclidean\", linkage=\"single\"\n", + ")\n", + "\n", + "labels = hierarchical_cluster.fit_predict(data_x)\n", + "print(pd.DataFrame({\"ZONE_RISQUE\": data[\"ZONE_RISQUE\"], \"Cluster\": labels}))" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "3d77b67c", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Cluster_FREQ=0
FREQ=%{x}
Y=%{y}", + "legendgroup": "0", + "marker": { + "color": "#636efa", + "symbol": "circle" + }, + "mode": "markers", + "name": "0", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/uSYT8OtHMT8RH5JNZgMjP6zUQc2pVCg//vOMydneMz9OHBRG4L8yP95+F6UZkS4/De/QHLtwMj+qGA56SYc1Pw==", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAAAAAAAAAAAAAA=", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ=4
FREQ=%{x}
Y=%{y}", + "legendgroup": "4", + "marker": { + "color": "#EF553B", + "symbol": "circle" + }, + "mode": "markers", + "name": "4", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "3mpcj5mcFT8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AA==", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ=2
FREQ=%{x}
Y=%{y}", + "legendgroup": "2", + "marker": { + "color": "#00cc96", + "symbol": "circle" + }, + "mode": "markers", + "name": "2", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "BVFIUy1nOz8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AA==", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ=3
FREQ=%{x}
Y=%{y}", + "legendgroup": "3", + "marker": { + "color": "#ab63fa", + "symbol": "circle" + }, + "mode": "markers", + "name": "3", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "ESaBlZY1UD8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AA==", + "dtype": "i1" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ=1
FREQ=%{x}
Y=%{y}", + "legendgroup": "1", + "marker": { + "color": "#FFA15A", + "symbol": "circle" + }, + "mode": "markers", + "name": "1", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAAA", + "dtype": "i1" + }, + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "Cluster_FREQ" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "FREQ" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Y" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualisation\n", + "data[\"Cluster_FREQ\"] = labels\n", + "data[\"Cluster_FREQ\"] = data[\"Cluster_FREQ\"].astype(str)\n", + "data[\"Y\"] = 0\n", + "\n", + "fig = px.scatter(data, x=\"FREQ\", y=\"Y\", color=\"Cluster_FREQ\")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "6ace7bc5", + "metadata": {}, + "source": [ + "### Regroupement de zones selon (fréquence; le coût moyen)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "16103b5b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Calcul de CAH avec lien simple\n", + "data_x = data[[\"FREQ\", \"CM\"]].to_numpy()\n", + "data_x = data_x.reshape(-1, 2)\n", + "\n", + "linkage_data = linkage(data_x, method=\"single\", metric=\"euclidean\")\n", + "dendrogram(linkage_data, labels=np.array(data[\"ZONE_RISQUE\"]))\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "67bf3800", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ZONE_RISQUE Cluster\n", + "0 A 1\n", + "1 B 1\n", + "2 C 1\n", + "3 D 1\n", + "4 E 0\n", + "5 F 3\n", + "6 G 1\n", + "7 H 1\n", + "8 I 0\n", + "9 J 1\n", + "10 K 1\n", + "11 L 4\n", + "12 M 1\n", + "13 R 2\n", + "14 S 2\n", + "15 T 4\n", + "16 X 2\n" + ] + } + ], + "source": [ + "# Calcul de la partition de l'espace\n", + "hierarchical_cluster = AgglomerativeClustering(\n", + " n_clusters=5, metric=\"euclidean\", linkage=\"single\"\n", + ")\n", + "\n", + "labels = hierarchical_cluster.fit_predict(data_x)\n", + "print(pd.DataFrame({\"ZONE_RISQUE\": data[\"ZONE_RISQUE\"], \"Cluster\": labels}))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0efdf7c1", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Cluster_FREQ_CHARGE=1
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "1", + "marker": { + "color": "#636efa", + "symbol": "circle" + }, + "mode": "markers", + "name": "1", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "DKJ1lcZbLz+MRDc7kRcqP8dbVN47cCs/uSYT8OtHMT+s1EHNqVQoP/7zjMnZ3jM/BVFIUy1nOz/efhelGZEuPxEmgZWWNVA/", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "H4XrkX/tMUGuR+E6x38xQQAAAACcZD1B9ihcj+LRG0HhehSuNx/dQGZmZmbOHPVAcT0K189z8kDXo3A9Olf1QFyPwvWo0LhA", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ_CHARGE=0
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "0", + "marker": { + "color": "#EF553B", + "symbol": "circle" + }, + "mode": "markers", + "name": "0", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "ER+STWYDIz9OHBRG4L8yPw==", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "9ihcj54vBkEfhetRqOvfQA==", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ_CHARGE=3
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "3", + "marker": { + "color": "#00cc96", + "symbol": "circle" + }, + "mode": "markers", + "name": "3", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "3mpcj5mcFT8=", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "FK5H4Zr20kA=", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ_CHARGE=4
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "4", + "marker": { + "color": "#ab63fa", + "symbol": "circle" + }, + "mode": "markers", + "name": "4", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "De/QHLtwMj+qGA56SYc1Pw==", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "61G4HgUn1kCkcD0KV9qnQA==", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "hovertemplate": "Cluster_FREQ_CHARGE=2
FREQ=%{x}
CHARGE=%{y}", + "legendgroup": "2", + "marker": { + "color": "#FFA15A", + "symbol": "circle" + }, + "mode": "markers", + "name": "2", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "dtype": "f8" + }, + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "Cluster_FREQ_CHARGE" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "FREQ" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "CHARGE" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualisation\n", + "data[\"Cluster_FREQ_CHARGE\"] = labels\n", + "data[\"Cluster_FREQ_CHARGE\"] = data[\"Cluster_FREQ_CHARGE\"].astype(str)\n", + "\n", + "fig = px.scatter(data, x=\"FREQ\", y=\"CHARGE\", color=\"Cluster_FREQ_CHARGE\")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "12961201", + "metadata": {}, + "source": [ + "## Application : création de Model Points (K-means)" + ] + }, + { + "cell_type": "markdown", + "id": "6567c970", + "metadata": {}, + "source": [ + "Dans certains cas, il se peut que la modélisation ligne par ligne ne soit pas adaptée. C'est le cas des produits collectifs en assurance ou lorsque le nombre d'individus est trop important. \n", + "Dans ce cas de figure, il est nécessaire d'agréger l'information afin d'avoir des \"individus type\". Chacun de ces individus est appelé *Model Point*. \n", + "L'algorithme des k-means peut s'avérer utile pour le regroupement d'individus sous forme de *Mode Points* lorsque les variables explicatives sont numériques. \n", + " \n", + "Afin d'illustre ce propos, nous agrègerons la base de données selon les variables ANNEE_CTR, AGE_ASSURE_PRINCIPAL, ANCIENNETE_PERMIS et ANNEE_CONSTRUCTION afin de créer 100 Model Points. " + ] + }, + { + "cell_type": "markdown", + "id": "a250bff9", + "metadata": {}, + "source": [ + "**Exercice :** Construire la nouvelle base de modélisation (les nouveaux individus deviennent les Model Points et chacune de modalités devient le centroïde de la classe)." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "5b42c2b5", + "metadata": {}, + "outputs": [], + "source": [ + "# Sélection des variables\n", + "data_source_MP = data_retraitee[\n", + " [\n", + " \"ANNEE_CTR\",\n", + " \"AGE_ASSURE_PRINCIPAL\",\n", + " \"ANCIENNETE_PERMIS\",\n", + " \"ANNEE_CONSTRUCTION\",\n", + " \"NB\",\n", + " \"EXPO\",\n", + " \"CHARGE\",\n", + " ]\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "0777373f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Nombre d'itérations réalisées : \n", + "41\n" + ] + } + ], + "source": [ + "# Agrégation sous forme de MP\n", + "# Itinitialisation\n", + "kmeans = KMeans(n_clusters=100, max_iter=500)\n", + "\n", + "# Sélection des données\n", + "data_x = data_source_MP[\n", + " [\"ANNEE_CTR\", \"AGE_ASSURE_PRINCIPAL\", \"ANCIENNETE_PERMIS\", \"ANNEE_CONSTRUCTION\"]\n", + "]\n", + "# Fitting\n", + "kmeans.fit(data_x)\n", + "\n", + "# Centroïdes\n", + "print(\"Nombre d'itérations réalisées : \")\n", + "print(kmeans.n_iter_)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "5fd7d737", + "metadata": {}, + "outputs": [], + "source": [ + "# Construction de la nouvelle base de modélisation\n", + "\n", + "# Nouvelles variables explicatives\n", + "base_MP = pd.DataFrame(\n", + " kmeans.cluster_centers_,\n", + " columns=[\n", + " \"ANNEE_CTR\",\n", + " \"AGE_ASSURE_PRINCIPAL\",\n", + " \"ANCIENNETE_PERMIS\",\n", + " \"ANNEE_CONSTRUCTION\",\n", + " ],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "39e674dd", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/tp/_ld5_pzs6nx6mv1pbjhq1l740000gn/T/ipykernel_60807/1945959780.py:2: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n" + ] + } + ], + "source": [ + "# Ajout du nombre de sinistres, exposition et CHARGE par classe\n", + "data_source_MP[\"Cluster\"] = kmeans.labels_\n", + "data_sinistralite_MP = data_source_MP[[\"Cluster\", \"NB\", \"EXPO\", \"CHARGE\"]]\n", + "\n", + "data_sinistralite_MP = data_sinistralite_MP.groupby([\"Cluster\"], as_index=False).sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "8115717e", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "int64", + "type": "integer" + }, + { + "name": "Cluster", + "rawType": "int32", + "type": "integer" + }, + { + "name": "ANNEE_CTR", + "rawType": "float64", + "type": "float" + }, + { + "name": "AGE_ASSURE_PRINCIPAL", + "rawType": "float64", + "type": "float" + }, + { + "name": "ANCIENNETE_PERMIS", + "rawType": "float64", + "type": "float" + }, + { + "name": "ANNEE_CONSTRUCTION", + "rawType": "float64", + "type": "float" + }, + { + "name": "NB", + "rawType": "int64", + "type": "integer" + }, + { + "name": "EXPO", + "rawType": "float64", + "type": "float" + }, + { + "name": "CHARGE", + "rawType": "float64", + "type": "float" + } + ], + "ref": "7165b46e-7eb6-49d2-a196-5f1042af8126", + "rows": [ + [ + "0", + "0", + "2019.307392996109", + "26.02334630350193", + "13.019455252918299", + "2017.307392996109", + "14", + "70582.72677595628", + "76623.37" + ], + [ + "1", + "1", + "2019.185628742515", + "56.634730538922156", + "34.64071856287425", + "2017.3233532934132", + "13", + "48258.04644808743", + "94446.05" + ], + [ + "2", + "2", + "2019.251282051282", + "45.44615384615385", + "63.061538461538476", + "2017.2205128205128", + "18", + "52378.40983606557", + "180511.41" + ], + [ + "3", + "3", + "2019.4968944099378", + "43.17391304347826", + "27.515527950310556", + "2017.2422360248447", + "8", + "43450.14480874316", + "70994.73999999999" + ], + [ + "4", + "4", + "2018.0091743119267", + "63.30275229357798", + "48.211009174311926", + "2014.4587155963302", + "3", + "31148.94262295082", + "14771.7" + ] + ], + "shape": { + "columns": 8, + "rows": 5 + } + }, + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ClusterANNEE_CTRAGE_ASSURE_PRINCIPALANCIENNETE_PERMISANNEE_CONSTRUCTIONNBEXPOCHARGE
002019.30739326.02334613.0194552017.3073931470582.72677676623.37
112019.18562956.63473134.6407192017.3233531348258.04644894446.05
222019.25128245.44615463.0615382017.2205131852378.409836180511.41
332019.49689443.17391327.5155282017.242236843450.14480970994.74
442018.00917463.30275248.2110092014.458716331148.94262314771.70
\n", + "
" + ], + "text/plain": [ + " Cluster ANNEE_CTR AGE_ASSURE_PRINCIPAL ANCIENNETE_PERMIS \\\n", + "0 0 2019.307393 26.023346 13.019455 \n", + "1 1 2019.185629 56.634731 34.640719 \n", + "2 2 2019.251282 45.446154 63.061538 \n", + "3 3 2019.496894 43.173913 27.515528 \n", + "4 4 2018.009174 63.302752 48.211009 \n", + "\n", + " ANNEE_CONSTRUCTION NB EXPO CHARGE \n", + "0 2017.307393 14 70582.726776 76623.37 \n", + "1 2017.323353 13 48258.046448 94446.05 \n", + "2 2017.220513 18 52378.409836 180511.41 \n", + "3 2017.242236 8 43450.144809 70994.74 \n", + "4 2014.458716 3 31148.942623 14771.70 " + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Joiture des tables\n", + "base_MP = base_MP.merge(data_sinistralite_MP, left_index=True, right_on=\"Cluster\")\n", + "\n", + "base_MP = base_MP.iloc[:, [4, 0, 1, 2, 3, 5, 6, 7]]\n", + "base_MP.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b99a8316", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "studies", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/M2/Machine Learning/TP_3/2025_TP_3_M2_ISF.ipynb b/M2/Machine Learning/TP_3/2025_TP_3_M2_ISF.ipynb index 81a86bf..a45a084 100644 --- a/M2/Machine Learning/TP_3/2025_TP_3_M2_ISF.ipynb +++ b/M2/Machine Learning/TP_3/2025_TP_3_M2_ISF.ipynb @@ -1,4350 +1,4352 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "8750d15b", - "metadata": {}, - "source": [ - "# Cours 3 : Machine Learning - Algorithmes supervisés (1/2)" - ] - }, - { - "cell_type": "markdown", - "id": "f7c08ae5", - "metadata": {}, - "source": [ - "## Préambule" - ] - }, - { - "cell_type": "markdown", - "id": "ec7ecb4b", - "metadata": {}, - "source": [ - "Les objectifs de cette séance (3h) sont :\n", - "* Préparation des bases de modélisation (sampling)\n", - "* Mettre en application un modèle supervisé simple.\n", - "* Construire un modèle de Machine Learning (cross-validation et hyperparamétrage) pour résoudre un problème de régression\n", - "* Analyser les performances du modèle" - ] - }, - { - "cell_type": "markdown", - "id": "4e99c600", - "metadata": {}, - "source": [ - "## Préparation du workspace" - ] - }, - { - "cell_type": "markdown", - "id": "c1b01045", - "metadata": {}, - "source": [ - "### Import de librairies " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "97d58527", - "metadata": {}, - "outputs": [], - "source": [ - "# Données\n", - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "#Graphiques\n", - "import seaborn as sns\n", - "\n", - "sns.set()\n", - "import plotly.express as px\n", - "import sklearn.metrics as metrics\n", - "import sklearn.preprocessing as preproc\n", - "\n", - "#Statistiques\n", - "from scipy.stats import chi2_contingency\n", - "\n", - "# Machine Learning\n", - "from sklearn.ensemble import RandomForestRegressor\n", - "from sklearn.model_selection import KFold, cross_val_score, train_test_split\n", - "from sklearn.tree import DecisionTreeRegressor\n" - ] - }, - { - "cell_type": "markdown", - "id": "06153286", - "metadata": {}, - "source": [ - "### Définition des fonctions " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "c67db932", - "metadata": {}, - "outputs": [], - "source": [ - "def cramers_V(var1, var2):\n", - " crosstab = np.array(\n", - " pd.crosstab(var1, var2, rownames=None, colnames=None)\n", - " ) # Cross table building\n", - " stat = chi2_contingency(crosstab)[\n", - " 0\n", - " ] # Keeping of the test statistic of the Chi2 test\n", - " obs = np.sum(crosstab) # Number of observations\n", - " mini = (\n", - " min(crosstab.shape) - 1\n", - " ) # Take the minimum value between the columns and the rows of the cross table\n", - " return stat / (obs * mini)\n" - ] - }, - { - "cell_type": "markdown", - "id": "985e4e97", - "metadata": {}, - "source": [ - "### Constantes" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "c9597b48", - "metadata": {}, - "outputs": [], - "source": [ - "input_path = \"./1_inputs\"\n", - "output_path = \"./2_outputs\"" - ] - }, - { - "cell_type": "markdown", - "id": "b2b035d2", - "metadata": {}, - "source": [ - "### Import des données" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "8051b5f4", - "metadata": {}, - "outputs": [], - "source": [ - "path =input_path + '/base_retraitee.csv'\n", - "data_retraitee = pd.read_csv(path,sep=\",\",decimal=\".\")" - ] - }, - { - "cell_type": "markdown", - "id": "a2578ba1", - "metadata": {}, - "source": [ - "## Algorithme supervisé : CART " - ] - }, - { - "cell_type": "markdown", - "id": "aaa0b27d", - "metadata": {}, - "source": [ - "Dans cette partie l'objectif est de construire un modèle simple (algorithme CART) afin de voir les différentes étapes nécessaire au lancement d'un modèle\n", - "Nous modéliserons directement le coût des sinistres. " - ] - }, - { - "cell_type": "markdown", - "id": "a0458a05", - "metadata": {}, - "source": [ - "### Construction du modèle" - ] - }, - { - "cell_type": "markdown", - "id": "b3715c37", - "metadata": {}, - "source": [ - "La première étape est de calculer les côut moyen de chaque sinistre (target ou variable réponse). Cette variable sera la variable à prédire en fonction des variables explicatives." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "c427a4b8", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/tp/_ld5_pzs6nx6mv1pbjhq1l740000gn/T/ipykernel_79947/358057511.py:7: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " data_model[\"CM\"] = data_model[\"CHARGE\"] / data_model[\"NB\"]\n" - ] - }, - { - "data": { - "application/vnd.microsoft.datawrangler.viewer.v0+json": { - "columns": [ - { - "name": "index", - "rawType": "int64", - "type": "integer" - }, - { - "name": "ANNEE_CTR", - "rawType": "int64", - "type": "integer" - }, - { - "name": "CONTRAT_ANCIENNETE", - "rawType": "object", - "type": "string" - }, - { - "name": "FREQUENCE_PAIEMENT_COTISATION", - "rawType": "object", - "type": "string" - }, - { - "name": "GROUPE_KM", - "rawType": "object", - "type": "string" - }, - { - "name": "ZONE_RISQUE", - "rawType": "object", - "type": "string" - }, - { - "name": "AGE_ASSURE_PRINCIPAL", - "rawType": "int64", - "type": "integer" - }, - { - "name": "GENRE", - "rawType": "object", - "type": "string" - }, - { - "name": "DEUXIEME_CONDUCTEUR", - "rawType": "bool", - "type": "boolean" - }, - { - "name": "ANCIENNETE_PERMIS", - "rawType": "int64", - "type": "integer" - }, - { - "name": "ANNEE_CONSTRUCTION", - "rawType": "float64", - "type": "float" - }, - { - "name": "ENERGIE", - "rawType": "object", - "type": "string" - }, - { - "name": "EQUIPEMENT_SECURITE", - "rawType": "object", - "type": "string" - }, - { - "name": "VALEUR_DU_BIEN", - "rawType": "object", - "type": "string" - }, - { - "name": "CM", - "rawType": "float64", - "type": "float" - } - ], - "ref": "a70f0dbd-403e-4585-990e-4028b5b0673d", - "rows": [ - [ - "10", - "2019", - "(0,1]", - "MENSUEL", - "[0;20000[", - "C", - "40", - "M", - "False", - "37", - "2017.0", - "ESSENCE", - "VRAI", - "[15000;20000[", - "1072.98" - ], - [ - "34", - "2020", - "(-1,0]", - "MENSUEL", - "[20000;40000[", - "C", - "27", - "M", - "True", - "13", - "2018.0", - "AUTRE", - "FAUX", - "[35000;99999[", - "3750.0" - ], - [ - "36", - "2019", - "(-1,0]", - "MENSUEL", - "[20000;40000[", - "L", - "19", - "M", - "False", - "2", - "2017.0", - "ESSENCE", - "VRAI", - "[0;10000[", - "1838.49" - ], - [ - "78", - "2019", - "(-1,0]", - "MENSUEL", - "[20000;40000[", - "B", - "40", - "M", - "False", - "45", - "2018.0", - "DIESEL", - "FAUX", - "[15000;20000[", - "4892.74" - ], - [ - "89", - "2018", - "(1,2]", - "MENSUEL", - "[20000;40000[", - "C", - "20", - "M", - "False", - "11", - "2014.0", - "ESSENCE", - "FAUX", - "[25000;35000[", - "166.73" - ] - ], - "shape": { - "columns": 14, - "rows": 5 - } - }, - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ANNEE_CTRCONTRAT_ANCIENNETEFREQUENCE_PAIEMENT_COTISATIONGROUPE_KMZONE_RISQUEAGE_ASSURE_PRINCIPALGENREDEUXIEME_CONDUCTEURANCIENNETE_PERMISANNEE_CONSTRUCTIONENERGIEEQUIPEMENT_SECURITEVALEUR_DU_BIENCM
102019(0,1]MENSUEL[0;20000[C40MFalse372017.0ESSENCEVRAI[15000;20000[1072.98
342020(-1,0]MENSUEL[20000;40000[C27MTrue132018.0AUTREFAUX[35000;99999[3750.00
362019(-1,0]MENSUEL[20000;40000[L19MFalse22017.0ESSENCEVRAI[0;10000[1838.49
782019(-1,0]MENSUEL[20000;40000[B40MFalse452018.0DIESELFAUX[15000;20000[4892.74
892018(1,2]MENSUEL[20000;40000[C20MFalse112014.0ESSENCEFAUX[25000;35000[166.73
\n", - "
" - ], - "text/plain": [ - " ANNEE_CTR CONTRAT_ANCIENNETE FREQUENCE_PAIEMENT_COTISATION GROUPE_KM \\\n", - "10 2019 (0,1] MENSUEL [0;20000[ \n", - "34 2020 (-1,0] MENSUEL [20000;40000[ \n", - "36 2019 (-1,0] MENSUEL [20000;40000[ \n", - "78 2019 (-1,0] MENSUEL [20000;40000[ \n", - "89 2018 (1,2] MENSUEL [20000;40000[ \n", - "\n", - " ZONE_RISQUE AGE_ASSURE_PRINCIPAL GENRE DEUXIEME_CONDUCTEUR \\\n", - "10 C 40 M False \n", - "34 C 27 M True \n", - "36 L 19 M False \n", - "78 B 40 M False \n", - "89 C 20 M False \n", - "\n", - " ANCIENNETE_PERMIS ANNEE_CONSTRUCTION ENERGIE EQUIPEMENT_SECURITE \\\n", - "10 37 2017.0 ESSENCE VRAI \n", - "34 13 2018.0 AUTRE FAUX \n", - "36 2 2017.0 ESSENCE VRAI \n", - "78 45 2018.0 DIESEL FAUX \n", - "89 11 2014.0 ESSENCE FAUX \n", - "\n", - " VALEUR_DU_BIEN CM \n", - "10 [15000;20000[ 1072.98 \n", - "34 [35000;99999[ 3750.00 \n", - "36 [0;10000[ 1838.49 \n", - "78 [15000;20000[ 4892.74 \n", - "89 [25000;35000[ 166.73 " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_model = data_retraitee\n", - "\n", - "# Filtre pour ne garder que les lignes qui ont un sinistre (NB > 0)\n", - "data_model = data_model[data_model[\"NB\"] > 0]\n", - "\n", - "# Calcul du cout moyen \"théorique\" des sinistres\n", - "data_model[\"CM\"] = data_model[\"CHARGE\"] / data_model[\"NB\"]\n", - "data_model = data_model.drop([\"CHARGE\", \"NB\", \"EXPO\"], axis=1)\n", - "data_model.head()" - ] - }, - { - "cell_type": "markdown", - "id": "e3e85088", - "metadata": {}, - "source": [ - "**Exercice :** construisez les statistiques descriptives de la base utilisée." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "c8fd3ee1", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.microsoft.datawrangler.viewer.v0+json": { - "columns": [ - { - "name": "index", - "rawType": "object", - "type": "string" - }, - { - "name": "ANNEE_CTR", - "rawType": "float64", - "type": "float" - }, - { - "name": "CONTRAT_ANCIENNETE", - "rawType": "object", - "type": "unknown" - }, - { - "name": "FREQUENCE_PAIEMENT_COTISATION", - "rawType": "object", - "type": "unknown" - }, - { - "name": "GROUPE_KM", - "rawType": "object", - "type": "unknown" - }, - { - "name": "ZONE_RISQUE", - "rawType": "object", - "type": "unknown" - }, - { - "name": "AGE_ASSURE_PRINCIPAL", - "rawType": "float64", - "type": "float" - }, - { - "name": "GENRE", - "rawType": "object", - "type": "unknown" - }, - { - "name": "DEUXIEME_CONDUCTEUR", - "rawType": "object", - "type": "unknown" - }, - { - "name": "ANCIENNETE_PERMIS", - "rawType": "float64", - "type": "float" - }, - { - "name": "ANNEE_CONSTRUCTION", - "rawType": "float64", - "type": "float" - }, - { - "name": "ENERGIE", - "rawType": "object", - "type": "unknown" - }, - { - "name": "EQUIPEMENT_SECURITE", - "rawType": "object", - "type": "unknown" - }, - { - "name": "VALEUR_DU_BIEN", - "rawType": "object", - "type": "unknown" - }, - { - "name": "CM", - "rawType": "float64", - "type": "float" - } - ], - "ref": "63d03be7-3681-4d8e-b0be-ed765b8f2594", - "rows": [ - [ - "count", - "824.0", - "824", - "824", - "824", - "824", - "824.0", - "824", - "824", - "824.0", - "824.0", - "824", - "824", - "824", - "824.0" - ], - [ - "unique", - null, - "5", - "3", - "4", - "14", - null, - "2", - "2", - null, - null, - "3", - "2", - "6", - null - ], - [ - "top", - null, - "(0,1]", - "MENSUEL", - "[0;20000[", - "C", - null, - "M", - "False", - null, - null, - "ESSENCE", - "FAUX", - "[10000;15000[", - null - ], - [ - "freq", - null, - "297", - "398", - "391", - "269", - null, - "483", - "663", - null, - null, - "413", - "517", - "213", - null - ], - [ - "mean", - "2018.384708737864", - null, - null, - null, - null, - "44.383495145631066", - null, - null, - "35.68810679611651", - "2015.2123786407767", - null, - null, - null, - "4246.01697815534" - ], - [ - "std", - "1.515832735580178", - null, - null, - null, - null, - "13.808216667998865", - null, - null, - "19.370620845496358", - "3.1637823115731556", - null, - null, - null, - "6869.61691660173" - ], - [ - "min", - "2016.0", - null, - null, - null, - null, - "19.0", - null, - null, - "1.0", - "1998.0", - null, - null, - null, - "7.5" - ], - [ - "25%", - "2017.0", - null, - null, - null, - null, - "34.0", - null, - null, - "18.0", - "2014.0", - null, - null, - null, - "1159.96125" - ], - [ - "50%", - "2018.0", - null, - null, - null, - null, - "43.0", - null, - null, - "35.0", - "2016.0", - null, - null, - null, - "2541.6499999999996" - ], - [ - "75%", - "2020.0", - null, - null, - null, - null, - "53.0", - null, - null, - "53.0", - "2017.0", - null, - null, - null, - "4193.797500000001" - ], - [ - "max", - "2021.0", - null, - null, - null, - null, - "94.0", - null, - null, - "70.0", - "2021.0", - null, - null, - null, - "83421.85" - ] - ], - "shape": { - "columns": 14, - "rows": 11 - } - }, - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ANNEE_CTRCONTRAT_ANCIENNETEFREQUENCE_PAIEMENT_COTISATIONGROUPE_KMZONE_RISQUEAGE_ASSURE_PRINCIPALGENREDEUXIEME_CONDUCTEURANCIENNETE_PERMISANNEE_CONSTRUCTIONENERGIEEQUIPEMENT_SECURITEVALEUR_DU_BIENCM
count824.000000824824824824824.000000824824824.000000824.000000824824824824.000000
uniqueNaN53414NaN22NaNNaN326NaN
topNaN(0,1]MENSUEL[0;20000[CNaNMFalseNaNNaNESSENCEFAUX[10000;15000[NaN
freqNaN297398391269NaN483663NaNNaN413517213NaN
mean2018.384709NaNNaNNaNNaN44.383495NaNNaN35.6881072015.212379NaNNaNNaN4246.016978
std1.515833NaNNaNNaNNaN13.808217NaNNaN19.3706213.163782NaNNaNNaN6869.616917
min2016.000000NaNNaNNaNNaN19.000000NaNNaN1.0000001998.000000NaNNaNNaN7.500000
25%2017.000000NaNNaNNaNNaN34.000000NaNNaN18.0000002014.000000NaNNaNNaN1159.961250
50%2018.000000NaNNaNNaNNaN43.000000NaNNaN35.0000002016.000000NaNNaNNaN2541.650000
75%2020.000000NaNNaNNaNNaN53.000000NaNNaN53.0000002017.000000NaNNaNNaN4193.797500
max2021.000000NaNNaNNaNNaN94.000000NaNNaN70.0000002021.000000NaNNaNNaN83421.850000
\n", - "
" - ], - "text/plain": [ - " ANNEE_CTR CONTRAT_ANCIENNETE FREQUENCE_PAIEMENT_COTISATION \\\n", - "count 824.000000 824 824 \n", - "unique NaN 5 3 \n", - "top NaN (0,1] MENSUEL \n", - "freq NaN 297 398 \n", - "mean 2018.384709 NaN NaN \n", - "std 1.515833 NaN NaN \n", - "min 2016.000000 NaN NaN \n", - "25% 2017.000000 NaN NaN \n", - "50% 2018.000000 NaN NaN \n", - "75% 2020.000000 NaN NaN \n", - "max 2021.000000 NaN NaN \n", - "\n", - " GROUPE_KM ZONE_RISQUE AGE_ASSURE_PRINCIPAL GENRE DEUXIEME_CONDUCTEUR \\\n", - "count 824 824 824.000000 824 824 \n", - "unique 4 14 NaN 2 2 \n", - "top [0;20000[ C NaN M False \n", - "freq 391 269 NaN 483 663 \n", - "mean NaN NaN 44.383495 NaN NaN \n", - "std NaN NaN 13.808217 NaN NaN \n", - "min NaN NaN 19.000000 NaN NaN \n", - "25% NaN NaN 34.000000 NaN NaN \n", - "50% NaN NaN 43.000000 NaN NaN \n", - "75% NaN NaN 53.000000 NaN NaN \n", - "max NaN NaN 94.000000 NaN NaN \n", - "\n", - " ANCIENNETE_PERMIS ANNEE_CONSTRUCTION ENERGIE EQUIPEMENT_SECURITE \\\n", - "count 824.000000 824.000000 824 824 \n", - "unique NaN NaN 3 2 \n", - "top NaN NaN ESSENCE FAUX \n", - "freq NaN NaN 413 517 \n", - "mean 35.688107 2015.212379 NaN NaN \n", - "std 19.370621 3.163782 NaN NaN \n", - "min 1.000000 1998.000000 NaN NaN \n", - "25% 18.000000 2014.000000 NaN NaN \n", - "50% 35.000000 2016.000000 NaN NaN \n", - "75% 53.000000 2017.000000 NaN NaN \n", - "max 70.000000 2021.000000 NaN NaN \n", - "\n", - " VALEUR_DU_BIEN CM \n", - "count 824 824.000000 \n", - "unique 6 NaN \n", - "top [10000;15000[ NaN \n", - "freq 213 NaN \n", - "mean NaN 4246.016978 \n", - "std NaN 6869.616917 \n", - "min NaN 7.500000 \n", - "25% NaN 1159.961250 \n", - "50% NaN 2541.650000 \n", - "75% NaN 4193.797500 \n", - "max NaN 83421.850000 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_model.describe(include='all')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "2d32ae2b", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "bingroup": "x", - "hovertemplate": "CM=%{x}
count=%{y}", - "legendgroup": "", - "marker": { - "color": "#636efa", - "pattern": { - "shape": "" - } - }, - "name": "", - "orientation": "v", - "showlegend": false, - "type": "histogram", - "x": { - "bdata": "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", - "dtype": "f8" - }, - "xaxis": "x", - "yaxis": "y" - } - ], - "layout": { - "barmode": "relative", - "legend": { - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "CM" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "count" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Observation de la distribution\n", - "fig = px.histogram(data_model, x=\"CM\")\n", - "fig.show()" - ] - }, - { - "cell_type": "markdown", - "id": "92d6156a", - "metadata": {}, - "source": [ - "#### Etude des corrélations parmi les variables explicatives" - ] - }, - { - "cell_type": "markdown", - "id": "d7327570", - "metadata": {}, - "source": [ - "**Question :** Selon vous, pourquoi faut-il s'intéresser à la corrélation des variables ? " - ] - }, - { - "cell_type": "markdown", - "id": "475e141b", - "metadata": {}, - "source": [ - "*Réponse*: Pour avoir un modèle qui fit mieux + déterminer un potentiel effet de causalité entre features et target + sélectionner certaines variables." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "1b156435", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(824, 13)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_set = data_model.drop(\"CM\", axis=1)\n", - "data_set.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "0ef0fcc0", - "metadata": {}, - "outputs": [], - "source": [ - "# Séparation en variables qualitatives ou catégorielles\n", - "variables_na = []\n", - "variables_numeriques = []\n", - "variables_01 = []\n", - "variables_categorielles = []\n", - "for colu in data_set.columns:\n", - " if True in data_set[colu].isna().unique():\n", - " variables_na.append(data_set[colu])\n", - " else:\n", - " if str(data_set[colu].dtypes) in [\"int32\", \"int64\", \"float64\"]:\n", - " if len(data_set[colu].unique()) == 2:\n", - " variables_categorielles.append(data_set[colu])\n", - " else:\n", - " variables_numeriques.append(data_set[colu])\n", - " else:\n", - " if len(data_set[colu].unique()) == 2:\n", - " variables_categorielles.append(data_set[colu])\n", - " else:\n", - " variables_categorielles.append(data_set[colu])\n" - ] - }, - { - "cell_type": "markdown", - "id": "e82fcade", - "metadata": {}, - "source": [ - "##### Corrélation des variables catégorielles :" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "e130aae5", - "metadata": {}, - "outputs": [], - "source": [ - "vars_categorielles = pd.DataFrame(variables_categorielles).transpose()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "c39e2ad0", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.microsoft.datawrangler.viewer.v0+json": { - "columns": [ - { - "name": "index", - "rawType": "object", - "type": "string" - }, - { - "name": "CONTRAT_ANCIENNETE", - "rawType": "float64", - "type": "float" - }, - { - "name": "FREQUENCE_PAIEMENT_COTISATION", - "rawType": "float64", - "type": "float" - }, - { - "name": "GROUPE_KM", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE", - "rawType": "float64", - "type": "float" - }, - { - "name": "GENRE", - "rawType": "float64", - "type": "float" - }, - { - "name": "DEUXIEME_CONDUCTEUR", - "rawType": "float64", - "type": "float" - }, - { - "name": "ENERGIE", - "rawType": "float64", - "type": "float" - }, - { - "name": "EQUIPEMENT_SECURITE", - "rawType": "float64", - "type": "float" - }, - { - "name": "VALEUR_DU_BIEN", - "rawType": "float64", - "type": "float" - } - ], - "ref": "b82309b4-707a-46f5-b3fe-c9c1324ee757", - "rows": [ - [ - "CONTRAT_ANCIENNETE", - "1.0", - "0.0", - "0.01", - "0.02", - "0.01", - "0.01", - "0.01", - "0.0", - "0.01" - ], - [ - "FREQUENCE_PAIEMENT_COTISATION", - "0.0", - "1.0", - "0.0", - "0.01", - "0.01", - "0.0", - "0.0", - "0.01", - "0.03" - ], - [ - "GROUPE_KM", - "0.01", - "0.0", - "1.0", - "0.04", - "0.01", - "0.0", - "0.04", - "0.01", - "0.04" - ], - [ - "ZONE_RISQUE", - "0.02", - "0.01", - "0.04", - "1.0", - "0.01", - "0.02", - "0.03", - "0.04", - "0.02" - ], - [ - "GENRE", - "0.01", - "0.01", - "0.01", - "0.01", - "1.0", - "0.0", - "0.03", - "0.01", - "0.08" - ], - [ - "DEUXIEME_CONDUCTEUR", - "0.01", - "0.0", - "0.0", - "0.02", - "0.0", - "0.99", - "0.0", - "0.0", - "0.02" - ], - [ - "ENERGIE", - "0.01", - "0.0", - "0.04", - "0.03", - "0.03", - "0.0", - "1.0", - "0.02", - "0.08" - ], - [ - "EQUIPEMENT_SECURITE", - "0.0", - "0.01", - "0.01", - "0.04", - "0.01", - "0.0", - "0.02", - "0.99", - "0.05" - ], - [ - "VALEUR_DU_BIEN", - "0.01", - "0.03", - "0.04", - "0.02", - "0.08", - "0.02", - "0.08", - "0.05", - "1.0" - ] - ], - "shape": { - "columns": 9, - "rows": 9 - } - }, - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
CONTRAT_ANCIENNETEFREQUENCE_PAIEMENT_COTISATIONGROUPE_KMZONE_RISQUEGENREDEUXIEME_CONDUCTEURENERGIEEQUIPEMENT_SECURITEVALEUR_DU_BIEN
CONTRAT_ANCIENNETE1.000.000.010.020.010.010.010.000.01
FREQUENCE_PAIEMENT_COTISATION0.001.000.000.010.010.000.000.010.03
GROUPE_KM0.010.001.000.040.010.000.040.010.04
ZONE_RISQUE0.020.010.041.000.010.020.030.040.02
GENRE0.010.010.010.011.000.000.030.010.08
DEUXIEME_CONDUCTEUR0.010.000.000.020.000.990.000.000.02
ENERGIE0.010.000.040.030.030.001.000.020.08
EQUIPEMENT_SECURITE0.000.010.010.040.010.000.020.990.05
VALEUR_DU_BIEN0.010.030.040.020.080.020.080.051.00
\n", - "
" - ], - "text/plain": [ - " CONTRAT_ANCIENNETE \\\n", - "CONTRAT_ANCIENNETE 1.00 \n", - "FREQUENCE_PAIEMENT_COTISATION 0.00 \n", - "GROUPE_KM 0.01 \n", - "ZONE_RISQUE 0.02 \n", - "GENRE 0.01 \n", - "DEUXIEME_CONDUCTEUR 0.01 \n", - "ENERGIE 0.01 \n", - "EQUIPEMENT_SECURITE 0.00 \n", - "VALEUR_DU_BIEN 0.01 \n", - "\n", - " FREQUENCE_PAIEMENT_COTISATION GROUPE_KM \\\n", - "CONTRAT_ANCIENNETE 0.00 0.01 \n", - "FREQUENCE_PAIEMENT_COTISATION 1.00 0.00 \n", - "GROUPE_KM 0.00 1.00 \n", - "ZONE_RISQUE 0.01 0.04 \n", - "GENRE 0.01 0.01 \n", - "DEUXIEME_CONDUCTEUR 0.00 0.00 \n", - "ENERGIE 0.00 0.04 \n", - "EQUIPEMENT_SECURITE 0.01 0.01 \n", - "VALEUR_DU_BIEN 0.03 0.04 \n", - "\n", - " ZONE_RISQUE GENRE DEUXIEME_CONDUCTEUR \\\n", - "CONTRAT_ANCIENNETE 0.02 0.01 0.01 \n", - "FREQUENCE_PAIEMENT_COTISATION 0.01 0.01 0.00 \n", - "GROUPE_KM 0.04 0.01 0.00 \n", - "ZONE_RISQUE 1.00 0.01 0.02 \n", - "GENRE 0.01 1.00 0.00 \n", - "DEUXIEME_CONDUCTEUR 0.02 0.00 0.99 \n", - "ENERGIE 0.03 0.03 0.00 \n", - "EQUIPEMENT_SECURITE 0.04 0.01 0.00 \n", - "VALEUR_DU_BIEN 0.02 0.08 0.02 \n", - "\n", - " ENERGIE EQUIPEMENT_SECURITE VALEUR_DU_BIEN \n", - "CONTRAT_ANCIENNETE 0.01 0.00 0.01 \n", - "FREQUENCE_PAIEMENT_COTISATION 0.00 0.01 0.03 \n", - "GROUPE_KM 0.04 0.01 0.04 \n", - "ZONE_RISQUE 0.03 0.04 0.02 \n", - "GENRE 0.03 0.01 0.08 \n", - "DEUXIEME_CONDUCTEUR 0.00 0.00 0.02 \n", - "ENERGIE 1.00 0.02 0.08 \n", - "EQUIPEMENT_SECURITE 0.02 0.99 0.05 \n", - "VALEUR_DU_BIEN 0.08 0.05 1.00 " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Test du V de Cramer\n", - "rows = []\n", - "\n", - "for var1 in vars_categorielles:\n", - " col = []\n", - " for var2 in vars_categorielles:\n", - " cramers = cramers_V(\n", - " vars_categorielles[var1], vars_categorielles[var2]\n", - " ) # V de Cramer\n", - " col.append(round(cramers, 2)) # arrondi du résultat\n", - " rows.append(col)\n", - "\n", - "cramers_results = np.array(rows)\n", - "v_cramer_resultats = pd.DataFrame(\n", - " cramers_results,\n", - " columns=vars_categorielles.columns,\n", - " index=vars_categorielles.columns,\n", - ")\n", - "\n", - "v_cramer_resultats" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "1755a2a4", - "metadata": {}, - "outputs": [], - "source": [ - "# On repère les variables trop corrélées\n", - "for i in range(v_cramer_resultats.shape[0]):\n", - " for j in range(i + 1, v_cramer_resultats.shape[0]):\n", - " if v_cramer_resultats.iloc[i, j] > 0.7:\n", - " print(\n", - " v_cramer_resultats.index.to_numpy()[i]\n", - " + \" et \"\n", - " + v_cramer_resultats.columns[j]\n", - " + \" sont trop dépendantes, V-CRAMER = \"\n", - " + str(v_cramer_resultats.iloc[i, j])\n", - " )\n" - ] - }, - { - "cell_type": "markdown", - "id": "8f615121", - "metadata": {}, - "source": [ - "##### Corrélation des variables numériques :" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "a16215ab", - "metadata": {}, - "outputs": [], - "source": [ - "vars_numeriques = pd.DataFrame(variables_numeriques).transpose()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "532ca6c4", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.microsoft.datawrangler.viewer.v0+json": { - "columns": [ - { - "name": "index", - "rawType": "object", - "type": "string" - }, - { - "name": "ANNEE_CTR", - "rawType": "float64", - "type": "float" - }, - { - "name": "AGE_ASSURE_PRINCIPAL", - "rawType": "float64", - "type": "float" - }, - { - "name": "ANCIENNETE_PERMIS", - "rawType": "float64", - "type": "float" - }, - { - "name": "ANNEE_CONSTRUCTION", - "rawType": "float64", - "type": "float" - } - ], - "ref": "d1b7089c-632a-4c1a-8ee0-ef265e2f24f3", - "rows": [ - [ - "ANNEE_CTR", - "1.0", - "0.0266125353863182", - "0.04079670216583853", - "0.38756248686965" - ], - [ - "AGE_ASSURE_PRINCIPAL", - "0.0266125353863182", - "1.0", - "0.5408989349040694", - "-0.03165489280817585" - ], - [ - "ANCIENNETE_PERMIS", - "0.04079670216583853", - "0.5408989349040694", - "1.0", - "0.033320350432053406" - ], - [ - "ANNEE_CONSTRUCTION", - "0.38756248686965", - "-0.03165489280817585", - "0.033320350432053406", - "1.0" - ] - ], - "shape": { - "columns": 4, - "rows": 4 - } - }, - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ANNEE_CTRAGE_ASSURE_PRINCIPALANCIENNETE_PERMISANNEE_CONSTRUCTION
ANNEE_CTR1.0000000.0266130.0407970.387562
AGE_ASSURE_PRINCIPAL0.0266131.0000000.540899-0.031655
ANCIENNETE_PERMIS0.0407970.5408991.0000000.033320
ANNEE_CONSTRUCTION0.387562-0.0316550.0333201.000000
\n", - "
" - ], - "text/plain": [ - " ANNEE_CTR AGE_ASSURE_PRINCIPAL ANCIENNETE_PERMIS \\\n", - "ANNEE_CTR 1.000000 0.026613 0.040797 \n", - "AGE_ASSURE_PRINCIPAL 0.026613 1.000000 0.540899 \n", - "ANCIENNETE_PERMIS 0.040797 0.540899 1.000000 \n", - "ANNEE_CONSTRUCTION 0.387562 -0.031655 0.033320 \n", - "\n", - " ANNEE_CONSTRUCTION \n", - "ANNEE_CTR 0.387562 \n", - "AGE_ASSURE_PRINCIPAL -0.031655 \n", - "ANCIENNETE_PERMIS 0.033320 \n", - "ANNEE_CONSTRUCTION 1.000000 " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Corrélation de Pearson\n", - "correlations_num = vars_numeriques.corr(method=\"pearson\")\n", - "correlations_num" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "6c3bd9b2", - "metadata": {}, - "outputs": [], - "source": [ - "# On repère les variables trop corrélées\n", - "nb_variables = correlations_num.shape[0]\n", - "for i in range(nb_variables):\n", - " for j in range(i + 1, nb_variables):\n", - " if abs(correlations_num.iloc[i, j]) > 0.7:\n", - " print(\n", - " correlations_num.index.to_numpy()[i]\n", - " + \" et \"\n", - " + correlations_num.columns[j]\n", - " + \" sont trop dépendantes, corr = \"\n", - " + str(correlations_num.iloc[i, j])\n", - " )\n" - ] - }, - { - "cell_type": "markdown", - "id": "98c7dba6", - "metadata": {}, - "source": [ - "**Question :** quels sont vos commentaires ?" - ] - }, - { - "cell_type": "markdown", - "id": "67406b54", - "metadata": {}, - "source": [ - "*Réponse*: Aucune des variables ne semblent corrélées." - ] - }, - { - "cell_type": "markdown", - "id": "212209ec", - "metadata": {}, - "source": [ - "#### Preprocessing" - ] - }, - { - "cell_type": "markdown", - "id": "65aca700", - "metadata": {}, - "source": [ - "Deux étapes sont nécessaires avant de lancer l'apprentissage d'un modèle, c'est ce qu'on connait comme le *Preprocessing* :\n", - "\n", - "* Les modèles proposés par la librairie \"sklearn\" ne gèrent que des variables numériques. Il est donc nécessaire de transformer les variables catégorielles en variables numériques : ce processus s'appelle le *One Hot Encoding*.\n", - "* Normaliser les données numériques" - ] - }, - { - "cell_type": "markdown", - "id": "95f5cc9f", - "metadata": {}, - "source": [ - "**Exercice :** proposez un bout de code permettant de réaliser le One Hot Encoding des variables catégorielles. Vous pourrez utiliser la fonction \"preproc.OneHotEncoder\" de la librairie sklearn" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "b8530717", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.microsoft.datawrangler.viewer.v0+json": { - "columns": [ - { - "name": "index", - "rawType": "int64", - "type": "integer" - }, - { - "name": "CONTRAT_ANCIENNETE_(0,1]", - "rawType": "float64", - "type": "float" - }, - { - "name": "CONTRAT_ANCIENNETE_(1,2]", - "rawType": "float64", - "type": "float" - }, - { - "name": "CONTRAT_ANCIENNETE_(2,5]", - "rawType": "float64", - "type": "float" - }, - { - "name": "CONTRAT_ANCIENNETE_(5,10]", - "rawType": "float64", - "type": "float" - }, - { - "name": "FREQUENCE_PAIEMENT_COTISATION_MENSUEL", - "rawType": "float64", - "type": "float" - }, - { - "name": "FREQUENCE_PAIEMENT_COTISATION_TRIMESTRIEL", - "rawType": "float64", - "type": "float" - }, - { - "name": "GROUPE_KM_[20000;40000[", - "rawType": "float64", - "type": "float" - }, - { - "name": "GROUPE_KM_[40000;60000[", - "rawType": "float64", - "type": "float" - }, - { - "name": "GROUPE_KM_[60000;99999[", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_B", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_C", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_D", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_E", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_F", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_G", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_H", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_I", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_J", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_K", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_L", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_M", - "rawType": "float64", - "type": "float" - }, - { - "name": "ZONE_RISQUE_T", - "rawType": "float64", - "type": "float" - }, - { - "name": "GENRE_M", - "rawType": "float64", - "type": "float" - }, - { - "name": "DEUXIEME_CONDUCTEUR_True", - "rawType": "float64", - "type": "float" - }, - { - "name": "ENERGIE_DIESEL", - "rawType": "float64", - "type": "float" - }, - { - "name": "ENERGIE_ESSENCE", - "rawType": "float64", - "type": "float" - }, - { - "name": "EQUIPEMENT_SECURITE_VRAI", - "rawType": "float64", - "type": "float" - }, - { - "name": "VALEUR_DU_BIEN_[10000;15000[", - "rawType": "float64", - "type": "float" - }, - { - "name": "VALEUR_DU_BIEN_[15000;20000[", - "rawType": "float64", - "type": "float" - }, - { - "name": "VALEUR_DU_BIEN_[20000;25000[", - "rawType": "float64", - "type": "float" - }, - { - "name": "VALEUR_DU_BIEN_[25000;35000[", - "rawType": "float64", - "type": "float" - }, - { - "name": "VALEUR_DU_BIEN_[35000;99999[", - "rawType": "float64", - "type": "float" - } - ], - "ref": "e9b7e285-2962-4a24-989a-bde4f9adf740", - "rows": [ - [ - "0", - "1.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "1.0", - "1.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0" - ], - [ - "1", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "1.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0" - ], - [ - "2", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "1.0", - "1.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0" - ], - [ - "3", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "1.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0" - ], - [ - "4", - "0.0", - "1.0", - "0.0", - "0.0", - "1.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "1.0", - "0.0", - "0.0", - "0.0", - "0.0", - "1.0", - "0.0" - ] - ], - "shape": { - "columns": 32, - "rows": 5 - } - }, - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
CONTRAT_ANCIENNETE_(0,1]CONTRAT_ANCIENNETE_(1,2]CONTRAT_ANCIENNETE_(2,5]CONTRAT_ANCIENNETE_(5,10]FREQUENCE_PAIEMENT_COTISATION_MENSUELFREQUENCE_PAIEMENT_COTISATION_TRIMESTRIELGROUPE_KM_[20000;40000[GROUPE_KM_[40000;60000[GROUPE_KM_[60000;99999[ZONE_RISQUE_B...GENRE_MDEUXIEME_CONDUCTEUR_TrueENERGIE_DIESELENERGIE_ESSENCEEQUIPEMENT_SECURITE_VRAIVALEUR_DU_BIEN_[10000;15000[VALEUR_DU_BIEN_[15000;20000[VALEUR_DU_BIEN_[20000;25000[VALEUR_DU_BIEN_[25000;35000[VALEUR_DU_BIEN_[35000;99999[
01.00.00.00.01.00.00.00.00.00.0...1.00.00.01.01.00.01.00.00.00.0
10.00.00.00.01.00.01.00.00.00.0...1.01.00.00.00.00.00.00.00.01.0
20.00.00.00.01.00.01.00.00.00.0...1.00.00.01.01.00.00.00.00.00.0
30.00.00.00.01.00.01.00.00.01.0...1.00.01.00.00.00.01.00.00.00.0
40.01.00.00.01.00.01.00.00.00.0...1.00.00.01.00.00.00.00.01.00.0
\n", - "

5 rows × 32 columns

\n", - "
" - ], - "text/plain": [ - " CONTRAT_ANCIENNETE_(0,1] CONTRAT_ANCIENNETE_(1,2] \\\n", - "0 1.0 0.0 \n", - "1 0.0 0.0 \n", - "2 0.0 0.0 \n", - "3 0.0 0.0 \n", - "4 0.0 1.0 \n", - "\n", - " CONTRAT_ANCIENNETE_(2,5] CONTRAT_ANCIENNETE_(5,10] \\\n", - "0 0.0 0.0 \n", - "1 0.0 0.0 \n", - "2 0.0 0.0 \n", - "3 0.0 0.0 \n", - "4 0.0 0.0 \n", - "\n", - " FREQUENCE_PAIEMENT_COTISATION_MENSUEL \\\n", - "0 1.0 \n", - "1 1.0 \n", - "2 1.0 \n", - "3 1.0 \n", - "4 1.0 \n", - "\n", - " FREQUENCE_PAIEMENT_COTISATION_TRIMESTRIEL GROUPE_KM_[20000;40000[ \\\n", - "0 0.0 0.0 \n", - "1 0.0 1.0 \n", - "2 0.0 1.0 \n", - "3 0.0 1.0 \n", - "4 0.0 1.0 \n", - "\n", - " GROUPE_KM_[40000;60000[ GROUPE_KM_[60000;99999[ ZONE_RISQUE_B ... \\\n", - "0 0.0 0.0 0.0 ... \n", - "1 0.0 0.0 0.0 ... \n", - "2 0.0 0.0 0.0 ... \n", - "3 0.0 0.0 1.0 ... \n", - "4 0.0 0.0 0.0 ... \n", - "\n", - " GENRE_M DEUXIEME_CONDUCTEUR_True ENERGIE_DIESEL ENERGIE_ESSENCE \\\n", - "0 1.0 0.0 0.0 1.0 \n", - "1 1.0 1.0 0.0 0.0 \n", - "2 1.0 0.0 0.0 1.0 \n", - "3 1.0 0.0 1.0 0.0 \n", - "4 1.0 0.0 0.0 1.0 \n", - "\n", - " EQUIPEMENT_SECURITE_VRAI VALEUR_DU_BIEN_[10000;15000[ \\\n", - "0 1.0 0.0 \n", - "1 0.0 0.0 \n", - "2 1.0 0.0 \n", - "3 0.0 0.0 \n", - "4 0.0 0.0 \n", - "\n", - " VALEUR_DU_BIEN_[15000;20000[ VALEUR_DU_BIEN_[20000;25000[ \\\n", - "0 1.0 0.0 \n", - "1 0.0 0.0 \n", - "2 0.0 0.0 \n", - "3 1.0 0.0 \n", - "4 0.0 0.0 \n", - "\n", - " VALEUR_DU_BIEN_[25000;35000[ VALEUR_DU_BIEN_[35000;99999[ \n", - "0 0.0 0.0 \n", - "1 0.0 1.0 \n", - "2 0.0 0.0 \n", - "3 0.0 0.0 \n", - "4 1.0 0.0 \n", - "\n", - "[5 rows x 32 columns]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# One hot encoding des variables catégorielles\n", - "preproc_ohe = preproc.OneHotEncoder(handle_unknown=\"ignore\")\n", - "preproc_ohe = preproc.OneHotEncoder(drop=\"first\", sparse_output=False).fit(\n", - " vars_categorielles\n", - ")\n", - "\n", - "variables_categorielles_ohe = preproc_ohe.transform(vars_categorielles)\n", - "variables_categorielles_ohe = pd.DataFrame(\n", - " variables_categorielles_ohe,\n", - " columns=preproc_ohe.get_feature_names_out(vars_categorielles.columns),\n", - ")\n", - "variables_categorielles_ohe.head()" - ] - }, - { - "cell_type": "markdown", - "id": "b70abc5c", - "metadata": {}, - "source": [ - "**Exercice :** proposez un bout de code permettant normaliser les variables numériques présentes dans la base. Vous pourrez utiliser la fonction \"preproc.StandardScaler\" de la librairie sklearn" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "4ff3847d", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.microsoft.datawrangler.viewer.v0+json": { - "columns": [ - { - "name": "index", - "rawType": "int64", - "type": "integer" - }, - { - "name": "ANNEE_CTR", - "rawType": "float64", - "type": "float" - }, - { - "name": "AGE_ASSURE_PRINCIPAL", - "rawType": "float64", - "type": "float" - }, - { - "name": "ANCIENNETE_PERMIS", - "rawType": "float64", - "type": "float" - }, - { - "name": "ANNEE_CONSTRUCTION", - "rawType": "float64", - "type": "float" - } - ], - "ref": "e1f3a979-59a5-4ca5-8c34-9aaf039cc275", - "rows": [ - [ - "0", - "0.40615626262983295", - "-0.31764836563527515", - "0.067767057718506", - "0.5653698304986595" - ], - [ - "1", - "1.06626032654885", - "-1.2596885906311412", - "-1.1719751563806404", - "0.8816391722032739" - ], - [ - "2", - "0.40615626262983295", - "-1.839405652167059", - "-1.740190337842749", - "0.5653698304986595" - ], - [ - "3", - "0.40615626262983295", - "-0.31764836563527515", - "0.48101446241822143", - "0.8816391722032739" - ], - [ - "4", - "-0.25394780128918387", - "-1.7669410194750692", - "-1.2752870075555691", - "-0.38343819461518397" - ] - ], - "shape": { - "columns": 4, - "rows": 5 - } - }, - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ANNEE_CTRAGE_ASSURE_PRINCIPALANCIENNETE_PERMISANNEE_CONSTRUCTION
00.406156-0.3176480.0677670.565370
11.066260-1.259689-1.1719750.881639
20.406156-1.839406-1.7401900.565370
30.406156-0.3176480.4810140.881639
4-0.253948-1.766941-1.275287-0.383438
\n", - "
" - ], - "text/plain": [ - " ANNEE_CTR AGE_ASSURE_PRINCIPAL ANCIENNETE_PERMIS ANNEE_CONSTRUCTION\n", - "0 0.406156 -0.317648 0.067767 0.565370\n", - "1 1.066260 -1.259689 -1.171975 0.881639\n", - "2 0.406156 -1.839406 -1.740190 0.565370\n", - "3 0.406156 -0.317648 0.481014 0.881639\n", - "4 -0.253948 -1.766941 -1.275287 -0.383438" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Normalisation des varibales numériques\n", - "preproc_scale = preproc.StandardScaler(with_mean=True, with_std=True)\n", - "preproc_scale.fit(vars_numeriques)\n", - "\n", - "vars_numeriques_scaled = preproc_scale.transform(vars_numeriques)\n", - "vars_numeriques_scaled = pd.DataFrame(\n", - " vars_numeriques_scaled, columns=vars_numeriques.columns\n", - ")\n", - "vars_numeriques_scaled.head()\n" - ] - }, - { - "cell_type": "markdown", - "id": "62d49546", - "metadata": {}, - "source": [ - "#### Sampling" - ] - }, - { - "cell_type": "markdown", - "id": "64d229f4", - "metadata": {}, - "source": [ - "**Exercice :** proposez un bout de code permettant construire la base d'apprentissage (80% des données) et la base de test (20%)." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "6a1c7907", - "metadata": {}, - "outputs": [], - "source": [ - "X_global = vars_numeriques_scaled.merge(\n", - " variables_categorielles_ohe, left_index=True, right_index=True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "58a14153", - "metadata": {}, - "outputs": [], - "source": [ - "# Réorganisation des données\n", - "X = X_global.to_numpy()\n", - "Y = data_model[\"CM\"]\n", - "\n", - "# Sampling en 80% train et 20% test\n", - "X_train, X_test, y_train, y_test = train_test_split(\n", - " X, Y, test_size=0.2, random_state=42\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "84dc7a07", - "metadata": {}, - "source": [ - "#### Fitting" - ] - }, - { - "cell_type": "markdown", - "id": "97c7b783", - "metadata": {}, - "source": [ - "**Exercice :** proposez un bout de code permettant construire le modèle" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "053e013c", - "metadata": {}, - "outputs": [], - "source": [ - "# Initialisation de l'objet\n", - "model_CART = DecisionTreeRegressor()\n", - "\n", - "# Train Decision Tree Classifer\n", - "model_CART = model_CART.fit(X_train, y_train)" - ] - }, - { - "cell_type": "markdown", - "id": "8d624704", - "metadata": {}, - "source": [ - "**Exercice :** proposez un bout de code permettant d'évaluer les performances du modèle (MAE, MSE et RMSE)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "c4ca2cf9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAE: 0.00\n", - "MSE: 0.00\n", - "RMSE: 0.00\n" - ] - } - ], - "source": [ - "# Prédictions sur l'ensemble d'entraînement\n", - "y_pred_train = model_CART.predict(X_train)\n", - "\n", - "mae = metrics.mean_absolute_error(y_train, y_pred_train)\n", - "mse = metrics.mean_squared_error(y_train, y_pred_train)\n", - "rmse = metrics.root_mean_squared_error(y_train, y_pred_train)\n", - "\n", - "print(f\"MAE: {mae:.2f}\")\n", - "print(f\"MSE: {mse:.2f}\")\n", - "print(f\"RMSE: {rmse:.2f}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "4b739d5b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAE: 5047.78\n", - "MSE: 88252585.29\n", - "RMSE: 9394.28\n" - ] - } - ], - "source": [ - "y_pred_test = model_CART.predict(X_test)\n", - "\n", - "mae = metrics.mean_absolute_error(y_test, y_pred_test)\n", - "mse = metrics.mean_squared_error(y_test, y_pred_test)\n", - "rmse = metrics.root_mean_squared_error(y_test, y_pred_test)\n", - "\n", - "print(f\"MAE: {mae:.2f}\")\n", - "print(f\"MSE: {mse:.2f}\")\n", - "print(f\"RMSE: {rmse:.2f}\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "fb2fe98c", - "metadata": {}, - "source": [ - "**Question :** que pensez-vous des performances de ce modèle ?" - ] - }, - { - "cell_type": "markdown", - "id": "bdd7ccd6", - "metadata": {}, - "source": [ - "*Réponse*: \n", - "\n", - "Erreur Absolue Moyenne (MAE)\n", - "La MAE représente l'écart absolu moyen entre les prédictions du modèle et les valeurs réelles. Une MAE de 5950.05 signifie qu'en moyenne, notre modèle commet une erreur de cette magnitude, dans l'unité de la variable cible. C'est l'indicateur le plus direct de l'erreur de prédiction moyenne.\n", - "\n", - "Racine de l'Erreur Quadratique Moyenne (RMSE)\n", - "La RMSE est la racine carrée de la moyenne des erreurs au carré ($RMSE = \\sqrt{MSE}$). En raison de l'opération de mise au carré, cette métrique est particulièrement sensible aux grandes erreurs. La valeur obtenue est de 12651.79." - ] - }, - { - "cell_type": "markdown", - "id": "7ecba832", - "metadata": {}, - "source": [ - "## Algorithme supervisé : Random Forest " - ] - }, - { - "cell_type": "markdown", - "id": "efcb8987", - "metadata": {}, - "source": [ - "A ce stade, nous avons vu les différentes étapes pour lancer un algorithme de Machine Learning. Néanmoins, ces étapes ne sont pas suffisantes pour construire un modèle performant. \n", - "En effet, afin de construire un modèle performant le Data Scientist doit agir sur l'apprentissage du modèle. Dans ce qui suit nous :\n", - "* Changerons d'algorithme pour utiliser un algorithme plus performant (Random Forest)\n", - "* Raliserons un *grid search* sur les paramètres du modèle\n", - "* Appliquerons l'apprentissage par validation croisée\n" - ] - }, - { - "cell_type": "markdown", - "id": "d6723a2f", - "metadata": {}, - "source": [ - "### Modèle avec Validation Croisée" - ] - }, - { - "cell_type": "markdown", - "id": "3716b09f", - "metadata": {}, - "source": [ - "#### Sampling" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "ab1e1367", - "metadata": {}, - "outputs": [], - "source": [ - "X_global = vars_numeriques_scaled.merge(\n", - " variables_categorielles_ohe, left_index=True, right_index=True\n", - ")\n", - "\n", - "# Réorganisation des données\n", - "X = X_global.to_numpy()\n", - "Y = np.array(data_model[\"CM\"])" - ] - }, - { - "cell_type": "markdown", - "id": "3f5d735e", - "metadata": {}, - "source": [ - "#### Fitting avec Cross-Validation" - ] - }, - { - "cell_type": "markdown", - "id": "bc819f8f", - "metadata": {}, - "source": [ - "**Exercice :** construisez un modèle RF (RandomForestRegressor) en implémentant la technique de validation croisée. Pensez à enregistrer au sein d'une variable/liste les performances (MAE, MSE & RMSE) du modèle au sein de chaque fold." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "b515460e", - "metadata": {}, - "outputs": [], - "source": [ - "# Initialisation\n", - "# Nombre de sous-échantillons pour la cross-validation\n", - "num_splits = 5\n", - "\n", - "# Random Forest regressor\n", - "rf_regressor = RandomForestRegressor(n_estimators=100, random_state=42)\n", - "\n", - "# Initialisation du KFold cross-validation splitter\n", - "kf = KFold(n_splits=num_splits)\n", - "\n", - "# Listes pour enregistrer les performances du modèle\n", - "MAE_scores = []\n", - "MSE_scores = []\n", - "RMSE_scores = []" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "eebb394f", - "metadata": {}, - "outputs": [], - "source": [ - "# Entrainement avec cross-validation\n", - "for train_index, test_index in kf.split(X):\n", - " X_train, X_test = X[train_index], X[test_index]\n", - " y_train, y_test = Y[train_index], Y[test_index]\n", - "\n", - " # Fitting\n", - " rf_regressor.fit(X_train, y_train)\n", - "\n", - " # Evaluation du modèle\n", - " y_pred_test = rf_regressor.predict(X_test)\n", - "\n", - " MAE = metrics.mean_absolute_error(y_test, y_pred_test)\n", - " MSE = metrics.mean_squared_error(y_test, y_pred_test)\n", - " RMSE = metrics.root_mean_squared_error(y_test, y_pred_test)\n", - "\n", - " # Concaténation des résultats\n", - " MAE_scores.append(MAE)\n", - " MSE_scores.append(MSE)\n", - " RMSE_scores.append(RMSE)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "b067126c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fold 1 MAE: 4007.8326951515155\n", - "Fold 2 MAE: 3651.8632978787878\n", - "Fold 3 MAE: 4718.226707878788\n", - "Fold 4 MAE: 4031.310562727273\n", - "Fold 5 MAE: 4410.05992957317\n" - ] - } - ], - "source": [ - "# Métriques sur tous les folds\n", - "\n", - "#MAE\n", - "for fold, mae in enumerate(MAE_scores, start=1):\n", - " print(f\"Fold {fold} MAE:\", mae)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "6597152c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fold 1 MSE: 32761893.668576293\n", - "Fold 2 MSE: 50894497.0512714\n", - "Fold 3 MSE: 106861487.03512044\n", - "Fold 4 MSE: 35487273.569623545\n", - "Fold 5 MSE: 54729524.04672807\n" - ] - } - ], - "source": [ - "#MSE\n", - "for fold, mse in enumerate(MSE_scores, start=1):\n", - " print(f\"Fold {fold} MSE:\", mse)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "63ff1c9d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fold 1 RMSE: 5723.8006314490285\n", - "Fold 2 RMSE: 7134.037920509772\n", - "Fold 3 RMSE: 10337.38298773536\n", - "Fold 4 RMSE: 5957.119569861222\n", - "Fold 5 RMSE: 7397.940527385177\n" - ] - } - ], - "source": [ - "#RMSE\n", - "for fold, rmse in enumerate(RMSE_scores, start=1):\n", - " print(f\"Fold {fold} RMSE:\", rmse)" - ] - }, - { - "cell_type": "markdown", - "id": "ec1961c2", - "metadata": {}, - "source": [ - "**Question :** Commentez les résultats." - ] - }, - { - "cell_type": "markdown", - "id": "5a8163ef", - "metadata": {}, - "source": [ - "### Ajout d'un Grid Search pour les hyper paramètres" - ] - }, - { - "cell_type": "markdown", - "id": "5a6adbfe", - "metadata": {}, - "source": [ - "#### Sampling" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "d9342ad6", - "metadata": {}, - "outputs": [], - "source": [ - "X_global = vars_numeriques_scaled.merge(\n", - " variables_categorielles_ohe, left_index=True, right_index=True\n", - ")\n", - "# Réorganisation des données\n", - "X = X_global.to_numpy()\n", - "Y = np.array(data_model[\"CM\"])" - ] - }, - { - "cell_type": "markdown", - "id": "dce52b11", - "metadata": {}, - "source": [ - "#### Fitting avec Cross-Validation et *Grid Search*" - ] - }, - { - "cell_type": "markdown", - "id": "7e3a9dd0", - "metadata": {}, - "source": [ - "**Exercice :** Intégrez la technique de Grid Search pour rechercher les paramètres optimaux du modèle." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "6d58dbc2", - "metadata": {}, - "outputs": [], - "source": [ - "# Initialisation\n", - "# Nombre de sous-échantillons pour la cross-validation\n", - "num_splits = 5\n", - "\n", - "# Initialisation du KFold cross-validation splitter\n", - "kf = KFold(n_splits=num_splits)\n", - "\n", - "# Listes pour enregistrer les performances du modèle\n", - "MAE_scores = []\n", - "MSE_scores = []\n", - "RMSE_scores = []\n", - "\n", - "# Hyperparamètres à tester\n", - "n_estimators_values = [60, 65, 70, 75]\n", - "max_depth_values = [None, 1, 2, 3]\n", - "min_samples_split_values = [5, 8, 10, 11, 13, 14, 15]\n", - "\n", - "# Liste pour sauveagrder les meilleurs résultats\n", - "best_score = np.inf\n", - "best_params = {}\n", - "\n", - "MAE_best_score = []\n", - "MSE_best_score = []\n", - "RMSE_best_score = []" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "47da5172", - "metadata": {}, - "outputs": [], - "source": [ - "# grid search à la main\n", - "for n_estimators in n_estimators_values:\n", - " for max_depth in max_depth_values:\n", - " for min_samples_split in min_samples_split_values:\n", - " # Réinitialisation des résultats\n", - " MAE_scores = []\n", - " MSE_scores = []\n", - " RMSE_scores = []\n", - "\n", - " # Boucle de Cross-Validation\n", - " for train_index, test_index in kf.split(X):\n", - " X_train, X_test = X[train_index], X[test_index]\n", - " y_train, y_test = Y[train_index], Y[test_index]\n", - "\n", - " # Modèle avec hyperparamètres actuels\n", - " rf_regressor = RandomForestRegressor(\n", - " n_estimators = n_estimators,\n", - " max_depth = max_depth,\n", - " min_samples_split = min_samples_split,\n", - " random_state = 42,\n", - " )\n", - "\n", - " rf_regressor.fit(X_train, y_train)\n", - "\n", - " # Evaluation du modèle\n", - " y_pred_test = rf_regressor.predict(X_test)\n", - "\n", - " MAE = metrics.mean_absolute_error(y_test, y_pred_test)\n", - " MSE = metrics.mean_squared_error(y_test, y_pred_test)\n", - " RMSE = metrics.root_mean_squared_error(y_test, y_pred_test)\n", - "\n", - " # Concaténation des résultats\n", - " MAE_scores.append(MAE)\n", - " MSE_scores.append(MSE)\n", - " RMSE_scores.append(RMSE)\n", - "\n", - " # Calcul du meilleur score pour le jeu de paramètres\n", - " min_rmse = np.min(RMSE_scores)\n", - "\n", - " # Mise à jour du meilleur score si besoin\n", - " if min_rmse < best_score:\n", - " best_score = min_rmse\n", - " best_params = {\n", - " \"n_estimators\": n_estimators,\n", - " \"max_depth\": max_depth,\n", - " \"min_samples_split\": min_samples_split,\n", - " }\n", - "\n", - " # Sauvegarde des scores pour analyse\n", - " MAE_best_score = MAE_scores\n", - " MSE_best_score = MSE_scores\n", - " RMSE_best_score = RMSE_scores\n", - "\n", - " # Sauvegarde du modèle pour l'utiliser directement\n", - " best_model_regressor = rf_regressor\n" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "d4936c46", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Meilleurs paramètres: {'n_estimators': 65, 'max_depth': 1, 'min_samples_split': 5}\n", - "Meilleure RMSE : 4548.156488811854\n" - ] - } - ], - "source": [ - "# Meilleurs résultats\n", - "print(\"Meilleurs paramètres:\", best_params)\n", - "print(\"Meilleure RMSE :\", best_score)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "3215c463", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fold 1 RMSE: 5168.96443207593\n", - "Fold 2 RMSE: 6779.919772901815\n", - "Fold 3 RMSE: 10081.628056733409\n", - "Fold 4 RMSE: 4548.156488811854\n", - "Fold 5 RMSE: 6713.822743503048\n" - ] - } - ], - "source": [ - "# Métriques sur tous les folds\n", - "\n", - "#RMSE\n", - "for fold, rmse in enumerate(RMSE_best_score, start=1):\n", - " print(f\"Fold {fold} RMSE:\", rmse)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "bb9a5c9b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fold 1 MSE: 26718193.300066035\n", - "Fold 2 MSE: 45967312.126985006\n", - "Fold 3 MSE: 101639224.27431424\n", - "Fold 4 MSE: 20685727.446721368\n", - "Fold 5 MSE: 45075415.831178784\n" - ] - } - ], - "source": [ - "#MAE\n", - "for fold, mse in enumerate(MSE_best_score, start=1):\n", - " print(f\"Fold {fold} MSE:\", mse)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "0f0768ad", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fold 1 MAE: 3516.8014139306597\n", - "Fold 2 MAE: 3209.253810522964\n", - "Fold 3 MAE: 4545.1440942571835\n", - "Fold 4 MAE: 3088.226098509521\n", - "Fold 5 MAE: 3576.4647056529234\n" - ] - } - ], - "source": [ - "#MSE\n", - "for fold, mae in enumerate(MAE_best_score, start=1):\n", - " print(f\"Fold {fold} MAE:\", mae)" - ] - }, - { - "cell_type": "markdown", - "id": "802a625f", - "metadata": {}, - "source": [ - "**Question :** Commentez les résultats" - ] - }, - { - "cell_type": "markdown", - "id": "bd1e91ee", - "metadata": {}, - "source": [ - "### Implémentation avec les librairies existantes" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "4b8cc48d", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from sklearn.ensemble import RandomForestRegressor\n", - "from sklearn.model_selection import GridSearchCV, KFold" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "f0e5d591", - "metadata": {}, - "outputs": [], - "source": [ - "#Sampling en 80% train et 20% test\n", - "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "71177a63", - "metadata": {}, - "outputs": [], - "source": [ - "# Supposons que vous ayez des données d'entraînement X_train et y_train\n", - "\n", - "# Définir la grille d'hyperparamètres à rechercher\n", - "param_grid = {\n", - " \"n_estimators\": [60, 65, 70, 75],\n", - " \"max_depth\": [None, 1, 2, 3],\n", - " \"min_samples_split\": [5, 8, 10, 11, 13, 14, 15],\n", - "}\n", - "# Nombre de folds pour la validation croisée\n", - "num_folds = 5" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "e463b9d7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Meilleurs hyperparamètres : {'max_depth': 1, 'min_samples_split': 5, 'n_estimators': 60}\n" - ] - } - ], - "source": [ - "# Initialisation du modèle RandomForestRegressor\n", - "rf = RandomForestRegressor(random_state=42)\n", - "\n", - "# Création de l'objet GridSearchCV pour la recherche sur grille avec validation croisée\n", - "grid_search = GridSearchCV(\n", - " estimator = rf,\n", - " param_grid = param_grid,\n", - " cv = KFold(\n", - " n_splits = num_folds, shuffle = True, random_state = 42\n", - " ), # Validation croisée avec 5 folds\n", - " scoring = \"neg_mean_squared_error\", # Métrique d'évaluation (moins c'est mieux)\n", - " n_jobs = -1, # Utiliser tous les cœurs du processeur\n", - ")\n", - "\n", - "# Exécution de la recherche sur grille\n", - "grid_search.fit(X_train, y_train)\n", - "\n", - "# Afficher les meilleurs hyperparamètres\n", - "best_params = grid_search.best_params_\n", - "print(\"Meilleurs hyperparamètres : \", best_params)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "d1b84e91", - "metadata": {}, - "outputs": [], - "source": [ - "# Initialiser le modèle final avec les meilleurs hyperparamètres\n", - "best_rf = RandomForestRegressor(random_state = 42, **best_params)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "c46d32a7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "RMSE pour le fold 1: -8836.353449486982\n", - "RMSE pour le fold 2: -5242.128416843558\n", - "RMSE pour le fold 3: -7205.432382938018\n", - "RMSE pour le fold 4: -4902.177844748944\n", - "RMSE pour le fold 5: -7707.687751500834\n", - "\n", - "\n", - "MSE pour le fold 1: -78081142.28426048\n", - "MSE pour le fold 2: -27479910.338678744\n", - "MSE pour le fold 3: -51918255.825091854\n", - "MSE pour le fold 4: -24031347.6215474\n", - "MSE pour le fold 5: -59408450.47463598\n", - "\n", - "\n", - "MAE pour le fold 1: -4047.520107345083\n", - "MAE pour le fold 2: -3389.6166968886077\n", - "MAE pour le fold 3: -3373.620497619359\n", - "MAE pour le fold 4: -3186.2100657449696\n", - "MAE pour le fold 5: -4145.078817961569\n" - ] - } - ], - "source": [ - "# Cross validation\n", - "# RMSE de chaque fold\n", - "rmse_scores = cross_val_score(\n", - " best_rf, X_train, y_train, cv=num_folds, scoring=\"neg_root_mean_squared_error\"\n", - ")\n", - "\n", - "# Afficher les scores pour chaque fold\n", - "for i, score in enumerate(rmse_scores):\n", - " print(f\"RMSE pour le fold {i + 1}: {score}\")\n", - "\n", - "# MSE de chaque fold\n", - "mse_scores = cross_val_score(\n", - " best_rf, X_train, y_train, cv=num_folds, scoring=\"neg_mean_squared_error\"\n", - ")\n", - "\n", - "# Afficher les scores pour chaque fold\n", - "print(\"\\n\")\n", - "for i, score in enumerate(mse_scores):\n", - " print(f\"MSE pour le fold {i + 1}: {score}\")\n", - "\n", - "# MAE de chaque fold\n", - "mae_scores = cross_val_score(\n", - " best_rf, X_train, y_train, cv=num_folds, scoring=\"neg_mean_absolute_error\"\n", - ")\n", - "\n", - "# Afficher les scores pour chaque fold\n", - "print(\"\\n\")\n", - "for i, score in enumerate(mae_scores):\n", - " print(f\"MAE pour le fold {i + 1}: {score}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "3ba2274c", - "metadata": {}, - "outputs": [], - "source": [ - "# Entraîner le modèle final sur toute la base\n", - "best_rf.fit(X_train, y_train)\n", - "\n", - "# Faire des prédictions sur l'ensemble de test\n", - "y_pred = best_rf.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "ec717a0c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "RMSE : 6792.775060864194\n", - "MSE : 46141793.02749855\n", - "MAE : 3387.6746891178996\n" - ] - } - ], - "source": [ - "# Calculer la métrique de performance (dans ce cas, RMSE)\n", - "rmse = metrics.root_mean_squared_error(y_test, y_pred)\n", - "print(f\"RMSE : {rmse}\")\n", - "\n", - "# Calculer la métrique de performance (dans ce cas, MSE)\n", - "mse = metrics.mean_squared_error(y_test, y_pred)\n", - "print(f\"MSE : {mse}\")\n", - "\n", - "# Calculer la métrique de performance (dans ce cas, MAE)\n", - "mae = metrics.mean_absolute_error(y_test, y_pred)\n", - "print(f\"MAE : {mae}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "001baf7d", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "studies", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.3" - } + "cells": [ + { + "cell_type": "markdown", + "id": "8750d15b", + "metadata": {}, + "source": [ + "# Cours 3 : Machine Learning - Algorithmes supervisés (1/2)" + ] + }, + { + "cell_type": "markdown", + "id": "f7c08ae5", + "metadata": {}, + "source": [ + "## Préambule" + ] + }, + { + "cell_type": "markdown", + "id": "ec7ecb4b", + "metadata": {}, + "source": [ + "Les objectifs de cette séance (3h) sont :\n", + "* Préparation des bases de modélisation (sampling)\n", + "* Mettre en application un modèle supervisé simple.\n", + "* Construire un modèle de Machine Learning (cross-validation et hyperparamétrage) pour résoudre un problème de régression\n", + "* Analyser les performances du modèle" + ] + }, + { + "cell_type": "markdown", + "id": "4e99c600", + "metadata": {}, + "source": [ + "## Préparation du workspace" + ] + }, + { + "cell_type": "markdown", + "id": "c1b01045", + "metadata": {}, + "source": [ + "### Import de librairies " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "97d58527", + "metadata": {}, + "outputs": [], + "source": [ + "# Données\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# Graphiques\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "import plotly.express as px\n", + "import sklearn.metrics as metrics\n", + "import sklearn.preprocessing as preproc\n", + "\n", + "# Statistiques\n", + "from scipy.stats import chi2_contingency\n", + "\n", + "# Machine Learning\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.model_selection import KFold, cross_val_score, train_test_split\n", + "from sklearn.tree import DecisionTreeRegressor" + ] + }, + { + "cell_type": "markdown", + "id": "06153286", + "metadata": {}, + "source": [ + "### Définition des fonctions " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c67db932", + "metadata": {}, + "outputs": [], + "source": [ + "def cramers_V(var1, var2):\n", + " crosstab = np.array(\n", + " pd.crosstab(var1, var2, rownames=None, colnames=None)\n", + " ) # Cross table building\n", + " stat = chi2_contingency(crosstab)[\n", + " 0\n", + " ] # Keeping of the test statistic of the Chi2 test\n", + " obs = np.sum(crosstab) # Number of observations\n", + " mini = (\n", + " min(crosstab.shape) - 1\n", + " ) # Take the minimum value between the columns and the rows of the cross table\n", + " return stat / (obs * mini)" + ] + }, + { + "cell_type": "markdown", + "id": "985e4e97", + "metadata": {}, + "source": [ + "### Constantes" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c9597b48", + "metadata": {}, + "outputs": [], + "source": [ + "input_path = \"./1_inputs\"\n", + "output_path = \"./2_outputs\"" + ] + }, + { + "cell_type": "markdown", + "id": "b2b035d2", + "metadata": {}, + "source": [ + "### Import des données" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8051b5f4", + "metadata": {}, + "outputs": [], + "source": [ + "path = input_path + \"/base_retraitee.csv\"\n", + "data_retraitee = pd.read_csv(path, sep=\",\", decimal=\".\")" + ] + }, + { + "cell_type": "markdown", + "id": "a2578ba1", + "metadata": {}, + "source": [ + "## Algorithme supervisé : CART " + ] + }, + { + "cell_type": "markdown", + "id": "aaa0b27d", + "metadata": {}, + "source": [ + "Dans cette partie l'objectif est de construire un modèle simple (algorithme CART) afin de voir les différentes étapes nécessaire au lancement d'un modèle\n", + "Nous modéliserons directement le coût des sinistres. " + ] + }, + { + "cell_type": "markdown", + "id": "a0458a05", + "metadata": {}, + "source": [ + "### Construction du modèle" + ] + }, + { + "cell_type": "markdown", + "id": "b3715c37", + "metadata": {}, + "source": [ + "La première étape est de calculer les côut moyen de chaque sinistre (target ou variable réponse). Cette variable sera la variable à prédire en fonction des variables explicatives." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c427a4b8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/tp/_ld5_pzs6nx6mv1pbjhq1l740000gn/T/ipykernel_79947/358057511.py:7: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data_model[\"CM\"] = data_model[\"CHARGE\"] / data_model[\"NB\"]\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "int64", + "type": "integer" + }, + { + "name": "ANNEE_CTR", + "rawType": "int64", + "type": "integer" + }, + { + "name": "CONTRAT_ANCIENNETE", + "rawType": "object", + "type": "string" + }, + { + "name": "FREQUENCE_PAIEMENT_COTISATION", + "rawType": "object", + "type": "string" + }, + { + "name": "GROUPE_KM", + "rawType": "object", + "type": "string" + }, + { + "name": "ZONE_RISQUE", + "rawType": "object", + "type": "string" + }, + { + "name": "AGE_ASSURE_PRINCIPAL", + "rawType": "int64", + "type": "integer" + }, + { + "name": "GENRE", + "rawType": "object", + "type": "string" + }, + { + "name": "DEUXIEME_CONDUCTEUR", + "rawType": "bool", + "type": "boolean" + }, + { + "name": "ANCIENNETE_PERMIS", + "rawType": "int64", + "type": "integer" + }, + { + "name": "ANNEE_CONSTRUCTION", + "rawType": "float64", + "type": "float" + }, + { + "name": "ENERGIE", + "rawType": "object", + "type": "string" + }, + { + "name": "EQUIPEMENT_SECURITE", + "rawType": "object", + "type": "string" + }, + { + "name": "VALEUR_DU_BIEN", + "rawType": "object", + "type": "string" + }, + { + "name": "CM", + "rawType": "float64", + "type": "float" + } + ], + "ref": "a70f0dbd-403e-4585-990e-4028b5b0673d", + "rows": [ + [ + "10", + "2019", + "(0,1]", + "MENSUEL", + "[0;20000[", + "C", + "40", + "M", + "False", + "37", + "2017.0", + "ESSENCE", + "VRAI", + "[15000;20000[", + "1072.98" + ], + [ + "34", + "2020", + "(-1,0]", + "MENSUEL", + "[20000;40000[", + "C", + "27", + "M", + "True", + "13", + "2018.0", + "AUTRE", + "FAUX", + "[35000;99999[", + "3750.0" + ], + [ + "36", + "2019", + "(-1,0]", + "MENSUEL", + "[20000;40000[", + "L", + "19", + "M", + "False", + "2", + "2017.0", + "ESSENCE", + "VRAI", + "[0;10000[", + "1838.49" + ], + [ + "78", + "2019", + "(-1,0]", + "MENSUEL", + "[20000;40000[", + "B", + "40", + "M", + "False", + "45", + "2018.0", + "DIESEL", + "FAUX", + "[15000;20000[", + "4892.74" + ], + [ + "89", + "2018", + "(1,2]", + "MENSUEL", + "[20000;40000[", + "C", + "20", + "M", + "False", + "11", + "2014.0", + "ESSENCE", + "FAUX", + "[25000;35000[", + "166.73" + ] + ], + "shape": { + "columns": 14, + "rows": 5 + } + }, + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ANNEE_CTRCONTRAT_ANCIENNETEFREQUENCE_PAIEMENT_COTISATIONGROUPE_KMZONE_RISQUEAGE_ASSURE_PRINCIPALGENREDEUXIEME_CONDUCTEURANCIENNETE_PERMISANNEE_CONSTRUCTIONENERGIEEQUIPEMENT_SECURITEVALEUR_DU_BIENCM
102019(0,1]MENSUEL[0;20000[C40MFalse372017.0ESSENCEVRAI[15000;20000[1072.98
342020(-1,0]MENSUEL[20000;40000[C27MTrue132018.0AUTREFAUX[35000;99999[3750.00
362019(-1,0]MENSUEL[20000;40000[L19MFalse22017.0ESSENCEVRAI[0;10000[1838.49
782019(-1,0]MENSUEL[20000;40000[B40MFalse452018.0DIESELFAUX[15000;20000[4892.74
892018(1,2]MENSUEL[20000;40000[C20MFalse112014.0ESSENCEFAUX[25000;35000[166.73
\n", + "
" + ], + "text/plain": [ + " ANNEE_CTR CONTRAT_ANCIENNETE FREQUENCE_PAIEMENT_COTISATION GROUPE_KM \\\n", + "10 2019 (0,1] MENSUEL [0;20000[ \n", + "34 2020 (-1,0] MENSUEL [20000;40000[ \n", + "36 2019 (-1,0] MENSUEL [20000;40000[ \n", + "78 2019 (-1,0] MENSUEL [20000;40000[ \n", + "89 2018 (1,2] MENSUEL [20000;40000[ \n", + "\n", + " ZONE_RISQUE AGE_ASSURE_PRINCIPAL GENRE DEUXIEME_CONDUCTEUR \\\n", + "10 C 40 M False \n", + "34 C 27 M True \n", + "36 L 19 M False \n", + "78 B 40 M False \n", + "89 C 20 M False \n", + "\n", + " ANCIENNETE_PERMIS ANNEE_CONSTRUCTION ENERGIE EQUIPEMENT_SECURITE \\\n", + "10 37 2017.0 ESSENCE VRAI \n", + "34 13 2018.0 AUTRE FAUX \n", + "36 2 2017.0 ESSENCE VRAI \n", + "78 45 2018.0 DIESEL FAUX \n", + "89 11 2014.0 ESSENCE FAUX \n", + "\n", + " VALEUR_DU_BIEN CM \n", + "10 [15000;20000[ 1072.98 \n", + "34 [35000;99999[ 3750.00 \n", + "36 [0;10000[ 1838.49 \n", + "78 [15000;20000[ 4892.74 \n", + "89 [25000;35000[ 166.73 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_model = data_retraitee\n", + "\n", + "# Filtre pour ne garder que les lignes qui ont un sinistre (NB > 0)\n", + "data_model = data_model[data_model[\"NB\"] > 0]\n", + "\n", + "# Calcul du cout moyen \"théorique\" des sinistres\n", + "data_model[\"CM\"] = data_model[\"CHARGE\"] / data_model[\"NB\"]\n", + "data_model = data_model.drop([\"CHARGE\", \"NB\", \"EXPO\"], axis=1)\n", + "data_model.head()" + ] + }, + { + "cell_type": "markdown", + "id": "e3e85088", + "metadata": {}, + "source": [ + "**Exercice :** construisez les statistiques descriptives de la base utilisée." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c8fd3ee1", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "object", + "type": "string" + }, + { + "name": "ANNEE_CTR", + "rawType": "float64", + "type": "float" + }, + { + "name": "CONTRAT_ANCIENNETE", + "rawType": "object", + "type": "unknown" + }, + { + "name": "FREQUENCE_PAIEMENT_COTISATION", + "rawType": "object", + "type": "unknown" + }, + { + "name": "GROUPE_KM", + "rawType": "object", + "type": "unknown" + }, + { + "name": "ZONE_RISQUE", + "rawType": "object", + "type": "unknown" + }, + { + "name": "AGE_ASSURE_PRINCIPAL", + "rawType": "float64", + "type": "float" + }, + { + "name": "GENRE", + "rawType": "object", + "type": "unknown" + }, + { + "name": "DEUXIEME_CONDUCTEUR", + "rawType": "object", + "type": "unknown" + }, + { + "name": "ANCIENNETE_PERMIS", + "rawType": "float64", + "type": "float" + }, + { + "name": "ANNEE_CONSTRUCTION", + "rawType": "float64", + "type": "float" + }, + { + "name": "ENERGIE", + "rawType": "object", + "type": "unknown" + }, + { + "name": "EQUIPEMENT_SECURITE", + "rawType": "object", + "type": "unknown" + }, + { + "name": "VALEUR_DU_BIEN", + "rawType": "object", + "type": "unknown" + }, + { + "name": "CM", + "rawType": "float64", + "type": "float" + } + ], + "ref": "63d03be7-3681-4d8e-b0be-ed765b8f2594", + "rows": [ + [ + "count", + "824.0", + "824", + "824", + "824", + "824", + "824.0", + "824", + "824", + "824.0", + "824.0", + "824", + "824", + "824", + "824.0" + ], + [ + "unique", + null, + "5", + "3", + "4", + "14", + null, + "2", + "2", + null, + null, + "3", + "2", + "6", + null + ], + [ + "top", + null, + "(0,1]", + "MENSUEL", + "[0;20000[", + "C", + null, + "M", + "False", + null, + null, + "ESSENCE", + "FAUX", + "[10000;15000[", + null + ], + [ + "freq", + null, + "297", + "398", + "391", + "269", + null, + "483", + "663", + null, + null, + "413", + "517", + "213", + null + ], + [ + "mean", + "2018.384708737864", + null, + null, + null, + null, + "44.383495145631066", + null, + null, + "35.68810679611651", + "2015.2123786407767", + null, + null, + null, + "4246.01697815534" + ], + [ + "std", + "1.515832735580178", + null, + null, + null, + null, + "13.808216667998865", + null, + null, + "19.370620845496358", + "3.1637823115731556", + null, + null, + null, + "6869.61691660173" + ], + [ + "min", + "2016.0", + null, + null, + null, + null, + "19.0", + null, + null, + "1.0", + "1998.0", + null, + null, + null, + "7.5" + ], + [ + "25%", + "2017.0", + null, + null, + null, + null, + "34.0", + null, + null, + "18.0", + "2014.0", + null, + null, + null, + "1159.96125" + ], + [ + "50%", + "2018.0", + null, + null, + null, + null, + "43.0", + null, + null, + "35.0", + "2016.0", + null, + null, + null, + "2541.6499999999996" + ], + [ + "75%", + "2020.0", + null, + null, + null, + null, + "53.0", + null, + null, + "53.0", + "2017.0", + null, + null, + null, + "4193.797500000001" + ], + [ + "max", + "2021.0", + null, + null, + null, + null, + "94.0", + null, + null, + "70.0", + "2021.0", + null, + null, + null, + "83421.85" + ] + ], + "shape": { + "columns": 14, + "rows": 11 + } + }, + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ANNEE_CTRCONTRAT_ANCIENNETEFREQUENCE_PAIEMENT_COTISATIONGROUPE_KMZONE_RISQUEAGE_ASSURE_PRINCIPALGENREDEUXIEME_CONDUCTEURANCIENNETE_PERMISANNEE_CONSTRUCTIONENERGIEEQUIPEMENT_SECURITEVALEUR_DU_BIENCM
count824.000000824824824824824.000000824824824.000000824.000000824824824824.000000
uniqueNaN53414NaN22NaNNaN326NaN
topNaN(0,1]MENSUEL[0;20000[CNaNMFalseNaNNaNESSENCEFAUX[10000;15000[NaN
freqNaN297398391269NaN483663NaNNaN413517213NaN
mean2018.384709NaNNaNNaNNaN44.383495NaNNaN35.6881072015.212379NaNNaNNaN4246.016978
std1.515833NaNNaNNaNNaN13.808217NaNNaN19.3706213.163782NaNNaNNaN6869.616917
min2016.000000NaNNaNNaNNaN19.000000NaNNaN1.0000001998.000000NaNNaNNaN7.500000
25%2017.000000NaNNaNNaNNaN34.000000NaNNaN18.0000002014.000000NaNNaNNaN1159.961250
50%2018.000000NaNNaNNaNNaN43.000000NaNNaN35.0000002016.000000NaNNaNNaN2541.650000
75%2020.000000NaNNaNNaNNaN53.000000NaNNaN53.0000002017.000000NaNNaNNaN4193.797500
max2021.000000NaNNaNNaNNaN94.000000NaNNaN70.0000002021.000000NaNNaNNaN83421.850000
\n", + "
" + ], + "text/plain": [ + " ANNEE_CTR CONTRAT_ANCIENNETE FREQUENCE_PAIEMENT_COTISATION \\\n", + "count 824.000000 824 824 \n", + "unique NaN 5 3 \n", + "top NaN (0,1] MENSUEL \n", + "freq NaN 297 398 \n", + "mean 2018.384709 NaN NaN \n", + "std 1.515833 NaN NaN \n", + "min 2016.000000 NaN NaN \n", + "25% 2017.000000 NaN NaN \n", + "50% 2018.000000 NaN NaN \n", + "75% 2020.000000 NaN NaN \n", + "max 2021.000000 NaN NaN \n", + "\n", + " GROUPE_KM ZONE_RISQUE AGE_ASSURE_PRINCIPAL GENRE DEUXIEME_CONDUCTEUR \\\n", + "count 824 824 824.000000 824 824 \n", + "unique 4 14 NaN 2 2 \n", + "top [0;20000[ C NaN M False \n", + "freq 391 269 NaN 483 663 \n", + "mean NaN NaN 44.383495 NaN NaN \n", + "std NaN NaN 13.808217 NaN NaN \n", + "min NaN NaN 19.000000 NaN NaN \n", + "25% NaN NaN 34.000000 NaN NaN \n", + "50% NaN NaN 43.000000 NaN NaN \n", + "75% NaN NaN 53.000000 NaN NaN \n", + "max NaN NaN 94.000000 NaN NaN \n", + "\n", + " ANCIENNETE_PERMIS ANNEE_CONSTRUCTION ENERGIE EQUIPEMENT_SECURITE \\\n", + "count 824.000000 824.000000 824 824 \n", + "unique NaN NaN 3 2 \n", + "top NaN NaN ESSENCE FAUX \n", + "freq NaN NaN 413 517 \n", + "mean 35.688107 2015.212379 NaN NaN \n", + "std 19.370621 3.163782 NaN NaN \n", + "min 1.000000 1998.000000 NaN NaN \n", + "25% 18.000000 2014.000000 NaN NaN \n", + "50% 35.000000 2016.000000 NaN NaN \n", + "75% 53.000000 2017.000000 NaN NaN \n", + "max 70.000000 2021.000000 NaN NaN \n", + "\n", + " VALEUR_DU_BIEN CM \n", + "count 824 824.000000 \n", + "unique 6 NaN \n", + "top [10000;15000[ NaN \n", + "freq 213 NaN \n", + "mean NaN 4246.016978 \n", + "std NaN 6869.616917 \n", + "min NaN 7.500000 \n", + "25% NaN 1159.961250 \n", + "50% NaN 2541.650000 \n", + "75% NaN 4193.797500 \n", + "max NaN 83421.850000 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_model.describe(include=\"all\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2d32ae2b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "bingroup": "x", + "hovertemplate": "CM=%{x}
count=%{y}", + "legendgroup": "", + "marker": { + "color": "#636efa", + "pattern": { + "shape": "" + } + }, + "name": "", + "orientation": "v", + "showlegend": false, + "type": "histogram", + "x": { + "bdata": "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", + "dtype": "f8" + }, + "xaxis": "x", + "yaxis": "y" + } + ], + "layout": { + "barmode": "relative", + "legend": { + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "CM" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "count" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Observation de la distribution\n", + "fig = px.histogram(data_model, x=\"CM\")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "92d6156a", + "metadata": {}, + "source": [ + "#### Etude des corrélations parmi les variables explicatives" + ] + }, + { + "cell_type": "markdown", + "id": "d7327570", + "metadata": {}, + "source": [ + "**Question :** Selon vous, pourquoi faut-il s'intéresser à la corrélation des variables ? " + ] + }, + { + "cell_type": "markdown", + "id": "475e141b", + "metadata": {}, + "source": [ + "*Réponse*: Pour avoir un modèle qui fit mieux + déterminer un potentiel effet de causalité entre features et target + sélectionner certaines variables." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1b156435", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(824, 13)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_set = data_model.drop(\"CM\", axis=1)\n", + "data_set.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0ef0fcc0", + "metadata": {}, + "outputs": [], + "source": [ + "# Séparation en variables qualitatives ou catégorielles\n", + "variables_na = []\n", + "variables_numeriques = []\n", + "variables_01 = []\n", + "variables_categorielles = []\n", + "for colu in data_set.columns:\n", + " if True in data_set[colu].isna().unique():\n", + " variables_na.append(data_set[colu])\n", + " else:\n", + " if str(data_set[colu].dtypes) in [\"int32\", \"int64\", \"float64\"]:\n", + " if len(data_set[colu].unique()) == 2:\n", + " variables_categorielles.append(data_set[colu])\n", + " else:\n", + " variables_numeriques.append(data_set[colu])\n", + " else:\n", + " if len(data_set[colu].unique()) == 2:\n", + " variables_categorielles.append(data_set[colu])\n", + " else:\n", + " variables_categorielles.append(data_set[colu])" + ] + }, + { + "cell_type": "markdown", + "id": "e82fcade", + "metadata": {}, + "source": [ + "##### Corrélation des variables catégorielles :" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e130aae5", + "metadata": {}, + "outputs": [], + "source": [ + "vars_categorielles = pd.DataFrame(variables_categorielles).transpose()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c39e2ad0", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "object", + "type": "string" + }, + { + "name": "CONTRAT_ANCIENNETE", + "rawType": "float64", + "type": "float" + }, + { + "name": "FREQUENCE_PAIEMENT_COTISATION", + "rawType": "float64", + "type": "float" + }, + { + "name": "GROUPE_KM", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE", + "rawType": "float64", + "type": "float" + }, + { + "name": "GENRE", + "rawType": "float64", + "type": "float" + }, + { + "name": "DEUXIEME_CONDUCTEUR", + "rawType": "float64", + "type": "float" + }, + { + "name": "ENERGIE", + "rawType": "float64", + "type": "float" + }, + { + "name": "EQUIPEMENT_SECURITE", + "rawType": "float64", + "type": "float" + }, + { + "name": "VALEUR_DU_BIEN", + "rawType": "float64", + "type": "float" + } + ], + "ref": "b82309b4-707a-46f5-b3fe-c9c1324ee757", + "rows": [ + [ + "CONTRAT_ANCIENNETE", + "1.0", + "0.0", + "0.01", + "0.02", + "0.01", + "0.01", + "0.01", + "0.0", + "0.01" + ], + [ + "FREQUENCE_PAIEMENT_COTISATION", + "0.0", + "1.0", + "0.0", + "0.01", + "0.01", + "0.0", + "0.0", + "0.01", + "0.03" + ], + [ + "GROUPE_KM", + "0.01", + "0.0", + "1.0", + "0.04", + "0.01", + "0.0", + "0.04", + "0.01", + "0.04" + ], + [ + "ZONE_RISQUE", + "0.02", + "0.01", + "0.04", + "1.0", + "0.01", + "0.02", + "0.03", + "0.04", + "0.02" + ], + [ + "GENRE", + "0.01", + "0.01", + "0.01", + "0.01", + "1.0", + "0.0", + "0.03", + "0.01", + "0.08" + ], + [ + "DEUXIEME_CONDUCTEUR", + "0.01", + "0.0", + "0.0", + "0.02", + "0.0", + "0.99", + "0.0", + "0.0", + "0.02" + ], + [ + "ENERGIE", + "0.01", + "0.0", + "0.04", + "0.03", + "0.03", + "0.0", + "1.0", + "0.02", + "0.08" + ], + [ + "EQUIPEMENT_SECURITE", + "0.0", + "0.01", + "0.01", + "0.04", + "0.01", + "0.0", + "0.02", + "0.99", + "0.05" + ], + [ + "VALEUR_DU_BIEN", + "0.01", + "0.03", + "0.04", + "0.02", + "0.08", + "0.02", + "0.08", + "0.05", + "1.0" + ] + ], + "shape": { + "columns": 9, + "rows": 9 + } + }, + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CONTRAT_ANCIENNETEFREQUENCE_PAIEMENT_COTISATIONGROUPE_KMZONE_RISQUEGENREDEUXIEME_CONDUCTEURENERGIEEQUIPEMENT_SECURITEVALEUR_DU_BIEN
CONTRAT_ANCIENNETE1.000.000.010.020.010.010.010.000.01
FREQUENCE_PAIEMENT_COTISATION0.001.000.000.010.010.000.000.010.03
GROUPE_KM0.010.001.000.040.010.000.040.010.04
ZONE_RISQUE0.020.010.041.000.010.020.030.040.02
GENRE0.010.010.010.011.000.000.030.010.08
DEUXIEME_CONDUCTEUR0.010.000.000.020.000.990.000.000.02
ENERGIE0.010.000.040.030.030.001.000.020.08
EQUIPEMENT_SECURITE0.000.010.010.040.010.000.020.990.05
VALEUR_DU_BIEN0.010.030.040.020.080.020.080.051.00
\n", + "
" + ], + "text/plain": [ + " CONTRAT_ANCIENNETE \\\n", + "CONTRAT_ANCIENNETE 1.00 \n", + "FREQUENCE_PAIEMENT_COTISATION 0.00 \n", + "GROUPE_KM 0.01 \n", + "ZONE_RISQUE 0.02 \n", + "GENRE 0.01 \n", + "DEUXIEME_CONDUCTEUR 0.01 \n", + "ENERGIE 0.01 \n", + "EQUIPEMENT_SECURITE 0.00 \n", + "VALEUR_DU_BIEN 0.01 \n", + "\n", + " FREQUENCE_PAIEMENT_COTISATION GROUPE_KM \\\n", + "CONTRAT_ANCIENNETE 0.00 0.01 \n", + "FREQUENCE_PAIEMENT_COTISATION 1.00 0.00 \n", + "GROUPE_KM 0.00 1.00 \n", + "ZONE_RISQUE 0.01 0.04 \n", + "GENRE 0.01 0.01 \n", + "DEUXIEME_CONDUCTEUR 0.00 0.00 \n", + "ENERGIE 0.00 0.04 \n", + "EQUIPEMENT_SECURITE 0.01 0.01 \n", + "VALEUR_DU_BIEN 0.03 0.04 \n", + "\n", + " ZONE_RISQUE GENRE DEUXIEME_CONDUCTEUR \\\n", + "CONTRAT_ANCIENNETE 0.02 0.01 0.01 \n", + "FREQUENCE_PAIEMENT_COTISATION 0.01 0.01 0.00 \n", + "GROUPE_KM 0.04 0.01 0.00 \n", + "ZONE_RISQUE 1.00 0.01 0.02 \n", + "GENRE 0.01 1.00 0.00 \n", + "DEUXIEME_CONDUCTEUR 0.02 0.00 0.99 \n", + "ENERGIE 0.03 0.03 0.00 \n", + "EQUIPEMENT_SECURITE 0.04 0.01 0.00 \n", + "VALEUR_DU_BIEN 0.02 0.08 0.02 \n", + "\n", + " ENERGIE EQUIPEMENT_SECURITE VALEUR_DU_BIEN \n", + "CONTRAT_ANCIENNETE 0.01 0.00 0.01 \n", + "FREQUENCE_PAIEMENT_COTISATION 0.00 0.01 0.03 \n", + "GROUPE_KM 0.04 0.01 0.04 \n", + "ZONE_RISQUE 0.03 0.04 0.02 \n", + "GENRE 0.03 0.01 0.08 \n", + "DEUXIEME_CONDUCTEUR 0.00 0.00 0.02 \n", + "ENERGIE 1.00 0.02 0.08 \n", + "EQUIPEMENT_SECURITE 0.02 0.99 0.05 \n", + "VALEUR_DU_BIEN 0.08 0.05 1.00 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Test du V de Cramer\n", + "rows = []\n", + "\n", + "for var1 in vars_categorielles:\n", + " col = []\n", + " for var2 in vars_categorielles:\n", + " cramers = cramers_V(\n", + " vars_categorielles[var1], vars_categorielles[var2]\n", + " ) # V de Cramer\n", + " col.append(round(cramers, 2)) # arrondi du résultat\n", + " rows.append(col)\n", + "\n", + "cramers_results = np.array(rows)\n", + "v_cramer_resultats = pd.DataFrame(\n", + " cramers_results,\n", + " columns=vars_categorielles.columns,\n", + " index=vars_categorielles.columns,\n", + ")\n", + "\n", + "v_cramer_resultats" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "1755a2a4", + "metadata": {}, + "outputs": [], + "source": [ + "# On repère les variables trop corrélées\n", + "for i in range(v_cramer_resultats.shape[0]):\n", + " for j in range(i + 1, v_cramer_resultats.shape[0]):\n", + " if v_cramer_resultats.iloc[i, j] > 0.7:\n", + " print(\n", + " v_cramer_resultats.index.to_numpy()[i]\n", + " + \" et \"\n", + " + v_cramer_resultats.columns[j]\n", + " + \" sont trop dépendantes, V-CRAMER = \"\n", + " + str(v_cramer_resultats.iloc[i, j])\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "8f615121", + "metadata": {}, + "source": [ + "##### Corrélation des variables numériques :" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a16215ab", + "metadata": {}, + "outputs": [], + "source": [ + "vars_numeriques = pd.DataFrame(variables_numeriques).transpose()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "532ca6c4", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "object", + "type": "string" + }, + { + "name": "ANNEE_CTR", + "rawType": "float64", + "type": "float" + }, + { + "name": "AGE_ASSURE_PRINCIPAL", + "rawType": "float64", + "type": "float" + }, + { + "name": "ANCIENNETE_PERMIS", + "rawType": "float64", + "type": "float" + }, + { + "name": "ANNEE_CONSTRUCTION", + "rawType": "float64", + "type": "float" + } + ], + "ref": "d1b7089c-632a-4c1a-8ee0-ef265e2f24f3", + "rows": [ + [ + "ANNEE_CTR", + "1.0", + "0.0266125353863182", + "0.04079670216583853", + "0.38756248686965" + ], + [ + "AGE_ASSURE_PRINCIPAL", + "0.0266125353863182", + "1.0", + "0.5408989349040694", + "-0.03165489280817585" + ], + [ + "ANCIENNETE_PERMIS", + "0.04079670216583853", + "0.5408989349040694", + "1.0", + "0.033320350432053406" + ], + [ + "ANNEE_CONSTRUCTION", + "0.38756248686965", + "-0.03165489280817585", + "0.033320350432053406", + "1.0" + ] + ], + "shape": { + "columns": 4, + "rows": 4 + } + }, + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ANNEE_CTRAGE_ASSURE_PRINCIPALANCIENNETE_PERMISANNEE_CONSTRUCTION
ANNEE_CTR1.0000000.0266130.0407970.387562
AGE_ASSURE_PRINCIPAL0.0266131.0000000.540899-0.031655
ANCIENNETE_PERMIS0.0407970.5408991.0000000.033320
ANNEE_CONSTRUCTION0.387562-0.0316550.0333201.000000
\n", + "
" + ], + "text/plain": [ + " ANNEE_CTR AGE_ASSURE_PRINCIPAL ANCIENNETE_PERMIS \\\n", + "ANNEE_CTR 1.000000 0.026613 0.040797 \n", + "AGE_ASSURE_PRINCIPAL 0.026613 1.000000 0.540899 \n", + "ANCIENNETE_PERMIS 0.040797 0.540899 1.000000 \n", + "ANNEE_CONSTRUCTION 0.387562 -0.031655 0.033320 \n", + "\n", + " ANNEE_CONSTRUCTION \n", + "ANNEE_CTR 0.387562 \n", + "AGE_ASSURE_PRINCIPAL -0.031655 \n", + "ANCIENNETE_PERMIS 0.033320 \n", + "ANNEE_CONSTRUCTION 1.000000 " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Corrélation de Pearson\n", + "correlations_num = vars_numeriques.corr(method=\"pearson\")\n", + "correlations_num" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "6c3bd9b2", + "metadata": {}, + "outputs": [], + "source": [ + "# On repère les variables trop corrélées\n", + "nb_variables = correlations_num.shape[0]\n", + "for i in range(nb_variables):\n", + " for j in range(i + 1, nb_variables):\n", + " if abs(correlations_num.iloc[i, j]) > 0.7:\n", + " print(\n", + " correlations_num.index.to_numpy()[i]\n", + " + \" et \"\n", + " + correlations_num.columns[j]\n", + " + \" sont trop dépendantes, corr = \"\n", + " + str(correlations_num.iloc[i, j])\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "98c7dba6", + "metadata": {}, + "source": [ + "**Question :** quels sont vos commentaires ?" + ] + }, + { + "cell_type": "markdown", + "id": "67406b54", + "metadata": {}, + "source": [ + "*Réponse*: Aucune des variables ne semblent corrélées." + ] + }, + { + "cell_type": "markdown", + "id": "212209ec", + "metadata": {}, + "source": [ + "#### Preprocessing" + ] + }, + { + "cell_type": "markdown", + "id": "65aca700", + "metadata": {}, + "source": [ + "Deux étapes sont nécessaires avant de lancer l'apprentissage d'un modèle, c'est ce qu'on connait comme le *Preprocessing* :\n", + "\n", + "* Les modèles proposés par la librairie \"sklearn\" ne gèrent que des variables numériques. Il est donc nécessaire de transformer les variables catégorielles en variables numériques : ce processus s'appelle le *One Hot Encoding*.\n", + "* Normaliser les données numériques" + ] + }, + { + "cell_type": "markdown", + "id": "95f5cc9f", + "metadata": {}, + "source": [ + "**Exercice :** proposez un bout de code permettant de réaliser le One Hot Encoding des variables catégorielles. Vous pourrez utiliser la fonction \"preproc.OneHotEncoder\" de la librairie sklearn" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b8530717", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "int64", + "type": "integer" + }, + { + "name": "CONTRAT_ANCIENNETE_(0,1]", + "rawType": "float64", + "type": "float" + }, + { + "name": "CONTRAT_ANCIENNETE_(1,2]", + "rawType": "float64", + "type": "float" + }, + { + "name": "CONTRAT_ANCIENNETE_(2,5]", + "rawType": "float64", + "type": "float" + }, + { + "name": "CONTRAT_ANCIENNETE_(5,10]", + "rawType": "float64", + "type": "float" + }, + { + "name": "FREQUENCE_PAIEMENT_COTISATION_MENSUEL", + "rawType": "float64", + "type": "float" + }, + { + "name": "FREQUENCE_PAIEMENT_COTISATION_TRIMESTRIEL", + "rawType": "float64", + "type": "float" + }, + { + "name": "GROUPE_KM_[20000;40000[", + "rawType": "float64", + "type": "float" + }, + { + "name": "GROUPE_KM_[40000;60000[", + "rawType": "float64", + "type": "float" + }, + { + "name": "GROUPE_KM_[60000;99999[", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_B", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_C", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_D", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_E", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_F", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_G", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_H", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_I", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_J", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_K", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_L", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_M", + "rawType": "float64", + "type": "float" + }, + { + "name": "ZONE_RISQUE_T", + "rawType": "float64", + "type": "float" + }, + { + "name": "GENRE_M", + "rawType": "float64", + "type": "float" + }, + { + "name": "DEUXIEME_CONDUCTEUR_True", + "rawType": "float64", + "type": "float" + }, + { + "name": "ENERGIE_DIESEL", + "rawType": "float64", + "type": "float" + }, + { + "name": "ENERGIE_ESSENCE", + "rawType": "float64", + "type": "float" + }, + { + "name": "EQUIPEMENT_SECURITE_VRAI", + "rawType": "float64", + "type": "float" + }, + { + "name": "VALEUR_DU_BIEN_[10000;15000[", + "rawType": "float64", + "type": "float" + }, + { + "name": "VALEUR_DU_BIEN_[15000;20000[", + "rawType": "float64", + "type": "float" + }, + { + "name": "VALEUR_DU_BIEN_[20000;25000[", + "rawType": "float64", + "type": "float" + }, + { + "name": "VALEUR_DU_BIEN_[25000;35000[", + "rawType": "float64", + "type": "float" + }, + { + "name": "VALEUR_DU_BIEN_[35000;99999[", + "rawType": "float64", + "type": "float" + } + ], + "ref": "e9b7e285-2962-4a24-989a-bde4f9adf740", + "rows": [ + [ + "0", + "1.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "1.0", + "1.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0" + ], + [ + "1", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "1.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0" + ], + [ + "2", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "1.0", + "1.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0" + ], + [ + "3", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "1.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0" + ], + [ + "4", + "0.0", + "1.0", + "0.0", + "0.0", + "1.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "1.0", + "0.0", + "0.0", + "0.0", + "0.0", + "1.0", + "0.0" + ] + ], + "shape": { + "columns": 32, + "rows": 5 + } + }, + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CONTRAT_ANCIENNETE_(0,1]CONTRAT_ANCIENNETE_(1,2]CONTRAT_ANCIENNETE_(2,5]CONTRAT_ANCIENNETE_(5,10]FREQUENCE_PAIEMENT_COTISATION_MENSUELFREQUENCE_PAIEMENT_COTISATION_TRIMESTRIELGROUPE_KM_[20000;40000[GROUPE_KM_[40000;60000[GROUPE_KM_[60000;99999[ZONE_RISQUE_B...GENRE_MDEUXIEME_CONDUCTEUR_TrueENERGIE_DIESELENERGIE_ESSENCEEQUIPEMENT_SECURITE_VRAIVALEUR_DU_BIEN_[10000;15000[VALEUR_DU_BIEN_[15000;20000[VALEUR_DU_BIEN_[20000;25000[VALEUR_DU_BIEN_[25000;35000[VALEUR_DU_BIEN_[35000;99999[
01.00.00.00.01.00.00.00.00.00.0...1.00.00.01.01.00.01.00.00.00.0
10.00.00.00.01.00.01.00.00.00.0...1.01.00.00.00.00.00.00.00.01.0
20.00.00.00.01.00.01.00.00.00.0...1.00.00.01.01.00.00.00.00.00.0
30.00.00.00.01.00.01.00.00.01.0...1.00.01.00.00.00.01.00.00.00.0
40.01.00.00.01.00.01.00.00.00.0...1.00.00.01.00.00.00.00.01.00.0
\n", + "

5 rows × 32 columns

\n", + "
" + ], + "text/plain": [ + " CONTRAT_ANCIENNETE_(0,1] CONTRAT_ANCIENNETE_(1,2] \\\n", + "0 1.0 0.0 \n", + "1 0.0 0.0 \n", + "2 0.0 0.0 \n", + "3 0.0 0.0 \n", + "4 0.0 1.0 \n", + "\n", + " CONTRAT_ANCIENNETE_(2,5] CONTRAT_ANCIENNETE_(5,10] \\\n", + "0 0.0 0.0 \n", + "1 0.0 0.0 \n", + "2 0.0 0.0 \n", + "3 0.0 0.0 \n", + "4 0.0 0.0 \n", + "\n", + " FREQUENCE_PAIEMENT_COTISATION_MENSUEL \\\n", + "0 1.0 \n", + "1 1.0 \n", + "2 1.0 \n", + "3 1.0 \n", + "4 1.0 \n", + "\n", + " FREQUENCE_PAIEMENT_COTISATION_TRIMESTRIEL GROUPE_KM_[20000;40000[ \\\n", + "0 0.0 0.0 \n", + "1 0.0 1.0 \n", + "2 0.0 1.0 \n", + "3 0.0 1.0 \n", + "4 0.0 1.0 \n", + "\n", + " GROUPE_KM_[40000;60000[ GROUPE_KM_[60000;99999[ ZONE_RISQUE_B ... \\\n", + "0 0.0 0.0 0.0 ... \n", + "1 0.0 0.0 0.0 ... \n", + "2 0.0 0.0 0.0 ... \n", + "3 0.0 0.0 1.0 ... \n", + "4 0.0 0.0 0.0 ... \n", + "\n", + " GENRE_M DEUXIEME_CONDUCTEUR_True ENERGIE_DIESEL ENERGIE_ESSENCE \\\n", + "0 1.0 0.0 0.0 1.0 \n", + "1 1.0 1.0 0.0 0.0 \n", + "2 1.0 0.0 0.0 1.0 \n", + "3 1.0 0.0 1.0 0.0 \n", + "4 1.0 0.0 0.0 1.0 \n", + "\n", + " EQUIPEMENT_SECURITE_VRAI VALEUR_DU_BIEN_[10000;15000[ \\\n", + "0 1.0 0.0 \n", + "1 0.0 0.0 \n", + "2 1.0 0.0 \n", + "3 0.0 0.0 \n", + "4 0.0 0.0 \n", + "\n", + " VALEUR_DU_BIEN_[15000;20000[ VALEUR_DU_BIEN_[20000;25000[ \\\n", + "0 1.0 0.0 \n", + "1 0.0 0.0 \n", + "2 0.0 0.0 \n", + "3 1.0 0.0 \n", + "4 0.0 0.0 \n", + "\n", + " VALEUR_DU_BIEN_[25000;35000[ VALEUR_DU_BIEN_[35000;99999[ \n", + "0 0.0 0.0 \n", + "1 0.0 1.0 \n", + "2 0.0 0.0 \n", + "3 0.0 0.0 \n", + "4 1.0 0.0 \n", + "\n", + "[5 rows x 32 columns]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# One hot encoding des variables catégorielles\n", + "preproc_ohe = preproc.OneHotEncoder(handle_unknown=\"ignore\")\n", + "preproc_ohe = preproc.OneHotEncoder(drop=\"first\", sparse_output=False).fit(\n", + " vars_categorielles\n", + ")\n", + "\n", + "variables_categorielles_ohe = preproc_ohe.transform(vars_categorielles)\n", + "variables_categorielles_ohe = pd.DataFrame(\n", + " variables_categorielles_ohe,\n", + " columns=preproc_ohe.get_feature_names_out(vars_categorielles.columns),\n", + ")\n", + "variables_categorielles_ohe.head()" + ] + }, + { + "cell_type": "markdown", + "id": "b70abc5c", + "metadata": {}, + "source": [ + "**Exercice :** proposez un bout de code permettant normaliser les variables numériques présentes dans la base. Vous pourrez utiliser la fonction \"preproc.StandardScaler\" de la librairie sklearn" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "4ff3847d", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "int64", + "type": "integer" + }, + { + "name": "ANNEE_CTR", + "rawType": "float64", + "type": "float" + }, + { + "name": "AGE_ASSURE_PRINCIPAL", + "rawType": "float64", + "type": "float" + }, + { + "name": "ANCIENNETE_PERMIS", + "rawType": "float64", + "type": "float" + }, + { + "name": "ANNEE_CONSTRUCTION", + "rawType": "float64", + "type": "float" + } + ], + "ref": "e1f3a979-59a5-4ca5-8c34-9aaf039cc275", + "rows": [ + [ + "0", + "0.40615626262983295", + "-0.31764836563527515", + "0.067767057718506", + "0.5653698304986595" + ], + [ + "1", + "1.06626032654885", + "-1.2596885906311412", + "-1.1719751563806404", + "0.8816391722032739" + ], + [ + "2", + "0.40615626262983295", + "-1.839405652167059", + "-1.740190337842749", + "0.5653698304986595" + ], + [ + "3", + "0.40615626262983295", + "-0.31764836563527515", + "0.48101446241822143", + "0.8816391722032739" + ], + [ + "4", + "-0.25394780128918387", + "-1.7669410194750692", + "-1.2752870075555691", + "-0.38343819461518397" + ] + ], + "shape": { + "columns": 4, + "rows": 5 + } + }, + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ANNEE_CTRAGE_ASSURE_PRINCIPALANCIENNETE_PERMISANNEE_CONSTRUCTION
00.406156-0.3176480.0677670.565370
11.066260-1.259689-1.1719750.881639
20.406156-1.839406-1.7401900.565370
30.406156-0.3176480.4810140.881639
4-0.253948-1.766941-1.275287-0.383438
\n", + "
" + ], + "text/plain": [ + " ANNEE_CTR AGE_ASSURE_PRINCIPAL ANCIENNETE_PERMIS ANNEE_CONSTRUCTION\n", + "0 0.406156 -0.317648 0.067767 0.565370\n", + "1 1.066260 -1.259689 -1.171975 0.881639\n", + "2 0.406156 -1.839406 -1.740190 0.565370\n", + "3 0.406156 -0.317648 0.481014 0.881639\n", + "4 -0.253948 -1.766941 -1.275287 -0.383438" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Normalisation des varibales numériques\n", + "preproc_scale = preproc.StandardScaler(with_mean=True, with_std=True)\n", + "preproc_scale.fit(vars_numeriques)\n", + "\n", + "vars_numeriques_scaled = preproc_scale.transform(vars_numeriques)\n", + "vars_numeriques_scaled = pd.DataFrame(\n", + " vars_numeriques_scaled, columns=vars_numeriques.columns\n", + ")\n", + "vars_numeriques_scaled.head()" + ] + }, + { + "cell_type": "markdown", + "id": "62d49546", + "metadata": {}, + "source": [ + "#### Sampling" + ] + }, + { + "cell_type": "markdown", + "id": "64d229f4", + "metadata": {}, + "source": [ + "**Exercice :** proposez un bout de code permettant construire la base d'apprentissage (80% des données) et la base de test (20%)." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6a1c7907", + "metadata": {}, + "outputs": [], + "source": [ + "X_global = vars_numeriques_scaled.merge(\n", + " variables_categorielles_ohe, left_index=True, right_index=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "58a14153", + "metadata": {}, + "outputs": [], + "source": [ + "# Réorganisation des données\n", + "X = X_global.to_numpy()\n", + "Y = data_model[\"CM\"]\n", + "\n", + "# Sampling en 80% train et 20% test\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " X, Y, test_size=0.2, random_state=42\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "84dc7a07", + "metadata": {}, + "source": [ + "#### Fitting" + ] + }, + { + "cell_type": "markdown", + "id": "97c7b783", + "metadata": {}, + "source": [ + "**Exercice :** proposez un bout de code permettant construire le modèle" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "053e013c", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialisation de l'objet\n", + "model_CART = DecisionTreeRegressor()\n", + "\n", + "# Train Decision Tree Classifer\n", + "model_CART = model_CART.fit(X_train, y_train)" + ] + }, + { + "cell_type": "markdown", + "id": "8d624704", + "metadata": {}, + "source": [ + "**Exercice :** proposez un bout de code permettant d'évaluer les performances du modèle (MAE, MSE et RMSE)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "c4ca2cf9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAE: 0.00\n", + "MSE: 0.00\n", + "RMSE: 0.00\n" + ] + } + ], + "source": [ + "# Prédictions sur l'ensemble d'entraînement\n", + "y_pred_train = model_CART.predict(X_train)\n", + "\n", + "mae = metrics.mean_absolute_error(y_train, y_pred_train)\n", + "mse = metrics.mean_squared_error(y_train, y_pred_train)\n", + "rmse = metrics.root_mean_squared_error(y_train, y_pred_train)\n", + "\n", + "print(f\"MAE: {mae:.2f}\")\n", + "print(f\"MSE: {mse:.2f}\")\n", + "print(f\"RMSE: {rmse:.2f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "4b739d5b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAE: 5047.78\n", + "MSE: 88252585.29\n", + "RMSE: 9394.28\n" + ] + } + ], + "source": [ + "y_pred_test = model_CART.predict(X_test)\n", + "\n", + "mae = metrics.mean_absolute_error(y_test, y_pred_test)\n", + "mse = metrics.mean_squared_error(y_test, y_pred_test)\n", + "rmse = metrics.root_mean_squared_error(y_test, y_pred_test)\n", + "\n", + "print(f\"MAE: {mae:.2f}\")\n", + "print(f\"MSE: {mse:.2f}\")\n", + "print(f\"RMSE: {rmse:.2f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "fb2fe98c", + "metadata": {}, + "source": [ + "**Question :** que pensez-vous des performances de ce modèle ?" + ] + }, + { + "cell_type": "markdown", + "id": "bdd7ccd6", + "metadata": {}, + "source": [ + "*Réponse*: \n", + "\n", + "Erreur Absolue Moyenne (MAE)\n", + "La MAE représente l'écart absolu moyen entre les prédictions du modèle et les valeurs réelles. Une MAE de 5950.05 signifie qu'en moyenne, notre modèle commet une erreur de cette magnitude, dans l'unité de la variable cible. C'est l'indicateur le plus direct de l'erreur de prédiction moyenne.\n", + "\n", + "Racine de l'Erreur Quadratique Moyenne (RMSE)\n", + "La RMSE est la racine carrée de la moyenne des erreurs au carré ($RMSE = \\sqrt{MSE}$). En raison de l'opération de mise au carré, cette métrique est particulièrement sensible aux grandes erreurs. La valeur obtenue est de 12651.79." + ] + }, + { + "cell_type": "markdown", + "id": "7ecba832", + "metadata": {}, + "source": [ + "## Algorithme supervisé : Random Forest " + ] + }, + { + "cell_type": "markdown", + "id": "efcb8987", + "metadata": {}, + "source": [ + "A ce stade, nous avons vu les différentes étapes pour lancer un algorithme de Machine Learning. Néanmoins, ces étapes ne sont pas suffisantes pour construire un modèle performant. \n", + "En effet, afin de construire un modèle performant le Data Scientist doit agir sur l'apprentissage du modèle. Dans ce qui suit nous :\n", + "* Changerons d'algorithme pour utiliser un algorithme plus performant (Random Forest)\n", + "* Raliserons un *grid search* sur les paramètres du modèle\n", + "* Appliquerons l'apprentissage par validation croisée\n" + ] + }, + { + "cell_type": "markdown", + "id": "d6723a2f", + "metadata": {}, + "source": [ + "### Modèle avec Validation Croisée" + ] + }, + { + "cell_type": "markdown", + "id": "3716b09f", + "metadata": {}, + "source": [ + "#### Sampling" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "ab1e1367", + "metadata": {}, + "outputs": [], + "source": [ + "X_global = vars_numeriques_scaled.merge(\n", + " variables_categorielles_ohe, left_index=True, right_index=True\n", + ")\n", + "\n", + "# Réorganisation des données\n", + "X = X_global.to_numpy()\n", + "Y = np.array(data_model[\"CM\"])" + ] + }, + { + "cell_type": "markdown", + "id": "3f5d735e", + "metadata": {}, + "source": [ + "#### Fitting avec Cross-Validation" + ] + }, + { + "cell_type": "markdown", + "id": "bc819f8f", + "metadata": {}, + "source": [ + "**Exercice :** construisez un modèle RF (RandomForestRegressor) en implémentant la technique de validation croisée. Pensez à enregistrer au sein d'une variable/liste les performances (MAE, MSE & RMSE) du modèle au sein de chaque fold." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "b515460e", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialisation\n", + "# Nombre de sous-échantillons pour la cross-validation\n", + "num_splits = 5\n", + "\n", + "# Random Forest regressor\n", + "rf_regressor = RandomForestRegressor(n_estimators=100, random_state=42)\n", + "\n", + "# Initialisation du KFold cross-validation splitter\n", + "kf = KFold(n_splits=num_splits)\n", + "\n", + "# Listes pour enregistrer les performances du modèle\n", + "MAE_scores = []\n", + "MSE_scores = []\n", + "RMSE_scores = []" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "eebb394f", + "metadata": {}, + "outputs": [], + "source": [ + "# Entrainement avec cross-validation\n", + "for train_index, test_index in kf.split(X):\n", + " X_train, X_test = X[train_index], X[test_index]\n", + " y_train, y_test = Y[train_index], Y[test_index]\n", + "\n", + " # Fitting\n", + " rf_regressor.fit(X_train, y_train)\n", + "\n", + " # Evaluation du modèle\n", + " y_pred_test = rf_regressor.predict(X_test)\n", + "\n", + " MAE = metrics.mean_absolute_error(y_test, y_pred_test)\n", + " MSE = metrics.mean_squared_error(y_test, y_pred_test)\n", + " RMSE = metrics.root_mean_squared_error(y_test, y_pred_test)\n", + "\n", + " # Concaténation des résultats\n", + " MAE_scores.append(MAE)\n", + " MSE_scores.append(MSE)\n", + " RMSE_scores.append(RMSE)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "b067126c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fold 1 MAE: 4007.8326951515155\n", + "Fold 2 MAE: 3651.8632978787878\n", + "Fold 3 MAE: 4718.226707878788\n", + "Fold 4 MAE: 4031.310562727273\n", + "Fold 5 MAE: 4410.05992957317\n" + ] + } + ], + "source": [ + "# Métriques sur tous les folds\n", + "\n", + "# MAE\n", + "for fold, mae in enumerate(MAE_scores, start=1):\n", + " print(f\"Fold {fold} MAE:\", mae)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "6597152c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fold 1 MSE: 32761893.668576293\n", + "Fold 2 MSE: 50894497.0512714\n", + "Fold 3 MSE: 106861487.03512044\n", + "Fold 4 MSE: 35487273.569623545\n", + "Fold 5 MSE: 54729524.04672807\n" + ] + } + ], + "source": [ + "# MSE\n", + "for fold, mse in enumerate(MSE_scores, start=1):\n", + " print(f\"Fold {fold} MSE:\", mse)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "63ff1c9d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fold 1 RMSE: 5723.8006314490285\n", + "Fold 2 RMSE: 7134.037920509772\n", + "Fold 3 RMSE: 10337.38298773536\n", + "Fold 4 RMSE: 5957.119569861222\n", + "Fold 5 RMSE: 7397.940527385177\n" + ] + } + ], + "source": [ + "# RMSE\n", + "for fold, rmse in enumerate(RMSE_scores, start=1):\n", + " print(f\"Fold {fold} RMSE:\", rmse)" + ] + }, + { + "cell_type": "markdown", + "id": "ec1961c2", + "metadata": {}, + "source": [ + "**Question :** Commentez les résultats." + ] + }, + { + "cell_type": "markdown", + "id": "5a8163ef", + "metadata": {}, + "source": [ + "### Ajout d'un Grid Search pour les hyper paramètres" + ] + }, + { + "cell_type": "markdown", + "id": "5a6adbfe", + "metadata": {}, + "source": [ + "#### Sampling" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "d9342ad6", + "metadata": {}, + "outputs": [], + "source": [ + "X_global = vars_numeriques_scaled.merge(\n", + " variables_categorielles_ohe, left_index=True, right_index=True\n", + ")\n", + "# Réorganisation des données\n", + "X = X_global.to_numpy()\n", + "Y = np.array(data_model[\"CM\"])" + ] + }, + { + "cell_type": "markdown", + "id": "dce52b11", + "metadata": {}, + "source": [ + "#### Fitting avec Cross-Validation et *Grid Search*" + ] + }, + { + "cell_type": "markdown", + "id": "7e3a9dd0", + "metadata": {}, + "source": [ + "**Exercice :** Intégrez la technique de Grid Search pour rechercher les paramètres optimaux du modèle." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "6d58dbc2", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialisation\n", + "# Nombre de sous-échantillons pour la cross-validation\n", + "num_splits = 5\n", + "\n", + "# Initialisation du KFold cross-validation splitter\n", + "kf = KFold(n_splits=num_splits)\n", + "\n", + "# Listes pour enregistrer les performances du modèle\n", + "MAE_scores = []\n", + "MSE_scores = []\n", + "RMSE_scores = []\n", + "\n", + "# Hyperparamètres à tester\n", + "n_estimators_values = [60, 65, 70, 75]\n", + "max_depth_values = [None, 1, 2, 3]\n", + "min_samples_split_values = [5, 8, 10, 11, 13, 14, 15]\n", + "\n", + "# Liste pour sauveagrder les meilleurs résultats\n", + "best_score = np.inf\n", + "best_params = {}\n", + "\n", + "MAE_best_score = []\n", + "MSE_best_score = []\n", + "RMSE_best_score = []" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "47da5172", + "metadata": {}, + "outputs": [], + "source": [ + "# grid search à la main\n", + "for n_estimators in n_estimators_values:\n", + " for max_depth in max_depth_values:\n", + " for min_samples_split in min_samples_split_values:\n", + " # Réinitialisation des résultats\n", + " MAE_scores = []\n", + " MSE_scores = []\n", + " RMSE_scores = []\n", + "\n", + " # Boucle de Cross-Validation\n", + " for train_index, test_index in kf.split(X):\n", + " X_train, X_test = X[train_index], X[test_index]\n", + " y_train, y_test = Y[train_index], Y[test_index]\n", + "\n", + " # Modèle avec hyperparamètres actuels\n", + " rf_regressor = RandomForestRegressor(\n", + " n_estimators=n_estimators,\n", + " max_depth=max_depth,\n", + " min_samples_split=min_samples_split,\n", + " random_state=42,\n", + " )\n", + "\n", + " rf_regressor.fit(X_train, y_train)\n", + "\n", + " # Evaluation du modèle\n", + " y_pred_test = rf_regressor.predict(X_test)\n", + "\n", + " MAE = metrics.mean_absolute_error(y_test, y_pred_test)\n", + " MSE = metrics.mean_squared_error(y_test, y_pred_test)\n", + " RMSE = metrics.root_mean_squared_error(y_test, y_pred_test)\n", + "\n", + " # Concaténation des résultats\n", + " MAE_scores.append(MAE)\n", + " MSE_scores.append(MSE)\n", + " RMSE_scores.append(RMSE)\n", + "\n", + " # Calcul du meilleur score pour le jeu de paramètres\n", + " min_rmse = np.min(RMSE_scores)\n", + "\n", + " # Mise à jour du meilleur score si besoin\n", + " if min_rmse < best_score:\n", + " best_score = min_rmse\n", + " best_params = {\n", + " \"n_estimators\": n_estimators,\n", + " \"max_depth\": max_depth,\n", + " \"min_samples_split\": min_samples_split,\n", + " }\n", + "\n", + " # Sauvegarde des scores pour analyse\n", + " MAE_best_score = MAE_scores\n", + " MSE_best_score = MSE_scores\n", + " RMSE_best_score = RMSE_scores\n", + "\n", + " # Sauvegarde du modèle pour l'utiliser directement\n", + " best_model_regressor = rf_regressor" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "d4936c46", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Meilleurs paramètres: {'n_estimators': 65, 'max_depth': 1, 'min_samples_split': 5}\n", + "Meilleure RMSE : 4548.156488811854\n" + ] + } + ], + "source": [ + "# Meilleurs résultats\n", + "print(\"Meilleurs paramètres:\", best_params)\n", + "print(\"Meilleure RMSE :\", best_score)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "3215c463", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fold 1 RMSE: 5168.96443207593\n", + "Fold 2 RMSE: 6779.919772901815\n", + "Fold 3 RMSE: 10081.628056733409\n", + "Fold 4 RMSE: 4548.156488811854\n", + "Fold 5 RMSE: 6713.822743503048\n" + ] + } + ], + "source": [ + "# Métriques sur tous les folds\n", + "\n", + "# RMSE\n", + "for fold, rmse in enumerate(RMSE_best_score, start=1):\n", + " print(f\"Fold {fold} RMSE:\", rmse)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "bb9a5c9b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fold 1 MSE: 26718193.300066035\n", + "Fold 2 MSE: 45967312.126985006\n", + "Fold 3 MSE: 101639224.27431424\n", + "Fold 4 MSE: 20685727.446721368\n", + "Fold 5 MSE: 45075415.831178784\n" + ] + } + ], + "source": [ + "# MAE\n", + "for fold, mse in enumerate(MSE_best_score, start=1):\n", + " print(f\"Fold {fold} MSE:\", mse)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "0f0768ad", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fold 1 MAE: 3516.8014139306597\n", + "Fold 2 MAE: 3209.253810522964\n", + "Fold 3 MAE: 4545.1440942571835\n", + "Fold 4 MAE: 3088.226098509521\n", + "Fold 5 MAE: 3576.4647056529234\n" + ] + } + ], + "source": [ + "# MSE\n", + "for fold, mae in enumerate(MAE_best_score, start=1):\n", + " print(f\"Fold {fold} MAE:\", mae)" + ] + }, + { + "cell_type": "markdown", + "id": "802a625f", + "metadata": {}, + "source": [ + "**Question :** Commentez les résultats" + ] + }, + { + "cell_type": "markdown", + "id": "bd1e91ee", + "metadata": {}, + "source": [ + "### Implémentation avec les librairies existantes" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "4b8cc48d", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.model_selection import GridSearchCV, KFold" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "f0e5d591", + "metadata": {}, + "outputs": [], + "source": [ + "# Sampling en 80% train et 20% test\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " X, Y, test_size=0.2, random_state=42\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "71177a63", + "metadata": {}, + "outputs": [], + "source": [ + "# Supposons que vous ayez des données d'entraînement X_train et y_train\n", + "\n", + "# Définir la grille d'hyperparamètres à rechercher\n", + "param_grid = {\n", + " \"n_estimators\": [60, 65, 70, 75],\n", + " \"max_depth\": [None, 1, 2, 3],\n", + " \"min_samples_split\": [5, 8, 10, 11, 13, 14, 15],\n", + "}\n", + "# Nombre de folds pour la validation croisée\n", + "num_folds = 5" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "e463b9d7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Meilleurs hyperparamètres : {'max_depth': 1, 'min_samples_split': 5, 'n_estimators': 60}\n" + ] + } + ], + "source": [ + "# Initialisation du modèle RandomForestRegressor\n", + "rf = RandomForestRegressor(random_state=42)\n", + "\n", + "# Création de l'objet GridSearchCV pour la recherche sur grille avec validation croisée\n", + "grid_search = GridSearchCV(\n", + " estimator=rf,\n", + " param_grid=param_grid,\n", + " cv=KFold(\n", + " n_splits=num_folds, shuffle=True, random_state=42\n", + " ), # Validation croisée avec 5 folds\n", + " scoring=\"neg_mean_squared_error\", # Métrique d'évaluation (moins c'est mieux)\n", + " n_jobs=-1, # Utiliser tous les cœurs du processeur\n", + ")\n", + "\n", + "# Exécution de la recherche sur grille\n", + "grid_search.fit(X_train, y_train)\n", + "\n", + "# Afficher les meilleurs hyperparamètres\n", + "best_params = grid_search.best_params_\n", + "print(\"Meilleurs hyperparamètres : \", best_params)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "d1b84e91", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialiser le modèle final avec les meilleurs hyperparamètres\n", + "best_rf = RandomForestRegressor(random_state=42, **best_params)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "c46d32a7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RMSE pour le fold 1: -8836.353449486982\n", + "RMSE pour le fold 2: -5242.128416843558\n", + "RMSE pour le fold 3: -7205.432382938018\n", + "RMSE pour le fold 4: -4902.177844748944\n", + "RMSE pour le fold 5: -7707.687751500834\n", + "\n", + "\n", + "MSE pour le fold 1: -78081142.28426048\n", + "MSE pour le fold 2: -27479910.338678744\n", + "MSE pour le fold 3: -51918255.825091854\n", + "MSE pour le fold 4: -24031347.6215474\n", + "MSE pour le fold 5: -59408450.47463598\n", + "\n", + "\n", + "MAE pour le fold 1: -4047.520107345083\n", + "MAE pour le fold 2: -3389.6166968886077\n", + "MAE pour le fold 3: -3373.620497619359\n", + "MAE pour le fold 4: -3186.2100657449696\n", + "MAE pour le fold 5: -4145.078817961569\n" + ] + } + ], + "source": [ + "# Cross validation\n", + "# RMSE de chaque fold\n", + "rmse_scores = cross_val_score(\n", + " best_rf, X_train, y_train, cv=num_folds, scoring=\"neg_root_mean_squared_error\"\n", + ")\n", + "\n", + "# Afficher les scores pour chaque fold\n", + "for i, score in enumerate(rmse_scores):\n", + " print(f\"RMSE pour le fold {i + 1}: {score}\")\n", + "\n", + "# MSE de chaque fold\n", + "mse_scores = cross_val_score(\n", + " best_rf, X_train, y_train, cv=num_folds, scoring=\"neg_mean_squared_error\"\n", + ")\n", + "\n", + "# Afficher les scores pour chaque fold\n", + "print(\"\\n\")\n", + "for i, score in enumerate(mse_scores):\n", + " print(f\"MSE pour le fold {i + 1}: {score}\")\n", + "\n", + "# MAE de chaque fold\n", + "mae_scores = cross_val_score(\n", + " best_rf, X_train, y_train, cv=num_folds, scoring=\"neg_mean_absolute_error\"\n", + ")\n", + "\n", + "# Afficher les scores pour chaque fold\n", + "print(\"\\n\")\n", + "for i, score in enumerate(mae_scores):\n", + " print(f\"MAE pour le fold {i + 1}: {score}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "3ba2274c", + "metadata": {}, + "outputs": [], + "source": [ + "# Entraîner le modèle final sur toute la base\n", + "best_rf.fit(X_train, y_train)\n", + "\n", + "# Faire des prédictions sur l'ensemble de test\n", + "y_pred = best_rf.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "ec717a0c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RMSE : 6792.775060864194\n", + "MSE : 46141793.02749855\n", + "MAE : 3387.6746891178996\n" + ] + } + ], + "source": [ + "# Calculer la métrique de performance (dans ce cas, RMSE)\n", + "rmse = metrics.root_mean_squared_error(y_test, y_pred)\n", + "print(f\"RMSE : {rmse}\")\n", + "\n", + "# Calculer la métrique de performance (dans ce cas, MSE)\n", + "mse = metrics.mean_squared_error(y_test, y_pred)\n", + "print(f\"MSE : {mse}\")\n", + "\n", + "# Calculer la métrique de performance (dans ce cas, MAE)\n", + "mae = metrics.mean_absolute_error(y_test, y_pred)\n", + "print(f\"MAE : {mae}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "001baf7d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "studies", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/M2/Machine Learning/TP_4/2025_M2_ISF_TP_4.ipynb b/M2/Machine Learning/TP_4/2025_M2_ISF_TP_4.ipynb index d8e2110..70c1932 100644 --- a/M2/Machine Learning/TP_4/2025_M2_ISF_TP_4.ipynb +++ b/M2/Machine Learning/TP_4/2025_M2_ISF_TP_4.ipynb @@ -69,11 +69,11 @@ "from sklearn import metrics\n", "from sklearn.ensemble import GradientBoostingClassifier\n", "from sklearn.model_selection import (\n", - " GridSearchCV,\n", - " StratifiedKFold,\n", - " cross_val_score,\n", - " train_test_split,\n", - ")\n" + " GridSearchCV,\n", + " StratifiedKFold,\n", + " cross_val_score,\n", + " train_test_split,\n", + ")" ] }, { @@ -91,12 +91,18 @@ "metadata": {}, "outputs": [], "source": [ - "def cramers_V(var1,var2) :\n", - " crosstab = np.array(pd.crosstab(var1,var2, rownames=None, colnames=None)) # Cross table building\n", - " stat = chi2_contingency(crosstab)[0] # Keeping of the test statistic of the Chi2 test\n", - " obs = np.sum(crosstab) # Number of observations\n", - " mini = min(crosstab.shape)-1 # Take the minimum value between the colmns and the rows of the cross table\n", - " return (stat/(obs*mini))" + "def cramers_V(var1, var2):\n", + " crosstab = np.array(\n", + " pd.crosstab(var1, var2, rownames=None, colnames=None)\n", + " ) # Cross table building\n", + " stat = chi2_contingency(crosstab)[\n", + " 0\n", + " ] # Keeping of the test statistic of the Chi2 test\n", + " obs = np.sum(crosstab) # Number of observations\n", + " mini = (\n", + " min(crosstab.shape) - 1\n", + " ) # Take the minimum value between the colmns and the rows of the cross table\n", + " return stat / (obs * mini)" ] }, { @@ -133,7 +139,7 @@ "metadata": {}, "outputs": [], "source": [ - "path = input_path + '/base_retraitee.csv'\n", + "path = input_path + \"/base_retraitee.csv\"\n", "data_retraitee = pd.read_csv(path, sep=\",\", decimal=\".\")" ] }, @@ -16225,7 +16231,7 @@ " if len(data_model[col].unique()) == 2:\n", " variables_categorielles.append(data_model[col])\n", " else:\n", - " variables_categorielles.append(data_model[col])\n" + " variables_categorielles.append(data_model[col])" ] }, { @@ -16653,7 +16659,7 @@ " if v_cramer_resultats.iloc[i, j] > 0.7:\n", " print(\n", " f\"{v_cramer_resultats.index.to_numpy()[i]} et {v_cramer_resultats.colmns[j]} sont trop dépendantes, V-CRAMER = {v_cramer_resultats.iloc[i, j]}\"\n", - " )\n" + " )" ] }, { @@ -16851,7 +16857,7 @@ " if abs(correlations_num.iloc[i, j]) > 0.7:\n", " print(\n", " f\"{correlations_num.index.to_numpy()[i]} et {correlations_num.columns[j]} sont trop dépendantes, corr = {correlations_num.iloc[i, j]}\"\n", - " )\n" + " )" ] }, { @@ -17820,7 +17826,7 @@ " cv=StratifiedKFold(\n", " n_splits=num_folds, shuffle=True, random_state=42\n", " ), # Validation croisée avec 5 folds\n", - " scoring='recall', # Métrique d'évaluation (moins c'est mieux)\n", + " scoring=\"recall\", # Métrique d'évaluation (moins c'est mieux)\n", " n_jobs=-1, # Utiliser tous les cœurs du processeur\n", ")\n", "\n", @@ -17877,14 +17883,18 @@ ], "source": [ "# Recall de chaque fold\n", - "recall_scores = cross_val_score(best_gbc, X_train, y_train, cv=num_folds, scoring='recall')\n", + "recall_scores = cross_val_score(\n", + " best_gbc, X_train, y_train, cv=num_folds, scoring=\"recall\"\n", + ")\n", "\n", "# Afficher les scores pour chaque fold\n", "for i, score in enumerate(recall_scores):\n", " print(f\"Recall pour le fold {i + 1}: {score}\")\n", "\n", "# Accuracy de chaque fold\n", - "accuracy_scores = cross_val_score(best_gbc, X_train, y_train, cv=num_folds, scoring='accuracy')\n", + "accuracy_scores = cross_val_score(\n", + " best_gbc, X_train, y_train, cv=num_folds, scoring=\"accuracy\"\n", + ")\n", "\n", "# Afficher les scores pour chaque fold\n", "print(\"\\n\")\n", @@ -17892,12 +17902,14 @@ " print(f\"Accuracy pour le fold {i + 1}: {score}\")\n", "\n", "# Precision de chaque fold\n", - "precision_scores = cross_val_score(best_gbc, X_train, y_train, cv=num_folds, scoring='precision')\n", + "precision_scores = cross_val_score(\n", + " best_gbc, X_train, y_train, cv=num_folds, scoring=\"precision\"\n", + ")\n", "\n", "# Afficher les scores pour chaque fold\n", "print(\"\\n\")\n", "for i, score in enumerate(precision_scores):\n", - " print(f\"Precision pour le fold {i + 1}: {score}\")\n" + " print(f\"Precision pour le fold {i + 1}: {score}\")" ] }, { @@ -30178,7 +30190,7 @@ "# Observation de la distribution sur Y_train\n", "df = pd.DataFrame(y_train, columns=[\"SINISTRE\"])\n", "fig = px.histogram(df, x=\"SINISTRE\", title=\"Distribution de la variable Y_train\")\n", - "fig.show()\n" + "fig.show()" ] }, { @@ -52502,7 +52514,7 @@ "fig = px.histogram(\n", " df, x=\"SINISTRE\", title=\"Distribution de la variable Y_train_resampled\"\n", ")\n", - "fig.show()\n" + "fig.show()" ] }, { @@ -52530,7 +52542,7 @@ "num_folds = 5\n", "\n", "# Initialisation du modèle GradientBoostingClassifier\n", - "gb = GradientBoostingClassifier(random_state=42)\n" + "gb = GradientBoostingClassifier(random_state=42)" ] }, { @@ -52567,7 +52579,7 @@ "print(\"Meilleurs hyperparamètres : \", best_params)\n", "\n", "# Initialiser un modèle avec les meilleurs hyperparamètres\n", - "best_gbc = GradientBoostingClassifier(random_state=42, **best_params)\n" + "best_gbc = GradientBoostingClassifier(random_state=42, **best_params)" ] }, { diff --git a/M2/Machine Learning/TP_5/2025_M2_ISF_TP_5.ipynb b/M2/Machine Learning/TP_5/2025_M2_ISF_TP_5.ipynb index 74b6c06..422b443 100644 --- a/M2/Machine Learning/TP_5/2025_M2_ISF_TP_5.ipynb +++ b/M2/Machine Learning/TP_5/2025_M2_ISF_TP_5.ipynb @@ -128,7 +128,7 @@ "\n", "# Configuration des graphiques\n", "plt.style.use(\"seaborn-v0_8-darkgrid\")\n", - "sns.set_palette(\"husl\")\n" + "sns.set_palette(\"husl\")" ] }, { @@ -162,20 +162,38 @@ "## Chargement du dataset Adult Income (Census)\n", "\n", "print(\"=== Chargement du dataset Adult Income ===\\n\")\n", - "print(\"Dataset classique de Kaggle/UCI qui illustre parfaitement les forces de CatBoost\")\n", - "print(\"Objectif : Prédire si le revenu annuel > 50K$ basé sur des caractéristiques socio-démographiques\\n\")\n", + "print(\n", + " \"Dataset classique de Kaggle/UCI qui illustre parfaitement les forces de CatBoost\"\n", + ")\n", + "print(\n", + " \"Objectif : Prédire si le revenu annuel > 50K$ basé sur des caractéristiques socio-démographiques\\n\"\n", + ")\n", "\n", "# Chargement depuis UCI\n", "url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data\"\n", "\n", "column_names = [\n", - " 'age', 'workclass', 'fnlwgt', 'education', 'education_num',\n", - " 'marital_status', 'occupation', 'relationship', 'race', 'sex',\n", - " 'capital_gain', 'capital_loss', 'hours_per_week', 'native_country', 'income'\n", + " \"age\",\n", + " \"workclass\",\n", + " \"fnlwgt\",\n", + " \"education\",\n", + " \"education_num\",\n", + " \"marital_status\",\n", + " \"occupation\",\n", + " \"relationship\",\n", + " \"race\",\n", + " \"sex\",\n", + " \"capital_gain\",\n", + " \"capital_loss\",\n", + " \"hours_per_week\",\n", + " \"native_country\",\n", + " \"income\",\n", "]\n", "\n", "try:\n", - " df = pd.read_csv(url, names=column_names, sep=r',\\s*', engine='python', na_values='?')\n", + " df = pd.read_csv(\n", + " url, names=column_names, sep=r\",\\s*\", engine=\"python\", na_values=\"?\"\n", + " )\n", " print(\"Dataset chargé depuis UCI repository\")\n", "except: # noqa: E722\n", " print(\"Impossible de charger depuis UCI, création d'un dataset simulé similaire...\")\n", @@ -183,44 +201,121 @@ " np.random.seed(42)\n", " n_samples = 32561\n", "\n", - " df = pd.DataFrame({\n", - " 'age': np.random.randint(17, 90, n_samples),\n", - " 'workclass': np.random.choice(['Private', 'Self-emp-not-inc', 'Local-gov', 'State-gov', 'Self-emp-inc',\n", - " 'Federal-gov', 'Without-pay'], n_samples, p=[0.73, 0.08, 0.06, 0.04, 0.03, 0.03, 0.03]),\n", - " 'fnlwgt': np.random.randint(12285, 1484705, n_samples),\n", - " 'education': np.random.choice(\n", - " ['HS-grad', 'Some-college', 'Bachelors', 'Masters', 'Assoc-voc',\n", - " 'Doctorate', '11th', '9th', '7th-8th'], n_samples,\n", - " p=[0.32, 0.22, 0.16, 0.05, 0.04, 0.01, 0.04, 0.03, 0.13]),\n", - " 'education_num': np.random.randint(1, 16, n_samples),\n", - " 'marital_status': np.random.choice(['Married-civ-spouse', 'Never-married', 'Divorced', 'Separated',\n", - " 'Widowed'], n_samples, p=[0.46, 0.33, 0.14, 0.03, 0.04]),\n", - " 'occupation': np.random.choice(['Prof-specialty', 'Craft-repair', 'Exec-managerial', 'Adm-clerical',\n", - " 'Sales', 'Other-service', 'Machine-op-inspct', 'Tech-support'], n_samples,\n", - " p=[0.13, 0.13, 0.13, 0.12, 0.11, 0.10, 0.06, 0.22]),\n", - " 'relationship': np.random.choice(['Husband', 'Not-in-family', 'Own-child', 'Unmarried', 'Wife', 'Other-relative'],\n", - " n_samples, p=[0.40, 0.26, 0.16, 0.10, 0.05, 0.03]),\n", - " 'race': np.random.choice(['White', 'Black', 'Asian-Pac-Islander', 'Amer-Indian-Eskimo', 'Other'],\n", - " n_samples, p=[0.85, 0.10, 0.03, 0.01, 0.01]),\n", - " 'sex': np.random.choice(['Male', 'Female'], n_samples, p=[0.67, 0.33]),\n", - " 'capital_gain': np.where(np.random.random(n_samples) < 0.92, 0, np.random.randint(1, 99999, n_samples)),\n", - " 'capital_loss': np.where(np.random.random(n_samples) < 0.95, 0, np.random.randint(1, 4356, n_samples)),\n", - " 'hours_per_week': np.random.randint(1, 99, n_samples),\n", - " 'native_country': np.random.choice(['United-States', 'Mexico', 'Philippines', 'Germany', 'Canada',\n", - " 'India', 'Other'], n_samples, p=[0.90, 0.02, 0.01, 0.01, 0.01, 0.01, 0.04])\n", - " })\n", + " df = pd.DataFrame(\n", + " {\n", + " \"age\": np.random.randint(17, 90, n_samples),\n", + " \"workclass\": np.random.choice(\n", + " [\n", + " \"Private\",\n", + " \"Self-emp-not-inc\",\n", + " \"Local-gov\",\n", + " \"State-gov\",\n", + " \"Self-emp-inc\",\n", + " \"Federal-gov\",\n", + " \"Without-pay\",\n", + " ],\n", + " n_samples,\n", + " p=[0.73, 0.08, 0.06, 0.04, 0.03, 0.03, 0.03],\n", + " ),\n", + " \"fnlwgt\": np.random.randint(12285, 1484705, n_samples),\n", + " \"education\": np.random.choice(\n", + " [\n", + " \"HS-grad\",\n", + " \"Some-college\",\n", + " \"Bachelors\",\n", + " \"Masters\",\n", + " \"Assoc-voc\",\n", + " \"Doctorate\",\n", + " \"11th\",\n", + " \"9th\",\n", + " \"7th-8th\",\n", + " ],\n", + " n_samples,\n", + " p=[0.32, 0.22, 0.16, 0.05, 0.04, 0.01, 0.04, 0.03, 0.13],\n", + " ),\n", + " \"education_num\": np.random.randint(1, 16, n_samples),\n", + " \"marital_status\": np.random.choice(\n", + " [\n", + " \"Married-civ-spouse\",\n", + " \"Never-married\",\n", + " \"Divorced\",\n", + " \"Separated\",\n", + " \"Widowed\",\n", + " ],\n", + " n_samples,\n", + " p=[0.46, 0.33, 0.14, 0.03, 0.04],\n", + " ),\n", + " \"occupation\": np.random.choice(\n", + " [\n", + " \"Prof-specialty\",\n", + " \"Craft-repair\",\n", + " \"Exec-managerial\",\n", + " \"Adm-clerical\",\n", + " \"Sales\",\n", + " \"Other-service\",\n", + " \"Machine-op-inspct\",\n", + " \"Tech-support\",\n", + " ],\n", + " n_samples,\n", + " p=[0.13, 0.13, 0.13, 0.12, 0.11, 0.10, 0.06, 0.22],\n", + " ),\n", + " \"relationship\": np.random.choice(\n", + " [\n", + " \"Husband\",\n", + " \"Not-in-family\",\n", + " \"Own-child\",\n", + " \"Unmarried\",\n", + " \"Wife\",\n", + " \"Other-relative\",\n", + " ],\n", + " n_samples,\n", + " p=[0.40, 0.26, 0.16, 0.10, 0.05, 0.03],\n", + " ),\n", + " \"race\": np.random.choice(\n", + " [\"White\", \"Black\", \"Asian-Pac-Islander\", \"Amer-Indian-Eskimo\", \"Other\"],\n", + " n_samples,\n", + " p=[0.85, 0.10, 0.03, 0.01, 0.01],\n", + " ),\n", + " \"sex\": np.random.choice([\"Male\", \"Female\"], n_samples, p=[0.67, 0.33]),\n", + " \"capital_gain\": np.where(\n", + " np.random.random(n_samples) < 0.92,\n", + " 0,\n", + " np.random.randint(1, 99999, n_samples),\n", + " ),\n", + " \"capital_loss\": np.where(\n", + " np.random.random(n_samples) < 0.95,\n", + " 0,\n", + " np.random.randint(1, 4356, n_samples),\n", + " ),\n", + " \"hours_per_week\": np.random.randint(1, 99, n_samples),\n", + " \"native_country\": np.random.choice(\n", + " [\n", + " \"United-States\",\n", + " \"Mexico\",\n", + " \"Philippines\",\n", + " \"Germany\",\n", + " \"Canada\",\n", + " \"India\",\n", + " \"Other\",\n", + " ],\n", + " n_samples,\n", + " p=[0.90, 0.02, 0.01, 0.01, 0.01, 0.01, 0.04],\n", + " ),\n", + " }\n", + " )\n", "\n", " # Création de la cible avec logique réaliste\n", " income_score = (\n", - " (df['age'] > 35).astype(int) * 20 +\n", - " (df['education_num'] > 12).astype(int) * 30 +\n", - " (df['hours_per_week'] > 40).astype(int) * 15 +\n", - " (df['capital_gain'] > 0).astype(int) * 25 +\n", - " (df['marital_status'] == 'Married-civ-spouse').astype(int) * 20 +\n", - " (df['occupation'].isin(['Exec-managerial', 'Prof-specialty'])).astype(int) * 15 +\n", - " np.random.normal(0, 15, n_samples)\n", + " (df[\"age\"] > 35).astype(int) * 20\n", + " + (df[\"education_num\"] > 12).astype(int) * 30\n", + " + (df[\"hours_per_week\"] > 40).astype(int) * 15\n", + " + (df[\"capital_gain\"] > 0).astype(int) * 25\n", + " + (df[\"marital_status\"] == \"Married-civ-spouse\").astype(int) * 20\n", + " + (df[\"occupation\"].isin([\"Exec-managerial\", \"Prof-specialty\"])).astype(int)\n", + " * 15\n", + " + np.random.normal(0, 15, n_samples)\n", " )\n", - " df['income'] = (income_score > 60).map({True: '>50K', False: '<=50K'})" + " df[\"income\"] = (income_score > 60).map({True: \">50K\", False: \"<=50K\"})" ] }, { @@ -358,7 +453,7 @@ "outputs": [], "source": [ "# Encodage de la cible en 0/1\n", - "df['income'] = (df['income'] == '>50K').astype(int)" + "df[\"income\"] = (df[\"income\"] == \">50K\").astype(int)" ] }, { @@ -468,7 +563,7 @@ " \"race\",\n", " \"sex\",\n", " \"native_country\",\n", - "]\n" + "]" ] }, { @@ -497,7 +592,7 @@ "source": [ "print(\"\\n Cardinalité des variables catégorielles :\")\n", "for col in cat_features:\n", - " print(f\" {col}: {df[col].nunique()} catégories uniques\")\n" + " print(f\" {col}: {df[col].nunique()} catégories uniques\")" ] }, { @@ -526,7 +621,7 @@ "# Corrélation avec la cible\n", "print(\"\\n Corrélations avec le revenu >50K :\")\n", "correlations = df[numeric_features].corrwith(df[\"income\"]).sort_values(ascending=False)\n", - "print(correlations)\n" + "print(correlations)" ] }, { @@ -583,7 +678,7 @@ "axes[1, 2].set_xlabel(\"Revenu >50K\")\n", "\n", "plt.tight_layout()\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -647,7 +742,7 @@ "\n", "print(\"\\n=== Préparation pour CatBoost ===\\n\")\n", "print(f\"Variables catégorielles : {cat_features}\")\n", - "print(f\"Variables numériques : {numeric_features}\")\n" + "print(f\"Variables numériques : {numeric_features}\")" ] }, { @@ -861,11 +956,15 @@ "# Courbe ROC\n", "fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba_baseline)\n", "plt.figure(figsize=(8, 6))\n", - "plt.plot(fpr, tpr, label=f'CatBoost (AUC = {roc_auc_score(y_test, y_pred_proba_baseline):.3f})')\n", - "plt.plot([0, 1], [0, 1], 'k--', label='Hasard')\n", - "plt.xlabel('Taux de faux positifs')\n", - "plt.ylabel('Taux de vrais positifs')\n", - "plt.title('Courbe ROC')\n", + "plt.plot(\n", + " fpr,\n", + " tpr,\n", + " label=f\"CatBoost (AUC = {roc_auc_score(y_test, y_pred_proba_baseline):.3f})\",\n", + ")\n", + "plt.plot([0, 1], [0, 1], \"k--\", label=\"Hasard\")\n", + "plt.xlabel(\"Taux de faux positifs\")\n", + "plt.ylabel(\"Taux de vrais positifs\")\n", + "plt.title(\"Courbe ROC\")\n", "plt.legend()\n", "plt.grid(True)\n", "plt.show()" @@ -1133,7 +1232,7 @@ "df[\"montant_credit\"] = np.random.uniform(3000, 450000)\n", "df[\"defaut\"] = df[\"capital_gain\"] < df[\"capital_loss\"]\n", "\n", - "df = df.drop([\"capital_gain\", \"capital_loss\"], axis=1)\n" + "df = df.drop([\"capital_gain\", \"capital_loss\"], axis=1)" ] }, { @@ -1211,7 +1310,7 @@ "perte_totale_predite = y_pred_reg.sum()\n", "print(f\"\\\\nPerte totale réelle : {perte_totale_reelle:,.2f}€\")\n", "print(f\"Perte totale prédite : {perte_totale_predite:,.2f}€\")\n", - "print(f\"Erreur : {abs(perte_totale_reelle - perte_totale_predite):,.2f}€\")\n" + "print(f\"Erreur : {abs(perte_totale_reelle - perte_totale_predite):,.2f}€\")" ] }, { @@ -1276,7 +1375,7 @@ "plt.title(\"Top 15 variables les plus importantes\")\n", "plt.gca().invert_yaxis()\n", "plt.tight_layout()\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -1320,8 +1419,8 @@ " depth=6,\n", " random_seed=42,\n", " verbose=0,\n", - " auto_class_weights='Balanced',\n", - " eval_metric='AUC'\n", + " auto_class_weights=\"Balanced\",\n", + " eval_metric=\"AUC\",\n", ")\n", "\n", "model_weighted.fit(train_pool, eval_set=test_pool)" @@ -1405,7 +1504,7 @@ " random_seed=42,\n", " verbose=0,\n", " scale_pos_weight=scale,\n", - " eval_metric='AUC'\n", + " eval_metric=\"AUC\",\n", ")\n", "\n", "model_scaled.fit(train_pool, eval_set=test_pool)" @@ -1427,10 +1526,7 @@ "outputs": [], "source": [ "# CatBoost a un support natif pour SHAP\n", - "shap_values = model_baseline.get_feature_importance(\n", - " train_pool,\n", - " type='ShapValues'\n", - ")" + "shap_values = model_baseline.get_feature_importance(train_pool, type=\"ShapValues\")" ] }, { @@ -1483,13 +1579,12 @@ "source": [ "# Importance SHAP moyenne\n", "shap_importance = np.abs(shap_values[:, :-1]).mean(axis=0)\n", - "shap_df = pd.DataFrame({\n", - " 'feature': X_train.columns,\n", - " 'shap_importance': shap_importance\n", - "}).sort_values('shap_importance', ascending=False)\n", + "shap_df = pd.DataFrame(\n", + " {\"feature\": X_train.columns, \"shap_importance\": shap_importance}\n", + ").sort_values(\"shap_importance\", ascending=False)\n", "\n", "print(\"\\nImportance SHAP moyenne :\")\n", - "print(shap_df.head(10))\n" + "print(shap_df.head(10))" ] }, { @@ -1512,9 +1607,9 @@ "source": [ "# Visualisation\n", "plt.figure(figsize=(10, 8))\n", - "plt.barh(shap_df['feature'][:15], shap_df['shap_importance'][:15])\n", - "plt.xlabel('|SHAP value| moyen')\n", - "plt.title('Importance des features (SHAP)')\n", + "plt.barh(shap_df[\"feature\"][:15], shap_df[\"shap_importance\"][:15])\n", + "plt.xlabel(\"|SHAP value| moyen\")\n", + "plt.title(\"Importance des features (SHAP)\")\n", "plt.gca().invert_yaxis()\n", "plt.tight_layout()\n", "plt.show()"