Cette page propose une mise en application des méthodes de régression présentées lors des quatre premières séances du séminaire “Méthodes quantitatives pour la sociologie 2”.

Cette page a été réalisée avec Rstudio sous Rmarkdown et compilée le 08/03/2018.

Retour à la page d’accueil

Présentation de l’enquête Pisa 2012

L’enquête Pisa () est une enquête réalisée tous les trois ans par l’Organisation de coopération et de développement économique (OCDE) dans une soixantaine de pays auprès des élèves de 15 ans (quelle que soit leur classe au moment de l’enquête).

Elle vise à mesurer les acquis des élèves de 15 ans dans trois disciplines : mathématiques, compréhension de l’écrit (ou littéracie) et sciences. En plus des scores aux tests standardisés de mathématiques, compréhension de l’écrit et sciences, cette enquête comporte de très nombreuses informations sur l’origine sociale des élèves, leurs conditions d’enseignement ainsi que leur rapport aux enseignants et à l’école.

Il s’agit d’une enquête par sondage: à ce titre, chaque fichier dispose d’un poids à utiliser pour généraliser les résultats de l’échantillon d’élèves interrogés à l’ensemble de la population qu’ils représentent.

Organisation des fichiers Les fichiers de l’enquête Pisa 2012 et leur documentation sont librement téléchargeables sur le site de l’OCDE. Seuls deux des nombreux fichiers de données qui constituent l’enquête seront utilisés et ont été restreints à la France uniquement:

  • le fichier élève int_stu12 comporte la plupart des variables d’intérêt de l’enquête;
  • le fichier établissement int_scq12 comporte quelques données de contexte intéressantes.

Le fichier établissement est présent en plusieurs formats informatiques (.txt, .csv et .sas7bdat) pour illustrer les différentes méthodes d’importation des données. Les tableaux suivants recensent les principales variables d’intérêt de ces deux fichiers.

Fichier élèves (int_stu12)

Variable Description
cnt Pays
stidstd Identifiant de l’élève
schoolid Identifiant de l’établissement
w_fstuwt Poids de sondage final de l’élève
st01q01 Classe en nombre d’années depuis l’entrée en primaire: la 10\(^{ème}\) classe correspond à la seconde en France.
st04q01 Sexe : (1) Femme (2) Homme
st05q01 A suivi une scolarité pré-primaire (1) Non (2) Oui, un an ou moins (3) Oui, plus d’un an
st07q01 st07q02 st07q03 A redoublé à un moment de sa scolarité : (1) Non (2-3) Oui, une ou plusieurs fois
st08q01 Est arrivé en retard au cours des deux semaines précédant l’enquête
st09q01 A séché les cours au cours des deux semaines précédant l’enquête
anxmat Score synthétique d’anxiété en mathématiques
disclima Score synthétique de climat de discipline dans la classe
escs Indicateur synthétique de statut économique, social et culturel
immig Immigration : (1) Né en France (2) Immigré de deuxième génération (3) Immigré de première génération
hisced Niveau d’étude le plus élevé des parents (nomenclature CITE)
pv1math Score synthétique à l’évaluation de mathématiques
pv1read Score synthétique à l’évaluation de compréhension de l’écrit
pv1scie Score synthétique à l’évaluation de sciences

Fichier établissements (int_scq12)

Variable Description
cnt Pays
schoolid Identifiant de l’établissement
senwgt_scq Poids de sondage (la somme vaut 1 000 dans chaque pays)
sc01q01 Statut public ou privé (1) public (2) privé
sc03q01 Taille de la commune de l’établissement : (1) Village (2) Small town (3) Town (4) City (5) Large city
sc05q01 Taille de la classe en cours de français : (01) 15 ou moins (02) 16-20 (03) 21-25 … (08) 46-50 (09) Plus de 50 élèves

