| itle: “Examen M2” |
| ubtitle: “Langages de Programmation” |
| uthor: “Paco RUFAS” |
| utput: |
| html_document: |
| toc: true |
| theme: united |
| df_print: paged |
# Chargement des bibliothèques nécessaires
library(tidyverse)
library(cluster)
library(caret)
library(rmarkdown)
library(randomForest)
# Importation des données
clients <- read.csv('base_client.txt', sep = ';')
commandes <- read.csv('base_synthese_commandes.txt', sep = '\t')
# Exploration des données
summary(clients)
## id_client prenom sexe annee_naissance
## Length:2000 Length:2000 Length:2000 Min. :1949
## Class :character Class :character Class :character 1st Qu.:1968
## Mode :character Mode :character Mode :character Median :1979
## Mean :1978
## 3rd Qu.:1986
## Max. :2005
## NA's :276
## diplome etat_civil ville code_postal
## Length:2000 Length:2000 Length:2000 Min. : 1000
## Class :character Class :character Class :character 1st Qu.:33428
## Mode :character Mode :character Mode :character Median :59198
## Mean :56284
## 3rd Qu.:77533
## Max. :97660
##
## code_insee foyer_salaire foyer_nbr_enfants foyer_nbr_adolescents
## Min. : 1027 Length:2000 Min. :0.000 Min. :0.0000
## 1st Qu.:33232 Class :character 1st Qu.:0.000 1st Qu.:0.0000
## Median :59300 Mode :character Median :0.000 Median :0.0000
## Mean :56189 Mean :0.442 Mean :0.5015
## 3rd Qu.:77445 3rd Qu.:1.000 3rd Qu.:1.0000
## Max. :97611 Max. :2.000 Max. :2.0000
##
summary(commandes)
## id_client date_inscription recence montant_fruit
## Length:2000 Length:2000 Min. : 0.00 Min. : 0.00
## Class :character Class :character 1st Qu.:24.00 1st Qu.: 2.00
## Mode :character Mode :character Median :49.00 Median : 8.00
## Mean :48.75 Mean : 26.49
## 3rd Qu.:74.00 3rd Qu.: 33.00
## Max. :99.00 Max. :199.00
## montant_poisson montant_sucrerie montant_viande montant_vin
## Min. : 0.00 Min. : 0.00 Min. : 0.0 Min. : 0.0
## 1st Qu.: 3.00 1st Qu.: 1.00 1st Qu.: 16.0 1st Qu.: 23.0
## Median : 12.00 Median : 8.00 Median : 67.5 Median : 176.5
## Mean : 37.65 Mean : 26.73 Mean : 168.9 Mean : 304.7
## 3rd Qu.: 50.00 3rd Qu.: 32.00 3rd Qu.: 238.2 3rd Qu.: 505.0
## Max. :259.00 Max. :263.00 Max. :1725.0 Max. :1493.0
## nbr_achats_promo nbr_achats_catalogue nbr_achats_magasin nbr_achats_site
## Min. : 0.000 Min. : 0.000 Min. : 0.00 Min. : 0.000
## 1st Qu.: 1.000 1st Qu.: 0.000 1st Qu.: 3.00 1st Qu.: 2.000
## Median : 2.000 Median : 2.000 Median : 5.00 Median : 4.000
## Mean : 2.317 Mean : 2.694 Mean : 5.82 Mean : 4.072
## 3rd Qu.: 3.000 3rd Qu.: 4.000 3rd Qu.: 8.00 3rd Qu.: 6.000
## Max. :15.000 Max. :28.000 Max. :13.00 Max. :27.000
## nbr_visites_site_dernier_mois top_campagne_1_succes top_campagne_2_succes
## Min. : 0.00 Min. :0.00 Min. :0.000
## 1st Qu.: 3.00 1st Qu.:0.00 1st Qu.:0.000
## Median : 6.00 Median :0.00 Median :0.000
## Mean : 5.27 Mean :0.06 Mean :0.013
## 3rd Qu.: 7.00 3rd Qu.:0.00 3rd Qu.:0.000
## Max. :20.00 Max. :1.00 Max. :1.000
## top_campagne_3_succes top_campagne_4_succes top_campagne_5_succes
## Min. :0.0000 Min. :0.0000 Min. :0.00
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.00
## Median :0.0000 Median :0.0000 Median :0.00
## Mean :0.0725 Mean :0.0735 Mean :0.07
## 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:0.00
## Max. :1.0000 Max. :1.0000 Max. :1.00
## top_campagne_test_succes top_plainte
## Min. :0.000 Min. :0.0000
## 1st Qu.:0.000 1st Qu.:0.0000
## Median :0.000 Median :0.0000
## Mean :0.151 Mean :0.0095
## 3rd Qu.:0.000 3rd Qu.:0.0000
## Max. :1.000 Max. :1.0000
# Visualisation de la distribution de l'âge des clients
clients <- clients %>%
mutate(age = 2024 - annee_naissance)
ggplot(clients, aes(x = age)) +
geom_histogram(binwidth = 5, fill = 'blue', color = 'white') +
labs(title = "Distribution de l'âge des clients", x = "Âge", y = "Nombre de clients")
## Warning: Removed 276 rows containing non-finite values (`stat_bin()`).
On constate que la mojorité des ckients sont situé entre 30 et 50
ans
clients$foyer_salaire <- as.numeric(gsub(",", ".", clients$foyer_salaire))
summary(clients)
## id_client prenom sexe annee_naissance
## Length:2000 Length:2000 Length:2000 Min. :1949
## Class :character Class :character Class :character 1st Qu.:1968
## Mode :character Mode :character Mode :character Median :1979
## Mean :1978
## 3rd Qu.:1986
## Max. :2005
## NA's :276
## diplome etat_civil ville code_postal
## Length:2000 Length:2000 Length:2000 Min. : 1000
## Class :character Class :character Class :character 1st Qu.:33428
## Mode :character Mode :character Mode :character Median :59198
## Mean :56284
## 3rd Qu.:77533
## Max. :97660
##
## code_insee foyer_salaire foyer_nbr_enfants foyer_nbr_adolescents
## Min. : 1027 Min. : 3626 Min. :0.000 Min. :0.0000
## 1st Qu.:33232 1st Qu.: 36765 1st Qu.:0.000 1st Qu.:0.0000
## Median :59300 Median : 54076 Median :0.000 Median :0.0000
## Mean :56189 Mean : 54217 Mean :0.442 Mean :0.5015
## 3rd Qu.:77445 3rd Qu.: 70144 3rd Qu.:1.000 3rd Qu.:1.0000
## Max. :97611 Max. :666799 Max. :2.000 Max. :2.0000
## NA's :329
## age
## Min. :19.00
## 1st Qu.:38.00
## Median :45.00
## Mean :46.01
## 3rd Qu.:56.00
## Max. :75.00
## NA's :276
# Imputation des valeurs manquantes pour les clients
clients <- clients %>%
mutate(
annee_naissance = ifelse(is.na(annee_naissance), median(annee_naissance, na.rm = TRUE), annee_naissance),
foyer_salaire = ifelse(is.na(foyer_salaire), median(as.numeric(foyer_salaire), na.rm = FALSE), as.numeric(foyer_salaire)),
foyer_nbr_enfants = ifelse(is.na(foyer_nbr_enfants), 0, foyer_nbr_enfants),
foyer_nbr_adolescents = ifelse(is.na(foyer_nbr_adolescents), 0, foyer_nbr_adolescents)
)
# Imputation des valeurs manquantes pour les commandes
commandes <- commandes %>%
mutate(
recence = ifelse(is.na(recence), median(recence, na.rm = TRUE), recence),
montant_fruit = ifelse(is.na(montant_fruit), 0, montant_fruit),
montant_poisson = ifelse(is.na(montant_poisson), 0, montant_poisson),
montant_sucrerie = ifelse(is.na(montant_sucrerie), 0, montant_sucrerie),
montant_viande = ifelse(is.na(montant_viande), 0, montant_viande),
montant_vin = ifelse(is.na(montant_vin), 0, montant_vin)
)
# Jointure des données
data <- left_join(clients, commandes, by = "id_client")
# Vérifier les valeurs manquantes
summary(data)
## id_client prenom sexe annee_naissance
## Length:2000 Length:2000 Length:2000 Min. :1949
## Class :character Class :character Class :character 1st Qu.:1971
## Mode :character Mode :character Mode :character Median :1979
## Mean :1978
## 3rd Qu.:1985
## Max. :2005
##
## diplome etat_civil ville code_postal
## Length:2000 Length:2000 Length:2000 Min. : 1000
## Class :character Class :character Class :character 1st Qu.:33428
## Mode :character Mode :character Mode :character Median :59198
## Mean :56284
## 3rd Qu.:77533
## Max. :97660
##
## code_insee foyer_salaire foyer_nbr_enfants foyer_nbr_adolescents
## Min. : 1027 Min. : 3626 Min. :0.000 Min. :0.0000
## 1st Qu.:33232 1st Qu.: 36765 1st Qu.:0.000 1st Qu.:0.0000
## Median :59300 Median : 54076 Median :0.000 Median :0.0000
## Mean :56189 Mean : 54217 Mean :0.442 Mean :0.5015
## 3rd Qu.:77445 3rd Qu.: 70144 3rd Qu.:1.000 3rd Qu.:1.0000
## Max. :97611 Max. :666799 Max. :2.000 Max. :2.0000
## NA's :329
## age date_inscription recence montant_fruit
## Min. :19.00 Length:2000 Min. : 0.00 Min. : 0.00
## 1st Qu.:38.00 Class :character 1st Qu.:24.00 1st Qu.: 2.00
## Median :45.00 Mode :character Median :49.00 Median : 8.00
## Mean :46.01 Mean :48.75 Mean : 26.49
## 3rd Qu.:56.00 3rd Qu.:74.00 3rd Qu.: 33.00
## Max. :75.00 Max. :99.00 Max. :199.00
## NA's :276
## montant_poisson montant_sucrerie montant_viande montant_vin
## Min. : 0.00 Min. : 0.00 Min. : 0.0 Min. : 0.0
## 1st Qu.: 3.00 1st Qu.: 1.00 1st Qu.: 16.0 1st Qu.: 23.0
## Median : 12.00 Median : 8.00 Median : 67.5 Median : 176.5
## Mean : 37.65 Mean : 26.73 Mean : 168.9 Mean : 304.7
## 3rd Qu.: 50.00 3rd Qu.: 32.00 3rd Qu.: 238.2 3rd Qu.: 505.0
## Max. :259.00 Max. :263.00 Max. :1725.0 Max. :1493.0
##
## nbr_achats_promo nbr_achats_catalogue nbr_achats_magasin nbr_achats_site
## Min. : 0.000 Min. : 0.000 Min. : 0.00 Min. : 0.000
## 1st Qu.: 1.000 1st Qu.: 0.000 1st Qu.: 3.00 1st Qu.: 2.000
## Median : 2.000 Median : 2.000 Median : 5.00 Median : 4.000
## Mean : 2.317 Mean : 2.694 Mean : 5.82 Mean : 4.072
## 3rd Qu.: 3.000 3rd Qu.: 4.000 3rd Qu.: 8.00 3rd Qu.: 6.000
## Max. :15.000 Max. :28.000 Max. :13.00 Max. :27.000
##
## nbr_visites_site_dernier_mois top_campagne_1_succes top_campagne_2_succes
## Min. : 0.00 Min. :0.00 Min. :0.000
## 1st Qu.: 3.00 1st Qu.:0.00 1st Qu.:0.000
## Median : 6.00 Median :0.00 Median :0.000
## Mean : 5.27 Mean :0.06 Mean :0.013
## 3rd Qu.: 7.00 3rd Qu.:0.00 3rd Qu.:0.000
## Max. :20.00 Max. :1.00 Max. :1.000
##
## top_campagne_3_succes top_campagne_4_succes top_campagne_5_succes
## Min. :0.0000 Min. :0.0000 Min. :0.00
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.00
## Median :0.0000 Median :0.0000 Median :0.00
## Mean :0.0725 Mean :0.0735 Mean :0.07
## 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:0.00
## Max. :1.0000 Max. :1.0000 Max. :1.00
##
## top_campagne_test_succes top_plainte
## Min. :0.000 Min. :0.0000
## 1st Qu.:0.000 1st Qu.:0.0000
## Median :0.000 Median :0.0000
## Mean :0.151 Mean :0.0095
## 3rd Qu.:0.000 3rd Qu.:0.0000
## Max. :1.000 Max. :1.0000
##
# Vérifier les valeurs infinies et manquantes avant la standardisation
data <- data %>%
mutate(across(where(is.numeric), ~ifelse(is.infinite(.), NA, .))) %>%
mutate(across(where(is.numeric), ~ifelse(is.na(.), median(., na.rm = TRUE), .)))
# Standardisation des variables numériques
data_scaled <- data %>%
select(where(is.numeric)) %>%
scale() %>%
as.data.frame()
# Vérifier les valeurs infinies et manquantes après la standardisation
data_scaled <- data_scaled %>%
mutate(across(everything(), ~ifelse(is.infinite(.), NA, .))) %>%
mutate(across(everything(), ~ifelse(is.na(.), median(., na.rm = TRUE), .)))
# Vérification finale des valeurs NA/NaN/Inf
summary(data_scaled)
## annee_naissance code_postal code_insee foyer_salaire
## Min. :-2.66400 Min. :-2.0953 Min. :-2.0901 Min. :-2.044715
## 1st Qu.:-0.67505 1st Qu.:-0.8663 1st Qu.:-0.8699 1st Qu.:-0.580143
## Median : 0.07938 Median : 0.1104 Median : 0.1179 Median :-0.004775
## Mean : 0.00000 Mean : 0.0000 Mean : 0.0000 Mean : 0.000000
## 3rd Qu.: 0.62805 3rd Qu.: 0.8054 3rd Qu.: 0.8054 3rd Qu.: 0.510051
## Max. : 2.45697 Max. : 1.5682 Max. : 1.5695 Max. :24.770599
## foyer_nbr_enfants foyer_nbr_adolescents age recence
## Min. :-0.8197 Min. :-0.9247 Min. :-2.45697 Min. :-1.691875
## 1st Qu.:-0.8197 1st Qu.:-0.9247 1st Qu.:-0.62805 1st Qu.:-0.858892
## Median :-0.8197 Median :-0.9247 Median :-0.07938 Median : 0.008798
## Mean : 0.0000 Mean : 0.0000 Mean : 0.00000 Mean : 0.000000
## 3rd Qu.: 1.0348 3rd Qu.: 0.9191 3rd Qu.: 0.67505 3rd Qu.: 0.876489
## Max. : 2.8892 Max. : 2.7630 Max. : 2.66400 Max. : 1.744179
## montant_fruit montant_poisson montant_sucrerie montant_viande
## Min. :-0.6654 Min. :-0.6890 Min. :-0.6545 Min. :-0.7409
## 1st Qu.:-0.6152 1st Qu.:-0.6341 1st Qu.:-0.6300 1st Qu.:-0.6707
## Median :-0.4644 Median :-0.4693 Median :-0.4586 Median :-0.4448
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.1636 3rd Qu.: 0.2261 3rd Qu.: 0.1292 3rd Qu.: 0.3041
## Max. : 4.3338 Max. : 4.0510 Max. : 5.7863 Max. : 6.8251
## montant_vin nbr_achats_promo nbr_achats_catalogue nbr_achats_magasin
## Min. :-0.9052 Min. :-1.2049 Min. :-0.9109 Min. :-1.7787
## 1st Qu.:-0.8369 1st Qu.:-0.6850 1st Qu.:-0.9109 1st Qu.:-0.8619
## Median :-0.3808 Median :-0.1651 Median :-0.2347 Median :-0.2506
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.5952 3rd Qu.: 0.3548 3rd Qu.: 0.4416 3rd Qu.: 0.6663
## Max. : 3.5305 Max. : 6.5937 Max. : 8.5566 Max. : 2.1944
## nbr_achats_site nbr_visites_site_dernier_mois top_campagne_1_succes
## Min. :-1.4717 Min. :-2.1968 Min. :-0.2526
## 1st Qu.:-0.7490 1st Qu.:-0.9462 1st Qu.:-0.2526
## Median :-0.0262 Median : 0.3043 Median :-0.2526
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.6966 3rd Qu.: 0.7211 3rd Qu.:-0.2526
## Max. : 8.2856 Max. : 6.1402 Max. : 3.9571
## top_campagne_2_succes top_campagne_3_succes top_campagne_4_succes
## Min. :-0.1147 Min. :-0.2795 Min. :-0.2816
## 1st Qu.:-0.1147 1st Qu.:-0.2795 1st Qu.:-0.2816
## Median :-0.1147 Median :-0.2795 Median :-0.2816
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.:-0.1147 3rd Qu.:-0.2795 3rd Qu.:-0.2816
## Max. : 8.7112 Max. : 3.5759 Max. : 3.5495
## top_campagne_5_succes top_campagne_test_succes top_plainte
## Min. :-0.2743 Min. :-0.4216 Min. :-0.09791
## 1st Qu.:-0.2743 1st Qu.:-0.4216 1st Qu.:-0.09791
## Median :-0.2743 Median :-0.4216 Median :-0.09791
## Mean : 0.0000 Mean : 0.0000 Mean : 0.00000
## 3rd Qu.:-0.2743 3rd Qu.:-0.4216 3rd Qu.:-0.09791
## Max. : 3.6440 Max. : 2.3706 Max. :10.20838
# Exécution du clustering K-means
set.seed(123)
kmeans_result <- kmeans(data_scaled, centers = 3, nstart = 25)
# Ajout des clusters aux données d'origine
data <- data %>%
mutate(cluster = as.factor(kmeans_result$cluster))
# Affichage des résultats
table(data$cluster)
##
## 1 2 3
## 899 600 501
data <- left_join(clients, commandes, by = "id_client")
data <- data %>%
select(-prenom, -ville, -code_postal, -code_insee)
# Séparation des données en ensembles d'entraînement et de test
set.seed(123)
trainIndex <- createDataPartition(data$top_campagne_test_succes, p = .8, list = FALSE, times = 1)
trainData <- data[ trainIndex,]
testData <- data[-trainIndex,]
library(dplyr)
# Filtrer les données pour exclure les lignes avec NA dans top_campagne_test_succes
data <- data %>%
filter(!is.na(top_campagne_test_succes))
# Vérification après filtration
summary(data)
## id_client sexe annee_naissance diplome
## Length:2000 Length:2000 Min. :1949 Length:2000
## Class :character Class :character 1st Qu.:1971 Class :character
## Mode :character Mode :character Median :1979 Mode :character
## Mean :1978
## 3rd Qu.:1985
## Max. :2005
##
## etat_civil foyer_salaire foyer_nbr_enfants foyer_nbr_adolescents
## Length:2000 Min. : 3626 Min. :0.000 Min. :0.0000
## Class :character 1st Qu.: 36765 1st Qu.:0.000 1st Qu.:0.0000
## Mode :character Median : 54076 Median :0.000 Median :0.0000
## Mean : 54217 Mean :0.442 Mean :0.5015
## 3rd Qu.: 70144 3rd Qu.:1.000 3rd Qu.:1.0000
## Max. :666799 Max. :2.000 Max. :2.0000
## NA's :329
## age date_inscription recence montant_fruit
## Min. :19.00 Length:2000 Min. : 0.00 Min. : 0.00
## 1st Qu.:38.00 Class :character 1st Qu.:24.00 1st Qu.: 2.00
## Median :45.00 Mode :character Median :49.00 Median : 8.00
## Mean :46.01 Mean :48.75 Mean : 26.49
## 3rd Qu.:56.00 3rd Qu.:74.00 3rd Qu.: 33.00
## Max. :75.00 Max. :99.00 Max. :199.00
## NA's :276
## montant_poisson montant_sucrerie montant_viande montant_vin
## Min. : 0.00 Min. : 0.00 Min. : 0.0 Min. : 0.0
## 1st Qu.: 3.00 1st Qu.: 1.00 1st Qu.: 16.0 1st Qu.: 23.0
## Median : 12.00 Median : 8.00 Median : 67.5 Median : 176.5
## Mean : 37.65 Mean : 26.73 Mean : 168.9 Mean : 304.7
## 3rd Qu.: 50.00 3rd Qu.: 32.00 3rd Qu.: 238.2 3rd Qu.: 505.0
## Max. :259.00 Max. :263.00 Max. :1725.0 Max. :1493.0
##
## nbr_achats_promo nbr_achats_catalogue nbr_achats_magasin nbr_achats_site
## Min. : 0.000 Min. : 0.000 Min. : 0.00 Min. : 0.000
## 1st Qu.: 1.000 1st Qu.: 0.000 1st Qu.: 3.00 1st Qu.: 2.000
## Median : 2.000 Median : 2.000 Median : 5.00 Median : 4.000
## Mean : 2.317 Mean : 2.694 Mean : 5.82 Mean : 4.072
## 3rd Qu.: 3.000 3rd Qu.: 4.000 3rd Qu.: 8.00 3rd Qu.: 6.000
## Max. :15.000 Max. :28.000 Max. :13.00 Max. :27.000
##
## nbr_visites_site_dernier_mois top_campagne_1_succes top_campagne_2_succes
## Min. : 0.00 Min. :0.00 Min. :0.000
## 1st Qu.: 3.00 1st Qu.:0.00 1st Qu.:0.000
## Median : 6.00 Median :0.00 Median :0.000
## Mean : 5.27 Mean :0.06 Mean :0.013
## 3rd Qu.: 7.00 3rd Qu.:0.00 3rd Qu.:0.000
## Max. :20.00 Max. :1.00 Max. :1.000
##
## top_campagne_3_succes top_campagne_4_succes top_campagne_5_succes
## Min. :0.0000 Min. :0.0000 Min. :0.00
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.00
## Median :0.0000 Median :0.0000 Median :0.00
## Mean :0.0725 Mean :0.0735 Mean :0.07
## 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:0.00
## Max. :1.0000 Max. :1.0000 Max. :1.00
##
## top_campagne_test_succes top_plainte
## Min. :0.000 Min. :0.0000
## 1st Qu.:0.000 1st Qu.:0.0000
## Median :0.000 Median :0.0000
## Mean :0.151 Mean :0.0095
## 3rd Qu.:0.000 3rd Qu.:0.0000
## Max. :1.000 Max. :1.0000
##
# Graphiques exploratoires
# Par exemple, un graphique en barres pour le sexe des clients
ggplot(clients, aes(x = sexe)) +
geom_bar(fill = "steelblue") +
labs(title = "Répartition des clients par sexe")
# Un scatter plot pour visualiser la relation entre l'âge et le montant dépensé en vin
ggplot(data_scaled, aes(x = age, y = montant_vin)) +
geom_point(color = "darkgreen", alpha = 0.6) +
labs(title = "Relation entre l'âge et le montant dépensé en vin")
On dénombre ainsi plus de client homme et on constate que les montants
les plus élevé tendent a se rapprocher de l’age moyen
# Sélection des variables pertinentes
variables <- c("age", "foyer_salaire", "foyer_nbr_enfants", "montant_fruit", "montant_viande")
# Fusion des données
merged_data <- merge(clients, commandes, by = "id_client")
# Modèle de régression linéaire
model <- lm(top_campagne_test_succes ~ age + foyer_salaire + foyer_nbr_enfants + montant_fruit + montant_viande, data = merged_data)
# Résumé du modèle
summary(model)
##
## Call:
## lm(formula = top_campagne_test_succes ~ age + foyer_salaire +
## foyer_nbr_enfants + montant_fruit + montant_viande, data = merged_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.70529 -0.14426 -0.10125 -0.08464 0.92402
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.728e-02 4.618e-02 1.890 0.059 .
## age -2.700e-04 8.109e-04 -0.333 0.739
## foyer_salaire -8.854e-08 4.057e-07 -0.218 0.827
## foyer_nbr_enfants 1.911e-02 2.019e-02 0.946 0.344
## montant_fruit 1.771e-04 2.713e-04 0.653 0.514
## montant_viande 3.723e-04 5.492e-05 6.778 1.77e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3455 on 1438 degrees of freedom
## (556 observations effacées parce que manquantes)
## Multiple R-squared: 0.05487, Adjusted R-squared: 0.05159
## F-statistic: 16.7 on 5 and 1438 DF, p-value: 4.617e-16
# Exemple de prédiction pour de nouvelles données
new_data <- data.frame(age = 40, foyer_salaire = 50000, foyer_nbr_enfants = 2, montant_fruit = 30, montant_viande = 150)
prediction <- predict(model, newdata = new_data, type = "response")
cat("Probabilité prédite de succès de la campagne :", prediction, "\n")
## Probabilité prédite de succès de la campagne : 0.1714216
afin d’améliorer le succès de cette campagne il pourrait etre pertinant d’affiner nos offres selon la ségmentation de la clientèle :
# Application de l'algorithme de k-means pour créer 3 clusters
set.seed(123) # pour la reproductibilité
kmeans_result <- kmeans(data_scaled, centers = 3, nstart = 25)
# Assignation des clusters aux données
merged_data$cluster <- as.factor(kmeans_result$cluster)
# Vérification du résultat du clustering
table(merged_data$cluster)
##
## 1 2 3
## 899 600 501
# Exemple de personnalisation des offres pour un segment spécifique (par exemple, cluster 1)
cluster_1 <- merged_data %>% filter(cluster == 1)
# Analyse des préférences d'achat
summary(cluster_1$montant_viande)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 8.00 15.00 24.99 28.00 235.00
summary(cluster_1$montant_fruit)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.500 2.000 5.489 6.000 90.000
# Analyse de l'utilisation des canaux de communication par segment
ggplot(merged_data, aes(x = cluster, fill = sexe)) +
geom_bar(position = "fill") +
labs(title = "Utilisation des canaux de communication par segment")
Le model nous permetant de tester les probabilité avec differents
critère, il est pertinant de chosir ces critères selon les
caractèritiques du cluster :
# Exemple de prédiction pour de nouvelles données
new_data <- data.frame(age = 30, foyer_salaire = 600000, foyer_nbr_enfants = 3, montant_fruit = 250, montant_viande = 250)
prediction <- predict(model, newdata = new_data, type = "response")
cat("Probabilité prédite de succès de la campagne :", prediction, "\n")
## Probabilité prédite de succès de la campagne : 0.2207308
# Visualisation des clusters
ggplot(merged_data, aes(x = annee_naissance, y = foyer_salaire, color = factor(cluster))) +
geom_point(size = 3) +
labs(x = "Année de naissance", y = "Revenu du foyer", color = "Cluster") +
theme_minimal()
## Warning: Removed 329 rows containing missing values (`geom_point()`).