Tutorat R: Junior entreprise ENSAE

Objectif de la formation

C’est quoi R?

R est un langage orienté vers le traitement de données et l’analyse statistique dérivé du langage S. Il est développé depuis une vingtaine d’années par un groupe de volontaires de différents pays.

  • R est à la fois un logiciel et un langage de programmation.
  • R comporte de nombreux fonctionalités pour l’analyse statistique, la
  • représentation graphique et la production de rapports automatisés (word, pdf, html, beamer, etc.).
  • R est un logiciel libre;
  • les fonctionalités des bases peuvent être étendue à l’aide d’extentions appelées packages.
  • Une forte communauté autour.

L’environnement de R et les commandes de base

L’objectif de cette setion est de présenter l’environnement Rstudio et présenter quelques commandes de base du langage R.

R est avant tout une calculatrice.

R est avant tout une calculatrice car il permet à l’utilisateur d’effectuer des calculs simples.

# somme
1+2
## [1] 3
# difference
4-2
## [1] 2
# produit
7*2
## [1] 14
# division
14/2
## [1] 7
# Combinaison d'opération
14/2 +2 -10*4
## [1] -31

On peut stocker le résultat pour une utilisation future:

# <- est l'opérateur d'assignation.
x<-8+2
x+15
## [1] 25

Types de données R

logique (logical)

Ce sont des données de type booléans: Vrai et Faux.

x<-TRUE
x
## [1] TRUE
y<-1>2
y
## [1] FALSE

la fonction classe permet de connaitre le type d’un objet.

class(y)
## [1] "logical"

Numérique (numeric)

Ce sont des données de type numérique.

x<-1
x
## [1] 1
y<-pi
y
## [1] 3.141593
class(y)
## [1] "numeric"

Chaine ou texte (character)

Ce sont des données de type chaine de caractere

x<-"Formation R"
x
## [1] "Formation R"
class(x)
## [1] "character"

Manipulation des vecteurs et des arguments

Les vecteurs sont des variables de R qui permet de stocker à la fois plusieurs données d’une même type. le type peut être numérique, booléen ou chaine. Exemple: l’âge des enquêtés qu’on souhaite stocker sur une variable. Pour créer un vecteur on utilise la fonction c() et à l’intérieur des parenthèses les données sont séparées par “,”.

age=c(17,15,58,33,96,74,79,20,0,50,82,91,72,7,94,55,55,14,40,48,61,34,54,70)
age
##  [1] 17 15 58 33 96 74 79 20  0 50 82 91 72  7 94 55 55 14 40 48 61 34 54 70
sexe<-gl(2,5, labels=c("Masculin", "Féminin"))
sexe
##  [1] Masculin Masculin Masculin Masculin Masculin Féminin  Féminin  Féminin 
##  [9] Féminin  Féminin 
## Levels: Masculin Féminin

Si les données sont de différents types, R convertira l’ensemble vers le type le plus général.\ Exemple 1

# crée un vecteur de type character
vect=c(17,17.8,"Formation", FALSE)
vect
## [1] "17"        "17.8"      "Formation" "FALSE"

Exemple 2

# met tout décimal, 1 chiffre après la virgule
vect=c(17,17.8,1, FALSE)
vect
## [1] 17.0 17.8  1.0  0.0

On peut créer des vecteurs à l’aide de séquences notamment grâce à des fonctions comme seq, rep, etc. Exemple 1

x=1:20
x
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

Exemple 2

# structure de la fonction seq: seq.int(from, to, by,...)
# le dernier paramètre permet d'indiquez un pas
x=seq(0,1,0.1)
x
##  [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

Un vecteur peut être de type factor (variable qualitative). Pour en créer, on peut utiliser la fonction gl : Generate Factor Levels Exemple

x<-gl(2,10, labels=c("Homme","femme"))
x
##  [1] Homme Homme Homme Homme Homme Homme Homme Homme Homme Homme femme femme
## [13] femme femme femme femme femme femme femme femme
## Levels: Homme femme
class(x)
## [1] "factor"

C’est aussi exactement

x<-c(rep("Homme",10),rep("femme",10))
x
##  [1] "Homme" "Homme" "Homme" "Homme" "Homme" "Homme" "Homme" "Homme" "Homme"
## [10] "Homme" "femme" "femme" "femme" "femme" "femme" "femme" "femme" "femme"
## [19] "femme" "femme"
class(x)
## [1] "character"

On peut connaitre le nombre d’éléments d’un vecteur à l’aide de la commande length.

age=c(17,15,58,33,96,74,79,20,0,50,82,91,72)
length(age)
## [1] 13

On peut determiner la valeur d’un vecteur avec une indexaction

## Une seule valeur
age[4]
## [1] 33
## plusieur valeur
age[c(4, 2, 6, 8)]
## [1] 33 15 74 20

Prise en compte des valeurs manquantes

Sous R une valeur manquante est matérialisée par NA (Not Available) quelque soit le type du vecteur. Il ne faut pas confondre NA et NULL (vide). En effet:

Exemple avec NA

age1=c(17,15,58,33,NA,74,79,20,0,50,NA,91,72)
length(age1)
## [1] 13

Exemple avec NULL

age2=c(17,15,58,33,NULL,74,79,20,0,50,NULL,91,72)
length(age2)
## [1] 11

Commandes statistiques de base

Moyenne

Pour calculer la moyenne d’un vecteur (variable) on utilise la commande mean. Si le vecteur présente des valeurs manquantes, on ajoute l’option na.rm=T, T comme TRUE.

## Age moyenne
mean(age)
## [1] 52.84615
## Avec des NA
mean(age1, na.rm = T)
## [1] 46.27273

Variance

Pour calculer la variance d’un vecteur (variable) on utilise la commande mean. Si le vecteur présente des valeurs manquantes, on ajoute l’option na.rm=T, T comme TRUE.

#variance
var(age)
## [1] 1056.974
## Avec des NA
var(age1, na.rm = T)
## [1] 949.6182
## Ecart type
sqrt(var(age))
## [1] 32.51114
##Ou
sd(age)
## [1] 32.51114

Minimum, maximum et l’étendu

## Maximum
max(age)
## [1] 96
## Minimul
min(age)
## [1] 0
## Etendu
max(age)- mean(age)
## [1] 43.15385

Les alternatives

Cette section a pour objectif de voir les syntaxes qui ont pour but d’exécuter des instructions seulement si une certaine condition est satisfaite. Voyons ici deux outils pour créer des alternatives en R : la structure if … else et la fonction switch.

la structure if … else


if ("condition") {
  "instructions"  
} else {
  "instructions"  
}

Exemple

# Simulation du lancer d'une pièce de monnaie
lancer <- sample(x = c("Pile", "Face"), size = 1)

# Structure qui affiche ou non un message, en fonction du résultat du lancer
if (isTRUE(lancer == "Pile"))    # sans accolades
  print("Je gagne!")
# ou encore
if (isTRUE(lancer == "Pile")) {  # avec accolades
  print("Je gagne!")
}

