Analyse des donnees MPG

news
code
R
analysis
Author

Anasse Yahanan

Published

February 11, 2025

Presentation du projet

Contexte

Les données utilisées proviennent du jeu de données mpg inclut dans le package ggplot2. La base de données contient des informations sur la consommation de carburants de 234 vehicules, modèles de 1999 à 2008 ainsi que divers caractéristiques techniques et descriptives de ces véhicules.

Objectif

  • Explorer et analyser les relations entre les différentes variables du jeu de données mpg afin de fournir des recommandations aux acheteurs concernant la consommation de carburant des véhicules.

    spécifiquement il s’agirat :

    • D’explorer les données : comprendre la structure des données , identifier les variables clés et détecter les anomalies, valeurs aberrantes ou manquantes, creer si possible de nouvelles variables

    • Réaliser une analyse descriptive : resumer les principales caractéristiques des données à l’aide de statistiques descriptives

    • Analyser la consommation de varburant : Etudier les facteurs qui influent la consommation de carburant (milles par gallon [mpg ]

    • Modeliser : Construstruire des modele de regression pour predire la consommation

    • Visualiser les resultats : Créer des visuels informatfs pour communuquer les résultats

Méthodologie

  • Importer les données mpg
  • Netoyer les données
    • valeurs manquantes
    • valeurs aberrantes
    • doublons
  • Analyse exploratoire (EDA)
    • feature engineering
    • statistique descriptive
  • Visualiser et communiquer les résultats
    • Bivariées des variables pertinentes
    • multivariées
    • segmentation (K-means)

Résultats

  • Les principaux facteurs qui influencent la consommation de carburant des vehicules sont identifiés

  • Les insights sur les tendances et les patterns contenus dans la données sont fournit

  • Des recommandations basées sur les résultats de l’analyse sont proposées


Packages utilisés

L’ensemble des packages utilisés pour la réalisation de ce projet sont :

library(tidyverse)
library(naniar)
library(DT)
library(psych)
library(ggheatmap)
library(reshape2)
library(ggplot2)
library(ggforce)
library(glue)
library(ggdist)
library(gghighlight)

I. Analyse Exploratoire des données

1.1 Nétoyage & formatage des données

  • Valeurs manquantes - valeurs en double

    • Le graphique totalement gris montre que les données mpg ne contiennent pas de valeurs manquantes

    • L’ensembles des données ne contiennent pas de doublon

mpg %>% 
  vis_miss()


1.2 Ingénierie des données (feature engineering)

  • Foratage des données

    Tranformation de toutes les varibles de type chr en factor

mpg_format <- 
  mpg %>% 
  mutate_if(is.character, as.factor)
  • Création de nouvelles variables

    • consommation moyenne de carburant (avg_mpg) [ avg_mpg = (cty + hwy) /2 ]

    • catégorisation de la consommation [ Faible : agv_mpg<20; Moyenne : 20<=avg_mpg<=40 sinon Elevée ]

    • émission de CO2 des véhicules [ 1 gallon —> 8.89 kg CO2 ; 1 mille/gallon —>0.425 kg CO2 ]

    • catégorisation de la cylindré [ Petite: displ<2.0, Moyenne : 2.0<=displ<=4.0 sinon Grande ]

mpg_aumente <- 
  mpg_format %>% 
  mutate(
    # calcule de avg_mpg
    avg_mpg = (cty + hwy)/2,
    # catégorisation de la consommation 
         fuel_efficiency = case_when(
           avg_mpg < 20 ~ "Faible",
           avg_mpg >= 20 & avg_mpg <=30 ~ "Moyenne",
           TRUE ~ "Elevee"
         ),
    # émission de CO2
         co2_emission = round((8887/avg_mpg) * 0.621371),
    # catégorisation de la cylindrée 
         displ_category = case_when(
           displ < 2.0 ~ "Petite",
           displ >= 2.0 & displ <= 4.0 ~ "Moyenne",
           TRUE ~ "Grande"
         ))

1.3 Présentation du dictionnaire et de la base de données

  • Dictionnaire des données
Source : Données mpg (ggplot2)
Variables Descriptif Nature Modalités
Variables initiales
manufacturer Constructeur de véhicule factor audi, toyota, etc…
model Modèle du véhicule factor a4, a4 quatro, etc…
year Année du modèle int
cyl Nombre de cylindres int
trans Type de transmission factor auto, manuel
drv Type de traction factor f : avant, r : propultion , 4 : 4x4
displ cylindres du moteur (en littre) int
cty Consommation en ville int
hwy Consommation sur autoroute int
fl Type de carburant factor p , etc…
class classe de véhicule factor suv, compact, etc…
Variables ajoutées (crées)
avg_mpg consommation moyenne de carburant int
fuel_efficiency catégorisation de la consommation factor Faible, Moyen, etc…
CO2_emission Quantité de CO2 émit par les véhicules int
displ_categoty Catégorisation de la cylindré factor Petite, Moyenne, etc..
  • Présentation de la base de données
datatable(mpg_aumente, 
          extensions = 'Buttons',
          options = list(
            dom = 'Bfrtip',
            button = c('copy', 'csv', 'excel', 'pdf', 'print'),
            pageLength = 10,
            lengthMenu = c(5, 10, 15, 20),
            searching = TRUE,
            ordering = TRUE,
            scrollX = TRUE
          ),
          caption = "Base de Données mpg Augmentée",
          filter = "top")

1.4 Statistiques Descriptives

  • Résumé statistique des variables numériques
stat_num <- mpg_aumente %>% 
  select_if(is.numeric) %>% 
  select(!c("year","cyl")) %>% 
  describe()
# choix des statistique à visualiser 
stat_num[, c("mean","sd","median","min","max","range","skew", "kurtosis")] %>% knitr::kable(digits = 2, caption = "Résumé Statistique des variables numériques")
Résumé Statistique des variables numériques
mean sd median min max range skew kurtosis
displ 3.47 1.29 3.3 1.6 7.0 5.4 0.44 -0.91
cty 16.86 4.26 17.0 9.0 35.0 26.0 0.79 1.43
hwy 23.44 5.95 24.0 12.0 44.0 32.0 0.36 0.14
avg_mpg 20.15 5.05 20.5 10.5 39.5 29.0 0.54 0.66
co2_emission 292.00 75.97 269.0 140.0 526.0 386.0 0.76 0.30
  • Résumé statistique des variables catégorielle (factor)
 mpg_aumente%>% 
  mutate_if(is.character, as.factor) %>% 
  select_if(is.factor) %>% 
   select(-trans) %>% 
  skimr::skim() %>% 
   as_tibble() %>% 
   mutate(variable = skim_variable,
          modalite_unique = factor.n_unique,
          top_modalite = factor.top_counts) %>%
   select(variable,modalite_unique,top_modalite ) %>% 
   knitr::kable(align = "c", 
                caption = "Résumé Statistique des variables numériques")
Résumé Statistique des variables numériques
variable modalite_unique top_modalite
manufacturer 15 dod: 37, toy: 34, vol: 27, for: 25
model 38 car: 11, ram: 10, civ: 9, dak: 9
drv 3 f: 106, 4: 103, r: 25
fl 5 r: 168, p: 52, e: 8, d: 5
class 7 suv: 62, com: 47, mid: 41, sub: 35
fuel_efficiency 3 Moy: 120, Fai: 106, Ele: 8
displ_category 3 Moy: 141, Gra: 71, Pet: 22

II. Visualisation des données

2.1 Visualisation de quelques variables numériques

  • Distribustion de la variable displ
mpg_aumente %>% 
  ggplot(aes(displ))+
  geom_histogram(bins = 25) +
  theme_minimal()+
  labs(
    subtitle = "Distribustion du nombre de cylindré (n = 234) ",
    x = "Nombre de cylindres",
    y = "",
    caption = "Source : mpg data - ggplot2_package"
  )

  • Distribustion de la variable avg_mpg
mpg_aumente %>% 
  ggplot(aes(avg_mpg))+
  geom_histogram(bins = 25) +
  theme_minimal()+
  labs(
    title = "Distribustion de la consommation moyenne (n = 234)",
    x = "consomation de carburant(mille/gallon)",
    y = "",
    caption = "Source : mpg data - ggplot2_package"
  )

2.2 Visualisation de quelques variables catégorielles

  • Distribustion de la variable manufacturer
mpg_2008 = mpg_aumente %>% 
  filter(year == 2008,
         !(class %in% c("2seater","minivan"))) %>% 
  mutate(
    class = case_when(
      class %in% c("compact", "subcompact") ~ '(Sub-)Compact',
      class %in% c("pickup", "suv") ~ 'Pickup/SUV',
      TRUE ~ str_to_title(class)
    ),
    manufacturer = str_to_title(manufacturer),
    manufacturer = fct_infreq(manufacturer) |>  fct_rev()
  )
 

colors <- thematic::okabe_ito(4)
graphe_decomposé = mpg_2008 %>% 
  ggplot(aes(y = manufacturer, fill = class))+
  geom_bar()+
  theme_minimal(base_size = 10,
                base_family = 'Source Sans Pro'
  )+
  scale_fill_manual(values = colors[1:3])+
  facet_wrap(vars(class))+
  labs(x = element_blank(), y = element_blank())+
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major.y = element_blank(),
    legend.position = 'none'
  )


