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.