Solution pour TP 01

Auteur·rice

Andreas Eich

Mis à jour

25.02.2025

Créez un “chunk R” en dessous de ce texte en plaçant le curseur en dessous du texte et en cliquant sur “Insérer un nouveau chunk de code” (une icône blanche C avec un fond vert):

Ensuite, calculez 3 + 4. Pour « évaluer » (c.-à-d. exécuter le code), utilisez Ctrl + Entrée ou cliquez sur le triangle.

3 + 4
[1] 7

Maintenant, nous pouvons avoir un premier aperçu des données. Je l’ai déjà chargé dans R, vous apprendrez comment le faire vous-même plus tard.

Les données s’appellent penguins. Il contient des données pour l’espèce, le sexe, la longueur du bec et la profondeur, le poids, etc. pour différents manchots. Nous utiliserons cela comme exemple. Vous pouvez en savoir plus sur les données ici.

Maintenant, pour voir les données, vous pouvez cliquer sur “manchots” dans l’onglet “Environnement”. Une vue de tableau s’ouvrira montrant toutes les données. Vous connaissez cela d’Excel. Mais c’est « en lecture seule », donc vous ne pouvez pas modifier les valeurs d’ici.

Maintenant, vous pouvez également utiliser le code R pour avoir une idée des données. Avec la fonction head(), les 6 premières lignes des données sont affichées.

Tâche 1

Utilisez le chunk de code R ci-dessous et remplacez ____ par le nom du cadre de données (penguins). Lorsque vous exécutez le chunk, vous verrez les premières lignes :

head(penguins)
# A tibble: 6 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           36.7          19.3               193        3450
5 Adelie  Torgersen           39.3          20.6               190        3650
6 Adelie  Torgersen           38.9          17.8               181        3625
# ℹ 2 more variables: sex <fct>, year <int>

Vérification d’apprentissage 1 :

Que contient chaque ligne dans penguins ?

❌ A. Données pour tous les manchots sur une île spécifique, par exemple Biscoe

❌ B. Données pour tous les manchots d’une espèce, par exemple Adélie

✅ C. Données pour un seul manchot

Si vous voulez jeter un coup d’œil à une colonne, vous pouvez la sélectionner avec le symbole dollar $ : données$nom_colonne.

Tâche 2

Maintenant, essayez vous-même. Sélectionnez la colonne bill_length_mm du cadre de données penguins :

penguins$bill_length_mm
  [1] 39.1 39.5 40.3 36.7 39.3 38.9 39.2 41.1 38.6 34.6 36.6 38.7 42.5 34.4 46.0
 [16] 37.8 37.7 35.9 38.2 38.8 35.3 40.6 40.5 37.9 40.5 39.5 37.2 39.5 40.9 36.4
 [31] 39.2 38.8 42.2 37.6 39.8 36.5 40.8 36.0 44.1 37.0 39.6 41.1 36.0 42.3 39.6
 [46] 40.1 35.0 42.0 34.5 41.4 39.0 40.6 36.5 37.6 35.7 41.3 37.6 41.1 36.4 41.6
 [61] 35.5 41.1 35.9 41.8 33.5 39.7 39.6 45.8 35.5 42.8 40.9 37.2 36.2 42.1 34.6
 [76] 42.9 36.7 35.1 37.3 41.3 36.3 36.9 38.3 38.9 35.7 41.1 34.0 39.6 36.2 40.8
 [91] 38.1 40.3 33.1 43.2 35.0 41.0 37.7 37.8 37.9 39.7 38.6 38.2 38.1 43.2 38.1
