# Nettoyer l'environnement avant de commencer
rm(list = ls())

1 Introduction

Ce guide pratique de statistique avec R s’appuie sur les cours, travaux dirigés (TD) et travaux pratiques (TP) suivis à l’ULiège dans le master spécialisé en Gestion des Risques et des Catastrophes à l’ère de l’Anthropocène (GRCA), année académique 2025-2026. Je l’ai d’abord écrit pour réviser mes examens, et je le partage tel quel : il pourra servir aux promotions suivantes comme à toute personne qui débute l’analyse statistique sous R. Chaque notion y est présentée de la même façon : un bloc de code commenté, sa sortie, puis une interprétation rédigée.

Une précision importante : ce guide est une simplification à visée de révision. Le cours et les travaux pratiques dont il est issu sont nettement plus complets et détaillés ; je n’en retiens ici que l’essentiel directement opérationnel, pour réviser vite et bien.

Règle d’or : ce document ne mobilise que les fonctions et packages présentés par les enseignants durant les travaux dirigés. Aucune fonction externe n’est introduite.


2 Mise en place

2.1 Chargement des packages

Les packages suivants doivent être chargés à chaque nouvelle session R. L’installation (install.packages) ne se fait qu’une seule fois.

# Installation (à faire une seule fois, laisser en commentaire ensuite)
# install.packages("timeDate")
# install.packages("qboxplot")
# install.packages("BSDA")

# Chargement des packages
library(timeDate)   # fonctions de dates et distributions
library(qboxplot)   # boîtes à moustaches par quantiles
library(BSDA)       # test z sur une proportion (z.test)

2.2 Importation des données

# Importation de la base de données principale
# header = TRUE  : la 1ère ligne contient les noms des colonnes
# sep = "\t"     : les colonnes sont séparées par une tabulation
# dec = "."      : le séparateur décimal est le point

data <- read.table(
  file   = "data/DataIGEx.txt",
  header = TRUE,
  sep    = "\t",
  dec    = "."
)

⚠️ Attention : L’argument dec doit correspondre au séparateur décimal réel du fichier. Utiliser dec = "," si les décimales sont séparées par des virgules (fréquent dans les fichiers européens).

2.3 Première exploration du jeu de données

Avant toute analyse, on commence toujours par explorer la structure du jeu de données.

# Nombre de lignes (individus) et de colonnes (variables)
nrow(data)   # nombre d'individus
## [1] 107
ncol(data)   # nombre de variables
## [1] 6
# Structure détaillée : type de chaque variable
str(data)
## 'data.frame':    107 obs. of  6 variables:
##  $ sexeIG     : chr  "F" "F" "F" "M" ...
##  $ tailleIG   : int  165 175 163 169 159 190 175 186 180 168 ...
##  $ poidsIG    : int  50 68 62 56 46 80 80 70 70 48 ...
##  $ enfantsIG  : int  2 3 3 3 3 4 2 1 2 3 ...
##  $ sentimentIG: chr  "Cat2" "Cat4" "Cat1" "Cat2" ...
##  $ trajetIG   : int  60 20 70 15 30 40 20 40 20 25 ...
# Résumé statistique rapide de toutes les variables
summary(data)
##     sexeIG             tailleIG        poidsIG         enfantsIG    
##  Length:107         Min.   :156.0   Min.   : 46.00   Min.   :1.000  
##  Class :character   1st Qu.:170.0   1st Qu.: 57.00   1st Qu.:2.000  
##  Mode  :character   Median :177.0   Median : 68.00   Median :3.000  
##                     Mean   :176.5   Mean   : 66.54   Mean   :2.645  
##                     3rd Qu.:183.0   3rd Qu.: 73.50   3rd Qu.:3.000  
##                     Max.   :195.0   Max.   :115.00   Max.   :6.000  
##                                                                     
##  sentimentIG           trajetIG     
##  Length:107         Min.   :  1.00  
##  Class :character   1st Qu.: 20.00  
##  Mode  :character   Median : 30.00  
##                     Mean   : 34.43  
##                     3rd Qu.: 45.00  
##                     Max.   :125.00  
##                     NA's   :8

Comment lire str() ?

Symbole Signification
int Variable entière (quantitative discrète)
num Variable numérique (quantitative continue)
chr Chaîne de caractères (qualitative non encore déclarée)
Factor Variable qualitative (catégorielle)

Comment lire summary() ?

  • Pour une variable quantitative : affiche le min, max, médiane, moyenne, et les quartiles Q1 et Q3.
  • Pour une variable qualitative (Factor) : affiche le nombre d’observations par modalité.
  • La mention NA's indique le nombre de données manquantes.

2.4 Accès aux variables et aux données

# Rendre les variables directement accessibles par leur nom
attach(data)

# Sélectionner des colonnes spécifiques
# data[, c("var1", "var2")] retourne un sous-tableau
# data[condition, ] retourne les lignes vérifiant une condition

# Exemple : extraire une sous-population
# data[Province == "Liege", ]

