Etude des choix de marque dans un contexte de données de panel-Modèle MLOGIT : Cas des données YOGURT

Author

Linda AIT ELHADJ et Oumou Salamata BARRY


Introduction

Le jeu de données “Yogurt” du package Ecdat offre une analyse économétrique sur le choix de marque de yaourts aux États-Unis. Cette collection comprend 2412 observations individuelles dans une étude transversale. Chaque observation comporte diverses variables telles que l’identifiant de l’individu et le choix de la marque de yaourt parmi plusieurs options telles que Yoplait, Dannon, Hiland et Weight Watcher. Ces données, initialement analysées par Jain, Vilcassim et Chintagunta en 1994, ont été étudiées à l’aide d’un modèle logit à coefficients aléatoires pour examiner les choix de marque dans un contexte de données de panel. Elles sont précieuses pour les analyses de marché et les modèles de choix discrets, permettant d’explorer comment des facteurs tels que le prix et la publicité influencent les décisions des consommateurs.

Chargement des données

Code
# Exécute le code R avec l'option de supprimer les messages d'avertissement

data("Yogurt", package = "Ecdat")  # Charge le jeu de données "Yogurt" depuis le package "Ecdat"

premiere_ligne <- head(Yogurt, 20)  # Sélectionne les 20 premières lignes du jeu de données "Yogurt"

kable(premiere_ligne, align = "c", font_size = 11)%>%   # Convertit les données en un tableau avec une mise en forme spécifique

kable_styling(full_width = FALSE, position = "center")%>%  # Applique des styles au tableau pour le centrer sur la page

add_header_above(c("DATA Yogurt : 20 premières lignes" = 10))%>%  # Ajoute un en-tête au-dessus du tableau

row_spec(0, bold = TRUE )%>%  # Spécifie que la première ligne du tableau doit être en gras

scroll_box(width = "100%", height = "200px")  # Crée une boîte de défilement autour du tableau pour permettre le défilement
DATA Yogurt : 20 premières lignes
id feat.yoplait feat.dannon feat.hiland feat.weight price.yoplait price.dannon price.hiland price.weight choice
1 0 0 0 0 10.8 8.1 6.1 7.9 weight
1 0 0 0 0 10.8 9.8 6.4 7.5 dannon
1 0 0 0 0 10.8 9.8 6.1 8.6 dannon
1 0 0 0 0 10.8 9.8 6.1 8.6 dannon
1 0 0 0 0 12.5 9.8 4.9 7.9 dannon
1 0 0 0 0 10.8 9.2 5.0 7.9 dannon
1 0 0 0 0 10.3 8.1 4.9 7.9 dannon
1 0 0 0 0 10.8 8.6 5.4 7.9 weight
2 0 0 0 0 10.8 9.8 5.0 7.9 yoplait
2 0 0 0 0 10.8 9.8 5.0 7.9 yoplait
2 0 0 0 0 10.8 9.8 5.0 7.9 yoplait
2 0 0 0 0 10.8 9.8 5.0 7.9 yoplait
2 0 0 0 0 10.8 8.1 5.0 8.6 weight
2 0 0 0 0 10.8 8.1 5.0 8.6 weight
2 0 0 0 0 10.8 8.1 5.0 7.9 weight
2 0 0 0 0 10.8 8.1 5.0 7.9 weight
2 0 0 0 0 10.8 8.1 5.0 7.9 weight
2 0 0 0 0 10.8 8.1 5.0 7.9 weight
2 0 0 0 0 10.8 8.1 5.0 7.9 weight
2 0 0 0 0 10.8 8.1 5.0 8.1 weight

Exploration des données

Code
# Capturer les informations de structure dans une chaîne de caractères
str_info <- capture.output(str(Yogurt)) # capture.output recupère les données en sortie de str pour les mettre dans str_info

# Créer un tableau kable avec les informations de structure
kable(data.frame(Structure = str_info), align = "l", caption = "Structure des données Yogurt")%>% scroll_box(width = "100%", height = "200px")
Structure des données Yogurt
Structure
'data.frame': 2412 obs. of 10 variables:
$ id : num 1 1 1 1 1 1 1 1 2 2 ...
$ feat.yoplait : num 0 0 0 0 0 0 0 0 0 0 ...
$ feat.dannon : num 0 0 0 0 0 0 0 0 0 0 ...
$ feat.hiland : num 0 0 0 0 0 0 0 0 0 0 ...
$ feat.weight : num 0 0 0 0 0 0 0 0 0 0 ...
$ price.yoplait: num 10.8 10.8 10.8 10.8 12.5 10.8 10.3 10.8 10.8 10.8 ...
$ price.dannon : num 8.1 9.8 9.8 9.8 9.8 ...
$ price.hiland : num 6.1 6.4 6.1 6.1 4.9 ...
$ price.weight : num 7.9 7.5 8.6 8.6 7.9 ...
$ choice : Factor w/ 4 levels "yoplait","dannon",..: 4 2 2 2 2 2 2 4 1 1 ...

