1 Contexte

Nous disposons de données (fictives) de ventes d’un magasin en ligne aux États-Unis, entre 2016 et 2018. Ces données sont téléchargeable sur Kaggle (une plateforme web, filiale de Google, qui permet aux data-scientists de partager des données, des codes, et de participer à des compétitions de data-science).

Chacune des 9994 lignes du jeu de données concerne une vente réalisée. Les informations suivantes sont disponibles pour chaque vente :

Nom de variable Type Description
Row ID double identifiant numérique unique de la transaction (numéro de ligne)
Order ID' character identifiant unique de la transaction
Order Date datetime date de la commande
Ship Date datetime date de l’envoi de la commande
Ship Mode character type d’envoi de la commande (First Class, Same Day, Second Class, et Standard Class)
Customer ID character Identifiant de l’acheteur
Customer Name character Nom de l’acheteur
Segment character Segment de vente (Consumer, Corporate, Home Office)
Country character Pays de résidence du client (United States)
City character Ville de résidence du client
State character État de résidence du client
Postal Code character Code postal de résidence du client
Region character Région de résidence du client (Central, East, South, West)
Product ID character Identifiant du produit
Category character Catégorie du produit (Furniture, Office Supplies, Technology)
Sub-Category character Sous-catégorie du produit
Product Name character Nom du produit
Sales double Prix total de la vente (prix unitaire multiplié par les quantités, avec remise éventuelle)
Quantity double Quantité vendue
Discount double Taux de réduction (entre 0 et 0.8)
Profit double Profit réalisé

Dans cet exercice, vous allez avoir besoin de faire appel à de nombreuses fonctions contenues dans le package {tidyverse}.

Lors de la première utilisation de ce package sur votre ordinateur, {tidyverse} n’est pas installé. Il faut alors procéder à l’installation en évaluant la commande suivante :

install.packages("tidyverse")

Il est ensuite nécessaire de charger le package, à l’aide de la fonction library() :

library(tidyverse)

Un message d’avertissement prévient que certains autres packages ont également été chargés.

À chaque fois que vous (re)lancerez R, il faudra de nouveau charger le ou les packages dont vous avez besoin à l’aide de la fonction library(). Une bonne pratique est de commencer les scripts R par l’appel des packages nécessaires.

De temps en temps, vous pouvez mettre à jour un package, en l’installant à nouveau (avec la fonction install.packages(nomDuPackage)).

Il est inutile d’installer les packages à chaque fois que vous (re)lancez R. Une fois installé, il suffit de les charger. De manière analogue, vous n’installez pas Android ou iOS sur votre téléphone à chaque fois que vous voulez passer un appel ou aller sur Instagram : le système d’exploitation est déjà installé, vous le chargez en allumant le smartphone. De temps en temps, vous mettez le système d’exploitation à jour.

Installez le package readxl, et chargez-le.

2 Chargement des données

Après avoir chargé le package {readxl}, le contenu du fichier US Superstore data.xls situé dans le dossier donnees peut être importé dans R, à l’aide de la fonction read_excel() :

library(readxl)
ventes <- read_excel("donnees/US Superstore data.xls")
ventes
## # A tibble: 9,994 × 21
##    `Row ID` `Order ID`     `Order Date`        `Ship Date`         `Ship Mode`  
##       <dbl> <chr>          <dttm>              <dttm>              <chr>        
##  1        1 CA-2016-152156 2016-11-08 00:00:00 2016-11-11 00:00:00 Second Class 
##  2        2 CA-2016-152156 2016-11-08 00:00:00 2016-11-11 00:00:00 Second Class 
##  3        3 CA-2016-138688 2016-06-12 00:00:00 2016-06-16 00:00:00 Second Class 
##  4        4 US-2015-108966 2015-10-11 00:00:00 2015-10-18 00:00:00 Standard Cla…
##  5        5 US-2015-108966 2015-10-11 00:00:00 2015-10-18 00:00:00 Standard Cla…
##  6        6 CA-2014-115812 2014-06-09 00:00:00 2014-06-14 00:00:00 Standard Cla…
##  7        7 CA-2014-115812 2014-06-09 00:00:00 2014-06-14 00:00:00 Standard Cla…
##  8        8 CA-2014-115812 2014-06-09 00:00:00 2014-06-14 00:00:00 Standard Cla…
##  9        9 CA-2014-115812 2014-06-09 00:00:00 2014-06-14 00:00:00 Standard Cla…
## 10       10 CA-2014-115812 2014-06-09 00:00:00 2014-06-14 00:00:00 Standard Cla…
## # … with 9,984 more rows, and 16 more variables: Customer ID <chr>,
## #   Customer Name <chr>, Segment <chr>, Country <chr>, City <chr>, State <chr>,
## #   Postal Code <dbl>, Region <chr>, Product ID <chr>, Category <chr>,
## #   Sub-Category <chr>, Product Name <chr>, Sales <dbl>, Quantity <dbl>,
## #   Discount <dbl>, Profit <dbl>

