{ "cells": [ { "cell_type": "markdown", "id": "ac01a6ea-bef6-4ace-89ff-1dc03a4215c2", "metadata": {}, "source": [ "# Segmentation des clients par régression logistique" ] }, { "cell_type": "code", "execution_count": 1, "id": "bca785be-39f7-4583-9bd8-67c1134ae275", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import os\n", "import s3fs\n", "import re\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n", "from sklearn.preprocessing import StandardScaler\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "id": "59ce5096-4e2c-45c1-be78-43e14db4142c", "metadata": {}, "outputs": [], "source": [ "# # modification des variables categorielles\n", " \n", "# ### variable gender\n", "# df1_customer_product[\"gender_label\"] = df1_customer_product[\"gender\"].map({\n", "# 0: 'female',\n", "# 1: 'male',\n", "# 2: 'other'\n", "# })\n", " \n", "# ### variable country -> on indique si le pays est france\n", "# df1_customer_product[\"country_fr\"] = df1_customer_product[\"country\"].apply(lambda x : int(x==\"fr\") if pd.notna(x) else np.nan)\n", "\n", "# # Création des indicatrices de gender\n", "# gender_dummies = pd.get_dummies(df1_customer_product[\"gender_label\"], prefix='gender').astype(int)\n", " \n", "# # Concaténation des indicatrices avec le dataframe d'origine\n", "# df1_customer_product = pd.concat([df1_customer_product, gender_dummies], axis=1)" ] }, { "cell_type": "code", "execution_count": 3, "id": "3bf57816-b023-4e84-9450-095620bddebc", "metadata": {}, "outputs": [], "source": [ "# Create filesystem object\n", "S3_ENDPOINT_URL = \"https://\" + os.environ[\"AWS_S3_ENDPOINT\"]\n", "fs = s3fs.S3FileSystem(client_kwargs={'endpoint_url': S3_ENDPOINT_URL})" ] }, { "cell_type": "code", "execution_count": 4, "id": "27002f2f-a78a-414c-8e4f-b15bf6dd9e40", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_7388/1677066092.py:7: DtypeWarning: Columns (21,39) have mixed types. Specify dtype option on import or set low_memory=False.\n", " dataset_train = pd.read_csv(file_in, sep=\",\")\n", "/tmp/ipykernel_7388/1677066092.py:12: DtypeWarning: Columns (21,39) have mixed types. Specify dtype option on import or set low_memory=False.\n", " dataset_test = pd.read_csv(file_in, sep=\",\")\n" ] } ], "source": [ "# Importation des données\n", "BUCKET = \"projet-bdc2324-team1/1_Output/Logistique Regression databases - First approach\"\n", "\n", "FILE_PATH_S3 = BUCKET + \"/\" + \"dataset_train.csv\"\n", "\n", "with fs.open(FILE_PATH_S3, mode=\"rb\") as file_in:\n", " dataset_train = pd.read_csv(file_in, sep=\",\")\n", "\n", "FILE_PATH_S3 = BUCKET + \"/\" + \"dataset_test.csv\"\n", "\n", "with fs.open(FILE_PATH_S3, mode=\"rb\") as file_in:\n", " dataset_test = pd.read_csv(file_in, sep=\",\")\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "c3928b55-8821-46da-b3b5-a036efd6d2cf", "metadata": {}, "outputs": [ { "data": { "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", "
event_type_idname_event_types
02.0offre muséale individuel
14.0spectacle vivant
25.0offre muséale groupe
3NaNNaN
\n", "
" ], "text/plain": [ " event_type_id name_event_types\n", "0 2.0 offre muséale individuel\n", "1 4.0 spectacle vivant\n", "2 5.0 offre muséale groupe\n", "3 NaN NaN" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset_train[['event_type_id', 'name_event_types']].drop_duplicates()" ] }, { "cell_type": "code", "execution_count": 6, "id": "7e8a9d4d-7e55-4173-a7f4-8b8baa9610d2", "metadata": {}, "outputs": [], "source": [ "#Choose type of event \n", "type_event_choosed = 5\n", "\n", "dataset_test = dataset_test[(dataset_test['event_type_id'] == type_event_choosed) | np.isnan(dataset_test['event_type_id'])]\n", "dataset_test['y_has_purchased'] = dataset_test['y_has_purchased'].fillna(0)\n", "dataset_train = dataset_train[(dataset_train['event_type_id'] == type_event_choosed) | np.isnan(dataset_train['event_type_id'])]\n", "dataset_train['y_has_purchased'] = dataset_train['y_has_purchased'].fillna(0)" ] }, { "cell_type": "code", "execution_count": 8, "id": "e20ced8f-df1c-43bb-8d15-79f414c8225c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "customer_id 0.000000\n", "event_type_id 0.984075\n", "nb_tickets 0.000000\n", "nb_purchases 0.000000\n", "total_amount 0.000000\n", "nb_suppliers 0.000000\n", "vente_internet_max 0.000000\n", "purchase_date_min 0.984075\n", "purchase_date_max 0.984075\n", "time_between_purchase 0.984075\n", "nb_tickets_internet 0.000000\n", "name_event_types 0.984075\n", "avg_amount 0.984075\n", "birthdate 0.961026\n", "street_id 0.000000\n", "is_partner 0.000000\n", "gender 0.000000\n", "is_email_true 0.000000\n", "opt_in 0.000000\n", "structure_id 0.869302\n", "profession 0.950730\n", "language 0.991512\n", "mcp_contact_id 0.276103\n", "last_buying_date 0.633303\n", "max_price 0.633303\n", "ticket_sum 0.000000\n", "average_price 0.105825\n", "fidelity 0.000000\n", "average_purchase_delay 0.633303\n", "average_price_basket 0.633303\n", "average_ticket_basket 0.633303\n", "total_price 0.527478\n", "purchase_count 0.000000\n", "first_buying_date 0.633303\n", "country 0.065583\n", "age 0.961026\n", "tenant_id 0.000000\n", "nb_campaigns 0.000000\n", "nb_campaigns_opened 0.000000\n", "time_to_open 0.536466\n", "y_has_purchased 0.000000\n", "dtype: float64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset_train.isna().sum()/len(dataset_train)" ] }, { "cell_type": "code", "execution_count": 9, "id": "34bae3f7-d579-4f80-a38d-a83eb5ea8a7b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.9999434695179565\n", "Confusion Matrix:\n", " [[123819 0]\n", " [ 7 1]]\n", "Classification Report:\n", " precision recall f1-score support\n", "\n", " 0.0 1.00 1.00 1.00 123819\n", " 1.0 1.00 0.12 0.22 8\n", "\n", " accuracy 1.00 123827\n", " macro avg 1.00 0.56 0.61 123827\n", "weighted avg 1.00 1.00 1.00 123827\n", "\n" ] } ], "source": [ "\n", "reg_columns = ['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'nb_tickets_internet', 'opt_in', 'fidelity', 'nb_campaigns', 'nb_campaigns_opened']\n", "\n", "X_train = dataset_train[reg_columns]\n", "y_train = dataset_train['y_has_purchased']\n", "X_test = dataset_test[reg_columns]\n", "y_test = dataset_test['y_has_purchased']\n", "\n", "# Fit and transform the scaler on the training data\n", "scaler = StandardScaler()\n", "\n", "# Transform the test data using the same scaler\n", "X_train_scaled = scaler.fit_transform(X_train)\n", "X_test_scaled = scaler.fit_transform(X_test)\n", "\n", "# Create and fit the linear regression model\n", "logit_model = LogisticRegression(penalty='l1', solver='liblinear', C=1.0)\n", "logit_model.fit(X_train_scaled, y_train)\n", "\n", "y_pred = logit_model.predict(X_test_scaled)\n", "\n", "#Evaluation du modèle \n", "accuracy = accuracy_score(y_test, y_pred)\n", "conf_matrix = confusion_matrix(y_test, y_pred)\n", "class_report = classification_report(y_test, y_pred)\n", "\n", "print(\"Accuracy:\", accuracy)\n", "print(\"Confusion Matrix:\\n\", conf_matrix)\n", "print(\"Classification Report:\\n\", class_report)" ] }, { "cell_type": "code", "execution_count": 10, "id": "ccc78c36-3287-46e6-89ac-7494c1a7106a", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Class 0', 'Class 1'], yticklabels=['Class 0', 'Class 1'])\n", "plt.xlabel('Predicted')\n", "plt.ylabel('Actual')\n", "plt.title('Confusion Matrix')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.6" } }, "nbformat": 4, "nbformat_minor": 5 }