Documentaton Plusieurs éléments de documentation sont fournis:

  • le questionnaire rempli par les élèves (PISA12_ScQ_ENG.pdf) et la description du fichier élèves (M_stu_codebook.pdf) (en anglais);
  • le questionnaire rempli par les établissements (PISA12_ScQ_ENG.pdf) et la description du fichier établissements (M_sch_codebook.pdf) (en anglais);
  • les principaux résultats de l’enquête en France (PISA-2012-results-france.pdf) (en français) et le rapport technique international (PISA-2012-technical-report-final.pdf) (en anglais).

 

Question 1 Découverte de l’enquête et de sa documentation

  1. Vérifiez la présence et identifiez l’ensemble des fichiers mentionnés ci-dessus. Ouvrez en particulier le questionnaire élève et observez les premières questions posées (Section A : About you). Retrouvez les variables correspondantes dans le tableau ci-dessus ainsi que dans le fichier .pdf de description du fichier élève.

  2. Ouvrez la note rédigée sur la France (PISA-2012-results-france.pdf) et prenez connaissance de ses principaux résultats. Quand il est fait référence à un résultat statistique précis (moyenne, pourcentage, etc.), recherchez dans les tableaux ci-dessus les variables susceptibles d’avoir été utilisées pour y aboutir.

Import et préparation des données

 

Question 2 Import des données

Plusieurs formats de fichiers sont fournis afin de présenter différentes méthodes d’importation courantes. Les fichiers de référence à importer et à utiliser dans le reste de la partie pratique sont les fichiers SAS au format .sas7bdat (importation présentée à la sous-question d.).

Le fichier INT_SCQ12_DEC03.txt correspond au format original des données (sur le site de l’OCDE). Il s’agit d’un fichier de données à largeur fixe (fixed-width format): contrairement aux fichiers dont les colonnes sont séparées par un délimiteur (virgules, tabulations, etc.), ici à chaque colonne correspond un nombre de caractères fixe qui est utilisé pour reconstituer les variables du fichier dans le logiciel statistique.

  1. Recherchez le programme Notepad++ sur l’ordinateur et utilisez-le (ou à défaut le bloc-note Windows) pour visualiser le contenu de INT_SCQ12_DEC03.txt (celui-ci étant un peu gros l’ouverture peut prendre un peu de temps). Vérifiez visuellement que les colonnes sont bien de largeur fixe.

  2. Définissez comme répertoire de travail le dossier dans lequel se situent les données de l’enquête. La fonction read.fwf() permet de lire un fichier de données à largeur fixe pour autant qu’on lui fournisse la largeur correspondant à chaque variable. Comment comprenez-vous alors le code suivant (établi à partir des fichiers .sas mis en ligne par l’OCDE) ? Soumettez le code suivant et vérifiez que l’importation se déroule correctement.

    sch_fwf <- read.fwf("INT_SCQ12_DEC03.txt", width = c(
      3, 7, 7, 1, 6, 7, 1, 9, 9, 9, 9, 1, 1, 2, 9, 9, 4, 4, 4, 4, 4, 4, 4
      , 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
      , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
      , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
      , 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
      , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
      , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
      , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
      , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
      , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9
      , 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
      , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 1, 1, 2, 9, 1, 9, 9, 9, 9, 1
      , 1, 9, 9, 9, 9, 9, 9, 8, 8, 9, 1, 1, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9
      , 9, 9, 9, 7
    ), stringsAsFactors = FALSE)

     

  3. Bien souvent les fichiers à importer ne sont pas des fichiers à largeur fixe mais des fichiers séparés par un délimiteur (virgule, tabulation, etc.). Rercherchez de l’aide sur la fonction read.csv() et utilisez-la pour importer le fichier INT_SCQ12_DEC03.csv.

    Le package de manipulation de données data.table comporte une fonction d’import optimisé pour les données plates séparées par des délimiteurs fread() dont la syntaxe est proche de celle de read.csv(): installez ce package, recherchez de l’aide sur fread() et comparez (soit “à vue d’oeil”, soit en mesurant le temps d’exécution) la vitesse de fread() par rapport à read.csv().

     

  4. Sur le site de l’OCDE pour l’heure tout est fait pour privilégier un import avec les logiciels SAS ou SPSS. Les fichiers int_stu12.sas7bdat et int_scq12.sas7bdat correspondent aux fichiers importés par SAS au format natif SAS .sas7bdat et restreints à la France. Utilisez la fonction read_sas() pour lire ces fichiers (c’est sur ceux-ci que l’on travaillera désormais).

     

 

