## Introduction
Ce chapitre se propose d'aller au-delà de la simple définition des paramètres statistiques en vous montrant comment les calculer et les interpréter efficacement à l'aide du logiciel **RStudio**.
Nous allons revoir les principaux paramètres de tendance centrale, de dispersion et de position, en illustrant leur calcul sur R et en soulignant leur importance dans la caractérisation d'un phénomène.
**Pré-requis :**
* Connaissances fondamentales en statistique descriptive (moyenne, médiane, variance, etc.).
* Compréhension des concepts de base du traitement statistique.
* Introduction à R et RStudio (R1) (syntaxe de base, manipulation de vecteurs et `data.frame`).
**Objectifs du chapitre :**
* Calculer les principaux paramètres de tendance centrale et de dispersion avec R.
* Interpréter ces paramètres dans un contexte concret.
* Utiliser R pour visualiser la distribution des données.
* Comprendre les notions de dispersion symétrique et asymétrique.
---
## 1. Création et exploration d’un jeu de données sous R
Dans cette section, nous allons créer un jeu de données directement dans R afin d’illustrer les premières étapes d’une analyse statistique.
Avant toute analyse, il est essentiel de disposer d’un tableau de données structuré et de vérifier sa composition (variables, types, dimensions). Cette étape constitue la base de tout travail statistique.
>[!example] Exemple : Mesure de la hauteur (en cm) de plants de blé dans différentes parcelles.
>Cet exercice a pour objectif de manipuler un jeu de données sous R afin d’en comprendre la structure et les principales caractéristiques descriptives. À partir des hauteurs de 30 plants de blé répartis dans trois parcelles, nous allons créer le tableau de données puis en réaliser une première exploration statistique
```R
# Nous avons 30 observations.
hauteur_ble <- data.frame(
Parcelle = rep(c("A", "B", "C"), each = 10),
Hauteur = c(
# Parcelle A
68, 72, 75, 70, 69, 74, 71, 73, 67, 76,
# Parcelle B
80, 78, 74, 77, 82, 79, 76, 81, 75, 83,
# Parcelle C
60, 63, 66, 64, 62, 65, 61, 67, 59, 68
)
)
# Afficher les premières lignes du jeu de données
head(hauteur_ble)
# Afficher la structure du jeu de données
str(hauteur_ble)
# Un résumé statistique rapide (très utile !)
summary(hauteur_ble)
```
> [!tip] Résultat:
>**head(hauteur_ble)**
> Parcelle Hauteur
>1 A 68
>2 A 72
>3 A 75
>4 A 70
>5 A 69
>6 A 74
>
>**str(hauteur_ble)**
'data.frame': 30 obs. of 2 variables:
$ Parcelle: chr "A" "A" "A" "A" ...
$ Hauteur : num 68 72 75 70 69 74 71 73 67 76 ...
**summary(hauteur_ble)**
Parcelle Hauteur
Length:30 Min. :59.00
> Class :character 1st Qu.:66.25
> Mode :character Median :71.50
> Mean :71.17
> 3rd Qu.:76.00
> Max. :83.00
>
---
> [!Itip] Conclusion et interprétation des fonctions descriptives
>
Les fonctions `head()`, `str()` et `summary()` permettent d’effectuer une **exploration initiale du jeu de données** avant toute analyse statistique approfondie.
>
La fonction `head()` montre que les premières observations correspondent à la parcelle A et confirme que le tableau est correctement structuré avec deux variables : une variable qualitative (_Parcelle_) et une variable quantitative (_Hauteur_).
>
La fonction `str()` indique que le jeu de données contient **30 observations et 2 variables**. La variable _Parcelle_ est de type caractère (chr) tandis que _Hauteur_ est numérique (num). Cela confirme que les données sont exploitables pour une analyse statistique, même si la variable _Parcelle_ pourrait être convertie en facteur pour des analyses comparatives.
>
La fonction `summary()` fournit une première description statistique des hauteurs. La moyenne des plants est d’environ **71 cm**, avec des valeurs comprises entre **59 cm et 83 cm**, ce qui traduit une variabilité des mesures. La moitié des observations se situe entre **66.25 cm et 76 cm**, d’après les quartiles.
## 2. Mesures de Tendance Centrale
Les mesures de tendance centrale nous informent sur le "centre" ou la valeur typique d'un ensemble de données.
### 2.1. Moyenne Arithmétique
> [!definition] Définition : Moyenne Arithmétique
> La moyenne arithmétique (ou simplement moyenne) est la somme de toutes les observations divisée par le nombre d'observations. Elle est sensible aux valeurs extrêmes (outliers).
> Pour un échantillon de $n$ observations $x_1, x_2, \dots, x_n$, la moyenne est donnée par :
> $ \bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i $
En R, la fonction `mean()` calcule la moyenne.
```R
#Création du vecteur de données
donnees <- c(12, 5, 8, 10, 3, 15)
# Calcul de la moyenne
moyenne <- mean(donnees)
# Affichage du résultat
moyenne
**Gestion des valeurs manquantes (NA)**
# Si votre jeu de données contient des NA, mean() renverra NA par défaut.
# Utilisez l'argument na.rm = TRUE pour les ignorer.
# Exemple :
# donnees_avec_na <- c(10, 12, NA, 15, 18)
# mean(donnees_avec_na) # Renvoie NA
# mean(donnees_avec_na, na.rm = TRUE) # Renvoie la moyenne des valeurs non-NA
```
### 2.2. Médiane
> [!definition] Définition : Médiane
> La médiane est la valeur qui divise un ensemble de données ordonnées en deux parties égales : 50% des observations sont inférieures ou égales à la médiane, et 50% sont supérieures ou égales. Elle est robuste aux valeurs extrêmes.
En R, la fonction `median()` calcule la médiane.
```R
# Création d'un vecteur de données
donnees <- c(12, 5, 8, 10, 3, 15)
# Calcul de la médiane
mediane <- median(donnees)
# Affichage du résultat
mediane
```
> [!note] Remarque : Comparaison Moyenne et Médiane
> Si la moyenne et la médiane sont très proches, la distribution est probablement symétrique. Si elles sont éloignées, la distribution est probablement asymétrique (skewed).
### 2.3. Mode
> [!definition] Définition : Mode
> Le mode est la ou les valeurs qui apparaissent le plus fréquemment dans un ensemble de données. Un ensemble de données peut avoir un mode (unimodal), plusieurs modes (multimodal) ou aucun mode si toutes les valeurs sont uniques. Pour des données continues, le mode est plus conceptuel et correspond au pic de la distribution de densité.
R ne possède pas de fonction `mode()` statistique intégrée pour les données numériques comme `mean()` ou `median()`. Pour les données discrètes ou catégorielles, on peut utiliser `table()`. Pour les données continues, on peut l'estimer à partir d'un histogramme ou d'une fonction de densité.
```R
calibre <- c("Petit", "Moyen", "Moyen", "Grand", "Moyen", "Petit", "Moyen")
# Tableau des fréquences
freq <- table(calibre)
# Mode (valeur la plus fréquente)
names(freq)[which.max(freq)]
```
>[!Itip] Conclusion et interprétation
>
>Dans cet exercice, la variable **calibre** est une variable qualitative catégorielle comprenant trois modalités possibles : _Petit_, _Moyen_ et _Grand_.
>
La fonction `table(calibre)` permet de construire un **tableau des fréquences**, c’est-à-dire de compter le nombre d’occurrences de chaque modalité. Cette étape est indispensable pour identifier la catégorie la plus représentée.
>
Ensuite, l’instruction :
>
`names(freq)[which.max(freq)]`
>
permet de déterminer la modalité ayant la fréquence la plus élevée.
La fonction `which.max(freq)` identifie la position de la fréquence maximale, et `names(freq)` renvoie le nom correspondant à cette modalité.
>
Le résultat obtenu est :
>
`[1] "Moyen"`
>
Cela signifie que **le calibre "Moyen" est le plus fréquent dans l’échantillon**. Il s’agit donc du **mode** de la série.
> [!note] Remarque : Classe Modale
> Pour des données continues regroupées en classes, la **classe modale** est la classe qui a la plus grande fréquence. C'est une notion plus pertinente que le mode exact pour ce type de données. L'histogramme permet de visualiser facilement cette classe.
---
## 3. Mesures de Dispersion
Les mesures de dispersion décrivent l'étalement ou la variabilité des données autour de la tendance centrale.
### 3.1. Étendue (Range)
> [!definition] Définition : Étendue
> L'étendue est la différence entre la valeur maximale et la valeur minimale d'un ensemble de données. C'est une mesure simple de la dispersion, mais très sensible aux valeurs extrêmes.
> $ \text{Étendue} = X_{\text{max}} - X_{\text{min}} $
En R, on peut utiliser `range()` ou `max()` et `min()`.
>[!example] Exemple :
**Contexte :**
À partir des données fournies, il s’agit de construire un tableau regroupant l’ensemble des variables agronomiques (présentées ci-dessous)dans un `data.frame` sous R. L’objectif est ensuite de déterminer l’étendue uniquement pour la variable **rendement**, afin d’évaluer la dispersion des performances entre les différentes parcelles.
>
>#### Définition des variables
>- **parcelle** : identifiant de la parcelle agricole (variable qualitative)
>- **rendement_t_ha** : rendement de la culture exprimé en tonnes par hectare (t/ha)
>- **pluie_mm** : quantité totale de précipitations reçues pendant la saison de culture, en millimètres (mm)
>- **azote_kg_ha** : dose d’azote appliquée sur la parcelle, en kilogrammes par hectare (kg/ha)
```R
# Création d'un data frame agronomique
donnees_agro <- data.frame(
parcelle = paste0("P", 1:6),
rendement_t_ha = c(4.2, 3.8, 5.1, 4.6, 3.5, 5.4),
pluie_mm = c(520, 480, 610, 560, 450, 630),
azote_kg_ha = c(80, 70, 100, 90, 65, 105)
)
# Affichage des données
donnees_agro
# Calcul de l'étendue du rendement (t/ha)
etendue_rendement <- max(donnees_agro$rendement_t_ha) -
min(donnees_agro$rendement_t_ha)
# Affichage du résultat
etendue_rendement
```
>[!Itip] Conclusion et interprétation
>L’étendue du rendement est égale à **1,9 t/ha**.
>Cela signifie que l’écart entre la parcelle ayant le rendement le plus faible (3,5 t/ha) et celle ayant le rendement le plus élevé (5,4 t/ha) est de 1,9 tonne par hectare. Cette valeur traduit la **dispersion** des performances agricoles entre les différentes parcelles.
### 3.2. Variance
> [!definition] Définition : Variance
> La variance mesure la dispersion des données autour de la moyenne. C'est la moyenne des carrés des écarts à la moyenne. Une variance élevée indique que les points de données sont très éloignés de la moyenne et les uns des autres.
> Pour un **échantillon**, la variance est estimée par :
> $ s^2 = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2 $
> Pour une **population**, la variance est :
> $ \sigma^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2 $
> (où $\mu$ est la moyenne de la population et $N$ la taille de la population).
En R, la fonction `var()` calcule la variance d'un échantillon (avec $n-1$ au dénominateur).
>[!example] Exemple :
>Dans cet exemple, les données de l’application précédente sont reprises afin d’approfondir l’analyse statistique. L’objectif est désormais de calculer la **variance du rendement**, afin de mesurer la dispersion des valeurs autour de la moyenne.
```R
# Calcul de la variance du rendement (échantillon)
variance_rendement <- var(donnees_agro$rendement_t_ha)
# Affichage du résultat
variance_rendement
```
>[!Itip] Conclusion et interprétation
La variance du rendement est égale à **0,547 (t/ha)²**, ce qui indique une dispersion modérée des valeurs autour de la moyenne. Ce résultat traduit une relative homogénéité des performances entre les différentes parcelles.
### 3.3. Écart-type
> [!definition] Définition : Écart-type
> L'écart-type est la racine carrée de la variance. Il est exprimé dans la même unité que la variable originale, ce qui le rend plus facile à interpréter que la variance. Il mesure la dispersion moyenne des données autour de la moyenne.
> Pour un **échantillon** :
> $ s = \sqrt{s^2} = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2} $
> Pour une **population** :
> $ \sigma = \sqrt{\sigma^2} = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2} $
En R, la fonction `sd()` calcule l'écart-type d'un échantillon.
>[!example] Exemple :
> L’objectif est désormais de calculer **l’écart-type du rendement**, afin de mesurer la dispersion des valeurs autour de la moyenne dans la même unité que la variable étudiée.
```R
# Écart-type du rendement
sd(donnees_agro$rendement_t_ha)
```
>[!Itip] Conclusion et interprétation
>L’écart-type obtenu est de **0,739 t/ha**, ce qui correspond à la valeur attendue puisqu’il s’agit de la **racine carrée de la variance** (0,547).Cela signifie qu’en moyenne, les rendements des parcelles s’écartent d’environ **0,74 tonne par hectare** par rapport au rendement moyen.
>
---
## 4. Mesures de Position (Quantiles)
Les quantiles divisent un ensemble de données ordonnées en parties égales. Les plus courants sont les quartiles (en 4 parties), les déciles (en 10 parties) et les centiles (en 100 parties).
### 4.1. Quartiles (Q1, Q2, Q3)
> [!definition] Définition : Quartiles
> Les quartiles divisent un ensemble de données ordonnées en quatre parties égales.
> * **Q1 (Premier Quartile)** : 25% des données sont inférieures ou égales à Q1.
> * **Q2 (Deuxième Quartile)** : 50% des données sont inférieures ou égales à Q2 (c'est la médiane).
> * **Q3 (Troisième Quartile)** : 75% des données sont inférieures ou égales à Q3.
En R, la fonction `quantile()` est l'outil principal.
>[!example] Exemple :
Dans cet exercice, la pression artérielle systolique (PAS) est mesurée chez plusieurs patients lors d’une consultation médicale. L’objectif est de déterminer les **quartiles** de cette variable afin d’analyser la répartition des valeurs et d’identifier les seuils correspondant aux 25 %, 50 % et 75 % des observations.
_Définition de la variable_
>- **pression_mmHg** : pression artérielle systolique mesurée en millimètres de mercure (mmHg), variable quantitative continue
```R
# Pression artérielle systolique (mmHg) chez 10 patients
pression_mmHg <- c(118, 125, 130, 110, 140, 135, 128, 122, 145, 132)
# Calcul des quartiles
quartiles <- quantile(pression_mmHg)
# Affichage des résultats
quartiles
#Pour cibler uniquement les quartiles
quantile(pression_mmHg, probs = c(0.25, 0.5, 0.75))
#La fonction `summary()` permet d’obtenir directement **Min, Q1, Médiane, Q3, Max**
# Résumé statistique
summary(pression_mmHg)
```
>[!Itip] Conclusion et interprétation
>Voici une interprétation claire et structurée des résultats obtenus.
>
>Les quartiles permettent de comprendre la répartition des valeurs de pression artérielle dans l’échantillon.
>
>- **Minimum (0 %) : 110 mmHg**
> Il s’agit de la plus faible pression mesurée dans l’échantillon.
>
>- **1er quartile (25 %) : 122,75 mmHg**
> 25 % des patients ont une pression artérielle inférieure ou égale à 122,75 mmHg. Cela signifie qu’un quart des observations se situe dans les valeurs les plus basses.
>- **Médiane (50 %) : 129 mmHg**
> La moitié des patients ont une pression inférieure ou égale à 129 mmHg, et l’autre moitié a une pression supérieure à cette valeur. La médiane représente donc la valeur centrale de la série.
>- **3e quartile (75 %) : 134,25 mmHg**
> 75 % des patients ont une pression inférieure ou égale à 134,25 mmHg. Ainsi, seulement 25 % des patients présentent une pression supérieure à cette valeur.
>- **Maximum (100 %) : 145 mmHg**
> Il s’agit de la pression la plus élevée observée.
>
>**En résumé**, la majorité des pressions artérielles se situe entre **122,75 mmHg et 134,25 mmHg**, ce qui correspond à l’intervalle interquartile et reflète la dispersion centrale des données
### 4.2. Diagramme en Boîte (Boxplot)
Le diagramme en boîte, ou *boxplot*, est une visualisation graphique très efficace pour résumer la distribution d'une variable quantitative. Il affiche la médiane, les quartiles (Q1 et Q3), l'IQR, et identifie les valeurs aberrantes potentielles.
```R
# Exercice 1 : Pression artérielle systolique (mmHg) chez 10 patients
pression_mmHg <- c(118, 125, 130, 110, 140, 135, 128, 122, 145, 132)
# Boxplot de la pression artérielle
boxplot(pression_mmHg,
main = "Boxplot de la pression artérielle systolique",
ylab = "Pression artérielle (mmHg)",
col = "lightblue")
**Explication des arguments :**
#`hauteur_ble$Hauteur` : variable quantitative représentée
#`main` : titre du graphique
# `ylab` : étiquette de l’axe vertical (unité en cm)
#`col` : couleur de remplissage de la boîte
#Exercice 2
# Sexe des patients
sexe <- c("F", "F", "M", "F", "M", "M", "F", "F", "M", "M")
# Boxplot par sexe
boxplot(pression_mmHg ~ sexe,
main = "Pression artérielle systolique selon le sexe",
xlab = "Sexe",
ylab = "Pression artérielle (mmHg)",
col = c("pink", "lightblue"))
```
> [!note] Interprétation d'un Boxplot
> * La ligne centrale de la boîte est la **médiane**.
> * Les bords de la boîte sont **Q1** et **Q3**.
> * La longueur de la boîte représente l'**IQR**.
> * Les points au-delà des moustaches sont considérés comme des **valeurs aberrantes** (outliers).
---
## 5. Analyse de la Forme de la Distribution
Au-delà des mesures de tendance centrale et de dispersion, la forme de la distribution des données est cruciale. Elle nous indique si les données sont symétriques ou asymétriques, et si elles sont plus ou moins "pointues" (aplatissement).
### 5.1. Dispersion Symétrique vs. Asymétrique (Skewness)
> [!definition] Définition : Asymétrie (Skewness)
> L'asymétrie (skewness) mesure le degré d'asymétrie d'une distribution par rapport à sa moyenne.
> * **Distribution symétrique** : Le coefficient d'asymétrie est proche de 0. Moyenne $\approx$ Médiane. (Ex: Distribution normale)
> * **Distribution asymétrique positive (queue à droite)** : Le coefficient est positif. Moyenne > Médiane.
> * **Distribution asymétrique négative (queue à gauche)** : Le coefficient est négatif. Moyenne < Médiane.
R ne propose pas de fonction `skewness()` nativement, mais le package `e1071` est très utilisé pour cela.
```R
# Contexte
#On mesure la hauteur de plantes (en cm) dans une parcelle expérimentale.
#Installation et chargement du package e1071
install.packages("e1071")
library(e1071)
# Calcul du coefficient d'asymétrie
hauteurs <- c(80, 82, 85, 87, 88, 90, 92, 95, 120)
skewness_hauteurs <- skewness(hauteurs)
skewness_hauteurs
paste("Coefficient d'asymétrie :", round(skewness_hauteurs, 2))
# Visualisation avec un histogramme pour interpréter
# Histogramme avec densité
hist(hauteurs, breaks = 6, prob = TRUE,
main = "Histogramme des hauteurs de plantes",
xlab = "Hauteur (cm)",
col = "lightgrey")
# Courbe de densité
lines(density(hauteurs), col = "red", lwd = 2)
👉La queue étirée vers les grandes valeurs** confirme l’asymétrie à droite observée avec le coefficient.
```
---
## 6. Représentations Graphiques avec R
Les graphiques sont essentiels pour visualiser la distribution des données, identifier des tendances, des valeurs aberrantes et communiquer efficacement les résultats. R offre de nombreuses fonctions graphiques de base, et des packages plus avancés comme `ggplot2` .
Nous allons utiliser les fonctions graphiques de base de R.
### 6.1. Histogramme
Un histogramme montre la distribution de fréquence d'une variable quantitative.
```R
# Jeu de données : rendement du blé (quintaux/hectare)
rendement_ble <- c(45, 48, 50, 52, 55, 58, 60, 62, 65, 70,
72, 75, 78, 80, 85)
# Histogramme du rendement du blé
hist(rendement_ble,
main = "Distribution des Rendements de Blé", # Titre du graphique
xlab = "Rendement (quintaux/hectare)", # Label de l'axe X
ylab = "Fréquence", # Label de l'axe Y
col = "lightblue", # Couleur des barres
border = "black") # Couleur des bordures
```
> [!note] Interprétation de l'histogramme
> L'histogramme permet de visualiser la forme de la distribution (symétrique, asymétrique), la présence de plusieurs modes, et l'étendue des données.
### 6.2. Diagramme en Boîte (Boxplot)
Le diagramme en boîte est excellent pour visualiser la médiane, les quartiles et les valeurs aberrantes. Il est particulièrement utile pour comparer la distribution d'une variable quantitative entre différents groupes.
```R
# Diagramme en boîte du rendement du blé
boxplot(rendement_ble,
main = "Diagramme en boîte des Rendements de Blé",
ylab = "Rendement (quintaux/hectare)",
col = "lightgreen")
```
> [!note] Composants d'un Boxplot
> - La ligne centrale de la boîte est la **médiane**.
> - Les bords de la boîte représentent le **premier quartile (Q1)** et le **troisième quartile (Q3)**.
> - Les "moustaches" s'étendent généralement jusqu'à $1.5 \times IQR$ des bords de la boîte, ou jusqu'aux valeurs minimales/maximales si elles sont à l'intérieur de cette limite.
> - Les points au-delà des moustaches sont considérés comme des **valeurs aberrantes (outliers)**.
### 6.3. Diagramme en Barres (Barplot)
Un diagramme en barres est utilisé pour représenter la fréquence ou la proportion de différentes catégories d'une variable qualitative.
```R
# Créons un exemple de données qualitatives : type de sol
type_sol <- c("Argileux", "Sableux", "Limoneux", "Argileux", "Sableux", "Limoneux", "Argileux", "Sableux", "Limoneux", "Sableux", "Argileux")
table_sol <- table(type_sol) # Compter les fréquences de chaque type de sol
print(table_sol)
barplot(table_sol,
main = "Répartition des Types de Sol",
xlab = "Type de Sol",
ylab = "Nombre d'échantillons",
col = c("brown", "tan", "grey"))
```
### 6.4. Diagramme Circulaire (Pie Chart)
Les diagrammes circulaires montrent la proportion de chaque catégorie par rapport au total. Ils sont souvent critiqués pour leur difficulté à comparer précisément les proportions, surtout avec de nombreuses catégories.
```R
# Diagramme circulaire des types de sol
pie(table_sol,
main = "Proportion des Types de Sol",
col = c("brown", "tan", "grey"))
```
> [!warning] Utilisation des Pie Charts
> Les diagrammes circulaires sont souvent déconseillés par les statisticiens pour la comparaison de proportions, car l'œil humain a du mal à comparer des angles ou des surfaces. Un diagramme en barres est généralement préférable pour des comparaisons précises.
### 6.5. Nuage de Points (Scatter Plot)
Un nuage de points est utilisé pour visualiser la relation entre deux variables quantitatives. C'est un outil essentiel en **statistique bivariée**.
```R
# Créons une deuxième variable quantitative : quantité d'engrais (en kg/hectare)
engrais <- c(100, 120, 110, 115, 130, 105, 125, 110, 128, 102, 140)
# Nuage de points entre l'engrais et le rendement
plot(engrais, rendement_ble,
main = "Rendement de Blé vs. Quantité d'Engrais",
xlab = "Quantité d'Engrais (kg/hectare)",
ylab = "Rendement (quintaux/hectare)",
col = "blue",
pch = 16) # pch = 16 pour des points pleins
```
> [!note] Interprétation du Nuage de Points
> Le nuage de points permet d'identifier visuellement s'il existe une relation (positive, négative, non linéaire) entre les deux variables, et de détecter d'éventuels points aberrants.
### 6.6 Diagramme empilé (Stacked Barplot)
Un **diagramme empilé** est une extension du diagramme en barres. Il permet de représenter **la répartition d’une variable qualitative en fonction d’une autre**, en montrant à la fois le **total** et la **composition interne** de chaque catégorie. Chaque barre correspond à une catégorie principale, et les segments empilés illustrent les sous-catégories.
Ce type de graphique est particulièrement utile pour **comparer des proportions entre groupes**, par exemple la distribution d’un résultat selon un traitement, un sexe ou une classe d’âge.
```R
# Exemple de données : réponse au traitement selon le groupe
groupe <- c("Médicament", "Médicament", "Médicament", "Placebo", "Placebo", "Placebo",
"Médicament", "Placebo", "Médicament", "Placebo")
reponse <- c("Amélioration", "Amélioration", "Pas d'amélioration",
"Amélioration", "Pas d'amélioration", "Pas d'amélioration",
"Amélioration", "Pas d'amélioration", "Amélioration", "Amélioration")
# Tableau de contingence
table_empilee <- table(groupe, reponse)
print(table_empilee)
# Diagramme en barres empilées
barplot(table_empilee,
main = "Réponse au traitement selon le groupe",
xlab = "Groupe",
ylab = "Nombre de patients",
col = c("steelblue", "orange"),
legend.text = TRUE)
```
### 6.7 Cas Concret : Analyse des Teneurs en Protéines dans des Aliments Transformés
Imaginons que nous travaillons pour une entreprise agroalimentaire qui produit des barres protéinées. Nous voulons analyser la teneur en protéines (en grammes pour 100g) de différents lots de production, ainsi que comparer la performance de deux fournisseurs de matière première (protéine de lactosérum).
Nous avons collecté des données pour 20 barres, en notant le fournisseur et la teneur en protéines.
```R
# Création du jeu de données
fournisseur <- c(rep("A", 10), rep("B", 10))
teneur_proteines <- c(22.5, 23.1, 21.9, 22.8, 23.5, 22.0, 22.7, 23.0, 22.9, 23.2,
21.0, 21.5, 20.8, 21.2, 21.8, 20.5, 21.4, 21.1, 21.6, 20.9)
# Création d'un dataframe (structure de données tabulaire)
df_proteines <- data.frame(Fournisseur = fournisseur, Teneur = teneur_proteines)
print(df_proteines)
```
Calculons les statistiques descriptives pour l'ensemble des teneurs en protéines.
```R
# Résumé global
summary(df_proteines$Teneur)
# Moyenne et écart-type
mean(df_proteines$Teneur)
sd(df_proteines$Teneur)
```
Il est souvent plus intéressant de comparer les statistiques descriptives entre les groupes.
```R
# Statistiques par fournisseur
# Utilisation de la fonction aggregate()
stats_par_fournisseur <- aggregate(Teneur ~ Fournisseur, data = df_proteines,
FUN = function(x) c(Moyenne = mean(x), Mediane = median(x), EcartType = sd(x), Min = min(x), Max = max(x), IQR = IQR(x)))
print(stats_par_fournisseur)
```
> [!note] Interprétation des statistiques par groupe
> En observant les résultats, nous pouvons déjà voir que le Fournisseur A semble fournir une matière première avec une teneur moyenne en protéines légèrement plus élevée et potentiellement moins variable que le Fournisseur B.
Pour visualiser ces différences, les boxplots sont particulièrement efficaces.
```R
# Boxplot comparatif des teneurs en protéines par fournisseur
boxplot(Teneur ~ Fournisseur, data = df_proteines,
main = "Teneur en Protéines par Fournisseur",
xlab = "Fournisseur",
ylab = "Teneur en Protéines (g/100g)",
col = c("orange", "purple"))
# Ajout de points pour voir la distribution individuelle
stripchart(Teneur ~ Fournisseur, data = df_proteines,
method = "jitter", add = TRUE, col = "darkgrey", pch = 1)
```
> [!example] Analyse du Boxplot
> Le boxplot confirme visuellement que :
> - La médiane et la moyenne (ligne dans la boîte) du Fournisseur A sont plus élevées.
> - La dispersion (longueur de la boîte et des moustaches) semble légèrement plus faible pour le Fournisseur A.
> - Il n'y a pas de valeurs aberrantes évidentes dans cet échantillon.
> Cette visualisation rapide nous permet de prendre des décisions préliminaires sur la qualité des fournisseurs.
Histogrammes par Fournisseur (pour une vue plus détaillée de la distribution)
```R
# Séparer les données par fournisseur
teneur_A <- df_proteines$Teneur[df_proteines$Fournisseur == "A"]
teneur_B <- df_proteines$Teneur[df_proteines$Fournisseur == "B"]
# Définir une plage commune pour les axes X pour faciliter la comparaison
range_teneur <- range(df_proteines$Teneur)
# Histogramme pour le fournisseur A
hist(teneur_A,
main = "Distribution des Teneurs (Fournisseur A)",
xlab = "Teneur en Protéines (g/100g)",
ylab = "Fréquence",
col = "orange",
xlim = range_teneur, # Utiliser la même échelle X
breaks = 5) # Nombre de classes
# Histogramme pour le fournisseur B
hist(teneur_B,
main = "Distribution des Teneurs (Fournisseur B)",
xlab = "Teneur en Protéines (g/100g)",
ylab = "Fréquence",
col = "purple",
xlim = range_teneur, # Utiliser la même échelle X
breaks = 5) # Nombre de classes
```
## 📜 Historique
- Dernière mise à jour : `16 Février 2026`
- Rédigé par : [[Ferdaous BOUGHATTAS]]