Préparation des données pour le modèle MLOGIT

Transformation des données en format long afin d’utiliser le modèle MLOGIT.

Code
# Transformer les données pour l'analyse mlogit
mlogit_yogurt <- mlogit.data(data = Yogurt, choice = "choice", shape = "long", varying = 2:9)

# Renommer la troisième colonne en "Brand"
names(mlogit_yogurt)[3] = c("Brand")

Analyse des données pour chaque paramètre

Market share

Bien qu’il soit essentiel de comprendre les choix individuels des familles, une analyse plus approfondie du paysage concurrentiel peut être obtenue en examinant le ‘Market share’ (part de marché) de chaque marque. Cette mesure nous permet d’évaluer la performance relative des marques en termes de popularité et de préférences des consommateurs au sein de notre échantillon.

Repartition des choix

Code
# Création de la table de fréquences
Market_share <- table(Yogurt$choice)

# Affichage du tableau avec kable
kable(Market_share, caption = "Table des effectifs des choix de yaourt")
Table des effectifs des choix de yaourt
Var1 Freq
yoplait 818
dannon 970
hiland 71
weight 553

Représentation graphique

Code
ggplot(Yogurt, aes(x = "", fill = choice)) +
  geom_bar(width = 1) +
  coord_polar(theta = "y") +
  geom_text(aes(label = paste0(round(after_stat(count)/sum(after_stat(count)) * 100), "%")), stat = "count", position = position_stack(vjust = 0.5)) +
  labs(fill = "Choice", title = "Proportion des choix de yogurt") +
  theme_void() +
  theme(legend.position = "right") 

Il ressort de cette analyse que la marque Dannon occupe la part de marché la plus importante observée dans cet échantillon.

Moyenne et ecart-type Market Share

Les moyennes et écarts-types du ‘Market share’ fournissent des indicateurs clés sur la répartition et la variabilité des parts de marché des marques de yaourt. En les examinant, nous pouvons obtenir un aperçu rapide de la tendance générale et de la dispersion des préférences des consommateurs.

Code
ms_tab <-summarise( group_by(mlogit_yogurt,Brand), mean=mean(choice), sd=sd(choice) ) 

kable(ms_tab, caption = "Yogurt data Market Share", align = "c") %>% kable_styling(full_width = FALSE) %>% row_spec(0, bold = TRUE)  # Rendre la première ligne en gras
Yogurt data Market Share
Brand mean sd
dannon 0.4021559 0.4904348
hiland 0.0294362 0.1690607
weight 0.2292703 0.4204506
yoplait 0.3391376 0.4735148

On observe dans ce tableau que Dannon a la part de marché moyenne la plus élevée, tandis que Hiland a la plus petite part de marché moyenne. Les écarts-types indiquent la variabilité des parts de marché autour de la moyenne, avec Dannon et Yoplait montrant une plus grande variabilité que Weight Watcher et Hiland.

FEATURE

La variable ‘feature’ enregistre la présence de publicités pour chaque marque de yaourt. Cette information nous permet d’explorer l’impact potentiel de la publicité sur les choix des consommateurs et sur les parts de marché des différentes marques.

Repartition des publicités par marque

Code
# Calculer les proportions pour chaque colonne
Feature <- colSums(Yogurt[, c("feat.yoplait", "feat.dannon", "feat.hiland", "feat.weight")])

# Créer un data frame avec les noms des colonnes
Feature_df <- data.frame(Feat = Feature)

# Attribuer le nom 'Effectifs' à la colonne
colnames(Feature_df) <- c("Effectifs")

# Afficher le tableau avec kable
kable(Feature_df, caption = "Table des effectifs des feat")
Table des effectifs des feat
Effectifs
feat.yoplait 135
feat.dannon 91
feat.hiland 89
feat.weight 91

Représentation graphique

Code
# Calculer les proportions pour chaque colonne
proportions <- colSums(Yogurt[, c("feat.yoplait", "feat.dannon", "feat.hiland", "feat.weight")])
 
# Créer un dataframe pour le pie chart 
data_pie <- data.frame(Feature = names(proportions), Proportion = proportions)
 
