© 2025 Tous droits réservés
Après avoir formé plus de 300 salariés à l’analyse de données avec R, et ce, dans de nombreux domaines d’activité (santé, biologie, DIM, agronomie, ressources humaines, finance, urbanisme, etc..), j’ai pu observer que les besoins étaient très similaires :
C’est pour répondre à ces besoins que j’ai repensé ma formation « R pour la data analyse » et créé une toute nouvelle formation professionnelle : “Devenez un utilisateur accompli de R avec Tidyverse”
Elle s’adresse aux salariés, chefs d’entreprise, consultants, qui souhaitent acquérir les bonnes pratiques pour réaliser de manière efficace et performante le traitement des données dont ils ont la charge, quel que soit le domaine d’application.
Comme son nom l’indique, cette formation est basée sur l’apprentissage des packages du Tidyverse, mais elle intègre aussi des éléments d’organisation et de nettoyage des données.
Dans cet article, je vous explique ce qu’est Tidyverse, je vous présente le contenu de ma formation, et vous montre en 6 exemples concrets comment Tidyverse peut répondre à vos besoins.
Tidyverse c’est un méta package, c’est-à-dire un package qui contient plusieurs autres packages. Et dans le cas de Tidyverse il s’agit d’une collection de packages R conçus pour l’importation, la manipulation et la visualisation des données. Ces packages partagent une même philosophie de conception, et peuvent facilement être employés ensemble.
Parmi ces packages se trouvent,
dplyr
et tidyr
pour la manipulation des tableaux de données (data frame)stringr
pour la manipulation des chaînes de caractères (du texte)readr
pour l’importation des donnéeslubridate
pour la manipulation des données de dates et d’heuresforcats
pour la manipulation des variables catégoriellespurrr
pour itérer des tâches sans boucles fortibble
qui permet un formatage amélioré et moderne tableaux de donnéesggplot2
pour réaliser des visualisationsCes packages font appel à un opérateur pipe : %>%
, qui permet d’enchaîner les opérations, c’est-à-dire en dirigeant les résultats d’une étape vers l’étape suivante.
Une bonne connaissance de ces packages vous permettra d’analyser facilement, rapidement, et de façon très performante vos données, quel que soit votre domaine d’application.
Cette formation de 21 heures (sur 3 jours) est structurée en huit modules qui vous guident à travers chaque aspect essentiel de l’utilisation de R pour l’analyse de données
Cliquez ici pour télécharger le programme complet
En conclusion, la formation “Devenez un utilisateur accompli de R avec tidyverse” offre une occasion d’améliorer vos compétences en analyse de données grâce à une approche pratique, centrée sur R et tidyverse, et adaptée à une multitude de situations.
Cliquez ici pour télécharger le formulaire d’inscription
Retrouvez ici 👉 toutes les informations sur la page de la formation
Imaginons que vous soyez un analyste de données pour une grande entreprise de commerce électronique et que vous receviez un grand nombre de données de ventes chaque jour. Avec des variables telles que le nom du produit, la catégorie du produit, le prix, la date et l’heure de la vente, l’emplacement du client, etc., .
# Chargement du package tidyverse
library(tidyverse)
# Simulation d'un jeu de données
set.seed(123)
donnees_vente <- tibble(
nom_produit = sample(c("Produit A", "Produit B", "Produit C", "Produit D", "Produit E"), 1000, replace = TRUE),
categorie_produit = sample(c("Catégorie 1", "Catégorie 2", "Catégorie 3", "Catégorie 4"), 1000, replace = TRUE),
prix = round(runif(1000, 10, 200),2),
heure_vente = seq(as.POSIXct("2022/01/01"), as.POSIXct("2022/12/31"), length.out = 1000),
localisation_client = sample(c("Localisation 1", "Localisation 2", "Localisation 3", "Localisation 4", "Localisation 5"), 1000, replace = TRUE)
)
# Afficher les premières lignes du jeu de données
head(donnees_vente)
# A tibble: 6 × 5
nom_produit categorie_produit prix heure_vente localisation_client
<chr> <chr> <dbl> <dttm> <chr>
1 Produit C Catégorie 3 59.5 2022-01-01 00:00:00 Localisation 2
2 Produit C Catégorie 4 121. 2022-01-01 08:44:41 Localisation 5
3 Produit B Catégorie 2 23.7 2022-01-01 17:29:22 Localisation 2
4 Produit B Catégorie 3 162. 2022-01-02 02:14:03 Localisation 4
5 Produit C Catégorie 4 177. 2022-01-02 10:58:44 Localisation 3
6 Produit E Catégorie 3 179. 2022-01-02 19:43:25 Localisation 5
Par exemple, vous pourriez avoir besoin de filtrer les ventes dont le prix est inférieur à un certain montant (50 euros), puis décrire les ventes par catégorie de produit, en termes de nombre de ventes, de prix moyen, et de prix total. Cela se réalise très facilement avec le package dplyr
:
# Chargement du package dplyr, qui fait partie de tidyverse
library(dplyr)
# Filtrage des ventes dont le prix est supérieur à 50
donnees_vente <- filter(donnees_vente, prix > 50)
# Regroupement des ventes par catégorie de produit et calcul du nombre de ventes et du prix moyen pour chaque catégorie
resume_ventes <- donnees_vente %>%
group_by(categorie_produit) %>%
summarise(
nombre_ventes = n(),
prix_moyen = mean(prix),
chiffre_affaire = sum(prix)
)
# Affichage du résumé des ventes
print(resume_ventes)
# A tibble: 4 × 4
categorie_produit nombre_ventes prix_moyen chiffre_affaire
<chr> <int> <dbl> <dbl>
1 Catégorie 1 198 127. 25068.
2 Catégorie 2 187 130. 24239.
3 Catégorie 3 210 124. 26125.
4 Catégorie 4 195 124. 24260.
Supposons que vous travaillez dans une agence de marketing digital et que votre tâche est d’analyser les tendances des hashtags sur les médias sociaux. Vous devez collecter et analyser des milliers de tweets et de posts chaque jour.
# Simulation des données sociales
set.seed(123)
donnees_sociales <- tibble(
id_publication = 1:1000,
moment_publication = seq(as.POSIXct("2022/01/01"), as.POSIXct("2022/12/31"), length.out = 1000),
contenu_publication = paste0("Ceci est un tweet avec le hashtag ", sample(c("#RStats", "#DataScience", "#ApprentissageAutomatique", "#IA", "#BigData"), 1000, replace = TRUE))
)
# Affichage des premières lignes des données
head(donnees_sociales)
# A tibble: 6 × 3
id_publication moment_publication contenu_publication
<int> <dttm> <chr>
1 1 2022-01-01 00:00:00 Ceci est un tweet avec le hashtag #Apprent…
2 2 2022-01-01 08:44:41 Ceci est un tweet avec le hashtag #Apprent…
3 3 2022-01-01 17:29:22 Ceci est un tweet avec le hashtag #DataSci…
4 4 2022-01-02 02:14:03 Ceci est un tweet avec le hashtag #DataSci…
5 5 2022-01-02 10:58:44 Ceci est un tweet avec le hashtag #Apprent…
6 6 2022-01-02 19:43:25 Ceci est un tweet avec le hashtag #BigData
Par exemple, dans cette situation, vous pourriez avoir besoin d’extraire les hashtags de chaque post et analyser le nombre de fois qu’ils apparaissent chaque jour. Cela est très facile à réaliser en combinant l’utilisation des packages lubridate
pour extraire la partie date, stringr
pour extraire les hachtags de la caîne de caractères, et dplyr
pour regrouper les données et compter les occurences :
# Chargement des packages stringr et lubridate
library(stringr)
library(lubridate)
# Extraction des hashtags de chaque publication
donnees_sociales <- donnees_sociales %>%
mutate(hashtag = str_extract(contenu_publication, "#\w+"))
# Conversion de la colonne moment_publication en date seulement (sans l'heure), puis extratction du mois
donnees_sociales <- donnees_sociales %>%
mutate(date_publication = date(moment_publication),
mois_publication = month(date_publication))
# Analyse des tendances de hashtag par mois
tendances_hashtag <- donnees_sociales %>%
count( hashtag,mois_publication)
# Affichage des tendances de hashtag
print(tendances_hashtag)
# A tibble: 60 × 3
hashtag mois_publication n
<chr> <dbl> <int>
1 #ApprentissageAutomatique 1 18
2 #ApprentissageAutomatique 2 16
3 #ApprentissageAutomatique 3 9
4 #ApprentissageAutomatique 4 16
5 #ApprentissageAutomatique 5 22
6 #ApprentissageAutomatique 6 16
7 #ApprentissageAutomatique 7 16
8 #ApprentissageAutomatique 8 20
9 #ApprentissageAutomatique 9 16
10 #ApprentissageAutomatique 10 21
# ℹ 50 more rows
Il est ensuite très facile de représenter ces résultats graphiquement :
ggplot(tendances_hashtag, aes(x=mois_publication, y=n, colour=hashtag))+
geom_point()+
geom_line()+
facet_wrap(~hashtag)
Imaginez que vous êtes un démographe et que vous étudiez l’évolution de la population dans différentes régions d’un pays. Vous avez des données de recensement sur plusieurs décennies, avec des variables comme l’âge, le sexe, l’éducation, le revenu, l’emplacement, etc. Le problème est que les données ne sont pas toujours cohérentes d’une année à l’autre, avec des catégories qui changent ou se combinent.
# Chargement du package tidyverse
library(tidyverse)
# Création des données de recensement
set.seed(123)
donnees_recensement <- tibble(
annee = rep(1990:2020, each = 1000),
age = sample(15:100, 1000 * 31, replace = TRUE),
sexe = sample(c("Masculin", "Féminin"), 1000 * 31, replace = TRUE),
education = sample(c("Primaire", "Secondaire", "Tertiaire"), 1000 * 31, replace = TRUE),
revenu = round(rnorm(1000 * 31, mean = 50000, sd = 10000), 2),
localisation = sample(paste("Région", LETTERS[1:5]), 1000 * 31, replace = TRUE)
)
# Dans certaines années, les catégories d'éducation changent ( à partir de 2000 le primaire devient élémentaire)
donnees_recensement <- donnees_recensement %>%
mutate(education = ifelse(annee >= 2000 & education == "Primaire", "Elémentaire", education),
education = factor(education, levels = c("Elémentaire", "Primaire", "Secondaire", "Tertiaire")))
# Affichage des premières lignes des données de recensement
head(donnees_recensement)
# A tibble: 6 × 6
annee age sexe education revenu localisation
<int> <int> <chr> <fct> <dbl> <chr>
1 1990 45 Masculin Primaire 51867. Région D
2 1990 93 Masculin Secondaire 31678. Région D
3 1990 65 Masculin Tertiaire 52547. Région A
4 1990 28 Masculin Tertiaire 43423. Région B
5 1990 81 Féminin Primaire 67295. Région A
6 1990 56 Féminin Primaire 48908. Région C
Dans cette situation, le package forcats
permet de gérer efficacement les incohérences dans les catégories d’éducation, en regroupant très facilement les modalités Elémentaire et Primaire au sein d’une même modalité nommée Primaire
.
Puis comme précédemment, une table de synthèse peut être réalisée pour explorer les données :
# Chargement du package forcats
library(forcats)
# Fusion des catégories "Elémentaire" et "Primaire"
donnees_recensement <- donnees_recensement %>%
mutate(education = fct_collapse(education, Primaire = c("Elémentaire", "Primaire")))
# Création d'une table de synthèse pour l'année 2020
table_synthese <- donnees_recensement %>%
filter(annee == 2020) %>%
group_by(localisation, sexe, education) %>%
summarise(nombre = n(), age_moyen = mean(age), revenu_moyen = mean(revenu), .groups = "drop")
# Affichage de la table de synthèse
print(table_synthese)
# A tibble: 30 × 6
localisation sexe education nombre age_moyen revenu_moyen
<chr> <chr> <fct> <int> <dbl> <dbl>
1 Région A Féminin Primaire 27 58.2 50664.
2 Région A Féminin Secondaire 35 57.1 48492.
3 Région A Féminin Tertiaire 34 63.0 50432.
4 Région A Masculin Primaire 29 50.7 52917.
5 Région A Masculin Secondaire 40 63.0 47973.
6 Région A Masculin Tertiaire 32 54.3 48614.
7 Région B Féminin Primaire 46 63.5 48567.
8 Région B Féminin Secondaire 35 55.3 49804.
9 Région B Féminin Tertiaire 26 57.3 52412.
10 Région B Masculin Primaire 33 53.5 49594.
Supposons que vous soyez un biologiste moléculaire qui travaille sur des séquences génomiques. Les jeux de données génomiques sont généralement volumineux et nécessitent une manipulation soigneuse. De plus, le nettoyage et le formatage des données peuvent être un défi.
# Chargement du package tidyverse
library(tidyverse)
# Création du jeu de données
set.seed(123)
donnees_genomiques <- tibble(
chromosome = rep(paste0("chr", 1:22), each = 50),
debut = rep(seq(1, 5000, by = 100), 22),
fin = debut + 99, # Ceci garantit que 'fin' est toujours 99 de plus que 'debut'
id_gene = paste0("gene_", 1:(50*22)),
sequence = replicate(50*22, paste(sample(c("A", "C", "G", "T"), 100, replace = TRUE), collapse = ""))
)
# Supposons que nous ayons des doublons
donnees_genomiques <- rbind(donnees_genomiques, donnees_genomiques[sample(1:nrow(donnees_genomiques), 200), ])
# Affichage des premières lignes du jeu de données
head(donnees_genomiques)
# A tibble: 6 × 5
chromosome debut fin id_gene sequence
<chr> <dbl> <dbl> <chr> <chr>
1 chr1 1 100 gene_1 GGGCGCCCGATCCACGTAGGATAAAGTCGCACGTCAGGATGTCAGA…
2 chr1 101 200 gene_2 ATCATCAGGTTCTGACCTGCATGGGCCGAATGCCCTCCCGTTCACC…
3 chr1 201 300 gene_3 CCTATTCGTTTGATTTCACGTGAGTCAACGACCATTTCTAACATGA…
4 chr1 301 400 gene_4 CCACAACGAGTACATCCCGAATAATGACACTCAAAATGAAACCGCG…
5 chr1 401 500 gene_5 GGGAAGCGCATCCCTATAAGGAAGAGTCAAGTCGCACGCGGACTAC…
6 chr1 501 600 gene_6 CTTCGGGGCATATGTTTACCTTGCATGAAGTTCAACCCCAGGCTTG…
Dans cette situation, vous pourriez avoir besoin de supprimer les doublons, puis de sélectionner uniquement les séquences génomiques contenant un certain motif.
Là encore, cela se réalise très facilement avec les packages dplyr
et stringr.
# Suppression des doublons
donnees_genomiques_cl <- donnees_genomiques %>%
distinct(across(everything()))
# Recherche de séquences spécifiques avec des expressions régulières
sequences_avec_ACGT <- donnees_genomiques_cl %>%
filter(str_detect(sequence, "ACGT"))
# Affichage des premières lignes des résultats
head(sequences_avec_ACGT
# A tibble: 6 × 5
chromosome debut fin id_gene sequence
<chr> <dbl> <dbl> <chr> <chr>
1 chr1 1 100 gene_1 GGGCGCCCGATCCACGTAGGATAAAGTCGCACGTCAGGATGTCAGA…
2 chr1 201 300 gene_3 CCTATTCGTTTGATTTCACGTGAGTCAACGACCATTTCTAACATGA…
3 chr1 501 600 gene_6 CTTCGGGGCATATGTTTACCTTGCATGAAGTTCAACCCCAGGCTTG…
4 chr1 1001 1100 gene_11 ATCGCGATCGATCGCAGGTTGATGCCCGAACCTGCCAGAGGGGCCT…
5 chr1 1101 1200 gene_12 AGAGCTAAGACGTTTGTCCCGTGGCTAGGGGGGTTAATAAACACCT…
6 chr1 1601 1700 gene_17 CACCATGCACGTACTGCCGACAGTTATTTGAATCGTTTGGGGTCGG…
Imaginons que vous soyez un chercheur en santé publique travaillant sur des données de dossiers médicaux électroniques. Ces dossiers peuvent contenir une multitude d’informations telles que les dates des visites, les diagnostics, les traitements, etc.,
# Chargement des packages nécessaires
library(tidyverse)
library(lubridate)
# Création du jeu de données
set.seed(123)
dossiers_medicaux <- tibble(
id_patient = rep(1:1000, each = 10),
date_visite = sample(seq(as.Date('2000/01/01'), as.Date('2022/12/31'), by="day"), 10000, replace = TRUE),
diagnostic = sample(c("Diabète", "Hypertension", "Asthme", "COVID-19", NA), 10000, replace = TRUE, prob = c(0.25, 0.25, 0.25, 0.15, 0.10)),
traitement = sample(c("Insuline", "Antihypertenseurs", "Inhalateur", "Vaccination", "Aucun", NA), 10000, replace = TRUE)
)
# Affichage des premières lignes du jeu de données
head(dossiers_medicaux)
# A tibble: 6 × 4
id_patient date_visite diagnostic traitement
<int> <date> <chr> <chr>
1 1 2006-09-28 Diabète <NA>
2 1 2006-11-15 Hypertension Vaccination
3 1 2008-03-04 Diabète Vaccination
4 1 2005-01-15 Hypertension Vaccination
5 1 2009-03-24 Asthme <NA>
6 1 2013-01-12 Asthme Vaccination
Ici, vous pourriez utiliser les techniques de gestion des dates et heures et de manipulation avancée des data frames pour travailler avec ces données, et sortir rapidement le nombre de dossiers par année et type de diagnostic :
# Chargement du package lubridate
library(lubridate)
# Extraction de l'année de la visite
dossiers_medicaux <- dossiers_medicaux %>%
mutate(année = year(date_visite))
# Création d'un résumé des diagnostics par année
synthèse_par_année <- dossiers_medicaux %>%
group_by(année, diagnostic) %>%
summarise(nombre = n(), .groups = "drop")
# Affichage des premières lignes des résultats
head(synthèse_par_année)
# A tibble: 6 × 3
année diagnostic nombre
<dbl> <chr> <int>
1 2000 Asthme 128
2 2000 COVID-19 63
3 2000 Diabète 101
4 2000 Hypertension 94
5 2000 <NA> 45
6 2001 Asthme 95
Supposons que vous soyez un agronome et que vous analysiez des données sur les rendements de différentes cultures en fonction de divers facteurs tels que les conditions météorologiques, les types de sol, l’utilisation d’engrais, etc.
# Chargement des packages nécessaires
library(tidyverse)
# Création du jeu de données
set.seed(123)
données_cultures <- tibble(
id_champ = rep(1:1000, each = 5),
type_culture = sample(c("Blé", "Maïs", "Riz"), 5000, replace = TRUE),
rendement = rnorm(5000, mean = 100, sd = 30),
conditions_météo = sample(c("Ensoleillé", "Nuageux", "Pluvieux", "Orageux", NA), 5000, replace = TRUE),
type_sol = sample(c("Sableux", "Loameux", "Argileux", "Tourbeux", "Calcaire"), 5000, replace = TRUE),
engrais_utilisé = sample(c("NPK", "Compost", "Fumier", "Aucun", NA), 5000, replace = TRUE)
)
# Affichage des premières lignes du jeu de données
head(données_cultures)
# A tibble: 6 × 6
id_champ type_culture rendement conditions_météo type_sol engrais_utilisé
<int> <chr> <dbl> <chr> <chr> <chr>
1 1 Riz 112. Ensoleillé Tourbeux <NA>
2 1 Riz 143. Ensoleillé Sableux Compost
3 1 Riz 85.1 <NA> Tourbeux Aucun
4 1 Maïs 121. Orageux Tourbeux Aucun
5 1 Riz 95.4 <NA> Calcaire Aucun
6 2 Maïs 111. Ensoleillé Sableux NPK
Ici, vous pourriez avoir besoin de ne conserver que les données complètes, puis de calculer les rendements moyens par combinaison de sol et d’engrais :
# Chargement des packages nécessaires
library(tidyverse)
# Nettoyage des données : on ne garde que les données complètes
données_cultures_cl <- données_cultures %>%
na.omit()
# Analyse des rendements en fonction du type de sol et de l'engrais utilisé
rendement_par_sol_et_engrais <- données_cultures_cl %>%
group_by(type_sol, engrais_utilisé) %>%
summarise(rendement_moyen = mean(rendement), .groups = "drop")
# Affichage des résultats
rendement_par_sol_et_engrais
# A tibble: 20 × 3
type_sol engrais_utilisé rendement_moyen
<chr> <chr> <dbl>
1 Argileux Aucun 101.
2 Argileux Compost 99.6
3 Argileux Fumier 99.5
4 Argileux NPK 101.
5 Calcaire Aucun 101.
6 Calcaire Compost 102.
7 Calcaire Fumier 101.
8 Calcaire NPK 99.6
9 Loameux Aucun 104.
10 Loameux Compost 99.2
11 Loameux Fumier 99.7
12 Loameux NPK 96.3
13 Sableux Aucun 96.7
14 Sableux Compost 99.6
15 Sableux Fumier 102.
16 Sableux NPK 99.8
17 Tourbeux Aucun 98.3
18 Tourbeux Compost 101.
19 Tourbeux Fumier 95.9
20 Tourbeux NPK 100.
Ces exemples sont relativement simples, j’espère néanmoins, qu’ils vous auront convaincu de la pertinence et de la facilité d’utilisation des packages du Tidyverse !
Quel que soit votre domaine, si vous apprenez à utiliser ces packages vous serez capable de résoudre de nombreux besoins de manipulation et d’analyse !!
Si vous souhaitez en savoir plus, vous pouvez consulter les articles suivants :
Retrouver le planning et les programmes de mes formations ici 👇👇👇
Retrouver mes propositions de services ici 👇👇👇
C’est possible en faisant un don sur la page Tipeee du blog
Soutenez Statistiques et logiciel R sur Tipeee