total_plot = mpg_2008 %>% 
  ggplot(aes(y = manufacturer))+
  geom_bar(fill = colors[4])+
  geom_vline(xintercept = 0)+
  theme_minimal(base_size = 10, base_family = 'Source Sans Pro')+
  scale_fill_manual(values = colors[1:3])+
  scale_y_discrete(labels = element_blank())+
  facet_wrap(vars('Total'))+
  labs(x = element_blank(), y = element_blank())+
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major.y = element_blank(),
    legend.position = 'none'
  )


library(patchwork)
graphe_decomposé + total_plot+
  plot_annotation(
    title = 'Vehicules par entreprise et par classe',
    theme = theme(
      element_text(size=12, family = 'Merriweather')
    )
  )

  • Distribustion de la variable trans
colors <- c("dodgerblue4","firebrick2")

mpg_aumente %>% 
  mutate(
   # transformation des modaités de trans en (auto ou manuel)
    trans_two_modalities = case_when(
      str_detect(trans, "auto") ~ "auto",
      TRUE ~ "manuel"
    ),
    trans_two_modalities = str_to_title(trans_two_modalities)
  ) %>% 
  
  group_by(trans_two_modalities) %>% 
  summarise(nb_modalities = n(),
            prop= round((nb_modalities*100)/234),
            lab.ypos = cumsum(prop) - (0.3* prop),
            prop_percent = str_c(prop, "%", sep = "")
            ) %>% 
  ungroup() %>% 
  
    ggplot(aes(x = 2,y = prop, fill = trans_two_modalities))+
  geom_bar(width = 1,stat = "identity", color = "white")+
  coord_polar("y", start = 0)+
  geom_text(aes(y = lab.ypos, label = prop_percent))+
  scale_fill_manual(values =colors)+
  theme_void()+
  labs(subtitle ="Distribustion des types de transmission des véhicules (n = 234)",
       caption = "Source : mpg data - ggplot2_package",
       fill = "Transmission")+
  xlim(0.5,2.5)

