1 Page de garde et informations générales

Institut : 2iE – Institut International d’Ingénierie de l’Eau et de l’Environnement, Ouagadougou, Burkina Faso

Filière : Master S8 – Génie Civil, Bâtiment et Travaux Publics (GC-BTP)

UE : Recherche scientifique et analyse de données assistée par IA

ECUE : STI812 – Statistique et analyse de données

Travaux dirigés : TD1 – Initiation à R/RStudio et statistique descriptive et exploratoire

Date de rédaction : 25 septembre 2026


2 Introduction générale

L’analyse de données occupe une place croissante dans les métiers du génie civil et du bâtiment. Que ce soit pour contrôler la qualité d’un béton, suivre des indicateurs environnementaux sur un chantier, ou encore analyser des enquêtes de terrain, l’ingénieur civil est de plus en plus amené à manipuler des jeux de données, à en extraire des indicateurs pertinents et à en tirer des conclusions rigoureuses.

Ce rapport constitue le compte-rendu du premier travail dirigé (TD1) du cours STI812 Statistique et analyse de données. Ce TD a pour vocation de poser les bases de la statistique descriptive et exploratoire sous l’environnement R/RStudio, à travers des jeux de données classiques (airquality, HairEyeColor) puis à travers un jeu de données propre au génie civil (essais sur béton).

Le rapport suit fidèlement la structure et l’ordre des exercices proposés dans le recueil de travaux dirigés, et présente pour chaque exercice : le rappel des objectifs, le code R commenté, les résultats obtenus (tableaux et graphiques), ainsi qu’une interprétation statistique et, lorsque cela est pertinent, une lecture en lien avec le génie civil ou l’environnement.

3 Objectifs du TD1

Le TD1 poursuit quatre objectifs pédagogiques principaux :

  1. Prendre en main l’environnement RStudio : création d’un projet, écriture d’un script commenté, importation de données ;
  2. Calculer et interpréter les indicateurs descriptifs usuels (indicateurs de position et de dispersion) ;
  3. Produire des représentations graphiques pertinentes avec le package ggplot2 ;
  4. Mesurer et interpréter une liaison statistique entre deux variables, à l’aide de la corrélation, du test du khi-deux d’indépendance et de l’analyse de la variance (ANOVA) à un facteur.

4 Données et logiciels utilisés

Ce rapport mobilise trois jeux de données :

  • airquality : jeu de données fourni nativement avec R, contenant des mesures quotidiennes de qualité de l’air (ozone, rayonnement solaire, vent, température) relevées à New York entre mai et septembre 1973. Il permet d’illustrer la statistique univariée et bivariée sur des variables quantitatives, dans une logique proche des problématiques environnementales ;
  • HairEyeColor : jeu de données fourni avec R, croisant la couleur des cheveux et la couleur des yeux d’un échantillon d’étudiants. Il sert à illustrer le test d’indépendance du khi-deux entre deux variables qualitatives ;
  • TD_genie_civil.xlsx (feuille beton) : jeu de données propre à la filière GC-BTP, décrivant des éprouvettes de béton (dosage en ciment, rapport eau/ciment, âge, affaissement, porosité, résistance à la compression, type de granulat, présence de pathologie). Il est importé avec la fonction read_excel() du package readxl et sert de support à l’exercice appliqué de génie civil (Exercice 7).

L’ensemble des traitements est réalisé sous R (environnement RStudio), à l’aide des packages tidyverse (dont dplyr et ggplot2), readxl, knitr et kableExtra. Le chargement de ces packages est réalisé dans le bloc de configuration (setup) ci-dessus.

Le code ci-dessous importe la feuille beton du fichier TD_genie_civil.xlsx. Le fichier doit être placé dans le même dossier que ce document .Rmd (ou le chemin doit être adapté). Si le fichier n’est pas disponible au moment de la compilation, l’import échouera de façon silencieuse grâce à tryCatch(), et les sections concernées (Exercice 7) ne s’exécuteront pas tant que le fichier ne sera pas fourni.