3 Un premier aperçu des données

3.1 Nombre d’observations et de variables

Le nombre de colonnes du tableau ventes peut être obtenu à l’aide de la fonction ncol() :

ncol(ventes)
## [1] 21

Le nombre de lignes peut s’obtenir quant à lui avec la fonction nrow().

nrow(ventes)
## [1] 9994

La fonction str() appliquée au tableau de données permet d’afficher le nom de chaque colonne du tableau de données, indique le type des données (numériques, chaînes de caractères, logiques, dates, etc.), et donne un aperçu des premières observations.

str(ventes)
## tibble [9,994 × 21] (S3: tbl_df/tbl/data.frame)
##  $ Row ID       : num [1:9994] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Order ID     : chr [1:9994] "CA-2016-152156" "CA-2016-152156" "CA-2016-138688" "US-2015-108966" ...
##  $ Order Date   : POSIXct[1:9994], format: "2016-11-08" "2016-11-08" ...
##  $ Ship Date    : POSIXct[1:9994], format: "2016-11-11" "2016-11-11" ...
##  $ Ship Mode    : chr [1:9994] "Second Class" "Second Class" "Second Class" "Standard Class" ...
##  $ Customer ID  : chr [1:9994] "CG-12520" "CG-12520" "DV-13045" "SO-20335" ...
##  $ Customer Name: chr [1:9994] "Claire Gute" "Claire Gute" "Darrin Van Huff" "Sean O'Donnell" ...
##  $ Segment      : chr [1:9994] "Consumer" "Consumer" "Corporate" "Consumer" ...
##  $ Country      : chr [1:9994] "United States" "United States" "United States" "United States" ...
##  $ City         : chr [1:9994] "Henderson" "Henderson" "Los Angeles" "Fort Lauderdale" ...
##  $ State        : chr [1:9994] "Kentucky" "Kentucky" "California" "Florida" ...
##  $ Postal Code  : num [1:9994] 42420 42420 90036 33311 33311 ...
##  $ Region       : chr [1:9994] "South" "South" "West" "South" ...
##  $ Product ID   : chr [1:9994] "FUR-BO-10001798" "FUR-CH-10000454" "OFF-LA-10000240" "FUR-TA-10000577" ...
##  $ Category     : chr [1:9994] "Furniture" "Furniture" "Office Supplies" "Furniture" ...
##  $ Sub-Category : chr [1:9994] "Bookcases" "Chairs" "Labels" "Tables" ...
##  $ Product Name : chr [1:9994] "Bush Somerset Collection Bookcase" "Hon Deluxe Fabric Upholstered Stacking Chairs, Rounded Back" "Self-Adhesive Address Labels for Typewriters by Universal" "Bretford CR4500 Series Slim Rectangular Table" ...
##  $ Sales        : num [1:9994] 262 731.9 14.6 957.6 22.4 ...
##  $ Quantity     : num [1:9994] 2 3 2 5 2 7 4 6 3 5 ...
##  $ Discount     : num [1:9994] 0 0 0 0.45 0.2 0 0 0.2 0.2 0 ...
##  $ Profit       : num [1:9994] 41.91 219.58 6.87 -383.03 2.52 ...

C’est à votre tour : reprenez l’ensemble de ces codes et évaluez-les dans RStudio.

3.2 Observations distinctes