💡 La fonction attach(data) permet d’appeler directement NomVariable au lieu de data$NomVariable. À utiliser avec précaution : toujours detach(data) en fin d’analyse.


3 Statistique descriptive univariée

Avant toute analyse, il faut identifier le type de chaque variable, car le type détermine les résumés et graphiques appropriés.

Type de variable Exemples Résumés appropriés
Quantitative continue taille, poids, trajet moyenne, écart-type, histogramme
Quantitative discrète nombre d’enfants moyenne, médiane, histogramme
Qualitative sexe, sentiment effectifs, fréquences, diagramme en barres

ATTENTION : R n’empêche pas d’appliquer une fonction inappropriée à une variable. C’est à l’analyste de choisir correctement.


3.1 Variables quantitatives : Mesures de tendance centrale

# Moyenne
mean(tailleIG)
## [1] 176.486
# Médiane
median(tailleIG)
## [1] 177
# Moyenne en ignorant les données manquantes (si NA présents)
mean(trajetIG, na.rm = TRUE)
## [1] 34.43434
median(trajetIG, na.rm = TRUE)
## [1] 30

Interprétation :

  • La moyenne de tailleIG est la taille moyenne des individus de l’échantillon. Elle est sensible aux valeurs extrêmes.
  • La médiane est la valeur qui sépare l’échantillon en deux moitiés égales. Elle est plus robuste aux valeurs extrêmes.
  • Lorsque moyenne et médiane sont proches, la distribution est approximativement symétrique.

3.2 Variables quantitatives : Mesures de dispersion

# Variance
var(tailleIG)
## [1] 77.04461
# Ecart-type (racine carrée de la variance)
sd(tailleIG)
## [1] 8.777506
# Etendue : min et max
min(tailleIG)
## [1] 156
max(tailleIG)
## [1] 195
range(tailleIG)   # affiche les deux ensemble
## [1] 156 195
# Ecart interquartile (Q3 - Q1)
IQR(tailleIG)
## [1] 13
# Quantiles : Q1 (25%) et Q3 (75%)
quantile(tailleIG, 0.25)
## 25% 
## 170
quantile(tailleIG, 0.75)
## 75% 
## 183
# Tous les quartiles d'un coup
quantile(tailleIG)
##   0%  25%  50%  75% 100% 
##  156  170  177  183  195
# Avec données manquantes
IQR(trajetIG, na.rm = TRUE)
## [1] 25
quantile(trajetIG, na.rm = TRUE)
##   0%  25%  50%  75% 100% 
##    1   20   30   45  125

Interprétation :

  • L’écart-type mesure la dispersion moyenne autour de la moyenne. Un écart-type élevé signifie que les valeurs sont très dispersées.
  • L’écart interquartile (IQR) mesure la dispersion du coeur de la distribution (les 50% centraux). Il n’est pas affecté par les valeurs extrêmes.
  • Les quantiles indiquent que X% des individus ont une valeur inférieure ou égale à ce seuil. Par exemple, Q1 = 170 signifie que 25% des individus mesurent 170 cm ou moins.

3.3 Variables quantitatives : Représentations graphiques

3.3.1 L’histogramme

# Histogramme simple
hist(tailleIG,
     main = "Distribution de la taille",
     xlab = "Taille (cm)",
     ylab = "Fréquence",
     col  = "steelblue")

Interprétation : L’histogramme permet de visualiser la forme de la distribution. On observe si elle est symétrique, asymétrique à gauche ou à droite, ou si elle présente plusieurs modes.

3.3.2 La boîte à moustaches (boxplot)

boxplot(tailleIG,
        main = "Boîte à moustaches de la taille",
        ylab = "Taille (cm)",
        col  = "lightgreen")

Comment lire une boîte à moustaches ?

        |          <- valeur maximale (sans valeurs aberrantes)
  ------+------
  |           |
  |           |   <- boîte = de Q1 à Q3 (50% central des données)
  |     +     |   <- trait central = médiane (Q2)
  |           |
  ------+------
        |          <- valeur minimale (sans valeurs aberrantes)
        o          <- valeurs aberrantes (points isolés)
  • La longueur de la boîte correspond à l’IQR.
  • Un trait médian décentré dans la boîte indique une asymétrie.
  • Les points isolés au-delà des moustaches sont des valeurs potentiellement aberrantes.

3.4 Variables qualitatives : Tableaux d’effectifs et de fréquences

# Tableau des effectifs (nombre d'observations par modalité)
effectifs <- table(sexeIG)
effectifs
## sexeIG
##  F  M 
## 41 66
# Tableau des fréquences relatives (proportions)
frequences <- prop.table(effectifs)
frequences
## sexeIG
##         F         M 
## 0.3831776 0.6168224
# Regrouper effectifs et fréquences dans un seul tableau
tab <- cbind(effectifs, frequences)
tab
##   effectifs frequences
## F        41  0.3831776
## M        66  0.6168224

Interprétation : Le tableau indique combien d’individus appartiennent à chaque modalité (effectifs) et quelle proportion cela représente (fréquences). Par exemple, ici frequences["F"] = 0.3831776, cela signifie que 38.31776 % des individus de l’échantillon sont des femmes.


