POL 2809 - Méthodes quantitatives d’analyse

Evelyne Brie

Automne 2026

Importer un jeu de données et recoder les variables

Dans ce laboratoire, nous allons (1) importer un jeu de données et (2) créer des variables. Les exercices se trouvent à la toute fin du document.

Fonctions pertinentes : read.csv(), table(), mean(), median(), sd(), summary(), aggregate()

 

Petit rappel : en R, le symbole <- sert à assigner (c’est-à-dire à stocker) une valeur dans un objet. Par exemple, x <- 5 signifie « mettre la valeur 5 dans l’objet nommé x ».

1. Importer les données

Nous commençons par charger le jeu de données nommé « Flower_Data.csv », disponible sur STUDIUM (Laboratoire -> Semaine 3). N’utilisez pas la fonction « import dataset » dans la fenêtre d’environnement. Votre script à lui seul doit être suffisant pour reproduire votre travail.

Nous importons le fichier CSV avec la fonction read.csv(). Un fichier CSV (comma-separated values) est simplement un tableau de données enregistré sous forme de texte, où les colonnes sont séparées par des virgules.

Pour que R trouve le fichier, il faut lui indiquer où il se trouve sur votre ordinateur. La façon la plus simple est d’écrire le chemin complet vers le fichier directement dans read.csv(). Référez-vous au laboratoire de la semaine dernière pour une discussion détaillée à ce sujet. Sur mon ordinateur, ça pourrait être par exemple :

# Exemple (à adapter selon l'emplacement du fichier sur VOTRE ordinateur)
FlowerData <- read.csv("/Users/evelynebrie/Desktop/monDossier/Flower_Data.csv")

Le data frame (c’est le nom qu’on donne à un tableau de données en R) devrait maintenant apparaître dans votre environnement (fenêtre en haut à droite), comme ceci.

 

Jetons un coup d’œil à son contenu.

# Afficher les dimensions du jeu de données (nombre de lignes, nombre de colonnes)
dim(FlowerData)
## [1] 150   5
# Afficher les noms des colonnes du jeu de données
colnames(FlowerData)
## [1] "sepal.length" "sepal.width"  "petal.length" "petal.width"  "species"
# Fun fact: les sépales sont les feuilles qui protègent les pétales. 
# Les pétales sont les feuilles qui servent à attirer les pollinisateurs. 
# Les pétales se situent généralement plus vers l'intérieur de la fleur, et les sépales plus vers l'extérieur.

# Afficher les 10 premières observations (lignes) du jeu de données
head(FlowerData,10)
##    sepal.length sepal.width petal.length petal.width     species
## 1           5.1         3.5          1.4         0.2 Iris-setosa
## 2           4.9         3.0          1.4         0.2 Iris-setosa
## 3           4.7         3.2          1.3         0.2 Iris-setosa
## 4           4.6         3.1          1.5         0.2 Iris-setosa
## 5           5.0         3.6          1.4         0.2 Iris-setosa
## 6           5.4         3.9          1.7         0.4 Iris-setosa
## 7           4.6         3.4          1.4         0.3 Iris-setosa
## 8           5.0         3.4          1.5         0.2 Iris-setosa
## 9           4.4         2.9          1.4         0.2 Iris-setosa
## 10          4.9         3.1          1.5         0.1 Iris-setosa
 

Ce que signifie le signe $ : dans un data frame, chaque ligne correspond à une observation (ici, une fleur) et chaque colonne correspond à une variable (ici, une caractéristique de la fleur, comme la longueur des sépales). Pour accéder à une colonne précise, on utilise le symbole $. Par exemple, FlowerData$sepal.length désigne la colonne sepal.length du data frame FlowerData.

 

Voici à quoi ressemblent les pétales et les sépales sur une vraie fleur :)

2. Créer des variables

2.1 Créer des variables dichotomiques (dummies)

Supposons que nous voulons créer une nouvelle variable indicatrice (ou dummy) appelée longSepal, qui prend la valeur 1 chaque fois que la variable sepal.length a une valeur supérieure à 6, et la valeur 0 autrement.

Pour créer des variables, nous utilisons généralement des opérateurs logiques. Vous devez apprendre ceux-ci par coeur pour les évaluations.

 

Les opérateurs logiques en R : pour écrire des conditions, R utilise les opérateurs suivants. Nous en utiliserons plusieurs dans ce laboratoire.

Opérateur logique Signification
& et
| ou
== est égal à
!= n’est pas égal à
> est plus grand que
>= est plus grand ou égal à
< est plus petit que
<= est plus petit ou égal à

 

