Ma nouvelle formation : Devenez un utilisateur accompli de R, avec tidyverse

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.

Table des matières

C’est quoi Tidyverse ?

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,

Les packages du Tidyverse

Ces 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.

Le contenu de la formation “Devenez un utilisateur accompli de R avec tidyverse”

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

Les atouts de cette formation

Cette formation “Devenez un utilisateur accompli de R avec tidyverse” présente plusieurs avantages :

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.

Les modalités de la formation


Cliquez ici pour télécharger le formulaire d’inscription

Retrouvez ici 👉 toutes les informations sur la page de la formation

Quelques exemples concrets de l’utilisation de Tidyverse

Analyse de données de ventes

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. 

Analyse des tendances sur les médias sociaux :

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) 

Étude d’évolution démographique

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. 

Analyse génomique en biologie :

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… 

Gestion des dossiers médicaux en santé :

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 

Analyse des rendements de cultures en agronomie

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 !

Conclusion

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 :

Vous souhaitez vous former à R, ou aux statistiques ?

Retrouver le planning et les programmes de  mes formations ici  👇👇👇 


Vous avez besoin d’un assitance pour analyser vos données ?

Retrouver mes propositions de services ici  👇👇👇 


Vous souhaitez soutenir mon travail ?​

C’est possible en faisant un don  sur la page Tipeee du blog  👇👇👇

Soutenez Statistiques et logiciel R sur Tipeee

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches « aide mémoire » (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.