# Import du jeu de données de génie civil (feuille "beton")
# tryCatch permet de ne pas interrompre la compilation du rapport
# si le fichier n'est pas encore présent dans le dossier de travail
beton <- tryCatch(
  read_excel("TD_genie_civil.xlsx", sheet = "beton"),
  error = function(e) {
    message("Fichier TD_genie_civil.xlsx introuvable : les sections béton ",
            "ne s'afficheront qu'une fois le fichier placé dans le dossier du projet.")
    NULL
  }
)

# Indicateur logique utilisé plus loin pour conditionner l'exécution
# des blocs de code relatifs au jeu de données béton
donnees_beton_disponibles <- !is.null(beton)

5 Exercice 1 – Environnement R/RStudio et importation du jeu airquality

5.1 Objectifs de l’exercice

Il s’agit de prendre en main l’environnement RStudio (projet, script) et de découvrir la structure du jeu de données airquality, fourni nativement avec R.

5.2 Chargement et exploration du jeu de données

# Chargement du jeu de donnees airquality, fourni avec R
data(airquality)

# Structure et types des variables
glimpse(airquality)
## Rows: 153
## Columns: 6
## $ Ozone   <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, 18, 14, …
## $ Solar.R <int> 190, 118, 149, 313, NA, NA, 299, 99, 19, 194, NA, 256, 290, 27…
## $ Wind    <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6, 6.9, 9…
## $ Temp    <int> 67, 72, 74, 62, 56, 66, 65, 59, 61, 69, 74, 69, 66, 68, 58, 64…
## $ Month   <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,…
## $ Day     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,…
# Premiers indicateurs descriptifs par variable
summary(airquality)
##      Ozone           Solar.R           Wind             Temp      
##  Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
##  1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
##  Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
##  Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
##  3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
##  Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
##  NAs    :37       NAs    :7                                       
##      Month            Day      
##  Min.   :5.000   Min.   : 1.0  
##  1st Qu.:6.000   1st Qu.: 8.0  
##  Median :7.000   Median :16.0  
##  Mean   :6.993   Mean   :15.8  
##  3rd Qu.:8.000   3rd Qu.:23.0  
##  Max.   :9.000   Max.   :31.0  
## 

5.3 Dimensions du jeu de données

n_individus <- nrow(airquality)
n_variables <- ncol(airquality)

data.frame(
  Indicateur = c("Nombre d'individus (jours de mesure)", "Nombre de variables"),
  Valeur = c(n_individus, n_variables)
) %>%
  kable(caption = "Dimensions du jeu de données airquality") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Dimensions du jeu de données airquality
Indicateur Valeur
Nombre d’individus (jours de mesure) 153
Nombre de variables 6

Interprétation : le jeu de données airquality comporte 153 individus (correspondant à des jours d’observation) et 6 variables. Les variables Ozone, Solar.R, Wind et Temp sont quantitatives continues, tandis que Month et Day sont des variables entières qui codent respectivement le mois et le jour d’observation ; elles seront traitées comme facteurs lorsque nécessaire (voir Exercice 5).

5.4 Valeurs manquantes par variable

# Nombre de valeurs manquantes par variable
na_par_variable <- colSums(is.na(airquality))

data.frame(
  Variable = names(na_par_variable),
  Valeurs_manquantes = as.integer(na_par_variable)
) %>%
  kable(caption = "Nombre de valeurs manquantes par variable") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Nombre de valeurs manquantes par variable
Variable Valeurs_manquantes
Ozone 37
Solar.R 7
Wind 0
Temp 0
Month 0
Day 0

Interprétation : les valeurs manquantes se concentrent essentiellement sur les variables Ozone et Solar.R, ce qui est cohérent avec des difficultés de mesure ou d’enregistrement fréquentes sur des capteurs environnementaux. Ces valeurs manquantes devront être gérées explicitement (option na.rm = TRUE ou na.omit()) dans la suite des analyses, afin d’éviter que R ne renvoie des résultats non définis (NA).

6 Exercice 2 – Statistique univariée sur la variable Ozone

6.1 Objectifs de l’exercice

Calculer les indicateurs de position et de dispersion de la variable Ozone, comparer moyenne et médiane pour juger de la symétrie de la distribution, et repérer d’éventuelles valeurs atypiques à l’aide de représentations graphiques.

6.2 Indicateurs de position et de dispersion

