Initiation à l’analyse des données avec R

Formation théorique | 9h à 12h

Étienne Proulx (Formateur)
Laurence-Olivier M. Foisy (Accompagnateur)

2026-03-11

Bienvenue !

Au programme aujourd’hui :

  • Bases : Objets, fonctions et packages
  • Données : Importer et formater (Tidyverse)
  • Quantitatif : Statistiques descriptives et visualisation
  • Qualitatif : Analyse de texte et nuages de mots

Logistique : - 9h - 12h : Formation théorique (Hybride) - 12h - 13h : Pause dîner - 13h - 15h : Atelier pratique (Présentiel BNF-4285)

Site de la formation

Matériel requis

Aide & Mentorat

N’hésitez pas à poser vos questions sur Zoom ou en classe ! Nos mentors sont là pour vous aider.

Fondations : R & RStudio

RStudio : Votre tableau de bord

1. Script
C’est votre recette. On écrit ici pour pouvoir tout relancer plus tard.

2. Environnement
C’est votre garde-manger. Vos données et objets y sont stockés.

3. Console
C’est le four. Le code s’y exécute réellement.

4. Fichiers/Graphiques
C’est votre fenêtre sur le monde. On y voit nos dossiers et nos résultats.

Rappel : R comme calculatrice

À tester dans la console

Essayez ces commandes pour vous dégourdir les doigts.

# Opérations de base
(10 + 5) * 2
[1] 30
sqrt(16)
[1] 4
2^3  # puissance
[1] 8

Créer nos premiers objets

En R, on sauvegarde tout dans des objets avec <-

# Créer des objets simples
film_prefere <- "Dune"
annee_sortie <- 2021
note_imdb <- 8.0
# Voir le contenu des objets
film_prefere
[1] "Dune"
annee_sortie
[1] 2021
note_imdb
[1] 8

Note

Important : Les objets apparaissent dans le panneau Environment de RStudio !

Les vecteurs : groupes de valeurs

# Créer des vecteurs avec la fonction c()
films <- c("Dune", "Oppenheimer", "Barbie", "The Zone of Interest", "Killers of the Flower Moon")
annees <- c(2021, 2023, 2023, 2023, 2023)
notes_imdb <- c(8.0, 8.3, 6.8, 7.4, 7.6)
# Explorer nos vecteurs
films
[1] "Dune"                       "Oppenheimer"               
[3] "Barbie"                     "The Zone of Interest"      
[5] "Killers of the Flower Moon"
length(films)     # nombre de films
[1] 5
mean(notes_imdb)  # note moyenne
[1] 7.62

Types de données : attention aux pièges !

# Vérifier le type de nos objets
class(notes_imdb)    # numérique - parfait pour calculer
[1] "numeric"
class(films)         # caractère (texte)
[1] "character"
class(c(TRUE, FALSE))  # logique
[1] "logical"

Problème fréquent en analyse de données

Parfois, des nombres sont stockés comme du texte dans vos données. R ne peut pas calculer avec du texte !

Types de données : attention aux pièges !

# Exemple de coercition automatique (à surveiller !)
notes_mixtes <- c(8.0, 7.5, "6.8")  # un chiffre écrit en texte
notes_mixtes
[1] "8"   "7.5" "6.8"
class(notes_mixtes)  # tout devient du texte !
[1] "character"
# Impossible de calculer maintenant
 mean(notes_mixtes)  # Ceci produira une erreur !
[1] NA

Solution : convertir les types

# Convertir du texte en numérique
notes_numeriques <- as.numeric(notes_mixtes)
notes_numeriques
[1] 8.0 7.5 6.8
class(notes_numeriques)
[1] "numeric"
# Maintenant on peut calculer
mean(notes_numeriques)
[1] 7.433333

Bonne pratique

Toujours vérifier le type de vos variables avec class() avant de faire des calculs !

Notre premier tableau de données

Un data frame = tableau avec lignes et colonnes

# Créer notre base de données de films
cinema <- data.frame(
  titre = c("Dune", "Oppenheimer", "Barbie", "The Zone of Interest", "Killers of the Flower Moon"),
  annee = c(2021, 2023, 2023, 2023, 2023),
  note = c(8.0, 8.3, 6.8, 7.4, 7.6),
  genre = c("Sci-Fi", "Biographie", "Comédie", "Drame", "Drame")
)
# Regarder notre tableau
cinema
                       titre annee note      genre
