Parite 1 – Data préparation¶
Dans cette première partie notre objectif est de préparer notre jeu de données en vu de son utilisation par nos algorythmes de segmentation.
Q1. Importez la bibliothèque pandas.
# Importez la bibliothèque pandas avec l'alias pd
import pandas as pd
Q2. Importez le jeu de données data_clean.csv
dans une variable df.
Vous pouvez télécharger le fichier ici, Déplacez-le enssuite dans le dossier sample_data
.
# Importez le jeu de donnés 'data_clean.csv' dans la variable df
df = pd.read_csv('data_clean.csv')
df[['Gender', 'Ever_Married']]
Gender | Ever_Married | |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
2 | 0 | 0 |
3 | 0 | 0 |
4 | 0 | 1 |
… | … | … |
6660 | 0 | 0 |
6661 | 0 | 1 |
6662 | 1 | 1 |
6663 | 1 | 1 |
6664 | 0 | 0 |
6665 rows × 2 columns
Q3. Créez une variable X contenant l’ensemble des 8 colonnes :
'Gender'
'Ever_Married'
'Age'
'Graduated'
'Profession'
'Work_Experience'
'Spending_Score'
'Family_Size'
La méthode de sélection de colonnes est la suivante : df[['colonne 1', 'colonne 2', 'colonne3', ..., 'colonne n']]
liste_columns = [ 'Gender', 'Ever_Married', 'Age']
liste_columns
['Gender', 'Ever_Married', 'Age']
# Créez la variable X contenant les colonnes : 'Gender', 'Ever_Married', 'Age', 'Graduated', 'Profession',
# 'Work_Experience', 'Spending_Score', 'Family_Size' du jeu de données df
X = df[[ 'Gender', 'Ever_Married', 'Age', 'Graduated', 'Profession', 'Work_Experience', 'Spending_Score', 'Family_Size']]
X
Gender | Ever_Married | Age | Graduated | Profession | Work_Experience | Spending_Score | Family_Size | |
---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 22 | 1 | 1 | 1.0 | 0 | 4.0 |
1 | 1 | 0 | 67 | 0 | 4 | 1.0 | 0 | 1.0 |
2 | 0 | 0 | 67 | 0 | 6 | 0.0 | 2 | 2.0 |
3 | 0 | 0 | 56 | 1 | 0 | 0.0 | 1 | 2.0 |
4 | 0 | 1 | 32 | 0 | 1 | 1.0 | 0 | 3.0 |
… | … | … | … | … | … | … | … | … |
6660 | 0 | 0 | 41 | 0 | 0 | 0.0 | 2 | 5.0 |
6661 | 0 | 1 | 35 | 1 | 5 | 3.0 | 0 | 4.0 |
6662 | 1 | 1 | 33 | 0 | 1 | 1.0 | 0 | 1.0 |
6663 | 1 | 1 | 27 | 0 | 1 | 1.0 | 0 | 4.0 |
6664 | 0 | 0 | 37 | 0 | 5 | 0.0 | 1 | 3.0 |
6665 rows × 8 columns
%whos
Variable Type Data/Info -------------------------------------- X DataFrame Gender Ever_Marrie<...>\n[6665 rows x 8 columns] df DataFrame Gender Ever_Marrie<...>\n[6665 rows x 9 columns] liste_columns list n=3 pd module <module 'pandas' from '/u<...>ages/pandas/__init__.py'> y Series 0 0\n1 3\n2 <...>ength: 6665, dtype: int64
Q4 Créez une variable y conetnant uniquement la colonne 'Segmentation'
.
# Créez la variable y contenant la colonne 'Segmentation' du jeu de données df
y = df['Segmentation']
y
0 0 1 3 2 3 3 1 4 1 .. 6660 3 6661 0 6662 0 6663 3 6664 3 Name: Segmentation, Length: 6665, dtype: int64
Q5 Installez la bibliothèque sklearn avec la commande pip dans la cellule suivante.
# Installez la bibliothèque sklearn avec la commande pip
!pip install scikit-learn
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/ Requirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (1.2.2) Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.22.4) Requirement already satisfied: scipy>=1.3.2 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.10.1) Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.2.0) Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (3.1.0)
Q6. Exécutez la cellule suivante.
Nous séparons ici notre jeu de données en jeu d’entrainement/test.
Le jeu d’entrainement servira à l’entraînement des algorithmes, alors que le jeu de test servira à évaluer l’alogoritme.
# Import du module train_test_split de la bibliothèque sklearn :
from sklearn.model_selection import train_test_split
# Séparation du jeu de données jeu d'entrainement (train) et enjeu d'évaluation (test) :
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, )
df
Gender | Ever_Married | Age | Graduated | Profession | Work_Experience | Spending_Score | Family_Size | Segmentation | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 22 | 1 | 1 | 1.0 | 0 | 4.0 | 0 |
1 | 1 | 0 | 67 | 0 | 4 | 1.0 | 0 | 1.0 | 3 |
2 | 0 | 0 | 67 | 0 | 6 | 0.0 | 2 | 2.0 | 3 |
3 | 0 | 0 | 56 | 1 | 0 | 0.0 | 1 | 2.0 | 1 |
4 | 0 | 1 | 32 | 0 | 1 | 1.0 | 0 | 3.0 | 1 |
… | … | … | … | … | … | … | … | … | … |
6660 | 0 | 0 | 41 | 0 | 0 | 0.0 | 2 | 5.0 | 3 |
6661 | 0 | 1 | 35 | 1 | 5 | 3.0 | 0 | 4.0 | 0 |
6662 | 1 | 1 | 33 | 0 | 1 | 1.0 | 0 | 1.0 | 0 |
6663 | 1 | 1 | 27 | 0 | 1 | 1.0 | 0 | 4.0 | 3 |
6664 | 0 | 0 | 37 | 0 | 5 | 0.0 | 1 | 3.0 | 3 |
6665 rows × 9 columns
X_test
Gender | Ever_Married | Age | Graduated | Profession | Work_Experience | Spending_Score | Family_Size | |
---|---|---|---|---|---|---|---|---|
1410 | 0 | 0 | 36 | 0 | 2 | 4.0 | 1 | 2.0 |
67 | 1 | 1 | 26 | 1 | 1 | 6.0 | 0 | 3.0 |
2673 | 1 | 0 | 48 | 1 | 5 | 9.0 | 1 | 3.0 |
1328 | 1 | 1 | 33 | 1 | 8 | 8.0 | 0 | 1.0 |
4513 | 1 | 1 | 18 | 1 | 1 | 0.0 | 0 | 3.0 |
… | … | … | … | … | … | … | … | … |
6566 | 0 | 0 | 56 | 1 | 0 | 0.0 | 1 | 2.0 |
3021 | 1 | 0 | 56 | 0 | 8 | 5.0 | 0 | 1.0 |
5425 | 0 | 1 | 26 | 1 | 2 | 0.0 | 0 | 2.0 |
1251 | 1 | 0 | 31 | 1 | 8 | 8.0 | 1 | 2.0 |
3725 | 1 | 1 | 29 | 1 | 1 | 0.0 | 0 | 3.0 |
1667 rows × 8 columns
X_train
Gender | Ever_Married | Age | Graduated | Profession | Work_Experience | Spending_Score | Family_Size | |
---|---|---|---|---|---|---|---|---|
5480 | 1 | 0 | 48 | 1 | 4 | 1.0 | 1 | 5.0 |
518 | 0 | 0 | 37 | 0 | 1 | 0.0 | 0 | 1.0 |
2873 | 0 | 0 | 53 | 0 | 0 | 6.0 | 1 | 3.0 |
5594 | 0 | 0 | 25 | 1 | 5 | 4.0 | 2 | 8.0 |
569 | 0 | 0 | 88 | 1 | 5 | 0.0 | 0 | 1.0 |
… | … | … | … | … | … | … | … | … |
2478 | 1 | 0 | 42 | 0 | 4 | 1.0 | 2 | 3.0 |
2348 | 0 | 0 | 47 | 1 | 5 | 1.0 | 2 | 2.0 |
6359 | 0 | 0 | 50 | 0 | 2 | 1.0 | 0 | 1.0 |
4194 | 1 | 0 | 73 | 1 | 6 | 1.0 | 0 | 2.0 |
4965 | 1 | 0 | 36 | 0 | 0 | 1.0 | 1 | 5.0 |
4998 rows × 8 columns
X
Gender | Ever_Married | Age | Graduated | Profession | Work_Experience | Spending_Score | Family_Size | |
---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 22 | 1 | 1 | 1.0 | 0 | 4.0 |
1 | 1 | 0 | 67 | 0 | 4 | 1.0 | 0 | 1.0 |
2 | 0 | 0 | 67 | 0 | 6 | 0.0 | 2 | 2.0 |
3 | 0 | 0 | 56 | 1 | 0 | 0.0 | 1 | 2.0 |
4 | 0 | 1 | 32 | 0 | 1 | 1.0 | 0 | 3.0 |
… | … | … | … | … | … | … | … | … |
6660 | 0 | 0 | 41 | 0 | 0 | 0.0 | 2 | 5.0 |
6661 | 0 | 1 | 35 | 1 | 5 | 3.0 | 0 | 4.0 |
6662 | 1 | 1 | 33 | 0 | 1 | 1.0 | 0 | 1.0 |
6663 | 1 | 1 | 27 | 0 | 1 | 1.0 | 0 | 4.0 |
6664 | 0 | 0 | 37 | 0 | 5 | 0.0 | 1 | 3.0 |
6665 rows × 8 columns
# Import du modèle KNN de la bibliothèque sklearn
from sklearn.neighbors import KNeighborsClassifier
# Définission du modèle KNN dans la variable knn
knn = KNeighborsClassifier(n_neighbors=6) # On définit ici k=3 où k est le nombre de voisins.
Q8 Compléter ici le code afin d’entraîner votre modèle KNN avec votre jeu de données d’entrainement
La nomenclature est la suivante : model.fit(X_train, y_train)
où, dans notre cas, modèle est notre modèle knn
.
# Entraînement du modèle knn
knn.fit(X_train, y_train)
KNeighborsClassifier(n_neighbors=6)
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.
KNeighborsClassifier(n_neighbors=6)
Q9 Faîtes une prédiction à partir du modèle knn
à partir de nos données test X et assigner cette prédiction dans une varibla y_pred
.
La nomenclature est la suite : y_pred = model.predict(X_test)
où model
dans notre cas présent doit être remplacé par notre modèle knn
.
X_test
Gender | Ever_Married | Age | Graduated | Profession | Work_Experience | Spending_Score | Family_Size | |
---|---|---|---|---|---|---|---|---|
1410 | 0 | 0 | 36 | 0 | 2 | 4.0 | 1 | 2.0 |
67 | 1 | 1 | 26 | 1 | 1 | 6.0 | 0 | 3.0 |
2673 | 1 | 0 | 48 | 1 | 5 | 9.0 | 1 | 3.0 |
1328 | 1 | 1 | 33 | 1 | 8 | 8.0 | 0 | 1.0 |
4513 | 1 | 1 | 18 | 1 | 1 | 0.0 | 0 | 3.0 |
… | … | … | … | … | … | … | … | … |
6566 | 0 | 0 | 56 | 1 | 0 | 0.0 | 1 | 2.0 |
3021 | 1 | 0 | 56 | 0 | 8 | 5.0 | 0 | 1.0 |
5425 | 0 | 1 | 26 | 1 | 2 | 0.0 | 0 | 2.0 |
1251 | 1 | 0 | 31 | 1 | 8 | 8.0 | 1 | 2.0 |
3725 | 1 | 1 | 29 | 1 | 1 | 0.0 | 0 | 3.0 |
1667 rows × 8 columns
# Prédiction du modèle knn à partir des données test
y_pred = knn.predict(X_test)
y_pred
array([0, 0, 1, ..., 2, 0, 0])
y_test
1410 3 67 0 2673 3 1328 0 4513 0 .. 6566 2 3021 1 5425 2 1251 0 3725 1 Name: Segmentation, Length: 1667, dtype: int64
Q10 Evaluer la performance du modèle knn
en exécutant la cellule suivante.
# Import du module permettant d'évaluer notre modèle
from sklearn.metrics import confusion_matrix
# Fonction permettant d'évaluer le modèle en fonction des 4 segments clients
def evaluation(y_pred, y_test):
matrix = confusion_matrix(y_test.values, y_pred.astype(int))
score = matrix.diagonal()/matrix.sum(axis=1)
colonne = ['Accuracy Segment 1', 'Accuracy Segment 2', 'Accuracy Segment 3', 'Accuracy Segment 4']
return pd.DataFrame(score.T, colonne, columns=['Score par Segmentation'])
Q11 Complétez le code suivant avec les variables y_pred
et y_test
afin d’observer la performance du modèle knn
en fonction des segment client. Notez vos observations.
# Evaluation du modèle
evaluation(y_pred, y_test)
Score par Segmentation | |
---|---|
Accuracy Segment 1 | 0.684091 |
Accuracy Segment 2 | 0.583721 |
Accuracy Segment 3 | 0.309406 |
Accuracy Segment 4 | 0.175573 |
1.3 Regressions Logisitic¶
Dans cette partie nous allons répéter la même procédure d’entrainement et d’évaluation mais avec une algorythme différent.
Q12 Exécuter la cellule suivante afin d’importer notre second modèle de segmentation.
# Import du modèle
from sklearn.linear_model import LogisticRegression
# Deffinition du modèle dans la variable lf
lr = LogisticRegression()
Q13 Entrainez le modèle lr
avec le module .fit(X_train, y_train)
à l’image de ce qui a été fait à la question Q8.
# Entraînement du modèle lr
lr.fit(à_compléter, à_compléter )
/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. Increase the number of iterations (max_iter) or scale the data as shown in: https://scikit-learn.org/stable/modules/preprocessing.html Please also refer to the documentation for alternative solver options: https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression n_iter_i = _check_optimize_result(
LogisticRegression()
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.
LogisticRegression()
Q14 Faîtes une prédiction à partir du modèle lr à partir de nos données test X et assigner cette prédiction dans une variable y_pred
.
La nomenclature est la suite : y_pred = model.predict(X_test)
où model
dans ce cas présent doit être remplacé par le modèle lr
.
# Prédiction du modèle lr dans la variable y_pred
y_pred = lr.predict(à_compléter)
Q15 Evaluez le modèle lr
en utilisant la fonction evaluation
sur les variables y_pred
et y_test
à l’image de la question.
# Evaluation du modèle lr
evaluation(à_compléter, à_compléter)
Score par Segmentation | |
---|---|
Accuracy Segment 1 | 0.686364 |
Accuracy Segment 2 | 0.648837 |
Accuracy Segment 3 | 0.344059 |
Accuracy Segment 4 | 0.134860 |
1.4 Approche probabiliste¶
Q16 Exécuter la cellule suivante afin d’importer notre troisème modèle de segmentation.
# Import du modèle GaussianNB de la bibliothèque sklearn
from sklearn.naive_bayes import GaussianNB
# Deffinition du modèle dans la variable gnb
gnb = GaussianNB()
Q17 Entraînez le modèle gnb
à l’image de ce qui a été fait à la question Q13.
# Entrainement du modèle gnb
gnb.
GaussianNB()
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.
GaussianNB()
Q18 Faites une prédiction sur X_test et enregistrez le résultat dans une variable y_pred (Q14).
# Prédiction du modèle gnb à partir des données test dans la variable y_pred
y_pred = gnb.
Q19 Evaluez le modèle gnb
(Q16).
# Evaluation du modèle gnb
evaluation()
Score par Segmentation | |
---|---|
Accuracy Segment 1 | 0.709091 |
Accuracy Segment 2 | 0.648837 |
Accuracy Segment 3 | 0.202970 |
Accuracy Segment 4 | 0.157761 |
1.4 Arbre de décision¶
Q20 Exécuter la cellule suivante afin d’importer notre second modèle de segmentation, puis :
- Entrainez le modèle
dt
, - Faites une prédiction enregistrée dans une variable
y_pred
, - Evaluez le modèle,
A l’image de ce qui a été fait précedement.
# Import du modèle DecisionTreeClassifier de la bibliothèque sklearn
from sklearn.tree import DecisionTreeClassifier
# Définition du modèle DecisionTreeClassifier dans la variable dt
dt = DecisionTreeClassifier()
# Entrainement du modèle dt
# Prédiction du modèle dt
# Evaluation du modèle dt
Score par Segmentation | |
---|---|
Accuracy Segment 1 | 0.577273 |
Accuracy Segment 2 | 0.451163 |
Accuracy Segment 3 | 0.361386 |
Accuracy Segment 4 | 0.282443 |
Conclusion¶
Nous avons observervé la classification (segmentation client) de 4 modèles à partir de notre jeu de données clients.
Chaque modèle adopte un formalisme mathématique différent mais s’utilise de la même manière :
- Import du modèle depuis la bibliothèque sklearn
- Entrainement du modèle avec le jeu d’entraînement (train)
- Prédiction puis évaluation à partir du jeu d’évaluation (test)
Notez les diffrérences que vous avez observez dans les résultats d’évaluation des modèles.