Code
# remotes::install_github("lbelzile/hecmulti")
data(aerien, package = "hecmulti")
# Consulter la fiche descriptive
# ? hecmulti::aerien
On commence par charger la base de données
1. Formulez des questions en lien avec la description de la base de données préliminaires à l’analyse exploratoire.
Pour démarrer notre analyse exploratoire, on formule quelques questions. Par exemple:
distance_vol
)? On peut penser que l’offre alimentaire dépend de la durée.2. Examinez la base de données; identifiez le type de variable et leur nature.
Classes 'tbl_df', 'tbl' and 'data.frame': 129880 obs. of 23 variables:
$ sexe : Factor w/ 2 levels "femme","homme": 1 1 2 2 1 2 1 1 2 1 ...
$ loyaute_consommateur : Factor w/ 2 levels "non","oui": 2 2 1 2 2 2 2 2 2 2 ...
$ age : int 52 36 20 44 49 16 77 43 47 46 ...
$ type_deplacement : Factor w/ 2 levels "affaires","personnel": 1 1 1 1 1 1 1 1 1 1 ...
$ classe : Factor w/ 3 levels "affaire","eco",..: 2 1 2 1 2 2 1 1 2 1 ...
$ distance_vol : num 160 2863 192 3377 1182 ...
$ service_internet_en_vol : int 5 1 2 0 2 3 5 2 5 2 ...
$ temps_arrivee_depart_convenable: int 4 1 0 0 3 3 5 2 2 2 ...
$ facilite_reservation_en_ligne : int 3 3 2 0 4 3 5 2 2 2 ...
$ localisation_porte : int 4 1 4 2 3 3 5 2 2 2 ...
$ nourriture : int 3 5 2 3 4 5 3 4 5 3 ...
$ preenregistrement_en_ligne : int 4 4 2 4 1 5 5 4 5 4 ...
$ confort_siege : int 3 5 2 4 2 3 5 5 5 4 ...
$ divertissement_en_vol : int 5 4 2 1 2 5 5 4 5 4 ...
$ service_embarquement : int 5 4 4 1 2 4 5 4 2 4 ...
$ service_espace_jambes : int 5 4 1 1 2 3 5 4 2 4 ...
$ gestion_bagages : int 5 4 3 1 2 1 5 4 5 4 ...
$ service_enregistrement : int 2 3 2 3 4 1 4 5 3 5 ...
$ service_vol : int 5 4 2 1 2 2 5 4 3 4 ...
$ proprete : int 5 5 2 4 4 5 3 3 5 4 ...
$ delai_depart_min : int 50 0 0 0 0 0 0 77 1 28 ...
$ delai_arrivee_min : int 44 0 0 6 20 0 0 65 0 14 ...
$ satisfaction : Factor w/ 2 levels "non","oui": 2 2 1 2 2 2 2 2 2 2 ...
sexe loyaute_consommateur age type_deplacement
femme:65899 non: 23780 Min. : 7.00 affaires :89693
homme:63981 oui:106100 1st Qu.:27.00 personnel:40187
Median :40.00
Mean :39.43
3rd Qu.:51.00
Max. :85.00
classe distance_vol service_internet_en_vol
affaire:62160 Min. : 31 Min. :0.000
eco :58309 1st Qu.: 414 1st Qu.:2.000
ecoplus: 9411 Median : 844 Median :3.000
Mean :1190 Mean :2.729
3rd Qu.:1744 3rd Qu.:4.000
Max. :4983 Max. :5.000
temps_arrivee_depart_convenable facilite_reservation_en_ligne
Min. :0.000 Min. :0.000
1st Qu.:2.000 1st Qu.:2.000
Median :3.000 Median :3.000
Mean :3.058 Mean :2.757
3rd Qu.:4.000 3rd Qu.:4.000
Max. :5.000 Max. :5.000
localisation_porte nourriture preenregistrement_en_ligne confort_siege
Min. :0.000 Min. :0.000 Min. :0.000 Min. :0.000
1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.000
Median :3.000 Median :3.000 Median :3.000 Median :4.000
Mean :2.977 Mean :3.205 Mean :3.253 Mean :3.441
3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:5.000
Max. :5.000 Max. :5.000 Max. :5.000 Max. :5.000
divertissement_en_vol service_embarquement service_espace_jambes
Min. :0.000 Min. :0.000 Min. :0.000
1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.000
Median :4.000 Median :4.000 Median :4.000
Mean :3.358 Mean :3.383 Mean :3.351
3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:4.000
Max. :5.000 Max. :5.000 Max. :5.000
gestion_bagages service_enregistrement service_vol proprete
Min. :1.000 Min. :0.000 Min. :0.000 Min. :0.000
1st Qu.:3.000 1st Qu.:3.000 1st Qu.:3.000 1st Qu.:2.000
Median :4.000 Median :3.000 Median :4.000 Median :3.000
Mean :3.632 Mean :3.306 Mean :3.642 Mean :3.286
3rd Qu.:5.000 3rd Qu.:4.000 3rd Qu.:5.000 3rd Qu.:4.000
Max. :5.000 Max. :5.000 Max. :5.000 Max. :5.000
delai_depart_min delai_arrivee_min satisfaction
Min. : 0.00 Min. : 0.00 non:73452
1st Qu.: 0.00 1st Qu.: 0.00 oui:56428
Median : 0.00 Median : 0.00
Mean : 14.71 Mean : 15.09
3rd Qu.: 12.00 3rd Qu.: 13.00
Max. :1592.00 Max. :1584.00
NA's :393
La plupart des variables, dont les colonnes 7 à 20 qui contiennent les réponses au questionnaire, sont des variables entières (int
) formées d’échelles de Likert de 1 à 5; les valeurs manquantes encodées 0. Le sexe, la classe, le type de déplacement sont des variables catégorielles nominales. La satisfaction globale et l’indice de fidélité du consommateur sont binaires et ordinales. La distance du vol est continue et encodée comme numérique (dbl
). Les délais sont encodées avec des valeurs entières (valeur arrondie).
3. Y a-t-il des valeurs manquantes? Si oui, pour quelles variables? Serait-il logique de les imputer par leur moyenne, dans le cas présent?
Oui, il y a des valeurs manquantes. Selon la description (voir la section Détails sous ?hecmulti::aerien
), toutes les valeurs 0 dans les questionnaires encodent des chanmps non applicables. Les imputer par la moyenne serait donc illogique, puisque certains services (divertissement, nourriture) ne sont pas offerts dans ces vols. Selon ce qui nous intéresse, on pourrait faire une segmentation manuelle de la base de données pour prendre le sous-ensemble qui nous intéresse.
Il serait possible en revanche d’imputer l’information pour les valeurs de délai (393 valeurs manquantes).
4. Calculez les statistiques descriptives pour les variables continues et produisez des tableaux de fréquence ou de contingence pour les variables catégorielles. Que remarquez-vous?
A minima, il faut transformer les zéros en valeurs manquantes pour éviter de fausser les résultats. Il serait aussi préférable de transformer les scores des items du questionnaire en variables catégorielles.
sexe loyaute_consommateur age type_deplacement
femme:65899 non: 23780 Min. : 7.00 affaires :89693
homme:63981 oui:106100 1st Qu.:27.00 personnel:40187
Median :40.00
Mean :39.43
3rd Qu.:51.00
Max. :85.00
classe distance_vol service_internet_en_vol
affaire:62160 Min. : 31 Min. :1.000
eco :58309 1st Qu.: 414 1st Qu.:2.000
ecoplus: 9411 Median : 844 Median :3.000
Mean :1190 Mean :2.814
3rd Qu.:1744 3rd Qu.:4.000
Max. :4983 Max. :5.000
NA's :3916
temps_arrivee_depart_convenable facilite_reservation_en_ligne
Min. :1.000 Min. :1.000
1st Qu.:2.000 1st Qu.:2.000
Median :3.000 Median :3.000
Mean :3.223 Mean :2.883
3rd Qu.:4.000 3rd Qu.:4.000
Max. :5.000 Max. :5.000
NA's :6681 NA's :5682
localisation_porte nourriture preenregistrement_en_ligne confort_siege
Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.000
Median :3.000 Median :3.000 Median :4.000 Median :4.000
Mean :2.977 Mean :3.208 Mean :3.332 Mean :3.441
3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:5.000
Max. :5.000 Max. :5.000 Max. :5.000 Max. :5.000
NA's :1 NA's :132 NA's :3080 NA's :1
divertissement_en_vol service_embarquement service_espace_jambes
Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.000
Median :4.000 Median :4.000 Median :4.000
Mean :3.359 Mean :3.383 Mean :3.366
3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:4.000
Max. :5.000 Max. :5.000 Max. :5.000
NA's :18 NA's :5 NA's :598
gestion_bagages service_enregistrement service_vol proprete
Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:3.000 1st Qu.:3.000 1st Qu.:3.000 1st Qu.:2.000
Median :4.000 Median :3.000 Median :4.000 Median :3.000
Mean :3.632 Mean :3.306 Mean :3.642 Mean :3.287
3rd Qu.:5.000 3rd Qu.:4.000 3rd Qu.:5.000 3rd Qu.:4.000
Max. :5.000 Max. :5.000 Max. :5.000 Max. :5.000
NA's :1 NA's :5 NA's :14
delai_depart_min delai_arrivee_min satisfaction
Min. : 0.00 Min. : 0.00 non:73452
1st Qu.: 0.00 1st Qu.: 0.00 oui:56428
Median : 0.00 Median : 0.00
Mean : 14.71 Mean : 15.09
3rd Qu.: 12.00 3rd Qu.: 13.00
Max. :1592.00 Max. :1584.00
NA's :393
sexe loyaute_consommateur age type_deplacement
femme:65899 non: 23780 Min. : 7.00 affaires :89693
homme:63981 oui:106100 1st Qu.:27.00 personnel:40187
Median :40.00
Mean :39.43
3rd Qu.:51.00
Max. :85.00
classe distance_vol service_internet_en_vol
affaire:62160 Min. : 31 1 :22328
eco :58309 1st Qu.: 414 2 :32320
ecoplus: 9411 Median : 844 3 :32185
Mean :1190 4 :24775
3rd Qu.:1744 5 :14356
Max. :4983 NA's: 3916
temps_arrivee_depart_convenable facilite_reservation_en_ligne
1 :19409 1 :21886
2 :21534 2 :30051
3 :22378 3 :30393
4 :31880 4 :24444
5 :27998 5 :17424
NA's: 6681 NA's: 5682
localisation_porte nourriture preenregistrement_en_ligne confort_siege
1 :21991 1 :16051 1 :13261 1 :15108
2 :24296 2 :27383 2 :21934 2 :18529
3 :35717 3 :27794 3 :27117 3 :23328
4 :30466 4 :30563 4 :38468 4 :39756
5 :17409 5 :27957 5 :26020 5 :33158
NA's: 1 NA's: 132 NA's: 3080 NA's: 1
divertissement_en_vol service_embarquement service_espace_jambes
1 :15675 1 :14787 1 :12895
2 :21968 2 :18351 2 :24540
3 :23884 3 :28542 3 :25056
4 :36791 4 :38703 4 :35886
5 :31544 5 :29492 5 :30905
NA's: 18 NA's: 5 NA's: 598
gestion_bagages service_enregistrement service_vol proprete
1: 9028 1 :16108 1 : 8862 1 :16729
2:14362 2 :16102 2 :14308 2 :20113
3:25851 3 :35453 3 :25316 3 :30639
4:46761 4 :36333 4 :47323 4 :33969
5:33878 5 :25883 5 :34066 5 :28416
NA's: 1 NA's: 5 NA's: 14
delai_depart_min delai_arrivee_min satisfaction
Min. : 0.00 Min. : 0.00 non:73452
1st Qu.: 0.00 1st Qu.: 0.00 oui:56428
Median : 0.00 Median : 0.00
Mean : 14.71 Mean : 15.09
3rd Qu.: 12.00 3rd Qu.: 13.00
Max. :1592.00 Max. :1584.00
NA's :393
# Moyenne et écart-type par variable
# selon niveau de satisfaction
aerien |>
group_by(satisfaction) |>
summarize(across(where(is.numeric),
~ mean(.x, na.rm = TRUE),
.names = "moy_{.col}")) |>
# Pivoter tableau
tidyr::pivot_longer(cols = -1,
names_to = "variable",
names_prefix = "moy_",
values_to = "moyenne") |>
arrange(variable) |> # trier
knitr::kable(digits = 2)
satisfaction | variable | moyenne |
---|---|---|
non | age | 37.65 |
oui | age | 41.74 |
non | confort_siege | 3.04 |
oui | confort_siege | 3.97 |
non | delai_arrivee_min | 17.06 |
oui | delai_arrivee_min | 12.53 |
non | delai_depart_min | 16.41 |
oui | delai_depart_min | 12.51 |
non | distance_vol | 929.72 |
oui | distance_vol | 1529.54 |
non | divertissement_en_vol | 2.89 |
oui | divertissement_en_vol | 3.96 |
non | facilite_reservation_en_ligne | 2.62 |
oui | facilite_reservation_en_ligne | 3.24 |
non | gestion_bagages | 3.37 |
oui | gestion_bagages | 3.97 |
non | localisation_porte | 2.98 |
oui | localisation_porte | 2.97 |
non | nourriture | 2.96 |
oui | nourriture | 3.53 |
non | preenregistrement_en_ligne | 2.71 |
oui | preenregistrement_en_ligne | 4.15 |
non | proprete | 2.93 |
oui | proprete | 3.75 |
non | service_embarquement | 3.02 |
oui | service_embarquement | 3.86 |
non | service_enregistrement | 3.04 |
oui | service_enregistrement | 3.65 |
non | service_espace_jambes | 3.01 |
oui | service_espace_jambes | 3.83 |
non | service_internet_en_vol | 2.40 |
oui | service_internet_en_vol | 3.39 |
non | service_vol | 3.39 |
oui | service_vol | 3.97 |
non | temps_arrivee_depart_convenable | 3.29 |
oui | temps_arrivee_depart_convenable | 3.14 |
On note que 82 % des résultats sont pour des clients. L’âge médian est de 40 ans, et la majorité des déplacements sont pour affaires, soit environ 69 pourcent. Il y a presque autant d’hommes que de femmes. Les personnes qui disposent d’une carte fidélité voyagent davantage en classe affaire (presque la moitié des vols).
loyaute_consommateur | classe | cnt | freq |
---|---|---|---|
non | affaire | 9231 | 38.82% |
non | eco | 13634 | 57.33% |
non | ecoplus | 915 | 3.85% |
oui | affaire | 52929 | 49.89% |
oui | eco | 44675 | 42.11% |
oui | ecoplus | 8496 | 8.01% |
Il y a une forte corrélation entre certains items du questionnaire, ce qui est logique parce que ces questions capturent souvent des concepts communs (services, enregistrement, confort).
5. Représentez graphiquement la distribution de quelques variables de la base de données selon les différents niveaux de satisfaction
.
library(ggplot2)
theme_set(theme_classic())
g1 <- ggplot(data = aerien,
aes(x = loyaute_consommateur,
fill = satisfaction)) +
geom_bar(position = "fill") +
labs(y = "",
x = "loyauté du consommateur")
g2 <- aerien |>
count(service_internet_en_vol,
satisfaction) |>
group_by(satisfaction) |>
mutate(pct = n / sum(n)) |>
ggplot(aes(x = service_internet_en_vol,
y = pct,
fill = satisfaction)) +
geom_bar(stat = "identity",
position = "dodge2") +
labs(y = "",
subtitle = "Pourcentage des réponses",
x = "service internet en vol")
g3 <- aerien |>
count(preenregistrement_en_ligne,
satisfaction) |>
group_by(satisfaction) |>
mutate(pct = n / sum(n)) |>
ggplot(aes(x = preenregistrement_en_ligne,
y = pct,
fill = satisfaction)) +
geom_bar(stat = "identity",
position = "dodge2") +
labs(y = "",
subtitle = "Pourcentage des réponses",
x = "préenregistrement en ligne")
g4 <- ggplot(data = aerien,
aes(x = delai_arrivee_min,
fill = satisfaction)) +
geom_histogram(boundary = 0,
binwidth = 2,
position = "dodge2") +
coord_trans(x = 'log1p',
y = 'log1p') +
labs(y = "",
x = "délai à l'arrivée (en minutes)")
g5 <- ggplot(data = aerien,
aes(x = delai_depart_min,
y = delai_arrivee_min),
alpha = 0.5) +
geom_point() +
labs(x = "délais au départ (en minutes)",
y = "délais à l'arrivée (en minutes)") +
coord_trans(x = "log1p",
y = "log1p")
library(patchwork)
# Imprimer plusieurs graphiques
(g1 + g2) / (g3 + g4) +
plot_layout(guides = "collect") & theme(legend.position = "bottom")
On voit clairement qu’il y a de grandes disparités pour la satisfaction. Il est peu surprenant de constater que les personnes qui ne sont pas globalement satisfaites accordent des notes plus faibles aux différents items du questionnaire. Certains items (accès internet en vol, facilité du préenregistrement) semblent avec un impact important sur la satisfaction globale.
À mesure que les délais au départ augmentent, la relation avec le délai à l’arrivée se renforce, mais la corrélation linéaire est plus faible pour les petits retards. On voit que seuls sont enregistrés les retards (un vol qui arrive à l’avance est comptabilisé comme étant à l’heure avec une valeur de zéro).
6. Résumez les faits saillants de votre analyse exploratoire en cinq à 10 points.