x <- 3
x <- x + 1
x
chien <- c("Chihuahua", 5)
chien
y <- c(10, 20, NA, 40)
mean(y)
mean(y, na.rm = TRUE)
z <- 7
z > 5 & z < 10Découvrir un tableau de données
L3 économie-finance
Reprise de la séance 1
Sur papier, sans machine
Pour chaque ligne, écrivez ce que R va afficher. Ne lancez rien avant d’avoir écrit vos réponses.
10 minutes de prédiction individuelle, puis correction collective au tableau. C’est un diagnostic : notez les questions où la classe se trompe massivement.
Correction
x <- 3
x <- x + 1
x[1] 4
chien <- c("Chihuahua", 5)
chien[1] "Chihuahua" "5"
y <- c(10, 20, NA, 40)
mean(y)[1] NA
mean(y, na.rm = TRUE)[1] 23.33333
z <- 7
z > 5 & z < 10[1] TRUE
Deux pièges classiques : x <- x + 1 écrase l’ancienne valeur de x, et mélanger texte et nombre dans c() convertit tout en texte – silencieusement.
Du vecteur au tableau
Où nous en sommes
La séance précédente, vous avez manipulé des vecteurs : une suite de valeurs de même type.
tailles <- c(156, 164, 197, 147, 173)
mean(tailles)[1] 167.4
De vraies données ne se présentent jamais comme ça. Elles arrivent sous forme de tableau : des lignes (les individus, les observations) et des colonnes (les variables).
Ce que nous allons faire aujourd’hui
- Charger un vrai jeu de données d’enquête
- Apprendre à le regarder avant de le calculer
- Quatre opérations : choisir des colonnes, choisir des lignes, trier, créer une variable
Ces quatre opérations couvrent la très grande majorité du travail de préparation de données.
Un outil dédié : le tidyverse
Manipuler des tableaux avec les outils de base de R est possible, mais verbeux.
Le tidyverse est un ensemble de paquets conçus pour travailler sur des tableaux. C’est ce que nous utiliserons dans tout le reste du cours.
install.packages("tidyverse")
library(tidyverse)tidyverse n’est pas un paquet mais une collection : dplyr pour manipuler les tableaux, ggplot2 pour les graphiques, tidyr pour les réorganiser. Un seul library() les charge tous.
Nos données
L’enquête Histoires de vie 2003 de l’INSEE : 2000 personnes interrogées sur leurs conditions de vie, leur travail et leurs loisirs.
Elle est disponible dans le paquet questionr.
install.packages("questionr")
library(questionr)
data(hdv2003)C’est ce jeu de données qui nous accompagnera jusqu’à la fin du cours.
Regarder avant de calculer
Un tableau lisible
Nous convertissons le tableau en tibble, la forme de tableau utilisée par le tidyverse :
d <- as_tibble(hdv2003)
d# A tibble: 2,000 × 20
id age sexe nivetud poids occup qualif freres.soeurs clso relig
<int> <int> <fct> <fct> <dbl> <fct> <fct> <int> <fct> <fct>
1 1 28 Femme Enseignement… 2634. Exer… Emplo… 8 Oui Ni c…
2 2 23 Femme <NA> 9738. Etud… <NA> 2 Oui Ni c…
3 3 59 Homme Derniere ann… 3994. Exer… Techn… 2 Non Ni c…
4 4 34 Homme Enseignement… 5732. Exer… Techn… 1 Non Appa…
5 5 71 Femme Derniere ann… 4329. Retr… Emplo… 0 Oui Prat…
6 6 35 Femme Enseignement… 8675. Exer… Emplo… 5 Non Ni c…
7 7 60 Femme Derniere ann… 6166. Au f… Ouvri… 1 Oui Appa…
8 8 47 Homme Enseignement… 12892. Exer… Ouvri… 5 Non Ni c…
9 9 20 Femme <NA> 7809. Etud… <NA> 4 Oui Appa…
10 10 28 Homme Enseignement… 2277. Exer… Autre 2 Non Prat…
# ℹ 1,990 more rows
# ℹ 10 more variables: trav.imp <fct>, trav.satisf <fct>, hard.rock <fct>,
# lecture.bd <fct>, peche.chasse <fct>, cuisine <fct>, bricol <fct>,
# cinema <fct>, sport <fct>, heures.tv <dbl>
Un tibble s’affiche proprement : les dix premières lignes, le type de chaque colonne et le nombre de lignes restantes. Taper hdv2003 sans conversion aurait affiché toutes les colonnes sur plusieurs lignes.
Les dimensions
Un tableau est un objet comme un autre : on peut lui appliquer des fonctions.
nrow(d)[1] 2000
ncol(d)[1] 20
dim(d)[1] 2000 20
Le nom des variables
names(d) [1] "id" "age" "sexe" "nivetud"
[5] "poids" "occup" "qualif" "freres.soeurs"
[9] "clso" "relig" "trav.imp" "trav.satisf"
[13] "hard.rock" "lecture.bd" "peche.chasse" "cuisine"
[17] "bricol" "cinema" "sport" "heures.tv"
Un aperçu complet
glimpse() donne le type et les premières valeurs de chaque variable. C’est la commande à taper en premier devant un tableau inconnu.
glimpse(d)Rows: 2,000
Columns: 20
$ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
$ age <int> 28, 23, 59, 34, 71, 35, 60, 47, 20, 28, 65, 47, 63, 67, …
$ sexe <fct> Femme, Femme, Homme, Homme, Femme, Femme, Femme, Homme, …
$ nivetud <fct> "Enseignement superieur y compris technique superieur", …
$ poids <dbl> 2634.3982, 9738.3958, 3994.1025, 5731.6615, 4329.0940, 8…
$ occup <fct> "Exerce une profession", "Etudiant, eleve", "Exerce une …
$ qualif <fct> Employe, NA, Technicien, Technicien, Employe, Employe, O…
$ freres.soeurs <int> 8, 2, 2, 1, 0, 5, 1, 5, 4, 2, 3, 4, 1, 5, 2, 3, 4, 0, 2,…
$ clso <fct> Oui, Oui, Non, Non, Oui, Non, Oui, Non, Oui, Non, Oui, O…
$ relig <fct> Ni croyance ni appartenance, Ni croyance ni appartenance…
$ trav.imp <fct> Peu important, NA, Aussi important que le reste, Moins i…
$ trav.satisf <fct> Insatisfaction, NA, Equilibre, Satisfaction, NA, Equilib…
$ hard.rock <fct> Non, Non, Non, Non, Non, Non, Non, Non, Non, Non, Non, N…
$ lecture.bd <fct> Non, Non, Non, Non, Non, Non, Non, Non, Non, Non, Non, N…
$ peche.chasse <fct> Non, Non, Non, Non, Non, Non, Oui, Oui, Non, Non, Non, N…
$ cuisine <fct> Oui, Non, Non, Oui, Non, Non, Oui, Oui, Non, Non, Oui, N…
$ bricol <fct> Non, Non, Non, Oui, Non, Non, Non, Oui, Non, Non, Oui, O…
$ cinema <fct> Non, Oui, Non, Oui, Non, Oui, Non, Non, Oui, Oui, Oui, N…
$ sport <fct> Non, Oui, Oui, Oui, Non, Oui, Non, Non, Non, Oui, Non, O…
$ heures.tv <dbl> 0.0, 1.0, 0.0, 2.0, 3.0, 2.0, 2.9, 1.0, 2.0, 2.0, 1.0, 0…
Les types que vous allez voir
<int>et<dbl>: des nombres. Ce sont les variables quantitatives – l’âge, le nombre d’heures de télévision.<fct>: un facteur. C’est ainsi que R stocke une variable qualitative : un nombre limité de valeurs possibles, appelées modalités.
levels(d$qualif)[1] "Ouvrier specialise" "Ouvrier qualifie"
[3] "Technicien" "Profession intermediaire"
[5] "Cadre" "Employe"
[7] "Autre"
levels() donne la liste des modalités d’un facteur. L’opérateur $ désigne une colonne du tableau : d$qualif est le vecteur des qualifications.
Exercice 1
Ouvrez le tableau dans la visionneuse de RStudio :
View(d)Puis, dans un script (éventuellement en commentant) :
- Combien y a-t-il d’observations ? de variables ?
- Citez trois variables quantitatives et trois variables qualitatives.
- Quelles sont les modalités de la variable
relig? - Voyez-vous des valeurs manquantes ? Dans quelles variables ?
20 minutes. Insister sur le fait qu’on ne calcule rien avant d’avoir regardé.
Le tuyau
Enchaîner des opérations
Le tidyverse s’utilise avec un opérateur particulier, le tuyau (pipe) : |>.
Il prend ce qui est à sa gauche et le passe en premier argument de la fonction à sa droite.
# Ces deux écritures sont équivalentes :
mean(tailles)
tailles |> mean()Raccourci clavier dans RStudio : Ctrl + Shift + M.
Lisez |> comme « ensuite ». L’intérêt apparaîtra quand nous enchaînerons plusieurs opérations.
Quatre opérations
Choisir des colonnes : select()
d |> select(age, sexe, heures.tv)# A tibble: 2,000 × 3
age sexe heures.tv
<int> <fct> <dbl>
1 28 Femme 0
2 23 Femme 1
3 59 Homme 0
4 34 Homme 2
5 71 Femme 3
6 35 Femme 2
7 60 Femme 2.9
8 47 Homme 1
9 20 Femme 2
10 28 Homme 2
# ℹ 1,990 more rows
Écarter des colonnes
d |> select(-id, -poids)# A tibble: 2,000 × 18
age sexe nivetud occup qualif freres.soeurs clso relig trav.imp
<int> <fct> <fct> <fct> <fct> <int> <fct> <fct> <fct>
1 28 Femme Enseignement sup… Exer… Emplo… 8 Oui Ni c… Peu imp…
2 23 Femme <NA> Etud… <NA> 2 Oui Ni c… <NA>
3 59 Homme Derniere annee d… Exer… Techn… 2 Non Ni c… Aussi i…
4 34 Homme Enseignement sup… Exer… Techn… 1 Non Appa… Moins i…
5 71 Femme Derniere annee d… Retr… Emplo… 0 Oui Prat… <NA>
6 35 Femme Enseignement tec… Exer… Emplo… 5 Non Ni c… Le plus…
7 60 Femme Derniere annee d… Au f… Ouvri… 1 Oui Appa… <NA>
8 47 Homme Enseignement tec… Exer… Ouvri… 5 Non Ni c… Peu imp…
9 20 Femme <NA> Etud… <NA> 4 Oui Appa… <NA>
10 28 Homme Enseignement tec… Exer… Autre 2 Non Prat… Moins i…
# ℹ 1,990 more rows
# ℹ 9 more variables: trav.satisf <fct>, hard.rock <fct>, lecture.bd <fct>,
# peche.chasse <fct>, cuisine <fct>, bricol <fct>, cinema <fct>, sport <fct>,
# heures.tv <dbl>
Le signe - retire la colonne au lieu de la garder.
Choisir des lignes : filter()
filter() garde les lignes qui vérifient une condition. On retrouve ici les opérateurs logiques de la séance dernière.
d |> filter(age < 25)# A tibble: 169 × 20
id age sexe nivetud poids occup qualif freres.soeurs clso relig
<int> <int> <fct> <fct> <dbl> <fct> <fct> <int> <fct> <fct>
1 2 23 Femme <NA> 9738. Etud… <NA> 2 Oui Ni c…
2 9 20 Femme <NA> 7809. Etud… <NA> 4 Oui Appa…
3 18 20 Femme <NA> 1551. Etud… <NA> 0 Non Appa…
4 25 20 Femme <NA> 8780. Exer… Ouvri… 0 Non Appa…
5 38 19 Femme <NA> 7626. Etud… <NA> 1 Non Appa…
6 54 23 Femme Enseignement… 11355. Au f… <NA> 1 Non Prat…
7 56 23 Femme Enseignement… 6344. Exer… Ouvri… 1 Oui Prat…
8 59 23 Homme Enseignement… 3463. Chom… Emplo… 4 Oui Appa…
9 79 22 Femme Enseignement… 6169. Exer… Emplo… 3 Oui Rejet
10 94 23 Femme <NA> 4454. Etud… <NA> 0 Oui Prat…
# ℹ 159 more rows
# ℹ 10 more variables: trav.imp <fct>, trav.satisf <fct>, hard.rock <fct>,
# lecture.bd <fct>, peche.chasse <fct>, cuisine <fct>, bricol <fct>,
# cinema <fct>, sport <fct>, heures.tv <dbl>
Plusieurs conditions
d |> filter(age < 25, sexe == "Femme")# A tibble: 93 × 20
id age sexe nivetud poids occup qualif freres.soeurs clso relig
<int> <int> <fct> <fct> <dbl> <fct> <fct> <int> <fct> <fct>
1 2 23 Femme <NA> 9738. Etud… <NA> 2 Oui Ni c…
2 9 20 Femme <NA> 7809. Etud… <NA> 4 Oui Appa…
3 18 20 Femme <NA> 1551. Etud… <NA> 0 Non Appa…
4 25 20 Femme <NA> 8780. Exer… Ouvri… 0 Non Appa…
5 38 19 Femme <NA> 7626. Etud… <NA> 1 Non Appa…
6 54 23 Femme Enseignement… 11355. Au f… <NA> 1 Non Prat…
7 56 23 Femme Enseignement… 6344. Exer… Ouvri… 1 Oui Prat…
8 79 22 Femme Enseignement… 6169. Exer… Emplo… 3 Oui Rejet
9 94 23 Femme <NA> 4454. Etud… <NA> 0 Oui Prat…
10 100 19 Femme <NA> 2187. Exer… Emplo… 0 Oui Appa…
# ℹ 83 more rows
# ℹ 10 more variables: trav.imp <fct>, trav.satisf <fct>, hard.rock <fct>,
# lecture.bd <fct>, peche.chasse <fct>, cuisine <fct>, bricol <fct>,
# cinema <fct>, sport <fct>, heures.tv <dbl>
La virgule signifie « et ». Pour un « ou », utilisez |.
Et rappelez-vous : la comparaison s’écrit ==, avec deux signes égal.
Trier : arrange()
d |> arrange(age)# A tibble: 2,000 × 20
id age sexe nivetud poids occup qualif freres.soeurs clso relig
<int> <int> <fct> <fct> <dbl> <fct> <fct> <int> <fct> <fct>
1 162 18 Homme <NA> 4983. Etud… <NA> 2 Non Appa…
2 215 18 Homme <NA> 4631. Etud… <NA> 2 Oui Ni c…
3 346 18 Femme <NA> 1725. Etud… <NA> 9 Non Prat…
4 377 18 Homme <NA> 11213. Etud… <NA> 1 Oui Rejet
5 511 18 Homme <NA> 2448. Etud… <NA> 6 Non Prat…
6 646 18 Homme <NA> 4545. Exer… Ouvri… 6 Non Ni c…
7 852 18 Femme <NA> 3285. Etud… <NA> 0 Non Prat…
8 916 18 Femme <NA> 3564. Etud… <NA> 2 Non Ni c…
9 1211 18 Homme Enseignement… 14254. Exer… Ouvri… 1 Non Appa…
10 1213 18 Femme 2eme cycle 4910. Chom… <NA> 4 Non Ni c…
# ℹ 1,990 more rows
# ℹ 10 more variables: trav.imp <fct>, trav.satisf <fct>, hard.rock <fct>,
# lecture.bd <fct>, peche.chasse <fct>, cuisine <fct>, bricol <fct>,
# cinema <fct>, sport <fct>, heures.tv <dbl>
Trier dans l’autre sens
d |> arrange(desc(age))# A tibble: 2,000 × 20
id age sexe nivetud poids occup qualif freres.soeurs clso relig
<int> <int> <fct> <fct> <dbl> <fct> <fct> <int> <fct> <fct>
1 1916 97 Femme Derniere ann… 2163. Autr… Autre 5 Non Prat…
2 270 96 Femme Derniere ann… 9993. Retr… <NA> 1 Oui Ni c…
3 1542 93 Femme Derniere ann… 7108. Reti… <NA> 7 Non Prat…
4 235 92 Homme N'a jamais f… 827. Retr… Ouvri… 0 Ne s… Prat…
5 1151 91 Homme Derniere ann… 4291. Reti… <NA> 3 Oui Appa…
6 96 90 Femme Derniere ann… 5875. Au f… Emplo… 7 Non Prat…
7 1122 90 Femme 1er cycle 14812. Retr… Emplo… 3 Oui Prat…
8 1767 90 Femme Derniere ann… 12266. Reti… <NA> 2 Non Appa…
9 759 89 Femme Derniere ann… 9555. Au f… <NA> 1 Non Prat…
10 971 89 Homme Derniere ann… 2374. Retr… Ouvri… 5 Oui Prat…
# ℹ 1,990 more rows
# ℹ 10 more variables: trav.imp <fct>, trav.satisf <fct>, hard.rock <fct>,
# lecture.bd <fct>, peche.chasse <fct>, cuisine <fct>, bricol <fct>,
# cinema <fct>, sport <fct>, heures.tv <dbl>
Enchaîner
C’est ici que le tuyau prend son sens. Les femmes de moins de 25 ans, triées par nombre d’heures de télévision, en n’affichant que trois variables :
d |>
filter(age < 25, sexe == "Femme") |>
arrange(desc(heures.tv)) |>
select(age, heures.tv, qualif)# A tibble: 93 × 3
age heures.tv qualif
<int> <dbl> <fct>
1 19 10 Employe
2 18 10 <NA>
3 23 9 Employe
4 19 6 <NA>
5 23 6 <NA>
6 24 6 Employe
7 21 5 <NA>
8 18 5 Employe
9 22 5 Ouvrier specialise
10 24 4 Employe
# ℹ 83 more rows
Une opération par ligne, |> en fin de ligne. Le code se lit alors comme une phrase : prends d, ensuite filtre, ensuite trie, ensuite sélectionne.
Créer une variable : mutate()
La variable heures.tv contient le nombre d’heures quotidiennes passées devant la télévision. Convertissons-la en minutes :
d |>
mutate(minutes.tv = heures.tv * 60) |>
select(heures.tv, minutes.tv)# A tibble: 2,000 × 2
heures.tv minutes.tv
<dbl> <dbl>
1 0 0
2 1 60
3 0 0
4 2 120
5 3 180
6 2 120
7 2.9 174
8 1 60
9 2 120
10 2 120
# ℹ 1,990 more rows
Créer plusieurs variables
d |>
mutate(
minutes.tv = heures.tv * 60,
tv.semaine = heures.tv * 7
) |>
select(heures.tv, minutes.tv, tv.semaine)# A tibble: 2,000 × 3
heures.tv minutes.tv tv.semaine
<dbl> <dbl> <dbl>
1 0 0 0
2 1 60 7
3 0 0 0
4 2 120 14
5 3 180 21
6 2 120 14
7 2.9 174 20.3
8 1 60 7
9 2 120 14
10 2 120 14
# ℹ 1,990 more rows
Attention : conserver le résultat
Les verbes du tidyverse ne modifient pas le tableau : ils en renvoient une version transformée. Pour garder le résultat, il faut l’assigner.
d <- d |> mutate(minutes.tv = heures.tv * 60)C’est l’erreur la plus fréquente au début : on lance d |> mutate(...), on voit le bon résultat s’afficher, et on constate ensuite que la variable n’existe pas.
Sans <-, rien n’est conservé. Et surtout : R ne dit rien.
Récapitulatif
| Verbe | Ce qu’il fait |
|---|---|
select() |
choisit des colonnes |
filter() |
choisit des lignes |
arrange() |
trie les lignes |
mutate() |
crée ou modifie une colonne |
Tous prennent le tableau en premier argument, tous renvoient un tableau. C’est ce qui permet de les enchaîner avec |>.
À vous
Exercice 2
Dans un script commenté :
- Affichez uniquement les variables
age,qualifetsport. - Combien y a-t-il d’enquêtés de plus de 60 ans (inclus) ?
- Affichez les hommes qui déclarent pratiquer un sport, triés du plus jeune au plus âgé.
- Créez une variable
tv.annuelle(heures de télévision par an) et conservez-la dansd. - Quel est l’enquêté le plus âgé du jeu de données ? Quelle est son niveau d’étude ?
- Combien d’enquêtés ont entre 25 (inclus) et 35 ans (exclus) ?
Pour la question 6 : deux conditions séparées par une virgule.
Exercices swirl
library(swirl)
swirl()Faites la leçon Tableaux_de_donnees et Manipuler_les_donnees et déposez le fichier sur Moodle.
Pour la prochaine séance
Terminez les leçons swirl Tableaux_de_donnees et Manipuler_les_donnees.
Séance prochaine : nous savons désormais découper un tableau. Nous allons apprendre à le résumer – moyennes, effectifs, comparaisons entre groupes.