1+1[1] 2
L’objectif de ce support est de présenter R dans les grandes lignes. Cette intiation vous permettra ensuite de réaliser des analyses statistiques simples (statistiques descriptives et régressions). Plus précisément, vous allez apprendre ici :
Ce document (rédigé en R !) vous servira donc de support.
R est un logiciel et un langage de programmation dédié aux traitements statistiques, inventé en 1993 et aujourd’hui géré par la R Development Core Team. Il est libre (licence GNU).
La première chose à faire, si ce n’est déjà fait, est d’installer R puis RStudio (un sous-environnement de R particulièrement pratique). Vous pouvez pour cela suivre la procédure décrite sur cette page : https://larmarange.github.io/analyse-R/installation-de-R-et-RStudio.html
Ensuite, il vous faut créer un projet et définir un working directory.
R peut tout d’abord servir de calculatrice. Par exemple, on peut exécuter des opérations simples comme :
ou encore :
Il existe des fonctions (cf. section suivante pour une définition précise) simples pour calculer des opérations simples, comme la racine carrée :
ou l’exponentielle, le log, etc. :
[1] 20.08554
[1] 2.302585
[1] 3.321928
La fonction round() permet de définir le nombre de décimales en sortie d’une opération, ce qui est pratique :
On peut également créer des séries de valeurs en utilisant ::
R fonctionne avec des packages, qui regroupent eux-mêmes des fonctions. Il y a un certain nombre de packages installés par défaut (par exemple le package base), mais la plupart doit être ajoutée par l’utilisateur selon ses besoins. De nouveaux packages apparaissent ou sont updatés en permanence par la communauté.
Pour installer un package, utilisez la fonction install.packages():
Il faut ensuite activer le package avec la fonction library():
Pour visualiser la liste des fonctions inclues dans un package, utilisez le code suivant :
[1] "addNAstr" "chisq.residuals" "clipcopy"
[4] "copie" "cprop" "cramer.v"
[7] "cross.multi.table" "describe" "duplicated2"
[10] "freq" "freq.na" "freqtable"
[13] "ggsurvey" "icut" "iorder"
[16] "irec" "look_for" "lookfor"
[19] "lprop" "ltabs" "multi.split"
[22] "multi.table" "na.rm" "odds.ratio"
[25] "prop" "prop_table" "qload"
[28] "qscan" "quant.cut" "recode.na"
[31] "rename.variable" "renomme.variable" "residus"
[34] "rm.unused.levels" "rprop" "tabs"
[37] "wtd.mean" "wtd.table" "wtd.var"
ou :
Pour obtenir de l’aide sur une fonction, placez le curseur sur le nom de la nom de la fonction et appuyez sur la touche F1.
Pour obtenir le code de la fonction, sélectionnez entièrement le nom de la fonction et exécutez.
Les fonctions contiennent une série d’arguments, qu’il convient de renseigner. Vous trouverez la liste de ces arguments dans l’aide de la fonction, au ainsi :
R est un langage orienté objet. On créé systématiquement des objets. Il en existe plusieurs, en fonction de leur nature. Voici les principaux :
Un vecteur est une série de valeurs ou de caractères, qui doivent être de même nature. Pour créer un vecteur, on utiliser la fonction c():
ou la fonction seq() pour créer une série de valeurs également distribuées :
Ces deux vecteurs sont numériques :
Mais on peut aussi créer des vecteurs de caractères. Par exemple :
vec3 <- c("Hélène","Claire","Alice","Anissa","Cédric","Céline")
# les guillemets sont indispensables pour les caractères
vec3[1] "Hélène" "Claire" "Alice" "Anissa" "Cédric" "Céline"
Les facteurs sont un type particulier de vecteurs. Ce sont des objets très utiles dans R pour stocker les variables qualitatives. Ils sont notamment caractérisés par le fait qu’ils contienent des levels (nous verrons cela plus tard). Pour convertir un vecteur de caractères en facteur, il faut utiliser la fonction factor() :
Les data frames sont des tableaux de données. Les colonnes peuvent être constituées de différents objets (numérique, facteurs, etc.), mais doivent toutes avoir la même longueur. Less data frames sont donc des listes de vecteurs. C’est l’objet que vous utiliserez la plupart du temps.
Créons par exemple un data frame regroupant les trois vecteurs précédents :
vec1 vec2 vec3
1 1 1.0 Hélène
2 3 1.2 Claire
3 2 1.4 Alice
4 8 1.6 Anissa
5 14 1.8 Cédric
6 22 2.0 Céline
Les vecteurs deviennent ainsi des variables. On peut d’ailleurs changer leur nom ainsi :
var1 var2 var3
1 1 1.0 Hélène
2 3 1.2 Claire
3 2 1.4 Alice
4 8 1.6 Anissa
5 14 1.8 Cédric
6 22 2.0 Céline
Pour appeler une variable d’un data frame, il faut utiliser le signe $ :
La logique est la même pour appliquer des fonctions sur ces variables :
[1] "numeric"
[1] 1.5
Certaines fonctions sont utiles pour caractériser la taille des tables (nombre de lignes/colonnes) :
[1] 6 3
[1] 3
[1] 6
On peut également créer de nouvelles variables dans le data frame, issues de calculs entre variables existantes :
[1] 2.0 4.2 3.4 9.6 15.8 24.0
Quand on explore un grand tableau, il est souvent utile de se servir de la fonction head(), qui permet de visualiser les n premières lignes de la table :
var1 var2 var3 var4
1 1 1.0 Hélène 2.0
2 3 1.2 Claire 4.2
3 2 1.4 Alice 3.4
Il y a une synthaxe précise pour manipuler les tables, basée sur les crochets []. Par exemple, on peut extraire des éléments, des lignes ou des colonnes de cette manière :
var1 var2 var3 var4
1 1 1 Hélène 2
[1] 1 3 2 8 14 22
[1] 1
var1 var2 var3
1 1 1.0 Hélène
2 3 1.2 Claire
3 2 1.4 Alice
4 8 1.6 Anissa
5 14 1.8 Cédric
6 22 2.0 Céline
[1] 2.0 9.6
La fonction subset() est équivalente :
var1 var2 var3
1 1 1.0 Hélène
2 3 1.2 Claire
3 2 1.4 Alice
4 8 1.6 Anissa
5 14 1.8 Cédric
6 22 2.0 Céline
var1 var2 var3 var4
4 8 1.6 Anissa 9.6
5 14 1.8 Cédric 15.8
6 22 2.0 Céline 24.0
var1 var3 var4
1 1 Hélène 2.0
2 3 Claire 4.2
3 2 Alice 3.4
4 8 Anissa 9.6
5 14 Cédric 15.8
6 22 Céline 24.0
Les matrices sont des data frames un peu particulières : ce sont des tableaux dont les colonnes doivent être de même nature. Elles présentent un intérêt sur certains types de traitements, que nous verrons plus tard.
Les listes sont des “méta-objets” qui regroupent des objets de nature hétérogène (un peu comme un fichier xls à plusieurs onglets). Par exemple, on peut créer une liste qui va regrouper un vecteur et un data frame :
On appelle ensuite un objet de la liste avec le signe $, comme pour les data frames :
[1] 1 3 2 8 14 22
var1 var2 var3 var4
1 1 1.0 Hélène 2.0
2 3 1.2 Claire 4.2
3 2 1.4 Alice 3.4
4 8 1.6 Anissa 9.6
5 14 1.8 Cédric 15.8
6 22 2.0 Céline 24.0
Dans R, les objets résultant de tests statistiques ou de modèles de régression sont des listes, qui intègrent les statistiques du test, les p-values, les coefficients de régression, etc., en autant d’objets distincts. On y aura donc affaire régulièrement dans la formation.
Vous allez bien entendu avoir à importer vos données externes (par exemple des fichiers excel ou csv) dans R, puis à les nettoyer correctement (vérifier leur qualité, les NAs, la nature des variables, créer de nouvelles variables, etc.) pour pouvoir finalement procéder à vos analyses statistiques.
Il existe plusieurs packages dédiés à l’import de fichiers de données externes. Pour importer des fichiers xls ou xlsx, le package readxl et sa fonction readxl() feront parfaitement l’affaire. Si votre fichier excel est bien placé dans votre répertoire de travail (correspondant à votre projet), alors seul le nom du fichier est précisé dans le code, sans le chemin en entier. Nous allons ainsi importer le fichier “” :
Pour ouvrir un fichier csv, on utilise de la même façon la fonction read.csv2().
Le premier réflexe après avoir importé une table est de vérifier le type d’objet importé et les premières lignes pour détecter d’éventuels problèmes (inversion de lignes ou de colonnes par exemple) :
[1] "tbl_df" "tbl" "data.frame"
# A tibble: 10 × 9
nom precip alt temp ampl jrs_neige dist_litt X Y
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Amiens 634 27 10.4 14.5 NA 54 649667. 6978427.
2 Auxerre 647 93 11.2 16.4 13.5 298 743083. 6743892.
3 Besançon 992 235 10.5 17.6 27.2 458 927914. 6684860.
4 Bordeaux 931 15 12.7 14.5 3.9 40 417717. 6421887.
5 Bourges 718 120 11.2 16 13.8 283 654258. 6664936.
6 Caen 676 2 10.8 12.7 12.2 15 454093. 6902413.
7 Cherbourg 896 15 11.3 10.8 5.1 1 366208. 6958525.
8 Dijon 768 220 10.5 17.9 23.2 402 855116. 6694086.
9 Gap 860 625 9.6 18.2 19.1 562 944476. 6390051.
10 La Rochelle 762 15 12.6 13.9 2.7 1 379827. 6569805.
On commence par afficher la liste des variables, avant de les étudier plus en détail :
Dans la sortie de la commande précédente (head()), on a une vue générale de la nature de chaque variable. On peut le voir aussi avec l’aide la fonction str, qui affiche la structure d’un objet R :
tibble [33 × 9] (S3: tbl_df/tbl/data.frame)
$ nom : chr [1:33] "Amiens" "Auxerre" "Besançon" "Bordeaux" ...
$ precip : num [1:33] 634 647 992 931 718 676 896 768 860 762 ...
$ alt : num [1:33] 27 93 235 15 120 2 15 220 625 15 ...
$ temp : num [1:33] 10.4 11.2 10.5 12.7 11.2 10.8 11.3 10.5 9.6 12.6 ...
$ ampl : num [1:33] 14.5 16.4 17.6 14.5 16 12.7 10.8 17.9 18.2 13.9 ...
$ jrs_neige: num [1:33] NA 13.5 27.2 3.9 13.8 12.2 5.1 23.2 19.1 2.7 ...
$ dist_litt: num [1:33] 54 298 458 40 283 15 1 402 562 1 ...
$ X : num [1:33] 649667 743083 927914 417717 654258 ...
$ Y : num [1:33] 6978427 6743892 6684860 6421887 6664936 ...
Les données manquantes sont très fréquentes. Il faut d’une part connaitre leur nombre, et d’autre part établir de règles sur la façon de les traiter. Pour les compter, la fonction table() associée à is.na est utile :
Il y a donc une données manquante. Parfois, on peut vouloir changer les NAs en 0 (c’est juste un exemple ici, qu’on n’appliquera pas en réalité) :
On peut aussi décider de ne garder que les inidividus qui ne contiennent pas de NAs :
On veut par exemple changer “temp” par “température” (la 4ème colonne). Une solution possible est :
Le package gtools a une fonction très pratique pour discrétiser une variable :
levels(df$amplDisc) <- c("faible","moyenne","forte") # on renomme de façon intelligible
table(df$amplDisc) # vérification du résultat
faible moyenne forte
12 12 9
La concaténation de caractères se fait via la fonction paste(), tandis que l’extraction de caractères se fait via substr() :
df$sub <- substr(df$nom,1,3) # extraction des 3 premiers caractères de la variable 'nom'
head(df$sub)[1] "Ami" "Aux" "Bes" "Bor" "Bou" "Cae"
Les opérations entre variables ont été vues précédemment.
Commençons par créer une seconde variable qualitative :
La table de contingence croisant jours de neige et amplitude (en version qualitative) se programme ainsi :
faible moyenne forte très forte
faible 5 4 2 0
moyenne 2 4 5 1
forte 1 0 1 7
Si on le veut en proportions :
faible moyenne forte très forte
faible 0.15625 0.12500 0.06250 0.00000
moyenne 0.06250 0.12500 0.15625 0.03125
forte 0.03125 0.00000 0.03125 0.21875
Et si on veut contrôler le nombre de décimales, on utilise la fonction round() :
faible moyenne forte très forte
faible 0.16 0.12 0.06 0.00
moyenne 0.06 0.12 0.16 0.03
forte 0.03 0.00 0.03 0.22
dplyrdplyr fait partie du tidyverse, un univers d’extensions présentant un syntaxe nouvelle et commune facilitant les scripts de tout genre (voir https://juba.github.io/tidyverse/06-tidyverse.html).
Cette syntaxe est structurée autour du pipe %>%, qui rend les scripts beaucoup plus instinctifs. En particulier, cette syntaxe est utilisée pour rendre plus lisibles les emboitements de fonctions.
Ainsi, on va passer de
à
faible moyenne forte très forte
faible 0.16 0.12 0.06 0.00
moyenne 0.06 0.12 0.16 0.03
forte 0.03 0.00 0.03 0.22
dplyrdplyr est basé sur des verbes. Voici les principaux que vous aurez à utiliser pour manipuler des tables :
filter et slice : pour filter des lignesselect : pour sélectionner des colonnesmutate : pour créer de nouvelles colonnesrename : pour renommer des colonnesIl existe aussi plein de fonctions de requêtes ou de jointures, comme :
case_when() : requête conditionnelleleft_joint(), right_joint(), bind_rows(), etc. : jointuresVoir la cheat sheet suivante pour un aperçu plus complet : https://raw.githubusercontent.com/rstudio/cheatsheets/main/data-transformation.pdf
dplyrPar exemple, on veut sélectionner les villes où la température moyenne est > 12°C :
# A tibble: 8 × 12
nom precip alt temp ampl jrs_neige dist_litt X Y amplDisc
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
1 Bordeaux 931 15 12.7 14.5 3.9 40 4.18e5 6.42e6 faible
2 La Rochel… 762 15 12.6 13.9 2.7 1 3.80e5 6.57e6 faible
3 Marseille 588 50 14.2 16.8 1.3 532 8.91e5 6.25e6 forte
4 Montpelli… 745 42 13.9 16.4 1.1 406 7.70e5 6.28e6 moyenne
5 Pau 886 165 12.3 14.3 5.1 95 4.26e5 6.25e6 faible
6 Périgueux 884 75 12.3 15.2 6 142 5.23e5 6.46e6 faible
7 Perpignan 586 37 15.4 16 2.2 369 6.91e5 6.18e6 moyenne
8 Toulouse 698 144 12.7 16.2 6.3 228 5.75e5 6.28e6 moyenne
# ℹ 2 more variables: sub <chr>, neigeDisc <fct>
Pour sélectionner les villes > 12°C avec une amplitude < 15°C, puis extraire uniquement la colonne “precip” de cette sélection :
# A tibble: 3 × 1
precip
<dbl>
1 931
2 762
3 886
Pour renommer une variable, puis créer une nouvelle variable dérivée d’une autre (ici les pp° en cm au lieu des mm) :
# A tibble: 33 × 13
nom precip alt tempMoy ampl jrs_neige dist_litt X Y amplDisc
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
1 Amiens 634 27 10.4 14.5 NA 54 6.50e5 6.98e6 faible
2 Auxerre 647 93 11.2 16.4 13.5 298 7.43e5 6.74e6 moyenne
3 Besanç… 992 235 10.5 17.6 27.2 458 9.28e5 6.68e6 forte
4 Bordea… 931 15 12.7 14.5 3.9 40 4.18e5 6.42e6 faible
5 Bourges 718 120 11.2 16 13.8 283 6.54e5 6.66e6 moyenne
6 Caen 676 2 10.8 12.7 12.2 15 4.54e5 6.90e6 faible
7 Cherbo… 896 15 11.3 10.8 5.1 1 3.66e5 6.96e6 faible
8 Dijon 768 220 10.5 17.9 23.2 402 8.55e5 6.69e6 forte
9 Gap 860 625 9.6 18.2 19.1 562 9.44e5 6.39e6 forte
10 La Roc… 762 15 12.6 13.9 2.7 1 3.80e5 6.57e6 faible
# ℹ 23 more rows
# ℹ 3 more variables: sub <chr>, neigeDisc <fct>, precipCm <dbl>
Pour calculer des statistiques selon les modalités d’un facteur, il faut associer les fonctions group_by() et summarise(). Par exemple, si on souhaite calculer la température moyenne des villes dans chaque classe de la variable neigeDisc :
summarise().# A tibble: 1 × 1
meanTemp
<dbl>
1 11.3
neigeDisc ?# A tibble: 5 × 2
neigeDisc meanDist
<fct> <dbl>
1 faible 185.
2 moyenne 140.
3 forte 244.
4 très forte 428.
5 <NA> 54