# Créer le pie chart avec les étiquettes, le titre et la légende
ggplot(data_pie, aes(x = "", y = Proportion, fill = Feature)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(round(Proportion / sum(Proportion) * 100, 1), "%")), position = position_stack(vjust = 0.5)) +
  labs(title = "Proportions des pubs par marque dans les yogourts", fill = "Caractéristique") +
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5),
        legend.position = "right")  # Positionner la légende à droite

Il ressort de cette analyse que la marque Yoplait a bénéficier de plus de publicité que les autres marques.

Moyenne et ecart-type feature

Les moyennes et écarts-types des features (publicités) pour chaque marque de yaourt nous fournissent des indications sur la fréquence et la variabilité de la publicité associée à chaque marque. Ces mesures nous aident à comprendre le niveau d’exposition des consommateurs à la publicité pour chaque marque, ce qui peut influencer leurs décisions d’achat et, par conséquent, les parts de marché des différentes marques.

Code
# Calculer les moyennes et les écarts types pour chaque marque
Feature_tab <- summarise( group_by(mlogit_yogurt,Brand), mean=mean(feat), sd=sd(feat) )

kable(Feature_tab, caption = "Yogurt data Feature", align = "c") %>% kable_styling(full_width = FALSE) %>% row_spec(0, bold = TRUE)  # Rendre la première ligne en gras
Yogurt data Feature
Brand mean sd
dannon 0.0377280 0.1905772
hiland 0.0368988 0.1885525
weight 0.0377280 0.1905772
yoplait 0.0559701 0.2299117

On observe là que la marque Yoplait a une exposition publicitaire plus élevée que les autres marques, tandis que Dannon, Hiland et Weight présentent des niveaux de publicité similaires mais plus faibles. Malgré celà la marque Dannon a été la plus choisi.

PRICE

La variable “Price” représente les prix des différents produits de yaourt. Son analyse nous éclaire sur les écarts de prix entre les marques, un aspect crucial dans les choix des consommateurs et dans la dynamique concurrentielle du marché des yaourts.

Moyenne et ecart-type Price

La mise en lumière des moyennes et écarts-types des prix des yaourts par marque révèle la diversité des tarifs sur le marché. Cette analyse éclaire les différences de positionnement tarifaire entre les marques, offrant ainsi un aperçu éclairant sur la stratégie de prix et l’attrait des produits pour les consommateurs.

Code
# Calculer les moyennes et les écarts types pour chaque marque
Price_tab <- summarise( group_by(mlogit_yogurt,Brand), mean=mean(price), sd=sd(price) )

kable(Price_tab, caption = "Yogurt data Price", align = "c") %>% kable_styling(full_width = FALSE) %>% row_spec(0, bold = TRUE)  # Rendre la première ligne en gras
Yogurt data Price
Brand mean sd
dannon 8.163474 1.0628862
hiland 5.362935 0.8053910
weight 7.949088 0.7735004
yoplait 10.682131 1.9062646

Ce tableau met en lumière les variations des prix moyens des différentes marques de yaourt. Yoplait se distingue avec le prix moyen le plus élevé, suggérant un positionnement potentiellement haut de gamme ou axé sur la qualité. En revanche, Hiland propose le prix moyen le plus bas, indiquant une stratégie plus économique ou compétitive. Les marques Dannon et Weight se positionnent entre ces deux extrêmes en termes de tarification. Les écarts-types relativement faibles suggèrent une certaine stabilité dans les prix au sein de chaque marque. Ces données fournissent des insights précieux sur la stratégie tarifaire et le positionnement sur le marché des yaourts.

Boite à mouchetache des prix des yaourt sur le marché

Suite à l’analyse des moyennes et écarts-types des prix des différentes marques de yaourt, une visualisation sous forme de boîte à moustaches (boxplot) offre une perspective visuelle sur la distribution des prix. Cette représentation graphique permet de mieux comprendre la variabilité des prix pour chaque marque, mettant en évidence les tendances centrales et les valeurs aberrantes éventuelles.

Code
# Charger les données
# Votre dataframe
df <- Yogurt
 
# Sélectionner les colonnes spécifiées
prix <- Yogurt[, c("price.yoplait", "price.dannon", "price.hiland", "price.weight")]
 
# Convertir le jeu de données en format long
Yogurt_long <- tidyr::gather(data = prix, key = "Brand", value = "Price")
 
# Créer le boxplot
ggplot(Yogurt_long, aes(x = Brand, y = Price)) +
  geom_boxplot(color = "black", 
               alpha = 0.8,
               ) + # Ajouter une bordure noir autour des boites
  labs(x = "Marque", y = "Prix", title = "Comparaison des prix des yogurt par marque") +
  theme_economist() + # Utiliser un thème minimal + 
  scale_fill_manual(values = c("blue", "#ff7f0e", "#2ca02c", "#d62728"))  # Utiliser des couleurs spécifiques pour chaque marque