3.5 Variables qualitatives : Représentations graphiques

# Diagramme en barres (pour les effectifs)
barplot(effectifs,
        main = "Répartition par sexe",
        xlab = "Sexe",
        ylab = "Effectif",
        col  = c("salmon", "steelblue"))

# Diagramme circulaire (camembert)
pie(effectifs,
    main   = "Répartition par sexe",
    col    = c("salmon", "steelblue"),
    labels = c("Femme (F)", "Homme (M)"))

Interprétation : Le diagramme en barres permet de comparer facilement les effectifs entre modalités. Le diagramme circulaire est utile pour visualiser les proportions relatives de chaque modalité par rapport au total.


4 Vérification de la normalité

Avant d’appliquer un test statistique sur une moyenne par exemple, il faut vérifier que la variable suit approximativement une loi normale. Deux outils graphiques sont utilisés pour cela.

Outil Fonction R Ce qu’on cherche
Histogramme + courbe normale hist() + dnorm() + lines() La courbe suit les barres
Diagramme quantile-quantile qqnorm() Les points alignés sur une droite

4.1 Histogramme avec courbe normale superposée

L’idée est de tracer l’histogramme en densité (prob = TRUE), puis d’y superposer la courbe d’une loi normale théorique ayant la même moyenne et le même écart-type que les données.

# Etape 1 : tracer l'histogramme en densité (et non en fréquences)
h <- hist(tailleIG,
          prob = TRUE,
          main = "Distribution de la taille avec courbe normale",
          xlab = "Taille (cm)",
          ylab = "Densité",
          col  = "steelblue")

# Etape 2 : créer une séquence de valeurs couvrant la plage du graphique
abscisses <- seq(h$breaks[1],
                 h$breaks[length(h$breaks)],
                 length.out = 100)

# Etape 3 : calculer les valeurs de la densité normale théorique
densiteNorm <- dnorm(abscisses,
                     mean = mean(tailleIG),
                     sd   = sd(tailleIG))

# Etape 4 : superposer la courbe normale en rouge
lines(abscisses, densiteNorm, col = "red", lwd = 2)

Explication pas à pas :

  • prob = TRUE : l’axe Y devient une densité (et non un effectif), ce qui permet de comparer avec la courbe normale théorique.
  • h$breaks : récupère les bornes des classes de l’histogramme pour définir la plage de la courbe.
  • length.out = 100 : génère 100 points pour que la courbe soit lisse.
  • dnorm() : calcule la densité d’une loi normale en chaque point, avec la moyenne et l’écart-type de nos données.
  • lines() : superpose la courbe sur le graphique existant.

Interprétation :

  • Si la courbe rouge épouse bien la forme des barres, la variable suit approximativement une loi normale : on peut appliquer un test sur la moyenne.
  • Si la courbe est très décalée par rapport aux barres (forte asymétrie, plusieurs bosses), la normalité est douteuse.

4.2 Diagramme quantile-quantile (QQ-plot)

Le QQ-plot compare les quantiles observés de la variable aux quantiles théoriques d’une loi normale. C’est le graphique de référence pour vérifier la normalité.

# QQ-plot : chaque point = un quantile observé vs quantile théorique
qqnorm(tailleIG,
       main = "QQ-plot de la taille",
       xlab = "Quantiles théoriques (loi normale)",
       ylab = "Quantiles observés")

Interprétation du QQ-plot — la règle essentielle :

  • Points alignés sur une droite diagonale : la variable suit une loi normale. On peut appliquer un test sur la moyenne.
  • Points en forme de S ou de courbe : la distribution est asymétrique, la normalité est remise en question.
  • Points très écartés aux extrémités : présence de valeurs extrêmes (queues de distribution lourdes).

En pratique à l’examen : on utilise les deux graphiques ensemble. Si l’histogramme montre une forme en cloche ET que le QQ-plot montre des points globalement alignés, on conclut à la normalité et on procède au test.


4.3 Cas avec données manquantes

# Avec une variable contenant des NA : même code, R les ignore
# automatiquement dans hist() et qqnorm()

h2 <- hist(trajetIG,
           prob = TRUE,
           main = "Distribution du trajet avec courbe normale",
           xlab = "Durée du trajet (min)",
           ylab = "Densité",
           col  = "steelblue")

abscisses2 <- seq(h2$breaks[1],
                  h2$breaks[length(h2$breaks)],
                  length.out = 100)

densiteNorm2 <- dnorm(abscisses2,
                      mean = mean(trajetIG, na.rm = TRUE),
                      sd   = sd(trajetIG,   na.rm = TRUE))

lines(abscisses2, densiteNorm2, col = "red", lwd = 2)

Note : Lorsque la variable contient des NA, il faut ajouter na.rm = TRUE dans mean() et sd() pour calculer correctement les paramètres de la courbe normale. hist() et qqnorm() ignorent les NA automatiquement.


5 Tests statistiques

Un test statistique permet de prendre une décision sur une population à partir d’un échantillon. Il repose sur un raisonnement structuré en étapes que l’on suivra systématiquement à chaque test.

