Découvrir un tableau de données

L3 économie-finance

Elias Bouacida

Université Paris 8

9 septembre 2026

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.

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 < 10

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

Important

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)

Note

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>

Astuce

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)

Un aperçu complet

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) :

  1. Combien y a-t-il d’observations ? de variables ?
  2. Citez trois variables quantitatives et trois variables qualitatives.
  3. Quelles sont les modalités de la variable relig ?
  4. Voyez-vous des valeurs manquantes ? Dans quelles variables ?

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()

Astuce

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>

Avertissement

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

Astuce

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)

Important

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

Les quatre verbes de base
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é :

  1. Affichez uniquement les variables age, qualif et sport.
  2. Combien y a-t-il d’enquêtés de plus de 60 ans (inclus) ?
  3. Affichez les hommes qui déclarent pratiquer un sport, triés du plus jeune au plus âgé.
  4. Créez une variable tv.annuelle (heures de télévision par an) et conservez-la dans d.
  5. Quel est l’enquêté le plus âgé du jeu de données ? Quelle est son niveau d’étude ?
  6. Combien d’enquêtés ont entre 25 (inclus) et 35 ans (exclus) ?

Astuce

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.