# Calcul des indicateurs descriptifs sur Ozone (na.rm = TRUE pour ignorer les NA)
moyenne_ozone   <- mean(airquality$Ozone, na.rm = TRUE)
mediane_ozone   <- median(airquality$Ozone, na.rm = TRUE)
ecart_type_ozone <- sd(airquality$Ozone, na.rm = TRUE)
quantiles_ozone <- quantile(airquality$Ozone, na.rm = TRUE)
cv_ozone <- ecart_type_ozone / moyenne_ozone * 100  # coefficient de variation en %

tab_indicateurs <- data.frame(
  Indicateur = c("Moyenne", "Médiane", "Écart-type",
                 "1er quartile (Q1)", "3e quartile (Q3)",
                 "Coefficient de variation (%)"),
  Valeur = round(c(moyenne_ozone, mediane_ozone, ecart_type_ozone,
                    quantiles_ozone[["25%"]], quantiles_ozone[["75%"]], cv_ozone), 2)
)

tab_indicateurs %>%
  kable(caption = "Indicateurs descriptifs de la variable Ozone") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Indicateurs descriptifs de la variable Ozone
Indicateur Valeur
Moyenne 42.13
Médiane 31.50
Écart-type 32.99
1er quartile (Q1) 18.00
3e quartile (Q3) 63.25
Coefficient de variation (%) 78.30

Interprétation statistique : la comparaison entre la moyenne et la médiane calculées ci-dessus permet de juger de la symétrie de la distribution : si la moyenne est nettement supérieure à la médiane, la distribution présente une asymétrie à droite (présence de valeurs fortes qui « tirent » la moyenne vers le haut), typique des variables de concentration de polluants qui ne peuvent pas prendre de valeurs négatives et présentent occasionnellement des pics élevés. Un coefficient de variation élevé traduit une forte dispersion relative des concentrations d’ozone au cours de la période d’observation.

6.3 Représentations graphiques

ggplot(airquality, aes(x = Ozone)) +
  geom_histogram(bins = 15, fill = "#1E7A3D", colour = "white", na.rm = TRUE) +
  labs(title = "Distribution de la concentration en ozone",
       x = "Ozone (ppb)", y = "Effectif") +
  theme_minimal()
Histogramme de la concentration en ozone

Histogramme de la concentration en ozone

Interprétation : l’histogramme confirme l’asymétrie à droite évoquée précédemment : la majorité des observations se concentre sur des valeurs modérées d’ozone, avec une traîne étalée vers les fortes concentrations.

ggplot(airquality, aes(y = Ozone)) +
  geom_boxplot(fill = "#DEEAF1", na.rm = TRUE) +
  labs(title = "Boîte à moustaches de l'ozone", y = "Ozone (ppb)") +
  theme_minimal()
Boîte à moustaches de la concentration en ozone

Boîte à moustaches de la concentration en ozone

Interprétation : la boîte à moustaches permet de repérer d’éventuelles valeurs atypiques (points situés au-delà des moustaches). Leur présence renforce la recommandation d’utiliser la médiane et l’écart interquartile (IQR) plutôt que la moyenne et l’écart-type pour décrire le centre et la dispersion de cette variable, ces indicateurs étant plus robustes aux valeurs extrêmes.

7 Exercice 3 – Corrélation entre Temp et Ozone

7.1 Objectifs de l’exercice

Étudier la liaison entre la température (Temp) et la concentration en ozone (Ozone) à l’aide d’un nuage de points, du coefficient de corrélation de Pearson et de celui de Spearman, puis élargir l’analyse à la matrice de corrélation des variables quantitatives.

7.2 Nuage de points

ggplot(airquality, aes(Temp, Ozone)) +
  geom_point(colour = "#1F4E79", na.rm = TRUE) +
  geom_smooth(method = "lm", na.rm = TRUE, se = TRUE) +
  labs(title = "Relation entre température et ozone",
       x = "Température (°F)", y = "Ozone (ppb)") +
  theme_minimal()
Nuage de points Temp vs Ozone

Nuage de points Temp vs Ozone

7.3 Coefficients de corrélation