5.1 La démarche générale d’un test, à appliquer à chaque fois

Etape 1 : Poser les hypothèses

  • \(H_0\) (hypothèse nulle) : l’hypothèse de départ, celle qu’on cherche à remettre en question.
  • \(H_1\) (hypothèse alternative) : ce qu’on cherche à démontrer.

Il existe trois formes possibles de \(H_1\) :

Type de test Forme de \(H_1\) alternative dans R
Unilatéral à droite \(\mu > \mu_0\) "greater"
Unilatéral à gauche \(\mu < \mu_0\) "less"
Bilatéral \(\mu \neq \mu_0\) "two.sided"

Etape 2 : Vérifier les conditions d’application

Avant tout test sur une moyenne : vérifier la normalité via l’histogramme + courbe normale et le QQ-plot (voir Partie 4).

Etape 3 : Calculer le test avec R

Etape 4 : Lire la p-valeur dans la sortie

Etape 5 : Conclure en comparant la p-valeur au seuil \(\alpha = 0{,}05\)

  • Si p-valeur \(\leq 0{,}05\) : on rejette \(H_0\) au niveau de confiance 95%. Les données fournissent suffisamment d’évidence contre \(H_0\).
  • Si p-valeur \(> 0{,}05\) : on ne rejette pas \(H_0\) au niveau de confiance 95%. Les données ne fournissent pas suffisamment d’évidence pour rejeter \(H_0\).

ATTENTION : Ne pas rejeter \(H_0\) ne signifie pas que \(H_0\) est vraie. Cela signifie seulement que l’échantillon ne fournit pas assez d’évidence pour la contredire.


5.2 Test sur une moyenne : t.test() (un échantillon)

5.2.1 Quand l’utiliser ?

On dispose d’un seul échantillon d’une variable quantitative et on veut tester si sa moyenne dans la population vaut une valeur de référence \(\mu_0\).

Exemple concret : La taille moyenne des individus dans la population est-elle différente de 175 cm ?

5.2.2 Conditions d’application

  • La variable suit approximativement une loi normale (vérifiée graphiquement en Partie 4).
  • L’écart-type de la population est inconnu (cas général).

5.2.3 Code R

# Vérification préalable de la normalité
h <- hist(tailleIG, prob = TRUE,
          main = "Verification normalite - Taille",
          xlab = "Taille (cm)", col = "steelblue")
abscisses <- seq(h$breaks[1], h$breaks[length(h$breaks)],
                 length.out = 100)
lines(abscisses, dnorm(abscisses, mean(tailleIG), sd(tailleIG)),
      col = "red", lwd = 2)

qqnorm(tailleIG, main = "QQ-plot - Taille")

# Test sur une moyenne
# x           : le vecteur de données
# mu          : la valeur testée sous H0
# alternative : sens de H1 ("two.sided", "greater", "less")

t.test(x           = tailleIG,
       mu          = 175,
       alternative = "two.sided")
## 
##  One Sample t-test
## 
## data:  tailleIG
## t = 1.7512, df = 106, p-value = 0.08281
## alternative hypothesis: true mean is not equal to 175
## 95 percent confidence interval:
##  174.8036 178.1683
## sample estimates:
## mean of x 
##   176.486

5.2.4 Décortiquer la sortie de t.test()

La sortie R ressemble à ceci :

    One Sample t-test

data:  tailleIG
t = 1.7454, df = 106, p-value = 0.08376
alternative hypothesis: true mean is not equal to 175
95 percent confidence interval:
 174.8065 178.1655
sample estimates:
mean of x
  176.486

Voici comment lire chaque ligne :

Element de la sortie Signification
t = 1.7454 Valeur de la statistique de test (pas besoin de l’interpréter directement)
df = 106 Degrés de liberté = \(n - 1\) = 107 - 1
p-value = 0.08376 La valeur clé : probabilité d’observer un résultat aussi extrême si \(H_0\) est vraie
95 percent confidence interval Intervalle dans lequel se trouve la vraie moyenne avec 95% de confiance
mean of x = 176.486 Moyenne observée dans l’échantillon

5.2.5 Interprétation complète : modèle à recopier

Contexte : On teste si la taille moyenne dans la population est différente de 175 cm, au niveau de confiance 95%.

Hypothèses : \(H_0 : \mu = 175\) contre \(H_1 : \mu \neq 175\)

Vérification des conditions : L’histogramme presente une forme approximativement en cloche et les points du QQ-plot sont globalement alignés sur une droite. La condition de normalite est satisfaite.

Décision : La p-valeur obtenue est de 0,084. Puisque \(0{,}084 > 0{,}05\), on ne rejette pas \(H_0\) au niveau de confiance 95%.

Conclusion : Les donnees ne fournissent pas suffisamment d’évidence pour affirmer que la taille moyenne dans la population est différente de 175 cm. La taille moyenne observee dans l’echantillon est de 176,5 cm, mais cet ecart n’est pas statistiquement significatif.

5.2.6 Les trois formes du test selon \(H_1\)