[106] 45.6 39.7 42.2 39.6 42.7 38.6 37.3 35.7 41.1 36.2 37.7 40.2 41.4 35.2 40.6
[121] 38.8 41.5 39.0 44.1 38.5 43.1 36.8 37.5 38.1 41.1 35.6 40.2 37.0 39.7 40.2
[136] 40.6 32.1 40.7 37.3 39.0 39.2 36.6 36.0 37.8 36.0 41.5 46.1 50.0 48.7 50.0
[151] 47.6 46.5 45.4 46.7 43.3 46.8 40.9 49.0 45.5 48.4 45.8 49.3 42.0 49.2 46.2
[166] 48.7 50.2 45.1 46.5 46.3 42.9 46.1 47.8 48.2 50.0 47.3 42.8 45.1 59.6 49.1
[181] 48.4 42.6 44.4 44.0 48.7 42.7 49.6 45.3 49.6 50.5 43.6 45.5 50.5 44.9 45.2
[196] 46.6 48.5 45.1 50.1 46.5 45.0 43.8 45.5 43.2 50.4 45.3 46.2 45.7 54.3 45.8
[211] 49.8 49.5 43.5 50.7 47.7 46.4 48.2 46.5 46.4 48.6 47.5 51.1 45.2 45.2 49.1
[226] 52.5 47.4 50.0 44.9 50.8 43.4 51.3 47.5 52.1 47.5 52.2 45.5 49.5 44.5 50.8
[241] 49.4 46.9 48.4 51.1 48.5 55.9 47.2 49.1 46.8 41.7 53.4 43.3 48.1 50.5 49.8
[256] 43.5 51.5 46.2 55.1 48.8 47.2 46.8 50.4 45.2 49.9 46.5 50.0 51.3 45.4 52.7
[271] 45.2 46.1 51.3 46.0 51.3 46.6 51.7 47.0 52.0 45.9 50.5 50.3 58.0 46.4 49.2
[286] 42.4 48.5 43.2 50.6 46.7 52.0 50.5 49.5 46.4 52.8 40.9 54.2 42.5 51.0 49.7
[301] 47.5 47.6 52.0 46.9 53.5 49.0 46.2 50.9 45.5 50.9 50.8 50.1 49.0 51.5 49.8
[316] 48.1 51.4 45.7 50.7 42.5 52.2 45.2 49.3 50.2 45.6 51.9 46.8 45.7 55.8 43.5
[331] 49.6 50.8 50.2

Vous pourriez faire la même chose avec chacune des colonnes.

Pour en savoir plus sur les valeurs de cette colonne, vous pouvez combiner le $ avec les fonctions min(), max(), et mean() pour calculer les valeurs minimale, maximale et moyenne.

Tâche 3

Faites-le dans le chunk ci-dessous pour bill_length_mm :

min(penguins$bill_length_mm)
[1] 32.1
max(penguins$bill_length_mm)
[1] 59.6
mean(penguins$bill_length_mm)
[1] 43.99279

Mais ce n’est pas très utile, car cela calcule les résumés sur toutes les données. Mais nous savons déjà qu’il y a différentes espèces de manchots dans l’ensemble de données. Il serait donc plus utile de connaître ces valeurs pour chaque espèce. Cela peut être fait en combinant des fonctions, ce que vous faites en R avec l’opérateur « pipe » %>%. Cela crée un flux d’opérations : d’abord faire cela, puis prendre le résultat et appliquer la fonction suivante à celui-ci.

Cela nous permet de calculer facilement les valeurs de résumé (min, max, moyenne) pour chaque espèce. Pour ce faire, nous devons d’abord regrouper les données par espèce, puis les résumer. Voir l’exemple ci-dessous.

Rappelez-vous que # commence un commentaire ! Tout ce qui suit # ne sera pas exécuté en tant que fonction en R. Je l’utilise ici pour décrire ce que chaque ligne de code (avant la #) le fait.

Notez que lorsque vous fournissez le cadre de données de cette façon (penguins %>%), les fonctions suivantes essaient de trouver les noms de colonnes que vous fournissez directement dans les données, vous n’avez pas besoin d’utiliser penguins$.

penguins %>% # 1. Prendre l'ensemble de données des manchots
  group_by(species) %>% # 2. Le regrouper par espèce
  summarize(mean_bill_length_mm = mean(bill_length_mm)) # 3. créer une nouvelle colonne appelée "mean_bill_length_mm" et attribuer les valeurs moyennes de chaque groupe