Question 3 Exploration et mise en forme des données

  1. Utilisez la fonction names() pour afficher les noms de variables des deux tables. Afin de faciliter les exploitations futures, passez tous ces noms en minuscules.

     

  2. Affichez les principales caractéristiques des deux objets importés (structure, dimension, nom des variables, etc.). Vérifiez qu’ils ne comportent que des informations relatives à la France.

     

  3. Afin d’alléger les traitements à venir (pas impératif ici mais toujours utile en pratique), on décide de restreindre les variables d’intérêt à celles identifiées dans les tableaux ci-dessus. Supprimez toutes les autres variables des fichiers.

     

 

Question 4 Fusion de tables

On souhaite utiliser les informations au niveau de l’établissement dans des exploitations au niveau des élèves. Pour ce faire, il convient de fusionner les tables stu et sch sur la base de la variable schoolid présente dans les deux tables :

  • dans la table élèves, il s’agit de l’identifiant de l’établissement auquel appartient l’élève (les élèves provenant du même établissement ont le même schoolid);
  • dans la table établissement, il s’agit de l’identifiant unique de l’établissement.
  1. Utilisez les fonctions unique(), intersect() et setdiff() pour vérifier que l’identifiant schoolid prend bien les mêmes valeurs dans les deux tables.

     

  2. Vérifiez que la variable schoolid est un identifiant pour la table sch, à savoir : (1) qu’elle est renseignée pour chaque ligne (2) qu’elle prend une valeur distincte pour chaque ligne.

     

  3. Utilisez la fonction merge() pour fusionner stu et sch par schoolid dans l’objet stusch. Vérifiez que ses propriétés sont cohérentes avec le résultat des questions précédentes : même nombre de lignes que stu, nombre de colonnes égal à celui de stu et de sch moins 1.

     

Statistiques uni- et bivariée

Inspirez-vous de la note rédigée sur la France pour choisir un sujet d’étude. Par exemple:

  • relation entre caractéristiques socio-démographiques et score synthétique en mathématiques, compréhension de l’écrit ou sciences ou probabilité d’être redoublant;
  • relation entre scolarité pré-primaire et score synthétique en mathématiques, compréhension de l’écrit ou sciences ou probabilité d’être redoublant;
  • relation entre rapport à l’institution scolaire (angoisse, fait de sécher les cours, etc.) et score synthétique en mathématiques ou probabilité d’être redoublant;
  • relation entre le contexte d’enseignement de l’élève (statut de l’établissement, climat de discipline, etc.) et score synthétique en mathématiques, compréhension de l’écrit ou sciences ou probabilité d’être redoublant.

Vous pouvez en particulier chercher à recalculer certaines statistiques de la note rédigée sur la France.

 

 

Question 5 Statistique descriptive

Utilisez les fonctions vues lors de la première session du certificat pour mener l’analyse uni- et bi-variée des variables pertinentes pour le sujet d’étude que vous avez choisi. En particulier:

  • construisez au moins un tri croisé entre deux variables qualitatives et interprétez les sur- ou sous-représentations dans la distribution de la première variable ventilée selon les modalités de la seconde;

     

  • calculez le coefficient de corrélation entre deux variables quantitatives et menez le test de nullité de ce coefficient (avec la fonction cor.test());

     

  • calculez la moyenne d’une variable quantitative ventilée selon les modaliités d’une variable qualitative et effectuez l’analyse de la variance à un seul facteur correspondante pour déterminer si la relation entre ces variables est significative (avec la fonction anova()).

     

 