1                       Dune  2021  8.0     Sci-Fi
2                Oppenheimer  2023  8.3 Biographie
3                     Barbie  2023  6.8    Comédie
4       The Zone of Interest  2023  7.4      Drame
5 Killers of the Flower Moon  2023  7.6      Drame

Explorer un data frame

# Informations générales
dim(cinema)       # dimensions (lignes x colonnes)
[1] 5 4
nrow(cinema)      # nombre de films
[1] 5
ncol(cinema)      # nombre de variables
[1] 4
names(cinema)     # noms des colonnes
[1] "titre" "annee" "note"  "genre"

Accéder aux colonnes

Avec le symbole $ (recommandé)

cinema$titre
[1] "Dune"                       "Oppenheimer"               
[3] "Barbie"                     "The Zone of Interest"      
[5] "Killers of the Flower Moon"
cinema$note
[1] 8.0 8.3 6.8 7.4 7.6
mean(cinema$note)  # note moyenne
[1] 7.62

Les fonctions : nos outils

Une fonction fait une tâche : fonction(argument1, argument2)

# Fonctions statistiques essentielles
mean(cinema$note)      # moyenne
[1] 7.62
median(cinema$note)    # médiane
[1] 7.6
sd(cinema$note)        # écart-type
[1] 0.5761944
min(cinema$note)       # minimum
[1] 6.8
max(cinema$note)       # maximum
[1] 8.3

Les packages : étendre R

Analogie

R de base = téléphone vide. Packages = applications qu’on télécharge.

# 1. INSTALLER (une seule fois)
install.packages("tidyverse")

# 2. CHARGER (à chaque nouveau script)
library(tidyverse)

Organisation & Dossiers

Votre ordinateur = une grande bibliothèque

Chaque fichier a une adresse précise (chemin) pour le retrouver !

getwd()  # "get working directory" = Où suis-je actuellement ?
[1] "/home/etienne_prx/Dropbox/travail/enseignements/R_intro_fss"
list.files()  # Qu'est-ce qu'il y a dans ce dossier ?
 [1] "_freeze"          "_quarto.yml"      "ancien.qmd"       "custom.scss"     
 [5] "data"             "docs"             "exercices.qmd"    "images"          
 [9] "index.qmd"        "README.md"        "script"           "slides_files"    
[13] "slides.qmd"       "slides.rmarkdown"

Charger de vraies données

# Charger les données Titanic depuis un dossier 'data'
titanic <- read.csv("data/titanic.csv")

# Premier coup d'œil (3 premières lignes)
head(titanic, 3)
  Survived Pclass                                               Name    Sex Age
1        0      3                             Mr. Owen Harris Braund   male  22
2        1      1 Mrs. John Bradley (Florence Briggs Thayer) Cumings female  38
3        1      3                              Miss. Laina Heikkinen female  26
  Siblings.Spouses.Aboard Parents.Children.Aboard    Fare
1                       1                       0  7.2500
2                       1                       0 71.2833
3                       0                       0  7.9250

La grammaire dplyr

dplyr est construit sur une idée simple : chaque action est un verbe.

Les 6 verbes d’or :

  • select() : Choisir des colonnes
  • filter() : Choisir des lignes
  • mutate() : Créer/modifier des colonnes
  • arrange() : Trier les lignes
  • summarise() : Résumer les données
  • group_by() : Créer des groupes

Le Pipe %>% (Ctrl+Maj+M)

C’est le connecteur universel. Il signifie : “Prend ce qui est à gauche et passe-le comme premier argument à la fonction à droite.”

Analogie : Pâte %>% Étaler() %>% Garnir() %>% Cuire()

select() : L’entonnoir à colonnes

On l’utilise pour ne garder que les variables qui nous intéressent.

# Garder seulement quelques colonnes
titanic_simple <- titanic %>%
  select(Survived, Pclass, Sex, Age)

# Exclure une colonne précise avec le signe moins (-)
titanic_sans_nom <- titanic %>%
  select(-Name)

# Sélectionner une plage de colonnes
# titanic %>% select(Survived:Age)

Astuce

select() permet aussi de réordonner vos colonnes ! Les colonnes citées en premier apparaîtront à gauche.

filter() : Le tamis à données

