Important : Ce guide assume que vous savez comment :
Vous pouvez cliquer sur les liens ci-dessus pour consulter les guides associées.
Voici la syntaxe nécessaire pour suivre les exemples de ce guide :
# Packages
library(readr)
library(tibble)
library(dplyr)
library(crosstable)
library(DescTools)
library(effectsize)
# Importer les données (data_visualisation.csv)
donnees_brutes <- read_csv("folder path")
# Préparer les données
df <- tibble(id = 1:nrow(donnees_brutes))
df$intervention <- factor(donnees_brutes$Intervention,
levels = c(1,2),
labels = c("BPS",
"Contrôle"))
df$genre <- factor(donnees_brutes$Genre,
levels = c(1,2),
labels = c("Homme",
"Femme"))
df$education <- factor(donnees_brutes$Education,
levels = c(2,3,4),
labels = c("Baccalauréat",
"Maîtrise",
"Doctorat"))
Pour suivre les exemples dans ce guide, vous devrez donc :
1. avoir téléchargé le fichier data_visualisation.csv
sur
Studium
2. noter le "folder path"
3. exécuter la syntaxe ci-dessus (en changeant le
"folder path"
).
Voici à quoi devrait ressembler votre banque de données après l’étape de préparation :
df
## # A tibble: 100 × 4
## id intervention genre education
## <int> <fct> <fct> <fct>
## 1 1 BPS Femme Baccalauréat
## 2 2 Contrôle Femme Baccalauréat
## 3 3 BPS Femme Baccalauréat
## 4 4 Contrôle Femme Baccalauréat
## 5 5 BPS Femme Baccalauréat
## 6 6 Contrôle Femme Baccalauréat
## 7 7 BPS Femme Baccalauréat
## 8 8 BPS Femme Baccalauréat
## 9 9 BPS Homme Baccalauréat
## 10 10 Contrôle Femme Baccalauréat
## # ℹ 90 more rows
Le test du chi-carré (ou \(\chi^2\)) est une méthode statistique qui permet de déterminer si deux variables catégorielles sont indépendantes l’une de l’autre ou non.
Pour cet exemple, nous testerons l’indépendance entre le groupe
d’intervention (variable catégorielle à deux niveaux : BPS
ou Contrôle
) et le genre (variable catégorielle à deux
niveaux : Homme
ou Femme
).
Pour voir à quoi ressemble la relation entre deux variables discrètes/catégorielles, il est commun d’utiliser un tableau de contingence. Un tableau de contingence, également appelé tableau croisé ou tableau de fréquence croisée, est un tableau qui résume la distribution conjointe de deux variables catégorielles. Le tableau de contingence est généralement présenté sous forme de tableau à deux entrées, où chaque entrée correspond à une combinaison de valeurs des deux variables étudiées. Les fréquences (ou effectifs) observées pour chaque combinaison sont inscrites dans les cellules du tableau.
Pour obtenir le tableau de contingence dans R, nous utiliserons la
fonction table()
du package R de base. J’utilise également
la fonction addmargins()
du package stats
pour
obtenir les fréquences marginales (fréquences totales par colonne ou
rangé). Enfin, j’utilise l’opérateur %>%
(présenté dans
la section 1.1 du guide Comparer des
moyennes) et la fonction select()
du package
dplyr
pour rendre le code plus lisible. Voici la syntaxe
:
library(dplyr)
df %>%
select(genre, intervention) %>%
table() %>%
addmargins()
## intervention
## genre BPS Contrôle Sum
## Homme 13 14 27
## Femme 35 38 73
## Sum 48 52 100
Dans cet exemple, les deux variables étudiées sont le genre et le groupe expérimental (intervention ou contrôle). Le tableau de contingence montre le nombre de femmes et d’hommes pour chaque groupe expérimentale.
Un tableau de proportions est un type de tableau statistique qui présente les proportions ou les pourcentages des observations dans différentes catégories d’une variable ou à travers les intersections de deux variables.
En général, un tableau de proportions est une alternative intéressante aux tableaux de contingence qui présentent des effectifs ou des fréquences, car il permet une comparaison plus facile entre différentes tailles d’échantillon et facilite la visualisation des résultats.
Si vous souhaitez que les cellules indiquent les proportions
d’observations (pourcentage) plutôt que le nombre d’observations
(fréquences/effectifs), il est possible d’ajouter la fonction
proportions()
du package de base au code de l’exemple
précédent. Voici la syntaxe :
library(dplyr)
df %>%
select(genre, intervention) %>%
table() %>%
proportions() %>%
addmargins()
## intervention
## genre BPS Contrôle Sum
## Homme 0.13 0.14 0.27
## Femme 0.35 0.38 0.73
## Sum 0.48 0.52 1.00
Dans cet exemple, les proportions sont présentées sous forme de décimales, mais elles peuvent également être présentées sous forme de pourcentages en multipliant par 100.
La fonction proportions()
permet également d’obtenir les
proportions relatives à l’aide de l’argument margin =
. Dans
ce type de tableau, les pourcentages indiquent la proportion de chaque
catégorie d’une variable par rapport à la totalité de chaque rangé (ou
colonne). Par exemple :
library(dplyr)
df %>%
select(genre, intervention) %>%
table() %>%
proportions(margin = "intervention") %>%
addmargins(margin = 1) # « margin = 1 » permt d'afficher le total par colonne uniquement
## intervention
## genre BPS Contrôle
## Homme 0.2708333 0.2692308
## Femme 0.7291667 0.7307692
## Sum 1.0000000 1.0000000
Comme vous pouvez le constater, la somme des proportions de chaque colonnes cumul à 1 (ou 100%).
Pour obtenir un tableau de contingence plus détaillé (et plus
agréable à regarder), il est également possible d’utiliser les fonctions
crosstable()
et as_flextable()
du package
crosstable
:
library(dplyr)
library(crosstable)
df %>%
select(genre, intervention) %>%
crosstable(by = intervention, total = "both") %>%
as_flextable()
label | variable | intervention | Total | |
---|---|---|---|---|
BPS | Contrôle | |||
genre | Homme | 13 (48.15%) | 14 (51.85%) | 27 (27.00%) |
Femme | 35 (47.95%) | 38 (52.05%) | 73 (73.00%) | |
Total | 48 (48.00%) | 52 (52.00%) | 100 (100.00%) |
Le test d’indépendance du chi-carré comprend deux postulats :
Les fréquences attendues représente le produit des proportions
marginales du tableau de contingence des variables genre
et
intervention
. Pour obtenir ces fréquences attendues, nous
pouvons utiliser la fonction table()
du package de base et
la fonction ExpFreq()
du package DescTools
.
Comme pour le bloc de code précédent, j’utilise l’opérateur
%>%
et la fonction select()
du package
dplyr
pour simplifier la syntaxe :
library(dplyr)
library(DescTools)
df %>%
select(genre, intervention) %>%
table() %>%
ExpFreq()
## intervention
## genre BPS Contrôle
## Homme 12.96 14.04
## Femme 35.04 37.96
Aucune des cellules n’indiquent une fréquence attendue inférieure à ou égale à 5. Nous pouvons donc procéder avec le test du chi-carré.
La fonction chisq.test()
permet de performer le test du
chi-carré dans R. Cette fonction nécessite de spécifier les deux
variables catégorielles dont on souhaite tester l’indépendance :
chisq.test(df$genre, df$intervention)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: df$genre and df$intervention
## X-squared = 0, df = 1, p-value = 1
On peut conclure que l’association entre l’attribution au groupe d’intervention ou au groupe contrôle et le genre n’est pas significative (\(\chi^2(1) = 0; p = 1\)).
Par défaut, la fonction chisq.test()
applique la
correction de Yates pour la continuité (voir cet
article wikipedia pour plus d’information). Il est possible de ne
pas appliquer cette correction en assignant FALSE
à
l’argument correct
, comme ceci :
chisq.test(df$genre, df$intervention,
correct = FALSE)
##
## Pearson's Chi-squared test
##
## data: df$genre and df$intervention
## X-squared = 0.00032523, df = 1, p-value = 0.9856
Puisque le chi-carré n’est pas significatif, la taille d’effet n’est pas interprétable. Toutefois, pour les besoins de ce guide, je vous montre tout de même comment obtenir la taille d’effet.
L’indice de taille d’effet généralement rapporté pour un test de
chi-carré est le V de Cramer. Cet indice peut être obtenu à l’aide de la
fonction cramers_v()
du package effectsize
:
library(effectsize)
cramers_v(df$genre, df$intervention)
## Cramer's V (adj.) | 95% CI
## --------------------------------
## 0.00 | [0.00, 1.00]
##
## - One-sided CIs: upper bound fixed at [1.00].
Voici les critères d’interprétation du V de Cramer :
Si l’association entre le genre et le groupe d’intervention avait été significative, nous aurions conclu qu’elle correspond à une taille d’effet négligeable (\(v ≈ 0,00\)).
Comme pour le test du chi-carré, le test exact de Fisher permet de déterminer si deux variables catégorielles sont indépendantes l’une de l’autre ou non. La principale différence est que le test exact de Fisher est basé sur la distribution hypergéométrique et peut être utilisé lorsque les conditions d’application du test du chi-carré ne sont pas satisfaites (fréquences attendues ≥ 5 dans au moins 80% des cellules).
Pour cet exemple, nous testerons l’indépendance entre le niveau
d’éducation des participants (variable catégorielle à trois niveaux :
Baccalauréat
, Maîtrise
ou
Doctorat
) et le genre (variable catégorielle à deux niveaux
: Homme
ou Femme
). Voici à quoi ressemble les
données :
library(dplyr)
library(crosstable)
df %>%
select(genre, education) %>%
crosstable(by = genre, total = "both") %>%
as_flextable()
label | variable | genre | Total | |
---|---|---|---|---|
Homme | Femme | |||
education | Baccalauréat | 19 (26.76%) | 52 (73.24%) | 71 (71.00%) |
Maîtrise | 7 (26.92%) | 19 (73.08%) | 26 (26.00%) | |
Doctorat | 1 (33.33%) | 2 (66.67%) | 3 (3.00%) | |
Total | 27 (27.00%) | 73 (73.00%) | 100 (100.00%) |
Le test exact de Fisher comprend donc un seul postulat :
Dans ce cas-ci, ont peut confirmer que le test exact de Fisher est plus appropriés que le chi-carré en générant les fréquences attendues :
library(dplyr)
library(DescTools)
df %>%
select(genre, education) %>%
table() %>%
ExpFreq()
## education
## genre Baccalauréat Maîtrise Doctorat
## Homme 19.17 7.02 0.81
## Femme 51.83 18.98 2.19
En effet, puisqu’une faible proportion des participants ont un
doctorat, la fréquence attendue des cellules correspondant à de ce
niveau de la variable education
est inférieur à 5.
Pour exécuter le test exact de Fisher dans R, vous pouvez utiliser la
fonction fisher.test()
qui est incluse dans le package
stats
. Voici la syntaxe générale de cette fonction :
fisher.test(df$genre, df$education)
##
## Fisher's Exact Test for Count Data
##
## data: df$genre and df$education
## p-value = 1
## alternative hypothesis: two.sided
On peut conclure que l’association entre le genre et l’éducation n’est pas significative (\(p = 1\)).