POL 2809 - Méthodes quantitatives d’analyse

Evelyne Brie

Automne 2026

Statistiques descriptives de base en R

Dans ce laboratoire, nous allons (1) calculer des statistiques de base sur des données univariées (moyenne, médiane, variance, écart-type), (2) calculer des statistiques de base sur des données bivariées (tableaux croisés, covariance, corrélation) et (3) apprendre à représenter graphiquement des données en R avec des courbes de densité, des histogrammes et des nuages de points. Les exercices se trouvent à la toute fin du document.

Fonctions pertinentes : mean(), median(), var(), sd(), density(), plot(), hist(), table(), prop.table(), quantile(), cov(), cor()

 

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é « Video_Games_Sales_as_at_22_Dec_2016.csv », disponible sur STUDIUM. Il s’agit d’un vrai jeu de données sur les ventes de jeux vidéo à travers le monde. N’utilisez pas la fonction « import dataset » dans la fenêtre d’environnement. Votre script à lui seul doit être suffisant pour reproduire votre travail.

Comme d’habitude, la première chose à faire est de jeter un coup d’œil au contenu de ce nouveau jeu de données, ce qui inclut vérifier la classe (class()) de chaque variable.

# Exemple (à adapter selon l'emplacement du fichier sur VOTRE ordinateur)
DataGames <- read.csv("/Users/evelynebrie/Desktop/monDossier/Video_Games_Sales_as_at_22_Dec_2016.csv")
# Afficher les dimensions du jeu de données (nombre de lignes, nombre de colonnes)
dim(DataGames)
## [1] 16719    16
# Afficher les 5 premières observations (lignes) du jeu de données
head(DataGames,5)
##                       Name Platform Year_of_Release        Genre Publisher
## 1               Wii Sports      Wii            2006       Sports  Nintendo
## 2        Super Mario Bros.      NES            1985     Platform  Nintendo
## 3           Mario Kart Wii      Wii            2008       Racing  Nintendo
## 4        Wii Sports Resort      Wii            2009       Sports  Nintendo
## 5 Pokemon Red/Pokemon Blue       GB            1996 Role-Playing  Nintendo
##   NA_Sales EU_Sales JP_Sales Other_Sales Global_Sales Critic_Score Critic_Count
## 1    41.36    28.96     3.77        8.45        82.53           76           51
## 2    29.08     3.58     6.81        0.77        40.24           NA           NA
## 3    15.68    12.76     3.79        3.29        35.52           82           73
## 4    15.61    10.93     3.28        2.95        32.77           80           73
## 5    11.27     8.89    10.22        1.00        31.37           NA           NA
##   User_Score User_Count Developer Rating
## 1          8        322  Nintendo      E
## 2                    NA                 
## 3        8.3        709  Nintendo      E
## 4          8        192  Nintendo      E
## 5                    NA
# Afficher la classe de chaque variable avec class() et sapply()
sapply(DataGames, FUN=class) 
##            Name        Platform Year_of_Release           Genre       Publisher 
##     "character"     "character"     "character"     "character"     "character" 
##        NA_Sales        EU_Sales        JP_Sales     Other_Sales    Global_Sales 
##       "numeric"       "numeric"       "numeric"       "numeric"       "numeric" 
##    Critic_Score    Critic_Count      User_Score      User_Count       Developer 
##       "integer"       "integer"     "character"       "integer"     "character" 
##          Rating 
##     "character"
 

Ce que signifie le signe $ : dans un data frame, chaque ligne correspond à une observation (ici, un jeu vidéo) et chaque colonne correspond à une variable (ici, une caractéristique du jeu, comme ses ventes mondiales). Pour accéder à une colonne précise, on utilise le symbole $. Par exemple, DataGames$Global_Sales désigne la colonne Global_Sales du data frame DataGames.

2. Données univariées

Concentrons-nous sur une seule de ces variables, soit la variable des ventes mondiales (Global_Sales). Il s’agit du nombre de copies vendues (en millions) pour chaque jeu.

# La fonction summary() nous donne une idée de la distribution de Global_Sales
# Ici, la distribution semble très positivement asymétrique
summary(DataGames$Global_Sales) 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0100  0.0600  0.1700  0.5335  0.4700 82.5300
# Identifier quel élément du vecteur Global_Sales est le plus grand
idx <- which.max(DataGames$Global_Sales)

# Afficher le nom du jeu vidéo correspondant à cette ligne
DataGames$Name[idx]
## [1] "Wii Sports"

