{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# American Express - Default Prediction\n\n## Description du sujet\nAmerican Express a pour objectif de prédire la probabilité qu'un client ne rembourse pas le solde de sa carte de crédit.  \nPour cela, nous avons accès à une fenêtre de 18 mois après le dernier relevé de carte de crédit de chaque client.  \nLe client est étiqueté en défaut lorsqu'au bout de 120 jours après le dernier relevé de sa carte de crédit, il n'a pas remboursé son solde.\n\nNotre but ici, sera d'analyser les données pour mieux comprendre le sujet.\n\n## Description des variables\n\nD_* = Delinquency variables  \nS_* = Spend variables  \nP_* = Payment variables  \nB_* = Balance variables  \nR_* = Risk variables","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\npd.set_option('display.max_colwidth', None)\n\n# Listing des données disponibles\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-06-21T07:31:18.316437Z","iopub.execute_input":"2022-06-21T07:31:18.318490Z","iopub.status.idle":"2022-06-21T07:31:18.351438Z","shell.execute_reply.started":"2022-06-21T07:31:18.318347Z","shell.execute_reply":"2022-06-21T07:31:18.350475Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Nombre de données à charger pour l'analyse\nNROWS = 100_000","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:21.422803Z","iopub.execute_input":"2022-06-21T07:31:21.423193Z","iopub.status.idle":"2022-06-21T07:31:21.428073Z","shell.execute_reply.started":"2022-06-21T07:31:21.423164Z","shell.execute_reply":"2022-06-21T07:31:21.426989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = pd.read_csv(\"/kaggle/input/amex-default-prediction/train_data.csv\", nrows=NROWS)\ntrain_labels = pd.read_csv(\"/kaggle/input/amex-default-prediction/train_labels.csv\", nrows=NROWS)","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:23.215792Z","iopub.execute_input":"2022-06-21T07:31:23.216190Z","iopub.status.idle":"2022-06-21T07:31:23.984641Z","shell.execute_reply.started":"2022-06-21T07:31:23.216159Z","shell.execute_reply":"2022-06-21T07:31:23.983658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"categorical_variables = ['B_30', 'B_38', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126', 'D_63', 'D_64', 'D_66', 'D_68']\n\n# Définition des variables en variables qualitatives\ntrain_data[categorical_variables] = train_data[categorical_variables].astype('category')\n\n# On récupère toutes les variables quantitatives\nnumeric_variables = train_data._get_numeric_data().columns\n\n# On récupère toutes les variables qualitatives\ncategorical_variables = train_data.select_dtypes(exclude=['number', 'object']).columns","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:29.240504Z","iopub.execute_input":"2022-06-21T07:31:29.240928Z","iopub.status.idle":"2022-06-21T07:31:29.259600Z","shell.execute_reply.started":"2022-06-21T07:31:29.240891Z","shell.execute_reply":"2022-06-21T07:31:29.258813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data.describe()","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:31.399799Z","iopub.execute_input":"2022-06-21T07:31:31.400414Z","iopub.status.idle":"2022-06-21T07:31:31.861481Z","shell.execute_reply.started":"2022-06-21T07:31:31.400368Z","shell.execute_reply":"2022-06-21T07:31:31.860539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = train_data.loc[:,(train_data.isna().sum().sort_values() < 10_000)]\n\n# On met à jour toutes les variables quantitatives suite aux nettoyage des données\nnumeric_variables = train_data._get_numeric_data().columns\n\ntrain_data[numeric_variables] = train_data[numeric_variables].fillna(train_data[numeric_variables].std().to_dict())","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:35.817222Z","iopub.execute_input":"2022-06-21T07:31:35.818035Z","iopub.status.idle":"2022-06-21T07:31:35.937034Z","shell.execute_reply.started":"2022-06-21T07:31:35.817999Z","shell.execute_reply":"2022-06-21T07:31:35.936203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# colonne à supprimer\n# train_data = train_data.drop('D_87', axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:38.790223Z","iopub.execute_input":"2022-06-21T07:31:38.791096Z","iopub.status.idle":"2022-06-21T07:31:38.800509Z","shell.execute_reply.started":"2022-06-21T07:31:38.791051Z","shell.execute_reply":"2022-06-21T07:31:38.799406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data.describe()","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:41.035882Z","iopub.execute_input":"2022-06-21T07:31:41.036283Z","iopub.status.idle":"2022-06-21T07:31:41.477220Z","shell.execute_reply.started":"2022-06-21T07:31:41.036249Z","shell.execute_reply":"2022-06-21T07:31:41.476285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Après le nettoyage\n\n10 variables qualitatives  \n139 variables quantitatives  \n2 variables de type objet (customer_id et date)","metadata":{}},{"cell_type":"code","source":"train_data.info()","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:44.597228Z","iopub.execute_input":"2022-06-21T07:31:44.597759Z","iopub.status.idle":"2022-06-21T07:31:44.628832Z","shell.execute_reply.started":"2022-06-21T07:31:44.597721Z","shell.execute_reply":"2022-06-21T07:31:44.628130Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Un client peut avoir 1 à plusieurs enregistrements","metadata":{}},{"cell_type":"code","source":"print(\"Moyenne des enregistrement par client : \", train_data.customer_ID.value_counts().mean())\nprint(\"Médiane des enregistrement par client : \", train_data.customer_ID.value_counts().std())","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:47.457350Z","iopub.execute_input":"2022-06-21T07:31:47.458241Z","iopub.status.idle":"2022-06-21T07:31:47.469357Z","shell.execute_reply.started":"2022-06-21T07:31:47.458209Z","shell.execute_reply":"2022-06-21T07:31:47.468528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Nombre de clients en défaut ou non\n73959 clients en règle  \n26041 clients en défaut de paiement","metadata":{}},{"cell_type":"code","source":"train_labels.target.value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:50.047895Z","iopub.execute_input":"2022-06-21T07:31:50.048290Z","iopub.status.idle":"2022-06-21T07:31:50.058283Z","shell.execute_reply.started":"2022-06-21T07:31:50.048256Z","shell.execute_reply":"2022-06-21T07:31:50.057399Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_data['customer_ID'] = train_data['customer_ID'].astype('object')\n# train_labels['customer_ID'] = train_labels['customer_ID'].astype('object')","metadata":{"execution":{"iopub.status.busy":"2022-06-20T16:18:20.454983Z","iopub.execute_input":"2022-06-20T16:18:20.455848Z","iopub.status.idle":"2022-06-20T16:18:20.459409Z","shell.execute_reply.started":"2022-06-20T16:18:20.455803Z","shell.execute_reply":"2022-06-20T16:18:20.458663Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data_labeled = train_data.merge(train_labels, on='customer_ID')","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:53.743806Z","iopub.execute_input":"2022-06-21T07:31:53.744196Z","iopub.status.idle":"2022-06-21T07:31:53.807097Z","shell.execute_reply.started":"2022-06-21T07:31:53.744167Z","shell.execute_reply":"2022-06-21T07:31:53.805945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"target_corr = train_data_labeled.corr()['target']\ncorr_col = ((target_corr.sort_values() > 0.3) + (target_corr.sort_values() < -0.3)).to_dict()\ncorr_col['customer_ID'] = True","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:55.203674Z","iopub.execute_input":"2022-06-21T07:31:55.204461Z","iopub.status.idle":"2022-06-21T07:31:56.065940Z","shell.execute_reply.started":"2022-06-21T07:31:55.204418Z","shell.execute_reply":"2022-06-21T07:31:56.064944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Analyse des clients","metadata":{}},{"cell_type":"code","source":"clients_regle = train_data_labeled[train_data_labeled['target'] == 0][corr_col]","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:31:57.606855Z","iopub.execute_input":"2022-06-21T07:31:57.607390Z","iopub.status.idle":"2022-06-21T07:31:57.636810Z","shell.execute_reply.started":"2022-06-21T07:31:57.607347Z","shell.execute_reply":"2022-06-21T07:31:57.635797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Moyenne des enregistrement des clients en règle : \", clients_regle.customer_ID.value_counts().mean())\nprint(\"Médiane des enregistrement des clients en règle : \", clients_regle.customer_ID.value_counts().std())","metadata":{"execution":{"iopub.status.busy":"2022-06-20T16:18:21.510773Z","iopub.execute_input":"2022-06-20T16:18:21.511083Z","iopub.status.idle":"2022-06-20T16:18:21.520833Z","shell.execute_reply.started":"2022-06-20T16:18:21.511053Z","shell.execute_reply":"2022-06-20T16:18:21.519960Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clients_defaut = train_data_labeled[train_data_labeled['target'] == 1][corr_col]","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:32:00.014039Z","iopub.execute_input":"2022-06-21T07:32:00.014475Z","iopub.status.idle":"2022-06-21T07:32:00.026151Z","shell.execute_reply.started":"2022-06-21T07:32:00.014442Z","shell.execute_reply":"2022-06-21T07:32:00.025057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Moyenne des enregistrement des clients en défaut : \", clients_defaut.customer_ID.value_counts().mean())\nprint(\"Médiane des enregistrement des clients en défaut : \", clients_defaut.customer_ID.value_counts().std())","metadata":{"execution":{"iopub.status.busy":"2022-06-20T16:18:21.593198Z","iopub.execute_input":"2022-06-20T16:18:21.594013Z","iopub.status.idle":"2022-06-20T16:18:21.602691Z","shell.execute_reply.started":"2022-06-20T16:18:21.593979Z","shell.execute_reply":"2022-06-20T16:18:21.601636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Le nombre d'enregistrement par client ne semble pas influencer le fait qu'ils seront en défaut ou non.","metadata":{}},{"cell_type":"code","source":"client_defaut = train_data_labeled[train_data_labeled['customer_ID'] == '0000f99513770170a1aba690daeeb8a96da4a39f11fc27da5c30a79db61c1e85']","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:32:02.752640Z","iopub.execute_input":"2022-06-21T07:32:02.753023Z","iopub.status.idle":"2022-06-21T07:32:02.762342Z","shell.execute_reply.started":"2022-06-21T07:32:02.752993Z","shell.execute_reply":"2022-06-21T07:32:02.761435Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"delinquency_col = [col for col in clients_defaut.columns if col.startswith('D_')]\nspend_col = [col for col in clients_defaut.columns if col.startswith('S_')]\npayment_col = [col for col in clients_defaut.columns if col.startswith('P_')]\nbalance_col = [col for col in clients_defaut.columns if col.startswith('B_')]\nrisk_col = [col for col in clients_defaut.columns if col.startswith('R_')]\n\nvariables_col = [delinquency_col, spend_col, payment_col, balance_col, risk_col]","metadata":{"execution":{"iopub.status.busy":"2022-06-21T07:32:04.914538Z","iopub.execute_input":"2022-06-21T07:32:04.914974Z","iopub.status.idle":"2022-06-21T07:32:04.925482Z","shell.execute_reply.started":"2022-06-21T07:32:04.914939Z","shell.execute_reply":"2022-06-21T07:32:04.924432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clients_defaut.describe()","metadata":{"execution":{"iopub.status.busy":"2022-06-20T16:18:22.221046Z","iopub.execute_input":"2022-06-20T16:18:22.221623Z","iopub.status.idle":"2022-06-20T16:18:22.699728Z","shell.execute_reply.started":"2022-06-20T16:18:22.221558Z","shell.execute_reply":"2022-06-20T16:18:22.698465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clients_regle.describe()","metadata":{"execution":{"iopub.status.busy":"2022-06-20T16:18:22.701774Z","iopub.execute_input":"2022-06-20T16:18:22.702095Z","iopub.status.idle":"2022-06-20T16:18:23.204023Z","shell.execute_reply.started":"2022-06-20T16:18:22.702064Z","shell.execute_reply":"2022-06-20T16:18:23.202882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Etude des variables","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n\ndef subplots(columns):\n    \"\"\"\n    Fonction permettant d'afficher la densité de chaque variables en fonction de la solvabilité du client\n    \n    Target = 0 : Client solvable\n    Target = 1 : Client en défaut de paiement\n    \n    Parameters\n    ----------\n    columns : array\n        Liste des variables à afficher\n    \"\"\"\n\n    # calcul de la dimension de la grille\n    size = len(columns)\n    cols = 5\n    rows = size // cols\n    rows += size % cols\n    \n    # initialisation de la figure\n    fig = plt.figure(figsize=(20,30), constrained_layout = True)\n    \n    position = range(1,size + 1)\n\n    for key, col_name in enumerate(columns, start=0) :\n        \n        ax = fig.add_subplot(rows,cols,position[key])\n        clients_regle[col_name].plot(kind='kde',ax=ax, label=\"0\")\n        clients_defaut[col_name].plot(kind='kde',ax=ax, label=\"1\")\n\n        ax.legend(title=\"Target\")\n        ax.set_title(col_name)","metadata":{"execution":{"iopub.status.busy":"2022-06-21T08:28:58.976385Z","iopub.execute_input":"2022-06-21T08:28:58.976802Z","iopub.status.idle":"2022-06-21T08:28:58.987474Z","shell.execute_reply.started":"2022-06-21T08:28:58.976769Z","shell.execute_reply":"2022-06-21T08:28:58.986292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Variables de délinquance \n\nOn observe les différences entre les clients solvables et les clients en défaut de paiement afin de découvrir de potentielles variables discriminantes.","metadata":{}},{"cell_type":"code","source":"subplots(delinquency_col)","metadata":{"execution":{"iopub.status.busy":"2022-06-21T08:29:01.148167Z","iopub.execute_input":"2022-06-21T08:29:01.148874Z","iopub.status.idle":"2022-06-21T08:29:31.188373Z","shell.execute_reply.started":"2022-06-21T08:29:01.148816Z","shell.execute_reply":"2022-06-21T08:29:31.187588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Variables de dépense","metadata":{}},{"cell_type":"code","source":"subplots(spend_col)","metadata":{"execution":{"iopub.status.busy":"2022-06-21T08:29:36.543545Z","iopub.execute_input":"2022-06-21T08:29:36.544492Z","iopub.status.idle":"2022-06-21T08:29:45.051058Z","shell.execute_reply.started":"2022-06-21T08:29:36.544455Z","shell.execute_reply":"2022-06-21T08:29:45.049868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Variables de solde","metadata":{}},{"cell_type":"code","source":"subplots(balance_col)","metadata":{"execution":{"iopub.status.busy":"2022-06-21T08:29:50.749060Z","iopub.execute_input":"2022-06-21T08:29:50.749448Z","iopub.status.idle":"2022-06-21T08:30:04.028977Z","shell.execute_reply.started":"2022-06-21T08:29:50.749415Z","shell.execute_reply":"2022-06-21T08:30:04.028005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Variables de paiement","metadata":{}},{"cell_type":"code","source":"subplots(payment_col)","metadata":{"execution":{"iopub.status.busy":"2022-06-21T08:30:04.030815Z","iopub.execute_input":"2022-06-21T08:30:04.031260Z","iopub.status.idle":"2022-06-21T08:30:05.152475Z","shell.execute_reply.started":"2022-06-21T08:30:04.031228Z","shell.execute_reply":"2022-06-21T08:30:05.151364Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Variables de risque","metadata":{}},{"cell_type":"code","source":"subplots(risk_col)","metadata":{"execution":{"iopub.status.busy":"2022-06-21T08:30:05.153792Z","iopub.execute_input":"2022-06-21T08:30:05.154109Z","iopub.status.idle":"2022-06-21T08:30:15.615179Z","shell.execute_reply.started":"2022-06-21T08:30:05.154080Z","shell.execute_reply":"2022-06-21T08:30:15.614113Z"},"trusted":true},"execution_count":null,"outputs":[]}]}