Analyse de la variance (ANOVA) avec R : tests à un et deux facteurs avec exemples
⚡ Résumé intelligent
L'ANOVA dans R compare les moyennes de trois groupes ou plus en décomposant la variation totale en composantes inter-groupes et intra-groupes. Ce tutoriel applique des tests à un et deux facteurs à l'ensemble de données sur les poisons, vérifie les hypothèses et identifie les paires de valeurs significativement différentes à l'aide du test HSD de Tukey.

Qu'est-ce que l'ANOVA ?
Analyse de la variance L'ANOVA (analyse de la variance) est une technique statistique utilisée pour comparer les moyennes de deux groupes ou plus. Ce test fonctionne en décomposant la variation totale d'une mesure en une part expliquée par l'appartenance au groupe et une part restante correspondant au bruit aléatoire. L'ANOVA dans R indique donc si au moins une moyenne de groupe diffère des autres, sans préciser laquelle. C'est une extension directe de l'ANOVA. test t aux situations où la variable facteur comporte plus de deux niveaux.
Avant d'effectuer un test, il est utile de savoir quel membre de la famille ANOVA correspond à votre plan d'expérience.
Types de tests ANOVA dans R
L’ANOVA désigne une famille de tests plutôt qu’une procédure unique. Le choix du test approprié dépend du nombre de facteurs et de la méthode de collecte des données.
| Test | Quand l'utiliser | Appel R |
|---|---|---|
| ANOVA unidirectionnelle | Un facteur comportant trois niveaux ou plus | aov(y ~ x, données = df) |
| ANOVA bidirectionnelle | Deux facteurs indépendants | aov(y ~ x1 + x2, données = df) |
| Interaction bidirectionnelle | L'effet d'un facteur dépend de l'autre. | aov(y ~ x1 * x2, données = df) |
| ANOVA à mesures répétées | Les mêmes sujets mesurés plus d'une fois | aov(y ~ x + Erreur(sujet/x)) |
| ANCOVE | Une covariable continue doit être contrôlée pour | aov(y ~ x + covariable, données = df) |
| MANOVA | Deux variables de réponse ou plus simultanément | manova(cbind(y1, y2) ~ x) |
Ce tutoriel couvre les trois premières variantes. Les autres utilisent la même interface aov(), donc une fois que vous savez lire une table de sortie, vous pouvez toutes les lire.
ANOVA vs Test T dans R : Principales différences
Ces deux tests comparent des moyennes, il est donc important de préciser où l'un remplace l'autre.
| Critères | Test T | ANOVA |
|---|---|---|
| Nombre de groupes | Exactement deux | Deux ou plus |
| Statistique de test | t | F est égal à t au carré lorsqu'il y a deux groupes. |
| Résultat | Indique le sens de la différence | Seuls les rapports faisant état d'une différence existent |
| Un suivi est nécessaire | Aucun | Tests post hoc tels que le test HSD de Tukey |
| Fonction R | t.test() | aov() |
La tentation, avec trois groupes, est d'effectuer trois tests t distincts. Il faut y résister. Chaque test comporte un risque d'erreur de 5 %, ce qui porte le risque de faux positif à environ 14 % avec trois comparaisons. L'ANOVA répond à la même question avec un seul test, et le test HSD de Tukey gère ensuite les comparaisons deux à deux en maîtrisant le risque d'erreur. Pour le cas de deux groupes, voir la section suivante : Tutoriel sur le test t.
ANOVA unidirectionnelle
Il existe de nombreuses situations dans lesquelles vous devez comparer la moyenne entre plusieurs groupes. Par exemple, le service marketing souhaite savoir si trois équipes ont les mêmes performances commerciales.
- Équipe : 3 facteurs de niveau : A, B et C
- Vente : une mesure de performance
Le test ANOVA permet de savoir si les trois groupes ont des performances similaires.
Pour clarifier si les données proviennent de la même population, vous pouvez effectuer une analyse de variance unidirectionnelle (Désignée ci-après par l'acronyme ANOVA à un facteur). Comme tout test statistique, elle permet de déterminer si l'hypothèse nulle H0 peut être rejetée. Il est important de noter que ne pas rejeter H0 ne signifie pas la confirmer.
Hypothèse dans le test ANOVA unidirectionnel
- H0 : Les moyennes entre les groupes sont identiques
- H1 : Au moins, la moyenne d'un groupe est différente
En d'autres termes, ne pas rejeter H0 signifie qu'il n'y a pas suffisamment de preuves pour conclure qu'une moyenne de groupe diffère des autres.
Ce test est similaire au test t, mais l'ANOVA est le choix approprié lorsqu'il y a plus de deux groupes. Avec exactement deux groupes, les deux tests sont équivalents et la statistique F est égale au carré de la statistique t.
Hypothèses
L'ANOVA à un facteur repose sur trois conditions : les observations sont échantillonnées aléatoirement et sont indépendantes les unes des autres, les résidus au sein de chaque groupe suivent approximativement une loi normale et la variance est identique dans tous les groupes (homogénéité des variances). La section ci-dessous consacrée à la vérification des hypothèses explique comment tester chacune d'elles dans R.
Interpréter le test ANOVA
La statistique F est utilisée pour tester si les données proviennent de populations significativement différentes, c'est-à-dire de moyennes d'échantillon différentes.
Pour calculer la statistique F, vous devez diviser le variabilité entre les groupes au cours de la variabilité intra-groupe.
Le entre-groupes La variabilité reflète l'écart entre la moyenne de chaque groupe et la moyenne générale. Comparez les deux graphiques ci-dessous pour mieux comprendre.
Le graphique de gauche montre très peu de variation entre les trois groupes, de sorte que les moyennes des trois groupes sont proches de global signifier.
Le graphique de droite représente trois distributions très éloignées les unes des autres, sans aucun chevauchement ; l'écart entre la moyenne générale et la moyenne de chaque groupe est donc important.
Le au sein du groupe La variabilité mesure l'écart entre les observations individuelles et la moyenne de leur groupe. Certaines valeurs sont très éloignées de cette moyenne, et le terme intra-groupe traduit précisément cette dispersion, qui correspond à l'erreur d'échantillonnage.
Pour comprendre visuellement le concept de variabilité au sein du groupe, regardez le graphique ci-dessous.
La partie gauche représente la distribution de trois groupes différents. Vous avez augmenté la dispersion de chaque échantillon et il est clair que la variance individuelle est importante. La statistique F diminue, vous ne pouvez donc pas rejeter l'hypothèse nulle.
La partie droite présente des échantillons ayant les mêmes moyennes mais une dispersion beaucoup plus faible. Cela augmente la statistique F et plaide en faveur de l'hypothèse alternative.
Vous pouvez utiliser les deux mesures pour construire les statistiques F. Il est très intuitif de comprendre la statistique F. Si le numérateur augmente, cela signifie que la variabilité entre les groupes est élevée et qu'il est probable que les groupes de l'échantillon proviennent de distributions complètement différentes.
Autrement dit, une faible statistique F indique peu ou pas de différence significative entre les moyennes des groupes.
Exemple de test ANOVA unidirectionnel
Vous utiliserez l'ensemble de données sur les poisons pour mettre en œuvre le test ANOVA unidirectionnel. L'ensemble de données contient 48 lignes et 3 variables :
- Temps : Temps de survie de l'animal
- poison : Type de poison utilisé : niveau de facteur : 1,2 et 3
- traiter : Type de traitement utilisé : niveau de facteur : 1,2 et 3
Avant de commencer à calculer le test ANOVA, vous devez préparer les données comme suit :
- Étape 1 : Importer les données
- Étape 2 : Supprimez les variables inutiles
- Étape 3 : Convertir le poison variable en niveau ordonné
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/poisons.csv" df <- read.csv(PATH) %>% select(-X) %>% mutate(poison = factor(poison, ordered = TRUE)) glimpse(df)
Sortie :
## Observations: 48 ## Variables: 3 ## $ time <dbl> 0.31, 0.45, 0.46, 0.43, 0.36, 0.29, 0.40, 0.23, 0.22, 0... ## $ poison <ord> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2... ## $ treat <fctr> A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, ...
Notre objectif est de tester l’hypothèse suivante :
- H0 : Il n'y a pas de différence dans la durée moyenne de survie entre les groupes
- H1 : La moyenne des durées de survie est différente pour au moins un groupe.
Autrement dit, vous souhaitez savoir s'il existe une différence statistique entre la durée moyenne de survie selon le type de poison administré au cobaye.
Vous procéderez comme suit :
- Étape 1 : Vérifiez le format de la variable poison
- Étape 2 : Imprimez la statistique récapitulative : nombre, moyenne et écart type
- Étape 3 : Tracer une boîte à moustaches
- Étape 4 : Calculer le test ANOVA unidirectionnel
- Étape 5 : Effectuer une comparaison par paires avec Tukey HSD
Étape 1) Vérifiez les niveaux de poison avec le code ci-dessous. Vous devriez voir trois valeurs de caractères, car la fonction mutate a converti la colonne en un facteur ordonné.
levels(df$poison)
Sortie :
## [1] "1" "2" "3"
Étape 2) Vous calculez la moyenne et l’écart type.
df %>% group_by(poison) %>% summarise( count_poison = n(), mean_time = mean(time, na.rm = TRUE), sd_time = sd(time, na.rm = TRUE) )
Sortie :
## # A tibble: 3 x 4 ## poison count_poison mean_time sd_time ## <ord> <int> <dbl> <dbl> ## 1 1 16 0.617500 0.20942779 ## 2 2 16 0.544375 0.28936641 ## 3 3 16 0.276250 0.06227627
Étape 3) À la troisième étape, vous pouvez vérifier graphiquement s’il existe une différence entre les distributions. Notez que vous incluez le point instable.
ggplot(df, aes(x = poison, y = time, fill = poison)) + geom_boxplot() + geom_jitter(shape = 15, color = "steelblue", position = position_jitter(0.21)) + theme_classic()
Sortie :
Étape 4) Vous pouvez exécuter le test ANOVA unidirectionnel avec la commande aov. La syntaxe de base d'un test ANOVA est la suivante :
aov(formula, data)
Arguments:
- formula: The equation you want to estimate
- data: The dataset used
La syntaxe de la formule est :
y ~ X1+ X2+...+Xn # X1 + X2 +... refers to the independent variables y ~ . # use all the remaining variables as independent variables
Vous pouvez maintenant répondre à la question suivante : existe-t-il une différence de durée de survie entre les cobayes, compte tenu du type de poison administré ?
Stockez le modèle dans un objet et transmettez-le à summary() pour obtenir un affichage lisible des résultats.
anova_one_way <- aov(time~poison, data = df) summary(anova_one_way)
Code Explication
- aov(time ~ poison, data = df) : Exécutez le test ANOVA avec la formule suivante
- summary(anova_one_way) : Imprimer le résumé du test
Sortie :
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.033 0.5165 11.79 7.66e-05 *** ## Residuals 45 1.972 0.0438 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La p-valeur est de 7.66 × 05⁻⁵, bien inférieure au seuil habituel de 0.05, et les trois astérisques indiquent la plus forte significativité. On peut donc rejeter H0 et conclure qu'au moins un groupe de poison présente une durée de survie moyenne différente.
Comment vérifier les hypothèses de l'ANOVA dans R
La valeur p d'une ANOVA n'est fiable que si les trois conditions mentionnées précédemment sont remplies. Chacune d'elles peut être vérifiée directement dans R, et toutes les vérifications sont effectuées sur l'objet du modèle ajusté.
1. Indépendance des observations. Il s'agit d'une caractéristique du protocole expérimental, et non des données elles-mêmes ; aucun test ne peut donc y remédier. Chaque cobaye doit être mesuré une seule fois et assigné à son groupe de manière aléatoire. Si un même sujet apparaît dans plusieurs séries, un modèle à mesures répétées est nécessaire.
2. Normalité des résidus. L'ANOVA suppose que les résidus, et non les données brutes, suivent approximativement une loi normale. Examinez le graphique QQ et confirmez la normalité par le test de Shapiro-Wilk.
par(mfrow = c(2, 2)) plot(anova_one_way) # four diagnostic plots shapiro.test(residuals(anova_one_way))
Les points proches de la diagonale du graphique QQ normal indiquent des résidus normaux. Une valeur p du test de Shapiro-Wilk supérieure à 0.05 signifie qu'on ne peut pas rejeter l'hypothèse de normalité.
3. Homogénéité de la variance. Chaque groupe devrait présenter une dispersion similaire. Le graphique des résidus en fonction des valeurs ajustées devrait ressembler à une bande plate plutôt qu'à un entonnoir. Confirmez-le avec le test de Levene, plus robuste à la non-normalité que celui de Bartlett.
library(car)
leveneTest(time ~ poison, data = df)
bartlett.test(time ~ poison, data = df)
Une valeur p supérieure à 0.05 indique des variances égales.
Que faire lorsqu'une hypothèse s'avère fausse ? Si les variances sont inégales, effectuez un test d'homozygotie (ANOVA) avec correction de Welch (oneway.test(time ~ poison, data = df, var.equal = FALSE)). Si les résidus ne suivent pas une loi normale et que l'échantillon est petit, utilisez le test de rangs de Kruskal-Wallis (kruskal.test(time ~ poison, data = df)). Avec de grands échantillons équilibrés, l'ANOVA est relativement robuste aux écarts modérés à la normalité ; un résultat limite au test de Shapiro-Wilk est donc rarement problématique.
Comparaison par paire
Un test F significatif indique que les moyennes des groupes ne sont pas toutes égales, mais ne précise pas quelle paire diffère. Le test de Tukey (HSD) répond à cette question en comparant chaque paire tout en contrôlant le risque d'erreur global.
TukeyHSD(anova_one_way)
Sortie :
Lisez la sortie ligne par ligne. diff La colonne indique la différence entre les moyennes des deux groupes. lwr et en haut délimiter l'intervalle de confiance à 95 % pour cette différence, et p adj La valeur p ajustée pour les comparaisons multiples est indiquée. Deux paires diffèrent significativement lorsque leur intervalle de confiance exclut zéro, c'est-à-dire lorsque la valeur p ajustée est inférieure à 0.05. Dans cet ensemble de données, les comparaisons impliquant le poison 3 sont significatives, ce qui correspond au diagramme en boîte : le groupe 3 présente un temps de survie moyen nettement inférieur à celui des groupes 1 et 2, tandis que les groupes 1 et 2 sont statistiquement indiscernables l'un de l'autre.
ANOVA bidirectionnelle
Une ANOVA à deux facteurs ajoute un deuxième facteur à la formule. Elle fonctionne exactement comme le test à un facteur, seule la formule change :
y ~ x1 + x2
Ici, y est la variable de réponse quantitative, tandis que x1 et x2 sont tous deux des facteurs catégoriels.
Hypothèse dans le test ANOVA bidirectionnel
- H0 : Les moyennes des groupes sont égales pour les deux variables factorielles.
- H1 : Au moins une moyenne de groupe diffère, pour au moins un des deux facteurs
Vous ajoutez la variable « traitement » au modèle. Cette variable enregistre le traitement administré au cobaye. La formule additive ci-dessous teste si chaque facteur influence individuellement la durée de survie, après avoir pris en compte les autres.
Modifiez le code en ajoutant « treat » à côté de la première variable indépendante.
anova_two_way <- aov(time~poison + treat, data = df) summary(anova_two_way)
Sortie :
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.0330 0.5165 20.64 5.7e-07 *** ## treat 3 0.9212 0.3071 12.27 6.7e-06 *** ## Residuals 42 1.0509 0.0250 ## ---
Les deux valeurs p (5.7e-07 pour le poison et 6.7e-06 pour le traitement) sont bien en dessous de 0.05, vous rejetez donc H0 pour les deux facteurs et concluez que le changement du poison ou du traitement affecte le temps de survie.
Ajout d'un terme d'interaction
Le modèle additif ci-dessus suppose que l'effet du poison est identique quel que soit le traitement. Pour tester cette hypothèse, remplacez le signe plus par un astérisque, qui prend en compte à la fois les effets principaux et leur interaction :
anova_interaction <- aov(time~poison * treat, data = df) summary(anova_interaction)
Si la ligne poison:traitement n'est pas significative, le modèle additif est le meilleur choix car il utilise moins de degrés de liberté.
ANOVA dans R : Guide de référence rapide des tests
Le tableau ci-dessous répertorie chaque test utilisé ci-dessus, l'appel R qui l'exécute et l'hypothèse qu'il évalue :
| Test | Code | Hypothèse | Valeur P |
|---|---|---|---|
| ANOVA à sens unique |
aov(y ~ X, data = df)
|
H1 : La moyenne est différente pour au moins un groupe | 0.05 |
| Par paire |
TukeyHSD(ANOVA summary) |
0.05 | |
| ANOVA à deux voies |
aov(y ~ X1 + X2, data = df)
|
H1 : Au moins une moyenne de groupe diffère pour l'un ou l'autre facteur | 0.05 |