Remarquez que le jeu Wii Sports s’est vendu à beaucoup plus de copies que le jeu vidéo moyen. Une idée pourquoi?

2.1 Statistiques de base

Nous calculons quatre statistiques de base pour cette variable : la moyenne, la médiane, la variance et l’écart-type.

2.1.1 La moyenne

La moyenne est la somme des valeurs divisée par le nombre de valeurs.

# Moyenne
mean(DataGames$Global_Sales) 
## [1] 0.5335427

2.1.2 La médiane

La médiane est la valeur qui sépare la moitié supérieure de la moitié inférieure d’un échantillon de données (c’est-à-dire la valeur « du milieu »).

# Médiane
median(DataGames$Global_Sales) 
## [1] 0.17

2.1.3 La variance

La variance mesure à quel point un ensemble de valeurs est dispersé autour de sa moyenne. Formellement, c’est la moyenne des écarts au carré entre chaque valeur et la moyenne.

# Variance
var(DataGames$Global_Sales)
## [1] 2.396103
# Preuve (calcul « à la main »)
sum((DataGames$Global_Sales-mean(DataGames$Global_Sales))^2)/(length(DataGames$Global_Sales)-1)
## [1] 2.396103

2.1.4 L’écart-type

L’écart-type (en anglais standard deviation, d’où le nom de la fonction sd()) est une mesure qui sert à quantifier la dispersion d’un ensemble de valeurs. L’écart-type est la racine carrée de la variance. Quelle est la différence entre les deux? L’écart-type est exprimé dans les mêmes unités que la moyenne, tandis que la variance est exprimée en unités au carré.

# Écart-type
sd(DataGames$Global_Sales)
## [1] 1.547935
# Preuve
sqrt(var(DataGames$Global_Sales))
## [1] 1.547935

2.2 Courbe de densité avec density() et plot()

En termes scientifiques, une estimation de densité est la construction d’une estimation, à partir de données observées, d’une fonction de densité de probabilité sous-jacente non observable. Autrement dit, elle présente la probabilité d’obtenir chaque valeur possible dans la distribution.

# Créer la densité de la distribution
d <- density(DataGames$Global_Sales) 

# Les valeurs extrêmes rendent ce graphique difficile à lire!
plot(d)

# Comme mentionné plus haut, cette variable est très positivement asymétrique 
# Bornons l'axe des x pour voir seulement les ventes entre 0 et 2 millions
plot(d, # Nom de l'objet de densité
     xlim=c(0,2), # Borner l'axe des x
     main="Densité des ventes mondiales de jeux vidéo", # Titre principal
     xlab="Ventes de jeux vidéo (millions)", # Étiquette de l'axe des x
     ylab="Densité", # Étiquette de l'axe des y
     col="red", # Couleur de la ligne
     lwd=2) # Épaisseur de la ligne

2.3 Histogramme avec hist()

Un histogramme est une représentation simple de la distribution des données. C’est l’une des façons les plus élémentaires de représenter des données univariées.

# Sélectionner seulement les ventes mondiales entre 0 et 2 millions
hist(DataGames$Global_Sales, # Nom du vecteur que nous voulons représenter
     breaks=1000, # Combien de barres au total? (note : on borne l'axe ensuite)
     xlim=c(0,2), # Borner l'axe des x
     main="Histogramme des ventes mondiales de jeux vidéo", # Titre principal
     xlab="Ventes de jeux vidéo (millions)", # Étiquette de l'axe des x
     ylab="Fréquence", # Étiquette de l'axe des y
     col="blue") # Couleur de l'histogramme

3. Données bivariées

Et si nous voulions examiner la relation entre deux variables données? Par exemple, voyons si le score des utilisateurs (variable indépendante) et les ventes mondiales (variable dépendante) sont corrélés dans ce jeu de données. On pourrait en effet s’attendre à ce que les jeux mieux notés se vendent davantage — est-ce vrai?

Ici, nous examinons les scores donnés par les utilisateurs ordinaires. Pour les exercices, vous travaillerez avec les scores des critiques.

3.1 Tableaux croisés

# Quelle est la classe de cette variable?
class(DataGames$User_Score)
## [1] "character"
# Convertir cette variable en format numérique (création d'une nouvelle variable)
DataGames$User_Score_Num <- as.numeric(as.character(DataGames$User_Score))
## Warning: NAs introduced by coercion
# Créer un objet de type table
tt <- table(DataGames$User_Score_Num, DataGames$Global_Sales)

