Chaque jour, nous devons opérer des choix. Choisir si on prend la voiture ou le train pour aller au boulot ; Choix du restaurant dans lequel on va dîner ; Choix de voter pour tel candidat ; etc. La vie est un choix dit-on ! Mais nous devons faire les “bons” choix ou tout au moins des choix éclairés. Si cela est vrai pour des particuliers, ça l’est davantage pour une entreprise. Heureusement, grâce à la multitude de données existantes et aux outils de Data Science, une entreprise peut prendre des décisions éclairées c’est-à-dire basées sur les informations tirées sur l’analyse exploratoire et la modélisation de ces données.
Dans ce document, je montre comment construire un modèle de prédiction de la part de marché d’une entreprise de l’automobile sur la base des caractéristiques de ces voitures. Un tel modèle permettra à l’entreprise de choisir en amont (c’est-à-dire avant fabrication) les caractéristiques de ces voitures qui lui assureront une très bonne part de marché.
Les données utilisées dans le cadre de cette étude sont des données de choix. Elles ont une structure particulière qu’il faut garder à l’esprit.
#Importation des données
cars <- read.csv("sportscar_choice_long.csv")
#Structure des données
str(cars)
## 'data.frame': 6000 obs. of 9 variables:
## $ resp_id: int 1 1 1 1 1 1 1 1 1 1 ...
## $ ques : int 1 1 1 2 2 2 3 3 3 4 ...
## $ alt : int 1 2 3 1 2 3 1 2 3 1 ...
## $ segment: Factor w/ 3 levels "basic","fun",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ seat : int 2 5 5 5 2 4 5 4 4 2 ...
## $ trans : Factor w/ 2 levels "auto","manual": 2 1 1 2 2 1 1 1 2 2 ...
## $ convert: Factor w/ 2 levels "no","yes": 2 1 1 1 1 1 2 2 1 2 ...
## $ price : int 35 40 30 35 30 35 35 30 40 30 ...
## $ choice : int 0 0 1 0 1 0 1 0 0 0 ...
head(cars, n = 10)
## resp_id ques alt segment seat trans convert price choice
## 1 1 1 1 basic 2 manual yes 35 0
## 2 1 1 2 basic 5 auto no 40 0
## 3 1 1 3 basic 5 auto no 30 1
## 4 1 2 1 basic 5 manual no 35 0
## 5 1 2 2 basic 2 manual no 30 1
## 6 1 2 3 basic 4 auto no 35 0
## 7 1 3 1 basic 5 auto yes 35 1
## 8 1 3 2 basic 4 auto yes 30 0
## 9 1 3 3 basic 4 manual no 40 0
## 10 1 4 1 basic 2 manual yes 30 0
#Y a t-il de onnées manquantes ?
sum(is.na(cars))
## [1] 0
Le jeu de données, qui ne contient pas de données manquantes, décrit les choix de différentes voitures de sport qui ont ont 5 caractériques :
segment : C’est la catégorie de la voiture. Elle peut être basique (basic) ou pour pilotes professionnel (racer) ou pour juste le fun (fun) ;
seat : nombre de sièges (2, 4 ou 5 sièges) ;
trans : transmission manuelle (manual) ou automatique (auto) ;
convert : toit ouvrant (yes) ou pas (no) ;
price : le prix de la voiture en milliers de dollars.
Il y a trois lignes pou chaque question ( variable ques) et chaque question a trois réponses (alternatives) possibles (variable alt). Lorsque le choix (variable choice) est égal à 1 cela veut dire que le client a afit le choix de cette option et 0 dans le cas contraire. Par exemple, regardons la troisième ligne. Le client a choisi une voiture basique, à 5 sièges, à transmissio, automatique, avec un toit non convertibe pour un prix de 30000$.
Avant de passer à la modélisation du choix, il est utile d’avoir une idée de ce que les gens choisissent en fonction de chaque attribut de produit. La meilleure façon de le faire est de compter combien de fois une voiture avec une caractéristique particulière est choisie.
#Visualisation de la fréquence des choix
for (i in 4 : 8) {
barplot(xtabs(cars$choice ~ cars[ ,i]), main = toString(names(cars)[i]))
}
Voici les informations que nous pouvons tirer de ces graphiques :
Les clients achètent plus de voitures basiques que de voitures d’autres catégories. Les voitures de course sont les moins choisies ce qui se comprend car ce type de voitures est réservé à un public de pilotes professionnels ;
Les voitures à 5 sièges sont les plus choisies ;
Les voitures de sport à transmission automatique sont choisies plus souvent que celles à transmission manuelle, ce qui n’est pas étonnant car les automatiques sont plus faciles à conduire ;
Les clients préfèrent plus les voitures à toit convertible ;
Les clients choisissent plus souvent les voitures moins chères (celles à 30000$).
Ces informations qui découlent de l’analyse exploratoire des données sont en soi déjà très précieuses et utiles pour ce constructeur automobile. Passons à présent à la modélisation du choix pour prédire les parts de marché.
Il s’agit ici d’un problème de régression logistique multinomiale qui est une extension de la régression logistique.
#Modèle du choix
choiceModel_full <- glm(choice ~ segment + seat + trans + convert + price, family = binomial(logit), data = cars)
summary(choiceModel_full)
##
## Call:
## glm(formula = choice ~ segment + seat + trans + convert + price,
## family = binomial(logit), data = cars)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.5598 -0.8494 -0.5801 0.9819 2.2969
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 5.2028351 0.2815867 18.477 < 2e-16 ***
## segmentfun -0.0003472 0.0695075 -0.005 0.996014
## segmentracer -0.0035238 0.0989439 -0.036 0.971590
## seat 0.1287122 0.0240359 5.355 8.56e-08 ***
## transmanual -1.1155302 0.0607748 -18.355 < 2e-16 ***
## convertyes 0.1972767 0.0594281 3.320 0.000902 ***
## price -0.1726207 0.0076652 -22.520 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 7638.2 on 5999 degrees of freedom
## Residual deviance: 6711.3 on 5993 degrees of freedom
## AIC: 6725.3
##
## Number of Fisher Scoring iterations: 4
On remarque que la variable segment n’est pas statistiquement significative. Au lieu de l’enlever manuellement, nous allons passer le modèle dans la fonction stepAIC() qui va choisir automatiquement les variables. En effet, lors de la construction d’un modèle, vous devez déterminer les variables à inclure. Un outil utile est la fonction stepAIC () du package MASS. Un modèle complet est comparé de manière itérative à plusieurs autres modèles, de sorte que les variables sont supprimées et ajoutées en fonction de leur signification statistique. Le processus se poursuit tant que la valeur AIC diminue et s’arrête lorsqu’un minimum est atteint. À la fin de ce processus, vous verrez un modèle avec moins de variables explicatives et une valeur AIC supérieure.
#Spécification du modèle
choiceModel <- stepAIC(choiceModel_full, trace = 0, steps = 2000)
summary(choiceModel)
##
## Call:
## glm(formula = choice ~ seat + trans + convert + price, family = binomial(logit),
## data = cars)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.5596 -0.8492 -0.5800 0.9821 2.2956
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 5.202387 0.280572 18.542 < 2e-16 ***
## seat 0.128717 0.024033 5.356 8.52e-08 ***
## transmanual -1.115504 0.060770 -18.356 < 2e-16 ***
## convertyes 0.197295 0.059426 3.320 9e-04 ***
## price -0.172622 0.007665 -22.521 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 7638.2 on 5999 degrees of freedom
## Residual deviance: 6711.3 on 5995 degrees of freedom
## AIC: 6721.3
##
## Number of Fisher Scoring iterations: 4
#Formule du modèle
formule <- as.formula(summary(choiceModel)$call)
formule
## choice ~ seat + trans + convert + price
Comme on pouvait s’en douter, la variable segment a été retirée et à présent, toutes les variables sont statisquement significatives dans le modèle. La fonction stepAIC est très intéressante surtout lorsqu’on a un jeu de données avec un très grand nombre de variables. Il existe d’autres manières plus ou moins complexes come l’Analyse en Composantes Principales (ACP) pour réduire la dimensionnalité d’un ensemble de données.
#Récupération des odds ratio
coefs <- tidy(choiceModel, conf.int = TRUE, exponentiate = TRUE)
coefs
## # A tibble: 5 x 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 182. 0.281 18.5 9.45e- 77 105. 316.
## 2 seat 1.14 0.0240 5.36 8.52e- 8 1.09 1.19
## 3 transmanual 0.328 0.0608 -18.4 2.95e- 75 0.291 0.369
## 4 convertyes 1.22 0.0594 3.32 9.00e- 4 1.08 1.37
## 5 price 0.841 0.00767 -22.5 2.60e-112 0.829 0.854
#Représentation graphique des différents rapports de côte
ggplot(coefs, aes(x = estimate, y = term, xmin = conf.low, xmax = conf.high)) +
geom_vline(xintercept = 1) +
geom_errorbarh() +
geom_point() +
scale_x_log10() +
theme_minimal()
Les coefficients du modèle nous renseignent sur l’opportunité des caractéristiques des alternatives. Par exemple, le paramètre pour convertyes nous indique combien de personnes préfèrent un toit convertible à un toit non convertible (la modalité de de base, qui est convertno). Rappelons que pour une variable factorielle, R prend comme modalité de référence la modalité qui vient en premier alphabétiquement parlant.
L’Odd Ratio de convertyes est positif, ce qui indique que les voitures avec un toit ouvrant sont plus souhaitables en moyenne que celles sans toit ouvrant. Mais le coefficient est supérieur à 1 (1,22), donc une voiture avec toit ouvrant influe fortement sur le choix d’un client qu’une voiture sans toit ouvrant.
Le modèle construit peut être utilisé pour prédire les parts de marché d’un nouvel ensemble de voitures. Par exemple, supposons que vous aimeriez concevoir une voiture de sport et que vous savez que vous aurez trois concurrents majeurs. Vous pouvez utiliser un modèle de choix pour faire une prédiction sur la probabilité que les gens choisissent votre voiture par rapport à ceux des concurents.
Ici, nous supposons que vous voulez construire une voiture à 2 sièges, à transmission manuelle, à toit non convertible et dont le prix est de 35000$. De plus, vous connaissez les caractéristiques du modèle principal de voiture de chacun de vos trois concurents. Avant de vous lancer dans la fabrication de votre modèle, faites d’abord la simulation pour connaître la part de marché que vous aurez.
#Nouvel ensemble de voitures
newsCars <- data.frame(
seat = c(2, 2, 2, 2),
trans = c("manual", "manual", "auto", "auto"),
convert = c("no", "yes", "no", "yes"),
price = c(35, 35, 35, 35)
)
newsCars
## seat trans convert price
## 1 2 manual no 35
## 2 2 manual yes 35
## 3 2 auto no 35
## 4 2 auto yes 35
#Prediction des parts de marché des nouvelles voitures
shares1 <- predict(choiceModel, newdata = newsCars, type = "response")
#Tableau du résultat de la simulation
simulationResultats1 <- cbind(shares1, newsCars)
simulationResultats1
## shares1 seat trans convert price
## 1 0.1547978 2 manual no 35
## 2 0.1824015 2 manual yes 35
## 3 0.3584835 2 auto no 35
## 4 0.4050041 2 auto yes 35
#Visualisation des résultas
barplot(simulationResultats1$shares1, ylab="Predicted Market Share", names.arg=c("Your Car", "Conc 1", "Conc 2", "Conc 3"))
Selon le modèle, vous aurez environ 16% des parts de marché avec ce modèle que vous prévoyez de construire. Il est clair que ce modèle de voiture ne sera pas compétitif. Selon les résultats de l’analyse exploratoire des données, un tel choix ne convient pas. Vous retournez regardez les informations tirées de votre analyse de données pour voir les caractéristiques préférées de vos clients. Ainsi vous décidez de refaire une simulation mais cette fois-ci avec une voiture à 5 sièges, à transmission automatique, à toit ouvrant et dont le prix est de 40000$. Normalement, vous devriez choisir un prix de 30000 dollars puisque selon l’analyse vos clients choisissent plus les voitures de ce prix. Mais vous allez simuler avec le prix le plus élevé à savoir 40000 dollars afin de voir ce que ça donnera. Les caractéristiques des voitures de vos concurrents demeurent les mêmes que précédemment.
#Nouvelle simulation
newsCars2 <- data.frame(
seat = c(5, 2, 2, 2),
trans = c("auto", "manual", "auto", "auto"),
convert = c("yes", "yes", "no", "yes"),
price = c(40, 35, 35, 35)
)
shares2 <- predict(choiceModel, newdata = newsCars2, type = "response")
#Tableau du résultat de la simulation
simulationResultats2 <- cbind(shares2, newsCars2)
#Visualisation des résultas
barplot(simulationResultats2$shares2, ylab="Predicted Market Share", names.arg=c("Your Car", "Conc 1", "Conc 2", "Conc 3"))
Avec cette simulation, votre part de marché a considérablement augmenté par rapport à celle de la première simulation. Mais vous êtes toujours dépassé par deux de vos concurents. Alors vous décidez maintenant de faire une nouvelle simulation en gardant les mêmes caractéristiques mais avec un prix de 30000$.
#Troisième simulation
newsCars3 <- data.frame(
seat = c(5, 2, 2, 2),
trans = c("auto", "manual", "auto", "auto"),
convert = c("yes", "yes", "no", "yes"),
price = c(30, 35, 35, 35)
)
shares3 <- predict(choiceModel, newdata = newsCars3, type = "response")
#Tableau du résultat de la simulation
simulationResultats3 <- cbind(shares3, newsCars3)
#Visualisation des résultas
barplot(simulationResultats3$shares3, ylab="Predicted Market Share", names.arg=c("Your Car", "Conc 1", "Conc 2", "Conc 3"))
Avec cette simulation, vous avez environ 70% des parts du marché et vous êtes leader du marché. Ce résultat confirme les informations tirées de l’analyse exploratoire des données. Est-ce qu’avec un prix de 35000$, vous serez toujours leader du marché ?
# Quatrième simulation
newsCars4 <- data.frame(
seat = c(5, 2, 2, 2),
trans = c("auto", "manual", "auto", "auto"),
convert = c("yes", "yes", "no", "yes"),
price = c(35, 35, 35, 35)
)
shares4 <- predict(choiceModel, newdata = newsCars4, type = "response")
#Tableau du résultat de la simulation
simulationResultats4 <- cbind(shares4, newsCars4)
#Visualisation des résultas
barplot(simulationResultats4$shares4, ylab="Predicted Market Share", names.arg=c("Your Car", "Conc 1", "Conc 2", "Conc 3"))
Avec un modèle à 35000$, vous serez toujours leader du marché (avec 50% des parts de marché) bien que titiller par deux de vos concurents.
La prise de décision est très importante pour une entreprise. Prendre des décisions éclairées par les informations tirées des données contribue à la réussite des affaires. Dans ce document, j’ai montré comment utiliser l’analyse exploratoire des données ainsi qu’un modèle de régression logistique pour aider une entreprise automobile à concevoir le bon modèle de voiture afin d’être leader du marché.