Quand on crée une variable, la logique se fait en trois étapes : (1) on crée d’abord une colonne vide remplie de NA (NA signifie not available, c’est-à-dire une valeur manquante), (2) on remplace les NA par 1 pour les observations qui respectent la condition, puis (3) on remplace les NA restants par 0 pour les observations qui ne la respectent pas. Les crochets [ ] servent à sélectionner seulement les observations qui respectent la condition écrite à l’intérieur.

 

# Créer une nouvelle variable (colonne) vide appelée longSepal
FlowerData$longSepal<- NA 

# Donner la valeur 1 aux observations dont sepal.length est supérieur à 6
FlowerData$longSepal[FlowerData$sepal.length>6] <- 1

# Donner la valeur 0 aux observations dont sepal.length est inférieur ou égal à 6
FlowerData$longSepal[FlowerData$sepal.length<=6] <- 0

# Vérification : table() compte combien de fois chaque valeur apparaît
table(FlowerData$longSepal)
## 
##  0  1 
## 89 61
# Afficher le contenu de cette variable
FlowerData$longSepal
##   [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
##  [38] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 1
##  [75] 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1
## [112] 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1
## [149] 1 0

2.2 Créer des variables catégorielles

Supposons que nous voulons créer une nouvelle variable catégorielle appelée petalSize, qui prend la valeur « Small » chaque fois que la variable petal.width a une valeur de 1 ou moins, la valeur « Medium » lorsque cette variable a une valeur supérieure à 1 et inférieure ou égale à 2, et la valeur « Large » lorsque cette variable a une valeur supérieure à 2.

Remarquez que les valeurs de texte (comme “Small”) doivent toujours être écrites entre guillemets. Remarquez aussi le symbole &, qui signifie « ET » : la condition FlowerData$petal.width>1 & FlowerData$petal.width<=2 sélectionne les observations dont la largeur de pétale est à la fois supérieure à 1 et inférieure ou égale à 2.

# Créer une nouvelle variable vide appelée petalSize
FlowerData$petalSize<- NA 

FlowerData$petalSize[FlowerData$petal.width<=1] <- "Small"
FlowerData$petalSize[FlowerData$petal.width>1 & FlowerData$petal.width<=2] <- "Medium"
FlowerData$petalSize[FlowerData$petal.width>2] <- "Large"

# Vérification
table(FlowerData$petalSize)
## 
##  Large Medium  Small 
##     23     70     57

2.3 Créer une variable numérique

Supposons que nous voulons créer une nouvelle variable numérique appelée ps_ratio, qui correspond au ratio entre la longueur des pétales et la longueur des sépales de chaque fleur.

Ici, R effectue la division ligne par ligne : pour chaque fleur, il divise la valeur de petal.length par la valeur de sepal.length, puis stocke le résultat dans la nouvelle colonne.

# Créer une nouvelle variable vide appelée ps_ratio
FlowerData$ps_ratio <- NA 

# Calculer le ratio pour chaque fleur
FlowerData$ps_ratio <- FlowerData$petal.length/FlowerData$sepal.length