cor_pearson  <- cor(airquality$Temp, airquality$Ozone, use = "complete.obs")
cor_spearman <- cor(airquality$Temp, airquality$Ozone, use = "complete.obs", method = "spearman")

data.frame(
  Méthode = c("Pearson", "Spearman"),
  Coefficient = round(c(cor_pearson, cor_spearman), 3)
) %>%
  kable(caption = "Coefficients de corrélation entre Temp et Ozone") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Coefficients de corrélation entre Temp et Ozone
Méthode Coefficient
Pearson 0.698
Spearman 0.774

Interprétation : le coefficient de Pearson mesure l’intensité d’une liaison linéaire entre les deux variables, tandis que le coefficient de Spearman mesure une liaison monotone (pas nécessairement linéaire), en travaillant sur les rangs. Un écart notable entre les deux coefficients suggère que la relation entre température et ozone n’est pas parfaitement linéaire, ce qui est cohérent avec les mécanismes photochimiques de formation de l’ozone troposphérique (effet de seuil, saturation). Il est important de rappeler qu’une corrélation, même forte, ne démontre pas une relation de causalité : d’autres facteurs (rayonnement solaire, vent) interviennent simultanément.

7.4 Matrice de corrélation

matrice_cor <- cor(airquality[, 1:4], use = "complete.obs")

matrice_cor %>%
  round(3) %>%
  kable(caption = "Matrice de corrélation des variables quantitatives de airquality") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Matrice de corrélation des variables quantitatives de airquality
Ozone Solar.R Wind Temp
Ozone 1.000 0.348 -0.612 0.699
Solar.R 0.348 1.000 -0.127 0.294
Wind -0.612 -0.127 1.000 -0.497
Temp 0.699 0.294 -0.497 1.000

Interprétation : la matrice de corrélation permet de situer la relation Temp–Ozone parmi l’ensemble des liaisons deux à deux. On peut notamment examiner si le vent (Wind) est corrélé négativement à l’ozone (effet de dispersion des polluants) et si le rayonnement solaire (Solar.R) est positivement corrélé à l’ozone (rôle du rayonnement dans les réactions photochimiques), sans toutefois en tirer de conclusion causale directe.

8 Exercice 4 – Test du khi-deux avec HairEyeColor

8.1 Hypothèses du test

Le test du khi-deux d’indépendance permet de tester l’hypothèse nulle H0 : les deux variables qualitatives sont indépendantes, contre l’hypothèse alternative H1 : il existe une association entre les deux variables. Le test repose sur la comparaison entre les effectifs observés et les effectifs théoriques attendus sous l’hypothèse d’indépendance, et suppose que les effectifs théoriques ne soient pas trop faibles (règle usuelle : au moins 80 % des effectifs théoriques supérieurs à 5).

8.2 Tableau de contingence

# Tableau de contingence couleur des cheveux x couleur des yeux
tab_hair_eye <- margin.table(HairEyeColor, c(1, 2))

tab_hair_eye %>%
  as.data.frame.matrix() %>%
  kable(caption = "Tableau de contingence : couleur des cheveux x couleur des yeux") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tableau de contingence : couleur des cheveux x couleur des yeux
Brown Blue Hazel Green
Black 68 20 15 5
Brown 119 84 54 29
Red 26 17 14 14
Blond 7 94 10 16

8.3 Test du khi-deux

test_chisq_hairEye <- chisq.test(tab_hair_eye)
test_chisq_hairEye
## 
##  Pearson's Chi-squared test
## 
## data:  tab_hair_eye
## X-squared = 138.29, df = 9, p-value < 2.2e-16
data.frame(
  Statistique = round(test_chisq_hairEye$statistic, 2),
  ddl = test_chisq_hairEye$parameter,
  p_valeur = format.pval(test_chisq_hairEye$p.value, digits = 3)
) %>%
  kable(caption = "Résultat synthétique du test du khi-deux") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Résultat synthétique du test du khi-deux
Statistique ddl p_valeur
X-squared 138.29 9 <2e-16

