Important : Ce guide assume que vous savez comment :

  1. Rédiger un script RMarkdown
  2. Installer et activer des packages
  3. Importer une base de données
  4. Préparer des données

Vous pouvez cliquer sur les liens ci-dessus pour consulter les guides associées.


0.1 Importer et préparer les donné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
## # … with 90 more rows

1 Test d’indépendance du chi-carré

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).


1.1 Tableau de contingence

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.


1.1.1 Tableau de proportions

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%).


1.1.2 Super tableau tout en un

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%)


1.2 Postulats

Le test d’indépendance du chi-carré comprend deux postulats :

  1. Les catégories des variables catégorielles sont mutuellement exclusives : ☑
  2. Dans au moins 80% des cellules, la fréquence attendue est supérieure ou égale à 5 : à vérifier

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é.


1.3 Faire le test

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\)).


1.3.1 Note : correction de Yates pour la continuité

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

1.4 Calculer la taille d’effet

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 :

  • \(v < 0.10\) : effet négligeable
  • \(0.10 ≤ v ≤ 0.20\) : effet faible
  • \(0.20 ≤ v ≤ 0.40\) : effet modéré
  • \(0.40 ≤ v ≤ 0.60\) : effet assez fort
  • \(v > 0.60\) : effet fort

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\)).


2 Test exact de Fisher

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%)


2.1 Posultats

Le test exact de Fisher comprend donc un seul postulat :

  1. Les catégories des variables catégorielles sont mutuellement exclusives : ☑

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.


2.2 Faire le test

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\)).