Le symbole $ permet d’edxtraire les valeurs d’une colonne particulière d’un tableau de données. En écrivant ventes$`Ship Mode`, on extrait l’ensemble des valeurs de la colonne Ship Mode du tableau de données ventes. Seules les 1000 premières observations s’affichent dans la console.

ventes$`Ship Date`

La fonction head() permet d’afficher les premières valeurs d’un vecteur. Par défaut, les 6 premières valeurs sont retournées. Afficher les 6 premières valeurs de la colonne Ship Date.

head(ventes$`Ship Date`)
## [1] "2016-11-11 UTC" "2016-11-11 UTC" "2016-06-16 UTC" "2015-10-18 UTC"
## [5] "2015-10-18 UTC" "2014-06-14 UTC"

En ajoutant un 2e argument à la fonction head(), en le séparant du premier avec une virgule, indiquer que vous désirez afficher les 10 premières observatiosn de la colonne Ship Date :

head(ventes$`Ship Date`, 10)
##  [1] "2016-11-11 UTC" "2016-11-11 UTC" "2016-06-16 UTC" "2015-10-18 UTC"
##  [5] "2015-10-18 UTC" "2014-06-14 UTC" "2014-06-14 UTC" "2014-06-14 UTC"
##  [9] "2014-06-14 UTC" "2014-06-14 UTC"

À l’aide de la fonction unique(), affichez les valeurs distinctes de la colonne Ship Mode.

unique(ventes$`Ship Mode`)
## [1] "Second Class"   "Standard Class" "First Class"    "Same Day"

La fonction table() appliquée à un vecteur contenant une variable catégorielle permet d’afficher le nombre d’observations pour chaque classe.

table(ventes$`Ship Mode`)
## 
##    First Class       Same Day   Second Class Standard Class 
##           1538            543           1945           5968

À l’aide de la fonction sort(), il est ensuite possible d’ordonner les valeurs par valeurs croissantes :

sort(table(ventes$`Ship Mode`))
## 
##       Same Day    First Class   Second Class Standard Class 
##            543           1538           1945           5968

À votre tour.

  1. Affichez les valeurs distinctes de la colonne Order Priority, puis affichez le nombre de valeurs pour chaque catégorie de cette variable.
  2. Idem pour la colonne Segment
  3. Idem pour la colonne State
  4. Idem pour la colonne Region
  5. Idem pour la colonne Category.

4 Types de données

R gère des objets qui disposent de 4 caractéristiques :

4.1 Caractéristiques des objets : Mode

Le mode d’un objet correspond à la nature, au type des éléments qui le composent.

Il existe 4 modes principaux :

  1. numeric : valeurs numériques ;
  2. character : chaînes de caractères (~texte) ;
  3. logical : valeurs logiques (oui/non, vrai/faux) ;
  4. complex : valeurs complèxes (en dehors du champ d’application du cours).

Le tableau de données comporte trois modes de données :

  • numeric : valeurs réelles ;
  • character : chaînes de caractères ;
  • datetime : dates (nous prendrons du temps pour nous intéresser aux dates lors d’une autre séance).

On accède au mode d’un objet à l’aide de la fonction mode(), ou bien à l’aide de la fonction typeof() :

mode(1)
## [1] "numeric"

4.1.1 Numériques

Il existe deux types de valeurs numériques :

  1. integer : les valeurs entières ;
  2. double : les valeurs réelles.

Pour une valeur entière :

typeof(1L)
## [1] "integer"

Pour des valeurs réelles :

typeof(1)
## [1] "double"
typeof(1.1)
## [1] "double"

Pour savoir si un objet est un entier, on peut utiliser la fonction is.integer(), qui retournera TRUE si c’est le cas, ou FALSE sinon :

is.integer(1L)
## [1] TRUE
is.integer(1)
## [1] FALSE

Affichez le type de la colonne Profit du tableau ventes.

4.1.2 Chaines de caractères

Pour créer une chaîne de caractères, on utilise des guillemets simples " ou des guillemets doubles ".

"Hello world!"
## [1] "Hello world!"
'Hello world!'
## [1] "Hello world!"

Lorsqu’on utilise la fonction typeof() sur un objet qui contient des chaînes de caractères, la fonction retourne character :

