CAS PRATIQUE : Tests non paramétriques

MEMBRES DU GROUPES

Paul BALAFAI

Jean Luc BATABATI

Khadidiatou COULIBALY

Khadidiatou DIAKHATE

G Judicaël Oscar KAFANDO

Malick SENE

PROFESSEUR

AKAKPOVI Carlos

ISE


Etude de la relation entre les performances des élèves et le type de tuteur (guardian)

Dans cette partie, nous cherchons en savoir si les performances des élèves sont expliquées par le type de tuteur avec qui il vit.

1. Jeu de données et description

#importer la base

base <- read.csv("../data/base_education.csv", header = TRUE, sep = ";")

#base

1.1. Résumé statistique

La base de données contient 649 observations et 3 variables. Les variables sont les performances des élèves (moyenne des notes) ,le type de tuteur (guardian) et l’accèssibilité à internet. Les variables d’intérêts dans notre cas sont :

Dans notre base, il n’y a ni doublons, ni valeurs manquantes. Par conséquent, aucun besoin de nettoyage n’est nécessaire.

summary(base)
##       moy          guardian           internet        
##  Min.   : 1.33   Length:649         Length:649        
##  1st Qu.:10.00   Class :character   Class :character  
##  Median :11.67   Mode  :character   Mode  :character  
##  Mean   :11.63                                        
##  3rd Qu.:13.33                                        
##  Max.   :18.67
dim(base)[1]
## [1] 649

1.2 Représentation graphique

ggplot(base, aes(x = guardian, y = moy)) +
  geom_boxplot() +
  labs(title = "Boxplot des moyennes par type de tuteur", x = "Type de tuteur", y = "Moyenne des notes") +
  theme_minimal()

Le graphique ci-dessus montre la distribution des moyennes des notes des élèves en fonction du type de tuteur. On remarque que les médianes des groupes “father” et “mother” sont assez proches, tandis que celle du groupe “other” semble plus basse. Cependant, pour déterminer si ces différences sont statistiquement significatives, nous devons effectuer un test statistique approprié.

2. Vérification des hypothèses

2.1 Hypothèse de normalité

#histogramme avec courbe de densité sur un meme graphique mais pour chaque type de tuteur

ggplot(base, aes(x = moy, fill = guardian)) + geom_histogram(aes(y = ..density..), position = "identity", alpha = 0.5) + geom_density(alpha = 0.7) + facet_wrap(~ guardian) + labs(title = "Histogramme et densité des moyennes par type de tuteur", x = "Moyenne des notes", y = "Densité") + theme_minimal()

La represenation ci-dessus, montre de façon visuelle que les données ne suivent pas une distribution normale, surtout pour le groupe “other”. Confirmons cela par un test statistique.

Ici, on utilise le test de Shapiro-Wilk pour vérifier si les données suivent une distribution normale. Pour ce test :

#test de Shapiro-Wilk dans chaque groupe
shapiro.test(base$moy[base$guardian == "mother"])
## 
##  Shapiro-Wilk normality test
## 
## data:  base$moy[base$guardian == "mother"]
## W = 0.98788, p-value = 0.0007874
shapiro.test(base$moy[base$guardian == "father"])
## 
##  Shapiro-Wilk normality test
## 
## data:  base$moy[base$guardian == "father"]
## W = 0.97663, p-value = 0.01047
shapiro.test(base$moy[base$guardian == "other"])
## 
##  Shapiro-Wilk normality test
## 
## data:  base$moy[base$guardian == "other"]
## W = 0.94159, p-value = 0.03565

Nous constatons que les p-values sont toutes inférieures à 0.05, ce qui signifie que nous rejetons l’hypothèse nulle. Par conséquent, les données ne suivent pas une distribution normale, ce qui justifie l’utilisation de tests non paramétriques pour comparer les groupes.

2.2 Hypothèse d’homoscédasticité

Ici, nous utilisons le test de Levene pour vérifier si les variances des groupes sont égales. Pour ce test :

