Optimisation Des Campagnes Marketing & IA
Optimisation Des Campagnes Marketing & IA
automatique : perspectives
d’optimisation des campagnes
ABDOULAYE TANGARA
Student in MSc in Quantitative and Computable Economics
Contacts
ï LinkedIn
§ Mon GitHub
Mon Portfolio
# [email protected]
"Si tu veux avoir quelque chose que tu n’as jamais eu, tu fais quelque
chose que tu n’as jamais fait"
Draft
©Tangara Abdoulaye
0.1 Analyse des KPIs et Modélisation de Campagne Marketing
[ ]: import pandas as pd # Manipulate dataframes
import numpy as np # Operations numériques
from skimpy import skim # Visualisation des données
from tabulate import tabulate # Visualisation des données
from datetime import datetime # Manipulation des dates
import scipy.stats as stat # Test statistiques
import matplotlib.pyplot as plt # Visualisation des données
import seaborn as sns # Visualisation des données
from sklearn.cluster import KMeans # Pour la segmentation
from sklearn.ensemble import RandomForestClassifier, IsolationForest # Modèle␣
,→de classification # Detection des outliers
1
2236 1 10-06-2014 56 406 ... 7
2237 0 25-01-2014 91 908 ... 6
2238 1 24-01-2014 8 428 ... 3
2239 1 15-10-2012 40 84 ... 7
Draft
2
[89]: # Preparation des données
# Information générales sur les données
print(f"Le nombre de lignes de la base de données est de : {data.shape[0]}")
print(f"\n Le nombre de colonnes de la base de données est de : {data.
,→shape[1]}\n")
info_data = pd.DataFrame({
'variable' : data.columns.to_list(),
'Type du variable' : data.dtypes.values,
'NumMissing' : data.isnull().sum().values,
'%Missing' : np.round((data.isnull().sum().values/data.shape[0])*100,3)
})
3
26 Z_CostContact int64 0 0.000
27 Z_Revenue int64 0 0.000
28 Response int64 0 0.000
if "Year_Birth" in data.columns:
data["Age"] = datetime.now().year - data["Year_Birth"]
del data["Year_Birth"]
[91]: skim(data)
4
[0, 1]
Categories (2, int64): [0, 1]
Draft
5
[92]: def UnivariateAnalysis(data, var_quanti, var_quali):
# Histogramme
for var in var_quanti:
if var in data.columns:
pvalue, statistic = stat.shapiro(data[var]) # Hypothèse nulle␣
,→(H0) : Les données suivent une distribution normale.
else:
text0 = f"La variable {var} suit une loi normale avec p-value␣
,→= {np.round(pvalue,2)} et statistique = {np.round(statistic, 2)}"
plt.figure(figsize=(10,5))
sns.histplot(data[var], kde=True)
plt.title(text0)
plt.show()
# Diagramme en barres
# Informations
print(f"\n la fréquance des modalités de la variable --{col}-- \n␣
,→{data[col].value_counts(normalize=True)*100}")
# Visualisation
plt.figure(figsize=(10,5))
sns.countplot(data[col])
plt.title(f"Analyse de la variable {col}")
plt.show()
Draft
6
[93]: def AnalyseBivariee(data, var_quanti, var_quali):
corr = data[var_quanti].corr()
mask = np.triu(np.ones_like(corr, dtype=bool))
plt.figure(figsize=(10,8))
sns.heatmap(np.round(corr,1), annot=True, cmap="coolwarm", mask=mask,␣
,→vmax=1, vmin=-1, linewidths=0.5)
plt.figure(figsize=(10,5))
sns.pairplot(data[var_quanti])
plt.show()
,→'NumWebPurchases',
for i in var_quali:
for j in var_quali:
if i != j and var_quali.get_loc(i) < var_quali.get_loc(j):
table = pd.crosstab(data[i], data[j])
print(f"Table de contingence entre les variables {i} et {j}␣
,→\n {table}")
plt.figure(figsize=(10,5))
sns.heatmap(table, annot=True, cmap="coolwarm", linewidths=1.
,→5, fmt="d")
7
for i in var_quanti:
for j in var_quali:
result = data.groupby(j)[i].mean()
print(f"\n La moyenne de la variable {i} par rapport à la␣
,→variable {j} \n {np.round(result,3).sort_values(ascending=False)}")
try:
# Application du test ANOVA
statistic, pvalue = stat.f_oneway(*[data[i][data[j] == level]␣
,→for level in data[j].unique()])
else:
text1 = f"La variable {i} et la variable {j} sont␣
,→indépendantes (p-value = {pvalue:.3f})"
except Exception as e:
print(f"Erreur pour la combinaison {i} et {j} : {e}")
Analyse univariée
Draft
8
Draft
9
Draft
10
Draft
11
Draft
12
Draft
13
Draft
14
Draft
15
Draft
16
Draft
17
Draft
18
Draft
19
Draft
20
Draft
21
Draft
22
Draft
23
Draft
24
la fréquance des modalités de la variable --Education--
Education
Graduation 50.312500
PhD 21.696429
Master 16.517857
2n Cycle 9.062500
Basic 2.410714
Name: proportion, dtype: float64
Draft
25
la fréquance des modalités de la variable --Marital_Status--
Marital_Status
Married 38.571429
Together 25.892857
Single 21.428571
Divorced 10.357143
Widow 3.437500
Alone 0.133929
Absurd 0.089286
YOLO 0.089286
Name: proportion, dtype: float64
Draft
26
la fréquance des modalités de la variable --AcceptedCmp4--
AcceptedCmp4
0 92.544643
1 7.455357
Name: proportion, dtype: float64
Draft
27
1 7.276786
Name: proportion, dtype: float64
Draft
28
AcceptedCmp2
0 98.660714
1 1.339286
Name: proportion, dtype: float64
Draft
29
la fréquance des modalités de la variable --Response--
Response
0 85.089286
1 14.910714
Name: proportion, dtype: float64
q1 = df[var].quantile(0.25)
q3 = df[var].quantile(0.75)
iqr = q3 - q1
vmin = q1 - 1.5 * iqr
vmax = q3 + 1.5 * iqr
# Vérifiez s'il y a des valeurs
Draft aberrantes dans la colonne
outliers = df[(df[var] < vmin) | (df[var] > vmax)]
if not outliers.empty: # Si la colonne contient des valeurs␣
,→aberrantes
outliers_dict[var] = outliers[var].tolist()
30
list_var = outliers_dict.keys()
return list_var
# Exemple d'utilisation
outliers = detect_outliers(data)
print("Variables avec des valeurs aberrantes :", outliers)
Parameters:
data (pd.DataFrame): Le dataframe contenant les données.
features (list): La liste des colonnes à analyser pour les outliers.
contamination (float): La proportion de données à considérer comme␣
,→outliers.
Returns:
pd.DataFrame: Le dataframe sans les outliers.
"""
# Initialiser le modèle IsolationForest
iso_forest = IsolationForest(contamination=contamination, random_state=42)
return data_cleaned
# Utilisation de la fonction
features_to_check = ['Income', 'MntWines', 'MntFruits', 'MntMeatProducts',
'MntFishProducts', 'MntSweetProducts', 'MntGoldProds',
'NumDealsPurchases', 'NumWebPurchases',␣
,→'NumCatalogPurchases',
'NumWebVisitsMonth', 'Age']
data = Traitement_Outliers(data, features_to_check)
Draft
Analyse Bivariée
31
Analyse de la relation entre les variables quantitatives et quantitatives
Draft
32
Draft
33
Draft
34
Draft
35
Draft
36
Draft
37
Draft
38
Draft
39
\Analyse de la relation entre les variables qualitatives et qualitatives
Marital_Status YOLO
Education
2n Cycle 0
Basic 0
Graduation 0
Master 0
PhD 2
Draft
40
Table de contingence entre les variables Education et AcceptedCmp3
AcceptedCmp3 0 1
Education
2n Cycle 177 14
Basic 47 6
Graduation 986 72
Master 335 23
PhD 429 39
Draft
41
Table de contingence entre les variables Education et AcceptedCmp5
AcceptedCmp5 0 1
Education
2n Cycle 182 9
Basic 53 0
Graduation 996 62
Master 337 21
PhD 432 36
Draft
42
Table de contingence entre les variables Education et AcceptedCmp1
AcceptedCmp1 0 1
Education
2n Cycle 179 12
Basic 53 0
Graduation 1000 58
Master 343 15
PhD 438 30
Draft
43
Table de contingence entre les variables Education et Complain
Complain 0 1
Education
2n Cycle 187 4
Basic 53 0
Graduation 1044 14
Master 356 2
PhD 467 1
Draft
44
Table de contingence entre les variables Education et Response
Response 0 1
Education
2n Cycle 171 20
Basic 51 2
Graduation 930 128
Master 308 50
PhD 370 98
Draft
45
Table de contingence entre les variables Marital_Status et AcceptedCmp4
AcceptedCmp4 0 1
Marital_Status
Absurd 1 0
Alone 3 0
Divorced 205 17
Married 771 60
Single 419 32
Together 513 36
Widow 59 10
YOLO 2 0
Draft
46
Table de contingence entre les variables Marital_Status et AcceptedCmp5
AcceptedCmp5 0 1
Marital_Status
Absurd 1 0
Alone 3 0
Divorced 213 9
Married 775 56
Single 426 25
Together 518 31
Widow 62 7
YOLO 2 0
Draft
47
Table de contingence entre les variables Marital_Status et AcceptedCmp2
AcceptedCmp2 0 1
Marital_Status
Absurd 1 0
Alone 3 0
Divorced 219 3
Married 825 6
Single 446 5
Together 537 12
Widow 68 1
YOLO 2 0
Draft
48
Table de contingence entre les variables Marital_Status et Complain
Complain 0 1
Marital_Status
Absurd 1 0
Alone 3 0
Divorced 220 2
Married 823 8
Single 445 6
Together 544 5
Widow 69 0
YOLO 2 0
Draft
49
Table de contingence entre les variables AcceptedCmp3 et AcceptedCmp4
AcceptedCmp4 0 1
AcceptedCmp3
0 1819 155
1 154 0
Draft
Table de contingence entre les variables AcceptedCmp3 et AcceptedCmp5
AcceptedCmp5 0 1
AcceptedCmp3
0 1862 112
50
1 138 16
Draft
51
AcceptedCmp3
0 1953 21
1 148 6
Draft
52
Table de contingence entre les variables AcceptedCmp3 et Response
Response 0 1
AcceptedCmp3
0 1746 228
1 84 70
Draft
53
Table de contingence entre les variables AcceptedCmp4 et AcceptedCmp1
AcceptedCmp1 0 1
AcceptedCmp4
0 1895 78
1 118 37
Draft
54
Table de contingence entre les variables AcceptedCmp4 et Complain
Complain 0 1
AcceptedCmp4
0 1952 21
1 155 0
Draft
55
0 1729 244
1 101 54
Draft
56
AcceptedCmp2 0 1
AcceptedCmp5
0 1988 12
1 113 15
Draft
57
Table de contingence entre les variables AcceptedCmp5 et Response
Response 0 1
AcceptedCmp5
0 1770 230
1 60 68
Draft
58
Table de contingence entre les variables AcceptedCmp1 et Complain
Complain 0 1
AcceptedCmp1
0 1992 21
1 115 0
Draft
59
0 1775 238
1 55 60
Draft
60
Response 0 1
AcceptedCmp2
0 1820 281
1 10 17
Draft
61
La moyenne de la variable Income par rapport à la variable Education
Education
PhD 55108.336
Master 52154.797
Graduation 51140.898
2n Cycle 46445.815
Basic 20039.491
Name: Income, dtype: float64
Draft
62
La moyenne de la variable Income par rapport à la variable AcceptedCmp3
AcceptedCmp3
0 51122.883
1 49258.844
Name: Income, dtype: float64
Draft
63
0 49722.621
Name: Income, dtype: float64
Draft
64
1 77006.439
0 49501.586
Name: Income, dtype: float64
Draft
65
Complain
0 51045.251
1 45242.286
Name: Income, dtype: float64
Draft
66
La moyenne de la variable Kidhome par rapport à la variable Education
Education
Basic 0.642
2n Cycle 0.497
Graduation 0.470
Master 0.469
PhD 0.417
Name: Kidhome, dtype: float64
Draft
67
La moyenne de la variable Kidhome par rapport à la variable AcceptedCmp3
AcceptedCmp3
1 0.500
0 0.462
Name: Kidhome, dtype: float64
Draft
68
1 0.148
Name: Kidhome, dtype: float64
Draft
69
AcceptedCmp1
0 0.485
1 0.104
Name: Kidhome, dtype: float64
Draft
70
La moyenne de la variable Kidhome par rapport à la variable Complain
Complain
1 0.667
0 0.463
Name: Kidhome, dtype: float64
Draft
71
La moyenne de la variable Teenhome par rapport à la variable Education
Education
PhD 0.607
Master 0.547
Graduation 0.516
2n Cycle 0.403
Basic 0.094
Name: Teenhome, dtype: float64
Draft
72
La moyenne de la variable Teenhome par rapport à la variable AcceptedCmp3
AcceptedCmp3
0 0.528
1 0.429
Name: Teenhome, dtype: float64
Draft
73
0 0.513
Name: Teenhome, dtype: float64
Draft
74
AcceptedCmp1
0 0.536
1 0.261
Name: Teenhome, dtype: float64
Draft
75
La moyenne de la variable Teenhome par rapport à la variable Complain
Complain
1 0.524
0 0.521
Name: Teenhome, dtype: float64
Draft
76
La moyenne de la variable Recency par rapport à la variable Education
Education
Graduation 50.200
2n Cycle 48.241
PhD 48.150
Master 47.749
Basic 47.623
Name: Recency, dtype: float64
Draft
77
La moyenne de la variable Recency par rapport à la variable AcceptedCmp3
AcceptedCmp3
0 49.487
1 44.091
Name: Recency, dtype: float64
Draft
78
1 50.716
0 48.970
Name: Recency, dtype: float64
Draft
79
La moyenne de la variable Recency par rapport à la variable AcceptedCmp1
AcceptedCmp1
0 49.302
1 45.504
Name: Recency, dtype: float64
Draft
80
La moyenne de la variable Recency par rapport à la variable Complain
Complain
1 53.048
0 49.057
Name: Recency, dtype: float64
Draft
81
La moyenne de la variable MntWines par rapport à la variable Education
Education
PhD 395.547
Master 315.243
Graduation 264.464
2n Cycle 180.885
Basic 3.075
Name: MntWines, dtype: float64
Draft
82
La moyenne de la variable MntWines par rapport à la variable AcceptedCmp3
AcceptedCmp3
1 342.610
0 283.549
Name: MntWines, dtype: float64
Draft
83
0 252.602
Name: MntWines, dtype: float64
Draft
84
AcceptedCmp1
1 736.991
0 262.163
Name: MntWines, dtype: float64
Draft
85
La moyenne de la variable MntWines par rapport à la variable Complain
Complain
0 289.008
1 169.000
Name: MntWines, dtype: float64
Draft
86
La moyenne de la variable MntFruits par rapport à la variable Education
Education
Graduation 26.419
2n Cycle 24.293
Master 19.330
PhD 17.620
Basic 9.019
Name: MntFruits, dtype: float64
Draft
87
La moyenne de la variable MntFruits par rapport à la variable AcceptedCmp3
AcceptedCmp3
1 24.000
0 22.563
Name: MntFruits, dtype: float64
Draft
88
1 23.284
0 22.618
Name: MntFruits, dtype: float64
Draft
89
La moyenne de la variable MntFruits par rapport à la variable AcceptedCmp1
AcceptedCmp1
1 42.296
0 21.545
Name: MntFruits, dtype: float64
Draft
90
La moyenne de la variable MntFruits par rapport à la variable Complain
Complain
1 24.190
0 22.652
Name: MntFruits, dtype: float64
Draft
91
La moyenne de la variable MntMeatProducts par rapport à la variable Education
Education
Graduation 156.087
PhD 154.472
Master 147.168
2n Cycle 131.162
Basic 9.358
Name: MntMeatProducts, dtype: float64
92
La moyenne de la variable MntMeatProducts par rapport à la variable
AcceptedCmp3
AcceptedCmp3
1 165.416
0 147.008
Name: MntMeatProducts, dtype: float64
Draft
93
AcceptedCmp4
1 215.600
0 143.056
Name: MntMeatProducts, dtype: float64
Draft
94
La moyenne de la variable MntMeatProducts par rapport à la variable
AcceptedCmp1
AcceptedCmp1
1 403.713
0 133.751
Name: MntMeatProducts, dtype: float64
Draft
95
La moyenne de la variable MntMeatProducts par rapport à la variable Complain
Complain
0 148.697
1 112.476
Name: MntMeatProducts, dtype: float64
Draft
96
La moyenne de la variable MntFishProducts par rapport à la variable Education
Education
2n Cycle 42.230
Graduation 36.384
Master 29.321
PhD 24.991
Basic 13.453
Name: MntFishProducts, dtype: float64
Draft
97
La moyenne de la variable MntFishProducts par rapport à la variable
Marital_Status
Marital_Status
Absurd 199.000
Widow 40.232
Together 33.184
Single 32.568
Divorced 32.018
Married 31.824
Alone 7.667
YOLO 4.000
Name: MntFishProducts, dtype: float64
Draft
98
La moyenne de la variable MntFishProducts par rapport à la variable
AcceptedCmp4
AcceptedCmp4
0 32.655
1 32.503
Name: MntFishProducts, dtype: float64
Draft
99
1 63.484
0 30.670
Name: MntFishProducts, dtype: float64
Draft
100
La moyenne de la variable MntFishProducts par rapport à la variable
AcceptedCmp2
AcceptedCmp2
1 36.185
0 32.598
Name: MntFishProducts, dtype: float64
Draft
101
La moyenne de la variable MntFishProducts par rapport à la variable Response
Response
1 42.815
0 30.987
Name: MntFishProducts, dtype: float64
Draft
102
La moyenne de la variable MntSweetProducts par rapport à la variable
Marital_Status
Marital_Status
Widow 30.565
Married 24.049
Single 23.665
Divorced 22.806
Together 20.639
Alone 7.000
YOLO 3.000
Absurd 0.000
Name: MntSweetProducts, dtype: float64
Draft
103
La moyenne de la variable MntSweetProducts par rapport à la variable
AcceptedCmp3
AcceptedCmp3
0 23.151
1 22.643
Name: MntSweetProducts, dtype: float64
Draft
104
AcceptedCmp4
1 24.742
0 22.987
Name: MntSweetProducts, dtype: float64
Draft
105
La moyenne de la variable MntSweetProducts par rapport à la variable
AcceptedCmp1
AcceptedCmp1
1 52.235
0 21.451
Name: MntSweetProducts, dtype: float64
Draft
106
La moyenne de la variable MntSweetProducts par rapport à la variable Complain
Complain
0 23.170
1 17.524
Name: MntSweetProducts, dtype: float64
Draft
107
La moyenne de la variable MntGoldProds par rapport à la variable Education
Education
Graduation 45.638
2n Cycle 41.654
Master 37.497
PhD 29.853
Basic 22.698
Name: MntGoldProds, dtype: float64
Draft
108
La moyenne de la variable MntGoldProds par rapport à la variable Marital_Status
Marital_Status
Absurd 163.000
Widow 50.957
Divorced 42.613
YOLO 42.000
Married 39.481
Together 39.102
Single 38.268
Alone 27.000
Name: MntGoldProds, dtype: float64
Draft
109
La moyenne de la variable MntGoldProds par rapport à la variable AcceptedCmp4
AcceptedCmp4
1 43.361
0 39.594
Name: MntGoldProds, dtype: float64
Draft
La moyenne de la variable MntGoldProds par rapport à la variable AcceptedCmp5
AcceptedCmp5
1 62.984
0 38.388
110
Name: MntGoldProds, dtype: float64
Draft
111
1 59.259
0 39.619
Name: MntGoldProds, dtype: float64
Draft
112
La moyenne de la variable MntGoldProds par rapport à la variable Response
Response
1 53.436
0 37.658
Name: MntGoldProds, dtype: float64
Draft
113
La moyenne de la variable NumDealsPurchases par rapport à la variable
Marital_Status
Marital_Status
YOLO 5.000
Alone 3.667
Absurd 3.000
Widow 2.406
Divorced 2.405
Married 2.381
Together 2.352
Single 2.180
Name: NumDealsPurchases, dtype: float64
Draft
114
La moyenne de la variable NumDealsPurchases par rapport à la variable
AcceptedCmp3
AcceptedCmp3
0 2.351
1 2.188
Name: NumDealsPurchases, dtype: float64
Draft
115
AcceptedCmp4
1 2.542
0 2.323
Name: NumDealsPurchases, dtype: float64
Draft
116
La moyenne de la variable NumDealsPurchases par rapport à la variable
AcceptedCmp1
AcceptedCmp1
0 2.383
1 1.565
Name: NumDealsPurchases, dtype: float64
Draft
117
La moyenne de la variable NumDealsPurchases par rapport à la variable Complain
Complain
0 2.339
1 2.333
Name: NumDealsPurchases, dtype: float64
Draft
118
La moyenne de la variable NumWebPurchases par rapport à la variable Education
Education
PhD 4.348
Graduation 4.000
Master 4.000
2n Cycle 3.581
Basic 1.717
Name: NumWebPurchases, dtype: float64
Draft
119
La moyenne de la variable NumWebPurchases par rapport à la variable
Marital_Status
Marital_Status
YOLO 7.000
Alone 5.000
Widow 4.551
Divorced 4.275
Married 4.046
Together 3.978
Single 3.621
Absurd 3.000
Name: NumWebPurchases, dtype: float64
Draft
120
La moyenne de la variable NumWebPurchases par rapport à la variable
AcceptedCmp4
AcceptedCmp4
1 5.606
0 3.855
Name: NumWebPurchases, dtype: float64
Draft
121
1 5.508
0 3.884
Name: NumWebPurchases, dtype: float64
Draft
122
La moyenne de la variable NumWebPurchases par rapport à la variable
AcceptedCmp2
AcceptedCmp2
1 5.074
0 3.968
Name: NumWebPurchases, dtype: float64
Draft
123
La moyenne de la variable NumWebPurchases par rapport à la variable Response
Response
1 5.010
0 3.815
Name: NumWebPurchases, dtype: float64
Draft
124
La moyenne de la variable NumCatalogPurchases par rapport à la variable
Marital_Status
Marital_Status
Absurd 5.000
Widow 2.986
Divorced 2.477
Together 2.450
Single 2.410
Married 2.380
YOLO 1.000
Alone 0.667
Name: NumCatalogPurchases, dtype: float64
Draft
125
La moyenne de la variable NumCatalogPurchases par rapport à la variable
AcceptedCmp3
AcceptedCmp3
1 3.513
0 2.348
Name: NumCatalogPurchases, dtype: float64
Draft
126
AcceptedCmp4
1 3.897
0 2.317
Name: NumCatalogPurchases, dtype: float64
Draft
127
La moyenne de la variable NumCatalogPurchases par rapport à la variable
AcceptedCmp1
AcceptedCmp1
1 5.704
0 2.245
Name: NumCatalogPurchases, dtype: float64
Draft
128
La moyenne de la variable NumCatalogPurchases par rapport à la variable
Complain
Complain
0 2.436
1 2.048
Name: NumCatalogPurchases, dtype: float64
Draft
129
La moyenne de la variable NumStorePurchases par rapport à la variable Education
Education
PhD 6.058
Master 5.799
Graduation 5.706
2n Cycle 5.304
Basic 2.755
Name: NumStorePurchases, dtype: float64
Draft
130
La moyenne de la variable NumStorePurchases par rapport à la variable
Marital_Status
Marital_Status
Widow 6.275
Absurd 6.000
YOLO 6.000
Married 5.788
Divorced 5.707
Together 5.607
Single 5.519
Alone 4.000
Name: NumStorePurchases, dtype: float64
Draft
131
La moyenne de la variable NumStorePurchases par rapport à la variable
AcceptedCmp4
AcceptedCmp4
1 7.768
0 5.526
Name: NumStorePurchases, dtype: float64
Draft
132
1 8.328
0 5.520
Name: NumStorePurchases, dtype: float64
Draft
133
La moyenne de la variable NumStorePurchases par rapport à la variable
AcceptedCmp2
AcceptedCmp2
1 7.926
0 5.661
Name: NumStorePurchases, dtype: float64
Draft
134
La moyenne de la variable NumStorePurchases par rapport à la variable Response
Response
1 5.896
0 5.656
Name: NumStorePurchases, dtype: float64
Draft
135
La moyenne de la variable NumWebVisitsMonth par rapport à la variable
Marital_Status
Marital_Status
YOLO 8.000
Alone 6.333
Divorced 5.568
Married 5.462
Single 5.406
Together 5.366
Widow 4.986
Absurd 2.000
Name: NumWebVisitsMonth, dtype: float64
Draft
136
La moyenne de la variable NumWebVisitsMonth par rapport à la variable
AcceptedCmp3
AcceptedCmp3
1 5.994
0 5.378
Name: NumWebVisitsMonth, dtype: float64
Draft
137
0 5.44
1 5.20
Name: NumWebVisitsMonth, dtype: float64
Draft
138
La moyenne de la variable NumWebVisitsMonth par rapport à la variable
AcceptedCmp1
AcceptedCmp1
0 5.520
1 3.722
Name: NumWebVisitsMonth, dtype: float64
Draft
139
La moyenne de la variable NumWebVisitsMonth par rapport à la variable Complain
Complain
1 5.810
0 5.419
Name: NumWebVisitsMonth, dtype: float64
Draft
140
La moyenne de la variable Age par rapport à la variable Education
Education
PhD 58.769
Master 58.165
Graduation 55.490
2n Cycle 52.916
Basic 47.604
Name: Age, dtype: float64
141
La moyenne de la variable Age par rapport à la variable AcceptedCmp3
AcceptedCmp3
0 56.436
1 53.643
Name: Age, dtype: float64
Draft
142
1 58.606
0 56.047
Name: Age, dtype: float64
Draft
143
La moyenne de la variable Age par rapport à la variable AcceptedCmp1
AcceptedCmp1
1 57.078
0 56.185
Name: Age, dtype: float64
Draft
144
La moyenne de la variable Age par rapport à la variable Complain
Complain
1 59.905
0 56.197
Name: Age, dtype: float64
Draft
145
0.2 CLUSTERING
Il s’agit de segmenter les clients en fonction non seulement de leur revenu mais aussi des
l’historique de leur achat.
# Affichage de la courbe
plt.figure(figsize=(8, 5))
plt.plot(K_range, inertia, marker="o")
plt.xlabel("Nombre de clusters (k)")
plt.ylabel("Inertia")
plt.title("Méthode du coude pour choisir k")
plt.show()
Draft
146
[98]: # Appliquer K-Means avec le k optimal trouvé
optimal_k = 4
kmeans = KMeans(n_clusters=optimal_k, random_state=42, n_init=10)
data["Segment_Client"] = kmeans.fit_predict(clustering_scaled)
for i in ["Income", "MntWines", "MntMeatProducts", "MntFishProducts"]:
# Visualisation des segments
plt.figure(figsize=(10,5))
sns.boxplot(x="Segment_Client", y=i, data=data)
plt.title(f"Répartition du {i} par segment")
plt.show()
Draft
147
Draft
148
Resultat
• Revenu (income) :
Les outliers dans les segments 0 et 2 indiquent une certaine hétérogénéité dans les revenus
au sein de ces groupes, car quelque éléments du groupe détient un revenu très important.
Les segments 1 et 3 présentent une distribution plus cohérente, avec peu ou pas d’écarts
marqués.
Ces informations peuvent guider les décisions basées sur les revenus, comme la personnal-
isation d’offres.
• Fruits (MntFishProducts):
Le graphique met en évidence des comportements très différents entre les segments. En
effet,
Les clients du segment 3 dépensent le plus pour les produits de mer, tandis que ceux du
segment 1 dépensent généralement très peu, mais avec quelques exceptions.
• Vin (MntWines):
Les segments 0 et 1 représentent des extrêmes : dépenses très élevées en vin (segment 0)
contre dépenses très faibles (segment 1).
Les segments 2 et 3 sont modérés, avec des comportements légèrement différents en termes
d’homogénéité.
• Viande (MntMeatProducts)
Le segment 1 et 2 sont ceux qui consomment plus la viande contraire au segment 0 qui a
une consommation modérée en viande.
Draft
149
0.3 Modélisation
L’objectif principal, ici, c’est de prédire si un client acceptera ou non une offre lors de la dernière
campagne après 5 campagne.
Instancier le modèle
# Pretraitement
prepros = ColumnTransformer([
("cat", OneHotEncoder(),["Education","Marital_Status"]),
("norm", StandardScaler(), var_quanti)
], remainder='passthrough')
# Parametrage du modele
pipe_model = Pipeline([
('Preprocessing',prepros),
('model',␣
,→RandomForestClassifier(n_estimators=100,criterion='gini',max_features=int(np.
,→sqrt(features.shape[1]))))
])
[101]: Pipeline(steps=[('Preprocessing',
ColumnTransformer(remainder='passthrough',
transformers=[('cat', OneHotEncoder(),
['Education',
Draft 'Marital_Status']),
('norm', StandardScaler(),
Index(['Income', 'Kidhome',
'Teenhome', 'Recency', 'MntWines', 'MntFruits',
'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts',
150
'MntGoldProds', 'NumDealsPurchases', 'NumWebPurchases',
'NumCatalogPurchases', 'NumStorePurchases', 'NumWebVisitsMonth',␣
,→'Age'],
dtype='object'))])),
('model', RandomForestClassifier(max_features=4))])
[102]: # Prediction
y_pred = pipe_model.predict(X_test)
print(classification_report(y_test,y_pred))
df_important = pd.DataFrame(
{
"variable importante": var_importante_name,
"variable" : var_importante
}
)
df_important.sort_values(by="variable",ascending=False)
151
31 remainder__AcceptedCmp5 0.035
29 remainder__AcceptedCmp3 0.035
32 remainder__AcceptedCmp1 0.023
9 cat__Marital_Status_Single 0.017
15 norm__Teenhome 0.014
10 cat__Marital_Status_Together 0.013
4 cat__Education_PhD 0.012
8 cat__Marital_Status_Married 0.011
30 remainder__AcceptedCmp4 0.010
2 cat__Education_Graduation 0.010
14 norm__Kidhome 0.010
33 remainder__AcceptedCmp2 0.009
7 cat__Marital_Status_Divorced 0.008
3 cat__Education_Master 0.007
11 cat__Marital_Status_Widow 0.005
0 cat__Education_2n Cycle 0.004
1 cat__Education_Basic 0.002
12 cat__Marital_Status_YOLO 0.001
6 cat__Marital_Status_Alone 0.001
34 remainder__Complain 0.001
5 cat__Marital_Status_Absurd 0.000
[103]: param = {
'model__n_estimators' : [100,200,300],
'model__max_features' : [3,4,5,6,7,8],
'model__criterion': ['gini','entropy','log_loss']
}
grid.fit(X_train,y_train)
Meilleurs paramètres :
{'model__criterion': 'gini', 'model__max_features': 3, 'model__n_estimators':
100}
[104]: # Pretraitement
prepros = ColumnTransformer([
("cat", OneHotEncoder(),["Education","Marital_Status"]),
("norm", StandardScaler(), var_quanti)
], remainder='passthrough')
152
])
# Entrainement du modèle
pipe_model_opti.fit(X_train,y_train)
[104]: Pipeline(steps=[('Preprocessing',
ColumnTransformer(remainder='passthrough',
transformers=[('cat', OneHotEncoder(),
['Education',
'Marital_Status']),
('norm', StandardScaler(),
Index(['Income', 'Kidhome',
'Teenhome', 'Recency', 'MntWines', 'MntFruits',
'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts',
'MntGoldProds', 'NumDealsPurchases', 'NumWebPurchases',
'NumCatalogPurchases', 'NumStorePurchases', 'NumWebVisitsMonth',␣
,→'Age'],
dtype='object'))])),
('model', RandomForestClassifier(max_features=3))])
Draft
153
[105]: y_pred_opti = pipe_model.predict(X_test)
print(classification_report(y_test,y_pred_opti))
La matrice de confusion :
[[364 11]
[ 36 15]]
Draft
154