Lorsqu’il y a des instructions à exécuter si la condition est fausse, il faut ajouter un else à l’alternative, suivi des instructions en question. Dans ce cas, il est considéré comme une bonne pratique de toujours encadrer les blocs d’instructions d’accolades (sauf si l’écriture condensée, qui sera présentée plus loin, est utilisée), même s’ils sont composés d’une seule instruction, de façon à retrouver le mot-clé else précédé de } et suivi de { .

Voici un exemple :

if (isTRUE(lancer == "Pile")) {
  print("Je gagne!")
} else {
  print("Je perds...")
}
## [1] "Je perds..."

Structures if … else imbriquées

Plusieurs structures if … else peuvent être imbriquées. Pour ce faire, il suffit d’insérer une autre structure if … else à la place de l’accolade suivant le dernier else, comme suit.

if (<condition_1>) {
  <instructions>  # exécutées si <condition_1> retourne TRUE
} else if (<condition_2>) {
  <instructions>  # exécutées si <condition_1> retourne FALSE, mais <condition_2> retourne TRUE
} else {
  <instructions>  # exécutées si <condition_1> et <condition_2> retournent FALSE
}

Exemple Ecrir un programme qui permet de renseigner la mention selon la note obtenue - note inferieur ou égale à 10: Pas de mention. - note comprise entre 10 et 11: Mention Passable - note comprise entre 12 e 13 : Mention Assez bien - note comprise entre 14 et 15: Mention Bien. - note comprise entre 16 et 17: Mention Tres bien. - note comprise entre 18 et 20: Mention Excellente.

note<-19

if (note<10){
  print("Mention de mention")
}else if (note>=10 & note<12){
  print("Mention passable")
  }else if (note>=12 & note<14){
    print("Mention Assez-bien")
  }else if (note>=14 & note<16){
      print("Mention Bien")
  }else if (note>=16 & note<18){
      print("Mention trés bien")
  }else if (note>=18 & note<=20){
      print("Mention Excellente")
  }else if (note<0 || n>20){
      print("Note est incorrecte")
    }
## [1] "Mention Excellente"

Fonction switch

La fonction switch est parfois utile pour remplacer plusieurs structures if … else imbriquées. La syntaxe générale d’un appel à la fonction switch est la suivante.

switch(
  <expression>,
  "resultat_1" = {
    <instructions> # exécutées si <expression> retourne "resultat_1"
  },
  "resultat_2" = {
    <instructions> # exécutées si <expression> retourne "resultat_2"
  },
  .
  .  # autres paires (résultat, instructions à exécuter) s'il y a lieu
  .
  {
    <instructions> # exécutées si <expression> retourne tout autre résultat
  }
)
x <- age
# Structures if ... else imbriquées présentées précédemment, à reproduire
if (is.numeric(x)) {
  c(min = min(x), moy = mean(x), var=var(x), Sd=sd(x),max = max(x))
} else if (is.character(x) || is.factor(x)) {
  table(x)
} else {
  NA
}
##        min        moy        var         Sd        max 
##    0.00000   52.84615 1056.97436   32.51114   96.00000

Appel à la fonction switch équivalent

switch(
  class(x),
  "numeric"   = c(min = min(x), moy = mean(x), var=var(x), Sd=sd(x),max = max(x)),
  "integer"   = c(min = min(x), moy = mean(x), var=var(x), Sd=sd(x),max = max(x)),
  "character" = table(x),
  "factor"    = table(x),
  NA
)
##        min        moy        var         Sd        max 
##    0.00000   52.84615 1056.97436   32.51114   96.00000

Boucles

for

for (<iterateur> in <ensemble>) {
  <instructions>
}

while

while (<condition>) {
  <instructions>
}

repeat

repeat {
  <instructions>
  if (!<condition>) {
    break
  }
}

Syntaxe générale d’une fonction R

Pour créer une fonction:

<nom_fonction> <- function(<arg_1>, <arg_2>, <arg_3>) {
  <instructions>  # formant le corps de la fonction
}

Exemple

stats_desc <- function(x) {
  if (is.numeric(x)) {
    stats <- c(min = min(x), moy = mean(x), max = max(x))
  } else if (is.character(x) || is.factor(x)) {
    stats <- table(x)
  } else {
    stats <- NA
  }
  return(stats)
}

stats_desc(x = age)
##      min      moy      max 
##  0.00000 52.84615 96.00000

Manipulation des matrices

Une matrice est un tableau de données dont les colonnes sont de même type (numérique, caractére)

Pour une matrice on utilise la commande matrix

K<-matrix(1:20, ncol=5, nrow=4, byrow=FALSE)
K
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20

Si byrow=TRUE, la matrice est remplie par ligne. Si byrow=FALSE, la matrice est remplie par colonne.

Pour accéder à un élèment de la matrice, il faut indiquer le num?ro de la ligne et le num?ro de la colonne entre crochet de la mani?re suivante: x[ligne, colonne]

K[2,4] #affiche 14 (ligne :2 et colonne : 4)

K[2,4]
## [1] 14

Identifier des colonnes et des lignes par des indices

K[2, ] #affiche la ligne 2 entiérement
## [1]  2  6 10 14 18
K[1:2, ] #affiche une matrice contenant les lignes 1et 2 entiérement
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
K[, 4] #affiche la colonne 4 entiérement
## [1] 13 14 15 16

On peut construire une matrice ? partir d’un vecteur

v<-c(1,2,4,7,3,5,8,9)
v
## [1] 1 2 4 7 3 5 8 9

Pour transfomer ce vecteur en matrice, on utlise la commande suisvante:

l<-matrix(v, ncol=4)
l
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    3    8
## [2,]    2    7    5    9

On a aussi la possibilité de rennommer les lignes et les colonnes

O<-matrix(v, ncol=2, nrow=4,byrow=TRUE,dimnames=list(c("ligne1","ligne2","ligne3","ligne4" ), c("colonne1", "colonne2")))
O
##        colonne1 colonne2
## ligne1        1        2
## ligne2        4        7
## ligne3        3        5
## ligne4        8        9

Les opérations sur les matrices

Un certain nombre d’opérations classiques sur les matrices sont préesentés dans la version de base de R. Avant de les présenter, définissons un scalaire a et deux matrices réelles E et B, et une matrice complexe C dont nous nous servirons par la suite.

a<-4
a
## [1] 4
E<-matrix(c(2,3,5,4),nrow=2,ncol=2)
E
##      [,1] [,2]
## [1,]    2    5
## [2,]    3    4
B <- matrix(c(1,2,2,7),nrow=2,ncol=2)
B
##      [,1] [,2]
## [1,]    1    2
## [2,]    2    7
C <- matrix(c(1,1i,-1i,3),ncol=2)
C
##      [,1] [,2]
## [1,] 1+0i 0-1i
## [2,] 0+1i 3+0i

Opérations de base

a+E
##      [,1] [,2]
## [1,]    6    9
## [2,]    7    8

Algébre linéaire dans R

Produit de deux matrices

Soient E et B deux matrices carré. Pour calculer le produit E et B il faut s’assurer que le nombre de colonne de E soit égle au nombre de ligne de B. Au cas écheant on utilisera les commandes suivantes

E%*%B
##      [,1] [,2]
## [1,]   12   39
## [2,]   11   34
E+B
##      [,1] [,2]
## [1,]    3    7
## [2,]    5   11
a*E-B
##      [,1] [,2]
## [1,]    7   18
## [2,]   10    9

calcule de determinat

Pour determiner le determinant de E ou B on utilisera la commande suivante

det(E)
## [1] -7
det(B)
## [1] 3

Determination d’une Matrice identité d’odre n, (n un entier quelconque).

Pour determiner la matrice identité d’ordre 2, on peut utiliser la commande suivante:

I2 <- diag(rep(1,2))
I2
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1

De maniére générale on peut determiner la matrice identité d’orde n:

I10 <- diag(rep(1,10))
I10
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    1    0    0    0    0    0    0    0    0     0
##  [2,]    0    1    0    0    0    0    0    0    0     0
##  [3,]    0    0    1    0    0    0    0    0    0     0
##  [4,]    0    0    0    1    0    0    0    0    0     0
##  [5,]    0    0    0    0    1    0    0    0    0     0
##  [6,]    0    0    0    0    0    1    0    0    0     0
##  [7,]    0    0    0    0    0    0    1    0    0     0
##  [8,]    0    0    0    0    0    0    0    1    0     0
##  [9,]    0    0    0    0    0    0    0    0    1     0
## [10,]    0    0    0    0    0    0    0    0    0     1

l’inverse d’une matrice

Dans le cas où le determinant de B est différent de zéro, on peut determiner son inverse

solve(B)
##            [,1]       [,2]
## [1,]  2.3333333 -0.6666667
## [2,] -0.6666667  0.3333333

Transposé d’une matrice

t(B)
##      [,1] [,2]
## [1,]    1    2
## [2,]    2    7

La cojugué d’une matrice complexe

Conj(C)
##      [,1] [,2]
## [1,] 1+0i 0+1i
## [2,] 0-1i 3+0i

Matrice triangulaire

Il est parfois utile de récupérer les sous-matrices triangulaires inférieur et supérieure d’une matrice. Cela est possible au moyen des fonctions lower.tri() et upper.tri().

cosidérons la matrice suivante:

M <- matrix(1:16,nrow=4)
M
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16
lower.tri(M)
##       [,1]  [,2]  [,3]  [,4]
## [1,] FALSE FALSE FALSE FALSE
## [2,]  TRUE FALSE FALSE FALSE
## [3,]  TRUE  TRUE FALSE FALSE
## [4,]  TRUE  TRUE  TRUE FALSE
upper.tri(M,diag=TRUE)
##       [,1]  [,2]  [,3] [,4]
## [1,]  TRUE  TRUE  TRUE TRUE
## [2,] FALSE  TRUE  TRUE TRUE
## [3,] FALSE FALSE  TRUE TRUE
## [4,] FALSE FALSE FALSE TRUE
M[lower.tri(M)] <- 0
M
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    0    6   10   14
## [3,]    0    0   11   15
## [4,]    0    0    0   16

Calcul des valeurs propres et vecteurs propres

On peut obtenir les valeurs propres et les vecteurs propres d’une matrice au moyen de la fonction eigen().

T<-matrix(1:16, ncol=4)
T
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16
eigen(T)
## eigen() decomposition
## $values
## [1]  3.620937e+01 -2.209373e+00  1.599839e-15  7.166935e-16
## 
## $vectors
##           [,1]        [,2]       [,3]       [,4]
## [1,] 0.4140028  0.82289268 -0.5477226  0.1125155
## [2,] 0.4688206  0.42193991  0.7302967  0.2495210
## [3,] 0.5236384  0.02098714  0.1825742 -0.8365883
## [4,] 0.5784562 -0.37996563 -0.3651484  0.4745519

la diagonalisation

Considerons la matrice carré d’ordre 3 definit par :

Z<-matrix(c(-1, -2, -4, 2, -1, 4, 1, -1, 3), ncol=3)
Z
##      [,1] [,2] [,3]
## [1,]   -1    2    1
## [2,]   -2   -1   -1
## [3,]   -4    4    3

svd(X) retourne (U,D,V) telles que X = UDV’ où U et V sont orthogonales et D est diagonale

svd(Z)
## $d
## [1] 6.8233041 2.5049536 0.4095469
## 
## $u
##             [,1]        [,2]       [,3]
## [1,] -0.34652823  0.20700968 -0.9149127
## [2,] -0.01458172 -0.97641643 -0.2154027
## [3,] -0.93792620 -0.06130212  0.3413744
## 
## $v
##            [,1]      [,2]        [,3]
## [1,]  0.6048970 0.7948377 -0.04829621
## [2,] -0.6492719 0.4571850 -0.60780576
## [3,] -0.4610267 0.3990173  0.79261569

solve(Z,b) retourne x tel que Zx = b

b<-c(1, 2, 3)
solve(Z, b)
## [1] -0.8571429  0.4285714 -0.7142857

Pour determiner la partie entiére d’un nombre on utlise la fonction floor

Relation entre vecteur et matrice

considerons le vecteur T suivant:

T<-c(20, 30, 72, 80, 48, 96, 100, 69, 45, 25)
T
##  [1]  20  30  72  80  48  96 100  69  45  25

pour transformer ce vecteur en matrice

MT<-matrix(T, ncol=5, byrow = TRUE )
MT
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   20   30   72   80   48
## [2,]   96  100   69   45   25

pour renommer les lignes et les colonnes

tab<-matrix(T, ncol=5, byrow = TRUE, dimnames = list(c("HOMME","FEMME"), c("Orange", "Mango", "Pomme","Bannane", "Autre")))
tab
##       Orange Mango Pomme Bannane Autre
## HOMME     20    30    72      80    48
## FEMME     96   100    69      45    25
table.complete <- addmargins(tab,FUN=sum,quiet=TRUE)
table.complete
##       Orange Mango Pomme Bannane Autre sum
## HOMME     20    30    72      80    48 250
## FEMME     96   100    69      45    25 335
## sum      116   130   141     125    73 585

Le tableau de la distribution conjointe (encore appelé tri croisé en fréquences relatives) du couple (X; Y) s’obtient à partir du tableau de contingence matable précédent.

freq.tab<-table.complete/sum(table.complete)
freq.tab
##            Orange      Mango      Pomme    Bannane      Autre       sum
## HOMME 0.008547009 0.01282051 0.03076923 0.03418803 0.02051282 0.1068376
## FEMME 0.041025641 0.04273504 0.02948718 0.01923077 0.01068376 0.1431624
## sum   0.049572650 0.05555556 0.06025641 0.05341880 0.03119658 0.2500000

Si l’on veut aussi obtenir les marges, on peut utiliser l’une des instructions suivantes

Total <- sum
freq.table.complete<-addmargins(freq.tab,FUN=sum,quiet=TRUE)
freq.table.complete
##            Orange      Mango      Pomme    Bannane      Autre       sum
## HOMME 0.008547009 0.01282051 0.03076923 0.03418803 0.02051282 0.1068376
## FEMME 0.041025641 0.04273504 0.02948718 0.01923077 0.01068376 0.1431624
## sum   0.049572650 0.05555556 0.06025641 0.05341880 0.03119658 0.2500000
## sum   0.099145299 0.11111111 0.12051282 0.10683761 0.06239316 0.5000000
##             sum
## HOMME 0.2136752
## FEMME 0.2863248
## sum   0.5000000
## sum   1.0000000

Manupulation des données

Pour aborder cette partie, je vous recommande de télécharger les packages suivants à l’aide de la commande:

install.packages("NomPackage")

Package à telecharger.

  • haven
  • questionr
  • tidyverse
  • dplyr
  • ggplot2
  • plotly

R permet différents types de données:

  • A partir de fichier Texte : CSV,
  • A partir des logiciels statistiques: Excel, STATA, SPSS, SAS;
  • A partir des googlesheets;
  • A partir de données spatiales : ShapeFile, Rasters, etc.
  • Ou à partir de bases de données.

Dans ce cours, l’importation des formats usuels sera abordé (CVS, Excel, SPSS, STATA. . . ) En général, le format de la base importée est de type data.fram

Pour importer un csv, il est important d’avoir un certain nombre d’infos:

  • la 1er ligne contient-elle les noms des variables ?;
  • quel est le séparateur ?;
  • qu’est-ce qui encadre les données textuelles (” ou ’) ?
  • le format de la décimal (. ou ,) ?
  • comment sont matérialisés les valeurs manquantes ?

R permet l’importation des fichiers CVS de maniére graphique. Par script, il existe plusieurs fonctions permettant de lire un CVS read.table, read.csv, read.delim etc.

data<-read.delim("chemin/NomBase.csv",header = TRUE, sep = ";", dec = ".")

Pour importer des données de STATA et SPSS, R dispose d’un package par défaut : foreign. Cependant, le package haven de tidyverse est souvent préféré car gérant mieux les variables de type date et factor (vecteur labélisé).

  • Pour foreign, les fonctions sont : read.spss pour SPSS, read.dta pour STATA;
  • Pour haven, les fonctions sont : read_spss ou read_sav pour SPSS, read_stata pour STATA
  • Pour Excel, le package readxl de tidyverse permet d’importer directement de Excel. On a la possibilité de choisir la feuille de données et d’indiquer si les noms des variables sont en entête ou pas.

Savegarder les données

Comme les autres logiciels de traitement de données, R dispose de son propre format de stockage avec comme extension .RData Pour ce faire on procéde comme suit:

save(data, file = "NomBase.Rdata")

De plus on peut sauvegarder aussi les autres objets créés au cours de la session

save(data, objet1,objet2, file = "NomBase.Rdata")

Visualiser la base importée

On peut visualiser la base importée à l’aide de la commande View

View(DataFrame)

La commande names pour afficher les noms des variables dans la base de données. On peut aussi utiliser lookfor de questionr. La fonction str, en plus des noms, affiche le type de la variable et un échantillon des premiéres valeurs.

inspection de la base

Les packages questionr et dplyr fournissent des fonctions pratiques pour décrire une base de données:

  • questionr propose describe;
  • dplyr propose glimpse

recherche de(s) variable(s)

Lorqu’on travail avec une grande base de données. Il peut étre difficile de repérer une variable. La commande lookfor de questionr pourra nous aider: Il conviendra de lui donner un ou des mots clés pour R affiche l’ensemble des variables ayant ce mot dans leur nom ou description.

library(questionr)
## Warning: le package 'questionr' a été compilé avec la version R 4.2.3
data("hdv2003")
lookfor(hdv2003,"lec")
##  pos variable   label col_type missing values
##  14  lecture.bd —     fct      0       Non   
##                                        Oui
data<-data("hdv2003")

Labélisation de la base: décrire les variables.

Pour la gestion des métadonnées, nous utliserons le package labelled. Pour donner la description d’une variable ou le mettre à jour, on pourra utiliser la commande suivante:

Manipulation des données avec dplyr

dplyr est une extension ayant une syntaxe simple (à l’aide de verbe d’action) et très éfficace dans la manipulation des données. Les principales fonctions de dplyr sont : slice, filter, arrange, select, mutate et rename. l’opérateur pipe (%>%) permet d’enchainer plusieurs opérations tout en gardant une syntaxe lisible. ###charger le package

library(dplyr)
## 
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
## 
##     filter, lag
## Les objets suivants sont masqués depuis 'package:base':
## 
##     intersect, setdiff, setequal, union

slice

Permet de sélectionner des lignes du tableau suivant leur position

library(questionr)
data("hdv2003")
head(slice(hdv2003,c(4,100,250)),10)
##    id age  sexe                                              nivetud     poids
## 1   4  34 Homme Enseignement superieur y compris technique superieur 5731.6615
## 2 100  19 Femme                                                 <NA> 2186.5404
## 3 250  56 Femme                                           2eme cycle  858.2812
##                   occup                   qualif freres.soeurs clso
## 1 Exerce une profession               Technicien             1  Non
## 2 Exerce une profession                  Employe             0  Oui
## 3              Au foyer Profession intermediaire             2  Oui
##                         relig                     trav.imp  trav.satisf
## 1  Appartenance sans pratique Moins important que le reste Satisfaction
## 2  Appartenance sans pratique Moins important que le reste    Equilibre
## 3 Ni croyance ni appartenance                         <NA>         <NA>
##   hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1       Non        Non          Non     Oui    Oui    Oui   Oui         2
## 2       Non        Non          Non     Oui    Oui    Oui   Non        10
## 3       Non        Non          Non     Oui    Oui    Oui   Non         3

filter: filter ou créer des sous ensembles

Permet de filter un tableau de données autrement dit de sélectionner des variables suivant une condition

head(filter(hdv2003,sexe=="Femme"), 10)
##    id age  sexe                                                         nivetud
## 1   1  28 Femme            Enseignement superieur y compris technique superieur
## 2   2  23 Femme                                                            <NA>
## 3   5  71 Femme                               Derniere annee d'etudes primaires
## 4   6  35 Femme                   Enseignement technique ou professionnel court
## 5   7  60 Femme                               Derniere annee d'etudes primaires
## 6   9  20 Femme                                                            <NA>
## 7  11  65 Femme            Enseignement superieur y compris technique superieur
## 8  13  63 Femme                               Derniere annee d'etudes primaires
## 9  14  67 Femme                   Enseignement technique ou professionnel court
## 10 15  76 Femme A arrete ses etudes, avant la derniere annee d'etudes primaires
##         poids                 occup           qualif freres.soeurs clso
## 1   2634.3982 Exerce une profession          Employe             8  Oui
## 2   9738.3958       Etudiant, eleve             <NA>             2  Oui
## 3   4329.0940              Retraite          Employe             0  Oui
## 4   8674.6994 Exerce une profession          Employe             5  Non
## 5   6165.8035              Au foyer Ouvrier qualifie             1  Oui
## 6   7808.8721       Etudiant, eleve             <NA>             4  Oui
## 7    704.3227              Retraite          Employe             3  Oui
## 8   7118.4659              Retraite          Employe             1  Oui
## 9    586.7714 Exerce une profession             <NA>             5  Oui
## 10 11042.0774              Retraite             <NA>             2  Oui
##                          relig                     trav.imp    trav.satisf
## 1  Ni croyance ni appartenance                Peu important Insatisfaction
## 2  Ni croyance ni appartenance                         <NA>           <NA>
## 3          Pratiquant regulier                         <NA>           <NA>
## 4  Ni croyance ni appartenance            Le plus important      Equilibre
## 5   Appartenance sans pratique                         <NA>           <NA>
## 6   Appartenance sans pratique                         <NA>           <NA>
## 7   Appartenance sans pratique                         <NA>           <NA>
## 8   Appartenance sans pratique                         <NA>           <NA>
## 9       Pratiquant occasionnel Moins important que le reste   Satisfaction
## 10  Appartenance sans pratique                         <NA>           <NA>
##    hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1        Non        Non          Non     Oui    Non    Non   Non       0.0
## 2        Non        Non          Non     Non    Non    Oui   Oui       1.0
## 3        Non        Non          Non     Non    Non    Non   Non       3.0
## 4        Non        Non          Non     Non    Non    Oui   Oui       2.0
## 5        Non        Non          Oui     Oui    Non    Non   Non       2.9
## 6        Non        Non          Non     Non    Non    Oui   Non       2.0
## 7        Non        Non          Non     Oui    Oui    Oui   Non       1.0
## 8        Non        Non          Non     Oui    Non    Non   Non       4.0
## 9        Non        Non          Non     Oui    Oui    Non   Non       1.0
## 10       Non        Non          Non     Oui    Non    Oui   Non       3.0

On peut passer plusieurs conditions

head(filter(hdv2003,sexe=="Femme", age>45),)
##   id age  sexe                                                         nivetud
## 1  5  71 Femme                               Derniere annee d'etudes primaires
## 2  7  60 Femme                               Derniere annee d'etudes primaires
## 3 11  65 Femme            Enseignement superieur y compris technique superieur
## 4 13  63 Femme                               Derniere annee d'etudes primaires
## 5 14  67 Femme                   Enseignement technique ou professionnel court
## 6 15  76 Femme A arrete ses etudes, avant la derniere annee d'etudes primaires
##        poids                 occup           qualif freres.soeurs clso
## 1  4329.0940              Retraite          Employe             0  Oui
## 2  6165.8035              Au foyer Ouvrier qualifie             1  Oui
## 3   704.3227              Retraite          Employe             3  Oui
## 4  7118.4659              Retraite          Employe             1  Oui
## 5   586.7714 Exerce une profession             <NA>             5  Oui
## 6 11042.0774              Retraite             <NA>             2  Oui
##                        relig                     trav.imp  trav.satisf
## 1        Pratiquant regulier                         <NA>         <NA>
## 2 Appartenance sans pratique                         <NA>         <NA>
## 3 Appartenance sans pratique                         <NA>         <NA>
## 4 Appartenance sans pratique                         <NA>         <NA>
## 5     Pratiquant occasionnel Moins important que le reste Satisfaction
## 6 Appartenance sans pratique                         <NA>         <NA>
##   hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1       Non        Non          Non     Non    Non    Non   Non       3.0
## 2       Non        Non          Oui     Oui    Non    Non   Non       2.9
## 3       Non        Non          Non     Oui    Oui    Oui   Non       1.0
## 4       Non        Non          Non     Oui    Non    Non   Non       4.0
## 5       Non        Non          Non     Oui    Oui    Non   Non       1.0
## 6       Non        Non          Non     Oui    Non    Oui   Non       3.0

Ou filter en utlisant une fonction dans la condition.

head(filter(hdv2003, age==min(age)),2)
##    id age  sexe nivetud    poids           occup qualif freres.soeurs clso
## 1 162  18 Homme    <NA> 4982.964 Etudiant, eleve   <NA>             2  Non
## 2 215  18 Homme    <NA> 4631.188 Etudiant, eleve   <NA>             2  Oui
##                         relig trav.imp trav.satisf hard.rock lecture.bd
## 1  Appartenance sans pratique     <NA>        <NA>       Non        Non
## 2 Ni croyance ni appartenance     <NA>        <NA>       Non        Non
##   peche.chasse cuisine bricol cinema sport heures.tv
## 1          Non     Non    Non    Non   Oui         3
## 2          Non     Oui    Non    Oui   Oui         2

select : selectionner des variables

Elle permet de faire des sélections de colonne(s). Selection de sexe et age par exemple:

head(select(hdv2003, sexe,age),2)
##    sexe age
## 1 Femme  28
## 2 Femme  23

Sélection de toutes variables sauf religionet nivetud

##select(hdv2003, -religion,-nivetud)

On peut utiliser les options starts_with, ends_width, contains ou matches pour sélectionner en tenant compte de contraintes particuliéres.

head(select(hdv2003, starts_with("trav")),2)
##        trav.imp    trav.satisf
## 1 Peu important Insatisfaction
## 2          <NA>           <NA>

Rename : renommer une variable

Permet de renommer des colonnes: rename(data,nouveau_nom =ancien_nom).

head(rename(hdv2003, "lecture"="lecture.bd","tv"="heures.tv"),10)
##    id age  sexe                                              nivetud     poids
## 1   1  28 Femme Enseignement superieur y compris technique superieur  2634.398
## 2   2  23 Femme                                                 <NA>  9738.396
## 3   3  59 Homme                    Derniere annee d'etudes primaires  3994.102
## 4   4  34 Homme Enseignement superieur y compris technique superieur  5731.662
## 5   5  71 Femme                    Derniere annee d'etudes primaires  4329.094
## 6   6  35 Femme        Enseignement technique ou professionnel court  8674.699
## 7   7  60 Femme                    Derniere annee d'etudes primaires  6165.803
## 8   8  47 Homme        Enseignement technique ou professionnel court 12891.641
## 9   9  20 Femme                                                 <NA>  7808.872
## 10 10  28 Homme         Enseignement technique ou professionnel long  2277.160
##                    occup           qualif freres.soeurs clso
## 1  Exerce une profession          Employe             8  Oui
## 2        Etudiant, eleve             <NA>             2  Oui
## 3  Exerce une profession       Technicien             2  Non
## 4  Exerce une profession       Technicien             1  Non
## 5               Retraite          Employe             0  Oui
## 6  Exerce une profession          Employe             5  Non
## 7               Au foyer Ouvrier qualifie             1  Oui
## 8  Exerce une profession Ouvrier qualifie             5  Non
## 9        Etudiant, eleve             <NA>             4  Oui
## 10 Exerce une profession            Autre             2  Non
##                          relig                     trav.imp    trav.satisf
## 1  Ni croyance ni appartenance                Peu important Insatisfaction
## 2  Ni croyance ni appartenance                         <NA>           <NA>
## 3  Ni croyance ni appartenance Aussi important que le reste      Equilibre
## 4   Appartenance sans pratique Moins important que le reste   Satisfaction
## 5          Pratiquant regulier                         <NA>           <NA>
## 6  Ni croyance ni appartenance            Le plus important      Equilibre
## 7   Appartenance sans pratique                         <NA>           <NA>
## 8  Ni croyance ni appartenance                Peu important Insatisfaction
## 9   Appartenance sans pratique                         <NA>           <NA>
## 10      Pratiquant occasionnel Moins important que le reste   Satisfaction
##    hard.rock lecture peche.chasse cuisine bricol cinema sport  tv
## 1        Non     Non          Non     Oui    Non    Non   Non 0.0
## 2        Non     Non          Non     Non    Non    Oui   Oui 1.0
## 3        Non     Non          Non     Non    Non    Non   Oui 0.0
## 4        Non     Non          Non     Oui    Oui    Oui   Oui 2.0
## 5        Non     Non          Non     Non    Non    Non   Non 3.0
## 6        Non     Non          Non     Non    Non    Oui   Oui 2.0
## 7        Non     Non          Oui     Oui    Non    Non   Non 2.9
## 8        Non     Non          Oui     Oui    Oui    Non   Non 1.0
## 9        Non     Non          Non     Non    Non    Oui   Non 2.0
## 10       Non     Non          Non     Non    Non    Oui   Oui 2.0

arrange: ordonner une base de données

Cette fonction permet de trier un tableau de données suivant un ou plusieurs colonnes:

head(arrange(hdv2003, poids),10)
##      id age  sexe                                              nivetud
## 1   492  34 Homme Enseignement superieur y compris technique superieur
## 2   266  83 Femme                    Derniere annee d'etudes primaires
## 3  1656  39 Homme Enseignement superieur y compris technique superieur
## 4  1282  56 Homme                    Derniere annee d'etudes primaires
## 5  1804  74 Femme                                            1er cycle
## 6  1067  46 Homme        Enseignement technique ou professionnel court
## 7   298  50 Femme                    Derniere annee d'etudes primaires
## 8   417  29 Femme         Enseignement technique ou professionnel long
## 9  1500  55 Homme                             N'a jamais fait d'etudes
## 10 1080  55 Homme        Enseignement technique ou professionnel court
##        poids                 occup                   qualif freres.soeurs clso
## 1   78.07834 Exerce une profession                  Employe             9  Non
## 2   92.68033              Au foyer                  Employe             1  Non
## 3   92.93637 Exerce une profession                    Cadre             2  Non
## 4  127.90122 Exerce une profession       Ouvrier specialise            12  Oui
## 5  153.01026              Retraite                    Cadre             3  Non
## 6  186.48657 Exerce une profession               Technicien             2  Non
## 7  189.56697         Autre inactif                  Employe             0  Non
## 8  194.44285               Chomeur       Ouvrier specialise             3  Non
## 9  204.16648 Exerce une profession         Ouvrier qualifie            11  Non
## 10 236.28395 Exerce une profession Profession intermediaire             1  Oui
##                          relig                     trav.imp  trav.satisf
## 1          Pratiquant regulier                Peu important    Equilibre
## 2          Pratiquant regulier                         <NA>         <NA>
## 3  Ni croyance ni appartenance Moins important que le reste Satisfaction
## 4   Appartenance sans pratique Moins important que le reste    Equilibre
## 5   Appartenance sans pratique                         <NA>         <NA>
## 6   Appartenance sans pratique Moins important que le reste Satisfaction
## 7       Pratiquant occasionnel                         <NA>         <NA>
## 8  Ni croyance ni appartenance                         <NA>         <NA>
## 9          Pratiquant regulier Moins important que le reste Satisfaction
## 10  Appartenance sans pratique Moins important que le reste    Equilibre
##    hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1        Non        Oui          Oui     Oui    Oui    Oui   Oui         1
## 2        Non        Non          Non     Non    Non    Non   Non         1
## 3        Non        Non          Non     Non    Oui    Oui   Oui         1
## 4        Non        Non          Non     Non    Non    Non   Non         1
## 5        Non        Non          Non     Non    Oui    Non   Non         1
## 6        Non        Non          Oui     Oui    Oui    Non   Non         2
## 7        Non        Non          Non     Non    Oui    Non   Oui         6
## 8        Non        Non          Non     Oui    Oui    Oui   Non         4
## 9        Non        Non          Non     Non    Oui    Non   Non         1
## 10       Non        Non          Non     Non    Non    Non   Non         4

On peut trier dans l’ordre décroissant en ajoutant l’option desc()

head(arrange(hdv2003, desc(poids)),10)
##      id age  sexe
## 1   939  23 Femme
## 2   818  53 Homme
## 3  1379  34 Femme
## 4  1637  31 Homme
## 5    20  39 Femme
## 6  1439  45 Femme
## 7   342  59 Femme
## 8  1808  47 Homme
## 9  1341  39 Femme
## 10 1127  89 Femme
##                                                            nivetud    poids
## 1             Enseignement superieur y compris technique superieur 31092.14
## 2                    Enseignement technique ou professionnel court 29657.94
## 3                                                       2eme cycle 29570.79
## 4                                                        1er cycle 29548.79
## 5                    Enseignement technique ou professionnel court 27195.84
## 6             Enseignement superieur y compris technique superieur 27021.94
## 7                    Enseignement technique ou professionnel court 26983.53
## 8                    Enseignement technique ou professionnel court 26204.71
## 9                    Enseignement technique ou professionnel court 26178.59
## 10 A arrete ses etudes, avant la derniere annee d'etudes primaires 25986.10
##                    occup                   qualif freres.soeurs        clso
## 1  Exerce une profession Profession intermediaire             2         Oui
## 2  Exerce une profession               Technicien             4         Oui
## 3  Exerce une profession                  Employe             1         Oui
## 4  Exerce une profession                  Employe             6 Ne sait pas
## 5  Exerce une profession         Ouvrier qualifie             5         Non
## 6               Au foyer                     <NA>             3         Non
## 7          Autre inactif Profession intermediaire             2         Oui
## 8  Exerce une profession                     <NA>             2         Oui
## 9               Au foyer                  Employe             3         Oui
## 10         Autre inactif                     <NA>             2         Non
##                          relig                     trav.imp  trav.satisf
## 1          Pratiquant regulier Moins important que le reste Satisfaction
## 2   Appartenance sans pratique Moins important que le reste Satisfaction
## 3  Ni croyance ni appartenance Moins important que le reste Satisfaction
## 4       Pratiquant occasionnel Moins important que le reste    Equilibre
## 5   Appartenance sans pratique Moins important que le reste Satisfaction
## 6       Pratiquant occasionnel                         <NA>         <NA>
## 7                  NSP ou NVPR                         <NA>         <NA>
## 8       Pratiquant occasionnel Moins important que le reste Satisfaction
## 9   Appartenance sans pratique                         <NA>         <NA>
## 10  Appartenance sans pratique                         <NA>         <NA>
##    hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1        Non        Non          Non     Non    Non    Oui   Non       0.0
## 2        Non        Non          Oui     Non    Oui    Oui   Non       3.0
## 3        Non        Non          Non     Oui    Non    Oui   Oui       1.0
## 4        Non        Non          Non     Non    Non    Non   Non       4.0
## 5        Non        Non          Non     Non    Non    Oui   Oui       2.7
## 6        Non        Non          Non     Non    Non    Oui   Oui       0.0
## 7        Non        Non          Non     Oui    Oui    Non   Non       2.0
## 8        Non        Non          Non     Non    Non    Oui   Non       1.0
## 9        Non        Non          Non     Non    Non    Oui   Non       5.0
## 10       Non        Non          Non     Non    Non    Non   Non       0.0

On peut mettre plusieurs colonnes en paramètre. On peut aussi utiliser les fonction head, tail ou slice pour afficher le début ou la fin du tableau.

mutate: création de variables.

Permet d’ajouter une ou plusieurs variables à notre tableau de données:

head(mutate(hdv2003, minutes.tv=heures.tv*60, secondes.tv=minutes.tv*60),10)
##    id age  sexe                                              nivetud     poids
## 1   1  28 Femme Enseignement superieur y compris technique superieur  2634.398
## 2   2  23 Femme                                                 <NA>  9738.396
## 3   3  59 Homme                    Derniere annee d'etudes primaires  3994.102
## 4   4  34 Homme Enseignement superieur y compris technique superieur  5731.662
## 5   5  71 Femme                    Derniere annee d'etudes primaires  4329.094
## 6   6  35 Femme        Enseignement technique ou professionnel court  8674.699
## 7   7  60 Femme                    Derniere annee d'etudes primaires  6165.803
## 8   8  47 Homme        Enseignement technique ou professionnel court 12891.641
## 9   9  20 Femme                                                 <NA>  7808.872
## 10 10  28 Homme         Enseignement technique ou professionnel long  2277.160
##                    occup           qualif freres.soeurs clso
## 1  Exerce une profession          Employe             8  Oui
## 2        Etudiant, eleve             <NA>             2  Oui
## 3  Exerce une profession       Technicien             2  Non
## 4  Exerce une profession       Technicien             1  Non
## 5               Retraite          Employe             0  Oui
## 6  Exerce une profession          Employe             5  Non
## 7               Au foyer Ouvrier qualifie             1  Oui
## 8  Exerce une profession Ouvrier qualifie             5  Non
## 9        Etudiant, eleve             <NA>             4  Oui
## 10 Exerce une profession            Autre             2  Non
##                          relig                     trav.imp    trav.satisf
## 1  Ni croyance ni appartenance                Peu important Insatisfaction
## 2  Ni croyance ni appartenance                         <NA>           <NA>
## 3  Ni croyance ni appartenance Aussi important que le reste      Equilibre
## 4   Appartenance sans pratique Moins important que le reste   Satisfaction
## 5          Pratiquant regulier                         <NA>           <NA>
## 6  Ni croyance ni appartenance            Le plus important      Equilibre
## 7   Appartenance sans pratique                         <NA>           <NA>
## 8  Ni croyance ni appartenance                Peu important Insatisfaction
## 9   Appartenance sans pratique                         <NA>           <NA>
## 10      Pratiquant occasionnel Moins important que le reste   Satisfaction
##    hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1        Non        Non          Non     Oui    Non    Non   Non       0.0
## 2        Non        Non          Non     Non    Non    Oui   Oui       1.0
## 3        Non        Non          Non     Non    Non    Non   Oui       0.0
## 4        Non        Non          Non     Oui    Oui    Oui   Oui       2.0
## 5        Non        Non          Non     Non    Non    Non   Non       3.0
## 6        Non        Non          Non     Non    Non    Oui   Oui       2.0
## 7        Non        Non          Oui     Oui    Non    Non   Non       2.9
## 8        Non        Non          Oui     Oui    Oui    Non   Non       1.0
## 9        Non        Non          Non     Non    Non    Oui   Non       2.0
## 10       Non        Non          Non     Non    Non    Oui   Oui       2.0
##    minutes.tv secondes.tv
## 1           0           0
## 2          60        3600
## 3           0           0
## 4         120        7200
## 5         180       10800
## 6         120        7200
## 7         174       10440
## 8          60        3600
## 9         120        7200
## 10        120        7200

Utilisation du pipe

Il permet d’enchainer plusieurs opérations sans passer par des étapes intermédaires tout en gardant un syntaxe claire.

head(hdv2003 %>% filter(age>=50) %>% arrange(desc(poids)) %>%
select(age, sexe) %>% slice(1:3),10)
##   age  sexe
## 1  53 Homme
## 2  59 Femme
## 3  89 Femme

group_by

Pour la suite, nous utiliserons les données “fligths” du package nycfligths13. groupby permet de définir des sous-groupes à l’intérieur desquels se font les opérations. Prenons par exemple un group_by par mois sur la base flights.

library(nycflights13)
## Warning: le package 'nycflights13' a été compilé avec la version R 4.2.3
data("flights")
head(flights %>% group_by(month),10)
## # A tibble: 10 × 19
## # Groups:   month [1]
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     1     1      517        515       2     830     819      11 UA     
##  2  2013     1     1      533        529       4     850     830      20 UA     
##  3  2013     1     1      542        540       2     923     850      33 AA     
##  4  2013     1     1      544        545      -1    1004    1022     -18 B6     
##  5  2013     1     1      554        600      -6     812     837     -25 DL     
##  6  2013     1     1      554        558      -4     740     728      12 UA     
##  7  2013     1     1      555        600      -5     913     854      19 B6     
##  8  2013     1     1      557        600      -3     709     723     -14 EV     
##  9  2013     1     1      557        600      -3     838     846      -8 B6     
## 10  2013     1     1      558        600      -2     753     745       8 AA     
## # … with 9 more variables: flight <int>, tailnum <chr>, origin <chr>,
## #   dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
## #   time_hour <dttm>, and abbreviated variable names ¹​sched_dep_time,
## #   ²​dep_delay, ³​arr_time, ⁴​sched_arr_time, ⁵​arr_delay

Récupérons par exemple, les deux premiers vols de chaque mois.

flights %>% group_by(month) %>% slice(1:2)
## # A tibble: 24 × 19
## # Groups:   month [12]
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     1     1      517        515       2     830     819      11 UA     
##  2  2013     1     1      533        529       4     850     830      20 UA     
##  3  2013     2     1      456        500      -4     652     648       4 US     
##  4  2013     2     1      520        525      -5     816     820      -4 UA     
##  5  2013     3     1        4       2159     125     318      56     142 B6     
##  6  2013     3     1       50       2358      52     526     438      48 B6     
##  7  2013     4     1      454        500      -6     636     640      -4 US     
##  8  2013     4     1      509        515      -6     743     814     -31 UA     
##  9  2013     5     1        9       1655     434     308    2020     408 VX     
## 10  2013     5     1      451        500      -9     641     640       1 US     
## # … with 14 more rows, 9 more variables: flight <int>, tailnum <chr>,
## #   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
## #   minute <dbl>, time_hour <dttm>, and abbreviated variable names
## #   ¹​sched_dep_time, ²​dep_delay, ³​arr_time, ⁴​sched_arr_time, ⁵​arr_delay

Calculons le retard moyen par mois avec l’aide de la fonction mean.

##flights %>% group_by(month) %>% mutate(retard_mensuel=mean(dep))

Calculons le retard le plus important pour mois avec l’aide de la fonction max.

Toutefois, la fonction arrange ne tient pas en compte le groupage. Pour trier par groupe, il faudra ajouter l’argument .by_group = TRUE

head(flights %>% group_by(month) %>% arrange(dep_delay),10)
## # A tibble: 10 × 19
## # Groups:   month [8]
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013    12     7     2040       2123     -43      40    2352      48 B6     
##  2  2013     2     3     2022       2055     -33    2240    2338     -58 DL     
##  3  2013    11    10     1408       1440     -32    1549    1559     -10 EV     
##  4  2013     1    11     1900       1930     -30    2233    2243     -10 DL     
##  5  2013     1    29     1703       1730     -27    1947    1957     -10 F9     
##  6  2013     8     9      729        755     -26    1002     955       7 MQ     
##  7  2013    10    23     1907       1932     -25    2143    2143       0 EV     
##  8  2013     3    30     2030       2055     -25    2213    2250     -37 MQ     
##  9  2013     3     2     1431       1455     -24    1601    1631     -30 9E     
## 10  2013     5     5      934        958     -24    1225    1309     -44 B6     
## # … with 9 more variables: flight <int>, tailnum <chr>, origin <chr>,
## #   dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
## #   time_hour <dttm>, and abbreviated variable names ¹​sched_dep_time,
## #   ²​dep_delay, ³​arr_time, ⁴​sched_arr_time, ⁵​arr_delay

La fonction group_by peut être combinée avec la fonction summarise pour faire des aggrégations

head(flights %>% group_by(month) %>% summarise(dep_moy=mean(dep_delay)),10)
## # A tibble: 10 × 2
##    month dep_moy
##    <int>   <dbl>
##  1     1      NA
##  2     2      NA
##  3     3      NA
##  4     4      NA
##  5     5      NA
##  6     6      NA
##  7     7      NA
##  8     8      NA
##  9     9      NA
## 10    10      NA

La fonction summarise a une fonction spéciale n qui donne le nombre de cas. De même, les résultats obtenus peuvent être réutilisés dans les opérations.

flights %>% group_by(month) %>%
summarise(dep_moy=mean(dep_delay, na.rm = T),
dep_min=min(dep_delay, na.rm = T),
dep_max=max(dep_delay, na.rm = T), nombre=n())%>%
mutate(pourcentage=nombre*100/sum(nombre))
## # A tibble: 12 × 6
##    month dep_moy dep_min dep_max nombre pourcentage
##    <int>   <dbl>   <dbl>   <dbl>  <int>       <dbl>
##  1     1      NA     -30    1301  27004        8.02
##  2     2      NA     -33     853  24951        7.41
##  3     3      NA     -25     911  28834        8.56
##  4     4      NA     -21     960  28330        8.41
##  5     5      NA     -24     878  28796        8.55
##  6     6      NA     -21    1137  28243        8.39
##  7     7      NA     -22    1005  29425        8.74
##  8     8      NA     -26     520  29327        8.71
##  9     9      NA     -24    1014  27574        8.19
## 10    10      NA     -25     702  28889        8.58
## 11    11      NA     -32     798  27268        8.10
## 12    12      NA     -43     896  28135        8.35

Pour enlever le groupage, on utilisera la fonction ungroup.

Divers

Le package dplyr contient aussi quelques fonctions utiles :

  • sample_n et sample_frac qui permettent de choisir aléatoirement n lignes ou un pourcentage de lignes dans un tableau de données.
  • lag et lead qui permettent de prendre d’avoir une variable retardée ou avancée.
  • tally compte le nombre d’observations d’un groupe. distint permet de supprimer les doublons. Il faut l’accompagner de
  • l’option .keep_all pour conserver l’ensemble des colonnes du tableau.

Grahiques

ggplot2

ggplot2 est une extension du tidyverse qui permet de générer des graphiques avec une syntaxe cohérente et puissante. Elle nécessite l’apprentissage d’un “mini-langage” supplémentaire, mais permet la construction de graphiques complexes de manière efficace.

Une des particularités de ggplot2 est qu’elle part du principe que les données relatives à un graphique sont stockées dans un tableau de données (data frame, tibble ou autre). ggplot2 fait partie du coeur du tidyverse, elle est donc chargée automatiquement avec :

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0     ✔ purrr   1.0.1
## ✔ tibble  3.1.8     ✔ stringr 1.5.0
## ✔ tidyr   1.3.0     ✔ forcats 0.5.2
## ✔ readr   2.1.3     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()

On peut également la charger explicitement avec :

library(ggplot2)
library(questionr)
data(rp2018)
rp <- filter(
  rp2018,
  departement %in% c("Oise", "Rhône", "Hauts-de-Seine", "Lozère", "Bouches-du-Rhône")
)

ggplot(rp) + geom_histogram(aes(x = cadres))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(rp) + geom_point(aes(x = dipl_sup, y = cadres))

ggplot(rp) +
  geom_point(
    aes(x = dipl_sup, y = cadres),
    color = "darkgreen", size = 3, alpha = 0.3
  )

geom_boxplot

geom_boxplot permet de représenter des boîtes à moustaches. On lui passe en y la variable numérique dont on veut étudier la répartition, et en x la variable qualitative contenant les classes qu’on souhaite comparer. Ainsi, si on veut comparer la répartition du pourcentage de maisons en fonction du département de la commune, on pourra faire :

ggplot(rp) + geom_boxplot(aes(x = departement, y = maison))

geom_bar permet de produire un graphique en bâtons (barplot). On lui passe en x la variable qualitative dont on souhaite représenter l’effectif de chaque modalité.

Par exemple, si on veut afficher le nombre de communes de notre jeu de données pour chaque département :

ggplot(rp) + geom_bar(aes(x = departement))

ggplot(rp) +
  geom_bar(
    aes(x = departement, fill = pop_cl),
    position = "dodge"
  )

  ggplot(rp) +
  geom_bar(
    aes(x = departement, fill = pop_cl),
    position = "fill"
  )

L’add-in esquisse

esquisse est un package développé notamment par Victor Perrier de dreamRs et qui fournit une interface graphique pour la construction de graphiques avec ggplot2.

Pour l’utiliser, il faut évidemment préalablement installer l’extension :

install.packages(“esquisse”)

Pour lancer l’interface, ouvrez le menu Addins dans la barre d’outils de RStudio, et cliquez sur ‘ggplot2’ builder1.