III. Analyse des relations entre les variables

3.1 Matrice de corrélation

cov_matrix <-  mpg_aumente %>% 
  select_if(is.numeric) %>% 
  cor()

cov_tibble <- cov_matrix %>% 
  as_tibble(rownames = 'var_a') %>% 
  pivot_longer(
    -var_a,
    names_to = "var_b",
    values_to = "correlation"
  )

var_names <- unique(cov_tibble$var_a)
cov_tibble_factored <-  cov_tibble %>% 
  mutate(
    var_a = factor(var_a, levels = var_names),
    var_b = factor(var_b, levels = rev(var_names))
  )
 
  
cov_tibble_factored %>% 
  ggplot(aes(var_a, var_b))+
  geom_tile(aes(fill = correlation), color = "black")+
  geom_text(aes(label = round(correlation,2)),
            color = ifelse(
              abs(cov_tibble_factored$correlation) > 0.6,
              'white',
              'black'
            ),
            size = 3.5,
            family = 'Source Sans Pro',
            fontface = 'bold'
            
  )+
  theme_minimal(
    base_size = 12,
    base_family = 'Source Sans Pro'
  )+
  labs(
    x = element_blank(),
    y = element_blank(),
    fill = 'Correlation',
    subtitle = "Intensité des liaisons entre les variable numérique mpg",
    caption = "Source : mpg data - ggplot2_package",
  )+
  scale_fill_gradient2(
    high = 'dodgerblue4',
    mid = 'white',
    low = 'firebrick2',
    limits = c(-1,1),
    midpoint = 0
  )+
  coord_cartesian(expand = FALSE)+
  theme(legend.position = 'top')+
  guides(
    fill = guide_colorbar(
      barwidth = unit(10, 'cm')
    ),
    x = guide_axis(n.dodge = 2)
  )