Interprétation : la p-valeur obtenue est comparée au seuil de risque fixé à 5 %. Si la p-valeur est inférieure à 0,05, on rejette l’hypothèse d’indépendance H0 et on conclut à une association statistiquement significative entre la couleur des cheveux et la couleur des yeux ; dans le cas contraire, les données ne permettent pas de rejeter l’indépendance. La condition de validité du test (effectifs théoriques suffisants) peut être vérifiée en inspectant l’objet test_chisq_hairEye$expected.

9 Exercice 5 – ANOVA à un facteur : température selon le mois

9.1 Hypothèses du test

L’ANOVA à un facteur teste l’hypothèse nulle H0 : les moyennes de la variable quantitative sont égales entre tous les groupes (ici, les mois), contre H1 : au moins une moyenne diffère des autres. Ce test suppose la normalité des résidus au sein de chaque groupe, l’homogénéité des variances entre groupes (homoscédasticité) et l’indépendance des observations.

9.2 Transformation et visualisation

# Transformation de Month en facteur pour l'ANOVA et les graphiques
airquality_mois <- airquality
airquality_mois$Month <- factor(airquality_mois$Month,
                                 labels = c("Mai", "Juin", "Juillet", "Août", "Septembre"))

ggplot(airquality_mois, aes(Month, Temp)) +
  geom_boxplot(fill = "#E2EFDA") +
  labs(title = "Température par mois", x = "Mois", y = "Température (°F)") +
  theme_minimal()
Répartition de la température par mois

Répartition de la température par mois

Interprétation graphique : les boîtes à moustaches suggèrent déjà visuellement si les niveaux de température diffèrent d’un mois à l’autre, ce que l’ANOVA permettra de confirmer statistiquement.

9.3 Réalisation de l’ANOVA

mod_anova <- aov(Temp ~ Month, data = airquality_mois)
summary(mod_anova)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## Month         4   7061  1765.3   39.85 <2e-16 ***
## Residuals   148   6557    44.3                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
resume_anova <- summary(mod_anova)[[1]]

