Décrire des données

L3 économie-finance

Auteur·rice
Affiliation

Elias Bouacida

Université Paris 8

Date de publication

12 octobre 2026

Reprise du chapitre 2

Voici un petit tableau de six personnes, appelé tab :

# A tibble: 6 × 4
  prenom   age categorie heures_tv
  <chr>  <dbl> <chr>         <dbl>
1 Alice     22 Étudiant          1
2 Bilal     45 Cadre             3
3 Chloé     31 Employé           2
4 David     19 Étudiant          4
5 Éva       58 Cadre             2
6 Farid     27 Ouvrier           5

Sur une feuille, sans lancer R, dessinez le tableau produit par chacun des deux enchaînements suivants : ses colonnes, ses lignes et leur ordre.

tab |>
  filter(categorie != "Étudiant") |>
  arrange(age) |>
  select(prenom, categorie)

tab |>
  mutate(heures_semaine = heures_tv * 7) |>
  filter(heures_semaine > 14)
tab <- tibble(
  prenom = c("Alice", "Bilal", "Chloé", "David", "Éva", "Farid"),
  age = c(22, 45, 31, 19, 58, 27),
  categorie = c("Étudiant", "Cadre", "Employé", "Étudiant", "Cadre", "Ouvrier"),
  heures_tv = c(1, 3, 2, 4, 2, 5)
)

tab |>
  filter(categorie != "Étudiant") |>
  arrange(age) |>
  select(prenom, categorie)
# A tibble: 4 × 2
  prenom categorie
  <chr>  <chr>    
1 Farid  Ouvrier  
2 Chloé  Employé  
3 Bilal  Cadre    
4 Éva    Cadre    
tab |>
  mutate(heures_semaine = heures_tv * 7) |>
  filter(heures_semaine > 14)
# A tibble: 3 × 5
  prenom   age categorie heures_tv heures_semaine
  <chr>  <dbl> <chr>         <dbl>          <dbl>
1 Bilal     45 Cadre             3             21
2 David     19 Étudiant          4             28
3 Farid     27 Ouvrier           5             35

Dans le premier enchaînement, filter() retire les deux étudiants, arrange() trie les quatre lignes restantes par âge, et select() ne garde que deux colonnes. Le tri se fait bien sur l’âge, même si la colonne age n’apparaît plus à la fin : elle existait encore au moment du tri.

Dans le second, mutate() ajoute une colonne au tableau complet, sans retirer les autres. Le filter() qui suit porte sur ce tableau augmenté : il peut donc utiliser la nouvelle colonne heures_semaine.

Si vous avez confondu filter() et select(), ou oublié que mutate() conserve toutes les colonnes, relisez le chapitre 2 avant d’aller plus loin.

Où nous en sommes

Au chapitre précédent, nous avons appris à découper un tableau avec select(), filter(), arrange() et mutate().

d |>
  filter(age < 25) |>
  select(age, sexe, qualif)
# A tibble: 169 × 3
     age sexe  qualif            
   <int> <fct> <fct>             
 1    23 Femme <NA>              
 2    20 Femme <NA>              
 3    20 Femme <NA>              
 4    20 Femme Ouvrier specialise
 5    19 Femme <NA>              
 6    23 Femme <NA>              
 7    23 Femme Ouvrier specialise
 8    23 Homme Employe           
 9    22 Femme Employe           
10    23 Femme <NA>              
# ℹ 159 more rows

Pour la suite, votre script doit commencer par charger les paquets et les données, comme au chapitre précédent :

library(tidyverse)
library(questionr)
data(hdv2003)
d <- as_tibble(hdv2003)

Dans ce chapitre, nous allons résumer une variable quantitative (moyenne, dispersion, quartiles), compter les modalités d’une variable qualitative, comparer des groupes et croiser deux variables. Nous verrons aussi un danger qui apparaît dès qu’on produit des chiffres : les calculs qui donnent un résultat faux sans rien dire.

Variables quantitatives

De quoi parle-t-on