# Test bilateral : mu est-elle differente de 175 ?
t.test(x = tailleIG, mu = 175, alternative = "two.sided")

# Test unilateral a droite : mu est-elle superieure a 175 ?
t.test(x = tailleIG, mu = 175, alternative = "greater")

# Test unilateral a gauche : mu est-elle inferieure a 175 ?
t.test(x = tailleIG, mu = 175, alternative = "less")

Regle pratique : Le choix de alternative doit etre fait avant de regarder les donnees, sur la base du contexte du probleme. On ne choisit pas \(H_1\) apres avoir vu le resultat.


5.3 Test sur deux moyennes appariées : t.test(..., paired = TRUE)

5.3.1 Quand l’utiliser ?

On dispose de deux mesures sur les mêmes individus (avant/après, méthode A vs méthode B sur le même sujet). Les deux échantillons sont liés : chaque observation de l’un correspond à une observation de l’autre.

Exemple concret : Dans le TP2, on compare la superficie agricole et la superficie forestière des mêmes communes de la province de Luxembourg. Chaque commune fournit les deux mesures.

Comment reconnaître un échantillon apparié ? Si on peut calculer une différence individu par individu (commune 1 : foret - agri, commune 2 : foret - agri, …), alors les échantillons sont appariés.

5.3.2 Principe : on travaille sur les différences

Avec des données appariées, on calcule d’abord la différence entre les deux mesures pour chaque individu, puis on effectue un test sur une seule moyenne (celle des différences) pour tester si elle est nulle.

5.3.3 Conditions d’application

  • Les différences (et non les variables originales) doivent suivre approximativement une loi normale.
  • On vérifie cela avec l’histogramme + courbe normale et le QQ-plot appliqués à la variable des différences.

5.3.4 Code R

# Chargement de la base TP2
data2 <- read.table(file   = "data/BD_TP2.txt",
                    header = TRUE,
                    stringsAsFactors = TRUE)
attach(data2)

# Etape 1 : extraire les deux variables pour la province d'interet
SupAgr_lux <- SuperficieAgricole_Ha[Province == "Luxembourg"]
SupFor_lux <- SuperficieForestiere_Ha[Province == "Luxembourg"]

# Etape 2 : visualiser les deux groupes (boite comparative)
boxplot(SupAgr_lux, SupFor_lux,
        names = c("Superficie agricole", "Superficie forestiere"),
        main  = "Comparaison des superficies - Luxembourg",
        ylab  = "Superficie (ha)",
        col   = c("salmon", "steelblue"))

# Etape 3 : calculer les differences individu par individu
diff_For_Agr <- SupFor_lux - SupAgr_lux

# Etape 4 : verifier la normalite des DIFFERENCES
h <- hist(diff_For_Agr, prob = TRUE,
          main = "Distribution des differences (For - Agr)",
          xlab = "Difference de superficie (ha)",
          col  = "steelblue")
abscisses <- seq(h$breaks[1], h$breaks[length(h$breaks)],
                 length.out = 100)
lines(abscisses,
      dnorm(abscisses, mean(diff_For_Agr), sd(diff_For_Agr)),
      col = "red", lwd = 2)

qqnorm(diff_For_Agr,
       main = "QQ-plot des differences (For - Agr)")

# Etape 5 : effectuer le test apparié
# H0 : la difference moyenne est nulle (mu_diff = 0)
# H1 : la superficie forestiere est en moyenne superieure
#       a la superficie agricole (test unilateral a droite)
t.test(x           = SupFor_lux,
       y           = SupAgr_lux,
       alternative = "greater",
       paired      = TRUE)
## 
##  Paired t-test
## 
## data:  SupFor_lux and SupAgr_lux
## t = 3.5201, df = 34, p-value = 0.0006249
## alternative hypothesis: true mean difference is greater than 0
## 95 percent confidence interval:
##  728.8001      Inf
## sample estimates:
## mean difference 
##        1402.505

5.3.5 Décortiquons la sortie

    Paired t-test

data:  SupFor_lux and SupAgr_lux
t = 2.1871, df = 22, p-value = 0.01986
alternative hypothesis: true mean difference is greater than 0
95 percent confidence interval:
 388.3 Inf
sample estimates:
mean difference
       1818.522
Element Signification
Paired t-test Confirme que R a bien effectué un test apparié
df = 22 Degrés de liberté = \(n_{paires} - 1\)
p-value = 0.01986 La valeur clé pour la décision
mean difference = 1818.522 Différence moyenne observée (For - Agr)

5.3.6 Interprétation complète : modèle à recopier

Contexte : On teste si la superficie forestière moyenne est significativement supérieure à la superficie agricole moyenne dans les communes de la province de Luxembourg, au niveau de confiance 95%. Les données étant mesurées sur les mêmes communes, on utilise un test sur échantillons appariés.

Hypothèses : \(H_0 : \mu_{diff} = 0\) contre \(H_1 : \mu_{diff} > 0\) (où \(diff = superficie~forestière - superficie~agricole\))