#test de Levene
leveneTest(moy ~ guardian, data = base)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value  Pr(>F)  
## group   2   2.864 0.05777 .
##       646                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

La p-value est supérieure à 0.05, ce qui signifie que nous ne rejetons pas l’hypothèse nulle. Par conséquent, les variances des groupes sont égales au seuil de 5%. Cependnat au seuil de 1%, l’hypothes nulle est rejettée.

3. Test de Kruskal-Wallis

#test de kruskal-wallis 
kruskal.test(moy ~ guardian, data = base)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  moy by guardian
## Kruskal-Wallis chi-squared = 10.812, df = 2, p-value = 0.004491

Les résultats du test de Kruskal-Wallis montrent que la p-value est inférieure à 0.05, ce qui signifie que nous rejetons l’hypothèse nulle. Par conséquent, il existe une différence significative entre les groupes de tuteurs en ce qui concerne les performances des élèves.

En d’autres termes, la performance des élèves varie en fonction du type de tuteur (guardian) avec lequel ils vivent.

Cependant, à ce stade ,nous savons seulement qu’il existe une différence significative entre les groupes, mais nous ne savons pas quels groupes diffèrent les uns des autres.Pour cela, nous ferons un test de post-hoc (test de Dunn) pour savoir quels groupes diffèrent.

4. Test de post-hoc (test de Dunn)

Ce test est utilisé pour effectuer des comparaisons multiples après un test de Kruskal-Wallis significatif. Il permet de déterminer quelles paires de groupes diffèrent significativement les unes des autres.

#test de Dunn 

dunnTest(moy ~ guardian, data = base, method = "bonferroni")
##        Comparison        Z     P.unadj       P.adj
## 1 father - mother 1.418034 0.156180821 0.468542464
## 2  father - other 3.285850 0.001016752 0.003050256
## 3  mother - other 2.731063 0.006313049 0.018939146

Les résultats du test de Dunn montrent que les comparaisons entre les groupes “father” et “other”, ainsi qu’entre “mother” et “other” sont significatives, avec des p-values ajustées inférieures à 0.05. Cependant, la comparaison entre “father” et “mother” n’est pas significative, avec une p-value ajustée supérieure à 0.05.

Cela suggere que les performances des élèves avec un tuteur “other” sont significativement différentes de celles avec un tuteur “father” et “mother”, tandis que les performances des élèves avec un tuteur “father” ne sont pas significativement différentes de celles avec un tuteur “mother”.

Résumé

Le test de Kruskal–Wallis a révélé une différence significative des performances selon le type de tuteur
(χ² = 10.81, p = 0.004).

Le test post-hoc de Dunn avec correction de Bonferroni indique que le groupe other diffère significativement des groupes father (padj = 0.003) et mother (padj = 0.019), tandis qu’aucune différence significative n’est observée entre les groupes father et mother (padj = 0.469).

Analyse comparative des dépenses selon le type de consommation

Dans cette partie, nous cherchons à savoir s’il existe une différence significative entre les dépenses des ménages pour les produits alimentaires et non alimentaires.

1. Jeu de données et description

#importer la base

base_conso <- read.csv("../data/Consommation.csv", header = TRUE, sep = ";")
head(base_conso)
##   Menage_ID   Type_Cons   Depense
## 1      Men1 alimentaire 2007500.0
## 2      Men2 alimentaire 2194278.0
## 3      Men3 alimentaire  393678.6
## 4      Men4 alimentaire 6666099.0
## 5      Men5 alimentaire 2546671.5
## 6      Men6 alimentaire  512794.4

1.1. Résumé statistique

La base de données contient 14310 observations et 3 variables. Les variables sont la consommation des ménages de différentes catégories. Les variables d’intérêt sont :

Dans notre base, il n’y a ni doublons, ni valeurs manquantes. Par conséquent, aucun besoin de nettoyage n’est nécessaire.

