10 Nettoyage et exploration
10.1 Données binaires
Jusqu’ici, on a exploré des variables continues (temps de réaction, note, etc.) ainsi que des variables catégorielles (p. ex., ville). Cependant, notre variable de réponse était toujours continue. Dans la deuxième partie du cours, on examine les variables de réponse binaire, c’est-à-dire les variables telles que « correct/incorrect », « oui/non », etc. Ce type de variable est très commun dans la recherche en linguistique, mais on verra que les méthodes de visualisation ainsi que d’analyse statistique utilisée sont distinctes.
10.1.1 Une situation plus réaliste
Bien que les données examinées jusqu’ici soient généralement propres et organisées, la situation réaliste de l’analyste est rarement aussi simple. Pour commencer notre exploration des données binaires, on utilisera des données plus réalistes à partir d’un questionnaire élaboré sur MS Forms. On a vu en classe que les données générées par ce type de plateforme sont souvent chaotiques. Donc, il a fallu les nettoyer avant d’être capable d’explorer ou d’analyser les patrons d’intérêt. Le nettoyage des données était notre objectif en classe. Bref, pour nettoyer nos données, on peut utiliser une combinaison d’outils :
- L’extension
janitor
pour simplifier et standardiser les noms des variables/colonnes - La fonction
pivot_longer()
, déjà utilisée dans la première partie du cours, pour transformer nos données - La fonction
rename()
pour renommer des variables selon le besoin - Les fonctions
select()
etfilter()
, déjà utilisées dans le cours, selon le besoin
10.2 Une structure de travail organisée
Pour éviter des scripts qui sont trop longs (et qui seront normalement moins organisés), on peut diviser notre travail dans une séquence d’étapes. Par exemple, on utilise un script pour charger les extensions, pour importer nos données et pour les nettoyer. Ensuite, on utilise un autre script pour explorer les patrons pertinents. Finalement, un troisième script contiendra l’analyse statistique.
Chaque script qui dépend du script précédent contiendra la ligne source(...)
pour « charger » le script nécessaire. On verra bientôt comment enchaîner nos scripts avec cette fonction-là. Pour l’instant, on utilise un seul script, vu qu’on travaille sur le nettoyage des données. Le script en question s’appellera script_10_net.R
(choisissez un nom logique pour votre script).
10.3 Notre script + nettoyage de données
Le script utilisé en classe, script_10_net.R
est commenté ci-dessous — il faudra installer1 l’extension janitor
(suivez le modèle ci-dessous).
Code
# Charger les extensions :
library(tidyverse)
# install.packages(janitor)
library(janitor)
# Importer les données :
= read_csv2("donnees/questionnaire.csv") q
Si vous visualisez les données avec glimpse(d)
, vous verrez que le fichier n’est pas tidy : il y a plusieurs colonnes qui ne sont pas nécessaires. En plus, les questions sont distribuées à travers les colonnes, et les noms des colonnes sont immenses. Simplement dit, le fichier est chaotique.
10.3.1 Standardisation des noms
Il faut simplifier et standardiser les noms des colonnes. Idéalement, on ne veut pas avoir des espaces dans les noms des variables (c’est pourquoi on voit plusieurs accents graves dans les noms de colonnes maintenant). La fonction clean_names()
de l’extension janitor
sera très utile ici :
Code
= clean_names(q) # Remplacer la version originale par la version simplifiée/standardisée
q glimpse(q)
#> Rows: 18
#> Columns: 50
#> $ id <dbl> …
#> $ heure_de_debut <chr> …
#> $ heure_de_fin <chr> …
#> $ adresse_de_messagerie <chr> …
#> $ nom <lgl> …
#> $ total_points <lgl> …
#> $ quiz_feedback <lgl> …
#> $ heure_de_la_derniere_modification <lgl> …
#> $ votre_nom <chr> …
#> $ points_votre_nom <lgl> …
#> $ feedback_votre_nom <lgl> …
#> $ votre_date_de_naissance <chr> …
#> $ points_votre_date_de_naissance <lgl> …
#> $ feedback_votre_date_de_naissance <lgl> …
#> $ combien_de_langues_parlez_vous <dbl> …
#> $ points_combien_de_langues_parlez_vous <lgl> …
#> $ feedback_combien_de_langues_parlez_vous <lgl> …
#> $ avez_vous_suivi_le_cours_de_phonologie_ou_de_phonetique <chr> …
#> $ points_avez_vous_suivi_le_cours_de_phonologie_ou_de_phonetique <lgl> …
#> $ feedback_avez_vous_suivi_le_cours_de_phonologie_ou_de_phonetique <lgl> …
#> $ est_ce_que_toutes_les_langues_utilisent_des_voyelles_dans_leur_systeme_phonetique <chr> …
#> $ points_est_ce_que_toutes_les_langues_utilisent_des_voyelles_dans_leur_systeme_phonetique <lgl> …
#> $ feedback_est_ce_que_toutes_les_langues_utilisent_des_voyelles_dans_leur_systeme_phonetique <lgl> …
#> $ le_francais_est_il_la_seule_langue_avec_des_voyelles_nasales <chr> …
#> $ points_le_francais_est_il_la_seule_langue_avec_des_voyelles_nasales <lgl> …
#> $ feedback_le_francais_est_il_la_seule_langue_avec_des_voyelles_nasales <lgl> …
#> $ est_ce_que_certaines_langues_ont_plus_de_consonnes_que_de_voyelles <chr> …
#> $ points_est_ce_que_certaines_langues_ont_plus_de_consonnes_que_de_voyelles <lgl> …
#> $ feedback_est_ce_que_certaines_langues_ont_plus_de_consonnes_que_de_voyelles <lgl> …
#> $ toutes_les_langues_ont_elles_des_consonnes_plosives_comme_le_p_et_le_b <chr> …
#> $ points_toutes_les_langues_ont_elles_des_consonnes_plosives_comme_le_p_et_le_b <lgl> …
#> $ feedback_toutes_les_langues_ont_elles_des_consonnes_plosives_comme_le_p_et_le_b <lgl> …
#> $ existe_t_il_des_langues_qui_n_utilisent_pas_le_son_l <chr> …
#> $ points_existe_t_il_des_langues_qui_n_utilisent_pas_le_son_l <lgl> …
#> $ feedback_existe_t_il_des_langues_qui_n_utilisent_pas_le_son_l <lgl> …
#> $ le_r_francais_comme_dans_rouge_se_retrouve_t_il_dans_toutes_les_langues <chr> …
#> $ points_le_r_francais_comme_dans_rouge_se_retrouve_t_il_dans_toutes_les_langues <lgl> …
#> $ feedback_le_r_francais_comme_dans_rouge_se_retrouve_t_il_dans_toutes_les_langues <lgl> …
#> $ y_a_t_il_des_langues_sans_voyelles_arrondies <chr> …
#> $ points_y_a_t_il_des_langues_sans_voyelles_arrondies <lgl> …
#> $ feedback_y_a_t_il_des_langues_sans_voyelles_arrondies <lgl> …
#> $ le_chinois_est_il_la_seule_langue_qui_utilise_des_tons <chr> …
#> $ points_le_chinois_est_il_la_seule_langue_qui_utilise_des_tons <lgl> …
#> $ feedback_le_chinois_est_il_la_seule_langue_qui_utilise_des_tons <lgl> …
#> $ est_ce_que_toutes_les_langues_du_monde_ont_des_mots_qui_riment <chr> …
#> $ points_est_ce_que_toutes_les_langues_du_monde_ont_des_mots_qui_riment <lgl> …
#> $ feedback_est_ce_que_toutes_les_langues_du_monde_ont_des_mots_qui_riment <lgl> …
#> $ toutes_les_langues_utilisent_elles_le_son_s_comme_dans_soleil <chr> …
#> $ feedback_toutes_les_langues_utilisent_elles_le_son_s_comme_dans_soleil <lgl> …
#> $ points_toutes_les_langues_utilisent_elles_le_son_s_comme_dans_soleil <lgl> …
10.3.2 Sélection des colonnes pertinentes
Ensuite, on va enlever des colonnes inutiles. Par exemple, on voit des colonnes qui commencent par « feedback_… », par « points_… », etc. Les colonnes qui commencent par « heure_… », « adresse_… », « quiz_… » ou « total_… » peuvent être enlevées aussi. Ici, on utilise la fonction select()
, déjà utilisée dans le cours, ainsi que la fonction matches()
pour trouver des patrons des caractères. L’accent circonflexe signifie « le début d’une séquence »; la barre verticale signifie « ou ». Donc, ici on enlève les colonnes qui contiennent les mots « heure », « adresse », « nom », « feedback », « points », « total » ou « quiz ».
Code
= q |>
q select(-matches("^(heure|adresse|nom|feedback|points|total|quiz)"))
glimpse(q, width = 50) # largeur de 50%
#> Rows: 18
#> Columns: 15
#> $ id <dbl> …
#> $ votre_nom <chr> …
#> $ votre_date_de_naissance <chr> …
#> $ combien_de_langues_parlez_vous <dbl> …
#> $ avez_vous_suivi_le_cours_de_phonologie_ou_de_phonetique <chr> …
#> $ est_ce_que_toutes_les_langues_utilisent_des_voyelles_dans_leur_systeme_phonetique <chr> …
#> $ le_francais_est_il_la_seule_langue_avec_des_voyelles_nasales <chr> …
#> $ est_ce_que_certaines_langues_ont_plus_de_consonnes_que_de_voyelles <chr> …
#> $ toutes_les_langues_ont_elles_des_consonnes_plosives_comme_le_p_et_le_b <chr> …
#> $ existe_t_il_des_langues_qui_n_utilisent_pas_le_son_l <chr> …
#> $ le_r_francais_comme_dans_rouge_se_retrouve_t_il_dans_toutes_les_langues <chr> …
#> $ y_a_t_il_des_langues_sans_voyelles_arrondies <chr> …
#> $ le_chinois_est_il_la_seule_langue_qui_utilise_des_tons <chr> …
#> $ est_ce_que_toutes_les_langues_du_monde_ont_des_mots_qui_riment <chr> …
#> $ toutes_les_langues_utilisent_elles_le_son_s_comme_dans_soleil <chr> …
10.3.3 Transformation wide-to-long
On a déjà vu comment transformer les tableaux qui sont trop longs : on utilise la fonction pivot_longer()
. Dans la fonction, il faut spécifier quelles colonnes seront transformées. Normalement, c’est facile de nommer ces colonnes. Le problème ici, ce sont les noms des colonnes, qui sont trop longs. Une solution est d’utiliser les indices des colonnes pertinentes (c’est-à-dire les positions des colonnes dans le tableau). Comment trouver ces indices? On utilise la fonction names(q)
pour lister les noms de toutes les colonnes avec leurs indices. Cherchez la première question et remarquez son indice. Ici, les questions de notre questionnaire sont dans les colonnes 6 à 15.
Code
# Vérifions les noms des colonnes :
names(q)
#> [1] "id"
#> [2] "votre_nom"
#> [3] "votre_date_de_naissance"
#> [4] "combien_de_langues_parlez_vous"
#> [5] "avez_vous_suivi_le_cours_de_phonologie_ou_de_phonetique"
#> [6] "est_ce_que_toutes_les_langues_utilisent_des_voyelles_dans_leur_systeme_phonetique"
#> [7] "le_francais_est_il_la_seule_langue_avec_des_voyelles_nasales"
#> [8] "est_ce_que_certaines_langues_ont_plus_de_consonnes_que_de_voyelles"
#> [9] "toutes_les_langues_ont_elles_des_consonnes_plosives_comme_le_p_et_le_b"
#> [10] "existe_t_il_des_langues_qui_n_utilisent_pas_le_son_l"
#> [11] "le_r_francais_comme_dans_rouge_se_retrouve_t_il_dans_toutes_les_langues"
#> [12] "y_a_t_il_des_langues_sans_voyelles_arrondies"
#> [13] "le_chinois_est_il_la_seule_langue_qui_utilise_des_tons"
#> [14] "est_ce_que_toutes_les_langues_du_monde_ont_des_mots_qui_riment"
#> [15] "toutes_les_langues_utilisent_elles_le_son_s_comme_dans_soleil"
# Notez que les questions du questionnaire commencent dans la colonne 6 (jusqu'à la colonne 15)
# Transformation wide-to-long :
= q |>
long pivot_longer(names_to = "question",
values_to = "reponse",
cols = 6:15)
glimpse(long, width = 50)
#> Rows: 180
#> Columns: 7
#> $ id <dbl> …
#> $ votre_nom <chr> …
#> $ votre_date_de_naissance <chr> …
#> $ combien_de_langues_parlez_vous <dbl> …
#> $ avez_vous_suivi_le_cours_de_phonologie_ou_de_phonetique <chr> …
#> $ question <chr> …
#> $ reponse <chr> …
10.3.4 Ajustements finaux
Finalement, notez qu’on a une colonne immense : « avez_vous_suivi_… ». C’est terrible. On va encore simplifier les noms des variables avec la fonction rename()
:
Code
= long |>
long rename("nom" = "votre_nom", # on va enlever cette colonne pour garantir l'anonymat
"naissance" = "votre_date_de_naissance",
"langues" = "combien_de_langues_parlez_vous",
"phonologie" = "avez_vous_suivi_le_cours_de_phonologie_ou_de_phonetique") |>
select(-nom)
# On pourrait utiliser les indices des colonnes au lieu de leurs noms
glimpse(long, width = 50)
#> Rows: 180
#> Columns: 6
#> $ id <dbl> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,…
#> $ naissance <chr> "11-13-2023", "11-13-2023", "…
#> $ langues <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
#> $ phonologie <chr> "Oui", "Oui", "Oui", "Oui", "…
#> $ question <chr> "est_ce_que_toutes_les_langue…
#> $ reponse <chr> "Non", "Non", "Oui", "Non", "…
L’avantage d’utiliser la fonction glimpse()
est qu’elle nous donne la classe de chaque variable dans le tableau. Ici, on voit que la variable id
est considérée comme dbl
(double, c’est-à-dire numérique). C’est un problème, vu que l’identification de chaque participant représente un facteur (fct
). En plus, toutes les variables chr
sont, en réalité, fct
aussi. Observez le code ci-dessous.
Code
= long |>
long mutate(id = as_factor(id),
across(where(is_character), as_factor))
glimpse(long, width = 50)
#> Rows: 180
#> Columns: 6
#> $ id <fct> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,…
#> $ naissance <fct> 11-13-2023, 11-13-2023, 11-13…
#> $ langues <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
#> $ phonologie <fct> Oui, Oui, Oui, Oui, Oui, Oui,…
#> $ question <fct> est_ce_que_toutes_les_langues…
#> $ reponse <fct> Non, Non, Oui, Non, Oui, Non,…
La ligne across(where(is_character), as_factor)
vérifie la classe de chaque variable. Si la classe est chr
, on la change vers fct
— n’importe combien des colonnes chr
existe dans le tableau.
Pratique
Pour les questions ci-dessous, vous aurez besoin d’une clé de réponse.
Question 1. Importez et nettoyez le fichier questionnaire2.csv
. N’oubliez pas d’enlever la colonne qui indique les noms des participants.
Question 2. Quel est le score de chaque participant?
Question 3. Le goût pour la géographie affecte-t-il la précision des réponses?
Question 4. Créez une figure appropriée pour les données en question.
10.5 Des patrons d’intérêt
On a vu dans les sections précédentes comment nettoyer le fichier questionnaire.csv
. Dans les sections ci-dessous, on continue notre analyse en examinant quelques questions que l’on peut se poser à propos du fichier questionnaire2.csv
(pratique à la maison de la dernière séance). En fin de compte, on doit être capable de répondre aux questions pertinentes sur les données qu’on examine. Donc, aujourd’hui on se concentre sur la pratique : on révise le nettoyage du fichier en question (questionnaire2.csv
) et on répond aux questions explorées en classe. N’oubliez pas qu’on travaille avec des données dont la variable de réponse est binaire, ce qui exige quelques ajustements de notre part.
10.6 Nettoyage enchainé
Bien que la première partie de ce chapitre contienne un script pour nettoyer nos données, on a créé des étapes séparémment. On pourrait pourtant utiliser le pipe pour enchainer toutes nos opérations. Retournez au chapitre précédent et enchainez votre code en utilisant |>
.
Il faut s’assurer que le vecteur cle
et le tableau du questionnaire contiennent le même ordre de réponses avant de combiner les deux. Si les ordres sont différents, la méthode utilisée ici ne fonctionnera pas.
L’avantage d’enchaîner les opérations est clair : c’est beaucoup plus concis. Cependant, ces opérations sont moins transparentes, ce qui rend le code moins lisible. Ne croyez pas que j’ai écrit ce bloc de code d’un seul coup. Au contraire, j’ai exécuté le code au fur et à mesure que je le construisais, afin de pouvoir visualiser le tableau de données au fur et à mesure que je construisais le code. Vous pouvez faire la même chose : sélectionnez une partie du code (sans inclure le pipe à la fin) et l’exécutez. Ensuite, visualisez l’objet q_net
pour vous familiariser avec le résultat (temporaire).
Voici le résultat que vous devez produire : les données sont nettoyées et prêtes pour l’analyse. On peut continuer avec les questions de l’exercice de pratique ci-dessous.
id | geo | langues | question | reponse | correct |
---|---|---|---|---|---|
3 | Non | Non | quell... | le néerlandais | 0 |
3 | Non | Non | en_an... | le catalan | 1 |
3 | Non | Non | quell... | le swati et l'anglais | 0 |
3 | Non | Non | en_es... | le swati et l'anglais | 1 |
3 | Non | Non | quell... | le swati et l'anglais | 0 |
10.7 Questions d’interprétation
Voici les questions discutées en classe. Il est important de noter qu’il n’est pas possible d’y répondre sans avoir préalablement nettoyé les données. Même les systèmes d’intelligence artificielle ont des difficultés dans ce type de tâche.
Pratique
Question 1. Quelle est la précision moyenne en fonction de la variable langues
?
Question 2. Quelle est la précision moyenne en fonction de la variable geo
?
Question 3. Quelle est la précision moyenne des participants 4, 7, 14, 15 et 17 (ensemble)?
Question 4. Créez une nouvelle colonne qui classe les participants qui aiment la géographie et qui parlent d’autres langues vs les autres. La précision de ces deux groupes est-elle affectée par la nouvelle classification?
Question 5. Créez quelques figures pour explorer les patrons des données. Quelles figures sont appripriées étant donnée la classe de la variable de réponse? Consultez les commentaires ci-dessous.
Étant donné que la variable y
est binaire, ce type de figure ne fonctionne pas. Ici, on ne voit que 4 points (il y en a plus, mais les points sont tous superposés). Même dans le cas où la variable x
serait continue, le problème persisterait.
Peut-être envisagez-vous l’option geom_jitter()
. Bien que cette option soit capable de minimiser le problème (en dispersant les points), elle ne le réglera pas étant donnée la classe de la variable y
en question.
Ici, on observe le même type de problème. Bien que ce type de figure soit fréquemment recommandé (si la variable x
est catégorielle), la variable y
doit être continue. Notez que les médianes3 sont extrêmes ici (!).
Finalement, lorsqu’on utilise des points pour représenter la précision moyenne, on arrive à un graphique informatif. Toutefois, il faut noter qu’ici on n’examine pas les données brutes : on examine plutôt les moyennes (ce qui explique pourquoi la figure fonctionne).
Dans les figures explorées ici, notez que :
- la variable
y
semble continue (0.00
, …,1.00
). Cependant, on sait qu’il s’agit d’une variable binaire. Il faudrait adapter la figure en conséquence (en transformant la classe de la variablecorrect
en facteur avec la fonctionas_factor()
); - dans la troisième figure (moyennes), l’axe
y
représente un pourcentage. Donc, on pourrait adapter l’échelle utilisée. Plus tard, on va le faire à partir de l’extensionscales
, qui nous permet de changer les échelles dans nos axes.
On peut facilement dichotomiser n’importe quelle variable catégorielle en utilisant la fonction if_else()
.4 Par exemple, dans le fichier villes.csv
, dont la variable ville
a trois niveaux (Calgary
, Montréal
, Québec
), on pourrait ajouter une nouvelle variable binaire (c’est-à-dire dichotomisée) qui classe les villes en deux groupes : les villes dont le français est la langue officielle vs les villes où il n’est pas (Calgary
). Cette nouvelle variable pourrait être appelée langue
.5
Code
= read_csv("donnees/villes2.csv")
villes
= villes |>
villes mutate(langue = if_else(ville == "Calgary",
"anglais",
"français"))
# Alternative moins concise :
# villes = villes |>
# mutate(langue = if_else(ville %in% c("Montréal", "Québec"),
# "français",
# "anglais"))
note | ville | duree | langue |
---|---|---|---|
77.65000 | Montréal | 37 | français |
48.59063 | Calgary | 34 | anglais |
74.73000 | Québec | 38 | français |
64.67619 | Calgary | 21 | anglais |
65.69000 | Montréal | 36 | français |
Finalement, la nouvelle colonne nous permet d’évaluer l’effet de la francophonie d’une ville sur la performance des apprenants du français au Canada dans nos données hypothétiques :
10.8 Combiner des scripts?
On a révisé ci-dessus comment (a) nettoyer un fichier et (b) créer des graphiques. Vous pouvez certainement compléter (a) et (b) dans un même script. Par contre, comme discuté dans le chapitre 10, c’est toujours une bonne idée de séparer les différents éléments dans une analyse pour maximiser l’organisation de notre flux de travail.
Supposez que le nettoyage ci-dessus est dans un script appelé script_11_net.R
. Dans ce script, un charge nos extensions et on importe notre fichier de données. Naturellement, on nettoie les données dans le même script. Ensuite, créez un script appelé script_11_exp.R
pour ajouter les codes qui génèrent les graphiques discutés ci-dessus (ainsi que les tableaux pour les moyennes, etc.). Dans ce script, on peut simplement charger le script précédent :
Code
# Contenu du fichier script_11_vis.R
source("script_11_net.R")
# Exemple d'un des graphiques de la question 5 :
ggplot(data = q_net, aes(x = langues, y = correct)) +
stat_summary() +
labs(x = "Parlez-vous d'autres langues?",
y = "Correct",
title = "Les précisions moyennes
nous conviennent") +
theme_minimal()
La fonction source()
permet de charger le script, c’est-à-dire qu’elle va exécuter toutes les lignes de code dans le script. C’est une façon simple « d’enchaîner » des scripts différents pour séparer les éléments de notre analyse. En effet, on peut charger plusieurs scripts en même temps.6 Comme d’habitude, il faut toujours bien connaître la localisation de vos fichiers.
Une fois que vous l’avez installée, enlevez (ou masquez) la ligne qui l’installe pour éviter des installations multiples chaque fois que vous exécutez le script. Autrement dit, vous devez installer l’extension une seule fois.↩︎
Notez la différence entre les lettres majuscules et minuscules. On utilise la fonction
str_to_lower()
pour s’assurer que les caractères seront minuscules avant l’évaluation.↩︎Valeur centrale d’un caractère séparant une population en deux parties égales (Antidote).↩︎
Cette fonction nous permet d’avoir plusieurs niveaux, naturellement, vu qu’on peut intégrer plusieurs
if_else()
ensemble. Le résultat binaire n’est que l’option standard de la fonction.↩︎Effectivement, quand on utilise des modèles statistiques, les variables catégorielles sont automatiquement recodées en utilisant la méthode dummy coding, c’est-à-dire
0
ou1
. Si la variable contient trois niveaux (p. ex.,ville
ici), on aura deux nouvelle colonnes binaires (Montréal
etQuébec
ici). Dans les données en question,Calgary
sera automatiquement représentée par la combinaison0 0
. Voilà pourquoi on interprète notre intercept ici représenteraitCalgary
, vu qu’il s’agit de « la valeur prévue quand toutes les variables sont0
».↩︎Avant de charger un script, il faut s’assurer qu’il fonctionne correctement!↩︎
10.4 Comment évaluer les réponses?
Nos données représentent un questionnaire dont les questions ont des réponses correctes ou incorrectes. Cependant, le tableau ne nous donne pas la correction de chaque question. Naturellement, il faut avoir une clé de correction. Voici la clé :
Code
Maintenant, on colle les réponses dans notre tableau principal. Faites attention : on n’a que 10 réponses, mais notre tableau contient 180 lignes (nombre de participants = 18). Donc, il faut grouper les données avant d’ajouter la nouvelle colonne :
Code
Finalement, on peut corriger les réponses en utilisant la fonction
if_else()
.2Code
Le contenu du script
script_10_net.R
termine ici. Le nettoyage des données n’est pas facile, mais c’est une partie essentielle dans notre analyse de données. On ne peut pas visualiser ni analyser les données si notre tableau est complètement chaotique. Les étapes de nettoyage suivies ci-dessus sont importantes n’importe quel le type de variable de réponse qu’on analyse. En plus, si jamais vous utilisez MS Forms pour créer un sondage, vous pouvez adapter le script utilisé en classe pour nettoyer vos propres données.Vu que nos données contiennent les dates de naissance des participants, on pourrait facilement calculer leurs âges. On utilise l’extension
lubridate
pour analyser les dates (il s’agit d’une classe spéciale :date
). Dans le code ci-dessus, la fonctionmdy()
interprète les dates qui suivent le formatmois-jour-année
. Ensuite, on calcule l’intervalle entre la date de naissance et aujourd’hui avec les fonctionsinterval()
ettoday()
, ce qui nous donnera le résultat en jours. Par conséquent, on divise le résultat par une année,years(1)
. Finalement, on arrondit le chiffre.Code