Vérification des conditions : L’histogramme des différences présente une forme approximativement symétrique et les points du QQ-plot sont globalement alignés. La normalité des différences est satisfaite.

Décision : La p-valeur est de 0,020. Puisque \(0{,}020 \leq 0{,}05\), on rejette \(H_0\) au niveau de confiance 95%.

Conclusion : Les données fournissent suffisamment d’évidence pour affirmer que la superficie forestière est en moyenne supérieure à la superficie agricole dans les communes de la province de Luxembourg. La différence moyenne observée est de 1818,5 ha en faveur de la superficie forestière.


5.4 Test sur deux moyennes indépendantes : t.test(..., paired = FALSE)

5.4.1 Quand l’utiliser ?

On compare la moyenne d’une variable entre deux groupes distincts d’individus. Les deux groupes n’ont aucun lien entre eux.

Exemple concret : Comparer le pourcentage de superficie agricole entre les communes de Liège et celles de Namur.

Comment reconnaître deux échantillons indépendants ? Les individus des deux groupes sont différents et il n’existe aucune correspondance naturelle entre eux.

5.4.2 Conditions d’application

  • Chaque variable (groupe 1 et groupe 2) suit approximativement une loi normale (vérifiée par QQ-plot séparément).
  • Les variances des deux groupes sont supposées égales (var.equal = TRUE) c’est l’hypothèse retenue dans ce cours.

5.4.3 Code R

# Etape 1 : extraire les deux groupes
P_S_A_Liege <- SuperficieAgricole_Pourc[Province == "Liege"]
P_S_A_Namur <- SuperficieAgricole_Pourc[Province == "Namur"]

# Etape 2 : visualiser les deux groupes
boxplot(P_S_A_Liege, P_S_A_Namur,
        names = c("Liege", "Namur"),
        main  = "Superficie agricole (%) par province",
        ylab  = "Pourcentage (%)",
        col   = c("salmon", "steelblue"))

# Etape 3 : verifier la normalite dans CHAQUE groupe
qqnorm(P_S_A_Liege, main = "QQ-plot - Liege")

qqnorm(P_S_A_Namur, main = "QQ-plot - Namur")

# Etape 4 : effectuer le test
# paired = FALSE  : echantillons independants
# var.equal = TRUE : on suppose les variances egales
# alternative     : "two.sided", "greater" ou "less"
t.test(x           = P_S_A_Liege,
       y           = P_S_A_Namur,
       alternative = "two.sided",
       paired      = FALSE,
       var.equal   = TRUE)
## 
##  Two Sample t-test
## 
## data:  P_S_A_Liege and P_S_A_Namur
## t = -0.75599, df = 105, p-value = 0.4513
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -11.138415   4.989358
## sample estimates:
## mean of x mean of y 
##  43.62711  46.70164

5.4.4 Décortiquons la sortie

    Two Sample t-test

data:  P_S_A_Liege and P_S_A_Namur
t = -1.8921, df = 50, p-value = 0.06435
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -18.627   0.596
sample estimates:
mean of x mean of y
 36.46154  45.47727
Element Signification
Two Sample t-test Confirme un test sur deux échantillons indépendants
df = 50 Degrés de liberté = \(n_1 + n_2 - 2\)
p-value = 0.06435 La valeur clé pour la décision
mean of x = 36.46 Moyenne du groupe 1 (Liège)
mean of y = 45.48 Moyenne du groupe 2 (Namur)

5.4.5 Interprétation complète — modèle à recopier

Contexte : On teste si le pourcentage moyen de superficie agricole diffère entre les communes de la province de Liège et celles de la province de Namur, au niveau de confiance 95%. Les communes étant différentes dans chaque province, on utilise un test sur échantillons indépendants.

Hypothèses : \(H_0 : \mu_{Liege} = \mu_{Namur}\) contre \(H_1 : \mu_{Liege} \neq \mu_{Namur}\)

Vérification des conditions : Les QQ-plots des deux groupes montrent des points globalement alignés sur une droite. La normalité est satisfaite dans chaque groupe.

Décision : La p-valeur est de 0,064. Puisque \(0{,}064 > 0{,}05\), on ne rejette pas \(H_0\) au niveau de confiance 95%.

Conclusion : Les données ne fournissent pas suffisamment d’évidence pour affirmer que le pourcentage moyen de superficie agricole diffère entre les communes de Liège (36,5%) et celles de Namur (45,5%). Cet écart observé n’est pas statistiquement significatif au seuil de 5%.


5.5 Test sur une proportion : z.test() (package BSDA)

5.5.1 Quand l’utiliser ?

On veut tester si la proportion d’individus présentant une certaine caractéristique dans la population vaut une valeur de référence \(p_0\).

Exemple concret : La proportion de communes classées “urbaines” est-elle supérieure à 7,3% ?

5.5.2 Conditions d’application

Avant d’effectuer le test, il faut vérifier que l’approximation normale est valide. Les deux conditions suivantes doivent être satisfaites simultanément :

\[n \times p_0 \geq 5 \quad \text{ET} \quad n \times (1 - p_0) \geq 5\]