summary(base_conso)
##   Menage_ID          Type_Cons            Depense        
##  Length:14310       Length:14310       Min.   :   27354  
##  Class :character   Class :character   1st Qu.: 1101342  
##  Mode  :character   Mode  :character   Median : 1781417  
##                                        Mean   : 2261136  
##                                        3rd Qu.: 2818349  
##                                        Max.   :44730679

1.2 Représentation graphique

ggplot(base_conso, aes(x = Type_Cons, y = Depense)) +
  geom_boxplot() +
  labs(title = "Boxplot des dépenses par type de consommation", x = "Type de consommation", y = "Dépense") +
  theme_minimal()

On remarque la présence de valeurs aberrantes dans les groupes “Alimentaire” et “non alimentaire”, ce qui peut influencer les résultats des tests paramétriques et justifie l’utilisation de tests non paramétriques et plus precisement le test de Wilcoxon.

2. Vérification des hypothèses

2.1 Hypothèse de normalité

#histogramme avec courbe de densité sur un meme graphique mmais pour chaque type de consommation
ggplot(base_conso, aes(x = Depense, fill = Type_Cons)) + geom_histogram(aes(y = ..density..), position = "identity", alpha = 0.5) + geom_density(alpha = 0.7) + facet_wrap(~ Type_Cons) + labs(title = "Histogramme et densité des dépenses par type de consommation", x = "Dépense", y = "Densité") + theme_minimal()

Ici, on utilise le test de Kolmogorov-Smirnov pour vérifier si les données suivent une distribution normale ou pas. Ce test est choisie car le jeu de données est très grand. Pour ce test :

#test de kolmogorov-Smirnov
# Test sur un groupe spécifique
ks.test(base_conso$Depense[base_conso$Type_Cons == "alimentaire"], "pnorm", mean=mean(base_conso$Depense), sd=sd(base_conso$Depense))
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  base_conso$Depense[base_conso$Type_Cons == "alimentaire"]
## D = 0.14927, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(base_conso$Depense[base_conso$Type_Cons == "non alimentaire"], "pnorm", mean=mean(base_conso$Depense), sd=sd(base_conso$Depense))
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  base_conso$Depense[base_conso$Type_Cons == "non alimentaire"]
## D = 0.17091, p-value < 2.2e-16
## alternative hypothesis: two-sided

Nous constatons que les p-values sont toutes inférieures à 0.05, ce qui signifie que nous rejetons l’hypothèse nulle. Par conséquent, les données ne suivent pas une distribution normale, ce qui justifie l’utilisation de tests non paramétriques pour comparer les groupes.

2.2 Hypothèse d’homoscédasticité

Ici, nous utilisons le test de Levene pour vérifier si les variances des groupes sont égales. Pour ce test :

#test de Levene
leveneTest(Depense ~ Type_Cons, data = base_conso)
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value    Pr(>F)    
## group     1  74.758 < 2.2e-16 ***
##       14308                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

la p-value est inférieure à 0.05, ce qui signifie que nous rejetons l’hypothèse nulle. Par conséquent, les variances des groupes ne sont pas égales au seuil de 5%. Cependnat au seuil de 1%, l’hypothes nulle est rejettée. Interprétation : les variances ne sont pas homogènes ce qui renforce la justification du test de Wilcoxon (test non paramétrique)

3. Test de wilcoxon

En rappel, nos données ne sont pas appariés, elles sont indépendantes. Par conséquent, le test de wilcoxon utilisé ici correspond au test de man-withney

test_result <- wilcox.test(Depense ~ Type_Cons, data = base_conso, exact = FALSE)
test_result
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Depense by Type_Cons
## W = 29132784, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0

La p-value est inférieure à 0.05, ce qui signifie que nous rejetons l’hypothèse nulle. Par conséquent, il existe une différence significative entre les dépenses du groupe “alimentaire” et du groupe “non alimentaire”.