# Afficher les 5 premières lignes et les 5 premières colonnes (nombre d'observations)
tt[1:5,1:5]
##      
##       0.01 0.02 0.03 0.04 0.05
##   0      0    0    0    0    0
##   0.2    0    0    0    1    0
##   0.3    0    0    0    0    1
##   0.5    0    0    0    0    0
##   0.6    0    1    0    0    0
# ou

# Afficher les 5 premières lignes et les 5 premières colonnes (pourcentage du total)
prop.table(tt)[1:5,1:5]
##      
##               0.01         0.02         0.03         0.04         0.05
##   0   0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000
##   0.2 0.0000000000 0.0000000000 0.0000000000 0.0001317523 0.0000000000
##   0.3 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0001317523
##   0.5 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000
##   0.6 0.0000000000 0.0001317523 0.0000000000 0.0000000000 0.0000000000
 

À noter : la conversion as.numeric(as.character()) est nécessaire parce que la variable User_Score contient du texte (par exemple « tbd », pour to be determined). R ne peut pas calculer de statistiques sur du texte : les valeurs non numériques deviennent alors des NA (valeurs manquantes).

 

Clairement, il y a trop de valeurs différentes de scores et de ventes mondiales pour que ce tableau soit lisible. Séparons les deux variables en quantiles (c’est-à-dire des points de coupure qui divisent un jeu de données en groupes de taille égale).

# Diviser le vecteur en 4 groupes de taille égale
qt1 <- quantile(DataGames$User_Score_Num,c(0,.25,.50,.75,1),na.rm = T)

# Créer une nouvelle variable divisée selon ces groupes
DataGames$User_Score_NumQT <- cut(DataGames$User_Score_Num,breaks=qt1)

# Diviser le vecteur en 4 groupes de taille égale
qt2 <- quantile(DataGames$Global_Sales,c(0,.25,.50,.75,1))

# Créer une nouvelle variable divisée selon ces groupes
DataGames$Global_SalesQT <- cut(DataGames$Global_Sales,breaks=qt2)

# Créer un objet de type table
tt <- table(DataGames$User_Score_NumQT,DataGames$Global_SalesQT)

# Afficher le tableau (nombre d'observations)
tt
##            
##             (0.01,0.06] (0.06,0.17] (0.17,0.47] (0.47,82.5]
##   (0,6.4]           314         520         575         510
##   (6.4,7.5]         285         422         597         666
##   (7.5,8.2]         248         359         453         752
##   (8.2,9.7]         195         319         465         770
# Afficher le tableau (pourcentage du total des observations)
prop.table(tt)
##            
##             (0.01,0.06] (0.06,0.17] (0.17,0.47] (0.47,82.5]
##   (0,6.4]    0.04214765  0.06979866  0.07718121  0.06845638
##   (6.4,7.5]  0.03825503  0.05664430  0.08013423  0.08939597
##   (7.5,8.2]  0.03328859  0.04818792  0.06080537  0.10093960
##   (8.2,9.7]  0.02617450  0.04281879  0.06241611  0.10335570
# Afficher le tableau (pourcentage du total des observations PAR LIGNE)
prop.table(tt,1)
##            
##             (0.01,0.06] (0.06,0.17] (0.17,0.47] (0.47,82.5]
##   (0,6.4]     0.1636269   0.2709745   0.2996352   0.2657634
##   (6.4,7.5]   0.1446701   0.2142132   0.3030457   0.3380711
##   (7.5,8.2]   0.1368653   0.1981236   0.2500000   0.4150110
##   (8.2,9.7]   0.1114923   0.1823899   0.2658662   0.4402516
# Afficher le tableau (pourcentage du total des observations PAR COLONNE)
prop.table(tt,2)
##            
##             (0.01,0.06] (0.06,0.17] (0.17,0.47] (0.47,82.5]
##   (0,6.4]     0.3013436   0.3209877   0.2751196   0.1890289
##   (6.4,7.5]   0.2735125   0.2604938   0.2856459   0.2468495
##   (7.5,8.2]   0.2380038   0.2216049   0.2167464   0.2787250
##   (8.2,9.7]   0.1871401   0.1969136   0.2224880   0.2853966

3.2 La covariance

La covariance est une mesure qui indique dans quelle mesure deux variables aléatoires varient ensemble (positivement ou négativement). Sa valeur peut se situer entre -\(\infty\) et \(\infty\). Son unité est celle des variables. Une grande covariance peut indiquer une relation forte entre les variables. Toutefois, on ne peut pas comparer des covariances entre des jeux de données ayant des échelles différentes.

