Analyse exploratoire

Solution 1.1

On commence par charger la base de données

Code
# remotes::install_github("lbelzile/hecmulti")
data(aerien, package = "hecmulti")
# Consulter la fiche descriptive
# ? hecmulti::aerien

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:

  • Quel est le profil socio-démographique des clients (âge, sexe, clientèle affaires)
  • Quelle proportion de réponses au sondage sont manquantes et quel est le lien avec le type de vol (via distance_vol)? On peut penser que l’offre alimentaire dépend de la durée.
  • Dans quelle mesure le délai à l’arrivée impacte la satisfaction globale?
  • Quel est le lien entre les réponses et le profil socio-démographique?
  • Est-ce que les personnes qui voyagent en classe supérieure (ou pour des motifs d’affaires) sont plus ou moins critiques?
  • Est-ce que les délais au départ ou à l’arrivée peuvent être négatifs (vol en avance)?

2. Examinez la base de données; identifiez le type de variable et leur nature.

Code
str(aerien)
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 ...
Code
summary(aerien)
    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.

Code
library(dplyr)
# Remplacer valeurs manquantes (0 en NA)
aerien <- aerien |> 
  mutate_at(7:20, ~na_if(., 0))
  # Statistiques descriptives
summary(aerien)
    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                   
Code
# Voir décompte pour éléments du questionnaire
aerien |> 
  mutate_at(7:20, ~factor(., ordered = TRUE)) |>
  # Statistiques descriptives
  summary()
    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                   
Code
# 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).

Code
aerien |> 
  group_by(loyaute_consommateur, 
           classe) |> 
  summarise(cnt = n()) |>
  mutate(freq = formattable::percent(cnt / sum(cnt))) |>
  knitr::kable()
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).

Code
corrplot::corrplot(
  corr = cor(aerien[,7:20], 
             use = "pairwise.complete.obs"), 
  diag = FALSE,
  type = "upper", 
  tl.pos = "n") # pas de nom

5. Représentez graphiquement la distribution de quelques variables de la base de données selon les différents niveaux de satisfaction.

Code
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")

Code
g5

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.

  • Sans surprise, les personnes qui ne sont globalement pas satisfaites accordent des notes plus faibles dans le questionnaire. Leurs vols sont en moyenne sur de plus courtes distances et ont de plus long délais à l’arrivée.
  • Le nombre de vols en classe affaire est surreprésenté dans la base de données.
  • La clientèle affaire détient davantage de compte de fidélité; ce segment est moins critique des vols, mais pourrait ne pas bénéficier des même services.
  • Les délais au départ et à l’arrivée ne sont comptabilisés que s’ils sont positifs.
  • Les délais de retard importants à l’arrivée et au départ sont davantage corrélés à mesure que le retard augmente.