La boîte à moustaches montre que la plupart des yogourts ont des prix non nuls, avec des variations importantes entre les marques. Dannon et Yoplait semblent être perçus comme plus chers que Hiland, indiquant une possible qualité supérieure ou un positionnement premium. En somme, le yogourt est globalement considéré comme un produit relativement cher.

Fusions des tableaux Market Share, Feature et Price

Dans cette section, nous présentons une analyse combinée des données de marché, des caractéristiques et des prix des yaourts. Pour ce faire, nous avons calculé les moyennes et écarts types pour chaque variable : la part de marché (Market Share), les caractéristiques (Feat) et les prix (Price). En fusionnant ces informations dans un seul tableau, nous obtenons une vue globale des tendances et variations des données. Chaque ligne de ce tableau représente une marque de yaourt, avec les moyennes et écarts types correspondants pour chaque variable. Cette approche nous permet de comparer facilement les performances des marques sur différents aspects, tout en évitant la redondance d’informations.

Code
# Créer les trois tables
ms_tab <- summarise(group_by(mlogit_yogurt, Brand), mean = mean(choice), sd = sd(choice))
feat_tab <- summarise(group_by(mlogit_yogurt, Brand), mean = mean(feat), sd = sd(feat))
price_tab <- summarise(group_by(mlogit_yogurt, Brand), mean = round(mean(price)/100, 5), sd = round(sd(price), 5))
 
# Fusionner les tables
combined_table <- bind_rows(ms_tab %>% mutate(Variable = "Market Share (proportion)"),
                            feat_tab %>% mutate(Variable = "Feature (proportion)"),
                            price_tab %>% mutate(Variable = "Price ($ per Oz)"))
 
# Réorganiser les colonnes
combined_table <- combined_table[, c("Variable", "Brand", "mean", "sd")]
 
# Remplacer les valeurs de "Variable" par des chaînes vides après la première occurrence
combined_table$Variable[duplicated(combined_table$Variable)] <- ""
 
# Afficher le tableau avec kable
kable(combined_table, caption = "Yogurt data", align = "c", digits = 5) %>%
  kable_styling(full_width = FALSE) %>%
  row_spec(0, bold = TRUE) 
Yogurt data
Variable Brand mean sd
Market Share (proportion) dannon 0.40216 0.49043
hiland 0.02944 0.16906
weight 0.22927 0.42045
yoplait 0.33914 0.47351
Feature (proportion) dannon 0.03773 0.19058
hiland 0.03690 0.18855
weight 0.03773 0.19058
yoplait 0.05597 0.22991
Price ($ per Oz) dannon 0.08163 1.06289
hiland 0.05363 0.80539
weight 0.07949 0.77350
yoplait 0.10682 1.90626

En consolidant les moyennes et écarts types des parts de marché, des caractéristiques et des prix des yaourts, nous avons pu obtenir une vision globale et comparative de ces données. Cette analyse nous a permis de mieux comprendre les tendances du marché des yaourts, ainsi que les variations dans les préférences des consommateurs. Ces informations sont essentielles pour les décideurs dans l’industrie alimentaire pour ajuster leurs stratégies de marketing et de production afin de mieux répondre aux besoins du marché.

Estimation du modele de specification

Chargement des packages necessaires


Please cite as: 
 Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
 R package version 5.2.3. https://CRAN.R-project.org/package=stargazer 

Estimation du model MNL

Le Modèle Logit Multinomial (MNL) analyse les choix discrets entre plusieurs alternatives. Il permet de comprendre comment des variables comme le prix et la publicité influencent les décisions des consommateurs, offrant des insights précieux pour les analyses de marché et les stratégies marketing.

Code
# Estimer le modèle MNL
mnl_model <- mlogit(choice ~ price + feat , reflevel='hiland',mlogit_yogurt)


# Résumé des résultats
summary(mnl_model)

Call:
mlogit(formula = choice ~ price + feat, data = mlogit_yogurt, 
    reflevel = "hiland", method = "nr")

Frequencies of alternatives:choice
  hiland   dannon   weight  yoplait 
0.029436 0.402156 0.229270 0.339138 

nr method
6 iterations, 0h:0m:0s 
g'(-H)^-1g = 0.000763 
successive function values within tolerance limits 

Coefficients :
                     Estimate Std. Error  z-value  Pr(>|z|)    
