Dans cette seconde session, l’objectif est de faire réaliser aux étudiants un test statistique classique, interpréter le résultat et de mettre en forme l’ensemble. On prolonge ici ce qui a été fait sur les écoles en Californie et sur la performance des portefeuilles composés par taille précédemment. La procédure utilisée est le test de Student de différence de moyennes. Ce rapide post reprenant sous R le travail à accomplir avec Stata est l’occasion de passer en revue notamment les différents éléments générés par les fonctions de test et de voir comment les mobiliser pour réaliser un tableau de résultat sur mesure

Tâche n°1 réalisez un teste de différence de moyenne entre les scores obtenus par les écoles avec plus de 20 enfants par classe et celles avec moins

Nous utiliserons ici les mêmes packages (tidyverse, haven et gt) ainsi que les mêmes données que pour la session précédente. Chargeons l’ensemble dans notre environnement de travail.

library(tidyverse)
library(haven)
library(gt)

Concernant les données portant sur les écoles, importez-les (si ce n’est déjà fait) en cliquant sur le liens suivant: ici et placez-les dans votre dossier de travail. On peut alors les importer dans R via la fonction read_dta().

caschool<-read_dta("caschool.dta")

Encore un fois, limitons-nous aux seules variables utiles pour notre analyse.

variables <- caschool %>% select(str,testscr)

Puis créons une variable, que l’on appellera size, marquant le fait que l’école considérée (l’observation) présente une valeur de str (student-teacher ratio) inférieure ou supérieure à 20. Dans le premier cas, elle prendra la valeur ‘Small’, et dans le second, elle prendra la valeur ‘Large’. L’opération est réalisée en mobilisant la fonction ifelse().

variables$size<-ifelse(variables$str<20,'Small','Large')

Une fois la variable codée, on peut réaliser le test. Profitons-en pour stocker l’information générée dans un objet nommé test. Affichons le résultat.

test<-t.test(testscr~size,data=variables)
test
## 
##  Welch Two Sample t-test
## 
## data:  testscr by size
## t = -4.0426, df = 403.61, p-value = 6.333e-05
## alternative hypothesis: true difference in means between group Large and group Small is not equal to 0
## 95 percent confidence interval:
##  -10.957525  -3.787296
## sample estimates:
## mean in group Large mean in group Small 
##            649.9788            657.3513

Ici, le test de Student utilisé est celui présent par défaut. On est sur un test bilatéral avec des observations non pairées et correction pour inégalité de variance. Nous constatons une p-value très petite 0.00006333. On rejette donc sans hésitation H0. En observant les moyennes sur les sous groupes, on peut conclure que le score obtenu par les écoles à petite classe est supérieur à celui obtenu par celles à grande classe. Dans 95% des cas, la différence entre ces catégories est comprise entre 10,95 et 3,78.

Voyons comment mettre tout cela en place dans un tableau unique. Générons une data frame avec les informations pertinentes.

tab<-c(round(mean(variables$testscr),digits=1),
       round(test$estimate,digits=1),
       round(test$statistic,digits=3),
       round(test$p.value,digits=3),
       round(test$conf.int,digits=2))  %>%  t()  %>% data.frame()
colnames(tab)<-c('Total','Grande','Petite','t de Student','p.value','Borne base','Borne haute')
tab
##   Total Grande Petite t de Student p.value Borne base Borne haute
## 1 654.2    650  657.4       -4.043       0     -10.96       -3.79

Maintenant que nous avons notre data frame, nous pouvons mettre notre tableau en forme.

tab_<-gt(tab) %>% 
  tab_header('Test de différence de moyennes sur les scores obtenus par les école en fonction de la taille de leur classes') %>% 
  tab_spanner('Taille de la classe',columns = c('Grande','Petite')) %>% 
  tab_spanner('Interval de Confiance à 95% (diff.moy)',
              columns = c('Borne base','Borne haute'))
tab_
Test de différence de moyennes sur les scores obtenus par les école en fonction de la taille de leur classes
Total Taille de la classe t de Student p.value Interval de Confiance à 95% (diff.moy)
Grande Petite Borne base Borne haute
654.2 650 657.4 -4.043 0 -10.96 -3.79

L’ensemble est satisfaisant, nous pouvons en toute fin utiliser gtsave() pour importer le tableau dans Word.

gtsave(tab_,'dif_moy_scr.docx')

Tâche n°2 : Répliquez la procédure pour comparer les performances du portefeuilles composés de grandes entreprises à celui composés de petites

Commençons donc par importer les données et les mettre dans le dossier de travail. Si vous ne les avez pas déjà, vous pouvez les charger ici. Limitons l’ensemble aux seules variables utiles (Lo10,Hi10).

portf_size<-read_dta("portf_size.dta")
variables<-portf_size %>% select(Lo10,Hi10)

La configuration de la base obtenue n’est pas pratique. Transformons-la de manière à avoir une colonne reprenant l’ensemble des mesures de performance et une autre indiquant si le portefeuille considéré est composé de grande entreprise ou de petite. Pour cela, utilisons la fonction pivot_longer() avec comme arguments cols Lo10 et Hi10, names_to Port_size et values_to perf.

variables_<-pivot_longer(variables,
                         cols=c(Lo10,Hi10),
                         names_to = 'Port_size',
                         values_to = 'perf')

Maintenant que les choses sont en place réalisons le test sans oublier de stocké l’information générée.

test<-t.test(perf~Port_size,data=variables_)
test
## 
##  Welch Two Sample t-test
## 
## data:  perf by Port_size
## t = -2.4292, df = 1655.3, p-value = 0.01524
## alternative hypothesis: true difference in means between group Hi10 and group Lo10 is not equal to 0
## 95 percent confidence interval:
##  -1.5636947 -0.1666186
## sample estimates:
## mean in group Hi10 mean in group Lo10 
##          0.8984781          1.7636347

Si l’on établit la limite d’acceptation à 5%, on rejette H0 (à 1% on ne peut pas rejeté H0). Les portefeuilles de grandes entreprises sous-performer en moyenne par rapport à ceux composés de petites. Mettons ces résultats en forme dans une data frame.

tab<-c(round(mean(variables_$perf),digits=2),
       round(test$estimate,digits=2),
       round(test$statistic,digits=3),
       round(test$p.value,digits=3),
       round(test$conf.int,digits=2))  %>%  t()  %>% data.frame()
colnames(tab)<-c('Total','Grande','Petite','t de Student','p-value','Borne base','Borne haute')
tab
##   Total Grande Petite t de Student p-value Borne base Borne haute
## 1  1.33    0.9   1.76       -2.429   0.015      -1.56       -0.17

A partir de la data frame, on peut mettre en page le tableau via gt().

tab_<-gt(tab) %>% 
  tab_header('Test de différence de moyennes sur la performance (rend. jour.) des portefeuilles composés sur la base de la taille des entreprises') %>% 
  tab_spanner('Taille des entreprises',columns = c('Grande','Petite')) %>% 
  tab_spanner('Intervalle de Confiance à 95% (diff.moy)',
              columns = c('Borne base','Borne haute'))
tab_
Test de différence de moyennes sur la performance (rend. jour.) des portefeuilles composés sur la base de la taille des entreprises
Total Taille des entreprises t de Student p-value Intervalle de Confiance à 95% (diff.moy)
Grande Petite Borne base Borne haute
1.33 0.9 1.76 -2.429 0.015 -1.56 -0.17

Le résultat est intéressant. Chargeons-le dans Word pour l’intégrer dans un éventuel rapport.

gtsave(tab_,'dif_moy_rent.docx')