data.frame(
  Source = "Month",
  ddl = resume_anova["Month", "Df"],
  F_valeur = round(resume_anova["Month", "F value"], 2),
  p_valeur = format.pval(resume_anova["Month", "Pr(>F)"], digits = 3)
) %>%
  kable(caption = "Résultat synthétique de l'ANOVA (Temp ~ Month)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Résultat synthétique de l’ANOVA (Temp ~ Month)
Source ddl F_valeur p_valeur
Month 4 39.85 <2e-16

Interprétation : la statistique de Fisher et la p-valeur associée permettent de conclure, au risque de 5 %, sur l’égalité ou non des températures moyennes selon les mois. Une p-valeur inférieure à 0,05 conduit à rejeter H0 et à conclure que la température moyenne varie significativement selon le mois, ce qui est cohérent avec le cycle saisonnier attendu entre mai et septembre. Ce résultat ne permet toutefois pas d’identifier précisément quels mois diffèrent entre eux : un test post-hoc (par exemple TukeyHSD()) serait nécessaire pour une comparaison deux à deux.

10 Exercice 6 – Synthèse et transposition vers des données de projet

10.1 Objectif

Cet exercice invite chaque étudiant à transposer la démarche de statistique descriptive développée dans ce TD à ses propres données de projet. La méthode générale, indépendamment du jeu de données considéré, se décline en quatre étapes reproductibles sous R :

# Demarche generale transposable a d'autres jeux de donnees :

# 1. Identifier le type de chaque variable (quantitative ou qualitative)
glimpse(mes_donnees)

# 2. Produire des indicateurs univaries pertinents
#    - pour une variable quantitative : moyenne, mediane, ecart-type
#    - pour une variable qualitative  : tableau d'effectifs et de frequences
summary(mes_donnees)

# 3. Mesurer une liaison bivariee adaptee aux types de variables
#    - deux variables quantitatives : correlation (Pearson / Spearman)
#    - deux variables qualitatives  : test du khi-deux
#    - une quantitative x une qualitative : ANOVA a un facteur

# 4. Rediger une interpretation statistique, puis, si pertinent,
#    une lecture metier (genie civil, environnement, etc.)

Remarque méthodologique : ce bloc de code n’est pas exécuté (eval = FALSE) car il constitue un canevas générique destiné à être adapté par chaque étudiant à ses propres données de projet, et non un traitement appliqué au jeu airquality. L’application concrète de cette démarche à un jeu de données de génie civil est développée dans l’Exercice 7 ci-après.

11 Exercice 7 – Application GC-BTP : essais sur béton

11.1 Objectifs de l’exercice

Cet exercice applique la démarche de statistique descriptive et exploratoire à un jeu de données propre au génie civil, portant sur des essais réalisés sur des éprouvettes de béton. Il s’agit de : (i) décrire la résistance à la compression et le rapport eau/ciment ; (ii) étudier la corrélation entre ces deux variables ; (iii) tester l’association entre la présence de pathologies et le type de granulat.

Remarque : le fichier TD_genie_civil.xlsx n’a pas été trouvé lors de la compilation de ce document. Le code ci-dessous reste présent et s’exécutera automatiquement, avec les résultats numériques calculés par R, dès que le fichier sera placé dans le dossier du projet.

11.2 Description des variables resistance_MPa et rapport_eau_ciment

if (donnees_beton_disponibles) {
  summary(beton[, c("resistance_MPa", "rapport_eau_ciment")])
}
if (donnees_beton_disponibles) {
  tab_beton_indic <- beton %>%
    summarise(
      Moyenne_resistance   = mean(resistance_MPa, na.rm = TRUE),
      Mediane_resistance   = median(resistance_MPa, na.rm = TRUE),
      Ecart_type_resistance = sd(resistance_MPa, na.rm = TRUE),
      Moyenne_EC   = mean(rapport_eau_ciment, na.rm = TRUE),
      Mediane_EC   = median(rapport_eau_ciment, na.rm = TRUE),
      Ecart_type_EC = sd(rapport_eau_ciment, na.rm = TRUE)
    ) %>%
    round(2)

  tab_beton_indic %>%
    kable(caption = "Indicateurs descriptifs : résistance (MPa) et rapport E/C") %>%
    kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
}
if (donnees_beton_disponibles) {
  p1 <- ggplot(beton, aes(y = resistance_MPa)) +
    geom_boxplot(fill = "#DEEAF1", na.rm = TRUE) +
    labs(title = "Résistance à la compression", y = "Résistance (MPa)") +
    theme_minimal()

  p2 <- ggplot(beton, aes(y = rapport_eau_ciment)) +
    geom_boxplot(fill = "#E2EFDA", na.rm = TRUE) +
    labs(title = "Rapport eau/ciment", y = "E/C") +
    theme_minimal()

  gridExtra_disponible <- requireNamespace("gridExtra", quietly = TRUE)
  if (gridExtra_disponible) {
    gridExtra::grid.arrange(p1, p2, ncol = 2)
  } else {
    print(p1)
    print(p2)
  }
}

Interprétation génie civil : la résistance à la compression est l’indicateur principal de performance mécanique du béton, tandis que le rapport eau/ciment (E/C) est un paramètre de formulation déterminant de cette résistance et de la durabilité de l’ouvrage. Une dispersion importante de la résistance au sein d’un même chantier peut signaler une hétérogénéité de fabrication (dosage, mise en œuvre, cure) à investiguer.

11.3 Corrélation résistance vs rapport eau/ciment

if (donnees_beton_disponibles) {
  test_cor_beton <- cor.test(beton$resistance_MPa, beton$rapport_eau_ciment)
  test_cor_beton
}
if (donnees_beton_disponibles) {
  ggplot(beton, aes(x = rapport_eau_ciment, y = resistance_MPa)) +
    geom_point(colour = "#1F4E79", na.rm = TRUE) +
    geom_smooth(method = "lm", se = TRUE, na.rm = TRUE) +
    labs(title = "Résistance vs rapport eau/ciment",
         x = "Rapport eau/ciment (E/C)", y = "Résistance (MPa)") +
    theme_minimal()
}

Interprétation génie civil : la loi de Feret / Abrams prévoit une décroissance de la résistance du béton lorsque le rapport eau/ciment augmente (excès d’eau générant une porosité capillaire plus importante). Le coefficient de corrélation calculé ci-dessus, s’il est négatif et significatif (p-valeur inférieure à 0,05), est cohérent avec cette relation de formulation bien établie dans la littérature. Il convient toutefois de rappeler qu’une corrélation, même conforme aux attentes théoriques, ne constitue pas à elle seule une preuve de causalité statistique : elle est ici corroborée par un mécanisme physico-chimique connu, ce qui renforce mais ne remplace pas l’interprétation statistique.

11.4 Association entre pathologie et type de granulat

if (donnees_beton_disponibles) {
  tab_patho_granulat <- table(beton$pathologie, beton$granulat)

  tab_patho_granulat %>%
    as.data.frame.matrix() %>%
    kable(caption = "Tableau de contingence : pathologie x type de granulat") %>%
    kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))

  test_chisq_beton <- chisq.test(tab_patho_granulat)
  test_chisq_beton
}