Question 6 Réalisation de graphiques avec base R

Proposez des représentations graphiques pertinentes pour synthétiser les relations mises en évidence à la question précédente. Vous pouvez consulter à ce sujet la première partie du support complémentaire pour la partie pratique. En particulier:

  • construisez au moins un diagramme en bâton ou circulaire à l’aide des fonctions barplot() ou pie() et utilisez les options de mise en forme pour améliorer sa présentation (ajouter un titre avec main(), modifiez les titres des axes avec xlab() et ylab(), etc.);

     

  • construisez au moins un nuage de points à l’aide de la fonction plot();

     

  • construisez au moins une série de boîtes à moustache à l’aide de la fonction boxplot().

     

  • utilisez les fonctionnalités de RStudio (menus déroulants de la fenêtre de graphiques) pour sauvegarder ces graphiques dans la qualité et le format que vous préférez.

 

Question 7 (Optionnel) Réalisation de graphiques avec ggplot2

Consultez attentivement la deuxième partie du support complémentaire pour la partie pratique puis cherchez à reproduire les graphiques de la question précédente avec ggplot2.

 

Modélisations

Sur la mise en oeuvre pratique des méthodes de régressions avec R, ne jamais hésiter à consulter les tutoriels très bien faits de UCLA.

 

Question 8 Régression linéaire

Inspirez-vous de certaines analyses de la note sur la France (par exemple p. 12, sur les performances des élèves issus de l’immigration après contrôle des caractéristiques socio-démographiques) pour proposer des modèles de régression linéaire cohérents avec votre étude. Pensez bien en particulier:

  • à vérifier le codage des non-réponses dans les données pour que celles-ci ne viennent pas perturber l’analyse (passez-les en NA si ce n’est pas déjà le cas);
  • à évaluer la qualité de vos modèles à l’aide des indicateurs classiques : \(R^2\), \(R^2 ajusté\), test de significativité globale de Fisher;
  • à étudier les résidus et leur distribution;
  • à interpréter la valeur des coefficients en termes de relation (toutes les autres variables du modèle égales par ailleurs) entre la variable explicative considérée et la variable expliquée;
  • à interpréter la significativité des coefficients à l’aide soit de la statistique de test, soit de la p-valeur, soit encore de l’intervalle de confiance au niveau souhaité (à construire avec confint.default());
  • à utiliser le modèle pour prédire la valeur d’individus avec des profils particuliers avec la fonction predict() et à les représenter.

 

 

Question 9 Régression logistique dichotomique

Utilisez les variables socio-démographiques disponibles pour modéliser la probabilité d’être en retard scolaire au moment de l’enquête. Pensez bien en particulier:

  • à évaluer la qualité de vos modèles à l’aide des indicateurs classiques : log-vraisemblance, AIC, BIC, test du ratio de vraisemblance de significativité globale, pourcentage de concordance, courbe ROC;
  • à interpréter le signe, l’amplitude et la significativité des coefficients;
  • à calculer les odds-ratio correspondants et leur intervalle de confiance;
  • à calculer les effets marginaux moyens, à les interpréter ainsi que leur test de significativité.

 

Présentation des résultats

 

Question 10 Exportation et mise en forme des résultats

Exportez et mettez en forme vos résultats de façon à pouvoir construire un rapport statistique sur votre étude. En particulier:

  • intégrez les résultats numériques dans un logiciel d’édition sous forme de tableaux et présentez-les correctement: numéro de tableau, titre, source, note de lecture, décimales homogènes.

  • intégrez les graphiques dans un logiciel d’édition et présentez-les correctement: numéro de figure, titre, source, note de lecture.

  • en particulier pour les modèles de régression: choisissez les indicateurs pertinents à représenter (quelques indicateurs d’ajustements, les coefficients, les odds-ratio ou les effets marginaux d’un modèle logistique dichotomique) et la manière de faire apparaître la significativité (par des étoiles - rappelez alors les seuils en note de lecture - avec les p-valeurs ou les erreurs standards).

 