Si l’une des deux conditions n’est pas remplie, le test z sur une proportion ne peut pas être appliqué.

5.5.3 Code R

# Etape 1 : tableau des effectifs et frequences
effectifs_cat <- table(ArtifCat)
frequences_cat <- prop.table(effectifs_cat)
tab_cat <- cbind(effectifs_cat, frequences_cat)
tab_cat
##               effectifs_cat frequences_cat
## 1_Rurale                 54     0.23788546
## 2_SemiRurale            116     0.51101322
## 3_PeriUrbaine            36     0.15859031
## 4_Urbaine                21     0.09251101
# Etape 2 : definir p0 et verifier les conditions
p0 <- 0.073
n  <- length(ArtifCat)

# Verification des conditions d'application
n * p0          # doit etre >= 5
## [1] 16.571
n * (1 - p0)    # doit etre >= 5
## [1] 210.429
# Etape 3 : creer la variable binaire (TRUE/FALSE)
# TRUE si la commune est urbaine, FALSE sinon
UrBin <- ArtifCat == "4_Urbaine"

# Etape 4 : calculer l'ecart-type sous H0
sdH0 <- sqrt(p0 * (1 - p0))

# Etape 5 : effectuer le test z
library(BSDA)
z.test(x           = UrBin,
       mu          = p0,
       sigma.x     = sdH0,
       alternative = "greater")
## 
##  One-sample z-Test
## 
## data:  UrBin
## z = 1.13, p-value = 0.1292
## alternative hypothesis: true mean is greater than 0.073
## 95 percent confidence interval:
##  0.06411119         NA
## sample estimates:
##  mean of x 
## 0.09251101

5.5.4 Décortiquons la sortie

    One-sample z-Test

data:  UrBin
z = 0.98974, p-value = 0.1611
alternative hypothesis: true mean is greater than 0.073
95 percent confidence interval:
 0.06186      NA
sample estimates:
mean of x
0.1034483
Element Signification
One-sample z-Test Test z sur une proportion (via BSDA)
z = 0.98974 Statistique de test (distribution normale)
p-value = 0.1611 La valeur clé pour la décision
mean of x = 0.1034 Proportion observée dans l’échantillon (10,3%)

5.5.5 Interprétation complète : modèle à recopier

Contexte : On teste si la proportion de communes classées “urbaines” dans la population est supérieure à 7,3%, au niveau de confiance 95%.

Hypothèses : \(H_0 : p = 0{,}073\) contre \(H_1 : p > 0{,}073\)

Vérification des conditions : \(n \times p_0 = 116 \times 0{,}073 = 8{,}47 \geq 5\) et \(n \times (1-p_0) = 116 \times 0{,}927 = 107{,}5 \geq 5\). Les deux conditions sont satisfaites, on peut appliquer le test z.

Décision : La p-valeur est de 0,161. Puisque \(0{,}161 > 0{,}05\), on ne rejette pas \(H_0\) au niveau de confiance 95%.

Conclusion : Les données ne fournissent pas suffisamment d’évidence pour affirmer que la proportion de communes urbaines est supérieure à 7,3%. La proportion observée dans l’échantillon est de 10,3%, mais cet écart n’est pas statistiquement significatif au seuil de 5%.


5.6 Tableau comparatif des quatre tests

Situation Fonction R Argument cle Condition principale
1 moyenne vs valeur de ref. t.test(x, mu) alternative Normalite de X
2 moyennes appariees t.test(x, y, paired=TRUE) alternative Normalite des differences
2 moyennes independantes t.test(x, y, paired=FALSE, var.equal=TRUE) alternative Normalite dans chaque groupe
1 proportion vs valeur de ref. z.test(x, mu, sigma.x) alternative \(np_0 \geq 5\) et \(n(1-p_0) \geq 5\)
detach(data2)

6 Régression linéaire : lm(), cor(), plot(), abline()

6.1 Quand l’utiliser ?

On cherche à étudier la relation linéaire entre deux variables quantitatives : une variable explicative (X) et une variable réponse (Y). La régression permet de quantifier et de visualiser cette relation.

Exemple concret : Dans le TP2, on cherche à savoir si le pourcentage de superficie agricole permet d’expliquer le pourcentage de revenus hauts dans les communes de Namur.

Etape Objectif Fonction R
1. Visualiser Observer la relation plot()
2. Quantifier Mesurer la force du lien cor()
3. Modéliser Obtenir l’équation de la droite lm()
4. Superposer Tracer la droite sur le nuage abline()

6.2 Etape 1 : Nuage de points

# Recharger les donnees TP2 si necessaire
data2 <- read.table(file   = "data/BD_TP2.txt",
                    header = TRUE,
                    stringsAsFactors = TRUE)
attach(data2)

# Extraire les deux variables pour la province de Namur
SupPourNamur <- SuperficieAgricole_Pourc[Province == "Namur"]
RevenuNamur  <- RevenusHauts_Pourc[Province == "Namur"]