Hypothèse :

  • Une cylindré plus élevée est associée à une consommation plus faible (displ vs. avg_mpg )

  • Une cylindré plus élevée est associée à des émissions de C02 plus élevée (displ & cyl vs. co2_emission)

  • Les véhicules économes en villes le sont également sur autoroute (cty sv. hwy)

3.2 Facteurs qui influencent la consommation de carburant

  • Comment la cylindrée influence -t-elle la consommation moyenne ? (avg_mpg vs. displ)
nuage_point <- 
  mpg_aumente %>% 
  filter(cyl %in% c(2,4,6,8)) %>% 
  ggplot(aes(displ,avg_mpg, fill = cyl))+
  geom_point(shape =21, size = 3)+
  geom_mark_ellipse(
    data = mpg_aumente |>
      filter(displ <= 2.5 & between(avg_mpg, 30,40)),
    aes(
      x0 = 3,
      y0 = 35,
      label = "Consommation importante de carburant",
      
    ),
    fill = "firebrick2",
    alpha = 0.1
  ) +
  labs(
    x = "Taille de la cylindrés du moteur (en littre)",
    y = "Consommation moyenne de carburant (en mpg)",
    fill = "Nombre de cylindres",
    subtitle = "Distribustion de la consommation de carburant selon la cylindré",
    caption = "Source : mpg data - ggplot2_package",
  )+
  theme_minimal(base_size =10)+
  theme(
    legend.position = 'top',
    legend.title = element_text(face = 'bold'),
    panel.grid.minor = element_blank()
  ) +
  scale_fill_distiller(
    palette = 'Blues',
    direction = 1
  )

nuage_point +
  guides(
    fill = guide_coloursteps(
      title.position = 'top',
      barwidth = unit(7, 'cm')
    )
  )

  • Comment le type de transmission affecte -t-il la consommation moyenne ? (avg_mpg vs. trans)
mpg_aumente %>%
  mutate(
    trans = str_to_title(trans)
  ) %>% 
  group_by(trans) %>% 
  summarise(avg_mpg= mean(avg_mpg)) %>% 
  ungroup()  %>% 
  ggplot(aes(x =avg_mpg, y = trans))+
  geom_point(
    color = 'dodgerblue4',
    size = 4
  )+
  geom_text(
    aes(
      label = trans
    ),
    hjust = 1,
    nudge_x = -0.09,
    size = 3,
    family = 'Merriweather'
  )+
  theme_minimal(
    base_size = 10,
    base_family = 'Merriweather'
  )+
  labs(subtitle = "Evolution de la consommation moyenne par type de transmission",
       x = element_blank(),
       y = element_blank(),
       caption = "Source : mpg data - ggplot2_package"
  )+
  scale_x_continuous(
    expand = expansion(mult = c(0.15,0.05))
  )+
  theme(
    panel.grid.major.y = element_blank(),
    plot.title.position = 'plot',
    axis.text.y = element_blank()
  )

  • Comment le type de traction inflence -t-il la consommation moyenne ? (avg_mpg vs. drv)