typeof('Hello world!')
## [1] "character"

Pour savoir si un objet est composé de chaînes de caractères, on peut utiliser la fonction is.character():

is.character("Hello World!")
## [1] TRUE
is.character(1)
## [1] FALSE
  1. La colonne `Customer Name` du tableau ventes contient des chaînes de caractères. Vérifiez-le à l’aide de la fonction is.character()
  2. Utilisez la même fonction pour la colonne Profit du même tableau de données.

4.1.3 Valeurs logiques

Les valeurs logiques permettent de représenter des valeurs binaires : Oui/Non, Vrai/Faux, 0/1, …

En R, elles sont codées à l’aide des valeurs TRUE et FALSE, qui sont des mots réservés.

Les valeurs logiques permettent également d’indiquer, comme nous l’avons vu dans les résultats retournés par les fonctions is.integer() et is.character(), le résultat de tests logiques. Par exemple, il est possible de tester des égalités ou des inégalités.

Si on souhaite savoir si un nombre est plus grand qu’une valeur donnée, il suffit d’utiliser le symbole “supérieur à” (>). Par exemple, la ligne de code suivante permet de savoir si 3 est strictement plus grand que 5 :

3 > 5
## [1] FALSE
5 > 5
## [1] FALSE
7 > 5
## [1] TRUE

Pour un test d’égalité large, on fait suivre le symbole “supérieur à” (>) du symbole égale (=) :

3 >= 5
## [1] FALSE
5 >= 5
## [1] TRUE
7 >= 5
## [1] TRUE

Pour un test d’égalité, on utilise le symbole égal doublé (==) :

3 == 3
## [1] TRUE
3 == 4
## [1] FALSE

Pour savoir si un objet est composé de valeurs logiques, on peut utiliser la fonction is.logical():

is.logical(3 > 5)
## [1] TRUE

La valeur TRUE est convertie en 1 et la valeur FALSE est convertie en 0. Cela peut être pratique pour compter le nombre de valeurs vraies dans un objet qui contient plusieurs logiques.

TRUE + TRUE + FALSE + TRUE*TRUE
## [1] 3

À l’aide du symbole $, extrayez la colonne Sales et faites un test d’inégalité pour savoir si les valeurs sont strictement supérieures à 10.

4.2 Caractéristiques des objets : Longueur

En plus de leur nom et de leur mode, les objets sont caractérisés par une longueur. La longueur d’un objet indique le nombre d’éléments qui le contiennent.

Pour connaître la longueur d’un objet, R propose la fonction length()

Lorsque l’on écrit 10, R créé un objet (un vecteur) contenant une seule valeur numérique. La longueur de l’objet est donc de 1 :

length(1)
## [1] 1

Il est fréquent pour les français•es de mal orthographier length() et d’écrire lenght() à la place. Si vous évaluez lenght(10), R vous enverra un message d’erreur indiquant qu’il lui est impossible de trouver la fonction "lenght".

En utilisant la fonction length(), affichez la longueur de la colonne Sales du tableau ventes.

4.3 Données manquantes

Les données manquantes sont codées à l’aide de la valeur NA en R (not available). Les valeurs NA sont de type logical.

typeof(NA)
## [1] "logical"

La fonction is.na() permet de tester si une valeur est de type NA. Elle retourne une valeur logique pour indiquer exprimer le résultat du test :

is.na(10)
## [1] FALSE
is.na(NA)
## [1] TRUE

La fonction is.na() est vectorisée : lorsqu’on l’applique à un vecteur, elle est appliquée à chaque élément du vecteur et retourne un résultat pour chaque élément du vecteur. Par exemple, pour savoir, pour chaque observation de la colonne Sales du tableau de vente

is.na(ventes$Sales)

Pour savoir si toutes les valeurs d’un vecteur sont NA, on peut utiliser la fonction all(). Si toutes les valeurs sont NA, le résultat sera TRUE ; si au moins une valeur n’est pas NA, le résultat sera FALSE.

all(is.na(ventes$Sales))
## [1] FALSE

Rendez-vous sur Wooclap pour participer à un quizz et faire le bilan de la première séance.

www.wooclap.com/BFLXSB