Analyse comparative des temps de réaction des patients en fonction du medicament administré

Dans cette partie, nous cherchons à savoir s’il existe une différence significative entre les temps de réaction des patients en fonction du medicament administré.

1. Jeu de données et description

La base de données utilisée dans cette partie contient des informations sur les temps de réaction des patients après l’administration de différents medicaments. En effet, nous disposons de 500 patients et pour chacun, on lui administre les trois médicaments et on observe son temps de réaction. Donc nous sommes en face de données apparriées.

#importation de la base de données

base_patients <- read.csv("../data/patients.csv", header = TRUE, sep = ";")
head(base_patients)
##   Patient_ID Medicament Temps_Reaction
## 1         p1       MedA      10.621781
## 2         p2       MedA      14.655000
## 3         p3       MedA      13.123958
## 4         p4       MedA      12.190609
## 5         p5       MedA       9.092130
## 6         p6       MedA       9.091962

1.1. Résumé statistique

La base de données concerne 1500 observations et 3 variables. Elle contient des informations sur les patients et leurs réponses à différents medicaments (MedA, MedB, MedC). Nous sommes donc en présence de mesures répétées avec 3 groupes. De plus les blocs sont indépendants, ce qui justifie l’utilisation du test de Friedman. Les variables d’intérêt sont :

Dans notre base, il n’y a ni doublons, ni valeurs manquantes. Par conséquent, aucun besoin de nettoyage n’est nécessaire.

summary(base_patients)
##   Patient_ID         Medicament        Temps_Reaction  
##  Length:1500        Length:1500        Min.   : 8.035  
##  Class :character   Class :character   1st Qu.:10.997  
##  Mode  :character   Mode  :character   Median :13.061  
##                                        Mean   :12.990  
##                                        3rd Qu.:14.789  
##                                        Max.   :17.996

1.2 Représentation graphique

#boite a moustaches pour les temps de réaction par medicament
ggplot(base_patients, aes(x = Medicament, y = Temps_Reaction)) +
  geom_boxplot() +
  labs(title = "Boxplot des temps de réaction par medicament", x = "Medicament", y = "Temps de réaction") +
  theme_minimal()

La representation ci-dessus, montre dans un premier temps, que nous n’avons pas de valeurs abérantes dans les groupes. De plus, on remarque que les temps de réaction sont plus élevés pour le medicament MedC que pour les medicaments MedA et MedB. Cependant, il est nécessaire de faire un test statistique pour savoir si ces différences sont significatives ou pas.

2. Vérification des hypothèses

2.1 Hypothèse de normalité

#histogramme avec courbe de densité sur un meme graphique mmais pour chaque medicament
ggplot(base_patients, aes(x = Temps_Reaction, fill = Medicament)) + geom_histogram(aes(y = ..density..), position = "identity", alpha = 0.5) + geom_density(alpha = 0.7) + facet_wrap(~ Medicament) + labs(title = "Histogramme et densité des temps de réaction par medicament", x = "Temps de réaction", y = "Densité") + theme_minimal()

De façon visuelle, on remarque que les données ne suivent pas une distribution normale. Confirmons cela par un test statistique.

#test de Shapiro-Wilk pour chaque groupe
shapiro.test(base_patients$Temps_Reaction[base_patients$Medicament == "MedA"])
## 
##  Shapiro-Wilk normality test
## 
## data:  base_patients$Temps_Reaction[base_patients$Medicament == "MedA"]
## W = 0.94535, p-value = 1.291e-12
shapiro.test(base_patients$Temps_Reaction[base_patients$Medicament == "MedB"])
## 
##  Shapiro-Wilk normality test
## 
## data:  base_patients$Temps_Reaction[base_patients$Medicament == "MedB"]
## W = 0.95257, p-value = 1.386e-11
shapiro.test(base_patients$Temps_Reaction[base_patients$Medicament == "MedC"])
## 
##  Shapiro-Wilk normality test
## 
## data:  base_patients$Temps_Reaction[base_patients$Medicament == "MedC"]
## W = 0.94579, p-value = 1.483e-12