cov(DataGames$Global_Sales,DataGames$User_Score_Num, use="pairwise.complete.obs")
## [1] 0.2479796

Il y a une relation positive entre les deux variables.

 

À noter : l’argument use="pairwise.complete.obs" demande à R d’ignorer les paires d’observations où au moins une des deux valeurs est manquante (NA). C’est l’équivalent, pour cov() et cor(), de l’argument na.rm = T que nous utilisons avec mean(), median() et sd().

3.3 La corrélation

La corrélation est une mesure statistique qui indique à quel point deux variables sont fortement reliées. C’est une version standardisée de la covariance. Sa valeur se situe toujours entre -1 et +1, ce qui permet de comparer des relations entre variables mesurées sur des échelles différentes.

cor(DataGames$Global_Sales,DataGames$User_Score_Num, use="pairwise.complete.obs")
## [1] 0.08813917

Il y a une relation positive faible entre les deux variables.

3.4 Le nuage de points

Un nuage de points (scatterplot) est un graphique de points qui montre la relation entre deux variables numériques (ou vecteurs).

#### NUAGE DE POINTS (Ventes mondiales ~ Score des utilisateurs) ####
plot(DataGames$Global_Sales, DataGames$User_Score_Num)

# Sélectionner seulement les ventes mondiales entre 0 et 3 millions
plot(DataGames$Global_Sales, DataGames$User_Score_Num, 
     xlim=c(0,3),
     main="Ventes mondiales de jeux vidéo selon le score des utilisateurs",
     xlab="Ventes de jeux vidéo (millions)",
     ylab="Score des utilisateurs",
     col="blue", # Couleur des points
     pch=16) # Type de point

 

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

Quelles sont la moyenne, la médiane et l’écart-type de la variable Critic_Score? Quel jeu vidéo a obtenu le meilleur score des critiques?

Indice : vous devrez probablement retirer les valeurs manquantes avec l’argument na.rm = T. Pour trouver le jeu ayant le meilleur score, inspirez-vous de la section 2 (fonction which.max()).

Voir la solution
# Solution

# L'argument na.rm = T demande à R d'ignorer les valeurs manquantes (NA)
mean(DataGames$Critic_Score, na.rm = T)
## [1] 68.96768
median(DataGames$Critic_Score, na.rm = T)
## [1] 71
sd(DataGames$Critic_Score, na.rm = T)
## [1] 13.93816
# Identifier quel élément du vecteur Critic_Score est le plus grand
idx <- which.max(DataGames$Critic_Score)

# Afficher le nom du jeu vidéo correspondant à cette ligne
DataGames$Name[idx]
## [1] "Grand Theft Auto IV"
 

Exercice 2

Créez un histogramme rouge représentant la distribution de la variable Critic_Score. La distribution est-elle asymétrique? Positivement ou négativement?

Indice : la logique est la même qu’à la section 2.3. N’oubliez pas de donner un titre et des étiquettes d’axes à votre graphique.

Voir la solution
# Solution
hist(DataGames$Critic_Score,
     main="Histogramme des scores des critiques",
     xlab="Score des critiques",
     ylab="Fréquence",
     col="red")

# La distribution est négativement asymétrique : la queue de la distribution
# s'étire vers la gauche (les scores faibles sont plus rares).
 

Exercice 3

Calculez la covariance et la corrélation entre Global_Sales et Critic_Score. Les jeux mieux notés par les critiques se vendent-ils davantage en moyenne? S’agit-il d’une relation forte? Aussi : cette relation est-elle plus forte ou plus faible que la relation entre les ventes mondiales et le score des utilisateurs, dont nous avons discuté plus haut?

Indice : n’oubliez pas l’argument use="pairwise.complete.obs" pour gérer les valeurs manquantes.

Voir la solution
# Solution

# Covariance
cov(DataGames$Global_Sales, DataGames$Critic_Score, use="pairwise.complete.obs")
## [1] 6.215692
# Corrélation
cor(DataGames$Global_Sales, DataGames$Critic_Score, use="pairwise.complete.obs")
## [1] 0.2454707
# La covariance et la corrélation sont positives : les jeux mieux notés par
# les critiques se vendent davantage en moyenne. La corrélation demeure toutefois
# faible. Elle est néanmoins plus forte que celle observée entre les ventes
# mondiales et le score des utilisateurs.