On l’utilise pour extraire des sous-ensembles de lignes selon des critères.

# Un seul critère : les femmes
femmes <- titanic %>%
  filter(Sex == "female")

# Critères multiples (ET) : les femmes de 1ère classe
femmes_1ere <- titanic %>%
  filter(Sex == "female", Pclass == 1)

# Critères multiples (OU) : 1ère classe OU 2e classe
classes_sup <- titanic %>%
  filter(Pclass == 1 | Pclass == 2)

Attention

Utilisez toujours le double égal == pour comparer (tester l’égalité) et non un seul = !

arrange() : L’organisateur

Permet de trier votre tableau selon une ou plusieurs variables.

# Trier par âge (du plus jeune au plus vieux)
titanic_age <- titanic %>%
  arrange(Age)

# Trier par prix du billet (du plus CHER au moins cher)
titanic_prix <- titanic %>%
  arrange(desc(Fare))

# Trier par classe, puis par âge
titanic_multi <- titanic %>%
  arrange(Pclass, Age)

mutate() : La boîte à outils

Sert à créer de nouvelles colonnes basées sur les existantes ou à modifier des colonnes.

titanic <- titanic %>%
  mutate(
    # 1. Créer une variable binaire enfant/adulte
    est_enfant = ifelse(Age < 18, "Enfant", "Adulte"),
    
    # 2. Calculer la taille de la famille (soi-même + frères/sœurs + parents/enfants)
    taille_famille = Siblings.Spouses.Aboard + Parents.Children.Aboard + 1,
    
    # 3. Convertir le prix en Dollars constants (exemple fictif)
    fare_ajuste = Fare * 1.2
  )

rename() : Pour plus de clarté

Parce que les noms de colonnes originaux sont parfois cryptiques ou mal formatés.

# rename(NOUVEAU_NOM = ANCIEN_NOM)
titanic <- titanic %>%
  rename(
    survie = Survived,
    classe = Pclass,
    sexe = Sex,
    age = Age,
    prix = Fare
  )

names(titanic)
 [1] "survie"                  "classe"                 
 [3] "Name"                    "sexe"                   
 [5] "age"                     "Siblings.Spouses.Aboard"
 [7] "Parents.Children.Aboard" "prix"                   
 [9] "est_enfant"              "taille_famille"         
[11] "fare_ajuste"            

group_by() + summarise()

C’est la puissance ultime de dplyr. On découpe, on calcule, on recolle.

# Quelle est la survie moyenne par sexe et par classe ?
statistiques_titanic <- titanic %>%
  group_by(sexe, classe) %>%
  summarise(
    nb_passagers = n(),
    age_moyen = mean(age, na.rm = TRUE),
    taux_survie = mean(survie) * 100
  )

statistiques_titanic
# A tibble: 6 × 5
# Groups:   sexe [2]
  sexe   classe nb_passagers age_moyen taux_survie
  <chr>   <int>        <int>     <dbl>       <dbl>
1 female      1           94      35.3        96.8
2 female      2           76      29.0        92.1
3 female      3          144      22.1        50  
4 male        1          122      41.5        36.9
5 male        2          108      30.5        15.7
6 male        3          343      26.5        13.7

Logique Split-Apply-Combine

  1. Split : On divise les données en groupes (ex: Hommes vs Femmes).
  2. Apply : On applique un calcul sur chaque groupe (ex: moyenne).
  3. Combine : On rassemble les résultats dans un nouveau tableau.

Graphiques simples

# Nombre de passagers par classe
ggplot(titanic, aes(x = factor(classe))) +
  geom_bar(fill = "#FFB81C", color = "white") + # Or ULaval
  theme_minimal()

La fonction factor()

Pourquoi transformer en catégories ?

  • Sans factor() : R croit que c’est un nombre continu (axe 1.0, 1.5, 2.0).
  • Avec factor() : R crée des catégories distinctes (1, 2, 3).

Conseil

Utilisez toujours factor() pour vos variables catégorielles avant de les mettre dans un graphique.

Graphiques en proportions

# Taux de survie par classe
ggplot(titanic, aes(x = factor(classe), fill = factor(survie))) +
  geom_bar(position = "fill") + # POSITION FILL : pour voir les pourcentages
  labs(title = "Taux de survie par classe", x = "Classe", y = "Proportion") +
  theme_minimal()

Analyse Quantitative

