Premier Travail avec RStudio PDF
Document Details
Uploaded by ProficientCopper
Tags
Summary
This document looks like a tutorial showing how to use RStudio. It contains an introduction to dataframes and statistical analysis operations using the R programming language.
Full Transcript
3. Premier travail avec des données 3.1. Jeu de données d’exemple Dans cette partie nous allons (enfin) travailler sur des “vraies” données, et utiliser un jeu de données présent dans l’extension questionr. Nous devons donc avant toute chose installer cette extension. Pour installer ce package, de...
3. Premier travail avec des données 3.1. Jeu de données d’exemple Dans cette partie nous allons (enfin) travailler sur des “vraies” données, et utiliser un jeu de données présent dans l’extension questionr. Nous devons donc avant toute chose installer cette extension. Pour installer ce package, deux possibilités : Dans l’onglet Packages de la zone de l’écran en bas à droite, cliquez sur le bouton Install. Dans le dialogue qui s’ouvre, entrez “questionr” dans le champ Packages puis cliquez sur Install. Saisissez directement la commande suivante dans la console : install.packages("questionr") Dans les deux cas, tout un tas de messages devraient s’afficher dans la console. Attendez que l’invite de commandes > apparaisse à nouveau. Pour plus d’informations sur les extensions et leur installation, voir Section 2.5. Le jeu de données que nous allons utiliser est un extrait de l’enquête Histoire de vie réalisée par l’INSEE en 2003. Il contient 2000 individus et 20 variables. Pour une description plus complète et une liste des variables, voir la Section A.3.2.2. Pour pouvoir utiliser ces données, il faut d’abord charger l’extension questionr (après l’avoir installée, bien entendu) : library(questionr) L’utilisation de library permet de rendre “disponibles”, dans notre session R, les fonctions et jeux de données inclus dans l’extension. Nous devons ensuite indiquer à R que nous souhaitons accéder au jeu de données à l’aide de la commande data : data(hdv2003) Cette commande ne renvoie aucun résultat particulier (sauf en cas d’erreur), mais vous devriez voir apparaître dans l’onglet Environment de RStudio un nouvel objet nommé hdv2003. 25 26 Premier travail avec des données Figure 3.1.: Onglet Environment Cet objet est d’un type nouveau : il s’agit d’un tableau de données. 3.2. Tableau de données (data frame) Un data frame (ou tableau de données, ou table) est un type d’objet R qui contient des données au format tabulaire, avec les observations en ligne et les variables en colonnes, comme dans une feuille de tableur de type LibreOffice ou Excel. Si on se contente d’exécuter le nom de notre tableau de données R va, comme à son habitude, nous l’afficher dans la console, ce qui est tout sauf utile. hdv2003 Une autre manière d’afficher le contenu du tableau est de cliquer sur l’icône en forme de tableau à droite du nom de l’objet dans l’onglet Environment : Figure 3.2.: View icon Ou d’utiliser la fonction View : View(hdv2003) Dans les deux cas votre tableau devrait s’afficher dans RStudio avec une interface de type tableur : 3.2. Tableau de données ( data frame) 27 Figure 3.3.: Interface “View” Il est important de comprendre que l’objet hdv2003 contient l’intégralité des données du tableau. On voit donc qu’un objet peut contenir des données de types très différents (simple nombre, texte, vecteur, tableau de données entier), et être potentiellement de très grande taille1. Ĺ Note Sous R, on peut importer ou créer autant de tableaux de données qu’on le souhaite, dans les limites des capacités de sa machine. Un data frame peut être manipulé comme les autres objets vus précédemment. On peut par exemple faire : d 20 La fonction dim renvoie ses dimensions, donc les deux nombres précédents. dim(d) #> 2000 20 La fonction names retourne les noms des colonnes du tableau, c’est-à-dire la liste de nos variables. names(d) #> "id" "age" "sexe" "nivetud" #> "poids" "occup" "qualif" "freres.soeurs" #> "clso" "relig" "trav.imp" "trav.satisf" #> "hard.rock" "lecture.bd" "peche.chasse" "cuisine" #> "bricol" "cinema" "sport" "heures.tv" Enfin, la fonction str renvoie un descriptif plus détaillé de la structure du tableau. Elle liste les différentes variables, indique leur type 2 et affiche les premières valeurs. str(d) #> 'data.frame': 2000 obs. of 20 variables: #> $ id : int 1 2 3 4 5 6 7 8 9 10... #> $ age : int 28 23 59 34 71 35 60 47 20 28... #> $ sexe : Factor w/ 2 levels "Homme","Femme": 2 2 1 1 2 2 2 1 2 1... #> $ nivetud : Factor w/ 8 levels "N'a jamais fait d'etudes",..: 8 NA 3 8 3 6 3 6 NA 7 #> $ poids : num 2634 9738 3994 5732 4329... #> $ occup : Factor w/ 7 levels "Exerce une profession",..: 1 3 1 1 4 1 6 1 3 1... #> $ qualif : Factor w/ 7 levels "Ouvrier specialise",..: 6 NA 3 3 6 6 2 2 NA 7... #> $ freres.soeurs: int 8 2 2 1 0 5 1 5 4 2... #> $ clso : Factor w/ 3 levels "Oui","Non","Ne sait pas": 1 1 2 2 1 2 1 2 1 2... #> $ relig : Factor w/ 6 levels "Pratiquant regulier",..: 4 4 4 3 1 4 3 4 3 2... #> $ trav.imp : Factor w/ 4 levels "Le plus important",..: 4 NA 2 3 NA 1 NA 4 NA 3... #> $ trav.satisf : Factor w/ 3 levels "Satisfaction",..: 2 NA 3 1 NA 3 NA 2 NA 1... #> $ hard.rock : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1... 2 Les différents types de variables seront décrits plus en détail Chapitre 9 sur les recodages. 3.2. Tableau de données ( data frame) 29 #> $ lecture.bd : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1... #> $ peche.chasse : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 2 2 1 1... #> $ cuisine : Factor w/ 2 levels "Non","Oui": 2 1 1 2 1 1 2 2 1 1... #> $ bricol : Factor w/ 2 levels "Non","Oui": 1 1 1 2 1 1 1 2 1 1... #> $ cinema : Factor w/ 2 levels "Non","Oui": 1 2 1 2 1 2 1 1 2 2... #> $ sport : Factor w/ 2 levels "Non","Oui": 1 2 2 2 1 2 1 1 1 2... #> $ heures.tv : num 0 1 0 2 3 2 2.9 1 2 2... À noter que sous RStudio, on peut afficher à tout moment la structure d’un objet en cliquant sur l’icône de triangle sur fond bleu à gauche du nom de l’objet dans l’onglet Environment. Figure 3.4.: Structure d’un objet 3.2.2. Accéder aux variables d’un tableau Une opération très importante est l’accès aux variables du tableau (à ses colonnes) pour pouvoir les manipuler, effectuer des calculs, etc. On utilise pour cela l’opérateur $, qui permet d’accéder aux colonnes du tableau. Ainsi, si l’on tape : d$sexe #> Femme Femme Homme Homme Femme Femme Femme Homme Femme Homme Femme Homme #> Femme Femme Femme Femme Homme Femme Homme Femme Femme Homme Femme Femme #> Femme Homme Femme Homme Homme Homme Homme Homme Homme Homme Femme Femme #> Homme Femme Femme Homme Femme Homme Homme Femme Femme Homme Femme Femme #> Femme Femme Homme Femme Homme Femme Homme Femme Femme Femme Homme Femme #> Femme Homme Homme Homme Homme Femme Homme Homme Femme Femme Homme Homme #> Femme Femme Femme Femme Homme Femme Femme Femme Femme Femme Femme Homme #> Homme Femme Homme Homme Homme Homme Homme Femme Homme Femme Femme Femme 30 Premier travail avec des données #> Homme Homme Femme Femme Femme Homme Femme Homme Homme Femme Femme Femme #> Femme Homme Homme Homme Homme Homme Femme Homme Homme Femme Homme Homme #> Femme Femme Femme Homme Femme Femme Homme Femme Femme Homme Femme Homme #> Femme Femme Femme Homme Homme Homme Homme Homme Homme Homme Homme Femme #> Homme Homme Homme Femme Femme Femme Homme Femme Femme Femme Femme Homme #> Femme Homme Homme Homme Femme Homme Femme Homme Femme Homme Homme Femme #> Femme Femme Homme Femme Homme Femme Femme Femme Homme Homme Homme Femme #> Homme Femme Femme Homme Homme Femme Femme Femme Femme Femme Homme Homme #> Femme Homme Homme Femme Homme Femme Homme Femme #> [ reached getOption("max.print") -- omitted 1800 entries ] #> Levels: Homme Femme R va afficher l’ensemble des valeurs de la variable sexe dans la console, ce qui est à nouveau fort peu utile. Mais cela nous permet de constater que d$sexe est un vecteur de chaînes de caractères tels qu’on en a déjà rencontré précédemment. La fonction table$colonne renvoie donc la colonne nommée colonne du tableau table, c’est-à-dire un vecteur, en général de nombres ou de chaînes de caractères. Si on souhaite afficher seulement les premières ou dernières valeurs d’une variable, on peut utiliser les fonctions head et tail. head(d$age) #> 28 23 59 34 71 35 tail(d$age, 10) #> 52 42 50 41 46 45 46 24 24 66 Le deuxième argument numérique permet d’indiquer le nombre de valeurs à afficher. 3.2.3. Créer une nouvelle variable On peut aussi utiliser l’opérateur $ pour créer une nouvelle variable dans notre tableau : pour cela, il suffit de lui assigner une valeur. Par exemple, la variable heures.tv contient le nombre d’heures passées quotidiennement devant la télé. head(d$heures.tv, 10) #> 0.0 1.0 0.0 2.0 3.0 2.0 2.9 1.0 2.0 2.0 On peut vouloir créer une nouvelle variable dans notre tableau qui contienne la même durée convertie en minutes. On va donc créer une nouvelle variables minutes.tv de la manière suivante : d$minutes.tv 0 60 0 120 180 120 3.3. Analyse univariée On a donc désormais accès à un tableau de données d, dont les lignes sont des observations (des individus enquêtés), et les colonnes des variables (des caractéristiques de chacun de ces individus), et on sait accéder à ces variables grâce à l’opérateur $. Si on souhaite analyser ces variables, les méthodes et fonctions utilisées seront différentes selon qu’il s’agit d’une variable quantitative (variable numérique pouvant prendre un grand nombre de valeurs : l’âge, le revenu, un pourcentage…) ou d’une variable qualitative (variable pouvant prendre un nombre limité de valeurs appelées modalités : le sexe, la profession, le dernier diplôme obtenu, etc.). 3.3.1. Analyser une variable quantitative Une variable quantitative est une variable de type numérique (un nombre) qui peut prendre un grand nombre de valeurs. On en a plusieurs dans notre jeu de données, notamment l’âge (variable age) ou le nombre d’heures passées devant la télé (heures.tv). 3.3.1.1. Indicateurs de centralité Caractériser une variable quantitative, c’est essayer de décrire la manière dont ses valeurs se répartissent, ou se distribuent. Pour cela on peut commencer par regarder les valeurs extrêmes, avec les fonctions min, max ou range. min(d$age) #> 18 max(d$age) #> 97 range(d$age) #> 18 97 On peut aussi calculer des indicateurs de centralité : ceux-ci indiquent autour de quel nombre se répartissent les valeurs de la variable. Il y en a plusieurs, le plus connu étant la moyenne, qu’on peut calculer avec la fonction mean. mean(d$age) #> 48.157 Il existe aussi la médiane, qui est la valeur qui sépare notre population en deux : on a la moitié de nos observations en-dessous, et la moitié au-dessus. Elle se calcule avec la fonction median. median(d$age) #> 48 32 Premier travail avec des données Une différence entre les deux indicateurs est que la médiane est beaucoup moins sensible aux valeurs “extrêmes” : on dit qu’elle est plus robuste. Ainsi, en 2019, le salaire net moyen des salariés à temps plein dans le secteur privé en France était de 2424 euros, tandis que le salaire net médian n’était que de 1940 euros. La différence étant due à des très hauts salaires qui “tirent” la moyenne vers le haut. 3.3.1.2. Indicateurs de dispersion Les indicateurs de dispersion permettent de mesurer si les valeurs sont plutôt regroupées ou au contraire plutôt dispersées. L’indicateur le plus simple est l’étendue de la distribution, qui décrit l’écart maximal observé entre les observations : max(d$age) - min(d$age) #> 79 Les indicateurs de dispersion les plus utilisés sont la variance ou, de manière équivalente, l’écart-type (qui est égal à la racine carrée de la variance). On obtient la première avec la fonction var, et le second avec sd (abbréviation de standard deviation). var(d$age) #> 287.0249 sd(d$age) #> 16.94181 Plus la variance ou l’écart-type sont élevés, plus les valeurs sont dispersées autour de la moyenne. À l’inverse, plus ils sont faibles et plus les valeurs sont regroupées. Une autre manière de mesurer la dispersion est de calculer les quartiles : le premier quartile est la valeur pour laquelle on a 25% des observations en dessous et 75% au dessus le deuxième quartile est la valeur pour laquelle on a 50% des observations en dessous et 50% au dessus (c’est donc la médiane) le troisième quartile est la valeur pour laquelle on a 75% des observations en dessous et 25% au dessus On peut les calculer avec la fonction quantile : ## Premier quartile quantile(d$age, prob = 0.25) #> 25% #> 35 ## Troisième quartile quantile(d$age, prob = 0.75) #> 75% #> 60 3.3. Analyse univariée 33 quantile prend deux arguments principaux : le vecteur dont on veut calculer le quantile, et un argument prob qui indique quel quantile on souhaite obtenir. prob prend une valeur entre 0 et 1 : 0.5 est la médiane, 0.25 le premier quartile, 0.1 le premier décile, etc. Notons enfin que la fonction summary permet d’obtenir d’un seul coup plusieurs indicateurs classiques : summary(d$age) #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> 18.00 35.00 48.00 48.16 60.00 97.00 3.3.1.3. Représentation graphique L’outil le plus utile pour étudier la distribution des valeurs d’une variable quantitative reste la représentation graphique. La représentation la plus courante est sans doute l’histogramme. On peut l’obtenir avec la fonction hist. hist(d$age) Histogram of d$age 150 Frequency 50 0 20 40 60 80 100 d$age Cette fonction n’a pas pour effet direct d’effectuer un calcul ou de nous renvoyer un résultat : elle génère un graphique qui va s’afficher dans l’onglet Plots de RStudio. On peut personnaliser l’apparence de l’histogramme en ajoutant des arguments supplémentaires à la fonction hist. L’argument le plus important est breaks, qui permet d’indiquer le nombre de classes que l’on souhaite. 34 Premier travail avec des données hist(d$age, breaks = 10) Histogram of d$age 300 Frequency 100 0 20 40 60 80 100 d$age hist(d$age, breaks = 70) Histogram of d$age 50 Frequency 30 0 10 20 40 60 80 100 d$age Le choix d’un “bon” nombre de classes pour un histogramme n’est pas un problème simple : si on a trop peu de classes, on risque d’effacer quasiment toutes les variations, et si on en a trop on risque d’avoir trop de détails et de masquer les grandes tendances. 3.3. Analyse univariée 35 Les arguments de hist permettent également de modifier la présentation du graphique. On peut ainsi changer la couleur des barres avec col3 , le titre avec main, les étiquettes des axes avec xlab et ylab, etc. : hist(d$age, col = "skyblue", main = "Répartition des âges des enquêtés", xlab = "Âge", ylab = "Effectif") Répartition des âges des enquêtés 150 Effectif 50 0 20 40 60 80 100 Âge La fonction hist fait partie des fonctions graphique de base de R. On verra plus en détail d’autres fonctions graphiques dans le Chapitre 8 de ce document, consacrée à l’extension ggplot2, qui fait partie du tidyverse et qui permet la production et la personnalisation de graphiques complexes. 3.3.2. Analyser une variable qualitative Une variable qualitative est une variable qui ne peut prendre qu’un nombre limité de valeurs, appelées modalités. Dans notre jeu de données on trouvera par exemple le sexe (sexe), le niveau d’études (nivetud), la catégorie socio-professionnelle (qualif)… À noter qu’une variable qualitative peut tout-à-fait être numérique, et que certaines variables peuvent être traitées soit comme quantitatives, soit comme qualitatives : c’est le cas par exemple du nombre d’enfants ou du nombre de frères et soeurs. 3.3.2.1. Tri à plat L’outil le plus utilisé pour représenter la répartition des valeurs d’une variable qualitative est le tri à plat : il s’agit simplement de compter, pour chacune des valeurs possibles de la variable (pour chacune 3 Les différentes manières de spécifier des couleurs sont indiquées dans l’encadré Section 8.7.3. 36 Premier travail avec des données des modalités), le nombre d’observations ayant cette valeur. Un tri à plat s’obtient sous R à l’aide de la fonction table. table(d$sexe) #> #> Homme Femme #> 899 1101 Ce tableau nous indique donc que parmi nos enquêtés on trouve 899 hommes et 1101 femmes. table(d$qualif) #> #> Ouvrier specialise Ouvrier qualifie Technicien #> 203 292 86 #> Profession intermediaire Cadre Employe #> 160 260 594 #> Autre #> 58 Un tableau de ce type peut être affiché ou stocké dans un objet, et on peut à son tour lui appliquer des fonctions. Par exemple, la fonction sort permet de trier le tableau selon la valeur de l’effectif. tab #> Autre Technicien Profession intermediaire #> 58 86 160 #> Ouvrier specialise Cadre Ouvrier qualifie #> 203 260 292 #> Employe #> 594 Á Avertissement Attention, par défaut la fonction table n’affiche pas les valeurs manquantes (NA). Si on souhaite les inclure il faut utiliser l’argument useNA = "always", soit : table(d$qualif, useNA = "always"). À noter qu’on peut aussi appliquer summary à une variable qualitative. Le résultat est également le tri à plat de la variable, avec en plus le nombre de valeurs manquantes éventuelles. summary(d$qualif) #> Ouvrier specialise Ouvrier qualifie Technicien #> 203 292 86 #> Profession intermediaire Cadre Employe #> 160 260 594 #> Autre NA's #> 58 347 Par défaut ces tris à plat sont en effectifs et ne sont pas toujours très lisibles, notamment quand on 3.3. Analyse univariée 37 a des effectifs importants. On leur rajoute donc en général la répartition en pourcentages. Pour cela, nous allons utiliser la fonction freq de l’extension questionr, qui devra donc avoir précédemment été chargée avec library(questionr). ## À rajouter en haut de script et à exécuter library(questionr) Une fois l’extension chargée on peut utiliser la fonction freq. freq(d$qualif) #> n % val% #> Ouvrier specialise 203 10.2 12.3 #> Ouvrier qualifie 292 14.6 17.7 #> Technicien 86 4.3 5.2 #> Profession intermediaire 160 8.0 9.7 #> Cadre 260 13.0 15.7 #> Employe 594 29.7 35.9 #> Autre 58 2.9 3.5 #> NA 347 17.3 NA La colonne n représente les effectifs de chaque catégorie, la colonne % le pourcentage, et la colonne val% le pourcentage calculé sur les valeurs valides, donc en excluant les NA. Une ligne a également été rajoutée pour indiquer le nombre et la proportion de NA. freq accepte un certain nombre d’arguments pour personnaliser son affichage. Par exemple : valid indique si on souhaite ou non afficher les pourcentages sur les valeurs valides cum indique si on souhaite ou non afficher les pourcentages cumulés total permet d’ajouter une ligne avec les effectifs totaux sort permet de trier le tableau par fréquence croissante (sort="inc") ou décroissante (sort="dec"). freq(d$qualif, valid = FALSE, total = TRUE, sort = "dec") #> n % #> Employe 594 29.7 #> Ouvrier qualifie 292 14.6 #> Cadre 260 13.0 #> Ouvrier specialise 203 10.2 #> Profession intermediaire 160 8.0 #> Technicien 86 4.3 #> Autre 58 2.9 #> NA 347 17.3 #> Total 2000 100.0 3.3.2.2. Représentations graphiques On peut représenter graphiquement le tri à plat d’une variable qualitative avec un diagramme en barres, obtenu avec la fonction barplot. Attention, contrairement à hist cette fonction ne s’applique 38 Premier travail avec des données pas directement à la variable mais au résultat du tri à plat de cette variable, calculé avec table. Il faut donc procéder en deux étapes. tab Ouvrier specialise 96 107 #> Ouvrier qualifie 229 63 #> Technicien 66 20 #> Profession intermediaire 88 72 #> Cadre 145 115 #> Employe 96 498 #> Autre 21 37 Pour pouvoir interpréter ce tableau on doit passer du tableau en effectifs au tableau en pourcentages ligne ou colonne. Pour cela, on peut utiliser les fonctions lprop et cprop de l’extension questionr, qu’on applique au tableau croisé précédent. 43 44 Analyse bivariée Pour calculer les pourcentages ligne : tab #> Homme Femme Total #> Ouvrier specialise 47.3 52.7 100.0 #> Ouvrier qualifie 78.4 21.6 100.0 #> Technicien 76.7 23.3 100.0 #> Profession intermediaire 55.0 45.0 100.0 #> Cadre 55.8 44.2 100.0 #> Employe 16.2 83.8 100.0 #> Autre 36.2 63.8 100.0 #> All 44.8 55.2 100.0 Et pour les pourcentages colonne : cprop(tab) #> #> Homme Femme All #> Ouvrier specialise 13.0 11.7 12.3 #> Ouvrier qualifie 30.9 6.9 17.7 #> Technicien 8.9 2.2 5.2 #> Profession intermediaire 11.9 7.9 9.7 #> Cadre 19.6 12.6 15.7 #> Employe 13.0 54.6 35.9 #> Autre 2.8 4.1 3.5 #> Total 100.0 100.0 100.0 Ĺ Note Pour savoir si on doit faire des pourcentages ligne ou colonne, on pourra se référer à l’article suivant : https://alain-leger.lescigales.org/textes/lignecolonne.pdf En résumé, quand on fait un tableau croisé, celui-ci est parfaitement symétrique : on peut inverser les lignes et les colonnes, ça ne change pas son interprétation. Par contre, on a toujours en tête un “sens” de lecture dans le sens où on considère que l’une des variables dépend de l’autre. Par exemple, si on croise sexe et type de profession, on dira que le type de profession dépend du sexe, et non l’inverse : le type de profession est alors la variable dépendante (à expliquer), et le sexe la variable indépendante (explicative). Pour faciliter la lecture d’un tableau croisé, il est recommandé de faire les pourcentages sur la variable indépendante. Dans notre exemple, la variable indépendante est le sexe, elle est en colonne, on calcule donc les pourcentages colonnes qui permettent de comparer directement, pour chaque sexe, la répartition des catégories socio-professionnelles. 4.1. Croisement de deux variables qualitatives 45 4.1.2. Test du ² Comme on travaille sur un échantillon et pas sur une population entière, on peut compléter ce tableau croisé par un test d’indépendance du ². Celui-ci permet de tester, et éventuellement de rejeter, l’hypothèse d’indépendance des lignes et des colonnes du tableau, c’est à dire l’hypothèse que les écarts à l’indépendance observés seraient uniquement dus au biais d’échantillonnage (au fait qu’on n’a pas interrogé toute notre population). Pour effectuer un test de ce type, on applique la fonction chisq.test au tableau croisé calculé précédemment. chisq.test(tab) #> #> Pearson's Chi-squared test #> #> data: tab #> X-squared = 387.56, df = 6, p-value < 0.00000000000000022 Le résultat nous indique trois valeurs : X-squared, la valeur de la statistique du ² pour notre tableau, c’est-à-dire une “distance” entre notre tableau observé et celui attendu si les deux variables étaient indépendantes. df, le nombre de degrés de libertés du test, qui dépend des dimensions du tableau. p-value, le fameux p, qui indique la probabilité d’obtenir une valeur de la statistique du ² au moins aussi extrême sous l’hypothèse d’indépendance. Ici, le p est extrêmement petit (la notation < 2.2e-16 indique qu’il est plus petit que la plus petite valeur proche de zéro calculable par R), donc certainement en-dessous du seuil de décision choisi préalablement au test (souvent 5%, soit 0.05). On peut donc rejeter l’hypothèse d’indépendance des lignes et des colonnes du tableau. En complément du test du ², on peut aussi regarder les résidus de ce test pour affiner la lecture du tableau. Ceux-ci s’obtiennent avec la fonction chisq.residuals de questionr : chisq.residuals(tab) #> #> Homme Femme #> Ouvrier specialise 0.52 -0.47 #> Ouvrier qualifie 8.57 -7.73 #> Technicien 4.42 -3.98 #> Profession intermediaire 1.92 -1.73 #> Cadre 2.64 -2.38 #> Employe -10.43 9.41 #> Autre -0.98 0.88 L’interprétation des résidus est la suivante : si la valeur du résidu pour une case est inférieure à -2, alors il y a une sous-représentation de cette case dans le tableau : les effectifs sont significativement plus faibles que ceux attendus sous l’hypothèse d’indépendance à l’inverse, si le résidu est supérieur à 2, il y a sur-représentatation de cette case 46 Analyse bivariée si le résidu est compris entre -2 et 2, il n’y a pas d’écart à l’indépendance significatif Les résidus peuvent être une aide utile à l’interprétation, notamment pour des tableaux de grande dimension. 4.1.3. Représentation graphique Il est possible de faire une représentation graphique d’un tableau croisé, par exemple avec la fonction mosaicplot : mosaicplot(tab) tab Ouvrier specialise Ouvrier qualifie Technicien Profession intermediaire Cadre Employe Autre Homme Femme On peut améliorer ce graphique en colorant les cases selon les résidus du test du ² (argument shade = TRUE) et en orientant verticalement les labels de colonnes (argument las = 3) : 4.1. Croisement de deux variables qualitatives 47 mosaicplot(tab, las = 3, shade = TRUE) tab Ouvrier specialise Ouvrier qualifie Technicien Profession intermediaire Cadre Employe Autre >4 2:4 0:2 −2:0 Homme −4:−2 Non Oui #> 52.25137 40.92531 On verra Chapitre 10 d’autres méthodes basées sur dplyr pour effectuer ce genre d’opérations. 1 Le package en question est présenté en détail Chapitre 10. 50 Analyse bivariée 4.2.3. Tests statistiques Un des tests les plus connus est le test du t de Student, qui permet de tester si les moyennes de deux sous-populations peuvent être considérées comme différentes (compte tenu des fluctuations aléatoires provenant du biais d’échantillonnage). Un test t s’effectue à l’aide de la fonction t.test. Ainsi, on peut tester l’hypothèse d’égalité des âges moyens selon la pratique ou non d’un sport avec la commande suivante : t.test(d$age ~ d$sport) #> #> Welch Two Sample t-test #> #> data: d$age by d$sport #> t = 15.503, df = 1600.4, p-value < 0.00000000000000022 #> alternative hypothesis: true difference in means between group Non and group Oui is not e #> 95 percent confidence interval: #> 9.893117 12.759002 #> sample estimates: #> mean in group Non mean in group Oui #> 52.25137 40.92531 Le résultat du test est significatif, avec un p extrêmement petit, et on peut rejeter l’hypothèse nulle d’égalité des moyennes des deux groupes. Le test nous donne même un intervalle de confiance à 95% pour la valeur de la différence entre les deux moyennes. Nous sommes cependant allés un peu vite, et avons négligé le fait que le test t s’applique normalement à des distributions normales. On peut se faire un premier aperçu visuel de cette normalité en traçant les histogrammes des deux répartitions : hist(d_sport$age) 4.2. Croisement d’une variable quantitative et d’une variable qualitative 51 Histogram of d_sport$age 100 Frequency 60 20 0 20 40 60 80 d_sport$age hist(d_nonsport$age) Histogram of d_nonsport$age 150 100 Frequency 50 0 20 40 60 80 100 d_nonsport$age Si l’âge dans le groupe des non sportifs se rapproche d’une distribution normale, celui des sportifs en semble assez éloigné, notamment du fait de la limite d’âge à 18 ans imposée par construction de l’enquête. On peut tester cette normalité à l’aide du test de Shapiro-Wilk et de la fonction shapiro.test : 52 Analyse bivariée shapiro.test(d_sport$age) #> #> Shapiro-Wilk normality test #> #> data: d_sport$age #> W = 0.96203, p-value = 0.0000000000009734 shapiro.test(d_nonsport$age) #> #> Shapiro-Wilk normality test #> #> data: d_nonsport$age #> W = 0.98844, p-value = 0.00000001654 Le test est significatif dans les deux cas et rejette l’hypothèse d’une normalité des deux distributions. Dans ce cas on peut faire appel à un test non-paramétrique, qui ne fait donc pas d’hypothèses sur les lois de distribution des variables testées, en l’occurrence le test des rangs de Wilcoxon, à l’aide de la fonction wilcox.test : wilcox.test(d$age ~ d$sport) #> #> Wilcoxon rank sum test with continuity correction #> #> data: d$age by d$sport #> W = 640577, p-value < 0.00000000000000022 #> alternative hypothesis: true location shift is not equal to 0 La valeur p étant à nouveau extrêmement petite, on peut rejeter l’hypothèse d’indépendance et considérer que les distributions des âges dans les deux sous-populations sont différentes. 4.3. Croisement de deux variables quantitatives Le jeu de données hdv2003 comportant assez peu de variables quantitatives, on va s’intéresser maintenant à un autre jeu de données comportant des informations du recensement de la population de 2018. On le charge avec : data(rp2018) Un nouveau tableau de données rp2018 devrait apparaître dans votre environnement. Celui-ci comprend les 5417 communes françaises de plus de 2000 habitants, et une soixantaine de variables telles que le département, la population, le taux de chômage, etc. Pour une description plus complète et une liste des variables, voir Section A.3.2.3. 4.3. Croisement de deux variables quantitatives 53 4.3.1. Représentation graphique Quand on croise deux variables quantitatives, l’idéal est de faire une représentation graphique sous forme de nuage de points à l’aide de la fonction plot. On va représenter le croisement entre le pourcentage de cadres et le pourcentage de propriétaires dans la commune : plot(rp2018$cadres, rp2018$proprio) 80 rp2018$proprio 60 40 20 0 10 20 30 40 50 rp2018$cadres Une représentation graphique est l’idéal pour visualiser l’existence d’un lien entre les deux variables. Voici quelques exemples d’interprétation : 54 Analyse bivariée Dépendance linéaire positive Dépendance linéaire négative 8 20 6 4 15 2 0 10 −2 −4 5 −2 −1 0 1 2 3 −2 −1 0 1 2 3 Dépendance non−linéaire monotone Dépendance non−linéaire non monotone 20 20 15 15 10 10 5 5 0 0 −2 −1 0 1 2 3 −2 −1 0 1 2 3 Indépendance Indépendance 2 3 2 1 1 0 0 −1 −1 −2 −2 −3 −3 −2 −1 0 1 2 −3 −2 −1 0 1 2 4.3. Croisement de deux variables quantitatives 55 Dans ce premier graphique généré sur nos données, il semble difficile de mettre en évidence une relation de dépendance. Si par contre on croise le pourcentage de cadres et celui de diplômés de niveau Bac+5 ou plus, on obtient une belle relation de dépendance linéaire. plot(rp2018$cadres, rp2018$dipl_sup) 50 rp2018$dipl_sup 30 0 10 0 10 20 30 40 50 rp2018$cadres 4.3.2. Calcul d’indicateurs En plus d’une représentation graphique, on peut calculer certains indicateurs permettant de mesurer le degré d’association de deux variables quantitatives. 4.3.2.1. Corrélation linéaire (Pearson) La corrélation est une mesure du lien d’association linéaire entre deux variables quantitatives. Sa valeur varie entre -1 et 1. Si la corrélation vaut -1, il s’agit d’une association linéaire négative parfaite. Si elle vaut 1, il s’agit d’une association linéaire positive parfaite. Si elle vaut 0, il n’y a aucune association linéaire entre les variables. On la calcule dans R à l’aide de la fonction cor. Ainsi la corrélation entre le pourcentage de cadres et celui de diplômés du supérieur vaut : cor(rp2018$cadres, rp2018$dipl_sup) #> 0.9291504 Ce qui est extrêmement fort. Il y a donc un lien linéaire et positif entre les deux variables (quand la valeur de l’une augmente, la valeur de l’autre augmente également). À l’inverse, la corrélation entre le pourcentage de cadres et le pourcentage de propriétaires vaut :