{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30822,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"46f2bb8c","cell_type":"markdown","source":"# Regression_with_an_Insurance_Dataset\n- Compétition disponible sur : https://www.kaggle.com/competitions/playground-series-s4e12/overview\n- **Objectif :** L'objectif  est de prédire les primes d'assurance en fonction de diverses caractéristiques des clients et des détails de la police. Les compagnies d'assurance s'appuient souvent sur des approches fondées sur les données pour estimer les primes, en tenant compte de facteurs tels que l'âge, le revenu, l'état de santé et les antécédents en matière de sinistres\n\nLe défi ici est de prédire les primes d'assurance en fonction de différents facteurs.","metadata":{}},{"id":"c45ea895","cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\n# ^^^ pyforest auto-imports - don't write above this line\n# packaging manipulation des données : \nimport os\nimport warnings\nfrom termcolor import colored\n\nimport numpy as np\nimport pandas as pd\n\n# packaging pour données manquantes\nimport missingno as msn  \n\n\n#packaging visualisation des données : \nimport seaborn as sns\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n#Packaging imputation données :\nfrom sklearn.compose import ColumnTransformer\n\nfrom sklearn.impute import SimpleImputer\n\n#Packaging test statistiques :\n\nfrom scipy.stats import shapiro,kendalltau, mannwhitneyu, kruskal\n\n#packaging preprocessing :\nfrom sklearn.preprocessing import OrdinalEncoder, LabelEncoder, StandardScaler\n\n\nwarnings.filterwarnings(\"ignore\")","metadata":{},"outputs":[],"execution_count":null},{"id":"4d47a2ab","cell_type":"markdown","source":"# Plan : \n\n## 1. Connaissance du jeu de données:\n- Explication des features et de la target\n- Definir le type de données\n- Regarder les données manquantes \n\n\n## 2. Traitement des données manquantes : \n- Visualisation & Imputation :\n    - Visualisation :\n        * 2.1 : variables continues\n        * 2.2 : variables discrètes\n        * 2.3 : variables qualitatives\n    - Imputation \n## 3. Datavisualisation  :\n- Analyse univariée\n    - Visualisation des variables numériques (discrète / continues) & test de shapiro (normalité)\n    - Visualisation des variables qualitatives \n        - Variables qualitatives à moins de 20 modalités \n        - Variables qualitatives à plus de 20 modalités \n    - Visualisation des variables temporelles\n    \n- Analyse bivariée : Target Vs features\n    - Target vs variables continues\n    - Target vs variables qualitatives/discrètes\n    - Target vs variables temporelles\n\n## 4. Test statistique\n- Target vs variable continues\n- Target vs variables discretes + qualitatives\n\n## 5. Preprocessing : Standardisation et encodage\n### train/test : \n- Imputation du test\n- Standardisation\n- Encodage\n\n\n## 6. Enregistrement des dataframes \n- Dataframe : avec toutes les features\n- Dataframe : avec suppression des features qualitatives","metadata":{}},{"id":"b638d6cb","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"id":"5fe094be","cell_type":"markdown","source":"## 1. Connaissance du jeu de données:\n- Explication des features et de la target\n- Definir le type de données\n- Regarder les données manquantes ?","metadata":{}},{"id":"859c7c83","cell_type":"code","source":"path = (\"//\").join(os.getcwd().split(\"\\\\\")[:-1])+\"//dataset\"\npath","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"id":"e04d7411","cell_type":"code","source":"#Ouverture des données :\ndata = pd.read_csv(path+'//train.csv')\ntest = pd.read_csv(path+'//test.csv')","metadata":{},"outputs":[],"execution_count":null},{"id":"ec11b700","cell_type":"code","source":"#Création d'une copie du dataframe train :\ndf = data.copy()","metadata":{},"outputs":[],"execution_count":null},{"id":"06b6cef5","cell_type":"code","source":"print(\"Dimensions des données :\")\nprint(\"Nombre de lignes/colonnes :\",df.shape)","metadata":{},"outputs":[],"execution_count":null},{"id":"e1423f3a","cell_type":"code","source":"pd.set_option(\"display.max_columns\",None)\n#Aperçu des données : \ndf.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"9585718c","cell_type":"code","source":"#Remettre l'affichage par défaut : \n# pd.reset_option(\"display.max_columns\")","metadata":{},"outputs":[],"execution_count":null},{"id":"4638d640","cell_type":"markdown","source":"#### Feature/Target explication : \n\nOn peut retrouver les différentes information de cette compétition sur https://www.kaggle.com/datasets/schran/insurance-premium-prediction\n- **Age** : âge de l'assuré (numérique)\n- **Gender** : Sexe de l'assuré (catégorique : homme, femme)\n- **Annual Income** : Revenu annuel de l'assuré (numérique, asymétrique)\n- **Marital Status**  : État civil de l'assuré (catégorique : célibataire, marié, divorcé)\n- **Number of Dependents** :  Nombre de personnes à charge (Numérique, avec des valeurs manquantes)\n- **Education Level** : Niveau d'éducation : niveau d'éducation le plus élevé atteint (catégorique : école secondaire, licence, maîtrise, doctorat)\n- **Occupation** : Profession de l'assuré (catégorique : employé, travailleur indépendant, chômeur) \n- **Health Score** : Score représentant l'état de santé (numérique, asymétrique)\n- **Location** : Type de lieu (catégorique : urbain, suburbain, rural)\n- **Policy Type** : Type de police d'assurance (catégorique : de base, complète, premium)\n\n- **Previous Claims** : Nombre de sinistres antérieurs (numérique, avec des valeurs aberrantes)\n- **Vehicle Age** :  Âge du véhicule assuré (numérique)\n- **Credit Score** : Cote de crédit de l'assuré (numérique, avec des valeurs manquantes)\n- **Insurance Duration** : Durée de la police d'assurance (Numérique, en années)\n- **Policy Start Date** : Date de début de la police d'assurance (Texte, mal formaté)\n- **Customer Feedback** : Brefs commentaires des clients (Texte)\n- **Smoking Status** : Statut de fumeur de l'assuré (catégorique : oui, non)\n- **Exercise Frequency** : Fréquence de l'exercice physique (catégorique : quotidien, hebdomadaire, mensuel, rarement)\n- **Property Type :** type de propriété (catégorique : maison, appartement, copropriété)\n\n\n#### Target : \n- **Premium Amount** : Variable cible représentant le montant de la prime d'assurance (Numérique, asymétrique)","metadata":{}},{"id":"e73b72f3","cell_type":"markdown","source":"#### Information supplémentaire :  \n\n\n- **Valeurs manquantes**: Certaines caractéristiques contiennent des valeurs manquantes pour simuler des problèmes de collecte de données dans le monde réel.\n\n- **Type de données incorrectes** : Certains champs sont intentionnellement définis sur des types de données incorrects afin de pratiquer le nettoyage des données.\n\n- **Distributions asymétriques** : Les caractéristiques **numériques** telles que le **Annual Income** et **Premium Amount** ont des **distributions asymétriques**, qui peuvent être traitées par des transformations\n    - En d'autres termes, il faudra utiliser des transformation telle que l'utilisation du logarithme, racine carrée, etc.. pour visualiser correctement les données (certainement la présence d'outliers dû à des observations soit rare ou des erreurs de données à l'origine de ces distributions)","metadata":{}},{"id":"4e6253dd","cell_type":"markdown","source":"#### Données manquantes : ","metadata":{}},{"id":"aa76cff7","cell_type":"code","source":"df.isnull().mean()[df.isnull().mean()>0].sort_values(ascending=False)*100","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"id":"776b7a82","cell_type":"markdown","source":"- 3 colonnes avec nan > 10%\n- 2 colonnes avec nan < 1%\n- 6 colonnes avec  1% < nan < 10%\n\nSoit 11 colonnes avec des NaN","metadata":{}},{"id":"15397a29","cell_type":"markdown","source":"## 2. Traitement des données manquantes : \n### Séparation en fonction de leur nature :\n\n- Pour visualiser correctement les données, nous allons les récupérer et les séparer en fonction de leur type afin de les visualiser avec les outils adéquats\n- Nous en profiterons pour corriger si nécessaire leurs **dtypes**","metadata":{}},{"id":"ddcc7efc","cell_type":"code","source":"#Récupération des colonnes avec des NaN : \ncol_NaN = df.isnull().sum()[df.isnull().sum()>0].keys().tolist()","metadata":{},"outputs":[],"execution_count":null},{"id":"e8c90a8e","cell_type":"markdown","source":"Analysons leur dtypes et affichons les premières lignes pour observer si cela est cohérent :","metadata":{}},{"id":"79f11c5f","cell_type":"code","source":"print(df[col_NaN].info())\ndf[col_NaN].head()","metadata":{},"outputs":[],"execution_count":null},{"id":"d0161fa6","cell_type":"markdown","source":"#### Observation : \n- Nous avons uniquement deux types de données : object et float\n    - object : concerne les 3 variables qualitatives et c'est **cohérent**, on notera la présence d'une variable **nominale** : **Customer Feedback**\n    - float : parmis ces features on retrouve des variables numériques quantitatives **continues** et **discrètes**\n    \nObservons le **nunique** de ces variables afin de les séparer correctement : ","metadata":{}},{"id":"faacc222","cell_type":"code","source":"print(colored(\"Répartition du nombre de modalité en fonction du type de variable :\\n\",attrs=[\"bold\"], color=\"green\"))\nprint(colored(\"Variable qualitatives :\", attrs=[\"bold\"], color=\"blue\"))\nprint(df[col_NaN].select_dtypes(include=\"object\").nunique().sort_values(),\"\\n\")\nprint(colored(\"Variable numériques :\", attrs=[\"bold\"], color=\"blue\"))\nprint(df[col_NaN].select_dtypes(exclude=\"object\").nunique().sort_values(),)","metadata":{},"outputs":[],"execution_count":null},{"id":"16b5b7fa","cell_type":"markdown","source":"- Les variables qualitatives prennent 3 modalités\n- Pour les numériques, au vu des résultats on pourra considérer jusqu'au 50 premières modalités que nous ayons affaire à des variables discrètes puis à partir des 550 modalités de **Credit Score** des variables continues\n- Conclusion :\n    - modalité < 50 : **variables discrètes**\n    - modalité > 50 : **variables continues**","metadata":{}},{"id":"9c08a4c7","cell_type":"code","source":"# Création des listes contenant les variables en fonction de leur natures : \n\nvar_qual_NaN = []\nvar_dis_NaN = []\nvar_cont_NaN = []\nprint(colored(\"Séparation des features contenant des NaN en fonction de leur nature\",\"magenta\",attrs=[\"bold\"]))\n\nfor col in col_NaN:\n    column = df[col]\n    if column.dtypes == \"object\": #si variables qualitatives:\n        var_qual_NaN.append(col)\n    else: #sinon (variables continues/discrètes)\n        if column.nunique() < 50: #si variable discrète :\n            var_dis_NaN.append(col)\n        else: #sinon, si variable continue :\n            var_cont_NaN.append(col)\n\nprint(\"\\n\",\n    colored(\"Variables qualitatives :\",\"blue\",attrs=[\"bold\"]), colored(var_qual_NaN,\"blue\"), \"\\n\",\n\n    colored(\"Variables discrètes :\",\"light_red\",attrs=[\"bold\"]),colored(var_dis_NaN,\"light_red\"),\"\\n\",\n    colored(\"Variables continues : \",\"green\",attrs=[\"bold\"]),colored(var_cont_NaN,\"green\"),\n     )","metadata":{},"outputs":[],"execution_count":null},{"id":"c901e7d9","cell_type":"markdown","source":"* Nous allons pouvoir visualiser et traiter chaque colonne contenant des NaN en fonction de leur nature\n* Ensuite nous modifierons leur dtypes une fois que les valeurs manquantes seront traitées","metadata":{}},{"id":"e633eee2","cell_type":"markdown","source":"### Visualisation et imputation :\n#### 2.1. Variables continues","metadata":{}},{"id":"12b206b7","cell_type":"code","source":"def visualisation_var_cont(columns,data, nrow,ncol,size=(10,8)):\n    \"\"\"\n    Fonction qui trace un boxplot suivi d'un histplot pour chaque features\n    columns = liste contenant les colonnes a analyser\n    data = jeu de données \n    nrow = nombre de lignes \n    ncol = nombre de colonnes\n    size = taille des figures\n    \"\"\"\n    plt.figure(figsize=size)\n    for index, col in enumerate(columns):\n        #Tracage des boxplot \n        plt.subplot(nrow,ncol,2*index+1)\n        sns.boxplot(x=col, data = data, color = \"deepskyblue\")\n\n        #Tracage des histogrammes : \n        plt.subplot(nrow,ncol,2*index+2)\n        ax=sns.histplot(x=col,data=data, kde=True,color=\"orange\")\n        ax.axvline(data[col].mean(), c = \"red\", label = \"Moyenne\")\n        ax.axvline(data[col].median(), c = \"yellow\", label = \"Mediane\")\n        ax.legend()\n\n    plt.tight_layout()\n    plt.show()\n    \nvisualisation_var_cont(columns=var_cont_NaN,data=df, nrow=3,ncol=2,size=(14,8))","metadata":{},"outputs":[],"execution_count":null},{"id":"73fd28d9","cell_type":"markdown","source":"#### Observation : \n- **Health Score & Credit Score** : La distribution ne semble pas montrer la présence d'outliers, avec une médiane et une moyenne assez proche\n- **Annual Income** : présence d'outliers.  Il y a très peu de chance que ces valeurs soient des erreurs, elles doivent appartenir à une classe minoritaire d'individu avec des salaires plus élevés. \n\n\nObservons cela :","metadata":{}},{"id":"04b71137","cell_type":"code","source":"highest_income = df[df[\"Annual Income\"]>=10**5]\noccupation_high_income = highest_income[\"Occupation\"].value_counts(dropna=False, normalize=True)*100\neducation_high_income = highest_income[\"Education Level\"].value_counts(dropna=False, normalize=True)*100\n\nplt.figure(figsize=(8,6))\nplt.subplot(1,2,1)\noccupation_high_income.plot(kind=\"pie\", autopct = \"%.1f%%\")\nplt.title(\"Occupation\")\nplt.subplot(1,2,2)\neducation_high_income.plot(kind=\"pie\", autopct = \"%.1f%%\")\nplt.title(\"Education\")\n\nplt.tight_layout()\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"id":"889ed11d","cell_type":"markdown","source":"#### Observation :\n- On peut voir que parmis les individus avec les plus haut salaires, tout est **équiréparti**\n- Autrement dit, peu importe le niveau d'étude ou même le poste occupé, tous perçoivent un haut salaire annuel \n\n\nOn imputera **Annual Income** par la **médiane** et les **deux autres features** par la **moyenne**","metadata":{}},{"id":"1095081c","cell_type":"markdown","source":"#### 2.2. Variables discrètes","metadata":{}},{"id":"1a203e2b","cell_type":"code","source":"df[var_dis_NaN].nunique().sort_values()","metadata":{},"outputs":[],"execution_count":null},{"id":"a8499282","cell_type":"code","source":"def visualisation_var_dis(columns,data, nrow,ncol,size=(14,12)):\n    plt.figure(figsize=size)\n    \n    \"\"\"\n    Trace un histplot affichant les % de chaque modalité pour une feature avec plus de 20 modalités\n    sinon un countplot\n    \"\"\"\n    for index, col in enumerate(columns,1):\n        plt.subplot(nrow,ncol,index)\n        if data[col].nunique()>20:\n            sns.histplot(x=col,data=data,stat=\"percent\")\n        else:\n            ax = sns.countplot(x=col, data = data) #countplot\n            ax.set_xlabel(col)#Nom de la colonne pour le titre de l'axe x\n            ax.set_ylabel(\"Count\") #nom de la colonne pour le titre de l'axe y\n            xlab = ax.get_xticklabels() #récupération des annotation en x\n            ax.set_xticklabels(rotation=45, labels = xlab ) #rotation de 45degre pour faciliter la lecture\n    plt.tight_layout()        \n    plt.show() ","metadata":{},"outputs":[],"execution_count":null},{"id":"f1c862cc","cell_type":"code","source":"visualisation_var_dis(var_dis_NaN, df, 3,3)","metadata":{},"outputs":[],"execution_count":null},{"id":"2821a3a0","cell_type":"markdown","source":"#### Observation : \n- On peut noter qu'à l'exception de la feature **Previous Claims** toutes les autres variables sont **équilibrées**\n- On remplacera les données manquantes par le mode pour chaque features","metadata":{}},{"id":"13157167","cell_type":"markdown","source":"#### 2.3. Variables qualitatives","metadata":{}},{"id":"90902e30","cell_type":"code","source":"visualisation_var_dis(var_qual_NaN, df, 1,3,size=(12,4))","metadata":{},"outputs":[],"execution_count":null},{"id":"1328a1e1","cell_type":"markdown","source":"#### Observation : \n- Même constat ici avec des features contenant des **données très équilibrées** et nous allons **imputer par le mode**","metadata":{}},{"id":"f2783818","cell_type":"markdown","source":"### Imputation : ","metadata":{}},{"id":"949c31fe","cell_type":"code","source":"#Séparation des colonnes en fonction de la stratégie d'imputation à adopter :\ncol_mean = [i for i in var_cont_NaN if i != \"Annual Income\"] #variable quantatives continues \ncol_med = [i for i in var_cont_NaN if i not in col_mean] #variable quantatives continues avec outliers\ncol_most_freq = var_dis_NaN+var_qual_NaN #variables qualitatives + discrètes","metadata":{},"outputs":[],"execution_count":null},{"id":"98320e9f","cell_type":"code","source":"imputer_mean = SimpleImputer(strategy=\"mean\")\ndf[col_mean] = imputer_mean.fit_transform(df[col_mean])","metadata":{},"outputs":[],"execution_count":null},{"id":"6a8d9dfd","cell_type":"code","source":"imputer_med = SimpleImputer(strategy=\"median\")\ndf[col_med] = imputer_med.fit_transform(df[col_med])","metadata":{},"outputs":[],"execution_count":null},{"id":"6753b428","cell_type":"code","source":"imputer_most_freq = SimpleImputer(strategy='most_frequent')\ndf[col_most_freq] = imputer_most_freq.fit_transform(df[col_most_freq])","metadata":{},"outputs":[],"execution_count":null},{"id":"da4d91ab","cell_type":"markdown","source":"#### Attention a remettre le dtype d'origine sur les variables discrètes qui sont devenu \"object\"","metadata":{}},{"id":"490895e2","cell_type":"code","source":"df[var_dis_NaN] = df[var_dis_NaN].astype(float)","metadata":{},"outputs":[],"execution_count":null},{"id":"63d1fcc2","cell_type":"markdown","source":"### Observation de l'impacte de l'imputation des données :","metadata":{}},{"id":"46a108b8","cell_type":"markdown","source":"#####  variables discrètes :","metadata":{}},{"id":"8c0fcd96","cell_type":"code","source":"visualisation_var_dis(var_dis_NaN, df, 3,3)","metadata":{},"outputs":[],"execution_count":null},{"id":"3117d8b2","cell_type":"markdown","source":"#### Observation :\n- On peut voir que cette imputation a surtout modifier les features **Age** et **Number of Dependents** avec l'introduction de ce biais\n- Nous pourrons revenir ultérieurement et appliquer une autre stratégie si la partie modélisation n'est pas convaincante","metadata":{}},{"id":"891c2484","cell_type":"markdown","source":"##### Variables qualitatives : ","metadata":{}},{"id":"cb94f335","cell_type":"code","source":"visualisation_var_dis(var_qual_NaN, df, 3,3)","metadata":{},"outputs":[],"execution_count":null},{"id":"45242e75","cell_type":"markdown","source":"#### Observation: \n- Même constat après imputation, surtout pour la features Occupation ou on voit que le biais est plus élevé","metadata":{}},{"id":"d6cfa512","cell_type":"markdown","source":"#### Conclusion 2. : \n- Nous avons des données pour la plupart très équilibrées\n    - variable continues : 1 variable contenant beaucoup d'outliers\n    - variable qualitatives & discrètes : données majoritairement équilibrée\n    \n","metadata":{}},{"id":"976dab68","cell_type":"markdown","source":"## 3. Datavisualisation  :\n- 3.1 Analyse univariée\n    -  Visualisation des variables numériques (discrète / continues) & test de shapiro (normalité)\n    - Visualisation des variables qualitatives \n    - Visualisation des variables temporelles\n    \n","metadata":{}},{"id":"97dc85ec","cell_type":"markdown","source":"### 3.1 Analyse univariée :\n\n#### Visualisation des variables numériques & Test de Shapiro (test de normalité) :\n#####  Variables continues","metadata":{}},{"id":"2540a1fc","cell_type":"code","source":"# Récupération des features continues :\ndf.select_dtypes(exclude=\"object\").nunique().sort_values()","metadata":{},"outputs":[],"execution_count":null},{"id":"e5e9bde9","cell_type":"markdown","source":"* **Ajustons les dtypes en fonction de la nature des features** \n    - variables **continues** : dtypes = **float**\n    - variables **discrètes** : dtypes = **int**\n    - variables **qualitatives** : dtypes = **object**\n    - variables **temporelles** : dtypes = **datetime**","metadata":{}},{"id":"6f0a763c","cell_type":"markdown","source":"- A l'exception d'**id** qui n'est pas une feature à proprement parlé, nous allons, comme pour l'imputation, considérer les features avec **modalités > 50** comme variable continue, sinon comme discrète","metadata":{}},{"id":"27432c68","cell_type":"code","source":"var_cont = [i for i in df.select_dtypes(exclude=\"object\") if (df[i].nunique()>50) & (i!= \"id\")]\nvar_dis = [i for i in df.select_dtypes(exclude=\"object\") if (i not in var_cont ) & (i!= \"id\")]","metadata":{},"outputs":[],"execution_count":null},{"id":"57b61b24","cell_type":"code","source":"#Modification du dtypes\nfor i in var_dis:\n    df[i] = df[i].astype(int)","metadata":{},"outputs":[],"execution_count":null},{"id":"8e249156","cell_type":"code","source":"print(colored(f\"Variable discrètes : \",\"red\",attrs=[\"bold\"]) , var_dis)\nprint(colored(f\"Variable continues : \",\"green\",attrs=[\"bold\"]) , var_cont)","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"id":"4a052741","cell_type":"code","source":"visualisation_var_cont(columns=var_cont,data=df, nrow=4,ncol=2,size=(14,16))","metadata":{},"outputs":[],"execution_count":null},{"id":"df33a093","cell_type":"markdown","source":"#### Observation : \n- Nous avons les 3 variables que nous avons déjà traité durant la partie imputation\n- Regardons **Premium Amount** : c'est la **target**, elle contient des valeurs très éparses, allant de 0 à 5000. Elle représente **le montant de la prime d'assurance**. Avec une valeur moyenne & médiane autour de 1000\n\n##### Shapiro test :\n- Même si graphiquement c'est assez explicite, on peut quand même faire le test de normalité permettant d'adapter les tests statistiques ultérieurement : ","metadata":{}},{"id":"21acdbe4","cell_type":"code","source":"def shapiro_test(list_col):\n    \"\"\"\n    Cette fonction teste si list_col est une liste, si ce n'est pas le cas,\n    elle convertie le texte en une liste avant de faire un test shapiro pour vérifier\n    si la feature suit une loi normale ou non\n    \"\"\"\n    if type(list_col) != list:\n        list_col = [list_col]\n\n    accepted,rejected = [], []\n\n    for col in df[list_col]:\n        stat, p_value = shapiro(df[col])  \n        alpha = 0.05\n        if p_value > alpha: \n            result = colored('Accepter', 'green')  \n            accepted.append(col)\n        else:\n            result = colored('Rejet','red')        \n            rejected.append(col)\n\n        print(f'{col:-<50}\\t Hypothèse: {result}')\n    return accepted,rejected","metadata":{},"outputs":[],"execution_count":null},{"id":"5b8d57a2","cell_type":"code","source":"a,r = shapiro_test(var_cont)","metadata":{},"outputs":[],"execution_count":null},{"id":"8d697268","cell_type":"markdown","source":"Aucune ne suit de loi normale, surtout pour **Premium Amount**, donc","metadata":{}},{"id":"235c7485","cell_type":"markdown","source":"### variables discrètes :","metadata":{}},{"id":"6d809d1f","cell_type":"code","source":"visualisation_var_dis(var_dis, df, 2,3,size=(12,8))","metadata":{},"outputs":[],"execution_count":null},{"id":"bf2d96e2","cell_type":"markdown","source":"#### Observation : \n- On retrouve nos 5 variables discrètes que nous avons déjà traité dans la partie imputation","metadata":{}},{"id":"72560944","cell_type":"markdown","source":"### Variables qualitatives : ","metadata":{}},{"id":"e6ac4ff6","cell_type":"code","source":"print(df.select_dtypes(include=\"object\").nunique())\n# Seule la variable temporelle contient un nombre de modalité très élevé \n#utilisons cette caractéristique pour séparer nos features :\nvar_qual = [i for i in df.select_dtypes(include=\"object\") if df[i].nunique()<10]\nvar_tempo = [i for i in df.select_dtypes(include=\"object\") if i not in var_qual]\nprint(colored(f\"Variable qualitatives : \",\"red\",attrs=[\"bold\"]) , var_qual)\nprint(colored(f\"Variable temporelles : \",\"green\",attrs=[\"bold\"]) , var_tempo)","metadata":{},"outputs":[],"execution_count":null},{"id":"fd1969fe","cell_type":"code","source":"visualisation_var_dis(var_qual, df, 4,3,size=(12,12))","metadata":{},"outputs":[],"execution_count":null},{"id":"aa517ba6","cell_type":"markdown","source":"#### Observation : \n- A l'exception de **Occupation** qui présente une modalité majoritairement présente (**dû à notre imputation des données**) et **Customer Feedback** à moindre mesure pour les mêmes raisons, **toutes les features ont des modalités équilibrés**","metadata":{}},{"id":"905c6466","cell_type":"markdown","source":"### Variables temporelles : \n- Comme il n'y a qu'**une seule feature** on peut utiliser un **déballage** en extrayant de la liste la feature :","metadata":{}},{"id":"44b9b0e8","cell_type":"code","source":"[var_tempo] = var_tempo\nvar_tempo","metadata":{},"outputs":[],"execution_count":null},{"id":"e6f2f63f","cell_type":"code","source":"#Convertissons la feature dans au bon format (date) :\ndf[var_tempo] = pd.to_datetime(df[var_tempo])\ndf[[var_tempo]].head()","metadata":{},"outputs":[],"execution_count":null},{"id":"237019a3","cell_type":"code","source":"#Formatons une nouvelle fois pour ne garder que la date : \ndf[var_tempo] = pd.to_datetime(df[var_tempo].dt.date)\ndf[[var_tempo]].head()","metadata":{},"outputs":[],"execution_count":null},{"id":"5681b777","cell_type":"markdown","source":"Pour calculer certaines statistiques, nous aurons besoin d'extraire des éléments comme le mois, l'années etc.\n- Nous allons extraire ces informations et les mettre dans un dataframe temporaire pour faciliter les analyses ","metadata":{}},{"id":"700800da","cell_type":"code","source":"#Récupération du nom des mois de chaque date ainsi que le numéro associé :\nmonthname = df[var_tempo].dt.month_name()\nmonth = df[var_tempo].dt.month","metadata":{},"outputs":[],"execution_count":null},{"id":"1681d9b2","cell_type":"code","source":"#Création d'un dictionnaire {numéro du mois - mois }\nmonth_dict = dict(zip(month,monthname ))\nmonth_dict = dict(sorted(month_dict.items()))\nmonth_dict","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"id":"34d83190","cell_type":"code","source":"#Création du dataframe temporaire :\ndf_tempo = pd.DataFrame()","metadata":{},"outputs":[],"execution_count":null},{"id":"3702c2e9","cell_type":"code","source":"#Ajout des infos extraite contenant le numéro du mois et son nom associé :\ndf_tempo[\"month\"] = month\ndf_tempo[\"monthname\"] = monthname\ndf_tempo[var_tempo] =df[var_tempo]\ndf_tempo.head(3)","metadata":{},"outputs":[],"execution_count":null},{"id":"97470c5c","cell_type":"code","source":"#Maintenant nous pouvons transformer la colonne monthname en variable catégorique en indiquant le bon ordre : \ndf_tempo['monthname'] = pd.Categorical(df_tempo['monthname'], categories=list(month_dict.values()), ordered=True)","metadata":{},"outputs":[],"execution_count":null},{"id":"d57c5233","cell_type":"code","source":"count_month = df_tempo.value_counts(\"monthname\").sort_index()\ncount_month","metadata":{},"outputs":[],"execution_count":null},{"id":"843186e4","cell_type":"code","source":"plt.figure(figsize=(16,4))\n\n# Comptage par année\ncounts_by_year = df_tempo[var_tempo].dt.year.value_counts().sort_index()\n# Visualisation\nplt.subplot(1,2,1)\nax = counts_by_year.plot(kind='bar', color='skyblue')\nlab = ax.get_xticklabels()\nax.set_xticklabels(lab, rotation=45)\n\nplt.title(\"Nombre de Date de début de la police d'assurance par année\")\nplt.xlabel(\"Année\")\nplt.ylabel(\"Nombre\")\n\n\n# Comptage par mois\ncount_month = df_tempo.value_counts(\"monthname\").sort_index()\n\n# Visualisation\nplt.subplot(1,2,2)\nax = count_month.plot(kind=\"bar\" , color='orange')\nplt.title(\"Nombre de Date de début de la police d'assurance par mois\")\nplt.xlabel(\"Mois\")\nplt.ylabel(\"Nombre\")\nlab = ax.get_xticklabels()\nax.set_xticklabels(lab, rotation=45)\nplt.show()\n\n\n# Comptage par mois et année\ncounts_by_month_year = df_tempo[var_tempo].dt.to_period(\"M\").value_counts().sort_index()\n# Visualisation\nax = counts_by_month_year.plot(kind='bar', figsize=(12, 6), color='red')\nplt.title(\"Nombre de Date de début de la police d'assurance par mois et année\")\nplt.xlabel(\"Mois et Année\")\nplt.ylabel(\"Nombre\")\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"id":"3d1dc5c8","cell_type":"markdown","source":"### Observation : \n- Nous avons des données de contrats d'assurance depuis aout 2018 jusqu'a aout 2024, soit 6 années \n- Là aussi nous avons un nombre pratiquement constant de contrat d'assurance : par années, par mois\n\n\n##### Avant l'analyse bivariée nous pouvons vérifier si tous les types de données sont cohérents :","metadata":{}},{"id":"5ab8168e","cell_type":"code","source":"print(colored(\"VARIABLES CONTINUES\", color=\"green\", attrs=[\"bold\"]))\nprint(df[var_cont].dtypes)\nprint(colored(\"VARIABLES DISCRETES\", color=\"green\", attrs=[\"bold\"]))\nprint(df[var_dis].dtypes)\nprint(colored(\"VARIABLES QUALITATIVES\", color=\"green\", attrs=[\"bold\"]))\nprint(df[var_qual].dtypes)\nprint(colored(\"VARIABLES TEMPORELLES\", color=\"green\", attrs=[\"bold\"]))\nprint(df[[var_tempo]].dtypes)","metadata":{},"outputs":[],"execution_count":null},{"id":"29cc3224","cell_type":"markdown","source":"## 3.2 Analyse bivariée : Target Vs features\n### Target vs variables continues\n","metadata":{}},{"id":"30bc801d","cell_type":"code","source":"correlation = df[var_cont].corrwith(df['Premium Amount']) #corrwith() permet de calculer la corrélation entre\n#la target et chaque variable continue\n\n# Trier les valeurs de corrélation par ordre décroissant\nsorted_correlation = correlation.sort_values(ascending=False)\n# plt.figure(figsize=(10, 20))\nheatmap = sns.heatmap(pd.DataFrame(sorted_correlation), annot=True, cmap='RdYlGn',fmt=\".2%\", cbar=True)\nheatmap.set_title('Corrélation entre la target et les variables continues')\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"id":"c5ad26ab","cell_type":"markdown","source":"### Observation : \n- Très peu de corrélation target/features, on pourra noter une anticorrélation linéaire un peu plus marqué entre la target et **Credit Score** : plus le revenu annuel est élevé et plus le Credit score est faible\n","metadata":{}},{"id":"341b54eb","cell_type":"markdown","source":"### Target vs variables qualitatives/discrètes\n#### Vs Qualitatives : ","metadata":{}},{"id":"9507c1ae","cell_type":"code","source":"plt.figure(figsize=(16,14))\nfor i,col in enumerate(var_qual,1):\n    plt.subplot(4,3,i)\n    sns.boxplot(y=col, x = \"Premium Amount\", data = df)\nplt.tight_layout()","metadata":{},"outputs":[],"execution_count":null},{"id":"4585781d","cell_type":"markdown","source":"### Observation : \n- les boxplots sont très similaires pour toutes les modalités de nos variables discrètes, cela indique probablement que ces variables n'expliquent pas une grande partie de la variabilité de notre variable cible","metadata":{}},{"id":"df70eccb","cell_type":"markdown","source":"#### Vs  discrètes :","metadata":{}},{"id":"9c83678c","cell_type":"code","source":"plt.figure(figsize=(18,14))\nfor i,col in enumerate(var_dis,1):\n    plt.subplot(3,2,i)\n    sns.boxplot(x=col, y = \"Premium Amount\", data = df.sample(1000))\n        \nplt.tight_layout()","metadata":{},"outputs":[],"execution_count":null},{"id":"ecd5617f","cell_type":"markdown","source":"#### Observation : \n- Ici c'est nettement plus interessant , on voit de la **variation entre les modalités de chaque features et la target**\n","metadata":{}},{"id":"c7810416","cell_type":"markdown","source":"### Target vs variable temporelle\n- Nous allons créer une copie de notre dataframe est mettre la date en index afin de faciliter les manipulations pour la visualisation des données ","metadata":{}},{"id":"c722f6b8","cell_type":"code","source":"df_time = df.copy()\ndf_time = df_time.set_index('Policy Start Date')","metadata":{},"outputs":[],"execution_count":null},{"id":"27ed8359","cell_type":"code","source":"years =[ 2019,2020,2021,2022,2023,2024]\nprint(colored(\"Evolution de la prime d'assurance moyenne au fil des années\",\"blue\",attrs=[\"bold\"]))\nfor i,k in enumerate(years,1):\n    plt.subplot(3,2,i)\n    df_time.loc[str(k),\"Premium Amount\"].resample(\"M\").median().plot(figsize=(18,12), linestyle=\"--\", c=\"red\",\n                                                                     label = \"Mediane mensuelle\" )\n    df_time.loc[str(k),\"Premium Amount\"].resample(\"M\").mean().plot(figsize=(18,12),\n                                                                   label = \"Moyenne mensuelle\",c=\"blue\" )\n    plt.title(f\"{k}\")\n    plt.legend()\n    plt.tight_layout()\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"id":"56551fef","cell_type":"markdown","source":"#### Observation : \n- Pas de grande différence entre le prix moyen/median de la prime d'assurance\n- Peu de variation  de la prime selon l'années","metadata":{}},{"id":"3fcce19f","cell_type":"markdown","source":"## Conclusion de la visualisation  :\n- Les données sont très **homogènes**, très peu de variabilité, les relations target-features (continues et qualitatives) sont  monotones.\n- Pour ce qui est des variables discrètes le constat est différent : il y a de la **variabilité**, ce qui laisse à penser que ce sera certainement ces features là qui seront déterminante pour la prédiction de la target\n\n\n- En d'autres terme ici nous comprenons que, le choix de la prédiction du montant de l'assurance (Premium Amount) est surtout influencé par des caractéristiques telles que : l'Age,  l'age du véhicule, la durée d'ancienneté de l'assuré (insurance duration) ou le nombre de sinistre antérieur.\n\n- La prime d'assurance ne dépend pas du statut de la personne (emploi, niveau d'étude, adresse, condition de vie, etc) mais simplement de ce qui le lie directement au véhicule comme mentionné sur les points précédent\n\nAfin de s'assurer de la dépendance ou non des features avec la target, nous allons effectuer différents tests statistiques ","metadata":{}},{"id":"b400d1a6","cell_type":"markdown","source":"## 4. Test statistique\n### Target vs variable continues\n\nNous avions préalablement fait un test de normalité, aucune ne suivait une loi normale, donc nous allons faire un test de Kendall","metadata":{}},{"id":"5dd2a531","cell_type":"code","source":"def kendall(features, target,dataframe,retour=False):\n    \"\"\"\n    Fonction qui effectue un test de Man Withney entre une variable qualitative et une variable continue\n    features : liste de feature ou feature unique\n    target : nom de la target\n    dataframe : jeu de donnée contenant les features et la target\n    renvoi un tuple de liste, le premier élément du tuple sont les variables à conserver, le second les variables à\n    supprimer\n    \"\"\"\n    var_a_conserver, var_a_supprimer = [],[]\n    #si l'utilisateur n'entre qu'une seule feature, on la met en liste :\n    if type(features) == str:\n        features = [features]\n    print(colored(\"P-values :\",\"blue\")) \n    print()\n\n    \n    #test correlation : \n    for feat in features:\n        stat, pval = kendalltau(dataframe[feat],dataframe[target]) #test kendall\n        alpha = 0.05\n        if pval<alpha:\n            print(f'{colored(feat,\"green\")} : {pval}')\n            var_a_conserver.append(feat)\n        else:\n            print(f'{colored(feat,\"red\")} : {pval}')\n\n            var_a_supprimer.append(feat)\n    print()        \n    print(colored(\"Variable a conserver \",\"green\", attrs=[\"bold\"]), var_a_conserver)\n    print(colored(\"Variable a supprimer \",\"red\", attrs=[\"bold\"]), var_a_supprimer)\n    if retour :\n        return var_a_conserver, var_a_supprimer\n        ","metadata":{},"outputs":[],"execution_count":null},{"id":"45081e9e","cell_type":"code","source":"kendall(var_cont, \"Premium Amount\",df)","metadata":{},"outputs":[],"execution_count":null},{"id":"87289361","cell_type":"markdown","source":"### Target vs variables  qualitatives :\n- Si la feature possède 2 modalité, un test de man whitney sera effectué, sinon dans le cas contraire (>2) un test de kruskal wallis ","metadata":{}},{"id":"be500046","cell_type":"code","source":"col_manwhitney, col_kruskal =  [], []\n\nfor i in var_qual+var_dis:\n    if df[i].nunique() == 2:\n        col_manwhitney.append(i)\n    else:\n        col_kruskal.append(i)","metadata":{},"outputs":[],"execution_count":null},{"id":"14919662","cell_type":"code","source":"def manwithney(features, target,dataframe,retour=False):\n    \"\"\"\n    Fonction qui effectue un test de Man Withney entre une variable qualitative et une variable continue\n    features : liste de feature ou feature unique\n    target : nom de la target\n    dataframe : jeu de donnée contenant les features et la target\n    renvoi un tuple de liste, le premier élément du tuple sont les variables à conserver, le second les variables à\n    supprimer\n    \"\"\"\n    var_a_conserver, var_a_supprimer = [],[]\n    #si l'utilisateur n'entre qu'une seule feature, on la met en liste :\n    if type(features) == str:\n        features = [features]\n    print(colored(\"P-values :\",\"blue\")) \n    print()\n\n    #test correlation : \n    for feat in features:\n            # Séparation en deux groupes basés sur la variable qualitative\n        group1 = dataframe[dataframe[feat] == dataframe[feat].unique()[0]][target]\n        group2 = dataframe[dataframe[feat] == dataframe[feat].unique()[1]][target]\n            \n        # test de Mann-Whitney\n        stat, pval = mannwhitneyu(group1, group2)\n        alpha = 0.05\n        if pval<alpha:\n            print(f'{colored(feat,\"green\")} : {pval}')\n            var_a_conserver.append(feat)\n        else:\n            print(f'{colored(feat,\"red\")} : {pval}')\n\n            var_a_supprimer.append(feat)\n    print()        \n    print(colored(\"Variable a conserver \",\"green\", attrs=[\"bold\"]), var_a_conserver)\n    print(colored(\"Variable a supprimer \",\"red\", attrs=[\"bold\"]), var_a_supprimer)\n    if retour:\n        return var_a_conserver, var_a_supprimer\n\n    \n    \ndef kruskal_wallis(feature, target, dataframe,retour=False):\n    var_a_conserver = []\n    var_a_supprimer = []\n\n    # Test si la feature est une liste ou simplement une feature\n    if type(feature) == str:\n        feature = [feature]\n    print(colored(\"P-values :\",\"blue\")) \n\n    for feat in feature:\n        # Séparer les données en fonction des différentes valeurs prises par la variable qualitatives\n        grouped_data = [dataframe.loc[dataframe[target] == category, feat] for category in dataframe[target].unique()]\n\n        # Effectuer le test de Kruskal-Wallis\n        statistic, pval = kruskal(*grouped_data)\n\n        # Interpréter les résultats\n        alpha = 0.05  # Niveau de signification\n        if pval<alpha:\n            print(f'{colored(feat,\"green\")} : {pval}')\n            var_a_conserver.append(feat)\n        else:\n            print(f'{colored(feat,\"red\")} : {pval}')\n\n            var_a_supprimer.append(feat)\n    print()        \n    print(colored(\"Variable a conserver \",\"green\", attrs=[\"bold\"]), var_a_conserver)\n    print(colored(\"Variable a supprimer \",\"red\", attrs=[\"bold\"]), var_a_supprimer)\n    if retour :\n        return var_a_conserver, var_a_supprimer","metadata":{},"outputs":[],"execution_count":null},{"id":"36e9c2d9","cell_type":"code","source":"manwithney(col_manwhitney, \"Premium Amount\",df)","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"id":"2081adf4","cell_type":"code","source":"kruskal_wallis(col_kruskal,  \"Premium Amount\",df)","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"id":"98a22538","cell_type":"markdown","source":"#### Résultats qui peut paraitre étonnant pour le test de kruskal wallis, calculons les medianes pour voir s'il y a réellement une différence significative","metadata":{}},{"id":"667164a2","cell_type":"code","source":"for feat in var_qual:\n    if df[feat].nunique()>2:\n        uniq = df[feat].unique()\n        for i in range(len(uniq)):\n            print(feat, df.loc[df[feat] == uniq[i],\"Premium Amount\"].median())","metadata":{},"outputs":[],"execution_count":null},{"id":"f40daac5","cell_type":"markdown","source":"#### Observation : \n- Très faible variation de la médiane","metadata":{}},{"id":"12431d62","cell_type":"markdown","source":"## Bilan des tests statistiques :\n- Sans surprise, les features comme **Gender ou Smoking Status** ne sont pas pertinente pour le modèle, la partie data visualisation nous montrer quasi aucune différence\n- A l'inverse, le test de kruskal wallis indique une **différence significative** entre les features et la target. Ceci peut s'expliquer par **la taille de l'échantillon**. En effet, nous avons ici un jeu de de données contenant **1.200.000** observations\n\n**Avec un échantillon de cette taille, les p-values obtenues sont presque garanties d'être significatives, même pour des différences minimes**","metadata":{}},{"id":"fd77dc03","cell_type":"markdown","source":"# Conclusion de l'EDA :\n\n- On a vu que la relation feature - target n'était pas **linéaire**\n- qu'il y a très peu de corrélation entre certaines features et la target\n- que la target avait des **outliers** (moyenne autour de 1000 mais présence de quelques valeurs allant jusqu'à *5000**\n- Les résultats obtenus nous conduisent à adopter la stratégie suivante :\n    1. Modéliser en **conservant les features** jugées significative par le test de kruskal wallis\n    2. Modéliser en **supprimant les features** jugées significative par le test de kruskal wallis\n\nAutrement dit, une **modélisation** **avec** et une **sans** les **variables qualitatives**\n\n***Remarque** : Dans les deux cas, nous ne conserverons pas la variable temporelle pour la modélisation*\n","metadata":{}},{"id":"e85cdff0","cell_type":"markdown","source":"## 5. Preprocessing :\n- Nous allons procéder au prétraitement des données pour le train et le test set\n- Puis nous allons séparer en 2 jeux de données : un avec les variables discrètes et l'autre sans","metadata":{}},{"id":"ad13e06e","cell_type":"markdown","source":"#### Imputation du test set ","metadata":{}},{"id":"46ab87db","cell_type":"code","source":"test.isnull().sum()[test.isnull().sum()>0] #données manquantes pour les memes colonnes que le train","metadata":{},"outputs":[],"execution_count":null},{"id":"e1903ae9","cell_type":"code","source":"#  Utilisation des imputers qui ont été entrainés \ntest[col_mean] = imputer_mean.transform(test[col_mean])\ntest[col_med] = imputer_med.transform(test[col_med])\ntest[col_most_freq] = imputer_most_freq.transform(test[col_most_freq])","metadata":{},"outputs":[],"execution_count":null},{"id":"6ac7249b","cell_type":"code","source":"imputer_mean\nimputer_med\nimputer_most_freq","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"id":"ae37a889","cell_type":"code","source":"test.isnull().sum()[test.isnull().sum()>0] #pu de données manquantes","metadata":{},"outputs":[],"execution_count":null},{"id":"42fbfc71","cell_type":"markdown","source":"#### Standardisation\n","metadata":{}},{"id":"fa5cd48b","cell_type":"code","source":"# il faut retirer la target de la standardisation :\ntarget = df[\"Premium Amount\"]\nvar_cont.remove(target.name)","metadata":{},"outputs":[],"execution_count":null},{"id":"f476ddea","cell_type":"code","source":"scaler = StandardScaler()\nscaler.fit(df[var_cont]) #entrainement\ndf[var_cont] = scaler.transform(df[var_cont]) #transformation\ntest[var_cont] = scaler.transform(test[var_cont]) #transformation","metadata":{},"outputs":[],"execution_count":null},{"id":"9bec0921","cell_type":"markdown","source":"#### Encodage\nAyant des colonnes avec plus de 2 catégories, on va utiliser un encodage OneHot plutôt qu'un OrdinalEncoder","metadata":{}},{"id":"0be8c8c8","cell_type":"code","source":"df[var_qual].head()","metadata":{},"outputs":[],"execution_count":null},{"id":"d11d71c6","cell_type":"code","source":"# Initialisation de l'encodeur OneHotEncoder\n# - sparse=False : Retourne une matrice dense, pratique pour la manipulation directe.\n# - drop='first' : Supprime la première catégorie pour chaque variable afin d'éviter la colinéarité.\n#    Exemple : Pour la variable 'Gender' avec ['Female', 'Male'] :\n#      -> Une seule colonne 'Gender_Male' est créée.\n#      -> Si 'Gender_Male = 0', cela correspond implicitement à 'Female'.\nencoder = OneHotEncoder(sparse=False, drop='first',handle_unknown='ignore')\n# handle_unknown='ignore' permet de gérer les catégories inconnues dans les données de test\n\n\n# Entraînement et transformation des variables qualitatives\nencoded_columns = encoder.fit_transform(df[var_qual])\n\n# Conversion des données encodées en DataFrame avec des noms explicites pour les colonnes\n# - get_feature_names_out() : Génère des noms clairs comme 'Gender_Male' ou 'Color_Blue'.\n\nvar_qual_encoded = encoder.get_feature_names_out()\n\nencoded_df = pd.DataFrame(encoded_columns,\n                          columns=var_qual_encoded\n                          )\nencoded_df.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"93168119","cell_type":"code","source":"#Remplacement des anciennes variables qualitatives par celles encodées :\ndf = df.drop(var_qual, axis=1) #suppression des anciennes variables ","metadata":{},"outputs":[],"execution_count":null},{"id":"31321ccf","cell_type":"code","source":"#Fusion des deux dataframes :\ndf = pd.concat([df, encoded_df], axis=1)","metadata":{},"outputs":[],"execution_count":null},{"id":"f6710502","cell_type":"markdown","source":"##### pour le test set :","metadata":{}},{"id":"6a4ef71b","cell_type":"code","source":"test_encoded = encoder.transform(test[var_qual])\ndf_test_encoded = pd.DataFrame(test_encoded,\n                          columns=var_qual_encoded\n                          )\ndf_test_encoded.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"0047c15d","cell_type":"code","source":"#Suppression variable qualitatives et remplacement par le variables encodées :\ntest = test.drop(var_qual, axis = 1) \ntest = pd.concat([test, df_test_encoded], axis = 1)\ntest.head()","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"id":"b927ef63","cell_type":"markdown","source":"##### Suppression variable temporelle :","metadata":{}},{"id":"02aa2e68","cell_type":"code","source":"df = df.drop(var_tempo, axis = 1)\ntest = test.drop(var_tempo, axis = 1)","metadata":{},"outputs":[],"execution_count":null},{"id":"efadd0ca","cell_type":"markdown","source":"## 6. Enregistrement des dataframes \n\n#### Dataframe en conservant les variables qualitatives :","metadata":{}},{"id":"b5274c60","cell_type":"code","source":"df.to_csv(\"train_preprocessed_With_AllFeat.csv\")","metadata":{},"outputs":[],"execution_count":null},{"id":"1de29ba0","cell_type":"code","source":"test.to_csv(\"test_preprocessed_With_AllFeat.csv\")","metadata":{},"outputs":[],"execution_count":null},{"id":"e5592fd7","cell_type":"markdown","source":"#### Dataframe sans les variables qualitatives :","metadata":{}},{"id":"0893fdda","cell_type":"code","source":"df = df.drop(var_qual_encoded, axis = 1)","metadata":{},"outputs":[],"execution_count":null},{"id":"333fe653","cell_type":"code","source":"test = test.drop(var_qual_encoded, axis = 1)","metadata":{},"outputs":[],"execution_count":null},{"id":"52fb9dd8","cell_type":"code","source":"df.to_csv(\"train_preprocessed_Without_AllFeat.csv\")","metadata":{},"outputs":[],"execution_count":null},{"id":"37b16113","cell_type":"code","source":"test.to_csv(\"test_preprocessed_Without_AllFeat.csv\")","metadata":{},"outputs":[],"execution_count":null},{"id":"9a2ce9a3-02dc-4de8-8282-b96677eb5fe9","cell_type":"markdown","source":"# Notebook Modelisation sans toutes les features : https://www.kaggle.com/code/mohamedabder/02-modelisation-insurance-withoutallfeatures","metadata":{}}]}