Distribution : Histogrammes

# DISTRIBUTION DE L'ÂGE
ggplot(titanic, aes(x = age)) +
  geom_histogram(bins = 20, fill = "#003875", color = "white") + 
  labs(title = "Âge des passagers", x = "Âge", y = "Nombre") +
  theme_minimal()

Anatomie du code :

  • geom_histogram() : l’outil de distribution.
  • bins = 20 : ajuste la précision.
  • fill & color : l’esthétique.

Relation : Nuages de points

# RELATION ENTRE DEUX VARIABLES
ggplot(titanic, aes(x = age, y = prix, color = factor(survie))) +
  geom_point(alpha = 0.6, size = 3) + # points (alpha = transparence)
  scale_color_manual(values = c("#C31E39", "#28a745")) + # couleurs manuelles
  labs(title = "Relation Âge vs Prix du billet", color = "Survécu", x = "Âge", y = "Prix ($)") + 
  theme_minimal()

Aller plus loin en quantitatif

Ce que nous avons vu est la base. Voici ce que R permet de faire ensuite :

  • Modélisation (Régression) : Analyser l’effet d’une variable sur une autre (ex: OLS, logistique).
  • Inférence statistique : Tester si vos résultats sont dus au hasard (tests de Student, Chi-deux).
  • Analyses dimensionnelles : Réduire la complexité de vos données (Analyse en composantes principales, factorielle).
  • Machine Learning : Prédire des comportements à partir de grands jeux de données.

Analyse Qualitative

R pour le texte ?

Les étapes clés :

  1. Nettoyage : Retirer la ponctuation et les “mots vides”.
  2. Fréquence : Compter l’importance des mots.
  3. Nuage de mots : Visualiser les concepts.

Visualisation : Le nuage de mots

Exemple de code fonctionnel :

library(wordcloud)
mots <- c("R", "Analyse", "Données", "Sociologie", "Science Politique", 
          "Statistiques", "Université", "Laval", "Recherche", "Tableau")
freq <- c(100, 80, 75, 60, 55, 50, 45, 40, 35, 30)

wordcloud(words = mots, freq = freq, min.freq = 1,
          max.words = 50, random.order = FALSE, 
          colors = brewer.pal(8, "Dark2"))

Paramètres clés

  • min.freq : Ignore les mots trop rares (ex: moins de 5 apparitions).
  • max.words : Limite le nuage aux \(N\) mots les plus fréquents pour éviter le désordre.
  • random.order = FALSE : Force les mots les plus gros au centre (plus lisible).
  • colors : Définit une palette (ici “Dark2” pour un look pro).

À quoi ça sert ?

C’est un outil d’exploration rapide pour identifier les thèmes dominants d’un corpus avant de coder vos entretiens.

Aller plus loin en qualitatif

L’analyse textuelle avec R est un domaine en pleine explosion :

  • Topic Modeling : Découvrir automatiquement les thèmes cachés dans des milliers de documents (LDA).
  • Analyse de sentiment : Classer les textes comme positifs, négatifs ou neutres.
  • LLMs & Classifieurs : Utiliser l’IA pour catégoriser des verbatim d’entretiens.
  • Dictionnaires : Mesurer la présence de concepts théoriques spécifiques.

Sauvegarde & Bonnes pratiques

Sauvegarder votre travail

# 1. Sauvegarder le graphique
ggsave("mon_graphique.png", width = 10, height = 6)

# 2. Sauvegarder les données
write.csv(titanic, "titanic_nettoye.csv", row.names = FALSE)

Pas de panique !

Erreurs courantes :

# Erreur : objet non trouvé -> Vérifier l'orthographe
# Erreur : colonne inexistante -> Utiliser names()
# Erreur : parenthèse manquante -> Vérifier les fermetures

Réflexes : lire le message, tester ligne par ligne, utiliser l’aide (?).

Récapitulatif

Ce que vous maîtrisez maintenant

✅ L’interface RStudio
✅ La création d’objets et de vecteurs
✅ L’importation de données CSV
✅ La manipulation avec dplyr
✅ La visualisation avec ggplot2
✅ Les bases de l’analyse textuelle

Ressources

Questions ?

Merci pour votre attention !

Contact : etienne.proulx.2@ulaval.ca

Pratiquez, expérimentez, et n’ayez pas peur des erreurs !