Question 11 Génération automatique de rapport avec Rmarkdown

Consultez attentivement la dernière partie du support complémentaire pour la partie pratique sur Rmarkdown puis créez un nouveau fichier Rmarkdown dans RStudio. Après installation des packages nécessaires, sauvegardez et compilez une première fois le fichier d’exemple. Modifiez petit à petit cette base pour intégrer les exploitations statistiques et la présentation des résultats de votre étude.

Annexe : Fonctions mentionnées dans le support

  • conc() : calcul du pourcentage de concordance d’un modèle logistique dichotomique

    conc <- function(m){
      un <- m$fitted.values[m$y == 1]
      zero <- m$fitted.values[m$y == 0]
      t <-rowSums(sapply(un, function(i){
    c(sum(i > zero), sum(i < zero), sum(i == zero))  
      }))
      return(c(
    "Pct concordant" = t[1] * 100 / sum(t)
    , "Pct discordant" = t[2] * 100 / sum(t)
    , "Pct ex-aequo"= t[3] * 100 / sum(t)
      ))
    }
  • margins() : calcul des effets marginaux moyens dans un modèle logistique dichotomique

    margins <- function(fit, factor = NULL){
      # fit <- m2; factor <- NULL
      if(as.character(fit$call[1]) != "glm") 
    stop("Le modèle doit avoir été estimé avec la fonction glm().", call. = FALSE)
      if(!(fit$family$link %in% c("identity", "log", "inverse", "logit"))) 
    stop("La fonction de lien doit être \"identity\", \"log\", \"inverse\" ou \"logit\"", call. = FALSE)
      x1 <- model.matrix(fit)
      be <- as.matrix(coef(fit))
      vcv <- vcov(fit)
      disch <- if(is.null(factor)){
    temp1 <-apply(x1,2,function(x)length(table(x))==2)
    names(temp1[temp1])
      }else factor
      invlink <- switch(fit$family$link
    , logit = plogis, log = exp, identity = identity, inverse = (function(x) 1/x)
      )
      invlink_derivative <- switch(fit$family$link
    , "logit" = dlogis, "log" = exp, "identity" = identity, inverse = (function(x) -1/x^2)
      )
      lapply(setNames(disch, disch), function(var){
    # var <- "femme"
    disx0 = disx1 = x1
    disx1[, var] = max(x1[, var])
    disx0[, var] = min(x1[, var])  
    est1 <- mean(invlink(disx1 %*% be))
    est0 <- mean(invlink(disx0 %*% be))
    est <- est1 - est0
    gr = as.numeric(invlink_derivative(disx1 %*% be)) * disx1 - as.numeric(invlink_derivative(disx0 %*% be)) * disx0
    avegr = as.matrix(colMeans(gr))
    se <- sqrt(t(avegr) %*% vcv %*% avegr)
    matrix(c(
      est0, est1, est1 - est0
      , NA, NA,  se
      , NA, NA, est/se
      , NA, NA, 2 * pt(-abs(est/se), df = Inf)
    ), nrow = 3, dimnames = list(
      c(paste(var, "=", c(0, 1)), "Diff")
      , c("Average MFX", "Std. Error", "z value", "P>|z|")
    ))
      })
    }
  • robust() : calcul d’erreurs standards robustes dans un modèle linéaire (inspiré de cette page)

    robust <- function(model, cluster = NULL){
      if(!require(multiwayvcov)) stop("Le package multiwayvcov est requis. Installez-le avec install.packages(\"multiwayvcov\")", call. = FALSE)
      if(is.null(cluster)) cluster <- 1:length(model$residuals)
      return(coeftest(model, cluster.vcov(model, cluster)))
    }