Une variable quantitative est numérique et peut prendre un grand nombre de valeurs différentes. Dans nos données, c’est le cas de l’âge (age), du nombre d’heures passées devant la télévision (heures.tv) ou du nombre de frères et sœurs (freres.soeurs).

d |> select(age, heures.tv, freres.soeurs)
# A tibble: 2,000 × 3
     age heures.tv freres.soeurs
   <int>     <dbl>         <int>
 1    28       0               8
 2    23       1               2
 3    59       0               2
 4    34       2               1
 5    71       3               0
 6    35       2               5
 7    60       2.9             1
 8    47       1               5
 9    20       2               4
10    28       2               2
# ℹ 1,990 more rows

Résumer : summarise()

summarise() calcule des indicateurs sur l’ensemble du tableau, et renvoie un tableau d’une seule ligne. Comme dans mutate(), on donne à gauche du = le nom de chaque indicateur, et à droite le calcul :

d |> summarise(
  moyenne = mean(age),
  mediane = median(age),
  minimum = min(age),
  maximum = max(age)
)
# A tibble: 1 × 4
  moyenne mediane minimum maximum
    <dbl>   <dbl>   <int>   <int>
1    48.2      48      18      97

Indicateurs de dispersion

La moyenne et la médiane disent où se situe le centre des valeurs. Les indicateurs de dispersion disent si les valeurs sont regroupées autour de ce centre, ou au contraire étalées.

Le plus simple est l’étendue, l’écart entre la plus grande et la plus petite valeur. Les plus utilisés sont la variance (var()) et l’écart-type (sd(), pour standard deviation), qui mesurent l’écart moyen des valeurs à la moyenne.

d |> summarise(
  etendue = max(age) - min(age),
  variance = var(age),
  ecart_type = sd(age)
)
# A tibble: 1 × 3
  etendue variance ecart_type
    <int>    <dbl>      <dbl>
1      79     287.       16.9

Quartiles

Les quartiles découpent les observations, rangées par ordre croissant, en quatre groupes de même taille :

  • le premier quartile est la valeur en dessous de laquelle se trouvent 25 % des observations ;
  • le deuxième quartile est la médiane : 50 % des observations en dessous, 50 % au-dessus ;
  • le troisième quartile laisse 75 % des observations en dessous.

La fonction quantile() les calcule. Son second argument est une proportion entre 0 et 1 : 0.5 donne la médiane, 0.1 le premier décile.

d |> summarise(
  q1 = quantile(age, 0.25),
  q2 = quantile(age, 0.50),
  q3 = quantile(age, 0.75)
)
# A tibble: 1 × 3
     q1    q2    q3
  <dbl> <dbl> <dbl>
1    35    48    60

Un résumé rapide

Pour un premier aperçu, summary() donne l’essentiel en une seule commande :