(Intercept):dannon   3.715595   0.145419  25.5510 < 2.2e-16 ***
(Intercept):weight   3.074411   0.145384  21.1468 < 2.2e-16 ***
(Intercept):yoplait  4.450166   0.187118  23.7827 < 2.2e-16 ***
price               -0.366584   0.024366 -15.0449 < 2.2e-16 ***
feat                 0.491433   0.120063   4.0931 4.256e-05 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Log-Likelihood: -2656.9
McFadden R^2:  0.062142 
Likelihood ratio test : chisq = 352.09 (p.value = < 2.22e-16)
Code
# Utiliser stargazer pour produire un beau tableau
stargazer(mnl_model, type = "text", column.labels = c("MNL"), keep.stat = c("n", "ll", "aic", "bic"), single.row = TRUE)

===============================================
                        Dependent variable:    
                    ---------------------------
                              choice           
                                MNL            
-----------------------------------------------
(Intercept):dannon       3.716*** (0.145)      
(Intercept):weight       3.074*** (0.145)      
(Intercept):yoplait      4.450*** (0.187)      
price                    -0.367*** (0.024)     
feat                     0.491*** (0.120)      
-----------------------------------------------
Observations                   2,412           
Log Likelihood              -2,656.888         
===============================================
Note:               *p<0.1; **p<0.05; ***p<0.01

Estimer le modèle MNL :Explication du code

mnl_model <- mlogit(choice ~ price + feat , reflevel=‘hiland’,mlogit_yogurt)

Dans le modèle que vous avez spécifié, vous estimez un modèle de choix discrets multinomial (MNL) en utilisant la fonction mlogit() du package mlogit. Voici ce que chaque partie de votre code signifie :

  • choice ~ price + feat: Cela spécifie le modèle MNL que vous estimez. “choice” est la variable réponse qui représente les choix discrets, tandis que “price” et “feat” sont les variables explicatives qui influencent le choix. Vous modélisez comment les prix et les caractéristiques des produits affectent les choix entre les alternatives.

  • reflevel='hiland': Cela indique que “hiland” est la référence pour la variable de choix. Cela signifie que les coefficients estimés pour les autres alternatives (par exemple, “dannon”, “weight”, “yoplait”) sont interprétés par rapport à “hiland”.

  • mlogit_yogurt: Cela spécifie que les données utilisées pour l’estimation du modèle sont contenues dans l’objet mlogit_yogurt, qui semble être un objet de données mlogit.

En résumé, ce code estime un modèle MNL pour les choix discrets en utilisant les données contenues dans l’objet mlogit_yogurt, en spécifiant “hiland” comme la référence pour la variable de choix.

Interpretation des resultats obtenus

Résultats :

(Intercept):dannon: Dannon a une forte préférence de base, statistiquement significative.

(Intercept):weight: Weight Watchers a également une forte préférence de base, mais légèrement moins que Dannon, avec une fiabilité élevée.

(Intercept):yoplait: Yoplait est la marque la plus préférée de base, avec une fiabilité élevée.

price: Le prix a un effet négatif sur le choix de la marque, avec une fiabilité élevée.

feat: La publicité a un effet positif sur le choix de la marque, avec une fiabilité élevée.

Statistiques du Modèle : Observations: 2,412 individus ont participé au choix du yaourt. Log Likelihood: Mesure de la qualité de l’ajustement du modèle.

Note sur la Significativité : Les étoiles (, , ) indiquent le niveau de fiabilité des résultats.

En conclusion : Le prix influence négativement le choix du yaourt : plus il est élevé, moins il est choisi.

La publicité a un effet positif sur le choix du yaourt : les marques qui font de la publicité sont plus souvent choisies.

Yoplait est la marque la plus préférée, suivie de Dannon et de Weight Watchers, par rapport à Hiland.

Conclusion

Notre analyse du marché des yaourts aux États-Unis nous a permis de comprendre divers aspects influençant les choix des consommateurs. Nous avons constaté que le prix et la publicité jouent un rôle significatif dans les décisions d’achat. Plus précisément, les yaourts moins chers et ceux bénéficiant de publicités ont tendance à être préférés. Cependant, les préférences de base varient également entre les marques, avec Yoplait en tête, suivie de Dannon et de Weight Watchers.

Ces conclusions offrent des perspectives précieuses pour les entreprises cherchant à optimiser leurs stratégies de marketing et de tarification. En comprenant les dynamiques du marché, les entreprises peuvent ajuster leurs produits et leurs campagnes publicitaires pour mieux répondre aux besoins et aux préférences des consommateurs, ce qui peut se traduire par une plus grande fidélité à la marque et une croissance des ventes.