colors <-  c("firebrick2",'dodgerblue4', 'dodgerblue4')
names(colors) <-  unique(mpg_aumente$drv)


mpg_aumente %>% 
  ggplot(aes(avg_mpg, fill = drv, y = drv))+
  geom_boxplot(width = 0.08) +
  geom_dots(
    side = 'bottom',
    height = 0.55,
    position = position_nudge(y = -0.075)
  )+
  stat_slab(
    position = position_nudge(y = 0.075),
    height = 0.75
  )+
  scale_fill_manual(values = colors)+
  labs(
    subtitle = "Evolution de la consommation moyenne par type de traction",
    x = "Consommation moyenne de carburant (en mpg)",
    y = element_blank(),
    caption = "Source : mpg data - ggplot2_package"
  )+
  theme_minimal(
    base_size = 10,
    base_family = 'Merriweather'
  )+
  theme(
    panel.grid.minor = element_blank(),
    legend.position = 'none'
  )

/

  • Comment la classe de véhicule inflence-t-elle la consommation moyenne ? (avg_mpg vs. class)
colors <-  c("firebrick2",'firebrick2', 'dodgerblue4', 'tomato', 'tomato', 'dodgerblue4', 'firebrick2')
names(colors) <-  unique(mpg_aumente$class)


mpg_aumente %>% 
  ggplot(aes(avg_mpg, fill = class, y = class))+
  geom_boxplot(width = 0.08) +
  geom_dots(
    side = 'bottom',
    height = 0.55,
    position = position_nudge(y = -0.075)
  )+
  stat_slab(
    position = position_nudge(y = 0.075),
    height = 0.75
  )+
  scale_fill_manual(values = colors)+
  labs(
    subtitle = "Evolution de la Consommation Moyenne par Classe de véhicule ",
    x = "Consommation moyenne de carburant (en mpg)",
    y = element_blank(),
    caption = "Source : mpg data - ggplot2_package"
  )+
  theme_minimal(
    base_size = 11,
    base_family = 'Merriweather'
  )+
  theme(
    panel.grid.minor = element_blank(),
    legend.position = 'none'
  )

  • Comment les émissions de C02 sont - elles liées à la consomation moyenne
mpg_aumente %>% 
  ggplot(aes(x = avg_mpg, y = co2_emission, colour = fuel_efficiency))+
  geom_line(linewidth = 1.5)+
  theme_minimal(
    base_size = 10,
    base_family = 'Merriweather'
    
  )+
  labs(
    x = 'Consommation moyenne de carburant (en mpg)',
    y = element_blank(),
    title = "Emission de C02 par consommation moyenne",
    caption = "Source : mpg data - ggplot2_package",
  )+
  gghighlight(
    fuel_efficiency == 'Faible',
    avg_mpg  < 20,
    use_direct_label = F,
    use_group_by = F,
    unhighlighted_params = list(color = 'grey80',linewidth = 1 )
  )+
  annotate(
    'text',
    x = 15,
    y = c(525, 20),
    size = 3,
    label = c('Emission CO2 elevée', 'Faible conso carburant'),
    color = c('firebrick2', 'dodgerblue4')
  )+
  annotate(
    'segment',
    x = 20,
    xend = 20,
    y = 0,
    linetype = 2,
    linewidth = 1,
    color = 'grey80',
  )+
  theme(
    legend.position = 'none'
  )