# 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
Décrire des données
L3 économie-finance
Reprise du chapitre 2
Voici un petit tableau de six personnes, appelé tab :
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
- Faites le tri à plat de la variable
relig. Quelle est la modalité la plus fréquente ? - Exprimez ce tri à plat en pourcentages.
- Quelle proportion des enquêtés pratique la pêche ou la chasse (
peche.chasse) ? - 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.
- L’âge moyen varie-t-il selon le niveau d’études (
nivetud) ? - Les personnes qui déclarent lire des bandes dessinées (
lecture.bd) sont-elles plus jeunes que les autres ? - 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.
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.
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 :
- Quel est l’âge moyen des enquêtés, selon leur qualification ?
- Le nombre d’heures de télévision varie-t-il selon le niveau d’études ?
- 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.