# Nuage de points
# Le premier argument est la variable X (explicative)
# Le deuxieme argument est la variable Y (reponse)
plot(SupPourNamur, RevenuNamur,
     main = "Superficie agricole vs Revenus hauts - Namur",
     xlab = "Superficie agricole (%)",
     ylab = "Revenus hauts (%)",
     pch  = 16,
     col  = "steelblue")

Interprétation du nuage de points :

  • Si les points forment un nuage orienté vers le haut (de gauche à droite), la relation est positive : quand X augmente, Y tend à augmenter.
  • Si les points forment un nuage orienté vers le bas, la relation est négative : quand X augmente, Y tend à diminuer.
  • Si les points sont dispersés sans tendance claire, il n’y a pas de relation linéaire évidente.

6.3 Etape 2 : Coefficient de corrélation

# Coefficient de correlation de Pearson
# Mesure la force et le sens de la relation linéaire
# Valeur entre -1 et +1
cor(SupPourNamur, RevenuNamur)
## [1] 0.6755252

Comment interpréter le coefficient de corrélation \(r\) ?

Valeur de \(|r|\) Force de la relation
\(0{,}00\) à \(0{,}30\) Relation faible ou nulle
\(0{,}30\) à \(0{,}60\) Relation modérée
\(0{,}60\) à \(0{,}80\) Relation forte
\(0{,}80\) à \(1{,}00\) Relation très forte
  • Le signe de \(r\) indique le sens : positif = relation directe, négatif = relation inverse.
  • \(r = +1\) ou \(r = -1\) indique une relation linéaire parfaite.
  • \(r = 0\) indique l’absence de relation linéaire.

Exemple d’interprétation : Le coefficient de corrélation obtenu est \(r = 0{,}68\). Il existe donc une relation linéaire positive forte entre la superficie agricole et les revenus hauts dans les communes de Namur : les communes avec une superficie agricole plus importante tendent aussi a avoir une proportion plus elevee de hauts revenus.


6.4 Etape 3 : Droite de régression avec lm()

# Equation de la droite de regression
# Syntaxe : lm(Y ~ X)
# Y = variable reponse (ce qu'on cherche a expliquer)
# X = variable explicative
lm(RevenuNamur ~ SupPourNamur)
## 
## Call:
## lm(formula = RevenuNamur ~ SupPourNamur)
## 
## Coefficients:
##  (Intercept)  SupPourNamur  
##       49.408         0.339

6.4.1 Décortiquons la sortie

La sortie obtenue est :

Call:
lm(formula = RevenuNamur ~ SupPourNamur)

Coefficients:
(Intercept)  SupPourNamur
     49.408         0.339

L’équation de la droite est : \[\widehat{RevenuNamur} = 49{,}41 + 0{,}339 \times SupPourNamur\]

Coefficient Valeur Interprétation
(Intercept) = 49,41 Ordonnée à l’origine Valeur prédite de Y quand X = 0
SupPourNamur = 0,339 Pente Quand X augmente de 1 unite, Y augmente en moyenne de 0,339 unite

Interprétation de la pente : Lorsque le pourcentage de superficie agricole d’une commune de Namur augmente de 1 point, le pourcentage de revenus hauts augmente en moyenne de 0,339 point. La relation est positive, ce qui est cohérent avec le coefficient de corrélation \(r = 0{,}68\) trouve a l’etape precedente.

6.5 Etape 4 : Visualisation de la droite de régression

# Nuage de points + droite de regression superposee
plot(SupPourNamur, RevenuNamur,
     main = "Droite de regression - Namur",
     xlab = "Superficie agricole (%)",
     ylab = "Revenus hauts (%)",
     pch  = 16,
     col  = "steelblue")

# Superposer la droite de regression en rouge
abline(lm(RevenuNamur ~ SupPourNamur),
       col = "red",
       lwd = 2)

Note : abline() prend en argument le modèle lm() et trace automatiquement la droite correspondante sur le graphique existant.

detach(data2)

7 Aide-mémoire : Récapitulatif complet

7.1 Quelle analyse pour quelle variable ?

Type de variable Résumés numériques Graphiques
Quantitative mean(), median(), sd(), IQR(), quantile() hist(), boxplot()
Qualitative table(), prop.table(), cbind() barplot(), pie()
Deux variables quanti. cor(), lm() plot() + abline()

7.2 Quel test pour quelle situation ?

Question posée Test Fonction R Condition
La moyenne vaut-elle \(\mu_0\) ? t-test 1 échantillon t.test(x, mu) Normalité de X
Deux mesures sur mêmes individus : différence nulle ? t-test apparié t.test(x, y, paired=TRUE) Normalité des différences
Deux groupes distincts : mêmes moyennes ? t-test indépendants t.test(x, y, paired=FALSE, var.equal=TRUE) Normalité dans chaque groupe
La proportion vaut-elle \(p_0\) ? z-test z.test(x, mu, sigma.x) (BSDA) \(np_0 \geq 5\) et \(n(1-p_0) \geq 5\)

7.3 Checklist avant de rendre un devoir

Pour toute analyse descriptive :

Pour tout test statistique :

Pour une régression :