Interprétation en termes de formulation et de durabilité : si le test révèle une association significative entre la présence de pathologies et le type de granulat utilisé, cela invite à examiner de plus près la compatibilité de certains granulats avec la formulation retenue (réactivité alcali-granulat, propreté des granulats, porosité). À l’inverse, une absence d’association significative suggère que, sur cet échantillon, le type de granulat n’est pas le facteur discriminant des pathologies observées, d’autres causes (cure, rapport E/C, conditions d’exposition) devant alors être recherchées en priorité.

12 Discussion générale

Les analyses conduites dans ce TD1 illustrent la complémentarité des outils de statistique descriptive et exploratoire : les indicateurs de position et de dispersion résument l’information univariée, les représentations graphiques (histogramme, boîte à moustaches, nuage de points) permettent une lecture visuelle rapide des distributions et des liaisons, tandis que les tests statistiques (corrélation, khi-deux, ANOVA) apportent une validation formelle des observations graphiques, assortie d’un niveau de confiance quantifié.

Appliquée au jeu airquality, cette démarche met en évidence les liens attendus entre conditions météorologiques et concentration en ozone, tout en rappelant la prudence nécessaire dans l’interprétation causale. Transposée aux données de génie civil (essais sur béton), la même méthodologie permet de retrouver des relations de formulation connues (résistance et rapport eau/ciment) et d’objectiver, par un test statistique, l’existence ou non d’une association entre pathologies et granulats — une question directement utile à la maîtrise de la qualité et de la durabilité des ouvrages en béton armé.

13 Limites de l’étude

Plusieurs limites doivent être soulignées :

  • Le jeu airquality porte sur une seule station de mesure et une seule année (1973), ce qui limite la portée générale des conclusions environnementales ;
  • Les valeurs manquantes, bien que gérées par na.rm = TRUE, réduisent la taille effective de l’échantillon utilisé dans certains calculs, ce qui peut affecter la puissance des tests ;
  • Le test du khi-deux suppose des effectifs théoriques suffisants dans chaque case du tableau de contingence ; cette condition doit être vérifiée avant toute conclusion, en particulier sur des sous-échantillons de petite taille ;
  • L’ANOVA à un facteur repose sur des hypothèses de normalité et d’homoscédasticité des résidus, qui n’ont pas été formellement testées (test de Shapiro-Wilk, test de Levene) dans ce TD introductif ;
  • Concernant les données de génie civil, la taille de l’échantillon d’éprouvettes de béton et les conditions de prélèvement (nombre de chantiers, protocole d’essai) ne sont pas détaillées ici, ce qui invite à la prudence avant toute généralisation à l’ensemble d’une production de béton ;
  • Comme rappelé à plusieurs reprises, les liaisons statistiques mises en évidence (corrélation, association) ne permettent pas, à elles seules, d’établir une relation de causalité.

14 Conclusion general

Ce TD1 a permis de mettre en œuvre, sur des exemples concrets, l’ensemble des étapes fondamentales de la statistique descriptive et exploratoire sous R : prise en main de l’environnement RStudio, calcul et interprétation d’indicateurs de position et de dispersion, production de représentations graphiques avec ggplot2, et mesure de liaisons statistiques par la corrélation, le test du khi-deux et l’ANOVA à un facteur. L’application successive de cette démarche à un jeu de données environnemental (airquality) puis à un jeu de données de génie civil (essais sur béton) illustre le caractère transposable de la méthodologie statistique à des problématiques métier variées.