Nous constatons que les p-values sont toutes inférieures à 0.05, ce qui signifie que nous rejetons l’hypothèse nulle. Par conséquent, les données ne suivent pas une distribution normale.

2.2 Hypothèse d’homoscédasticité

Ici, nous utilisons le test de Levene pour vérifier si les variances des groupes sont égales. Pour ce test :

#test de Levene
leveneTest(Temps_Reaction ~ Medicament, data = base_patients)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value    Pr(>F)    
## group    2  9.3309 9.391e-05 ***
##       1497                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

La p-value est inférieure à 0.05, ce qui signifie que nous rejetons l’hypothèse nulle. Par conséquent, les variances des groupes ne sont pas égales au seuil de 5%.

3. Test de Friedman

test_result <- friedman.test(Temps_Reaction ~ Medicament | Patient_ID, data = base_patients)
test_result
## 
##  Friedman rank sum test
## 
## data:  Temps_Reaction and Medicament and Patient_ID
## Friedman chi-squared = 429.42, df = 2, p-value < 2.2e-16

La p-value est inférieure à 0.05, ce qui signifie que nous rejetons l’hypothèse nulle. Par conséquent, il existe une différence significative entre les temps de réaction des patients en fonction du medicament administré.

4. Test de permutation

Dans cette partie, nous implémentons un test de permutation.

#mettre la variable patient et medicament en facteur
base_patients$Patient_ID <- as.factor(base_patients$Patient_ID)
base_patients$Medicament <- as.factor(base_patients$Medicament)

# Ici, la permutation respecte la structure appariée (patients = blocs)

res_friedman_perm <- coin::friedman_test(
  Temps_Reaction ~ Medicament | Patient_ID,
  data = base_patients,
  distribution = approximate(B = 5000)  
)

res_friedman_perm
## 
##  Approximative Friedman Test
## 
## data:  Temps_Reaction by
##   Medicament (MedA, MedB, MedC) 
##   stratified by Patient_ID
## chi-squared = 429.42, p-value < 2e-04

Le test de permutation confirme les résultats du test de Friedman classique, avec une p-value inférieure à 0.05, indiquant une différence significative entre les temps de réaction des patients en fonction du medicament administré.

Cependant comme pour le test de Friedman classique, nous savons seulement qu’il existe une différence significative entre les groupes, mais nous ne savons pas quels groupes diffèrent les uns des autres.Pour cela, nous ferons un test de post-hoc (test de Wilcoxon apparié) pour savoir quels groupes diffèrent.

5. Test de post-hoc (test de Wilcoxon apparié)

Ce test est utilisé pour effectuer des comparaisons multiples après un test de Friedman significatif. Il permet de déterminer quelles paires de groupes diffèrent significativement les unes des autres.

#test de wilcoxon apparié pour les comparaisons multiples
posthoc <- pairwise.wilcox.test(
  x = base_patients$Temps_Reaction,
  g = base_patients$Medicament,
  paired = TRUE, #prend en compte le caractère apparié des données
  p.adjust.method = "holm" #correction de Holm pour les comparaisons multiples
)

print(posthoc)
## 
##  Pairwise comparisons using Wilcoxon signed rank test with continuity correction 
## 
## data:  base_patients$Temps_Reaction and base_patients$Medicament 
## 
##      MedA    MedB   
## MedB 4.2e-10 -      
## MedC < 2e-16 < 2e-16
## 
## P value adjustment method: holm

Les comparaisons post-hoc par test de Wilcoxon apparié avec correction de Holm indiquent que toutes les paires de médicaments diffèrent significativement (p < 0.001 pour toutes les comparaisons). Ces résultats suggèrent que chaque médicament produit un effet distinct sur le temps de réaction.


📥 Télécharger les données utilsées et les scripts 📥


FIN DU CAS PRATIQUE