# A tibble: 3 × 2
  species   mean_bill_length_mm
  <fct>                   <dbl>
1 Adelie                   38.8
2 Chinstrap                48.8
3 Gentoo                   47.6

Cette combinaison de fonctions est très flexible. Vous pouvez regrouper les données par plus de colonnes en ajoutant le nom de la colonne à group_by() (séparé par une virgule).

Tâche 4

Faites-le ci-dessous, et regroupez les données en outre par sex avant de calculer la moyenne :

penguins %>% # 1. Prendre l'ensemble de données des manchots
  group_by(species, sex) %>% # 2. Le regrouper par espèce et sexe
  summarize(mean_bill_length_mm = mean(bill_length_mm)) # 3. créer une nouvelle colonne appelée "mean_bill_length_mm" et attribuer les valeurs moyennes de chaque groupe
`summarise()` has grouped output by 'species'. You can override using the
`.groups` argument.
# A tibble: 6 × 3
# Groups:   species [3]
  species   sex    mean_bill_length_mm
  <fct>     <fct>                <dbl>
1 Adelie    female                37.3
2 Adelie    male                  40.4
3 Chinstrap female                46.6
4 Chinstrap male                  51.1
5 Gentoo    female                45.6
6 Gentoo    male                  49.5

Vous pouvez également calculer d’autres résumés, en les ajoutant à la fonction summarize() (séparé par une virgule) :

penguins %>% # 1. Prendre l'ensemble de données des manchots
  group_by(species) %>% # 2. Le regrouper par espèce
  summarize(
    mean_bill_length_mm = mean(bill_length_mm), # 3.1. créer une nouvelle colonne appelée "mean_bill_length_mm" et attribuer les valeurs moyennes de chaque groupe
    min_bill_length_mm = min(bill_length_mm) # 3.2. créer une nouvelle colonne appelée "min_bill_length_mm" et attribuer les valeurs minimales de chaque groupe
  )
# A tibble: 3 × 3
  species   mean_bill_length_mm min_bill_length_mm
  <fct>                   <dbl>              <dbl>
1 Adelie                   38.8               32.1
2 Chinstrap                48.8               40.9
3 Gentoo                   47.6               40.9

Tâche 5

Maintenant, c’est à votre tour. Regroupez les données par species et sex et en plus de la valeur moyenne et minimale de bill_length_mm, calculez la valeur maximale. Indice : Si vous créez des colonnes en R, elles ne peuvent pas contenir d’espaces ni de traits d’union -.

penguins %>% # 1. Prendre l'ensemble de données des manchots
  group_by(species, sex) %>% # 2. Le regrouper par espèce et sexe
  summarize(
    mean_bill_length_mm = mean(bill_length_mm), # 3.1. créer une nouvelle colonne appelée "mean_bill_length_mm" et attribuer les valeurs moyennes de chaque groupe
    min_bill_length_mm = min(bill_length_mm), # 3.2. créer une nouvelle colonne appelée "min_bill_length_mm" et attribuer les valeurs minimales de chaque groupe
    max_bill_length_mm = max(bill_length_mm) # 3.3. créer une nouvelle colonne appelée "max_bill_length_mm" et attribuer les valeurs maximales de chaque groupe
  )
`summarise()` has grouped output by 'species'. You can override using the
`.groups` argument.
# A tibble: 6 × 5
# Groups:   species [3]
  species   sex    mean_bill_length_mm min_bill_length_mm max_bill_length_mm
  <fct>     <fct>                <dbl>              <dbl>              <dbl>
1 Adelie    female                37.3               32.1               42.2
2 Adelie    male                  40.4               34.6               46  
3 Chinstrap female                46.6               40.9               58  
4 Chinstrap male                  51.1               48.5               55.8
5 Gentoo    female                45.6               40.9               50.5
6 Gentoo    male                  49.5               44.4               59.6