# Vérification : summary() affiche le minimum, le maximum, la moyenne, etc.
summary(FlowerData$ps_ratio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.2069  0.3148  0.7089  0.6182  0.8127  0.9524
# Afficher trois variables seulement (et seulement les 10 premières observations)
FlowerData[1:10,c("petal.length","sepal.length","ps_ratio")]
##    petal.length sepal.length  ps_ratio
## 1           1.4          5.1 0.2745098
## 2           1.4          4.9 0.2857143
## 3           1.3          4.7 0.2765957
## 4           1.5          4.6 0.3260870
## 5           1.4          5.0 0.2800000
## 6           1.7          5.4 0.3148148
## 7           1.4          4.6 0.3043478
## 8           1.5          5.0 0.3000000
## 9           1.4          4.4 0.3181818
## 10          1.5          4.9 0.3061224
 

À noter : dans la dernière ligne, la notation FlowerData[lignes, colonnes] permet de sélectionner une partie du data frame. Ici, 1:10 signifie « les lignes 1 à 10 » et c("petal.length","sepal.length","ps_ratio") signifie « seulement ces trois colonnes ». La fonction c() (pour combine) sert à regrouper plusieurs éléments ensemble.

3. Statistiques descriptives de base

3.1 Jeu de données complet

Imaginez que vous êtes un·e biologiste qui s’intéresse à la longueur des pétales. Vous pourriez vouloir calculer la moyenne avec mean(), la médiane avec median() et l’écart-type avec sd() (pour standard deviation) des longueurs de pétales dans ce jeu de données.

# Calculer la moyenne
mean(FlowerData$petal.length)
## [1] 3.758667
# Calculer la médiane
median(FlowerData$petal.length)
## [1] 4.35
# Calculer l'écart-type
sd(FlowerData$petal.length)
## [1] 1.76442
# On peut également calculer ces statistiques sur des sous-groupes de la variable
# Par exemple, ici, on prend seulement l'écart-type sur les fleurs avec la
# valeur "Large" sur notre nouvelle variable "petalSize"
sd(FlowerData$petal.length[FlowerData$petalSize=="Large"], na.rm = T)
## [1] 0.4793358

3.2 Sous-groupes

Maintenant, imaginez que vous vous intéressez aux caractéristiques selon l’espèce d’iris : soit iris setosa, iris versicolor ou iris virginica. Autrement dit, vous voulez voir si l’espèce d’un iris (variable indépendante) a un impact sur les caractéristiques de ses pétales et de ses sépales (variables dépendantes).

# Compter combien de fleurs appartiennent à chaque espèce
table(FlowerData$species)
## 
##     Iris-setosa Iris-versicolor  Iris-virginica 
##              50              50              50

Vous pouvez calculer des statistiques de base par sous-groupe avec la fonction aggregate(). La notation petal.width ~ species se lit « la variable petal.width en fonction de la variable species » : R calcule alors la statistique demandée (ici la moyenne, indiquée par FUN=mean) séparément pour chaque espèce. L’argument na.action = na.omit indique à R d’ignorer les valeurs manquantes (NA) dans le calcul.

aggregate(petal.width ~ species, data=FlowerData, FUN=mean, na.action = na.omit)
##           species petal.width
## 1     Iris-setosa       0.244
## 2 Iris-versicolor       1.326
## 3  Iris-virginica       2.026

Vous pouvez même restreindre le calcul à une partie précise des données, par exemple seulement aux fleurs dont le ratio pétale-sépale est supérieur à 0.3, grâce à l’argument subset.

aggregate(petal.width ~ species, data=FlowerData, FUN=mean, na.action = na.omit, subset = ps_ratio>0.3)
##           species petal.width
## 1     Iris-setosa   0.2578947
## 2 Iris-versicolor   1.3260000
## 3  Iris-virginica   2.0260000

 

4. Exercices

Les solutions sont cachées par défaut : cliquez sur le bouton « Voir la solution » seulement après avoir essayé par vous-même!

 

Exercice 1

Créez une variable numérique appelée shortSepal qui prend la valeur 1 chaque fois que la variable sepal.length a une valeur inférieure à 5, et la valeur 0 autrement.

Indice : la logique est la même qu’à la section 2.1.

Voir la solution
# Solution
# Créer une nouvelle variable vide appelée shortSepal
FlowerData$shortSepal<- NA 
FlowerData$shortSepal[FlowerData$sepal.length<5] <- 1
FlowerData$shortSepal[FlowerData$sepal.length>=5] <- 0

# Vérification
table(FlowerData$shortSepal)
## 
##   0   1 
## 128  22
# Afficher seulement les cinq premières observations
head(FlowerData,5)
##   sepal.length sepal.width petal.length petal.width     species longSepal
## 1          5.1         3.5          1.4         0.2 Iris-setosa         0
## 2          4.9         3.0          1.4         0.2 Iris-setosa         0
## 3          4.7         3.2          1.3         0.2 Iris-setosa         0
## 4          4.6         3.1          1.5         0.2 Iris-setosa         0
## 5          5.0         3.6          1.4         0.2 Iris-setosa         0
##   petalSize  ps_ratio shortSepal
## 1     Small 0.2745098          0
## 2     Small 0.2857143          1
## 3     Small 0.2765957          1
## 4     Small 0.3260870          1
## 5     Small 0.2800000          0
 

Exercice 2

Calculez l’écart-type de la longueur des sépales, mais seulement pour l’espèce iris virginica.

Indice : vous pouvez utiliser les crochets [ ] pour sélectionner seulement les observations d’une espèce donnée, comme nous l’avons fait à la section 2.1. Attention : pour comparer deux valeurs (plutôt que pour assigner une valeur), on utilise le double signe d’égalité ==.

Une fois terminé, votre sd() devrait donner le résultat suivant.

answer # J'ai stocké la réponse dans un élément numérique appelé « answer »
## [1] 0.6358796
Voir la solution
# Solution

# L'argument na.rm = T demande à R d'ignorer les valeurs manquantes (NA)
sd(FlowerData$sepal.length[FlowerData$species=="Iris-virginica"], na.rm = T)
## [1] 0.6358796