summary(d$age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  18.00   35.00   48.00   48.16   60.00   97.00 

summary() attend un vecteur, d’où le $. C’est pratique pour explorer, mais son résultat n’est pas un tableau : on ne peut pas l’enchaîner avec |>. Pour un résultat que vous réutiliserez, préférez summarise().

Valeurs manquantes

Calculons maintenant la moyenne des heures de télévision :

d |> summarise(moyenne = mean(heures.tv))
# A tibble: 1 × 1
  moyenne
    <dbl>
1      NA

Le résultat est NA. Comme au chapitre 1, la variable contient des valeurs manquantes, et la moyenne d’un ensemble contenant une valeur inconnue est inconnue. L’argument na.rm = TRUE demande d’écarter ces valeurs. Il est prudent de compter en même temps combien on en écarte :

d |> summarise(
  moyenne = mean(heures.tv, na.rm = TRUE),
  nombre_na = sum(is.na(heures.tv))
)
# A tibble: 1 × 2
  moyenne nombre_na
    <dbl>     <int>
1    2.25         5

is.na() renvoie TRUE pour chaque valeur manquante et FALSE pour les autres. sum() compte les TRUE, car R les traite comme des 1 et les FALSE comme des 0. La moyenne porte donc sur 1995 personnes, et non sur 2000.

Les erreurs silencieuses

Le vrai danger

Au chapitre 1, nous avons vu comment lire un message d’erreur. Ces erreurs-là sont en fait les plus faciles : R refuse de continuer, et vous savez qu’il y a un problème.

À partir de maintenant, vous produisez des chiffres. Or un chiffre faux ressemble exactement à un chiffre juste. Aucun message d’erreur ne vous préviendra qu’une moyenne porte sur la mauvaise population.

Trois pièges

na.rm = TRUE change la population. Avec cet argument, vous ne calculez plus la moyenne des 2000 enquêtés, mais celle des seuls répondants. Ce n’est pas un problème en soi, mais il faut le savoir, et pouvoir le dire : comptez toujours combien de valeurs vous écartez.

L’oubli du <-. Vous croyez avoir créé ou modifié une variable avec mutate(), mais sans assignation, elle n’existe pas. Les calculs suivants portent sur l’ancien tableau, et rien ne vous le signale.

Les effectifs faibles. Une moyenne calculée sur six personnes n’est pas comparable à une moyenne calculée sur huit cents : quelques individus atypiques suffisent à la déplacer. Affichez toujours l’effectif à côté de l’indicateur.

La parade

Trois réflexes protègent de ces pièges.

  • Prédisez avant de lancer. Écrivez en commentaire l’ordre de grandeur que vous attendez. Un résultat qui vous surprend est soit une découverte, soit une erreur : il faut trancher avant de passer à la suite.
  • Affichez toujours l’effectif à côté de chaque indicateur.
  • Recoupez. Un même chiffre obtenu de deux façons différentes est probablement juste.

Variables qualitatives

De quoi parle-t-on

Une variable qualitative ne prend qu’un nombre limité de valeurs, appelées modalités : le sexe (sexe), le niveau d’études (nivetud), la qualification professionnelle (qualif).

La frontière n’est pas toujours nette. Une variable qualitative peut être codée par des nombres, et certaines variables peuvent se traiter au choix comme quantitatives ou qualitatives : c’est le cas du nombre de frères et sœurs, qui ne prend que quelques valeurs entières.

Tri à plat : count()

Le tri à plat compte le nombre d’observations pour chaque modalité. La fonction count() le produit, dans une colonne appelée n :

d |> count(sexe)
# A tibble: 2 × 2
  sexe      n
  <fct> <int>
1 Homme   899
2 Femme  1101

L’argument sort = TRUE trie les modalités de la plus fréquente à la moins fréquente :

d |> count(qualif, sort = TRUE)
# A tibble: 8 × 2
  qualif                       n
  <fct>                    <int>
1 Employe                    594
2 <NA>                       347
3 Ouvrier qualifie           292
4 Cadre                      260
5 Ouvrier specialise         203
6 Profession intermediaire   160
7 Technicien                  86
8 Autre                       58

Remarquez la ligne <NA> : count() affiche les valeurs manquantes comme une modalité à part entière. C’est une bonne chose : vous voyez immédiatement combien il y en a.

Passer aux pourcentages

Les effectifs bruts se comparent mal. On les rapporte au total avec mutate(), puisque le résultat de count() est un tableau comme un autre. sum(n) est le total des effectifs, et round(..., 1) arrondit à une décimale :

d |>
  count(qualif) |>
  mutate(pourcentage = round(100 * n / sum(n), 1))
# A tibble: 8 × 3
  qualif                       n pourcentage
  <fct>                    <int>       <dbl>
1 Ouvrier specialise         203        10.2
2 Ouvrier qualifie           292        14.6
3 Technicien                  86         4.3
4 Profession intermediaire   160         8  
5 Cadre                      260        13  
6 Employe                    594        29.7
7 Autre                       58         2.9
8 <NA>                       347        17.4

Exercice 1

  1. Faites le tri à plat de la variable relig. Quelle est la modalité la plus fréquente ?
  2. Exprimez ce tri à plat en pourcentages.
  3. Quelle proportion des enquêtés pratique la pêche ou la chasse (peche.chasse) ?
  4. Combien de valeurs manquantes contient la variable trav.satisf ? Que représentent-elles, à votre avis ?

Pour la question 4, regardez qui sont les personnes concernées, par exemple avec filter(is.na(trav.satisf)) : une valeur manquante a souvent un sens.

d |> count(relig, sort = TRUE)
# A tibble: 6 × 2
  relig                           n
  <fct>                       <int>
1 Appartenance sans pratique    760
2 Pratiquant occasionnel        442
3 Ni croyance ni appartenance   399
4 Pratiquant regulier           266
5 Rejet                          93
6 NSP ou NVPR                    40

La modalité la plus fréquente est « Appartenance sans pratique ».

d |>
  count(relig, sort = TRUE) |>
  mutate(pourcentage = round(100 * n / sum(n), 1))
# A tibble: 6 × 3
  relig                           n pourcentage
  <fct>                       <int>       <dbl>
1 Appartenance sans pratique    760        38  
2 Pratiquant occasionnel        442        22.1
3 Ni croyance ni appartenance   399        20  
4 Pratiquant regulier           266        13.3
5 Rejet                          93         4.7
6 NSP ou NVPR                    40         2  
d |>
  count(peche.chasse) |>
  mutate(pourcentage = round(100 * n / sum(n), 1))
# A tibble: 2 × 3
  peche.chasse     n pourcentage
  <fct>        <int>       <dbl>
1 Non           1776        88.8
2 Oui            224        11.2

11,2 % des enquêtés pratiquent la pêche ou la chasse.

d |> summarise(nombre_na = sum(is.na(trav.satisf)))
# A tibble: 1 × 1
  nombre_na
      <int>
1       952
d |>
  filter(is.na(trav.satisf)) |>
  count(occup)
# A tibble: 7 × 2
  occup                     n
  <fct>                 <int>
1 Exerce une profession     1
2 Chomeur                 134
3 Etudiant, eleve          94
4 Retraite                392
5 Retire des affaires      77
6 Au foyer                171
7 Autre inactif            83

La variable trav.satisf compte 952 valeurs manquantes. À une exception près, elles concernent des personnes qui n’exercent pas de profession : chômeurs, retraités, étudiants, personnes au foyer. La question sur la satisfaction au travail ne leur a pas été posée. Ces NA ne sont donc pas des refus de répondre : une moyenne de satisfaction ne porte que sur les personnes qui travaillent.

Comparer des groupes

group_by()

group_by() découpe le tableau en groupes, selon les modalités d’une variable. Un summarise() placé ensuite calcule ses indicateurs dans chaque groupe, et renvoie une ligne par groupe :

d |>
  group_by(sexe) |>
  summarise(
    effectif = n(),
    age_moyen = mean(age),
    tv_moyenne = mean(heures.tv, na.rm = TRUE)
  )
# A tibble: 2 × 4
  sexe  effectif age_moyen tv_moyenne
  <fct>    <int>     <dbl>      <dbl>
1 Homme      899      48.2       2.22
2 Femme     1101      48.2       2.27

n() donne l’effectif de chaque groupe. Prenez l’habitude de toujours l’inclure : c’est lui qui vous montre si une comparaison repose sur assez d’observations.

Grouper sur plusieurs variables

On peut grouper selon plusieurs variables à la fois. On obtient alors une ligne par combinaison de modalités :

d |>
  group_by(sexe, sport) |>
  summarise(
    effectif = n(),
    age_moyen = mean(age),
    .groups = "drop"
  )
# A tibble: 4 × 4
  sexe  sport effectif age_moyen
  <fct> <fct>    <int>     <dbl>
1 Homme Non        530      53.3
2 Homme Oui        369      40.7
3 Femme Non        747      51.5
4 Femme Oui        354      41.1

L’argument .groups = "drop" supprime le regroupement une fois le calcul fait. Sans lui, R affiche un message pour vous prévenir que le résultat est encore groupé, ce qui modifierait le comportement des opérations suivantes.

L’outil central du cours

La combinaison suivante est la plus utile de tout ce que nous verrons :

découper en groupes (group_by()), calculer un indicateur par groupe (summarise()), trier le résultat (arrange()).

Par exemple, quelles qualifications regardent le plus la télévision ?

d |>
  group_by(qualif) |>
  summarise(
    effectif = n(),
    tv_moyenne = mean(heures.tv, na.rm = TRUE)
  ) |>
  arrange(desc(tv_moyenne))
# A tibble: 8 × 3
  qualif                   effectif tv_moyenne
  <fct>                       <int>      <dbl>
1 Ouvrier specialise            203       3.00
2 Ouvrier qualifie              292       2.47
3 Employe                       594       2.42
4 Technicien                     86       2.11
5 Profession intermediaire      160       2.03
6 <NA>                          347       2.01
7 Autre                          58       1.87
8 Cadre                         260       1.60

Regardez la colonne effectif avant d’interpréter les moyennes : tous les groupes n’ont pas la même taille.

Exercice 2

Pour chaque question, écrivez en commentaire, avant de lancer le code, le résultat que vous attendez.

  1. L’âge moyen varie-t-il selon le niveau d’études (nivetud) ?
  2. Les personnes qui déclarent lire des bandes dessinées (lecture.bd) sont-elles plus jeunes que les autres ?
  3. Comparez le nombre moyen d’heures de télévision selon la qualification. Y a-t-il des groupes trop petits pour que la comparaison soit sérieuse ?
d |>
  group_by(nivetud) |>
  summarise(effectif = n(), age_moyen = mean(age))
# A tibble: 9 × 3
  nivetud                                                     effectif age_moyen
  <fct>                                                          <int>     <dbl>
1 N'a jamais fait d'etudes                                          39      59.7
2 A arrete ses etudes, avant la derniere annee d'etudes prim…       86      63.0
3 Derniere annee d'etudes primaires                                341      63.4
4 1er cycle                                                        204      50.9
5 2eme cycle                                                       183      47.8
6 Enseignement technique ou professionnel court                    463      45.2
7 Enseignement technique ou professionnel long                     131      40.0
8 Enseignement superieur y compris technique superieur             441      43.3
9 <NA>                                                             112      22.8

Les enquêtés les moins diplômés sont les plus âgés : les études se sont allongées au fil des générations. La ligne NA regroupe 112 enquêtés de 23 ans en moyenne, sans doute encore en études.

d |>
  group_by(lecture.bd) |>
  summarise(effectif = n(), age_moyen = mean(age))
# A tibble: 2 × 3
  lecture.bd effectif age_moyen
  <fct>         <int>     <dbl>
1 Non            1953      48.3
2 Oui              47      43.7

Les lecteurs de bandes dessinées ont en moyenne 44 ans, contre 48 ans pour les autres. Mais ils ne sont que 47 : la différence est à prendre avec prudence.

d |>
  group_by(qualif) |>
  summarise(
    effectif = n(),
    tv_moyenne = mean(heures.tv, na.rm = TRUE)
  ) |>
  arrange(desc(tv_moyenne))
# A tibble: 8 × 3
  qualif                   effectif tv_moyenne
  <fct>                       <int>      <dbl>
1 Ouvrier specialise            203       3.00
2 Ouvrier qualifie              292       2.47
3 Employe                       594       2.42
4 Technicien                     86       2.11
5 Profession intermediaire      160       2.03
6 <NA>                          347       2.01
7 Autre                          58       1.87
8 Cadre                         260       1.60

Les ouvriers spécialisés regardent la télévision 3 heures par jour en moyenne, les cadres 1,6 heure. Les plus petits groupes, « Autre » (58 personnes) et « Technicien » (86), restent comparables, mais leurs moyennes sont moins sûres que celles des employés (594). La ligne NA (347 personnes) regroupe surtout des personnes sans emploi : ce n’est pas une qualification.

Croiser deux variables

L’analyse bivariée

Faire une analyse bivariée, c’est étudier la relation entre deux variables. Sont-elles liées ? Les valeurs de l’une varient-elles avec celles de l’autre ? Ou sont-elles indépendantes ?

Deux variables qualitatives

Pour croiser deux variables qualitatives, on compte les effectifs de chaque combinaison de modalités. Il suffit de donner deux variables à count() :

d |> count(qualif, sexe)
# A tibble: 16 × 3
   qualif                   sexe      n
   <fct>                    <fct> <int>
 1 Ouvrier specialise       Homme    96
 2 Ouvrier specialise       Femme   107
 3 Ouvrier qualifie         Homme   229
 4 Ouvrier qualifie         Femme    63
 5 Technicien               Homme    66
 6 Technicien               Femme    20
 7 Profession intermediaire Homme    88
 8 Profession intermediaire Femme    72
 9 Cadre                    Homme   145
10 Cadre                    Femme   115
11 Employe                  Homme    96
12 Employe                  Femme   498
13 Autre                    Homme    21
14 Autre                    Femme    37
15 <NA>                     Homme   158
16 <NA>                     Femme   189

Le résultat est correct, mais peu lisible : une ligne par combinaison. La fonction pivot_wider() le remet en forme de tableau à double entrée. L’argument names_from indique la variable dont les modalités deviennent des colonnes, et values_from celle qui remplit les cases :

d |>
  count(qualif, sexe) |>
  pivot_wider(names_from = sexe, values_from = n)
# A tibble: 8 × 3
  qualif                   Homme Femme
  <fct>                    <int> <int>
1 Ouvrier specialise          96   107
2 Ouvrier qualifie           229    63
3 Technicien                  66    20
4 Profession intermediaire    88    72
5 Cadre                      145   115
6 Employe                     96   498
7 Autre                       21    37
8 <NA>                       158   189

Pourcentages en ligne

Les effectifs bruts ne se comparent pas, car les groupes n’ont pas la même taille. On calcule donc des pourcentages à l’intérieur de chaque ligne. Pour cela, on groupe par qualif avant de calculer les pourcentages : sum(n) est alors le total de chaque qualification, et non le total général.

d |>
  count(qualif, sexe) |>
  group_by(qualif) |>
  mutate(pourcentage = round(100 * n / sum(n), 1)) |>
  ungroup() |>
  select(-n) |>
  pivot_wider(names_from = sexe, values_from = pourcentage)
# A tibble: 8 × 3
  qualif                   Homme Femme
  <fct>                    <dbl> <dbl>
1 Ouvrier specialise        47.3  52.7
2 Ouvrier qualifie          78.4  21.6
3 Technicien                76.7  23.3
4 Profession intermediaire  55    45  
5 Cadre                     55.8  44.2
6 Employe                   16.2  83.8
7 Autre                     36.2  63.8
8 <NA>                      45.5  54.5

ungroup() supprime le regroupement une fois les pourcentages calculés, et select(-n) retire les effectifs pour ne garder que les pourcentages dans le tableau final.

Ligne ou colonne ?

Le choix entre pourcentages en ligne et en colonne change complètement la lecture :

  • les pourcentages en ligne répondent à la question : parmi les cadres, quelle est la part des femmes ?
  • les pourcentages en colonne répondent à la question : parmi les femmes, quelle est la part des cadres ?

Pour obtenir les pourcentages en colonne, il suffit de grouper par sexe au lieu de qualif.

Important

Ce sont deux questions différentes, et deux tableaux différents, calculés à partir des mêmes effectifs. Sachez toujours dire lequel des deux vous êtes en train de lire : c’est là que se logent la plupart des interprétations fausses.

Deux variables quantitatives

Pour deux variables numériques, on mesure la relation par le coefficient de corrélation, compris entre -1 et 1 :

d |> summarise(
  correlation = cor(age, heures.tv, use = "complete.obs")
)
# A tibble: 1 × 1
  correlation
        <dbl>
1       0.178

L’argument use = "complete.obs" joue le rôle de na.rm = TRUE : il écarte les observations dont l’une des deux valeurs manque.

Avertissement

Une corrélation mesure une association linéaire, pas une causalité. Et une corrélation proche de zéro n’exclut pas une relation d’une autre forme : nous le verrons graphiquement au chapitre suivant.

À vous

Exercice 3

Produisez un court script commenté qui répond aux questions suivantes :

  1. Quel est l’âge moyen des enquêtés, selon leur qualification ?
  2. Le nombre d’heures de télévision varie-t-il selon le niveau d’études ?
  3. Les hommes et les femmes déclarent-ils pratiquer un sport dans les mêmes proportions ?

Pour chaque question, affichez l’effectif de chaque groupe à côté de l’indicateur, et écrivez une phrase de commentaire qui dit ce que vous lisez dans le résultat.

# L'âge moyen varie peu selon la qualification : de 46 à 50 ans.
d |>
  group_by(qualif) |>
  summarise(effectif = n(), age_moyen = mean(age)) |>
  arrange(desc(age_moyen))
# A tibble: 8 × 3
  qualif                   effectif age_moyen
  <fct>                       <int>     <dbl>
1 Ouvrier qualifie              292      50.0
2 Cadre                         260      49.7
3 Profession intermediaire      160      49.1
4 Ouvrier specialise            203      48.9
5 <NA>                          347      47.9
6 Autre                          58      47.0
7 Employe                       594      46.7
8 Technicien                     86      45.9
# Le temps passé devant la télévision diminue avec le niveau d'études :
# environ 3 heures par jour pour les niveaux primaires, 1,6 heure
# pour l'enseignement supérieur. Le groupe « N'a jamais fait d'études »
# ne compte que 39 personnes.
d |>
  group_by(nivetud) |>
  summarise(
    effectif = n(),
    tv_moyenne = mean(heures.tv, na.rm = TRUE)
  )
# A tibble: 9 × 3
  nivetud                                                    effectif tv_moyenne
  <fct>                                                         <int>      <dbl>
1 N'a jamais fait d'etudes                                         39       2.82
2 A arrete ses etudes, avant la derniere annee d'etudes pri…       86       3.13
3 Derniere annee d'etudes primaires                               341       2.97
4 1er cycle                                                       204       2.54
5 2eme cycle                                                      183       2.02
6 Enseignement technique ou professionnel court                   463       2.32
7 Enseignement technique ou professionnel long                    131       2.11
8 Enseignement superieur y compris technique superieur            441       1.57
9 <NA>                                                            112       1.53
# 41 % des hommes déclarent pratiquer un sport, contre 32 % des femmes.
d |>
  count(sexe, sport) |>
  group_by(sexe) |>
  mutate(pourcentage = round(100 * n / sum(n), 1))
# A tibble: 4 × 4
# Groups:   sexe [2]
  sexe  sport     n pourcentage
  <fct> <fct> <int>       <dbl>
1 Homme Non     530        59  
2 Homme Oui     369        41  
3 Femme Non     747        67.8
4 Femme Oui     354        32.2

Pour la question 3, on groupe par sexe avant de calculer les pourcentages : on compare ainsi la part de sportifs parmi les hommes et parmi les femmes. Grouper par sport répondrait à une autre question : parmi les sportifs, quelle part d’hommes ?

Les leçons swirl

library(swirl)
swirl()

Faites les leçons Valeurs_manquantes puis Decrire_les_donnees, et déposez les fichiers .txt sur Moodle. Si vous bloquez sur une question, voir Si vous êtes bloqués.

Si vous voulez pratiquer davantage, la leçon facultative Exercice_2 reprend le chargement et le résumé d’un tableau. Voir LECONS_OPTIONNELLES.md.

La suite

Avant de passer au chapitre suivant, terminez les deux leçons swirl et déposez-les sur Moodle.

Au chapitre suivant, nous reprendrons les mêmes questions, mais en graphiques. Vous verrez que certaines choses invisibles dans un tableau sautent aux yeux dans un graphique.