Une autre fonction très utile en R est filter(). Comme son nom le suggère, il vous permet de filtrer les données.

Par exemple, je filtre le cadre de données des manchots pour l’espèce « Adélie ».

penguins %>%
  filter(species == "Adelie")
# A tibble: 146 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           36.7          19.3               193        3450
 5 Adelie  Torgersen           39.3          20.6               190        3650
 6 Adelie  Torgersen           38.9          17.8               181        3625
 7 Adelie  Torgersen           39.2          19.6               195        4675
 8 Adelie  Torgersen           41.1          17.6               182        3200
 9 Adelie  Torgersen           38.6          21.2               191        3800
10 Adelie  Torgersen           34.6          21.1               198        4400
# ℹ 136 more rows
# ℹ 2 more variables: sex <fct>, year <int>

Avez-vous remarqué que j’ai utilisé ==? Cela indique à R de faire une comparaison ; après la fonction de filtre, seules les lignes pour lesquelles l’entrée dans la colonne species est égale à « Adélie » seront conservées. L’opposé, si vous voulez filtrer certaines espèces, se fait avec != (« n’est pas égal à »). Vous remarquez également que j’utilise les guillemets ". Cela indique à R qu’il s’agit du texte que vous recherchez, et non du nom d’une fonction ou d’un objet.

Il est important que de cette façon, vous ne montriez que le cadre de données filtré ; les données originales (celles que vous voyez dans l’onglet environnement) restent inchangées. Si vous voulez enregistrer un sous-ensemble d’un cadre de données sous un nouveau nom, vous pouvez utiliser <- :

adelie_penguins <- penguins %>%
  filter(species == "Adelie")

Si vous exécutez ce code, vous verrez un nouveau cadre de données appelé adelie_penguins dans l’onglet environnement. Vous pouvez cliquer dessus pour confirmer que toutes les espèces sont bien Adélie. Comme décrit ci-dessus pour les noms de colonnes, les noms de cadres de données ne peuvent pas contenir d’espaces ni de traits d’union -.

Vérification d’apprentissage 2 :

Pourquoi pensez-vous qu’il est dangereux de faire ce qui suit :

J’ai utilisé des commentaires ici pour éviter que vous exécutiez le chunk par erreur

# penguins <- penguins %>%
#     filter(species == "Adelie")

Pour les nombres (comme bill_length_mm), vous pourriez être moins intéressé par le filtrage des valeurs exactes et plus intéressé par les valeurs au-dessus ou en dessous d’une certaine valeur. Pour cela, vous pouvez utiliser > (plus grand), < (plus petit), >= (plus grand ou égal), et <= (plus petit ou égal). Voir l’exemple ci-dessous, où je ne montre que bill_length_mm au-dessus de 45 :

penguins %>%
  filter(bill_length_mm > 45)
# A tibble: 163 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           46            21.5               194        4200
 2 Adelie  Torgersen           45.8          18.9               197        4150
 3 Adelie  Biscoe              45.6          20.3               191        4600
 4 Gentoo  Biscoe              46.1          13.2               211        4500
 5 Gentoo  Biscoe              50            16.3               230        5700
 6 Gentoo  Biscoe              48.7          14.1               210        4450
 7 Gentoo  Biscoe              50            15.2               218        5700
 8 Gentoo  Biscoe              47.6          14.5               215        5400
 9 Gentoo  Biscoe              46.5          13.5               210        4550
10 Gentoo  Biscoe              45.4          14.6               211        4800
# ℹ 153 more rows
# ℹ 2 more variables: sex <fct>, year <int>

Vous pouvez également combiner plusieurs étapes de filtrage :

penguins %>%
  filter(bill_length_mm > 45, species == "Adelie")
# A tibble: 3 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           46            21.5               194        4200
2 Adelie  Torgersen           45.8          18.9               197        4150
3 Adelie  Biscoe              45.6          20.3               191        4600
# ℹ 2 more variables: sex <fct>, year <int>

Tâche 6

