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.
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)# 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
decdoit correspondre au séparateur décimal réel du fichier. Utiliserdec = ","si les décimales sont séparées par des virgules (fréquent dans les fichiers européens).
Avant toute analyse, on commence toujours par explorer la structure du jeu de données.
## [1] 107
## [1] 6
## '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 ...
## 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() ?
NA's indique le nombre de données
manquantes.# 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 directementNomVariableau lieu dedata$NomVariable. À utiliser avec précaution : toujoursdetach(data)en fin d’analyse.
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.
## [1] 176.486
## [1] 177
## [1] 34.43434
## [1] 30
Interprétation :
tailleIG est la taille
moyenne des individus de l’échantillon. Elle est sensible aux valeurs
extrêmes.## [1] 77.04461
## [1] 8.777506
## [1] 156
## [1] 195
## [1] 156 195
## [1] 13
## 25%
## 170
## 75%
## 183
## 0% 25% 50% 75% 100%
## 156 170 177 183 195
## [1] 25
## 0% 25% 50% 75% 100%
## 1 20 30 45 125
Interprétation :
# 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.
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)
## sexeIG
## F M
## 41 66
## sexeIG
## F M
## 0.3831776 0.6168224
## 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.
# 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.
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 |
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 :
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 :
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.
# 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.
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.
Etape 1 : Poser les hypothèses
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\)
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.
t.test() (un échantillon)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 ?
# 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)# 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
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 |
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.
# 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.
t.test(..., paired = TRUE)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.
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.
# 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)# 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
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) |
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.
t.test(..., paired = FALSE)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.
var.equal = TRUE) c’est
l’hypothèse retenue dans ce cours.# 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 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
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) |
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%.
z.test() (package BSDA)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% ?
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é.
# 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
## [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
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%) |
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%.
| 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\) |
lm(), cor(), plot(),
abline()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() |
# 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 :
# 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 |
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.
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
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.
# 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.
| 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() |
| 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\) |
Pour toute analyse descriptive :
Pour tout test statistique :
Pour une régression :