Créez un nouveau sous-ensemble des données. Utilisez un nom raisonnable pour le nouvel ensemble de données. Filtrez pour exclure les manchots Adelie (avec !=, voir ci-dessus), et un body_mass_g inférieur ou égal à 4000 g :

penguins_small <- penguins %>%
  filter(species != "Adelie", body_mass_g <= 4000)

Vous avez maintenant appris certains aspects de l’exploration des données, qui est généralement la première étape d’une analyse. Vous essayez de comprendre comment les données sont construites, quelles colonnes existent, les résumés de base des données, etc. Une fonction pratique pour voir la structure de vos données est str().

Tâche 7

Utilisez str() pour l’ensemble de données penguins :

str(penguins)
tibble [333 × 8] (S3: tbl_df/tbl/data.frame)
 $ species          : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ bill_length_mm   : num [1:333] 39.1 39.5 40.3 36.7 39.3 38.9 39.2 41.1 38.6 34.6 ...
 $ bill_depth_mm    : num [1:333] 18.7 17.4 18 19.3 20.6 17.8 19.6 17.6 21.2 21.1 ...
 $ flipper_length_mm: int [1:333] 181 186 195 193 190 181 195 182 191 198 ...
 $ body_mass_g      : int [1:333] 3750 3800 3250 3450 3650 3625 4675 3200 3800 4400 ...
 $ sex              : Factor w/ 2 levels "female","male": 2 1 1 1 2 1 2 1 2 2 ...
 $ year             : int [1:333] 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...
 - attr(*, "na.action")= 'omit' Named int [1:11] 4 9 10 11 12 48 179 219 257 269 ...
  ..- attr(*, "names")= chr [1:11] "4" "9" "10" "11" ...

Il vous montre les noms de chaque colonne dans les données et le type de données. En général, les données peuvent être des nombres ou du texte. Les nombres peuvent être des nombres entiers (« integers » = int) ou des nombres à virgule (num). Le texte peut également être stocké de différentes manières. Il peut y avoir du « texte libre » (« character » = chr) que vous utiliseriez par ex. dans un tableau avec les prénoms et noms de personnes. Dans ces cas, vous devez pouvoir stocker n’importe quel nom. Souvent, cependant, le même texte s’applique plusieurs fois dans un cadre de données ; cela pourrait être par ex. noms d’espèces, sites d’échantillonnage, classes de taille (« adulte » contre « juvénile »), etc. Pour ces cas, R utilise une astuce pour stocker le texte aussi efficacement que possible. Vous voyez que par ex. la colonne species est un factor. Au lieu de sauvegarder le texte entier pour chaque ligne de cette colonne, R enregistre d’abord toutes les entrées uniques de la ligne. Ces entrées uniques (c.-à-d. les possibilités d’entrées dans cette colonne) sont appelées levels. R en garde la trace et attribue un numéro à chacun. Dans la colonne elle-même, seuls ces nombres sont stockés. Pour voir les niveaux d’une colonne de facteur, vous pouvez utiliser la fonction levels().

Tâche 8

Utilisez levels() ci-dessous, pour voir les niveaux de penguins$island :

levels(penguins$island)
[1] "Biscoe"    "Dream"     "Torgersen"

Vous pouvez voir comment R stocke les différentes îles (ou espèces, sites, classes de taille, etc.) en transformant les facteurs en nombres :

as.numeric(penguins$island)
  [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
 [38] 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3
 [75] 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3
[112] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1
[149] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[186] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[223] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[260] 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[297] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Le stockage des données de cette manière est très pratique car il évite également l’introduction de fautes de frappe, qui créeraient un désordre, si vous voulez compter les occurrences de chaque île dans l’ensemble de données ou regrouper les données.

C’est tout pour cette semaine.

La semaine prochaine, nous apprendrons à visualiser les différents types de données. Ceci est très utile pour l’exploration des données car les données sont beaucoup plus faciles à comprendre pour les humains si elles sont représentées visuellement que par des tableaux ou de longues listes de valeurs.