R : Introduction à R — Analyse R

Chapitre 1. Introduction à R et Bases de R

Créé en 1993, R est un langage de programmation open source spécialement conçu pour l’analyse statistique et la visualisation des données. Facile à prendre en main et très efficace, il est un outil essentiel pour tous les acteurs.trices de la data science.

Ce cours vise à vous fournir une solide base de programmation en R, en mettant l’accent sur la compréhension des concepts fondamentaux, la pratique régulière et l’évaluation continue de vos compétences.

Ressources

Les bases de la programmation R

Qu’est-ce que R ?

R est un langage de programmation et un environnement logiciel libre dédié à l’analyse statistique et à la représentation graphique. Il est largement utilisé par les statisticiens, data scientist et les chercheurs pour diverses analyses et projets de recherche.

L’une des principales raisons pour lesquelles R est si populaire est sa flexibilité et sa capacité à s’intégrer avec d’autres langages de programmation comme Python, Java, et C++.

De plus, R dispose d’une vaste bibliothèque de packages, ce qui le rend extrêmement extensible.

Concepts de base de l’analyse des données.

L’analyse des données est le processus d’inspection, de nettoyage, de transformation et de modélisation des données dans le but de découvrir des informations utiles et de soutenir la prise de décision.

Avec R, vous pouvez effectuer toutes ces étapes de manière efficace et précise. Dans ce cours, vous retrouverez les concepts de base de l’analyse des données avec R : types de données, manipulation des données, visualisation des données et l’interprétation des résultats d’analyse.

Installation de R et RStudio sur différentes plateformes.

Installation de R : Rendez-vous sur le site officiel de R et téléchargez la version appropriée pour votre système d’exploitation (Windows, Mac, Linux). Suivez les instructions d’installation.

Installation de RStudio : Après avoir installé R, allez sur le site officiel de RStudio et téléchargez la version gratuite de RStudio Desktop. Installez-le comme n’importe quel autre logiciel.

Interface de RStudio
Interface de RStudio

Lancement de RStudio : Une fois RStudio installé, ouvrez-le. Vous verrez quatre panneaux principaux :

  • 1) console
  • 2) l’éditeur de script (source),
  • 3) l’environnement et l’historique
  • 4) fichiers/plots/packages/aide (output).

RStudio est une interface de développement intégrée (IDE) pour R.

Elle offre une interface utilisateur conviviale pour R, ce qui facilite l’écriture de code, l’exécution de scripts et la visualisation des résultats.

Structure basique pour les projets. Source: https://martinctc.github.io/.
Structure basique pour les projets. Source: https://martinctc.github.io/.

! Toujours prendre la bonne habitude de définir un projet dans RStudio

Premiers pas avec R

Dans la console, vous pouvez taper des commandes R et voir les résultats immédiatement. Essayez de taper 2 + 2 et appuyez sur Entrée. Vous devriez voir le résultat 4.

2 + 2
## [1] 4

Commentaires

Un commentaire est un morceau de texte dans votre script R qui n’est pas exécuté. Les commentaires sont essentiels pour documenter ce que fait votre code, clarifier des parties complexes, ou laisser des notes pour vous-même ou pour d’autres personnes qui pourraient lire ou utiliser votre code plus tard.

En R, un commentaire est créé en utilisant le symbole #.

# Ceci est un commentaire simple

x <- 5  # Ceci est un commentaire suivant une instruction

Installer et importer un package

Les packages sont des collections de fonctions R et de données. Ils permettent d’apporter de nouvelles fonctionnalités.

!Un package s’installe qu’une seule fois.

Pour installer un package, utilisez la commande

# install.packages("nom_du_package")

Par exemple, pour installer le package ggplot2, tapez install.packages(“ggplot2”). Pour utiliser le package, tapez library(ggplot2).

# library(ggplot2)

Demander de l’aide

Si vous êtes perdu ou si vous avez besoin d’informations sur une fonction, tapez ?nom_de_la_fonction. Par exemple, ?mean vous communiquera des informations sur la fonction mean.

?mean
## starting httpd help server ... done
# help(mean)

Écrire et exécuter son premier script R.

Écrire et exécuter un script R est une étape fondamentale pour se familiariser avec le langage R. Un script R est simplement un fichier contenant une séquence de commandes que R peut exécuter.

Dans RStudio, allez dans File > New File > R Script. Cela ouvrira un nouvel onglet d’éditeur où vous pouvez commencer à écrire votre script.

Dans l’éditeur, commencez à taper vos commandes R. Par exemple, vous pouvez faire une opération entre deux nombres…

Pour exécuter votre script, vous pouvez soit sélectionner les lignes que vous souhaitez exécuter et cliquer sur le bouton Run en haut à droite, soit sauvegarder votre script et le source dans la console R en utilisant la commande source(“chemin_vers_votre_script.R”).

Il est toujours recommandé de sauvegarder votre script pour une utilisation future. Pour ce faire, allez dans File > Save ou appuyez sur Ctrl + S.

Gestion de l’environnement R

Cette partie du script R couvre plusieurs opérations de base liées à la gestion de l’environnement de travail, l’installation et le chargement de packages, et l’utilisation de jeux de données intégrés à R. Voici une explication détaillée pour chaque ligne de code :

Répertoire de Travail et Changement de Répertoire

  1. getwd() : fonction qui retourne le chemin du répertoire de travail actuel. Le répertoire de travail est le dossier dans lequel R cherche les fichiers à lire et dans lequel il enregistre les fichiers.

  2. setwd(dir = "chemin_vers_nouveau_repertoire") : utilisée pour changer le répertoire de travail courant de R. Vous remplacez "chemin_vers_nouveau_repertoire" par le chemin du dossier où vous souhaitez travailler.

Gestion des Packages

  1. install.packages("ggplot2") : permet l’installation du package ggplot2 depuis le CRAN (Comprehensive R Archive Network). ggplot2 est largement utilisé pour la visualisation de données.

  2. library(dplyr) : charge le package dplyr dans la session R actuelle. dplyr est un package pour la manipulation de données.

Utilisation de Jeux de Données

  1. data() : fonction qui affiche tous les jeux de données disponibles par défaut dans R. Ces jeux de données sont souvent utilisés pour l’enseignement et la pratique.

  2. ?mtcars : le ? devant un nom d’objet est une manière rapide d’accéder à l’aide ou à la documentation de cet objet. Ici, ?mtcars ouvrira l’aide pour le jeu de données mtcars, fournissant des informations sur sa structure et son contenu.

  3. data("mtcars") : permet de charger le jeu de données mtcars dans l’environnement de travail R. mtcars est un jeu de données classique contenant des informations sur différents modèles de voitures.

# Répertoire de travail et changer de répertoire 

# Afficher le répertoire courant : getwd() 

# Changer de répertoire courant 
# setwd(dir = "chemin_vers_nouveau_repertoire")

# Installation d'un package 
# install.packages("ggplot2")

# Chargement d'un package
# library(dplyr)

# Afficher tous les jeux de données par défaut dans R : data()
data()

# Afficher la description d'un jeu de données 
?mtcars

# Charger un jeu de données 
data("mtcars")

Débuter en R

Création et Affichage de Variables

Les variables sont des conteneurs permettant de stocker des valeurs de données, telles que des nombres ou des chaînes de caractères.

  1. Création de la Variable x :
    • x <- 2 crée une variable nommée x et lui affecte la valeur 2. Le symbole <- est l’opérateur d’affectation en R, utilisé pour assigner des valeurs aux variables.
  2. Affichage de la Variable x :
    • print(x) affiche la valeur de la variable x. Ici, elle affichera 2.
  3. Affichage du Type de la Variable x :
    • typeof(x) renvoie le type de données stockées dans x. Pour x <- 2, le type sera double (nombre à virgule flottante).
  4. Création d’une Chaîne de Caractères :
    • chaine <- "Hello, World!" crée une variable chaine contenant la chaîne de caractères "Hello, World!".
    • print(chaine) affiche cette chaîne de caractères.
    • typeof(chaine) indique que chaine est de type character.
# Création de la variable x : " <-" 
x <- 2

# Afficher la variable x
print(x)
## [1] 2
# Afficher le type de la variable x
typeof(x)
## [1] "double"
# Creation d'une chaine de caractere
chaine <- "Hello, Word!"
print(chaine)
## [1] "Hello, Word!"
typeof(chaine)
## [1] "character"

Règles de Nommage des Variables

  • Sensibilité à la Casse : R est sensible à la casse, ce qui signifie que mavariable et MaVariable seraient considérées comme deux variables distinctes.

  • Différents Styles de Nommage :

    • mavariable : Tout en minuscules.
    • ma.variable : Séparation par un point.
    • nom_variable : Séparation par un trait de soulignement (underscore).
    • nomVariable : Style lowerCamelCase, avec la première lettre de chaque mot en majuscule, sauf la première lettre de la variable.
    • NomVariable : Style PascalCase, avec la première lettre de chaque mot en majuscule.
  • Exemples d’Affectation :

mavariable <- "jour"
ma.variable <- "semaine"
mavariable123 <- "mois"
print(mavariable)
## [1] "jour"
print(ma.variable)
## [1] "semaine"
print(mavariable123)
## [1] "mois"

Affichage et Formatage de Variables

  1. print() et sprintf() :
    • print(x) affiche la valeur de la variable x.
    • sprintf("%d", x) utilise un formatage de style C pour afficher x. %d est un spécificateur de format pour les nombres entiers.
    • sprintf("%s", chaine) utilise %s pour formater et afficher une chaîne de caractères.
    • sprintf("J'ai %d bananes", x) combine une chaîne de caractères avec la valeur de x, en remplaçant %d par la valeur de x.
# Affichage de la variable x : print() / sprintf
print(x)
## [1] 2
sprintf("%d",x)
## [1] "2"
sprintf("%s", chaine)
## [1] "Hello, Word!"
x <- 3
sprintf("J'ai %d bananes", x)
## [1] "J'ai 3 bananes"

Arrondi de Nombres

  1. Utilisation de round() :
    • mon_nombre <- 3.2 crée une variable avec une valeur à virgule flottante.
    • round(mon_nombre, 0) arrondit mon_nombre à l’entier le plus proche.
# Valeur arrondie : round() 
mon_nombre <-  3.2

# Arrondir à la valeur entière 
round(mon_nombre, 0)
## [1] 3

Vérification et Conversion de Types

  1. Type et Conversion :
    • class(mon_nombre) renvoie le type de la variable mon_nombre.
    • is.numeric(mon_nombre) vérifie si mon_nombre est de type numérique.
    • is.character(mon_nombre) vérifie si mon_nombre est une chaîne de caractères.
    • Conversion de type :
      • age_character <- "16" : une chaîne de caractères représentant un âge.
      • is.character(age_character) vérifie que c’est bien une chaîne.
      • age_numeric <- as.numeric(as.character(age_character)) convertit la chaîne en nombre.
      • is.numeric(age_numeric) confirme que la conversion a réussi.
# Vérification du type de la variable : class, is.character, is.numeric ... 
class(mon_nombre)
## [1] "numeric"
is.numeric(mon_nombre) # renvoie TRUE
## [1] TRUE
is.character(mon_nombre) # renvoie FALSE
## [1] FALSE
# Convertir des variables numériques <-  char | char -> numerique
age_character <- "16"
is.character(age_character)
## [1] TRUE
age_numeric <-  as.numeric(as.character(age_character))
is.numeric(age_numeric)
## [1] TRUE

Gestion de l’Environnement de Travail

  1. Suppression et Listing d’Objets :
    • rm(age) supprime l’objet age de l’environnement.
    • ls() liste tous les objets présents dans l’environnement de travail.
    • rm(list = ls()) supprime tous les objets de l’environnement, nettoyant ainsi l’espace de travail.
# Suppression d'un objet : rm 
rm(age)
## Warning in rm(age): objet 'age' introuvable
# Affiche les éléments dans l'enV
ls()
## [1] "age_character" "age_numeric"   "chaine"        "ma.variable"  
## [5] "mavariable"    "mavariable123" "mon_nombre"    "mtcars"       
## [9] "x"
# Supprime tous les éléments dans l'enV
rm(list = ls())

Les opérations et les opérateurs

Opérations Arithmétiques de Base

  1. Addition (+) :

    • x + y calcule la somme de x et y.
    x <- 3
    y <- 5
    x + y
    ## [1] 8
  2. Soustraction (-) :

    • x - y calcule la différence entre x et y.
x - y
## [1] -2
  1. Multiplication (*) :

    • x * y calcule le produit de x et y.
    x * y
    ## [1] 15
  2. Division (/) :

    • x / y calcule le quotient de x divisé par y.
    x / y
    ## [1] 0.6

Opérations Avancées

  1. Puissance (^ ou **) :

    • x ^ 2 ou x**2 calcule x à la puissance de 2.
    x ^ 2
    ## [1] 9
  2. Racine Carrée (sqrt()) :

    • sqrt(25) calcule la racine carrée de 25, ce qui donne 5.
    sqrt(25)
    ## [1] 5
  3. Division Entière (%/%) :

    • x %/% y donne le résultat de la division entière de x par y. C’est le quotient de la division sans la partie fractionnaire.
x %/% y
## [1] 0
  1. Modulo (%%) :
    • x %% y donne le reste de la division entière de x par y.
x %% y
## [1] 3

Unité élémentaire : le vecteur

Création et Affichage de Vecteurs

  1. Création de Vecteurs :
    • Les vecteurs sont créés avec la fonction c(). mon_vecteur est un vecteur de nombres entiers, et vecteur_caractere est un vecteur de chaînes de caractères.
# Création d'un vecteur : int, char  
mon_vecteur <- c(1, 9, 10, 35)
print(mon_vecteur)
## [1]  1  9 10 35
vecteur_caractere <-  c("Hello", "Word", "!")
print(vecteur_caractere)
## [1] "Hello" "Word"  "!"
  1. Typage Automatique :
    • Dans vecteur_multiple, le mélange de types (chaîne de caractères et nombre) conduit R à convertir automatiquement tous les éléments en chaînes de caractères pour maintenir l’homogénéité du vecteur.
# Typage automatique de 2 en chaine de caractère
vecteur_multiple <-  c("Hello", 2) 
print(vecteur_multiple)
## [1] "Hello" "2"

Indexation des Vecteurs

  1. Accéder aux Éléments d’un Vecteur :
    • vecteur_caractere[2] accède au deuxième élément du vecteur.
    • mon_vecteur[1:3] extrait les trois premiers éléments de mon_vecteur.
# Indicage
vecteur_caractere[2] # affiche l'élément 2 du vecteur
## [1] "Word"
vecteur_caractere[3] # affiche l'élément 3 du vecteur
## [1] "!"
mon_vecteur[1:3] # affiche les 3 premieres valeurs du vecteur
## [1]  1  9 10

Opérations sur les Vecteurs

  1. Calculs avec des Éléments de Vecteur :
    • addition montre un exemple de calcul en additionnant des éléments spécifiques du vecteur.
    • length, sum, et mean sont des fonctions pour obtenir la longueur du vecteur, la somme et la moyenne de ses éléments, respectivement.
mon_vecteur <- c(1, 9, 10, 35)
addition <- mon_vecteur[1] + mon_vecteur[4]
print(addition)
## [1] 36
# Opérations d'un vecteur : Longueur, somme, moyenne, ...
length(mon_vecteur)
## [1] 4
sum(mon_vecteur)
## [1] 55
mean(mon_vecteur)
## [1] 13.75

Gestion des Valeurs Manquantes

  1. Valeurs Manquantes (NA) dans les Vecteurs :
    • sum(vecteur_valeur_manquante, na.rm = TRUE) et mean(vecteur_valeur_manquante, na.rm = TRUE) montrent comment calculer la somme et la moyenne en ignorant les valeurs manquantes (NA).
# Cas des Valeurs manquantes dans un vecteur 
vecteur_valeur_manquante <-  c(1, NA, 10, 24)

sum(vecteur_valeur_manquante) # renvoie NA
## [1] NA
sum(vecteur_valeur_manquante, na.rm = TRUE) # retire les valeurs manquantes
## [1] 35
mean(vecteur_valeur_manquante) # renvoie NA
## [1] NA
mean(vecteur_valeur_manquante, na.rm = TRUE) # retire les valeurs manquantes
## [1] 11.66667

Combinaison de Vecteurs

  1. Fusion de Vecteurs :
    • nouveau_vecteur est créé en combinant mon_vecteur1 et mon_vecteur2 en un seul vecteur.
# Combinaison de vecteur 
mon_vecteur1 <- c(1, 9, 10, 35)
mon_vecteur2 <- c(27, 49)

nouveau_vecteur <- c(mon_vecteur1, mon_vecteur2)
print(nouveau_vecteur)
## [1]  1  9 10 35 27 49

Collage de Chaînes de Caractères

  1. Formation de Chaînes de Caractères :
    • paste et paste0 sont utilisés pour concaténer des chaînes de caractères. paste permet d’insérer un séparateur entre les chaînes, tandis que paste0 les concatène directement.
    • sprintf est utilisé pour le formatage de style C des chaînes.
# Combinaison de vecteur et "collage": paste, paste0 et sprintf (%s, %f ou %g)
nom <- "Dupont"
prenom <- "Jean"
age <- 15

identite <- paste(prenom, nom, sep = " ")
print(identite)
## [1] "Jean Dupont"

Recyclage dans les Vecteurs

  1. Recyclage de Vecteurs :
    • Lorsque des opérations sont effectuées sur des vecteurs de longueurs différentes (x + y), R recycle les éléments du vecteur le plus court pour correspondre à la longueur du plus long.
# Recyclage de identité avec ajout de l'age
identite <- paste(identite, age, sep = " ")

# Recyclage d'identité avec l'ajout de "ans"
identite <- paste0(identite, " ans")
print(identite)
## [1] "Jean Dupont 15 ans"
# Définition de l'identité avec paste0
identite <- paste0("Je m'appelle ", prenom, " ", nom, ",", " j'ai ", age, " ans")
print(identite)
## [1] "Je m'appelle Jean Dupont, j'ai 15 ans"
# Recyclage d'un vecteur
x <-  c(1,5)
y <- c(9, 76, 20, 30)
x + y 
## [1] 10 81 21 35

Exercices

  1. Lisez et Essayez de Résoudre les Exercices :
    Essayez de les résoudre par vous-même dans votre environnement R (comme RStudio). Il est important de pratiquer par vous-même avant de regarder les solutions pour mieux apprendre.

Exercice 1

Créez une variable appelée temperature et attribuez-lui la valeur 25.
Créez une autre variable appelée ville et attribuez-lui le nom de votre ville.
Affichez la valeur de la variable temperature dans la console.
Affichez la valeur de la variable ville dans la console.

Exercice 2

Créez deux variables prenom et nom contenant votre prénom et votre nom de famille.
Utilisez la fonction paste() pour concaténer ces deux variables en une seule chaîne de caractères représentant votre nom complet.
Affichez le résultat dans la console.

Exercice 3

Créez une variable chiffre contenant le nombre 42 sous forme de texte (chaîne de caractères).
Convertissez cette variable en un nombre entier (integer) en utilisant la fonction as.integer().
Affichez le résultat dans la console.

Exercice 4

Créez deux variables a et b contenant des nombres de votre choix.
Utilisez ces variables pour effectuer les opérations suivantes : addition, soustraction, multiplication et division.
Affichez les résultats dans la console.

Exercice 5

Créez une variable age contenant votre âge.
Utilisez la fonction sprintf() pour créer une chaîne de caractères qui affiche votre âge sous la forme “J’ai X ans.” où X est la valeur de la variable age.
Affichez la chaîne de caractères résultante dans la console.

Exercice 6

Créez un vecteur nombres contenant les nombres de 1 à 10.
Utilisez la fonction length() pour déterminer la longueur du vecteur.
Utilisez la fonction sum() pour calculer la somme de tous les éléments du vecteur.
Utilisez la fonction rev() pour inverser l’ordre des éléments du vecteur.
Affichez les résultats dans la console en utilisant la fonction sprintf().

Exercice 7

Créer un objet que vous nommerez age qui contiendra, en valeur numérique, votre âge. Affichez dans la console la valeur de l’objet age.
Modifiez le contenu de l’objet age en lui ajoutant 10 ans. Affichez dans la console la valeur de l’objet age suite à la modification.
Affichez la date actuelle : today = Sys.Date().
Soustrayez 10. Que constatez-vous ? Définissez votre date de naissance : as.Date() et faite la différence entre la date d’aujourd’hui et de votre année de naissance : difftime().
En faisant appel à la fonction ls(), affichez le nom des objets existants dans l’environnement global.
À l’aide de la fonction rm(), supprimez l’objet age, puis tentez d’afficher le contenu de l’objet age dans la console.
Affichez à nouveau le nom des objets existants dans l’environnement global.

  1. Consultez la Correction :
    Une fois que vous avez tenté de résoudre les exercices, ou si vous rencontrez des difficultés, consultez le fichier correction_exercices1.R pour voir les solutions. Analysez les solutions pour comprendre les méthodes et logiques utilisées.

Chapitre 2. Les opérateurs et les structures de données

Les opérateurs ont essentiels pour la manipulation des données, les calculs mathématiques, la logique de programmation, et plus encore.

Les structures de données en R servent à organiser et stocker les données de manière à faciliter leur manipulation, analyse et visualisation. En fonction de la nature et des exigences des données, différentes structures sont utilisées pour optimiser les performances, la facilité d’utilisation et l’efficacité du traitement des données.

Chaque structure a ses caractéristiques et est choisie en fonction des besoins spécifiques de l’analyse ou de la manipulation de données en question. En somme, ces structures sont essentielles pour une gestion efficace et une analyse rigoureuse des données dans R.

Illustration du langage R par DALL-E
Illustration du langage R par DALL-E

Assignation et Opérateurs Arithmétiques, Booléens et Logiques

Opérateurs du Langage R

Tableau des principaux opérateurs en R :

Opérateur Rôle
$ Extraction d’une liste ou d’une colonne
^ Puissance
- Changement de signe
: Génération de suites
%*%, %%, %/% Produit matriciel, modulo, division entière
* / Multiplication, division
+ - Addition, soustraction
<, <=, ==, >=, >, != Comparaisons
! Négation logique
&, && Opérateur ET logique
|, || Opérateur OU logique
->, ->> Assignation (droite)
<- , <<- Assignation (gauche)

Opérateurs d’Assignation (cf.cours1)

# Exemple d'assignation
x <- 10  # Assignation de 10 à x

Opérateurs Arithmétiques (cf.cours1)

# Exemple d'opération arithmétique
5 + 3 # Addition, renvoie 8
## [1] 8

Opérateurs Booléens (de Comparaison)

Les opérateurs de comparaison en R sont utilisés pour comparer deux valeurs ou expressions et renvoient un résultat booléen (TRUE ou FALSE).

Ces opérateurs sont essentiels dans la programmation pour les tests de condition, les boucles, et le filtrage des données.

Les opérateurs de comparaison en R sont utilisés pour comparer deux valeurs ou expressions et renvoient un résultat booléen (TRUE ou FALSE). Ces opérateurs sont essentiels dans la programmation pour les tests de condition, les boucles, et le filtrage des données.

a <- 4
b <- 8
  1. Inférieur à (<) :
    • x < y renvoie TRUE si x est inférieur à y.
    • Exemple : 3 < 5 renvoie TRUE.
# Inférieur
a < b
## [1] TRUE
  1. Supérieur à (>) :
    • x > y renvoie TRUE si x est supérieur à y.
    • Exemple : 5 > 3 renvoie TRUE.
# Supérieur
a > b
## [1] FALSE
  1. Inférieur ou égal à (<=) :
    • x <= y renvoie TRUE si x est inférieur ou égal à y.
    • Exemple : 3 <= 3 renvoie TRUE.
# Inférieur ou égal
a <= b
## [1] TRUE
  1. Supérieur ou égal à (>=) :
    • x >= y renvoie TRUE si x est supérieur ou égal à y.
    • Exemple : 5 >= 5 renvoie TRUE.
# Supérieur ou égal
a >= b
## [1] FALSE
  1. Égal à (==) :
    • x == y renvoie TRUE si x est égal à y.
    • Exemple : 3 == 3 renvoie TRUE.
# Egalité
a == b
## [1] FALSE
  1. Différent de (!=) :
    • x != y renvoie TRUE si x n’est pas égal à y.
    • Exemple : 3 != 5 renvoie TRUE.
# Non égalité
a != b
## [1] TRUE

Opérateurs Logiques

Les opérateurs logiques sont utilisés pour combiner des expressions conditionnelles et renvoient des valeurs booléennes (TRUE ou FALSE).

Ils sont essentiels pour construire des conditions complexes dans les structures de contrôle de flux et pour filtrer les données.

  1. ET Logique (& et &&) :
    • x & y : Renvoie TRUE si x ET y sont tous deux TRUE. Opère élément par élément dans le cas des vecteurs.
    • x && y : Similaire à &, mais il n’évalue que le premier élément de chaque vecteur. Utilisé principalement dans les structures de contrôle où une seule comparaison est nécessaire.
# Définition des variables
x <- TRUE
y <- FALSE

# Utilisation de & (ET logique)
resultat_et <- x & y  # Renvoie FALSE car y est FALSE
print(resultat_et)
## [1] FALSE
# Utilisation de && (ET logique, mais ne vérifie que le premier élément)
resultat_et_court <- x && y  # Renvoie également FALSE
print(resultat_et_court)
## [1] FALSE
  1. OU Logique (| et ||) :
    • x | y : Renvoie TRUE si x OU y est TRUE. Comme &, il opère élément par élément pour les vecteurs.
    • x || y : Similaire à |, mais évalue uniquement le premier élément de chaque vecteur.
# Définition des variables
x <- TRUE
y <- FALSE

# Utilisation de | (OU logique)
resultat_ou <- x | y  # Renvoie TRUE car x est TRUE
print(resultat_ou)
## [1] TRUE
# Utilisation de || (OU logique, mais ne vérifie que le premier élément)
resultat_ou_court <- x || y  # Renvoie également TRUE
print(resultat_ou_court)
## [1] TRUE
  1. NON Logique (!) :
    • !x : Renvoie TRUE si x est FALSE et vice versa. Utilisé pour inverser une condition.
# Définition de la variable
x <- TRUE

# Utilisation de ! (NON logique)
resultat_non <- !x  # Renvoie FALSE car x est TRUE
print(resultat_non)
## [1] FALSE

Autres Opérateurs et Fonctions Utiles

  1. %in% : Test d’Appartenance

%in% est utilisé pour tester si les éléments d’un vecteur se trouvent dans un autre ensemble de valeurs. Ici, il renvoie un vecteur booléen indiquant pour chaque élément de x s’il appartient à l’ensemble c("D", "B").

x <- c("A", "B", "C", "D")
x %in% c("D", "B") # Renvoie un vecteur de valeurs logiques indiquant si chaque élément de x est dans c("D", "B")
## [1] FALSE  TRUE FALSE  TRUE
  1. : : Générateur de Séquences : est un opérateur simple pour générer des séquences de nombres entiers. Dans cet exemple, 1:5 génère une séquence de 1 à 5.
variable <- 1:5 # Crée une séquence de nombres de 1 à 5
  1. [] : Extraction d’Éléments

[] est utilisé pour extraire un ou plusieurs éléments d’une structure de données comme un vecteur, une matrice, ou un data frame. variable[1:3] renvoie les trois premiers éléments de variable.

variable[1:3] # Extrait les trois premiers éléments de la séquence
## [1] 1 2 3
  1. [[]] : Extraction d’Éléments d’une Liste ou d’un Data Frame

[[...]] est utilisé pour extraire un élément spécifique d’une liste ou d’un data frame. Par exemple, maListe[[1]] renvoie le premier élément de la liste maListe.

  1. $ : Extraction par Nom

$ est utilisé pour extraire des éléments par leur nom d’une liste ou d’un data frame. Par exemple, monDataFrame$colonne renvoie la colonne nommée colonne de monDataFrame.

Les structures de données

En R, plusieurs types de structures de données sont utilisés pour stocker et manipuler les données. Chacune de ces structures a des caractéristiques et des usages spécifiques.

Vecteurs

  • Définition : Les vecteurs sont des séquences d’éléments du même type (numérique, caractère, logique, etc.).
  • Création : Utilisation de c() (combine) pour créer des vecteurs. Exemple : vecteur <- c(1, 2, 3).
  • Usage : Adaptés pour des opérations sur des séries d’éléments homogènes.

Rappels sur les vecteurs

# Création d'un vecteur numérique
vecteur_num <- c(1, 2, 3, 4, 5)
print(vecteur_num)
## [1] 1 2 3 4 5
# Création d'un vecteur de caractères
vecteur_char <- c("un", "deux", "trois", "quatre", "cinq")
print(vecteur_char)
## [1] "un"     "deux"   "trois"  "quatre" "cinq"
# Création d'un vecteur logique
vecteur_logique <- c(TRUE, FALSE, TRUE, FALSE, TRUE)
print(vecteur_logique)
## [1]  TRUE FALSE  TRUE FALSE  TRUE
# Accéder à un élément d'un vecteur
print(vecteur_num[3])  # Affiche la troisième valeur, i.e. 3
## [1] 3
# Longueur d'un vecteur
longueur <- length(vecteur_num)
print(paste("La longueur du vecteur est:", longueur))
## [1] "La longueur du vecteur est: 5"
# Séquence de nombres
seq_num <- seq(1, 10, by = 2)  # Crée une séquence de 1 à 10 avec un pas de 2
print(seq_num)
## [1] 1 3 5 7 9
# Opérations arithmétiques avec des vecteurs
vecteur_a <- c(1, 2, 3)
vecteur_b <- c(4, 5, 6)

somme <- vecteur_a + vecteur_b
print(somme)
## [1] 5 7 9
# Combinaison de vecteurs
vecteur_combine <- c(vecteur_a, vecteur_b)
print(vecteur_combine)
## [1] 1 2 3 4 5 6
# Utilisation de fonctions avec des vecteurs
moyenne <- mean(vecteur_num)
print(paste("La moyenne du vecteur est:", moyenne))
## [1] "La moyenne du vecteur est: 3"
# Trouver le minimum et le maximum
print(paste("Minimum:", min(vecteur_num)))
## [1] "Minimum: 1"
print(paste("Maximum:", max(vecteur_num)))
## [1] "Maximum: 5"
# Trouver la somme et le produit
print(paste("Somme:", sum(vecteur_num)))
## [1] "Somme: 15"
print(paste("Produit:", prod(vecteur_num)))
## [1] "Produit: 120"

Nouvelles fonctions

print(vecteur_num)
## [1] 1 2 3 4 5
# Inverser un vecteur
inverse_vecteur_num <- rev(vecteur_num)
print(inverse_vecteur_num)
## [1] 5 4 3 2 1
# Modifier une valeur d'un vecteur
inverse_vecteur_num[2] <- 90
print(inverse_vecteur_num)
## [1]  5 90  3  2  1
# Modifier plusieurs valeurs d'un vecteur
inverse_vecteur_num[c(3,4)] <- c(20, 200)
inverse_vecteur_num[2:4] <- c(78, 90, 30)
print(inverse_vecteur_num)
## [1]  5 78 90 30  1
# Répétition d'un vecteur
x <- c("a", "b", "c")
x_repete <- rep(x, 10)
print(x_repete)
##  [1] "a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c" "a"
## [20] "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c"
# Nommer les éléments d'un vecteur
identite <-  c(names = "roger", prenom = "toto")
print(identite)
##   names  prenom 
## "roger"  "toto"
print(identite["names"])
##   names 
## "roger"
# ajouter un element 
vec <- c(1,2,90, 200)
print(vec)
## [1]   1   2  90 200
vec <-  c(vec, 100)
print(vec)
## [1]   1   2  90 200 100
print(vecteur_num)
## [1] 1 2 3 4 5
# Filtrage des éléments d'un vecteur
vecteur_num_filtre <- vecteur_num[vecteur_num >= 3]
print(vecteur_num_filtre)
## [1] 3 4 5
# Filtrer les éléments supérieurs à la moyenne : mean(vecteur)
vecteur_num_filtre <- vecteur_num[vecteur_num >= mean(vecteur_num)]
print(vecteur_num_filtre)
## [1] 3 4 5
# Utilisation de la fonction which() pour obtenir les indices de position
vecteur_num2 <-  seq(1,100, by = 7)
which(vecteur_num2 <= 50)
## [1] 1 2 3 4 5 6 7 8
vecteur_num2[which(vecteur_num2 <= 50)]
## [1]  1  8 15 22 29 36 43 50
# Trier un vecteur :  order() et sort() asc and decreasing
order(inverse_vecteur_num)
## [1] 5 1 4 2 3
sort(inverse_vecteur_num)
## [1]  1  5 30 78 90
sort(inverse_vecteur_num, decreasing = TRUE)
## [1] 90 78 30  5  1

Facteurs

  • Définition : Les facteurs sont utilisés pour stocker des données catégorielles.
  • Création : Utilisation de factor() pour créer des facteurs. Exemple : facteur <- factor(c("oui", "non", "oui")).
  • Usage : Importants pour l’analyse statistique, en particulier pour la modélisation.
# Création d'un facteur
genre_chaine <- factor(c("F", "M", "NB", "F", "M", "NB", "M"))

# Conversion du vecteur de chaînes en facteur
genre <- factor(genre_chaine)
  • levels = c(“1”, “2”, “3”) définit l’ordre des niveaux dans le facteur. Les niveaux sont ordonnés selon l’ordre spécifié ici.

  • labels = c(“Pas d’accord”, “Neutre”, “D’accord”) associe chaque niveau à une étiquette descriptive. Ainsi, au lieu de “1”, “2”, “3”, les niveaux sont maintenant représentés par “Pas d’accord”, “Neutre”, et “D’accord”.

# Vecteur de données catégorielles
reponses <- c("1", "3", "2", "3", "1")

# Conversion en facteur avec labels et levels personnalisés
reponses_facteur <- factor(reponses, 
                           levels = c("1", "2", "3"),
                           labels = c("Pas d'accord", "Neutre", "D'accord"))
  • Conversion en Facteur : as.factor() prend un vecteur en entrée et le convertit en un facteur. Chaque élément unique dans le vecteur devient un niveau du facteur.
# Création d'un vecteur simple
v <- c("bas", "moyen", "haut", "moyen", "bas")

# Conversion du vecteur en facteur
f <- as.factor(v)
  • Niveaux : Les niveaux d’un facteur représentent les différentes catégories. as.factor() les détermine à partir des valeurs uniques du vecteur d’entrée.
  • Réordonnancement : Vous pouvez réordonner les niveaux d’un facteur en utilisant la fonction factor() avec l’argument levels.
# Création d'un data frame
df <- data.frame(
  groupe = c("A", "B", "A", "C"),
  score = c(10, 15, 13, 8)
)

# Convertir la colonne 'groupe' en facteur
df$groupe <- as.factor(df$groupe)

! Avertissements et Conseils - Conversion Automatique : R convertit souvent automatiquement les chaînes de caractères en facteurs lors de la lecture de données (par exemple avec read.csv()), mais cela peut être contrôlé avec l’argument stringsAsFactors. - Utilisation Méthodique : Il est important de convertir intentionnellement les variables en facteurs, surtout lors de la préparation des données pour l’analyse statistique, pour éviter les erreurs ou les interprétations incorrectes.

Listes

  • Définition : Les listes sont des collections d’éléments qui peuvent être de types différents.
  • Création : Utilisation de list() pour créer des listes. Exemple : liste <- list(nombre = 1, chaine = "R").
  • Usage : Utiles pour stocker des données hétérogènes et complexes.
# Création d'une liste
l <- list(1, "a", c(1, 2, 3))
print(l)
## [[1]]
## [1] 1
## 
## [[2]]
## [1] "a"
## 
## [[3]]
## [1] 1 2 3
# Les objets à mettre dans une liste
x <- c(45, 12, 56, 14, 16)
y <- c("Car", "Bike")
z <- matrix(1:12, ncol = 4)

# Création de la liste :list()
maliste <- list(x, y, z)
print(maliste)
## [[1]]
## [1] 45 12 56 14 16
## 
## [[2]]
## [1] "Car"  "Bike"
## 
## [[3]]
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
# Nommer les éléments de la liste : names()
names(maliste) <- c("x", "y", "Z")
print(maliste)
## $x
## [1] 45 12 56 14 16
## 
## $y
## [1] "Car"  "Bike"
## 
## $Z
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
# Aperçu de la structure de notre liste : str()
str(maliste)
## List of 3
##  $ x: num [1:5] 45 12 56 14 16
##  $ y: chr [1:2] "Car" "Bike"
##  $ Z: int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
# Accéder aux éléments d’une liste : append()
a <- c(TRUE, FALSE, TRUE)
maliste <- append(maliste,a)
maliste <- list(maliste, a)
print(maliste)
## [[1]]
## [[1]]$x
## [1] 45 12 56 14 16
## 
## [[1]]$y
## [1] "Car"  "Bike"
## 
## [[1]]$Z
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
## 
## [[1]][[4]]
## [1] TRUE
## 
## [[1]][[5]]
## [1] FALSE
## 
## [[1]][[6]]
## [1] TRUE
## 
## 
## [[2]]
## [1]  TRUE FALSE  TRUE
# Modifier une liste "[[]]"
## modifier 1e élément
## ajouter un nouveau élément à la liste
## supprimer un élément de la liste
maliste <- list(x, y, z)
length(maliste)
## [1] 3
maliste[[2]] <- c("red", "blue", "marron")
maliste[[3]] <- NULL
print(maliste)
## [[1]]
## [1] 45 12 56 14 16
## 
## [[2]]
## [1] "red"    "blue"   "marron"
# Concater des listes : c()
maliste <- c(maliste, a)
print(maliste)
## [[1]]
## [1] 45 12 56 14 16
## 
## [[2]]
## [1] "red"    "blue"   "marron"
## 
## [[3]]
## [1] TRUE
## 
## [[4]]
## [1] FALSE
## 
## [[5]]
## [1] TRUE

Matrices

  • Définition : Les matrices sont des collections d’éléments de même type organisés en un tableau à deux dimensions.
  • Création : Utilisation de matrix() pour créer des matrices. Exemple : matrice <- matrix(1:9, nrow = 3).
  • Usage : Convient aux opérations mathématiques et statistiques impliquant des données en deux dimensions.
# Création d'une matrice 3*3 : matrix()
mat <- matrix(1:9, ncol = 3, nrow = 3)
print(mat)
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
# Remplissage par colonne : byrow
mat <- matrix(1:9, ncol = 3, nrow = 3, byrow = TRUE)
print(mat)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
# Nom lignes et colonnes : colnames(), rownames()
colnames(mat) <- c("Col1", "Col2", "Col3")
rownames(mat) <- c("Row1", "Row2", "Row3")
print(mat)
##      Col1 Col2 Col3
## Row1    1    2    3
## Row2    4    5    6
## Row3    7    8    9
# Combinaison de vecteur : cbind(), rbind()
x <- c(1,2,3)
y <- c(4, 5, 6)
z <- cbind(x,y)
print(z)
##      x y
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
z <- rbind(x,y)
print(z)
##   [,1] [,2] [,3]
## x    1    2    3
## y    4    5    6
# Accéder aux éléments d'une matrice "[]"
z[2,2]
## y 
## 5
z[2,3]
## y 
## 6
# Sélectioner toutes les lignes sauf la première : -1
a <- c(7,8,9)
z <- rbind(z,a)
z[-1,]
##   [,1] [,2] [,3]
## y    4    5    6
## a    7    8    9
z[,-1]
##   [,1] [,2]
## x    2    3
## y    5    6
## a    8    9
z <- rbind(x, a, y)
print(z)
##   [,1] [,2] [,3]
## x    1    2    3
## a    7    8    9
## y    4    5    6
# Modifier une élément
z[2,3] <- 10
print(z)
##   [,1] [,2] [,3]
## x    1    2    3
## a    7    8   10
## y    4    5    6
# Modifier un élément inf à 5
z[z < 5]
## [1] 1 4 2 3
# Opérations sur les matrices : t(), diag(), eigen(), solve()
x <- c(1,2,3)
y <- c(4, 5, 6)
z <- cbind(x,y)
print(z)
##      x y
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
# Transposée de la matrice 'z'
t(z)
##   [,1] [,2] [,3]
## x    1    2    3
## y    4    5    6
# Diagnale de la matrice 'z'
z <- rbind(x, a, y)
diag(z) <- 0
print(z)
##   [,1] [,2] [,3]
## x    0    2    3
## a    7    0    9
## y    4    5    0

Data Frames

  • Définition : Les data frames sont similaires aux matrices mais peuvent contenir différents types de données dans chaque colonne.
  • Création : Utilisation de data.frame() pour créer des data frames. Exemple : df <- data.frame(Nom = c("Alice", "Bob"), Age = c(23, 25)).
  • Usage : Très utilisés en analyse de données pour représenter et manipuler des ensembles de données de manière tabulaire.
# Création d'un data frame
exemple <- data.frame(name=c("Alice", "Bob"), 
                      age=c(25, 30))
print(exemple)
##    name age
## 1 Alice  25
## 2   Bob  30
# Creation d'un dataframe: data.frame()
df <-  data.frame(taille = c(167, 192, 173, 174, 172, 167, 171, 185, 163, 170), 
                  poids = c(86, 74, 83, 50, 78, 66, 66, 51, 50, 55) ,
                  prog = c("Bac+2", "Bac", "Master", "Bac", "Bac", "DEA", "Doctorat", NA, "Certificat", "DES") ,
                  sexe = c("H", "H", "F", "H", "H", "H", "F", "H", "H", "H"))
print(df)
##    taille poids       prog sexe
## 1     167    86      Bac+2    H
## 2     192    74        Bac    H
## 3     173    83     Master    F
## 4     174    50        Bac    H
## 5     172    78        Bac    H
## 6     167    66        DEA    H
## 7     171    66   Doctorat    F
## 8     185    51       <NA>    H
## 9     163    50 Certificat    H
## 10    170    55        DES    H

Fonction usuelles sur un dataframe

Les fonctions mentionnées sont couramment utilisées pour obtenir des informations sur un data frame en R. Voici une explication de chacune d’entre elles : l()` renvoie par défaut les 6 dernières lignes.

  1. length(df) : renvoie le nombre de colonnes dans le data frame df.
length(df)
## [1] 4
  1. dim(df) : renvoie les dimensions du data frame sous forme de vecteur. Le premier élément est le nombre de lignes et le second le nombre de colonnes.
dim(df)
## [1] 10  4
  1. class(df) : renvoie la classe de l’objet. Pour un data frame, cela renverra "data.frame".
class(df)
## [1] "data.frame"
  1. str(df) : donne la structure du data frame, y compris le type de chaque colonne, et affiche les premières entrées de chaque colonne. Utile pour un aperçu rapide de la structure des données.
str(df)
## 'data.frame':    10 obs. of  4 variables:
##  $ taille: num  167 192 173 174 172 167 171 185 163 170
##  $ poids : num  86 74 83 50 78 66 66 51 50 55
##  $ prog  : chr  "Bac+2" "Bac" "Master" "Bac" ...
##  $ sexe  : chr  "H" "H" "F" "H" ...
  1. attributes(df) : renvoie une liste des attributs de l’objet df, tels que les noms, les rangs des lignes et des colonnes, et d’autres métadonnées.
attributes(df)
## $names
## [1] "taille" "poids"  "prog"   "sexe"  
## 
## $class
## [1] "data.frame"
## 
## $row.names
##  [1]  1  2  3  4  5  6  7  8  9 10
  1. View(df) : ouvre le data frame df dans une fenêtre de visualisation dans RStudio (notez que cette fonction n’est utile que dans un environnement interactif comme RStudio).
# View(df)
  1. summary(df) : fournit un résumé statistique du data frame, y compris des statistiques telles que la moyenne, le minimum, le maximum, et la médiane pour les colonnes numériques, et la fréquence des niveaux pour les colonnes factorielles.
summary(df)
##      taille          poids          prog               sexe          
##  Min.   :163.0   Min.   :50.0   Length:10          Length:10         
##  1st Qu.:167.8   1st Qu.:52.0   Class :character   Class :character  
##  Median :171.5   Median :66.0   Mode  :character   Mode  :character  
##  Mean   :173.4   Mean   :65.9                                        
##  3rd Qu.:173.8   3rd Qu.:77.0                                        
##  Max.   :192.0   Max.   :86.0
  1. head(df, 6) : renvoie les 6 premières lignes du data frame. Si le second argument est omis, head() renvoie par défaut les 6 premières lignes.
head(df, 6)
##   taille poids   prog sexe
## 1    167    86  Bac+2    H
## 2    192    74    Bac    H
## 3    173    83 Master    F
## 4    174    50    Bac    H
## 5    172    78    Bac    H
## 6    167    66    DEA    H
  1. tail(df, 2) : renvoie les 2 dernières lignes du data frame. Si le second argument est omis, tail renvoie par défaut les 6 dernières lignes.
tail(df, 2)
##    taille poids       prog sexe
## 9     163    50 Certificat    H
## 10    170    55        DES    H
# Sélection par position ou nom 
df[4, 2]  # par position 
## [1] 50
df[4, "poids"] # par position ou nom 
## [1] 50
df$poids[4] # sélection en utilisant l'opérateur '$'
## [1] 50
# Ajouter des variables : cbind()
nom <- c("Benjamin", "Hugo", "Emma", "Alex", "Tom", "Axel", "Alice", "Martin", "Robin", "Enzo")
grade <- c("A", "A", "C", "B", "B", "B", "C", "A", "A", "A")

df <- data.frame(df, 
                 names = nom, notes = grade)
print(df)
##    taille poids       prog sexe    names notes
## 1     167    86      Bac+2    H Benjamin     A
## 2     192    74        Bac    H     Hugo     A
## 3     173    83     Master    F     Emma     C
## 4     174    50        Bac    H     Alex     B
## 5     172    78        Bac    H      Tom     B
## 6     167    66        DEA    H     Axel     B
## 7     171    66   Doctorat    F    Alice     C
## 8     185    51       <NA>    H   Martin     A
## 9     163    50 Certificat    H    Robin     A
## 10    170    55        DES    H     Enzo     A
# Creer la variable IMC <- poids / taille^2
df$IMC <- df$poids / df$taille**2
# Afficher la distrbution de la variable 'sexe' : table()
table(df$sexe)
## 
## F H 
## 2 8
# Ordonner les lignes : order() en fonction d'une variable
df_order <- df[order(df$taille),]

Famille de fonctions “apply”

La famille de fonctions “apply” en R est un ensemble puissant d’outils pour appliquer des fonctions de manière efficace et concise à des structures de données. Ces fonctions sont optimisées pour différentes structures et types de données, et elles facilitent l’écriture de code propre et lisible

La famille de fonctions “apply” en R est un ensemble puissant d’outils pour appliquer des fonctions de manière efficace et concise à des structures de données. Ces fonctions sont optimisées pour différentes structures et types de données, et elles facilitent l’écriture de code propre et lisible. Voici une explication de chaque fonction de la famille “apply” mentionnée dans votre script :

apply

  • Utilisée principalement avec des matrices ou des data frames.
  • apply(df[,c("taille", "poids", "IMC")], 2, mean) : Cette commande calcule la moyenne de chaque colonne (2 indique que l’opération est effectuée colonne par colonne) dans les colonnes “taille”, “poids” et “IMC” du data frame df.
  • apply(df_poids, 1, mean) : Calcule la moyenne de chaque ligne (indiqué par 1) dans le data frame df_poids.
# apply
apply(df[,c("taille", "poids", "IMC")], 2, mean) 
##       taille        poids          IMC 
## 1.734000e+02 6.590000e+01 2.205107e-03
df_poids <- data.frame(poids1 = c(130, 170), poids2 = c(90, 50))
apply(df_poids, 1, mean)
## [1] 110 110

lapply

  • Applique une fonction à chaque élément d’une liste et renvoie une liste.
  • lapply(maliste, mean) : Calcule la moyenne de chaque élément (sous-liste) de la liste maliste.
# lapply
maliste <- list(c(1:10), c(11:20), c(24:30))
lapply(maliste, mean)
## [[1]]
## [1] 5.5
## 
## [[2]]
## [1] 15.5
## 
## [[3]]
## [1] 27

sapply

  • Semblable à lapply, mais simplifie le résultat en un vecteur ou un array, si possible.
  • sapply(maliste, mean) : Comme lapply, mais renvoie un vecteur des moyennes au lieu d’une liste.
# sapply : mean
sapply(maliste, mean)
## [1]  5.5 15.5 27.0

mapply

  • Version multivariée de sapply.
  • mapply(median, df[,c("taille", "poids")]) : Applique la fonction median aux colonnes “taille” et “poids” du data frame df. Contrairement à sapply et lapply, mapply peut travailler avec plusieurs vecteurs ou listes simultanément.
# mapply : median taille et poids 
mapply(median, df[,c("taille", "poids")])
## taille  poids 
##  171.5   66.0

tapply

  • Utilisée pour appliquer une fonction à des sous-ensembles de données.
  • tapply(df$taille, df$sexe, mean) : Calcule la moyenne de la variable “taille” séparément pour chaque groupe défini par la variable catégorielle “sexe” dans le data frame df.
# tapply / by : taille et sexe 
tapply(df$taille, df$sexe, mean)
##      F      H 
## 172.00 173.75

Exercices

  1. Lisez et Essayez de Résoudre les Exercices :
    Essayez de les résoudre par vous-même dans votre environnement R (comme RStudio). Il est important de pratiquer par vous-même avant de regarder les solutions pour mieux apprendre.

Exercice 1

  1. Créez le vecteur vec1 contenant la suite des entiers de 1 à 12. Ajoutez à la fin de ce vecteur les valeurs 16, 17, 18.
    1. Affichez tous les éléments sauf les trois premiers.
    2. Affichez tous les éléments supérieurs à 7.
    3. Filtrez les éléments pairs de vec1 dans vec1_pair et impairs dans vec1_impair.
  2. Créez un vecteur vec2 de 20 nombres aléatoires entre 1 et 100. Triez ce vecteur en ordre croissant puis décroissant.
  3. Créez le vecteur vec3 contenant 3 fois chacun des 10 chiffres (soit 0, 0, 0 ; 1, 1, 1 ; etc.).
  4. Créez le vecteur vec4 contenant une fois la lettre A, deux fois la lettre B, trois fois la lettre C… et 26 fois la lettre Z. Quelle est la longueur de cette suite ?
  5. Créez le vecteur vec5 contenant les noms suivants : individu1, individu2, …, individu100.
  6. Calculez l’écart-type d’un vecteur numérique vect <- c(82, 98, 34, 23, 76, 54). Aide : LETTERS, variance = Σ(x-μ)² / (N - 1) et écart-type = √variance.

Exercice 2

  1. Créez deux matrices, A et B, de dimensions 3x3 avec les valeurs de votre choix.
  2. Effectuez les opérations suivantes:
    1. Addition de A et B.
    2. Produit matriciel de A par B.
    3. Transposez la matrice A.
  3. Affectez des 0 dans la diagonale de la matrice A. Aide : diag, t(), %*%.

Exercice 3

  1. Créez une matrice 5x5 remplie de nombres aléatoires entre -1 et 1.
    1. Identifiez les indices des éléments de la matrice qui sont supérieurs à 0,5.
    2. Créez une nouvelle matrice binaire en remplaçant ces éléments par 1 et les autres par 0.
    3. Calculez la moyenne des éléments de chaque ligne de la matrice binaire.
  2. Créez une matrice X de dimensions 4x3 contenant des valeurs aléatoires entre 1 et 100.
    1. Extrayez la première ligne et la première colonne de la matrice.
    2. Calculez la somme de chaque colonne.
    3. Calculez la moyenne de chaque ligne.
    4. Modifiez la dernière colonne de la matrice pour qu’elle contienne la somme des éléments de chaque ligne.
    5. Normalisez la matrice (soustrayez la moyenne et divisez par l’écart-type) pour chaque colonne.

Exercice 4

  1. Créez deux listes distinctes, “liste1” et “liste2”, chacune contenant au moins trois éléments.
  2. Fusionnez ces deux listes pour former une nouvelle liste “liste_combinee”.
  3. Ajoutez un nom à chaque élément de la liste_combinee pour indiquer s’il provient de liste1 ou liste2.

Exercice 5

  1. Créez une liste nommée université qui contient les éléments suivants:

    1. Etudiants : une autre liste qui contient :
      • Prenom : un vecteur avec les prénoms “Luc”, “Julie”, “Samir”.
      • Age : un vecteur avec les âges 20, 22, 21.
    2. cours: une autre liste qui contient :
      • nom : un vecteur avec les noms “Mathématiques”, “Physique”, “Histoire”.
      • Professeur : un vecteur avec les noms “Dr. Dupont”, “Dr. Leclerc”, “Mme. Berger”.
  2. Une fois la liste créée, extrayez et affichez

  3. Consultez la Correction :
    Une fois que vous avez tenté de résoudre les exercices, ou si vous rencontrez des difficultés, consultez le fichier correction_exercices2.R pour voir les solutions. Analysez les solutions pour comprendre les méthodes et logiques utilisées.

Chapitre 3. Structure de contrôle

Comme dans tous les langages de programamtion, les structures de contrôle permettent de diriger le flux d’exécution du code.

Les trois principales structures de contrôle en R sont les conditions, les boucles et les fonctions.

Illustration du langage R par DALL-E
Illustration du langage R par DALL-E

Les conditions : if/else - ifelse(), switch()

Les instructions conditionnelles permettent d’exécuter différents blocs de code selon que certaines conditions sont remplies ou non.

if, else if, et else.

x <-  3

# Conditions (if, else)

if( x > 3){
  print("x est supérieur à 3")
}else if(x < 2){
  print("x est inférieur à 2")
}else{
  print("autre")
}
## [1] "autre"

ifelse()

La fonction ifelse() en R est une version vectorisée de la structure conditionnelle if-else. Elle est particulièrement utile pour effectuer des opérations conditionnelles sur des vecteurs.

# ifelse(condition, valeur_si_vrai, valeur_si_faux)
notes <- c(45, 75, 50, 60, 30)
mentions <- ifelse(notes >= 50, "Pass", "Fail")
print(mentions)
## [1] "Fail" "Pass" "Pass" "Pass" "Fail"
# Catégorisation des âges en mineur et majeur
age <- c(13, 18, 90, 34, 12)
age_categories <- ifelse(test = age < 18, yes = "Mineur", no = "Majeur")

Switch

La structure de contrôle switch() est utilisée pour effectuer une sélection parmi plusieurs alternatives en fonction de la valeur d’une expression. Syntaxe : switch(expression, case1=value1, case2=value2, …)

fruit <- "pomme"

message <- switch(
  fruit,
  "pomme" = "C'est une pomme.",
  "banane" = "C'est une banane.",
  "orange" = "C'est une orange.",
  "raisin" = "C'est du raisin.",
  "Autre fruit."
)

Les boucles

Les boucles en R sont des structures de contrôle qui permettent de répéter un ensemble d’instructions plusieurs fois. Elles sont particulièrement utiles pour effectuer des opérations répétitives sans avoir besoin de réécrire le même code.

L’objectif principal d’une boucle est la répétition. L’exécution du code se poursuit à l’intérieur de la boucle jusqu’à ce que la condition de sortie soit satisfaite.

Les variables déclarées à l’intérieur d’une boucle sont généralement locales à cette boucle (bien que cela puisse dépendre du langage).

Boucle for

  • Utilisation : Une boucle for est utilisée pour exécuter un bloc de code un nombre déterminé de fois. Elle est particulièrement utile lorsque vous savez à l’avance combien de fois vous devez répéter les instructions.

  • Fonctionnement :

    • variable est une variable temporaire qui prend successivement les valeurs présentes dans sequence. Généralement, la variable i est utilisée comme itérateur ou increment.
    • sequence est typiquement un vecteur ou une liste.
    • À chaque itération, le bloc de code à l’intérieur de la boucle est exécuté avec la valeur courante de variable.
  • Exemple 1 :

x <- list(a = seq(1, 100, 4), 
          b = seq(0, 1, 0.01), 
          c = letters)

for (i in x){
  print(i)
}
##  [1]  1  5  9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
##   [1] 0.00 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14
##  [16] 0.15 0.16 0.17 0.18 0.19 0.20 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29
##  [31] 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44
##  [46] 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59
##  [61] 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74
##  [76] 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89
##  [91] 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
## [20] "t" "u" "v" "w" "x" "y" "z"
  • Exemple 2 :
for (i in 1:5) {
  print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
  • Exemple 3 :
# Boucle for pour parcourir un vecteur et appliquer une condition
for(i in 1:length(age)){
  if(i > 3){
    print(age[i])
  }
}
## [1] 34
## [1] 12
  • Exemple 4 :
# Boucle for pour affichier les catégories des âges
for(a in age){
  if(a < 18){
    print("Mineur")
  }else{
    print("Majeur")
  }
}
## [1] "Mineur"
## [1] "Majeur"
## [1] "Majeur"
## [1] "Majeur"
## [1] "Mineur"

Boucle while

  • Utilisation : Une boucle while est utilisée pour répéter un bloc de code tant qu’une condition spécifiée reste vraie. Elle est utile quand le nombre de répétitions n’est pas connu à l’avance.

  • Fonctionnement :

  • La condition est évaluée avant chaque itération. Si elle est vraie (TRUE), le bloc de code est exécuté.

  • La boucle continue jusqu’à ce que la condition devienne fausse (FALSE).

  • Exemple 1 :

compteur <- 1

while (compteur <= 5) {
  print(compteur)
  compteur <- compteur + 1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

Cet exemple imprime les nombres de 1 à 5, en incrémentant compteur à chaque itération.

  • Exemple 2 :

Ici, on cherche tous les nombres multiples de 7 et 11 compris entre de 1 à 1000. Autrement dit, pour tous les num, la condition sera vérifié, tant que num sera inférieur à 1000, .

num <- 1
while(num < 1000) {
  # Vérifie si le nombre est un multiple de 7 et 11
  if(num %% 7 == 0 && num %% 11 == 0) {
    print(paste0(num," est multiple de 7 et 11"))
  }
  num <- num + 1
}
## [1] "77 est multiple de 7 et 11"
## [1] "154 est multiple de 7 et 11"
## [1] "231 est multiple de 7 et 11"
## [1] "308 est multiple de 7 et 11"
## [1] "385 est multiple de 7 et 11"
## [1] "462 est multiple de 7 et 11"
## [1] "539 est multiple de 7 et 11"
## [1] "616 est multiple de 7 et 11"
## [1] "693 est multiple de 7 et 11"
## [1] "770 est multiple de 7 et 11"
## [1] "847 est multiple de 7 et 11"
## [1] "924 est multiple de 7 et 11"

Fonctions

Les fonctions sont des blocs de code réutilisables qui effectuent une tâche spécifique.

  • Définition de la fonction:
# Fonction qui multiple deux valeurs a et b
multiplication <-  function(a, b){
  return(a * b)
}
- *multiplication* est le nom de la fonction.
- *function** est le mot-clé utilisé pour déclarer une fonction.
- *param1, param2, ...* sont les paramètres de la fonction, utilisés pour passer des données ou des valeurs à la fonction.

Le corps de la fonction contient le code qui effectue la tâche. - return(resultat) est utilisé pour renvoyer une valeur du corps de la fonction à l’endroit où elle est appelée.

  • Appel de fonction: Une fois définie, une fonction est appelée en utilisant son nom suivi de parenthèses contenant ses paramètres.
multiplication(a = 2, b = 4)
## [1] 8
  • Autres exemples:

Le script R fourni comprend deux fonctions personnalisées, chacune ayant un objectif spécifique. Voici une explication détaillée de chaque fonction :

Exemple : calculer_moyenne

Cette fonction calcule la moyenne d’un vecteur de nombres.

  • Structure de la Fonction :
calculer_moyenne <- function(vecteur) {
  # Vérification si le vecteur est vide
  if(length(vecteur) == 0) {
    warning("Le vecteur est vide!")
    return(NA)
  }
  
  # Calcul de la moyenne
  somme <- sum(vecteur)
  taille <- length(vecteur)
  moyenne <- somme / taille
  return(moyenne)
}
  • Fonctionnement :
    • La fonction commence par vérifier si le vecteur passé en argument est vide. Si c’est le cas, elle affiche un avertissement et renvoie NA.
    • Si le vecteur n’est pas vide, la fonction calcule sa somme, détermine sa taille (nombre d’éléments), puis calcule la moyenne en divisant la somme par la taille.
    • Enfin, elle renvoie la valeur moyenne calculée.
  • Exemple d’Utilisation :
vecteur <- c(1, 2, 3, 4, 5)
print(calculer_moyenne(vecteur)) # Affiche la moyenne du vecteur
## [1] 3
vecteur <- NULL
print(calculer_moyenne(vecteur)) # Affiche un avertissement et NA
## Warning in calculer_moyenne(vecteur): Le vecteur est vide!
## [1] NA

Exemple : distance_euclidienne

Cette fonction calcule la distance euclidienne entre deux points dans un plan.

  • Structure de la Fonction :
distance_euclidienne <- function(point1, point2) {
  # Vérification des dimensions des points
  if(length(point1) != 2 || length(point2) != 2) {
    stop("Chaque point doit avoir exactement deux coordonnées!")
  }
  
  # Calcul de la distance
  delta_x <- point2[1] - point1[1]
  delta_y <- point2[2] - point1[2]
  distance <- sqrt(delta_x^2 + delta_y^2)
  return(distance)
}
  • Fonctionnement :
    • La fonction vérifie d’abord si chaque point a exactement deux coordonnées (x, y). Si ce n’est pas le cas, elle arrête l’exécution avec un message d’erreur.
    • Elle calcule ensuite la différence entre les coordonnées x et y des deux points et utilise ces valeurs pour calculer la distance euclidienne (la racine carrée de la somme des carrés des différences).
  • Exemple d’Utilisation :
pointA <- c(1, 2)
pointB <- c(4, 6)
print(distance_euclidienne(pointA, pointB)) # Affiche la distance euclidienne entre pointA et pointB
## [1] 5

Ces fonctions illustrent comment encapsuler des tâches spécifiques (calcul de moyenne, calcul de distance) dans des fonctions en R, permettant ainsi une réutilisation et une meilleure organisation du code.

L’exécution du code entre dans la fonction à son point d’appel, exécute les instructions à l’intérieur de la fonction, puis revient au point d’appel une fois la fonction terminée.

Les fonctions ont leur propre portée, ce qui signifie que les variables déclarées à l’intérieur d’une fonction ne sont généralement pas accessibles à l’extérieur de celle-ci.

Type de variables

Variable locale

C’est une variable déclarée à l’intérieur d’une fonction. Elle n’est accessible qu’à l’intérieur de cette fonction.

Variable globale

C’est une variable déclarée en dehors de toutes les fonctions. Elle est accessible partout dans le script.

variable_globale <- "Je suis globale !"

ma_fonction <- function() {
  variable_locale <- "Je suis locale !"
  print(variable_globale)
  print(variable_locale)
}

ma_fonction()
## [1] "Je suis globale !"
## [1] "Je suis locale !"

Exercices

  1. Lisez et Essayez de Résoudre les Exercices :
    Essayez de les résoudre par vous-même dans votre environnement R (comme RStudio). Il est important de pratiquer par vous-même avant de regarder les solutions pour mieux apprendre.

Exercice 1

  1. Générez une séquence de nombres de 1 à 5. Utilisez une boucle for pour afficher “Numéro x” pour chaque nombre, où x est le nombre actuel de la boucle.
  2. Créez le vecteur vec4 contenant une fois la lettre A, deux fois la lettre B, trois fois la lettre C… et 26 fois la lettre Z. Quelle est la longueur de cette suite ? Aide : LETTERS et rep().
  3. Écrivez une fonction maximum_de_deux qui renvoie le plus grand de deux nombres.
  4. Créez une fonction factorielle qui calcule la factorielle d’un nombre. Exemple : 4! = 1 × 2 × 3 × 4 = 24.

Exercice 2

Générez un vecteur de 100 nombres aléatoires entre 1 et 100 et stockez-le dans une variable donnees. 1. Écrivez une fonction mediane qui calcule la médiane des données. Aide : median(). 2. Écrivez une fonction qui prend un intervalle (par exemple, 10-20) et renvoie le nombre d’éléments dans cet intervalle.

Exercice 3

Créez un vecteur nommé produits contenant les noms de cinq articles différents vendus dans un magasin (par exemple: “pommes”, “bananes”, “cerises”, “dates”, “figues”). Créez un vecteur nommé prix qui contient les prix respectifs de chaque produit.

  1. Écrivez une fonction ajouter_vente qui prend le nom du produit et la quantité vendue, met à jour le total des ventes et renvoie le montant de la vente.
  2. Utilisez une boucle pour simuler la vente de 3 articles de chaque produit et affichez le total des ventes à la fin.

Exercice 4

Créez une liste nommée etudiants où chaque élément est un vecteur contenant les notes d’un étudiant pour cinq matières différentes. 1. Écrivez une fonction moyenne_etudiant qui prend en argument le nom d’un étudiant et renvoie sa moyenne. 2. Écrivez une fonction moyenne_matiere qui prend le nom d’une matière et renvoie la moyenne de cette matière pour tous les étudiants. 3. Utilisez la fonction lapply pour calculer la moyenne de chaque étudiant.

Exercice 5

Créez une dataframe bibliotheque avec les colonnes : Titre, Auteur, Année_de_Publication, et Emprunté (VRAI ou FAUX pour indiquer si le livre a été emprunté). 1. Écrivez une fonction emprunter qui prend le titre d’un livre et met à jour son statut Emprunté à VRAI. 2. Écrivez une fonction retourner qui fait le contraire de la fonction emprunter. 3. Écrivez une fonction livres_disponibles qui affiche tous les livres non empruntés. 4. Utilisez une boucle pour simuler l’emprunt et le retour de quelques livres, puis affichez la liste des livres disponibles. 5. Concevez une fonction moyenne qui prend un nombre variable d’arguments et renvoie leur moyenne.

Exercice 6: Un peu de crypto avec le Chiffrement de César

  1. Écrivez une fonction decale qui prend deux paramètres : lettre et shift. Cette fonction renvoie la lettre décalée de shift. Exemple : cryptage("h",1) renvoie “i” et cryptage("H",1) renvoie “I”. Aide : letters et LETTERS.

  2. Écrivez une fonction crypter qui prend deux paramètres : mot et shift. Cette fonction renvoie le mot avec toutes ses lettres décalées de shift.

  3. Écrivez un programme qui permet de crypter et décrypter une phrase.

  4. Consultez la Correction :
    Une fois que vous avez tenté de résoudre les exercices, ou si vous rencontrez des difficultés, consultez le fichier correction_exercices3.R pour voir les solutions. Analysez les solutions pour comprendre les méthodes et logiques utilisées.

Chapitre 4. Manipulation de données avancées

Ce cours est conçu pour vous fournir une compréhension approfondie des techniques essentielles en R, allant de la manipulation des chaînes de caractères et la gestion des valeurs manquantes (NA), à la manipulation avancée des dates et des séries chronologiques, en passant par la visualisation des données avec ggplot2.

Vous découvrirez comment R, avec ses puissantes librairies telles que lubridate pour les dates et xts pour les séries chronologiques, facilite le traitement et l’analyse de données complexes. De plus, vous apprendrez à créer des graphiques expressifs et informatifs en utilisant les données mtcars comme cas d’étude.

Ce cours comprend également des instructions détaillées sur la sauvegarde et l’agrégation de graphiques, ainsi que des exercices pratiques pour consolider vos compétences en R.

Illustration du langage R par DALL-E
Illustration du langage R par DALL-E

Manipulation des Chaînes de Caractères en R

Les chaînes de caractères, également appelées “strings”, sont utilisées pour stocker du texte en R. Vous pouvez créer des chaînes de caractères en utilisant des guillemets simples (’ ’) ou des guillemets doubles (” “).

Par exemple :

chaine_simple <- 'Ceci est une chaîne de caractères en guillemets simples.'
chaine_double <- "Ceci est une chaîne de caractères en guillemets doubles."

Notez que les guillemets simples et doubles sont équivalents pour créer des chaînes de caractères, mais il est important de les utiliser de manière cohérente.

Vous pouvez effectuer diverses opérations de base, telles que :

Fonctions de Manipulation de Rbase

  • Concaténation : Vous pouvez joindre deux chaînes de caractères en les ajoutant ensemble à l’aide de l’opérateur + ou en utilisant la fonction paste().
chaine1 <- "Hello"
chaine2 <- "World"
resultat <- paste(chaine1, chaine2)  
  • Longueur d’une chaîne : Vous pouvez obtenir la longueur d’une chaîne de caractères en utilisant la fonction nchar().
chaine <- "Bonjour"
longueur <- nchar(chaine)  # longueur vaut 7
  • Extraction de sous-chaînes : Vous pouvez extraire une partie d’une chaîne de caractères en utilisant la fonction substr() en spécifiant la position de départ et la longueur.
chaine <- "Manipulation de texte"
sous_chaine <- substr(chaine, start = 1, stop = 12)  # extrait les 12 premiers caractères
  • Recherche de motifs : Vous pouvez vérifier si une chaîne de caractères contient un motif spécifique à l’aide de la fonction grepl().
chaine <- "Analyse de données en R"
motif <- "R"
contient_R <- grepl(motif, chaine)  # contient_R vaut TRUE
  • tolower() et toupper(): Ces fonctions permettent de convertir une chaîne de caractères en minuscules ou en majuscules, respectivement.
chaine <- "Texte à convertir"
en_minuscules <- tolower(chaine)  # en_minuscules vaut "texte à convertir"
en_majuscules <- toupper(chaine)  # en_majuscules vaut "TEXTE À CONVERTIR"
  • strsplit(): Cette fonction permet de diviser une chaîne de caractères en un vecteur de sous-chaînes en utilisant un délimiteur spécifié.
chaine <- "Janvier,Février,Mars"
sous_chaines <- strsplit(chaine, ",")  # sous_chaines est une liste de vecteurs
  • gsub(): Cette fonction permet de rechercher et de remplacer des motifs dans une chaîne de caractères.
chaine <- "Les chiens sont adorables, les chiens sont intelligents."
chaine_modifiee <- gsub("chiens", "chats", chaine)  # Remplace "chiens" par "chats"

Expressions Régulières (Regex)

Les expressions régulières, souvent abrégées en “regex” ou “regexp”, sont des motifs de recherche puissants et flexibles utilisés pour la recherche et la manipulation de texte dans les chaînes de caractères.

Les expressions régulières permettent de spécifier un modèle de caractères que vous souhaitez rechercher dans un texte. Elles sont largement utilisées dans la manipulation de texte, le traitement de données, la validation de formulaires, la recherche et bien d’autres domaines de l’informatique.

Voici une explication des éléments clés des expressions régulières :

  1. Caractères littéraux : Les caractères littéraux dans une expression régulière correspondent exactement aux mêmes caractères dans le texte. Par exemple, l’expression régulière “chat” correspondra au mot “chat” dans un texte.

  2. Méta-caractères : Les méta-caractères sont

des caractères spéciaux utilisés pour définir des modèles plus flexibles. Voici quelques méta-caractères couramment utilisés :

  1. . (point) : Correspond à n’importe quel caractère, sauf le saut de ligne.

  2. * (astérisque) : Correspond à zéro ou plusieurs occurrences du caractère précédent. Par exemple, “ab*c” correspondra à “ac”, “abc”, “abbc”, etc.

  3. + (plus) : Correspond à une ou plusieurs occurrences du caractère précédent. Par exemple, “ab+c” correspondra à “abc”, “abbc”, etc., mais pas à “ac”.

  4. ? (point d’interrogation) : Correspond à zéro ou une occurrence du caractère précédent. Par exemple, “ab?c” correspondra à “ac” et “abc”, mais pas à “abbc”.

  5. [] (crochets) : Vous pouvez spécifier un ensemble de caractères possibles à cet endroit dans l’expression régulière. Par exemple, “[aeiou]” correspondra à n’importe quelle voyelle.

  6. [^] (crochets inversés) : Inverse la correspondance. “[^aeiou]” correspondra à tout caractère qui n’est pas une voyelle.

  7. () (parenthèses) : Permet de grouper des expressions régulières. Par exemple, “(ab)+” correspondra à “ab”, “abab”, “ababab”, etc.

  1. Caractères d’échappement : Si vous souhaitez rechercher des méta-caractères littéralement, vous devez les échapper en les précédant d’un antislash.

  2. Quantificateurs : Les quantificateurs (tels que *, +, ?, {n}, {n,} et {n,m}) permettent de spécifier combien de fois un motif doit se produire. Par exemple, a{2,4} correspondra à “aa”, “aaa” et “aaaa”, mais pas à “a” ou “aaaaa”.

  3. Ancrages : Les ancrages (tels que ^ au début de l’expression régulière et $ à la fin) spécifient que la correspondance doit commencer ou se terminer à un endroit précis dans le texte. Par exemple, “^abc” correspondra à “abc” uniquement si “abc” est au début du texte.

  4. Modificateurs : Les modificateurs permettent de définir des options pour les expressions régulières. Par exemple, i permet d’ignorer la casse, g permet de rechercher toutes les occurrences, et m permet de rechercher sur plusieurs lignes.

  5. Recherches complexes : Les expressions régulières peuvent être combinées de manière complexe pour créer des modèles de recherche avancés. Par exemple, (ab|cd) correspondra à “ab” ou “cd”, et [A-Za-z]+ correspondra à une séquence de lettres en minuscules ou en majuscules.

Exemples d’utilisation des expressions régulières en R avec stringr

# Trouver un motif dans une chaîne de caractères
texte <- "Le numéro de téléphone de Jean est 555-123-4567. Le mien est 123-456-7890."
# Trouver tous les numéros de téléphone dans le texte
resultat <- str_extract_all(texte, "\\d{3}-\\d{3}-\\d{4}")
# Remplacer un motif dans une chaîne de caractères
texte <- "Les pommes sont rouges, les bananes sont jaunes."
# Remplacer "rouges" par "vertes"
nouveau_texte <- str_replace(texte, "rouges", "vertes")
# Extraire des parties spécifiques d'une chaîne de caractères
texte <- "Date de naissance : 25/03/1990"
# Extraire la date de naissance (xx/xx/xxxx)
date_naissance <- str_extract(texte, "\\d{2}/\\d{2}/\\d{4}")

Vérifions si une chaîne de caractères correspond à un motif spécifique, comme un numéro de sécurité sociale formaté en xxx-xx-xxxx.

motif <- "\\d{3}-\\d{2}-\\d{4}"

# Chaînes à vérifier
chaine1 <- "123-45-6789"
chaine2 <- "abc-12-3456"

# Vérification du motif
est_valide1 <- str_detect(chaine1, motif)
est_valide2 <- str_detect(chaine2, motif)

# Affichage des résultats
print(est_valide1)  # Doit retourner TRUE
## [1] TRUE
print(est_valide2)  # Doit retourner FALSE
## [1] FALSE

Examinons comment extraire les noms d’utilisateur à partir d’adresses e-mail dans un texte.

texte <- "Les adresses e-mail de contact sont : john.doe@email.com, jane_smith@email.com."

# Extraction des adresses e-mail
utilisateurs <- str_extract_all(texte, "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}")

# Extraction des noms d'utilisateur
noms_utilisateurs <- str_extract_all(unlist(utilisateurs), "[A-Za-z0-9._%+-]+")

Remplaçons les caractères spéciaux dans une chaîne de caractères par des espaces.

texte <- "Ceci est un exemple de texte avec des caractères spéciaux : @#$%&*()_"

# Remplacement des caractères spéciaux
texte_propre <- str_replace_all(texte, "[@#$%&*()_]", " ")

Démontrons comment trouver des URL dans un texte en utilisant les expressions régulières.

texte <- "Voici quelques liens utiles : www.example.com, http://www.google.com, https://github.com."

# Extraction des URL
urls <- str_extract_all(texte, "https?://[A-Za-z0-9./]+")

# Affichage des URL trouvées
print(urls)
## [[1]]
## [1] "http://www.google.com" "https://github.com."

Supprimer les balises HTML d’une chaîne

html_text <- "<h1>Titre</h1> Ceci est un <b>texte</b> simple."
str_replace_all(html_text, "<[^>]+>", "")
## [1] "Titre Ceci est un texte simple."

Application : Analyse de sentiments

commentaires <- c("J'adore ce produit.", 
                  "C'est le pire achat que j'ai jamais fait.",
                  "Pas mal, mais pourrait être mieux.",
                  "Un excellent service client !",
                  "Je ne recommanderais pas ce produit.")

commentaires <- tolower(commentaires)
commentaires <- gsub("[[:punct:]]", "", commentaires)

# 2. Analyse manuelle des sentiments
mots_positifs <- c("adore", "excellent")
mots_negatifs <- c("pire", "ne recommanderais pas")

sentiments <- c()

for(commentaire in commentaires) {
  score_positif <- sum(unlist(lapply(mots_positifs, function(word) 
    grepl(word, commentaire))))
  score_negatif <- sum(unlist(lapply(mots_negatifs, function(word) 
    grepl(word, commentaire))))
  
  if(score_positif > score_negatif) {
    sentiments <- c(sentiments, "Positif")
  } else {
    sentiments <- c(sentiments, "Négatif")
  }
}

# 3. Affichage des résultats
for(i in 1:length(commentaires)) {
  cat(paste(commentaires[i], ":", sentiments[i]), "\n")
}
## jadore ce produit : Positif 
## cest le pire achat que jai jamais fait : Négatif 
## pas mal mais pourrait être mieux : Négatif 
## un excellent service client  : Positif 
## je ne recommanderais pas ce produit : Négatif

Pour couvrir la gestion des données NA (valeurs manquantes) en R dans un document RMarkdown, voici un exemple de formatage comprenant des explications et des blocs de code R :

Gestion des Données NA (Valeurs Manquantes) en R

La gestion des valeurs manquantes est cruciale dans l’analyse de données. En R, NA représente une valeur manquante ou indisponible.

Détecter les NA

Utilisez is.na() pour identifier où se trouvent les valeurs manquantes dans vos données.

# Création d'un vecteur avec des valeurs NA
vecteur <- c(1, NA, 3, NA, 5)

# Vérification des valeurs NA
na_positions <- is.na(vecteur)
print(na_positions)
## [1] FALSE  TRUE FALSE  TRUE FALSE

Exclure les NA dans les Calculs

Beaucoup de fonctions en R ont un argument pour gérer les NA. Par exemple, na.rm = TRUE permet d’exclure les NA dans les calculs.

# Calcul de la moyenne en excluant les NA
moyenne_sans_na <- mean(vecteur, na.rm = TRUE)
print(moyenne_sans_na)
## [1] 3

Remplacement des NA

Vous pouvez remplacer les NA par une autre valeur en utilisant na.omit() ou replace().

# Remplacement des NA par une valeur spécifique (par exemple 0)
vecteur_sans_na <- replace(vecteur, is.na(vecteur), 0)
print(vecteur_sans_na)
## [1] 1 0 3 0 5

Utilisation de na.omit()

na.omit() retire les éléments NA d’un objet.

# Retrait des NA d'un vecteur
vecteur_omit_na <- na.omit(vecteur)
print(vecteur_omit_na)
## [1] 1 3 5
## attr(,"na.action")
## [1] 2 4
## attr(,"class")
## [1] "omit"

Gestion des NA dans un Data Frame

Dans un data frame, vous pouvez retirer les lignes ou les colonnes contenant des NA.

# Création d'un data frame avec des NA
df <- data.frame(x = c(1, 2, NA, 4), y = c("a", "b", "c", NA))

# Retrait des lignes avec des NA
df_sans_na <- na.omit(df)
print(df_sans_na)
##   x y
## 1 1 a
## 2 2 b

La gestion correcte des valeurs manquantes est essentielle pour assurer l’intégrité et la précision de vos analyses de données.

Dates et Heures avec lubridate

L’utilisation de la bibliothèque lubridate facilite le travail avec les dates et heures en R.

Conversion de Chaînes de Caractères en Dates

# Installation et chargement de la bibliothèque lubridate si nécessaire
# install.packages("lubridate")
# library(lubridate)

# Convertir une chaîne au format "année-mois-jour"
date_test <- ymd("2023-10-17")
date_test
## [1] "2023-10-17"
class(date_test)
## [1] "Date"

Conversion avec Heure et Minute

# Convertir une chaîne au format "jour-mois-année heure:minute"
date_test_heure <- dmy_hm("17-10-2023 14:30")
date_test_heure
## [1] "2023-10-17 14:30:00 UTC"

Création de Séries Chronologiques

# Utilisation des fonctions days, months, et years pour créer des dates
dates_jours <- as.Date("2023-01-01") + days(0:100)
dates_mois <- as.Date("2023-01-01") + months(2)
dates_years <- as.Date("2023-01-01") + years(2)
dates_jours_mois_annee <- as.Date("2023-01-01") + days(5) + months(6) + years(7)

Extraction de Composants Spécifiques d’une Date

# Extraire le jour, le mois et l'année d'une date
date <- ymd("2023-10-17")
day(date)
## [1] 17
month(date)
## [1] 10
year(date)
## [1] 2023

Calcul d’Intervalle entre Deux Dates

# Calculer l'intervalle entre deux dates
date1 <- ymd("2023-10-17")
date2 <- ymd("2022-10-17")
interval(date1, date2)
## [1] 2023-10-17 UTC--2022-10-17 UTC

Operations sur les Dates et Heures

date1 <- ymd("2023-11-06")
date2 <- ymd("2023-11-07")
plus_recente <- max(date1, date2)
plus_ancienne <- min(date1, date2)
heure1 <- hms("14:30:00")
heure2 <- hms("15:45:30")
duree <- heure2 - heure1
nouvelle_date <- date1 + days(2)
nouvelle_heure <- heure1 - hours(1)
print(plus_recente)
## [1] "2023-11-07"
print(plus_ancienne)
## [1] "2023-11-06"
print(duree)
## [1] "1H 15M 30S"
print(nouvelle_heure)
## [1] "13H 30M 0S"
print(nouvelle_date)
## [1] "2023-11-08"

Synthèse

Tableau récapitulatif des fonctions de lubridate pour l’extraction des composants d’une donnée de type date.

Composants Fonction pour l’extraire
Année year()
Mois month()
Semaine week()
Jour de l’année yday()
Jour du mois mday()
Jours de semaine wday()
Heure hour()
Minute minute()
Seconde second()
Fuseau horaire tz()

Ces fonctions sont utilisées pour extraire et manipuler les différentes parties d’une date dans le cadre de l’analyse de données en R.

Séries Chronologiques avec xts

Manipulation et visualisation des séries chronologiques en utilisant la bibliothèque xts.

Sélection dans une Série Chronologique

# Installation et chargement de la bibliothèque xts si nécessaire
# install.packages("xts")
# library(xts)

# Création et sélection dans une série chronologique
dates <- as.Date("2023-01-01") + 0:9
serie <- xts(1:10, order.by=dates)
subset(serie, index(serie) >= "2023-01-05" & index(serie) <= "2023-01-08")
##            [,1]
## 2023-01-05    5
## 2023-01-06    6
## 2023-01-07    7
## 2023-01-08    8

Affichage Graphique de la Série Chronologique

# Installation et chargement de la bibliothèque ggplot2 si nécessaire
# install.packages("ggplot2")
# library(ggplot2)

# Affichage graphique de la série chronologique
plot(serie)

Visualisation des données mtcars avec R

• Conventions usuelles en data viz • Graphiques Usuels : Barplot, Histogramme, Scatter plot, Boxplot et Courbes • Syntaxe de R base avec et ggplot2

Conventions usuelles

La data viz est autant un art qu’une science.

Des conventions établies peuvent aider à garantir que les graphiques soient clairs, pertinents et accessibles.

Voici quelques conventions et recommandations générales

Titre, étiquettes, axes

Chaque graphique doit avoir un titre descriptif. Axes étiquetés avec des noms de variables ou des descriptions. Si les unités sont pertinentes (comme les années, les dollars, etc.), elles doivent être incluses. Assurez-vous que l’échelle des axes est appropriée pour vos données. Évitez les échelles tronquées qui peuvent tromper l’œil. Considérez l’ajout d’annotations pour mettre en évidence des points ou des tendances importants.

Légende

Si le graphique contient plusieurs séries ou catégories, une légende claire et bien positionnée est essentielle. Évitez d’encombrer le graphique avec une légende trop grande.

Simplicité

Évitez de surcharger le graphique avec trop d’informations. Limitez le nombre de couleurs et de motifs utilisés. Utilisez des palettes de couleurs daltoniens “friendly”. Assurez-vous que la couleur ait un sens dans le contexte de vos données. Évitez d’utiliser des couleurs trop vives ou distrayantes.

Ordre des données

Dans les barplots, envisagez d’ordonner les barres par taille plutôt que de manière aléatoire ou alphabétique, sauf si un autre ordre est logique (par exemple, les mois de l’année). Clarté des données :

Consistence et sources

Si vous présentez plusieurs graphiques dans un rapport ou une présentation, essayez de maintenir une certaine cohérence en termes de couleurs, de styles et de typographie.

Si les données proviennent d’une source externe, cette source devrait être clairement indiquée.

Supprimez les grilles, les bordures et les étiquettes qui n’ajoutent pas de valeur. Évitez les “camemberts” 3D et autres graphiques qui peuvent déformer la perception des données.

Installation des packages essentiels : tidyverse

# Installation et chargement du tidyverse qui contient ggplot2 et 
# Installation de gridExtra pour combiner les plots
#library(tidyverse)
#library(gridExtra)

ggplot2 est une librairie spécialisée pour la visualisation de données en R. Elle utilise une syntaxe différente des graphiques de base et permet de créer des visualisations plus complexes et esthétiques.

Application aux données mtcars

# Description des données mtcars
?mtcars 
mtcars <- datasets::mtcars
str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
# Recodage des variables catégorielles 
# transmission et moteur
mtcars$vs <- factor(mtcars$vs,levels = 0:1,labels = c("V-shaped", "Straight")) 
mtcars$am <- factor(mtcars$am,levels = 0:1,labels = c("Automatic", "Manual")) 

# Check 
str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : Factor w/ 2 levels "V-shaped","Straight": 1 1 2 2 1 2 1 2 2 2 ...
##  $ am  : Factor w/ 2 levels "Automatic","Manual": 2 2 2 1 1 1 1 1 1 1 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

Barplot (diagramme à barres)

Le diagramme à barres est utilisé pour représenter graphiquement des données catégorielles ou discrètes sous forme de barres verticales ou horizontales.

Il permet de visualiser la fréquence, la distribution ou la comparaison de différentes catégories. Chaque barre représente une catégorie, et la hauteur (ou la longueur) de la barre est proportionnelle à la valeur associée à cette catégorie.

Ici, nous examinons le nombre de voitures en fonction du type de moteur.

# Calcul de la distribution
distribution_moteur <- table(mtcars$vs)
typeof(distribution_moteur)
## [1] "integer"
class(distribution_moteur)
## [1] "table"
# Barplot R base
barplot(distribution_moteur, # table
        main = "Number of cars per engine type",  # titre
        xlab = "Engine", # nom axe x
        ylab = "Cars'number", 
        ylim = c(0, 25), # echelle y
        col=c("blue", "pink")) # couleur : check r color book
# Creation de la légende 
legend(x="topright",legend=c("V","Straight"),
       fill=c("blue","pink"))  

# Barplot ggplot2
ggplot(mtcars, aes(x = vs, fill = vs)) +
  geom_bar() +
  labs(title = "Number of cars per engine type", 
       x = "Engine", 
       y = "Cars'number", 
       fill = "Engine type") +
  theme_bw() + # choix du theme
  # changement manuel des couleurs
  scale_fill_manual(values = c("blue", "pink"), 
                    name = "New Engine type", 
                    guide = guide_legend(reverse = TRUE)) + ylim(0,25)

Histogramme

L’histogramme est utilisé pour représenter graphiquement la distribution des données continues en regroupant les données en classes et en montrant la fréquence ou la densité de ces classes.

Nous examinons ici la distribution du nombre de miles par gallon.

# Histogramme avec R base
hist(mtcars$mpg, 
     breaks = c(10, 20, 25, 30, 35,40),
     main = "Miles/(US) gallon distribution", 
     xlab = "Miles/(US) gallon", 
     ylab = "Frequency")

# Histogramme avec ggplot2
ggplot(mtcars, aes(x = mpg)) +
  # spécifie la largeur et la color pour distinguer les "bins"
  # alpha permet de géré la transparence
  geom_histogram(binwidth = 5,  fill="pink", color="blue", alpha=0.7) + 
  labs(title = "Miles/(US) gallon distribution", 
       x = "Miles/(US) gallon", 
       y = "Frequency") + 
  theme_bw()

Scatter plot (nuage de points)

Le diagramme de dispersion est utilisé pour afficher la relation entre deux variables continues, généralement une variable sur l’axe horizontal et l’autre sur l’axe vertical.

Il permet d’observer la relation entre deux variables, d’identifier les tendances, les corrélations ou les groupes de données, et de repérer les valeurs aberrantes.

Comparons ici le poids des voitures selon leur consommation de carburant.

# Scatter plot avec R base 
plot(x = mtcars$wt,y = mtcars$mpg, 
     main = "Miles/(US) gallon according Weight", 
     xlab = "Weight (1000 lbs)", 
     ylab = "Miles par Gallon (mpg)") 
abline(lm(mpg ~ wt, data = mtcars), col = "blue")
text(x = 4, y = 28, "mpg = -5.3 wt + 37.3", cex = .8)

# Scatter plot avec ggplot2
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  geom_smooth(method="lm", se=TRUE, color="blue") +
  labs(title = "Scatter plot de wt vs mpg avec ggplot2", 
       x = "Poids (wt)", 
       y = "Miles par Gallon (mpg)") +
  theme_bw() +
  annotate("text", x=4, y=28, label="mpg = -5.3 wt + 37.3")
## `geom_smooth()` using formula = 'y ~ x'

Boxplot

La boîte à moustaches est utilisée pour représenter graphiquement la distribution et les mesures de dispersion d’une variable continue, ainsi que pour détecter les valeurs aberrantes.

Elle affiche la médiane, les quartiles, les valeurs minimales et maximales de la distribution, ainsi que les valeurs potentielles aberrantes sous forme de points individuels.

Examinons la distribution des mpg selon le type de moteur

# Boxplot R base
boxplot(mpg ~ am,
        data = mtcars, 
        main = "Miles/(US) gallon according engine type", 
        xlab = "Transmission", 
        ylab = "Miles/(US) gallon")

# Boxplot ggplot2
ggplot(mtcars, aes(y = mpg, x = vs)) +
  geom_boxplot(outlier.colour = "blue") +
  labs(title = "Miles/(US) gallon according engine type", 
       x = "Engine", 
       y = "Miles/(US) gallon") +
  theme_classic()

Courbes, droites

Les courbes sont utilisées pour représenter graphiquement des données continues dans des graphiques linéaires, logarithmiques ou d’autres transformations.

Elles permettent de visualiser la tendance générale des données au fil du temps ou d’autres variables indépendantes. Les courbes peuvent être utilisées pour montrer des relations, des modèles de croissance, des fluctuations, etc.

Examinons la distribution des mpg selon le nombre de cylindres.

?AirPassengers

x = 1:10
plot(x, type = "l")

plot(AirPassengers, 
     main="Monthly Airline Passenger Numbers 1949-1960")

data <- data.frame(x=seq(-10, 10, by=0.1))
data$y <- data$x^2

gg1 <- ggplot(data, aes(x=x, y=y)) +
  geom_line(col="blue") +
  ggtitle("Courbe Quadratique")
gg1

Sauvegarder et Aggréger des Graphiques

Les graphiques sont d’abord générés, puis sauvegardés dans des fichiers spécifiés, tels que des PDF ou des PNG. Pour ggplot2, gridExtra est utilisé pour combiner plusieurs graphiques en un seul affichage.

Graphiques avec R base

Sauvegarde et création de layouts pour des graphiques avec les fonctions de base de R.

# Enregistrement des graphiques en format PDF
pdf(file = "plotRbase.pdf")

# Configuration du layout en 2x2
par(mfrow=c(2,2))

# Premier graphique
plot(1:10, rnorm(10), main="Graphique 1")

# Deuxième graphique
plot(1:10, rnorm(10), col="blue", main="Graphique 2")

# Troisième graphique
hist(rnorm(100), main="Histogramme 1")

# Quatrième graphique
boxplot(rnorm(100), main="Boîte à moustaches")

# Fermeture du dispositif graphique
dev.off()
## png 
##   2
# Enregistrement des graphiques en format PNG
png(file = "plotRbase.png")

par(mfrow=c(2,2))

plot(1:10, rnorm(10), main="Graphique 1")

plot(1:10, rnorm(10), col="blue", main="Graphique 2")

hist(rnorm(100), main="Histogramme 1")

boxplot(rnorm(100), main="Boîte à moustaches")

dev.off()
## png 
##   2

Graphiques avec Ggplot

Création et sauvegarde de graphiques élaborés avec ggplot2.

# Création d'un graphique ggplot et sauvegarde
gg1 <- ggplot(data, aes(x=x, y=y)) +
  geom_line(col="blue") +
  ggtitle("Courbe Quadratique")
ggsave("../resultats/mon_ggplot.png", plot = gg1)
## Saving 8 x 5 in image
# Création de plusieurs ggplots
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- ggplot(mtcars, aes(mpg)) + geom_histogram(binwidth=2)
p3 <- ggplot(mtcars, aes(gear)) + geom_bar()
p4 <- ggplot(mtcars, aes(mpg, disp)) + geom_point()

# Combinaison des ggplots dans un seul graphique
gg2 <- grid.arrange(p1, p2, p3, p4, ncol=2)

ggsave("mon_ggplot2.pdf", plot = gg2)
## Saving 8 x 5 in image

Exercices

  1. Lisez et Essayez de Résoudre les Exercices :
    Essayez de les résoudre par vous-même dans votre environnement R (comme RStudio). Il est important de pratiquer par vous-même avant de regarder les solutions pour mieux apprendre.

Exercice 1

Texte <- "Contactez-nous à contact@exemple.com ou à support@email.org pour toute question. Visitez notre site web à http://www.mon-site-web.com. Les hashtags #Rstats, #DataScience et #Analytics sont populaires sur les réseaux sociaux. Appelez-nous au (123) 456-7890 ou envoyez un SMS au (555) 123-4567 pour plus d'informations. Les événements auront lieu les 25/12/2023, 31/01/2024 et 15/08/2024. Suivez @Utilisateur1 et @Utilisateur2 sur Twitter pour les dernières mises à jour. Consultez notre site web à https://www.mon-site-web.com ou visitez http://www.example.com pour plus d'informations. Les codes postaux des États-Unis incluent 90210, 10001, et 60601. Les fichiers de données sont stockés dans data1.txt, data2.csv, et rapport.txt."
  1. Extrayez toutes les adresses e-mail valides.
  2. Remplacez tous les hashtags (mots commençant par “#”) par des espaces.
  3. Extrayez tous les numéros de téléphone américains au format (xxx) xxx-xxxx.
  4. Extrayez toutes les dates au format “dd/mm/yyyy”.
  5. Extrayez tous les noms d’utilisateur Twitter (qui commencent par “@”).
  6. Extrayez toutes les URL valides commençant par “http://” ou “https://”.
  7. Extrayez tous les codes postaux américains à cinq chiffres.
  8. Extrayez tous les noms de fichiers avec l’extension “.txt”.

Exercice 2

L’objectif de cet exercice est de créer une simulation d’analyse de sentiment sur des commentaires de spectateurs concernant des séries américaines. Classez chaque commentaire comme “positif” ou “négatif” en fonction de certains mots-clés.

commentaires_series <- list( “Cette série est incroyable, je suis accro !”, “Le dernier épisode était décevant, l’intrigue est devenue ennuyeuse.”, “J’adore les personnages de cette série, ils sont si bien écrits.”, “Les effets spéciaux sont incroyables, c’est du grand spectacle !”, “Cette série est tellement ennuyeuse, je ne peux pas la regarder.”, “Je recommande vivement cette série à tous les fans de science-fiction.” )

  1. Chargez la bibliothèque stringr.
  2. Créez deux vecteurs vides pour stocker les commentaires positifs et négatifs.
  3. Définissez les mots-clés pour l’analyse de sentiment. Vous pouvez choisir des mots-clés qui, selon vous, indiquent un sentiment positif ou négatif.
  4. Effectuez l’analyse de sentiment en parcourant chaque commentaire.
    1. Convertissez le commentaire en minuscules pour une correspondance insensible à la casse.
    2. Vérifiez si le commentaire contient des mots-clés positifs ou négatifs.
    3. Attribuez une étiquette “positif” ou “négatif” en fonction des résultats.
    4. Stockez les commentaires dans les vecteurs commentaires_positifs et commentaires_negatifs en fonction de leur étiquette.
  5. Affichez les commentaires positifs et négatifs à la fin.

Exercice 3

Aide : superstatisticienne.fr/wordcloud-avec-r L’objectif de cet exercice est d’explorer le texte du roman “Orgueil et Préjugés” de Jane Austen en utilisant R et le package tm et wordcloud, et de réaliser certaines analyses textuelles.

  1. Créez un objet Corpus à partir du texte du roman en utilisant le package tm. Assurez-vous d’avoir installé et chargé le package tm.
  2. Effectuez le prétraitement des données textuelles en suivant ces étapes :
    1. Convertissez le texte en minuscules.
    2. Supprimez la ponctuation et les chiffres.
    3. Supprimez les mots vides (stop words).
    4. Effectuez la tokenization (découpage en mots).
  3. Identifiez les mots les plus fréquents dans le texte du roman “Orgueil et Préjugés”. Utilisez la fonction findFreqTerms() pour trouver les termes les plus fréquents.
  4. Réalisez une analyse de la distribution des mots pour identifier les mots les plus fréquents. Utilisez un nuage de mots (word cloud).

Exercice 4

Calculez la durée totale d’une liste de réunions.

reunions <- list(
  c(debut = "2023-11-06 09:00:00", fin = "2023-11-06 10:30:00"),
  c(debut = "2023-11-07 14:00:00", fin = "2023-11-07 16:00:00"),
  c(debut = "2023-11-08 10:30:00", fin = "2023-11-08 12:00:00")
)

Exercice 5

Trouvez la date la plus proche de la date de référence. Calculez la durée totale d’une liste de réunions.

dates <- list("2023-11-06", "2023-11-07", "2023-11-10", "2023-11-15")
date_reference <- ymd("2023-11-09")

Exercice 6

Créez une fonction qui génère une séquence de dates en fonction des jours de la semaine souhaités. Par exemple, vous devrez peut-être générer une séquence de dates pour tous les lundis et mercredis d’une année donnée. Calculez la durée totale d’une liste de réunions.

jours_semaine <- c("lundi", "mercredi")
annee_debut <- 2023
annee_fin <- 2024

Exercice 7

Créez une fonction R qui génère une séquence de dates et heures régulières entre la date de début et de fin, avec un intervalle de temps spécifié (par exemple, toutes les 30 minutes).

Exercice 8 Bonus Calendrier Mensuel

  • Créez une fonction qui selon un nombre allant de 1 à 7 renvoie un jour de la semaine (Aide : switch-case).
  • Définissez une fonction R appelée generer_calendrier_mensuel qui prendra deux arguments : l’année (annee) et le mois (mois) pour lesquels vous souhaitez générer le calendrier.
  • À l’intérieur de la fonction, utilisez la fonction as.Date de lubridate pour créer la date du premier jour du mois en utilisant les valeurs de l’année et du mois que vous avez passées en argument. Utilisez paste pour créer une chaîne de caractères au format “yyyy-mm-01” pour la date.
  • Utilisez la fonction days_in_month de lubridate pour obtenir le dernier jour du mois en spécifiant l’année et le mois.
  1. Consultez la Correction :
    Une fois que vous avez tenté de résoudre les exercices, ou si vous rencontrez des difficultés, consultez le fichier correction_exercices4.R pour voir les solutions. Analysez les solutions pour comprendre les méthodes et logiques utilisées.

Chapitre 5. Importation et manipulation des données avec dplyr

Ce cours vous guide à travers les fondamentaux de l’importation de données en R, en couvrant divers formats de fichiers tels que les fichiers texte, CSV et Excel. Vous apprendrez à utiliser des fonctions comme readLines, read.csv, et readxl pour charger des données dans votre environnement R depuis diverses sources externes.

Par la suite, le cours se concentre sur la gestion de données en utilisant le package dplyr, un outil puissant et flexible pour la manipulation de données. Vous explorerez des concepts clés tels que l’opérateur %>% pour chaîner les commandes, ainsi que diverses fonctions avancées pour la sélection, le filtrage, la manipulation de colonnes, le groupement, le tri, et les jointures. Des techniques d’aggrégation conditionnelle et d’opérations complexes seront également abordées.

À travers des exemples pratiques, notamment avec le jeu de données starwars, ce cours vise à renforcer vos compétences en matière de préparation et d’analyse de données, vous rendant ainsi plus apte à tirer des insights pertinents de vos ensembles de données.

Illustration du langage R par DALL-E ## Importation de données externes

Voici une explication détaillée des scripts R que vous avez fournis, qui traitent de l’importation de données externes et de l’aperçu des données dans le contexte du jeu de données starwars.

Importation de Données txt avec readLines

texte <- readLines("../data/orgueil_et_prejuges.txt", encoding = "UTF-8")  

Importation de Données CSV avec read.csv

# Importation d'un fichier CSV
bike <- read.csv("../data/Animation.csv", header = TRUE, sep = ";")
  • read.csv est une fonction de base en R pour lire les fichiers CSV.
  • header = TRUE indique que la première ligne du fichier contient les noms des colonnes.
  • sep = ";" spécifie que le séparateur de colonnes dans le fichier CSV est un point-virgule.

Importation de Données Excel avec readxl

# Importation d'un fichier Excel
# library(readxl)

bike2 <- read_excel("../data/BikeSalesAnalysis.xlsx", sheet = "BikeSales")
  • read_excel est une fonction du package readxl, utilisée pour lire des fichiers Excel.
  • sheet = "BikeSales" spécifie le nom de la feuille de calcul à importer.
# Récupération des noms des feuilles dans un fichier Excel
liste_noms <- excel_sheets("../data/BikeSalesAnalysis.xlsx")
  • excel_sheets est utilisée pour lister toutes les feuilles disponibles dans un fichier Excel.

Importation de Données via API

Vous pouvez utiliser R et ses packages pour la gestion des requêtes web et le traitement des données JSON. Voici un exemple de code en R pour réaliser cette tâche :

  1. Charger les packages nécessaires : Assurez-vous d’avoir les packages httr et jsonlite installés. Ils sont utilisés pour effectuer des requêtes HTTP et pour parser les données JSON, respectivement.
# install.packages("httr")
# install.packages("jsonlite")
# library(httr)
# library(jsonlite)
  1. Récupérer les données : Utilisez la fonction GET de httr pour envoyer une requête HTTP à l’URL fournie, puis utilisez content pour obtenir le contenu de la réponse.
response <- GET("https://velib-metropole-opendata.smovengo.cloud/opendata/Velib_Metropole/station_status.json")
data <- content(response, "text")
  1. Parser les données JSON : Convertissez les données JSON en une liste ou un dataframe R pour un traitement ultérieur.
parsed_data <- fromJSON(data)
names(parsed_data)
## [1] "lastUpdatedOther" "ttl"              "data"
  1. Explorer et manipuler les données : À ce stade, parsed_data contiendra les données des stations Vélib. Vous pouvez explorer ces données et les manipuler selon vos besoins.

Par exemple, si les données contiennent plusieurs niveaux de listes ou de dataframes imbriqués, vous devrez peut-être les aplatir ou les restructurer pour une analyse plus aisée.

str(parsed_data)
## List of 3
##  $ lastUpdatedOther: int 1705341827
##  $ ttl             : int 3600
##  $ data            :List of 1
##   ..$ stations:'data.frame': 1470 obs. of  11 variables:
##   .. ..$ stationCode              : chr [1:1470] "16107" "31104" "44015" "9020" ...
##   .. ..$ station_id               : num [1:1470] 2.14e+08 6.53e+08 1.73e+10 3.63e+04 3.78e+07 ...
##   .. ..$ num_bikes_available      : int [1:1470] 4 24 10 0 17 4 23 14 2 0 ...
##   .. ..$ numBikesAvailable        : int [1:1470] 4 24 10 0 17 4 23 14 2 0 ...
##   .. ..$ num_bikes_available_types:List of 1470
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 7 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 17
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 8
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 12 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 5
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 7 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 16
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 5 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 9
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 15 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 5 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 12 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 7
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 9 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 11 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 6
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 9 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 6
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 16 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 5 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 11
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 6
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 25 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 9
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 6 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 7
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 6
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 4 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 6 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 5
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 3 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 7
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 6 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 6 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 10
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 5 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 4
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 13 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 7
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 6 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 7 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 29 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 7
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 5 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 4
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 8
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 42 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 4 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 7
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 4 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 4
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 5 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 7 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 6
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 3 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 13 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 3 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 4
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 3 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 10 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 15
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 27 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 12 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 3 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 6
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 0
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 26 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 17 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 9 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 4
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 3 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 12
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 1
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 0 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 2
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 2 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 4
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 15 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. ..$ :'data.frame':   2 obs. of  2 variables:
##   .. .. .. ..$ mechanical: int [1:2] 1 NA
##   .. .. .. ..$ ebike     : int [1:2] NA 3
##   .. .. .. [list output truncated]
##   .. ..$ num_docks_available      : int [1:1470] 31 4 10 19 13 20 37 3 18 10 ...
##   .. ..$ numDocksAvailable        : int [1:1470] 31 4 10 19 13 20 37 3 18 10 ...
##   .. ..$ is_installed             : int [1:1470] 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ is_returning             : int [1:1470] 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ is_renting               : int [1:1470] 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ last_reported            : int [1:1470] 1705339787 1705339969 1705339961 1705339650 1705339757 1705339766 1705340011 1705340011 1705339971 1705339877 ...

Exemple : Supposons que ‘parsed_data’ est votre liste complexe Vous devrez d’abord accéder à la liste qui contient les données que vous voulez aplatir. Ici, je suppose que c’est parsed_data\(data\)stations

stations_df <- parsed_data$data$stations %>% 
  # transforme les listes en colonnes
  unnest_wider(col = num_bikes_available_types) %>% 
  # transforme les données imbriquées en lignes
  unnest(c(mechanical, ebike))

# Maintenant, 'stations_df' devrait être un dataframe aplati que vous pouvez manipuler plus facilement
  1. Stockage des données : Si nécessaire, vous pouvez ensuite stocker ces données dans un fichier CSV, une base de données, ou les utiliser directement pour des analyses ultérieures.

Le projet au chapitre 7 vous permettra de vous exercer à la manipulation d’API.

# Exemple de sauvegarde dans un fichier CSV
write.csv(stations_df, "velib_station_data.csv")

Ce code est un exemple de base pour démarrer l’acquisition et la manipulation des données de l’API Vélib. Selon la structure exacte des données JSON et vos objectifs spécifiques, vous devrez peut-être adapter et étendre ce code.

Manipuler des données avec Dplyr

La manipulation de données avec dplyr à l’aide de verbes, qui correspondent chacun à une action différente appliquée à un tableau de données.

Aperçu des Données : Starwars

# library(tidyverse)
# Ouvre un aperçu interactif de la dataframe
View(starwars)
  • View ouvre une fenêtre interactive pour visualiser la dataframe starwars. C’est utile pour explorer les données de manière graphique.

Exploration des Données avec glimpse

  • glimpse est un verbe du package dplyr qui fournit un aperçu rapide de la structure d’une dataframe, y compris les noms des colonnes, les types de données et les premières valeurs de chaque colonne.
# Aperçu structuré des données
glimpse(starwars)
## Rows: 87
## Columns: 14
## $ name       <chr> "Luke Skywalker", "C-3PO", "R2-D2", "Darth Vader", "Leia Or~
## $ height     <int> 172, 167, 96, 202, 150, 178, 165, 97, 183, 182, 188, 180, 2~
## $ mass       <dbl> 77.0, 75.0, 32.0, 136.0, 49.0, 120.0, 75.0, 32.0, 84.0, 77.~
## $ hair_color <chr> "blond", NA, NA, "none", "brown", "brown, grey", "brown", N~
## $ skin_color <chr> "fair", "gold", "white, blue", "white", "light", "light", "~
## $ eye_color  <chr> "blue", "yellow", "red", "yellow", "brown", "blue", "blue",~
## $ birth_year <dbl> 19.0, 112.0, 33.0, 41.9, 19.0, 52.0, 47.0, NA, 24.0, 57.0, ~
## $ sex        <chr> "male", "none", "none", "male", "female", "male", "female",~
## $ gender     <chr> "masculine", "masculine", "masculine", "masculine", "femini~
## $ homeworld  <chr> "Tatooine", "Tatooine", "Naboo", "Tatooine", "Alderaan", "T~
## $ species    <chr> "Human", "Droid", "Droid", "Human", "Human", "Human", "Huma~
## $ films      <list> <"A New Hope", "The Empire Strikes Back", "Return of the J~
## $ vehicles   <list> <"Snowspeeder", "Imperial Speeder Bike">, <>, <>, <>, "Imp~
## $ starships  <list> <"X-wing", "Imperial shuttle">, <>, <>, "TIE Advanced x1",~
  • slice sélectionne des lignes du tableau selon leur position. On lui passe un chiffre ou un vecteur de chiffres.
# sélection des dernieres lignes de starwars
slice_tail(starwars, n = 5)
## # A tibble: 5 x 14
##   name      height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 Finn          NA    NA black      dark       dark              NA male  mascu~
## 2 Rey           NA    NA brown      light      hazel             NA fema~ femin~
## 3 Poe Dame~     NA    NA brown      light      brown             NA male  mascu~
## 4 BB8           NA    NA none       none       black             NA none  mascu~
## 5 Captain ~     NA    NA none       none       unknown           NA fema~ femin~
## # i 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
# sélection des premieres lignes de starwars
slice_head(starwars, n = 5)
## # A tibble: 5 x 14
##   name      height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 Luke Sky~    172    77 blond      fair       blue            19   male  mascu~
## 2 C-3PO        167    75 <NA>       gold       yellow         112   none  mascu~
## 3 R2-D2         96    32 <NA>       white, bl~ red             33   none  mascu~
## 4 Darth Va~    202   136 none       white      yellow          41.9 male  mascu~
## 5 Leia Org~    150    49 brown      light      brown           19   fema~ femin~
## # i 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
# sélection aléatoire de 5 lignes de starwars 
slice_sample(starwars, n = 5)
## # A tibble: 5 x 14
##   name      height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 Cordé        157    NA brown      light      brown             NA <NA>  <NA>  
## 2 Qui-Gon ~    193    89 brown      fair       blue              92 male  mascu~
## 3 Kit Fisto    196    87 none       green      black             NA male  mascu~
## 4 Mace Win~    188    84 none       dark       brown             72 male  mascu~
## 5 Chewbacca    228   112 brown      unknown    blue             200 male  mascu~
## # i 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>

L’opérateur : “%>%”

La programmation avec le “pipe” en R, symbolisée par l’opérateur %>%, est une technique populaire pour chaîner des opérations de manière lisible.

Cet opérateur, popularisé par le package magrittr et largement utilisé avec dplyr, permet de transférer le résultat d’une expression vers une autre, rendant le code plus lisible et évitant la création de multiples variables temporaires.

Les fonctions avancées

Les fonctions avancées utilisées avec l’opérateur %>% dans R, en particulier avec le package dplyr, offrent des capacités étendues pour manipuler et analyser des ensembles de données de manière efficace et intuitive.

Voici un aperçu de quelques-unes de ces fonctions :

Sélection et Filtrage Avancés

  • select() : Permet de choisir des colonnes spécifiques dans un data frame. Peut être utilisée avec des fonctions comme contains(), starts_with(), ends_with(), et matches() pour sélectionner des colonnes basées sur des motifs dans leurs noms.
# Sélectionner toutes les colonnes SAUF 'name' : select()
starwars %>% 
  select(-name)
## # A tibble: 87 x 13
##    height  mass hair_color    skin_color  eye_color birth_year sex    gender   
##     <int> <dbl> <chr>         <chr>       <chr>          <dbl> <chr>  <chr>    
##  1    172    77 blond         fair        blue            19   male   masculine
##  2    167    75 <NA>          gold        yellow         112   none   masculine
##  3     96    32 <NA>          white, blue red             33   none   masculine
##  4    202   136 none          white       yellow          41.9 male   masculine
##  5    150    49 brown         light       brown           19   female feminine 
##  6    178   120 brown, grey   light       blue            52   male   masculine
##  7    165    75 brown         light       blue            47   female feminine 
##  8     97    32 <NA>          white, red  red             NA   none   masculine
##  9    183    84 black         light       brown           24   male   masculine
## 10    182    77 auburn, white fair        blue-gray       57   male   masculine
## # i 77 more rows
## # i 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
# Sélectionner uniquement les colonnes 'name' et 'skin color'
starwars %>% 
  select(name, skin_color)
## # A tibble: 87 x 2
##    name               skin_color 
##    <chr>              <chr>      
##  1 Luke Skywalker     fair       
##  2 C-3PO              gold       
##  3 R2-D2              white, blue
##  4 Darth Vader        white      
##  5 Leia Organa        light      
##  6 Owen Lars          light      
##  7 Beru Whitesun Lars light      
##  8 R5-D4              white, red 
##  9 Biggs Darklighter  light      
## 10 Obi-Wan Kenobi     fair       
## # i 77 more rows
# Sélectionner uniquement les colonnes contenant un "_" : contains("_")
starwars %>% 
  select(contains("_"))
## # A tibble: 87 x 4
##    hair_color    skin_color  eye_color birth_year
##    <chr>         <chr>       <chr>          <dbl>
##  1 blond         fair        blue            19  
##  2 <NA>          gold        yellow         112  
##  3 <NA>          white, blue red             33  
##  4 none          white       yellow          41.9
##  5 brown         light       brown           19  
##  6 brown, grey   light       blue            52  
##  7 brown         light       blue            47  
##  8 <NA>          white, red  red             NA  
##  9 black         light       brown           24  
## 10 auburn, white fair        blue-gray       57  
## # i 77 more rows
# Sélectionner uniquement les colonnes commençant par "s" : starts_with("s")
starwars %>% 
  select(starts_with("s"))
## # A tibble: 87 x 4
##    skin_color  sex    species starships
##    <chr>       <chr>  <chr>   <list>   
##  1 fair        male   Human   <chr [2]>
##  2 gold        none   Droid   <chr [0]>
##  3 white, blue none   Droid   <chr [0]>
##  4 white       male   Human   <chr [1]>
##  5 light       female Human   <chr [0]>
##  6 light       male   Human   <chr [0]>
##  7 light       female Human   <chr [0]>
##  8 white, red  none   Droid   <chr [0]>
##  9 light       male   Human   <chr [1]>
## 10 fair        male   Human   <chr [5]>
## # i 77 more rows
# Sélectionner la colonne 'name' et toutes les colonnes se terminant par "color" :
#  ends_with("color")
starwars %>% 
  select(ends_with("color"))
## # A tibble: 87 x 3
##    hair_color    skin_color  eye_color
##    <chr>         <chr>       <chr>    
##  1 blond         fair        blue     
##  2 <NA>          gold        yellow   
##  3 <NA>          white, blue red      
##  4 none          white       yellow   
##  5 brown         light       brown    
##  6 brown, grey   light       blue     
##  7 brown         light       blue     
##  8 <NA>          white, red  red      
##  9 black         light       brown    
## 10 auburn, white fair        blue-gray
## # i 77 more rows
  • distinct() : filtre les lignes du tableau pour ne conserver que les lignes distinctes, en supprimant toutes les lignes en double.
# Sélectionner uniquement les colonnes 'name' et 'skin color'
starwars %>% 
  select(skin_color) %>% 
  distinct(skin_color)
## # A tibble: 31 x 1
##    skin_color      
##    <chr>           
##  1 fair            
##  2 gold            
##  3 white, blue     
##  4 white           
##  5 light           
##  6 white, red      
##  7 unknown         
##  8 green           
##  9 green-tan, brown
## 10 pale            
## # i 21 more rows
  • filter() : Utilisée pour extraire des lignes qui satisfont certaines conditions. Supporte les opérateurs logiques (&, |) et peut être utilisée pour des comparaisons complexes.
# Filtrer les personnages dont l'espèce est "Human" : filter()
starwars %>% 
  filter(species  == "Human")
## # A tibble: 35 x 14
##    name     height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke Sk~    172    77 blond      fair       blue            19   male  mascu~
##  2 Darth V~    202   136 none       white      yellow          41.9 male  mascu~
##  3 Leia Or~    150    49 brown      light      brown           19   fema~ femin~
##  4 Owen La~    178   120 brown, gr~ light      blue            52   male  mascu~
##  5 Beru Wh~    165    75 brown      light      blue            47   fema~ femin~
##  6 Biggs D~    183    84 black      light      brown           24   male  mascu~
##  7 Obi-Wan~    182    77 auburn, w~ fair       blue-gray       57   male  mascu~
##  8 Anakin ~    188    84 blond      fair       blue            41.9 male  mascu~
##  9 Wilhuff~    180    NA auburn, g~ fair       blue            64   male  mascu~
## 10 Han Solo    180    80 brown      fair       brown           29   male  mascu~
## # i 25 more rows
## # i 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
# Filtrer et supprimer le personnage "Jabba Desilijic Tiure"
starwars %>% 
  filter(name  != "Jabba Desilijic Tiure") 
## # A tibble: 86 x 14
##    name     height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke Sk~    172    77 blond      fair       blue            19   male  mascu~
##  2 C-3PO       167    75 <NA>       gold       yellow         112   none  mascu~
##  3 R2-D2        96    32 <NA>       white, bl~ red             33   none  mascu~
##  4 Darth V~    202   136 none       white      yellow          41.9 male  mascu~
##  5 Leia Or~    150    49 brown      light      brown           19   fema~ femin~
##  6 Owen La~    178   120 brown, gr~ light      blue            52   male  mascu~
##  7 Beru Wh~    165    75 brown      light      blue            47   fema~ femin~
##  8 R5-D4        97    32 <NA>       white, red red             NA   none  mascu~
##  9 Biggs D~    183    84 black      light      brown           24   male  mascu~
## 10 Obi-Wan~    182    77 auburn, w~ fair       blue-gray       57   male  mascu~
## # i 76 more rows
## # i 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
# Filtrer les personnages dont l'espèce est soit "Human", soit "Droid"
starwars %>% 
  filter(species ==  "Human" | species == "Droid") 
## # A tibble: 41 x 14
##    name     height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke Sk~    172    77 blond      fair       blue            19   male  mascu~
##  2 C-3PO       167    75 <NA>       gold       yellow         112   none  mascu~
##  3 R2-D2        96    32 <NA>       white, bl~ red             33   none  mascu~
##  4 Darth V~    202   136 none       white      yellow          41.9 male  mascu~
##  5 Leia Or~    150    49 brown      light      brown           19   fema~ femin~
##  6 Owen La~    178   120 brown, gr~ light      blue            52   male  mascu~
##  7 Beru Wh~    165    75 brown      light      blue            47   fema~ femin~
##  8 R5-D4        97    32 <NA>       white, red red             NA   none  mascu~
##  9 Biggs D~    183    84 black      light      brown           24   male  mascu~
## 10 Obi-Wan~    182    77 auburn, w~ fair       blue-gray       57   male  mascu~
## # i 31 more rows
## # i 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
# Filtrer les personnages de l'espèce "Human" et sélectionner uniquement 
# les colonnes 'name', 'height' et 'birth_year'
starwars %>% 
  filter(species  == "Human") %>% 
  select(name, height, birth_year)
## # A tibble: 35 x 3
##    name               height birth_year
##    <chr>               <int>      <dbl>
##  1 Luke Skywalker        172       19  
##  2 Darth Vader           202       41.9
##  3 Leia Organa           150       19  
##  4 Owen Lars             178       52  
##  5 Beru Whitesun Lars    165       47  
##  6 Biggs Darklighter     183       24  
##  7 Obi-Wan Kenobi        182       57  
##  8 Anakin Skywalker      188       41.9
##  9 Wilhuff Tarkin        180       64  
## 10 Han Solo              180       29  
## # i 25 more rows

Manipulation de colonnes

  • separate() : Divise une colonne en plusieurs colonnes en fonction d’un séparateur spécifié, ce qui est utile pour séparer les noms complets en prénoms et noms de famille, par exemple.
# Séparer la colonne 'name' en plusieurs colonnes 
# (prénom, deuxième prénom, troisième prénom) en utilisant l'espace comme séparateur ;
starwars %>% 
  separate(name, c("prenom", "nom"), sep = " ")
## Warning: Expected 2 pieces. Additional pieces discarded in 7 rows [7, 16, 18, 29, 35,
## 62, 67].
## Warning: Expected 2 pieces. Missing pieces filled with `NA` in 24 rows [2, 3, 8, 13, 15,
## 19, 20, 22, 23, 25, 26, 39, 40, 48, 51, 60, 65, 66, 74, 78, ...].
## # A tibble: 87 x 15
##    prenom  nom     height  mass hair_color skin_color eye_color birth_year sex  
##    <chr>   <chr>    <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr>
##  1 Luke    Skywal~    172    77 blond      fair       blue            19   male 
##  2 C-3PO   <NA>       167    75 <NA>       gold       yellow         112   none 
##  3 R2-D2   <NA>        96    32 <NA>       white, bl~ red             33   none 
##  4 Darth   Vader      202   136 none       white      yellow          41.9 male 
##  5 Leia    Organa     150    49 brown      light      brown           19   fema~
##  6 Owen    Lars       178   120 brown, gr~ light      blue            52   male 
##  7 Beru    Whites~    165    75 brown      light      blue            47   fema~
##  8 R5-D4   <NA>        97    32 <NA>       white, red red             NA   none 
##  9 Biggs   Darkli~    183    84 black      light      brown           24   male 
## 10 Obi-Wan Kenobi     182    77 auburn, w~ fair       blue-gray       57   male 
## # i 77 more rows
## # i 6 more variables: gender <chr>, homeworld <chr>, species <chr>,
## #   films <list>, vehicles <list>, starships <list>
  • mutate() : Ajoute de nouvelles colonnes ou modifie des colonnes existantes. Par exemple, vous pouvez l’utiliser pour calculer de nouvelles valeurs à partir des données existantes.

  • transmute() : Semblable à mutate(), mais ne garde que les nouvelles colonnes créées.

Calcul de l’Indice de Masse Corporelle (BMI)

Le BMI (Indice de Masse Corporelle) est calculé en divisant la masse (en kilogrammes) par le carré de la hauteur (en mètres).

starwars %>% 
  select(mass, height) %>% 
  mutate(bmi = mass / (height / 100)^2)
## # A tibble: 87 x 3
##     mass height   bmi
##    <dbl>  <int> <dbl>
##  1    77    172  26.0
##  2    75    167  26.9
##  3    32     96  34.7
##  4   136    202  33.3
##  5    49    150  21.8
##  6   120    178  37.9
##  7    75    165  27.5
##  8    32     97  34.0
##  9    84    183  25.1
## 10    77    182  23.2
## # i 77 more rows
starwars %>% 
  select(name, mass, height) %>% 
  transmute(bmi = mass / (height / 100)^2)
## # A tibble: 87 x 1
##      bmi
##    <dbl>
##  1  26.0
##  2  26.9
##  3  34.7
##  4  33.3
##  5  21.8
##  6  37.9
##  7  27.5
##  8  34.0
##  9  25.1
## 10  23.2
## # i 77 more rows
# Replace() remplace toutes les occurrences de 41.9 dans la colonne birth_year par 41.
starwars %>% 
  mutate(birth_year = replace(birth_year, birth_year == 41.9, 41))
## # A tibble: 87 x 14
##    name     height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke Sk~    172    77 blond      fair       blue              19 male  mascu~
##  2 C-3PO       167    75 <NA>       gold       yellow           112 none  mascu~
##  3 R2-D2        96    32 <NA>       white, bl~ red               33 none  mascu~
##  4 Darth V~    202   136 none       white      yellow            41 male  mascu~
##  5 Leia Or~    150    49 brown      light      brown             19 fema~ femin~
##  6 Owen La~    178   120 brown, gr~ light      blue              52 male  mascu~
##  7 Beru Wh~    165    75 brown      light      blue              47 fema~ femin~
##  8 R5-D4        97    32 <NA>       white, red red               NA none  mascu~
##  9 Biggs D~    183    84 black      light      brown             24 male  mascu~
## 10 Obi-Wan~    182    77 auburn, w~ fair       blue-gray         57 male  mascu~
## # i 77 more rows
## # i 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
  • rename() : Renommer les colonnes d’un data frame.
# Renommer les colonnes 'height' et 'mass' en 'height_cm' et 'mass_kg' : rename()
starwars %>% 
  rename("height_cm" = "height", 
         "mass_kg" = "mass") %>% 
  select(height_cm, mass_kg)
## # A tibble: 87 x 2
##    height_cm mass_kg
##        <int>   <dbl>
##  1       172      77
##  2       167      75
##  3        96      32
##  4       202     136
##  5       150      49
##  6       178     120
##  7       165      75
##  8        97      32
##  9       183      84
## 10       182      77
## # i 77 more rows

Groupement et Résumé

  • group_by() : Permet de regrouper les données par une ou plusieurs colonnes. Très utile pour les analyses ultérieures qui nécessitent des calculs par groupe.

  • summarise() : Utilisée pour créer des résumés statistiques des groupes de données. Elle peut être utilisée pour calculer des moyennes, des sommes, des médianes, etc., sur des groupes spécifiés par group_by().

starwars %>% 
  group_by(species) %>%
  summarise(
    average_height = mean(height, na.rm = TRUE),
    average_mass = mean(mass, na.rm = TRUE),
    count = n()
  )
## # A tibble: 38 x 4
##    species   average_height average_mass count
##    <chr>              <dbl>        <dbl> <int>
##  1 Aleena               79          15       1
##  2 Besalisk            198         102       1
##  3 Cerean              198          82       1
##  4 Chagrian            196         NaN       1
##  5 Clawdite            168          55       1
##  6 Droid               131.         69.8     6
##  7 Dug                 112          40       1
##  8 Ewok                 88          20       1
##  9 Geonosian           183          80       1
## 10 Gungan              209.         74       3
## # i 28 more rows

Dans cet exemple : - group_by(species) regroupe les données par l’espèce. - summarise() est utilisé pour calculer les moyennes de la taille et de la masse pour chaque groupe d’espèces. na.rm = TRUE est utilisé pour exclure les valeurs manquantes (NA) des calculs. - n() est utilisé pour compter le nombre de personnages dans chaque groupe d’espèces.

# Regrouper les données par 'species' et 'hair_color'
starwars %>% 
  group_by(species, hair_color) %>%
  summarise(count = n(), .groups = 'drop')
## # A tibble: 51 x 3
##    species   hair_color count
##    <chr>     <chr>      <int>
##  1 Aleena    none           1
##  2 Besalisk  none           1
##  3 Cerean    white          1
##  4 Chagrian  none           1
##  5 Clawdite  blonde         1
##  6 Droid     none           3
##  7 Droid     <NA>           3
##  8 Dug       none           1
##  9 Ewok      brown          1
## 10 Geonosian none           1
## # i 41 more rows

Dans cet exemple : - group_by(species, hair_color) regroupe les données à la fois par l’espèce et la couleur des cheveux. - summarise(count = n(), .groups = 'drop') calcule le nombre de personnages (n()) pour chaque combinaison d’espèce et de couleur de cheveux. L’option .groups = 'drop' est utilisée pour éviter que le résultat ne soit regroupé, ce qui facilite sa manipulation ultérieure. - head(starwars_hair_color) affiche les premières lignes du résultat pour avoir un aperçu.

Tri et Organisation

  • arrange() : Trie les données en fonction d’une ou plusieurs colonnes. Peut être utilisée avec desc() pour un tri décroissant.
# Tri ascendant par la colonne 'height'
starwars_sorted_by_height <- starwars %>% 
  arrange(height)
# Tri décroissant par la colonne 'mass'
starwars_sorted_by_mass <- starwars %>% 
  arrange(desc(mass))

Jointures

Les fonctions de jointure dans dplyr permettent de combiner des data frames en fonction de colonnes clés, de manière similaire aux jointures dans SQL. Voici des exemples pour chaque type de jointure : inner_join(), left_join(), right_join(), et full_join(). Pour ces exemples, imaginons deux data frames simplifiés : df1 et df2.

# Data frames exemples
df1 <- data.frame(id = c(1, 2, 3), nom = c("Alice", "Bob", "Carol"))
df2 <- data.frame(id = c(2, 3, 4), ville = c("Paris", "Lyon", "Marseille"))

inner_join()

inner_join() retourne toutes les lignes de df1 et df2 ayant des valeurs correspondantes dans les colonnes clés.

result_inner <- inner_join(df1, df2, by = "id")

Dans cet exemple, result_inner contient les lignes de df1 et df2 où les id correspondent.

left_join()

left_join() retourne toutes les lignes de df1 et toutes les colonnes de df1 et df2. Les lignes de df2 sont incluses seulement si leurs clés correspondent à celles de df1.

result_left <- left_join(df1, df2, by = "id")

Ici, result_left contient toutes les lignes de df1 avec les informations correspondantes de df2.

right_join()

right_join() fonctionne comme left_join(), mais il retourne toutes les lignes de df2 et toutes les colonnes de df1 et df2.

result_right <- right_join(df1, df2, by = "id")

result_right contient toutes les lignes de df2 avec les informations correspondantes de df1.

full_join()

full_join() combine df1 et df2 en incluant toutes les lignes de df1 et df2, même si les clés ne correspondent pas.

result_full <- full_join(df1, df2, by = "id")

result_full contient toutes les lignes de df1 et df2, avec des valeurs NA pour les données manquantes.

Aggrégation Conditionnelle et Opérations Plus Complexes

  • summarise_at(), mutate_at(), if_else() : Permettent de réaliser des opérations sur un ensemble de colonnes spécifiées ou d’appliquer des conditions complexes.

summarise_at() est utilisée pour appliquer une ou plusieurs fonctions de résumé à un ensemble de colonnes spécifiées.

# Calculer la moyenne et l'écart-type pour certaines colonnes numériques
starwars %>% 
  summarise_at(vars(height, mass), list(mean = ~mean(., na.rm = TRUE), 
                                        sd = ~sd(., na.rm = TRUE)))
## # A tibble: 1 x 4
##   height_mean mass_mean height_sd mass_sd
##         <dbl>     <dbl>     <dbl>   <dbl>
## 1        175.      97.3      34.8    169.

Dans cet exemple, summarise_at() calcule la moyenne (mean) et l’écart-type (sd) pour les colonnes height et mass, en excluant les valeurs NA.

mutate_at() est utilisée pour appliquer une fonction à un ensemble de colonnes spécifiées.

# Normaliser les colonnes 'height' et 'mass'
starwars %>% 
  mutate_at(vars(height, mass), ~(. - mean(., na.rm = TRUE)) / sd(., na.rm = TRUE))
## # A tibble: 87 x 14
##    name   height    mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>   <dbl>   <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke~ -0.0749 -0.120  blond      fair       blue            19   male  mascu~
##  2 C-3PO -0.219  -0.132  <NA>       gold       yellow         112   none  mascu~
##  3 R2-D2 -2.26   -0.385  <NA>       white, bl~ red             33   none  mascu~
##  4 Dart~  0.788   0.228  none       white      yellow          41.9 male  mascu~
##  5 Leia~ -0.708  -0.285  brown      light      brown           19   fema~ femin~
##  6 Owen~  0.0976  0.134  brown, gr~ light      blue            52   male  mascu~
##  7 Beru~ -0.276  -0.132  brown      light      blue            47   fema~ femin~
##  8 R5-D4 -2.23   -0.385  <NA>       white, red red             NA   none  mascu~
##  9 Bigg~  0.241  -0.0786 black      light      brown           24   male  mascu~
## 10 Obi-~  0.213  -0.120  auburn, w~ fair       blue-gray       57   male  mascu~
## # i 77 more rows
## # i 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>

Ici, mutate_at() normalise les valeurs des colonnes height et mass (soustraction de la moyenne et division par l’écart-type).

if_else() est une version vectorisée et type-safe de la fonction ifelse().

# Créer une nouvelle colonne 'height_category'
starwars %>% 
  mutate(height_category = if_else(height > 170, "tall", "short", missing = "unknown"))
## # A tibble: 87 x 15
##    name     height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke Sk~    172    77 blond      fair       blue            19   male  mascu~
##  2 C-3PO       167    75 <NA>       gold       yellow         112   none  mascu~
##  3 R2-D2        96    32 <NA>       white, bl~ red             33   none  mascu~
##  4 Darth V~    202   136 none       white      yellow          41.9 male  mascu~
##  5 Leia Or~    150    49 brown      light      brown           19   fema~ femin~
##  6 Owen La~    178   120 brown, gr~ light      blue            52   male  mascu~
##  7 Beru Wh~    165    75 brown      light      blue            47   fema~ femin~
##  8 R5-D4        97    32 <NA>       white, red red             NA   none  mascu~
##  9 Biggs D~    183    84 black      light      brown           24   male  mascu~
## 10 Obi-Wan~    182    77 auburn, w~ fair       blue-gray       57   male  mascu~
## # i 77 more rows
## # i 6 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>, height_category <chr>

Dans cet exemple, if_else() est utilisée pour créer une nouvelle colonne height_category basée sur la condition si la height est supérieure à 170. Si oui, la catégorie est “tall”, sinon “short”. En cas de valeurs NA, la catégorie est définie comme “unknown”.

Lien entre Dplyr et ggplot2

dplyr et ggplot2 sont deux des packages les plus populaires en R pour la manipulation de données et la visualisation, respectivement. Ils font tous deux partie de l’écosystème de packages développé sous l’égide du projet tidyverse, créé par Hadley Wickham et d’autres. Voici les principaux aspects de leur relation et interaction :

Philosophie Commune : Tidyverse

  1. Approche Tidyverse : dplyr et ggplot2 adhèrent à la philosophie du “tidyverse”, qui encourage une syntaxe cohérente et lisible, et un format de données (“tidy data”) où chaque colonne est une variable et chaque ligne est une observation. Cette approche facilite grandement la manipulation et la visualisation des données.

  2. Pipelines et Lisibilité : Les deux packages utilisent l’opérateur pipe %>% pour enchaîner des commandes de manière fluide, ce qui rend le code plus lisible et logique. Par exemple, avec dplyr, on peut transformer des données puis les passer directement à ggplot2 pour la visualisation.

Lien Direct dans le Workflow d’Analyse

Dans un workflow typique d’analyse de données en R : 1. Manipulation : Les données sont d’abord manipulées et explorées à l’aide de dplyr. Par exemple, on peut grouper des données, calculer des résumés statistiques ou filtrer des sous-ensembles de données.

  1. Visualisation : Ensuite, les données transformées sont visualisées avec ggplot2. La nature intégrée de ces deux packages permet un transfert fluide des données manipulées directement vers les fonctions de graphique.
# library(dplyr)
# library(ggplot2)

# Manipulation des données avec dplyr
data_processed <- starwars %>% 
  filter(species == "Human") %>% 
  group_by(homeworld) %>% 
  summarize(average_height = mean(height, na.rm = TRUE))

# Visualisation avec ggplot2
ggplot(data_processed, aes(x = homeworld, y = average_height)) +
  geom_col()

Dans cet exemple, dplyr est utilisé pour préparer les données, qui sont ensuite visualisées avec ggplot2. Ce flux de travail intégré est un des principaux avantages de l’utilisation conjointe de dplyr et ggplot2.

Voici un autre exemple avec les données starwars

starwars %>%
  filter(species == "Human") %>%  # Filtrer pour garder seulement les humains
  select(name, homeworld, height) %>%  # Sélectionner les colonnes pertinentes
  group_by(homeworld) %>%  # Grouper par monde natal
  summarize(average_height = mean(height, na.rm = TRUE)) %>%  # Calculer la taille moyenne
  arrange(desc(average_height))  %>% # Trier par taille moyenne en ordre décroissant
  # Ajout de ggplot pour visualiser les résultats
  drop_na() %>% # Retire les personnages sans monde natal
  ggplot(aes(x = reorder(homeworld, -average_height), y = average_height)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  theme_minimal() +
  labs(title = "Taille Moyenne des Personnages Humains par Monde Natal",
       x = "Monde Natal",
       y = "Taille Moyenne (cm)") +
  coord_flip()  # Retourner les axes pour une meilleure lisibilité

Exercices

  1. Lisez et Essayez de Résoudre les Exercices :
    Essayez de les résoudre par vous-même dans votre environnement R (comme RStudio). Il est important de pratiquer par vous-même avant de regarder les solutions pour mieux apprendre.

Exercice 1

# library(nycflights13)
# Chargement des trois tables
data(flights)
data(airports)
data(airlines)
  1. Sélectionner la dixième ligne du tableau des aéroports (airports).
  2. Sélectionner les 5 premières lignes de la table airlines.
  3. Sélectionner l’aéroport avec l’altitude la plus basse.
  4. Sélectionnez les vols du mois de juillet (variable month).
  5. Sélectionnez les vols avec un retard à l’arrivée (arr_delay) compris entre 5 et 15 minutes.
  6. Sélectionnez les vols des compagnies Delta, United et American (codes DL, UA et AA de la variable carrier).
  7. Triez la table flights par retard au départ décroissant.
  8. Sélectionnez toutes les colonnes de la table airports sauf les colonnes tz et tzone.
  9. Sélectionnez toutes les colonnes de la table flights dont les noms se terminent par “delay”.
  10. Dans la table airports, renommez la colonne alt en altitude et la colonne tzone en fuseau_horaire.

Exercice 2

  1. Réécrivez le code de l’exercice 1 en utilisant le pipe %>%.
  2. Utilisez le pipe pour sélectionner les vols à destination de San Francisco (dest = SFO) et triez-les par retard au départ décroissant (dep_delay).
  3. Sélectionnez les vols des mois de septembre et octobre, conservez les colonnes dest et dep_delay, créez une nouvelle variable retard_h contenant le retard au départ en heures, et conservez uniquement les 5 lignes avec les plus grandes valeurs de retard_h.

Exercice 3

  1. Affichez le nombre de vols par mois.
  2. Triez la table résultat selon le nombre de vols croissant.
  3. Calculez la distance moyenne des vols selon l’aéroport de départ (origin).
  4. Calculez le nombre de vols à destination de Los Angeles (LAX) pour chaque mois.
  5. Calculez le nombre de vols selon le mois et la destination.
  6. Conservez, pour chaque mois, uniquement la destination avec le plus grand nombre de vols.
  7. Calculez le nombre de vols par mois et ajoutez une colonne comportant le pourcentage de vols annuels par mois.
  8. Calculez la durée moyenne des vols (air_time) par aéroport de départ et de destination et conservez la destination avec la durée moyenne la plus longue pour chaque aéroport de départ.

Exercice 4

  1. Faites la jointure de la table airlines sur la table flights avec left_join.
  2. Calculez le retard moyen au départ pour chaque compagnie et triez selon ce retard décroissant.
  3. Faites la jointure de la table airports sur la table flights en utilisant le code de l’aéroport de destination.
  4. Affichez, pour chaque mois, le nom de l’aéroport de destination ayant eu le moins de vols.
  5. Créez une table indiquant, pour chaque vol, uniquement le nom de l’aéroport de départ et celui de l’aéroport d’arrivée.

Exercice 5

  1. Calculez le nombre de vols selon l’aéroport de destination et fusionnez la table airports sur le résultat avec left_join. Stockez le résultat dans flights_dest.
  2. Créez une carte interactive des résultats avec le package leaflet.
# library(leaflet)
# leaflet(data = flights_dest) %>%
#   addTiles() %>%
#   addCircles(lng = ~lon, lat = ~lat, radius = ~n * 10, popup = ~name)
  1. Consultez la Correction :
    Une fois que vous avez tenté de résoudre les exercices, ou si vous rencontrez des difficultés, consultez le fichier correction_exercices5.R pour voir les solutions. Analysez les solutions pour comprendre les méthodes et logiques utilisées.

Chapitre 6. Générer un rapport R Markdown

L’extension rmarkdown est un outil puissant pour la création de documents dynamiques dans l’environnement de programmation R. Il permet d’intégrer du code R, des résultats, et des narrations dans un seul document. Voici une explication détaillée de ses caractéristiques et de son fonctionnement :

Les documents générés peuvent être au format HTML, PDF, Word, et bien d’autres1. C’est donc un outil très pratique pour l’exportation, la communication et la diffusion de résultats d’analyse.

Illustration du langage R par DALL-E
Illustration du langage R par DALL-E
knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)

Le chunk (zone grise) juste au dessus est le chunk qui fixe les options pour l’ensemble du document. Les paramètres fixés dans ce chunk agiront pour tous les autres.

  • Pour retrouver la fiche récapitulative de RMarkdown : > Help/Cheat Sheets/ R Markdown Cheat Sheet

Comment ça marche ?

  • Fusion de R et Markdown : RMarkdown combine le langage de programmation R avec la syntaxe de formatage de texte Markdown. Cela permet d’écrire du texte formaté (comme en HTML ou LaTeX) tout en exécutant du code R.
  • Documents Dynamiques : Les documents RMarkdown sont dynamiques, ce qui signifie que les résultats du code R (comme les graphiques ou les tableaux) sont intégrés directement dans le document.
  • Flexibilité de Format : Les documents RMarkdown peuvent être convertis en plusieurs formats, y compris HTML, PDF, et Word.
  1. Écriture du Document : Vous commencez par écrire un document en utilisant la syntaxe Markdown pour le texte et des blocs de code spéciaux (délimités par {r} et) pour le code R.
  2. Exécution et Conversion : Lorsque le document est “tricoté” (le processus de conversion), le code R est exécuté et ses résultats sont incorporés dans le document final.
  3. Résultats Intégrés : Les résultats, qu’il s’agisse de sorties textuelles, de tableaux, ou de graphiques, sont affichés à l’endroit exact où le bloc de code correspondant se trouve dans le texte.

Utilisations de RMarkdown

  • Rapports de Données : Pour générer des rapports qui incluent à la fois l’analyse (code R) et les interprétations (texte).
  • Documents Académiques : Pour des articles de recherche, des thèses, où les analyses et leurs descriptions vont de pair.
  • Présentations : Peut être utilisé pour créer des diapositives de présentation intégrant des analyses en temps réel.
  • Notebooks : Pour créer des notebooks interactifs, similaires à Jupyter Notebooks, mais dans R.

Avantages

  • Reproductibilité : Les documents RMarkdown facilitent la reproductibilité des analyses, un élément clé de la science des données.
  • Efficacité : Ils permettent une mise à jour automatique des résultats et des graphiques en cas de modification des données ou du code.
  • Polyvalence : Adapté pour une large gamme d’usages, de l’éducation à la recherche, en passant par le reporting d’entreprise.

En résumé, RMarkdown est un outil précieux pour ceux qui travaillent dans le domaine de la science des données, de la recherche, de l’enseignement, ou toute autre discipline où l’intégration de l’analyse de données et du rapport est essentielle.

Pour générer un document à partir d’un fichier RMarkdown une fois que votre analyse est terminée, vous utiliserez principalement la fonction “Knit” dans RStudio. Voici les étapes à suivre et les packages nécessaires :

Étapes pour Générer le Document

  1. Ouvrez votre fichier RMarkdown dans RStudio.
  2. Cliquez sur le bouton “Knit” dans la barre d’outils. Ce bouton se trouve généralement en haut du script RMarkdown. Il est représenté par une petite icône avec une pelote de laine et une aiguille.
  3. Choisissez le format de sortie. RMarkdown supporte plusieurs formats de sortie tels que HTML, PDF, ou Word. Le format de sortie peut être spécifié dans l’en-tête YAML de votre document.
  4. Nommez et enregistrez votre fichier. RStudio générera le document dans le format choisi et vous demandera où l’enregistrer.

Packages Nécessaires

Pour utiliser RMarkdown et générer des documents, vous aurez besoin de certains packages. Les plus importants sont :

  1. rmarkdown : Le package principal pour travailler avec RMarkdown.
#install.packages("rmarkdown")
  1. knitr : Utilisé pour “tricoter” le document, c’est-à-dire pour exécuter le code R et le combiner avec le texte.
#install.packages("knitr")
  1. ggplot2 (optionnel) : Si votre analyse implique des visualisations de données.
#install.packages("ggplot2")
  1. dplyr (optionnel) : Pour la manipulation de données.
#install.packages("dplyr")

Pour le Format PDF

Si vous souhaitez générer des documents au format PDF, vous aurez besoin d’une installation LaTeX. Une option facile est d’installer TinyTeX, une distribution LaTeX légère :

  • Installer TinyTeX :
#install.packages("tinytex")
#tinytex::install_tinytex()

Après l’Installation

Après avoir installé les packages nécessaires, vous pouvez simplement ouvrir votre fichier RMarkdown dans RStudio et cliquer sur “Knit” pour générer le document. Assurez-vous que toutes les dépendances de votre analyse (comme les packages R spécifiques) sont également installées et disponibles.

Éléments d’un document R Markdown

En-tête (préambule)

La première partie du document est son en-tête. Il se situe en tout début de document, et est délimité par trois tirets (---) avant et après:

---
title: "Titre"
author: "Prénom Nom"
date: "10 avril 2017"
output: html_document
---

Cet en-tête contient les métadonnées du document, comme son titre, son auteur, sa date, plus tout un tas d’options possibles qui vont permettre de configurer ou personnaliser l’ensemble du document et son rendu. Ici, par exemple, la ligne output: html_document indique que le document généré doit être au format HTML.

Texte du document

Titres

  • # pour un titre de niveau 1 (le plus grand)
  • ## pour un titre de niveau 2
  • ### pour un titre de niveau 3, et ainsi de suite jusqu’à ###### pour un titre de niveau 6.

Emphase

  • *texte* ou _texte_ pour de l’italique
  • **texte** ou __texte__ pour du gras
  • ***texte*** ou ___texte___ pour gras et italique
  • ~~texte~~ pour barrer le texte

Listes

  • Utilisez *, +, ou - pour les listes non ordonnées
  • Utilisez des nombres suivis d’un point pour les listes ordonnées

Liens

  • [Texte du lien](URL) pour un lien standard
  • [Texte du lien](URL "Titre facultatif") pour un lien avec un titre

Images

  • ![Texte alternatif](URL de l'image) pour insérer une image

Citations

  • > pour une citation

Code

  • Utilisez des guillemets inversés ` autour d’un petit segment de code
  • Utilisez trois guillemets inversés ``` pour un bloc de code

Tableaux

  • Utilisez | pour séparer les colonnes et - pour les en-têtes de colonnes

Lignes horizontales

  • Utilisez trois ou plus de -, *, ou _ pour créer une ligne horizontale

Sauts de ligne

  • Utilisez deux espaces ou plus à la fin d’une ligne pour un saut de ligne

Texte préformaté

  • Utilisez ` (trois espaces) devant et derrière le texte pour préserver la mise en forme exacte

Cette syntaxe de base permet de créer des documents clairs et structurés en Markdown, que ce soit pour des documents RMarkdown ou autres projets utilisant Markdown.

Pour retrouver les commandes usuelles RMarkdown : lien

Exemple d’analyse

L’ensemble de données diamonds disponible dans le package ggplot2 en R est un excellent choix pour effectuer une analyse exploratoire.

Cet ensemble de données contient les prix et les attributs de près de 54 000 diamants. Voici un exemple d’analyse que vous pourriez réaliser avec ces données :

Préparation de l’Environnement

Comme pour tout projet vous devez d’abord commencer par chargez vos libraries et vos données.

# Chargement des packages nécessaires
# library(ggplot2)
# library(dplyr)

# Chargement des données
data("diamonds")

Aperçu des Données

# Affichage des premières lignes
head(diamonds)
## # A tibble: 6 x 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
## 2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
## 3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
## 4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
## 5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
## 6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
# Résumé des données
summary(diamonds)
##      carat               cut        color        clarity          depth      
##  Min.   :0.2000   Fair     : 1610   D: 6775   SI1    :13065   Min.   :43.00  
##  1st Qu.:0.4000   Good     : 4906   E: 9797   VS2    :12258   1st Qu.:61.00  
##  Median :0.7000   Very Good:12082   F: 9542   SI2    : 9194   Median :61.80  
##  Mean   :0.7979   Premium  :13791   G:11292   VS1    : 8171   Mean   :61.75  
##  3rd Qu.:1.0400   Ideal    :21551   H: 8304   VVS2   : 5066   3rd Qu.:62.50  
##  Max.   :5.0100                     I: 5422   VVS1   : 3655   Max.   :79.00  
##                                     J: 2808   (Other): 2531                  
##      table           price             x                y         
##  Min.   :43.00   Min.   :  326   Min.   : 0.000   Min.   : 0.000  
##  1st Qu.:56.00   1st Qu.:  950   1st Qu.: 4.710   1st Qu.: 4.720  
##  Median :57.00   Median : 2401   Median : 5.700   Median : 5.710  
##  Mean   :57.46   Mean   : 3933   Mean   : 5.731   Mean   : 5.735  
##  3rd Qu.:59.00   3rd Qu.: 5324   3rd Qu.: 6.540   3rd Qu.: 6.540  
##  Max.   :95.00   Max.   :18823   Max.   :10.740   Max.   :58.900  
##                                                                   
##        z         
##  Min.   : 0.000  
##  1st Qu.: 2.910  
##  Median : 3.530  
##  Mean   : 3.539  
##  3rd Qu.: 4.040  
##  Max.   :31.800  
## 

Analyse de la Distribution des Prix

# Histogramme de la distribution des prix
ggplot(diamonds, aes(x = price)) +
  geom_histogram(binwidth = 500, fill = "blue", color = "black") +
  theme_minimal() +
  labs(title = "Distribution des Prix des Diamants",
       x = "Prix", y = "Fréquence")

Relation entre le Prix et la Qualité du Carat

# Graphique de dispersion montrant la relation entre le prix et le carat
ggplot(diamonds, aes(x = carat, y = price)) +
  geom_point(alpha = 0.5) +
  theme_light() +
  labs(title = "Prix par Rapport au Carat",
       x = "Carat", y = "Prix")

Analyse par Catégorie de Taille

# Boxplot du prix par catégorie de taille
ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
  geom_boxplot() +
  theme_classic() +
  labs(title = "Prix des Diamants par Qualité de Taille", 
       x = "Qualité de Taille", y = "Prix")

Corrélation entre les Caractéristiques

# Utilisation de cor() pour calculer les corrélations
cor(diamonds[,c("price", "carat", "depth", "table")])
##            price      carat       depth      table
## price  1.0000000 0.92159130 -0.01064740  0.1271339
## carat  0.9215913 1.00000000  0.02822431  0.1816175
## depth -0.0106474 0.02822431  1.00000000 -0.2957785
## table  0.1271339 0.18161755 -0.29577852  1.0000000

Conclusion de l’Analyse

  • Ces graphiques et analyses fournissent un aperçu de la distribution des prix des diamants, ainsi que de la façon dont les attributs comme le carat et la qualité de la taille influencent ces prix.
  • La corrélation peut révéler des relations intéressantes entre les différentes variables numériques de l’ensemble de données.

Nom et Options

Les options d’un bloc de code sont à placer à l’intérieur des accolades {r}.

Nom

La première possibilité est de donner un nom au bloc. Celui-ci est indiqué directement après le r:

{r nom_du_bloc}

Il n’est pas obligatoire de nommer un bloc, mais cela peut être utile en cas d’erreur à la compilation, pour identifier le bloc ayant causé le problème. Attention, on ne peut pas avoir deux blocs avec le même nom.

Options

En plus d’un nom, on peut passer à un bloc une série d’options sous la forme option = valeur. Voici un exemple de bloc avec un nom et des options:

Voici une liste de quelques unes des options disponibles :

Option Valeurs Description
echo TRUE/FALSE Afficher ou non le code R dans le document
eval TRUE/FALSE Exécuter ou non le code R à la compilation
include TRUE/FALSE Inclure ou non le code R et ses résultats dans le document
results “hide”/“asis”/“markup”/“hold” Type de résultats renvoyés par le bloc de code
warning TRUE/FALSE Afficher ou non les avertissements générés par le bloc
message TRUE/FALSE Afficher ou non les messages générés par le bloc

Il existe de nombreuses autres options décrites notamment dans guide de référence R Markdown (PDF en anglais).

Rendu des tableaux

Tableaux croisés kable()

Par défaut, les tableaux issus de la fonction table sont affichés comme ils apparaissent dans la console de R, en texte brut :

# library(questionr)
data(hdv2003)
tab <- lprop(table(hdv2003$qualif, hdv2003$sexe))
tab
##                           
##                            Homme Femme Total
##   Ouvrier specialise        47.3  52.7 100.0
##   Ouvrier qualifie          78.4  21.6 100.0
##   Technicien                76.7  23.3 100.0
##   Profession intermediaire  55.0  45.0 100.0
##   Cadre                     55.8  44.2 100.0
##   Employe                   16.2  83.8 100.0
##   Autre                     36.2  63.8 100.0
##   Ensemble                  44.8  55.2 100.0

On peut améliorer leur présentation en utilisant la fonction kable de l’extension knitr. Celle-ci fournit un formatage adapté en fonction du format de sortie. On aura donc des tableaux “propres” que ce soit en HTML, PDF ou aux formats traitements de texte :

# library(knitr)
kable(tab)
Homme Femme Total
Ouvrier specialise 47.29064 52.70936 100
Ouvrier qualifie 78.42466 21.57534 100
Technicien 76.74419 23.25581 100
Profession intermediaire 55.00000 45.00000 100
Cadre 55.76923 44.23077 100
Employe 16.16162 83.83838 100
Autre 36.20690 63.79310 100
Ensemble 44.82759 55.17241 100

Différents arguments permettent de modifier la sortie de kable. digits, par exemple, permet de spécifier le nombre de chiffres significatifs à afficher dans les colonnes de nombres:

kable(tab, digits = 1)
Homme Femme Total
Ouvrier specialise 47.3 52.7 100
Ouvrier qualifie 78.4 21.6 100
Technicien 76.7 23.3 100
Profession intermediaire 55.0 45.0 100
Cadre 55.8 44.2 100
Employe 16.2 83.8 100
Autre 36.2 63.8 100
Ensemble 44.8 55.2 100

Tableaux croisés tbl_summary()

Le tbl_summary() est une fonction de la bibliothèque gtsummary en R, qui est utilisée pour créer des résumés statistiques de données. Voici une explication brève de son utilisation :

  1. Installation de la bibliothèque: Avant de pouvoir utiliser tbl_summary(), vous devez installer et charger la bibliothèque gtsummary dans votre environnement R. Cela se fait généralement avec la commande install.packages("gtsummary"), suivie de library(gtsummary).

  2. Préparation des données: Assurez-vous que vos données sont dans un dataframe R. tbl_summary() fonctionne avec des dataframes.

  3. Utilisation de la fonction:

    • Syntaxe de base: La fonction s’utilise en passant votre dataframe comme premier argument. Par exemple, tbl_summary(your_data).
    • Spécification des statistiques: Vous pouvez spécifier les statistiques à calculer pour chaque variable (moyenne, médiane, etc.) en utilisant l’argument statistic.
    • Groupement des données: Si vous voulez comparer des groupes dans vos données, utilisez l’argument by. Par exemple, tbl_summary(your_data, by = "group_variable") pour résumer les données par groupe.
  4. Personnalisation: tbl_summary() offre diverses options de personnalisation, comme le changement des labels des variables, l’ajout de notes au bas du tableau, etc.

  5. Résultat: Le résultat est un tableau formaté qui résume les statistiques clés de chaque variable dans le dataframe, avec des options pour la comparaison de groupes et la personnalisation de l’affichage.

C’est un outil très utile pour l’exploration de données et la communication des résultats statistiques de manière concise et claire.

Voici quelques exemples d’utilisation de la fonction tbl_summary() de la bibliothèque gtsummary en R, illustrant différentes manières de résumer et de présenter des données statistiques :

Exemple 1: Résumé Basique

# Chargement de la bibliothèque
# library(gtsummary)

# Exemple de données
data(mtcars)

# Création d'un résumé basique
table1 <- tbl_summary(mtcars)
table1
Characteristic N = 321
mpg 19.2 (15.4, 22.8)
cyl
    4 11 (34%)
    6 7 (22%)
    8 14 (44%)
disp 196 (121, 326)
hp 123 (97, 180)
drat 3.70 (3.08, 3.92)
wt 3.33 (2.58, 3.61)
qsec 17.71 (16.89, 18.90)
vs 14 (44%)
am 13 (41%)
gear
    3 15 (47%)
    4 12 (38%)
    5 5 (16%)
carb
    1 7 (22%)
    2 10 (31%)
    3 3 (9.4%)
    4 10 (31%)
    6 1 (3.1%)
    8 1 (3.1%)
1 Median (IQR); n (%)

Dans cet exemple, tbl_summary() crée un tableau résumant chaque colonne du dataframe mtcars (comme la moyenne pour les variables continues, et les fréquences pour les variables catégorielles).

Exemple 2: Résumé avec Statistiques Spécifiques

table2 <- tbl_summary(
  mtcars,
  statistic = list(all_continuous() ~ "{mean} ({sd})", # Pour les variables continues
                   all_categorical() ~ "{n} / {N} ({p}%)") # Pour les variables catégorielles
)
table2
Characteristic N = 321
mpg 20.1 (6.0)
cyl
    4 11 / 32 (34%)
    6 7 / 32 (22%)
    8 14 / 32 (44%)
disp 231 (124)
hp 147 (69)
drat 3.60 (0.53)
wt 3.22 (0.98)
qsec 17.85 (1.79)
vs 14 / 32 (44%)
am 13 / 32 (41%)
gear
    3 15 / 32 (47%)
    4 12 / 32 (38%)
    5 5 / 32 (16%)
carb
    1 7 / 32 (22%)
    2 10 / 32 (31%)
    3 3 / 32 (9.4%)
    4 10 / 32 (31%)
    6 1 / 32 (3.1%)
    8 1 / 32 (3.1%)
1 Mean (SD); n / N (%)

Ici, le tableau inclut la moyenne et l’écart-type pour les variables continues, et le compte, la taille totale de l’échantillon et le pourcentage pour les variables catégorielles.

Exemple 3: Résumé par Groupes

table3 <- tbl_summary(
  mtcars,
  by = "cyl", # Groupe selon la variable 'cyl'
  statistic = all_continuous() ~ "{mean} ({sd})"
)
table3
Characteristic 4, N = 111 6, N = 71 8, N = 141
mpg 26.7 (4.5) 19.7 (1.5) 15.1 (2.6)
disp 105 (27) 183 (42) 353 (68)
hp 83 (21) 122 (24) 209 (51)
drat 4.07 (0.37) 3.59 (0.48) 3.23 (0.37)
wt 2.29 (0.57) 3.12 (0.36) 4.00 (0.76)
qsec 19.14 (1.68) 17.98 (1.71) 16.77 (1.20)
vs 10 (91%) 4 (57%) 0 (0%)
am 8 (73%) 3 (43%) 2 (14%)
gear


    3 1 (9.1%) 2 (29%) 12 (86%)
    4 8 (73%) 4 (57%) 0 (0%)
    5 2 (18%) 1 (14%) 2 (14%)
carb


    1 5 (45%) 2 (29%) 0 (0%)
    2 6 (55%) 0 (0%) 4 (29%)
    3 0 (0%) 0 (0%) 3 (21%)
    4 0 (0%) 4 (57%) 6 (43%)
    6 0 (0%) 1 (14%) 0 (0%)
    8 0 (0%) 0 (0%) 1 (7.1%)
1 Mean (SD); n (%)

Ce tableau résume les données en affichant des statistiques pour les variables continues, séparées par les groupes de la variable ‘cyl’ (nombre de cylindres).

Exemple 4: Ajout de Labels et Modification de l’Apparence

table4 <- tbl_summary(
  mtcars,
  by = "am", # Groupe selon la transmission (automatique ou manuelle)
  label = list(mpg = "Miles per Gallon",
               hp = "Horsepower"),
  statistic = all_continuous() ~ "{mean} ({sd})",
  missing = "no" # Exclure les valeurs manquantes
) %>%
  modify_header(label ~ "**Variable**")
table4
Variable 0, N = 191 1, N = 131
Miles per Gallon 17.1 (3.8) 24.4 (6.2)
cyl

    4 3 (16%) 8 (62%)
    6 4 (21%) 3 (23%)
    8 12 (63%) 2 (15%)
disp 290 (110) 144 (87)
Horsepower 160 (54) 127 (84)
drat 3.29 (0.39) 4.05 (0.36)
wt 3.77 (0.78) 2.41 (0.62)
qsec 18.18 (1.75) 17.36 (1.79)
vs 7 (37%) 7 (54%)
gear

    3 15 (79%) 0 (0%)
    4 4 (21%) 8 (62%)
    5 0 (0%) 5 (38%)
carb

    1 3 (16%) 4 (31%)
    2 6 (32%) 4 (31%)
    3 3 (16%) 0 (0%)
    4 7 (37%) 3 (23%)
    6 0 (0%) 1 (7.7%)
    8 0 (0%) 1 (7.7%)
1 Mean (SD); n (%)

Dans cet exemple, des labels personnalisés sont ajoutés pour certaines variables, et l’en-tête de la colonne ‘label’ est modifiée.

Pour en savoir plus sur le représentation des tableaux :

ThinkR

danieldsjoberg

larmarange.github.io

Ecrire du langage R en ligne

R Markdown permet d’intégrer du code R dans un document texte.

Voici une explication :

Lorsque que vous déclararez une variable dans un chunk vous pouvez ensuite directement afficher le contenu de la variable en utilisant la syntaxe suivante :

# Calcul de la moyenne de l'age des femmes
moyenne_femme_age <-  hdv2003 %>% 
  filter(sexe == "Femme") %>% 
  select(age) %>%
  summarise(moyenne_age = mean(age)) %>% 
  pull()

# Calcul du revenu moyen par catégorie professionnelle
moyenne_femme_heures_tv <- hdv2003 %>% 
  filter(sexe == "Femme") %>% 
  select(heures.tv) %>%
  summarise(moyenne_tv = mean( heures.tv)) %>% 
  pull()

Nous observons que l’age moyen dans les données hdv20003 est de 48.1534968.

Exercice

L’objectif de cet unique exercice est de créer un rapport d’analyse pour les données d’animation disponible ici : https://www.kaggle.com/datasets/bangaru5/datasets-related-to-animation

Téléchargez les données et enregistrez les dans votre dossier data.

Pour réaliser ce projet d’analyse de données d’animation avec RMarkdown, voici une structure de base que vous pouvez suivre.

Cette structure comprend des sections pour l’importation des données, l’exploration, l’analyse et la visualisation des résultats.

Notez que vous devrez remplacer les parties de code par vos propres scripts R pour effectuer l’analyse spécifique et la visualisation des données d’animation. L’analyse doit être faite exclusivement avec la syntaxe dplyr

Introduction

Ce rapport vise à explorer et analyser le jeu de données d’animation disponible sur Kaggle. Nous nous concentrerons sur divers aspects tels que la popularité, les scores moyens, les genres et la distribution des épisodes.

Chargement des Données

# Code pour charger les données depuis le fichier CSV ou directement depuis Kaggle

Exploration des Données

# Code pour explorer les données, par exemple avec summary(), head(), str()

Top 5 Anime par Popularité

# Code pour déterminer les 5 anime les plus populaires

Score Moyen d’Animation par Source

# Code pour calculer le score moyen par source

Top 3 Genres avec le Score Moyen d’Animation le Plus Élevé

# Code pour identifier les 3 genres avec les meilleurs scores moyens

Popularité et Favoris Moyens par Genre

# Code pour calculer la popularité et les favoris moyens par genre

Distribution du Nombre d’Épisodes

# Code pour visualiser la distribution du nombre d'épisodes

Nombre d’Anime pour le Studio ‘Sunrise’

# Code pour compter le nombre d'anime produits par le studio 'Sunrise'

Moyenne du Nombre d’Anime par Studio

# Code pour calculer la moyenne du nombre d'anime par studio

Conclusion

Résumez ici les résultats clés de votre analyse et ce que vous avez appris sur les données d’animation.

Références

Pour compléter ce rapport, vous devrez écrire le code R correspondant à chaque section et l’ajouter aux blocs de code RMarkdown. Vous pouvez également inclure des graphiques et des visualisations pour enrichir votre analyse.

Chapitre 7. Data Visualisation avancées : ggplot2, leaflet et plotly

Ce cours vise à vous fournir les compétences nécessaires pour créer des visualisations de données percutantes et informatives en utilisant la bibliothèque ggplot2 de R. Que vous soyez un analyste de données, un scientifique de données, ou simplement quelqu’un d’intéressé par la data science, ce cours vous aidera à transformer vos données en insights visuels compréhensibles.

Pourquoi la Visualisation de Données?

La visualisation de données est essentielle dans le monde d’aujourd’hui.

  • Communication Efficace: La visualisation aide à communiquer les résultats et les insights de manière claire et efficace.
  • Exploration de Données: Elle joue un rôle clé dans l’exploration de données, permettant de découvrir des tendances, des motifs et des anomalies.
  • Prise de Décision Basée sur les Données: Les visualisations rendent les données compréhensibles, facilitant ainsi la prise de décisions éclairées.

Qu’est-ce que ggplot2?

ggplot2: Un Outil Puissant pour la Visualisation de Données

  • Partie de l’écosystème R: ggplot2 est une bibliothèque R largement utilisée pour la création de visualisations de données de haute qualité.
  • Basé sur la Grammaire de la Graphique: ggplot2 utilise les concepts de la “grammaire de la graphique”, une approche systématique pour construire des graphiques en couches.
  • Personnalisable et Flexible: Il offre une grande flexibilité pour personnaliser les graphiques, ce qui le rend adapté pour une large gamme de scénarios.

Création de Graphiques ggplot2 de Base

Chaque graphique utilise ggplot()pour initialiser l’objet ggplot et spécifie la source de données (data) et l’aesthetic mapping (aes) qui définit quelles variables sont utilisées sur les axes x et y, ainsi que d’autres paramètres esthétiques tels que la couleur, la taille, etc.

barplot

# library(tidyverse)

head(diamonds)
## # A tibble: 6 x 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
## 2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
## 3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
## 4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
## 5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
## 6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
ggplot(data = diamonds, aes(x = cut)) +
  geom_bar()

histogrammes

ggplot(data = diamonds, aes(x = carat)) +
  geom_histogram(binwidth = 0.1)

scatterplot et jitter

ggplot(data = diamonds,  aes(x = carat, y = price)) +
  geom_point()

ggplot(data = diamonds,  aes(x = carat, y = price)) +
  geom_jitter()

boxplot

data <- data.frame(
  Group = rep(c("A", "B", "C"), each = 100),
  Value = rnorm(300)
)

# Créez un boxplot en utilisant ggplot2
ggplot(data, aes(x = Group, y = Value)) +
  geom_boxplot()

lines

diamonds %>%
  group_by(carat) %>%
  summarise(mean_price = mean(price)) %>% 
  ggplot(aes(x = carat, y = mean_price)) +
  geom_line()

Personnalisation des graphiques : couleurs, légendes, et titres

ggplot2 est un système de création de graphiques pour R, basé sur la grammaire des graphiques. Il permet de créer des graphiques complexes en assemblant des éléments de base de manière intuitive.

# Barplot des Diamants par Qualité de Coupe
?scale_fill_brewer()


ggplot(data = diamonds, aes(x = cut, fill = cut)) +
  geom_bar() + 
  labs(title = "Distribution des Diamants par Qualité de Coupe",
       x = "Qualité de la Coupe",
       y = "Nombre de Diamants") +
  scale_fill_brewer(palette = "Set1", guide = 'none') +
  theme_minimal()

  • ggplot(data = diamonds, aes(x = cut, fill = cut)): Initialise un graphique avec les données diamonds, avec cut comme axe x et couleur.
  • geom_bar(): Ajoute des barres au graphique.
  • labs(): Définit le titre et les étiquettes des axes.
  • scale_fill_brewer(): Personnalise les couleurs des barres.
  • theme_minimal(): Utilise un thème minimaliste pour le graphique.
ggplot(data = diamonds, aes(x = carat, y = price, color = clarity)) +
  geom_point() +
  labs(title = "Relation entre le Poids et le Prix des Diamants",
       x = "Carats",
       y = "Prix (USD)",
       color = "Clarté") +
  scale_color_brewer(type = "seq", palette = "Blues") +
  theme_classic() +
  theme(
    axis.title = element_text(colour = "blue", face = "bold"),
    plot.title = element_text(colour = "blue", face = "bold"),
    plot.subtitle = element_text(colour = "blue", face = "bold"))

  • Utilise la clarté (clarity) pour colorer les points.
  • scale_color_brewer(): Applique une palette de couleurs.
  • theme_classic(): Utilise un thème classique.
  • theme(): Personnalise davantage les éléments du graphique.
# Utilisation de `theme_set`
theme_set(theme_bw() + theme(
  axis.title = element_text(colour = "blue", face = "bold"),
  plot.title = element_text(colour = "blue", face = "bold"),
  plot.subtitle = element_text(colour = "blue", face = "bold")))
  • Définit un thème par défaut pour tous les graphiques ultérieurs.
# Différence entre Setting et Mapping

# gauche : setting
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(shape = 10)

# droite : mapping
ggplot(mpg, aes(x = displ, y = hwy, shape = drv)) +
  geom_point()                                       

  • Montre la différence entre définir une propriété pour tous les points (setting) et mapper une propriété à une variable (mapping).
#  Plusieurs façons de modifier les couleurs et les thèmes
p <- ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point()

p <- p + geom_point(color = "red")  
p <- p +  aes(color = drv)
p <- p + aes(color = cty > 20)    
p + theme_bw()

p + xlim(0, 8) + ylim(0, 40)
## Warning: Removed 3 rows containing missing values (`geom_point()`).
## Removed 3 rows containing missing values (`geom_point()`).

p

  • Explore différentes manières de modifier les couleurs et les aspects du graphique.
  • Utilise des fonctions comme theme_bw(), xlim(), ylim(), scale_x_continuous(), et scale_y_continuous() pour personnaliser le graphique.
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  scale_x_continuous(breaks = seq(0, 10, 1)) +
  scale_y_continuous(labels = scales::comma_format(scale = 1e-4)) +
  theme(axis.text.x = element_text(size = 10, color = "blue"),
        axis.text.y = element_text(size = 12, color = "green"))

Techniques Avancées de Visualisation :

Graphiques multi-panneaux avec les données babynames

  • Chargement des bibliothèques :babynames, et viridis utilisées pour les données, et les palettes de couleurs, respectivement.
  • Préparation des données : Sélection des prénoms spécifiques dans le dataset babynames et filtrage par sexe.
  • Création du graphique :
    • ggplot() initialise le graphique.
    • geom_area() crée des graphiques à aire.
    • scale_fill_viridis() applique une palette de couleurs.
    • theme() et theme_ipsum() sont utilisés pour personnaliser l’apparence du graphique.
    • facet_wrap(~name, scale="free_y") divise le graphique en plusieurs panneaux, un pour chaque nom, avec des échelles y libres.

Ce script crée un graphique qui montre la popularité de certains prénoms américains au fil du temps.

# library(babynames)
# library(viridis)

# Load dataset from github
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/3_TwoNumOrdered.csv", header=T)
data$date <- as.Date(data$date)

# Load dataset from github
don <- babynames %>% 
  filter(name %in% c("Ashley", "Amanda", "Mary", "Deborah",
                     "Dorothy", "Betty", "Helen", "Jennifer", "Shirley")) %>%
  filter(sex=="F")

# Plot
don %>%
  ggplot( aes(x=year, y=n, group=name, fill=name)) +
  geom_area() +
  scale_fill_viridis(discrete = TRUE) +
  theme(legend.position="none") +
  ggtitle("Popularity of American names in the previous 30 years") + 
  theme(
    legend.position="none",
    panel.spacing = unit(0, "lines"),
    strip.text.x = element_text(size = 8),
    plot.title = element_text(size=13)
  ) +
  facet_wrap(~name, scale="free_y")

Graphique de l’évolution du prix du bitcoin

  • Chargement et préparation des données : Les données sont chargées d’une source en ligne et la colonne date est convertie au format Date.
  • Création du graphique :
    • ggplot() initialise le graphique.
    • geom_line() et geom_point() sont utilisés pour créer un graphique linéaire avec des points mis en évidence.
    • theme_ipsum() avec base_family = "Arial" applique un thème avec une police standard.
    • ggtitle() ajoute un titre au graphique.

Ce script montre l’évolution récente du prix du bitcoin.

data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/3_TwoNumOrdered.csv", header=T)
data$date <- as.Date(data$date)

# Plot
data %>%
  tail(1000) %>%
  ggplot( aes(x=date, y=value)) +
  geom_line( color="grey") +
  geom_point(shape=21, color="black", fill="#69b3a2", size=6) +
  ggtitle("Evolution of bitcoin price")

Créer une carte avec leaflet

Leaflet est une bibliothèque JavaScript open source très populaire, utilisée pour créer des cartes interactives sur le Web. Bien qu’elle soit principalement basée sur JavaScript, elle peut être utilisée dans le langage de programmation R grâce à un package appelé leaflet pour R. Voici quelques points clés à connaître sur Leaflet dans le contexte de R :

  1. Création de cartes interactives: Leaflet vous permet de créer des cartes interactives que vous pouvez intégrer dans des applications web ou des documents R Markdown. Ces cartes peuvent être personnalisées avec différents styles et fonctionnalités.

  2. Facilité d’utilisation: Même pour les débutants, Leaflet est relativement simple à utiliser en R. Vous pouvez commencer avec quelques lignes de code pour générer une carte de base, puis progressivement ajouter des fonctionnalités plus complexes.

  3. Superpositions et marqueurs: Vous pouvez ajouter des superpositions à vos cartes, comme des marqueurs, des cercles ou des polygones, pour représenter des données géographiques. Ces éléments peuvent être interactifs, affichant des informations supplémentaires lorsque l’utilisateur clique dessus ou passe la souris dessus.

  4. Intégration avec des données spatiales: Leaflet pour R fonctionne bien avec des données spatiales. Vous pouvez utiliser des packages comme sf (simple features) pour manipuler des données géographiques, puis les visualiser avec Leaflet.

  5. Personnalisation: Vous avez la possibilité de personnaliser l’apparence de votre carte avec différents styles de tuiles (par exemple, OpenStreetMap, Mapbox) et d’ajouter des fonctionnalités comme des couches de contrôle, des légendes, et plus encore.

Pour commencer avec Leaflet en R, vous devez d’abord installer et charger le package leaflet. Ensuite, vous pouvez utiliser des fonctions comme leaflet() pour créer une carte et addTiles() pour ajouter des tuiles de fond. De là, vous pouvez explorer d’autres fonctions pour ajouter des marqueurs, des couches, etc.

Voici un exemple de code simple pour créer une carte de base avec Leaflet en R :

library(leaflet)

# Créer une carte de base
leaflet() %>% addTiles()

Voici un exemple de script pour génèrer une carte interactive sur laquelle vous pouvez zoomer et vous déplacer

Installer et charger le package leaflet

# if (!require(leaflet)) {
#   install.packages("leaflet")
# }
# library(leaflet)

Cette partie vérifie d’abord si le package leaflet est installé (require(leaflet)). Si ce n’est pas le cas (!require(leaflet)), il l’installe (install.packages("leaflet")). Ensuite, le package leaflet est chargé en mémoire avec library(leaflet), ce qui permet d’utiliser ses fonctions.

Créer une carte de base

map <- leaflet() %>% 
  addTiles()  # Ajoute les tuiles de base d'OpenStreetMap

Ici, une carte de base est créée avec leaflet() et des tuiles par défaut (généralement d’OpenStreetMap) sont ajoutées avec addTiles(). Le résultat est stocké dans la variable map.

Ajouter un marqueur

map <- map %>% 
  addMarkers(lng = -0.09, lat = 51.50, popup = "The marker is placed at London")

Cette ligne ajoute un marqueur sur la carte. Le marqueur est placé à Londres (longitude -0.09, latitude 51.50), et un texte popup s’affiche lorsque vous cliquez sur le marqueur (“The marker is placed at London”).

Changer le fond de carte

map <- map %>% 
  addProviderTiles(providers$Stamen.TonerLite)

Ici, le style de la carte est changé en utilisant une tuile différente fournie par Stamen.TonerLite, donnant à la carte un aspect visuel différent.

Données pour les marqueurs supplémentaires

data <- data.frame(
  lng = c(-0.09, -0.11, -0.12),
  lat = c(51.50, 51.52, 51.48),
  label = c("Point 1", "Point 2", "Point 3")
)

Cette partie crée un data.frame contenant des coordonnées et des étiquettes pour trois points supplémentaires.

Ajouter des marqueurs supplémentaires

map <- map %>% 
  addMarkers(data = data, ~lng, ~lat, popup = ~label)

Ces lignes ajoutent des marqueurs supplémentaires à la carte en utilisant les données du data.frame créé précédemment. Chaque marqueur affiche le texte correspondant dans label lorsqu’on clique dessus.

Afficher la carte

map

Enfin, cette ligne affiche la carte créée, avec tous les marqueurs et modifications apportées.

VOici le code en intégralité :

# Données pour les marqueurs 
data <- data.frame(
  lng = c(-0.09, -0.11, -0.12),
  lat = c(51.50, 51.52, 51.48),
  label = c("Point 1", "Point 2", "Point 3")
)

# Ajouter des marqueurs supplémentaires
map_londres <-  leaflet(data) %>% 
  addTiles() %>% 
  addMarkers( ~lng, ~lat, popup = ~label) %>% 
  addProviderTiles(providers$Stamen.TonerLite)

Autres exemples

Paris

Paris <- c(2.351462,48.8567)
map_paris <- leaflet() %>%
  setView(lng = Paris[1], lat = Paris[2], zoom = 12) %>% 
  addTiles() %>% 
  addProviderTiles(providers$Stamen.TonerLite)

IA School Toulouse

  1. Création du Contenu du Popup :
content <- paste(sep = "<br/>", ...)

Cette portion crée une chaîne HTML content qui sera utilisée dans le popup. Elle contient un lien vers le site web de l’IA School à Toulouse, ainsi que l’adresse de l’école, formatée avec des balises HTML pour une meilleure présentation.

  1. Création et Configuration de la Carte avec Popup :
leaflet() %>% 
  addTiles() %>%
  addPopups(...)
content <- paste(sep = "<br/>",
                 "<b><a href='https://www.intelligence-artificielle-school.com/ecole/nos-campus/toulouse/'>IA School - Toulouse</a></b>",
                 "2 Bd de Strasbourg",
                 "31000 Toulouse"
)

map_ia <- leaflet() %>% 
  addTiles() %>%
  addPopups(1.4485130539619018, 43.60676750775245, 
            content, options = popupOptions(closeButton = FALSE)
  ) %>% 
  addProviderTiles(providers$Stamen.TonerLite)

Une nouvelle carte est créée, des tuiles de base sont ajoutées, et un popup est placé aux coordonnées spécifiées (Toulouse, France). Le popup affiche le contenu HTML défini précédemment. L’option closeButton = FALSE signifie que le popup n’aura pas de bouton de fermeture.

Dans les deux cas, ces blocs de code illustrent comment créer des cartes interactives en R avec le package leaflet, en se concentrant sur des emplacements spécifiques (Paris et Toulouse) et en utilisant des fonctionnalités telles que les vues personnalisées, les styles de tuiles et les popups.

Créer des graphiques dynamiques : plotly

Graphiques Interactifs avec Plotly en R

Le package Plotly permet de créer des graphiques web interactifs de qualité publication.

La première chose à faire est d’installer et de charger le package Plotly avec :

# install.packages("plotly")
# library(plotly)

De plus, nous avons besoin de données pour travailler. Nous allons créer x, y et y3 avec des valeurs numériques pour les utiliser plus tard dans nos exemples.

x = c(1, 2, 3, 4, 5)
y = c(6, 7, 8, 9, 10)
y3 = c(-6, -7, -8, -9, -10)

Tracer une droite

La première chose à faire est d’appeler plot_ly(). Le premier argument est les données que nous voulons tracer (x & y), le second décrit le type de graphique, tandis que le troisième définit comment nos données seront affichées dans le graphique. Ici, nous voulons un graphique en ligne, donc nous choisissons “lines”. Regardez l’exemple ci-dessous.

Nuage de Points

La première chose à faire est d’appeler plot_ly(). Ici, nous voulons un nuage de points, donc nous choisissons “markers”, qui est le choix par défaut, donc il peut être omis. Regardez l’exemple ci-dessous.

saveWidget(nuages,
           "nuages_leaflet_map.html", 
           selfcontained = FALSE)

Diagramme à Barres

La première chose à faire est d’appeler plot_ly(). Le premier argument est les données que nous voulons tracer (x & y), le second décrit le type de graphique, qui est maintenant un diagramme à barres.

barres <- plot_ly(
  x = c(1, 2, 3),
  y = c(4, 5, 6),
  type = "bar"
)
saveWidget(barres,
           "barres_leaflet_map.html", 
           selfcontained = FALSE)

Jitter

La première chose à faire est d’appeler plot_ly(). Ici, nous voulons un graphique à bulles, donc nous choisissons “markers”. Ensuite, nous définissons la taille pour chaque point et enfin sa couleur. Regardez l’exemple ci-dessous.

jitter <- plot_ly(
  x = c(1, 2, 3),
  y = c(4, 5, 6),
  type = "scatter",
  mode = "markers",
  size = c(2, 6, 9),
  marker = list(color = c("red", "black", "yellow"))
)
saveWidget(jitter,
           "jitter_leaflet_map.html", 
           selfcontained = FALSE)
## Warning: `line.width` does not currently support multiple values.

Heatmap

La première chose à faire est d’appeler plot_ly(). Le premier argument est les données que nous voulons tracer, qui est l’ensemble de données “volcano” et sera donné comme une matrice numérique “z”, le second décrit le type de graphique, qui est maintenant une carte de chaleur. Regardez l’exemple ci-dessous.

heat <- plot_ly(
  z = volcano,
  type = "heatmap"
)
saveWidget(heat,
           "heat_leaflet_map.html", 
           selfcontained = FALSE)

Aires

La première chose à faire est d’appeler plot_ly(). Ici, nous voulons un graphique en aires, donc nous choisissons “lines” en combinaison avec l’argument fill. Regardez l’exemple ci-dessous.

aires <- plot_ly(
  x = c(1, 2, 3),
  y = c(4, 5, 6),
  type = "scatter",
  mode = "lines",
  fill = "tozeroy"
)
saveWidget(aires,
           "aires_leaflet_map.html", 
           selfcontained = FALSE)

Mise en Page

Améliorons maintenant la mise en page de notre graphique. D’abord, nous verrons comment ajouter une trace à cela. Nous le faisons si nous voulons séparer nos marqueurs en groupes. Regardez l’exemple ci-dessous, dans lequel le premier groupe a y > 0 et l’autre y < 0 :

df <- data.frame(
  x = c(1, 2, 3),
  y = c(4, 5, 6),
  y3 = c(-4, -5, -6)
)

mise <- df %>% 
plot_ly(
  type = "scatter",
  mode = "markers"
) %>%  
  add_trace(x = ~x, y = ~y3)
saveWidget(mise,
           "mise_leaflet_map.html", 
           selfcontained = FALSE)

Nous pouvons également ajouter la trace comme une légende dans notre graphique, définir sa position précise et la colorer. Regardez l’exemple ci-dessous :

mise_jaune <- df %>% 
plot_ly(
  type = "scatter",
  mode = "markers"
) %>%
add_trace(x = ~x, y = ~y3) %>%
layout(
  legend = list(
    x = 1,
    y = 1,
    bgcolor = "yellow"
  )
)
saveWidget(mise_jaune,
           "mise_jaune_leaflet_map.html", 
           selfcontained = FALSE)

La dernière chose que nous devrions être capables de faire lors de la création d’un graphique est de gérer les axes. D’abord, nous créons une liste qui contient toutes les caractéristiques des axes, puis nous attachons cette liste aux deux axes comme l’exemple ci-dessous :

# Création du 1er facteur "magFactor" qui catégorise la magnitude des séismes
quakes$magFactor <- factor(floor(quakes$mag))

# Création du second facteur "region" qui catégorise la région géographique des séismes (Est/Ouest)
quakes$region <- factor(quakes$long >= 175, labels = c("Ouest", "Est"))

head(quakes, n = 5)
##      lat   long depth mag stations magFactor region
## 1 -20.42 181.62   562 4.8       41         4    Est
## 2 -20.62 181.03   650 4.2       15         4    Est
## 3 -26.00 184.10    42 5.4       43         5    Est
## 4 -17.97 181.66   626 4.1       19         4    Est
## 5 -20.42 181.96   649 4.0       11         4    Est
seisme <- plot_ly(x = quakes$mag, type = "histogram") %>% 
  layout(title = "Magnitude des séismes")
saveWidget(seisme,
           "seisme_leaflet_map.html", 
           selfcontained = FALSE)
axe_x <- list(
  autotick = FALSE,              # pour contrôler le pas de l'axe des abscisses
  ticks = "outside",             # ou "inside"
  dtick = 20,                    # le nombre d'intervalles
  ticklen = 10,                  # la longueur des indicateurs
  tickwidth = 2,                 # la largeur des indicateurs
  tickcolor = toRGB("blue"),     # la couleur
  zeroline = TRUE,
  showline = TRUE,
  zerolinecolor = toRGB("red"),  # pour mettre en exergue la droite 'x = 0'
  zerolinewidth = 3,
  linecolor = toRGB("black"),
  linewidth = 2
  )

description_seisme <- plot_ly(alpha = 0.8, histnorm = "probability", xlim = c()) %>% 
  add_histogram(x = quakes$long, name = "Longitudes") %>% 
  add_histogram(x = quakes$stations, name = "Nombre de stations") %>%
  add_histogram(x = quakes$lat, name = "Latitudes") %>%
  layout(title = "Distribution empirique de trois variables décrivant les séismes", 
         barmode = "overlay", xaxis = axe_x)
saveWidget(description_seisme,
           "description_seisme_leaflet_map.html", 
           selfcontained = FALSE)

Voici un exemple de script d’analyse complet :

# Configurer la graine aléatoire pour la reproductibilité
set.seed(123)

# Créer une séquence de dates (chaque mois de 2020)
dates <- seq(ymd("2020-01-01"), ymd("2020-12-31"), by="month")

# Codes d'état des États-Unis (exemple avec 5 états)
state_codes <- c("AL", "AK", "AZ", "AR", "CA")

# Générer des données aléatoires
num_rows <- length(dates) * length(state_codes)

data_simule <- data.frame(
  time = rep(dates, each=length(state_codes)),
  state_code = rep(state_codes, times=length(dates)),
  num_colonies = sample(100:10000, num_rows, replace = TRUE),
  percent_lost = runif(num_rows, 0, 100),
  varroa_mites = runif(num_rows, 0, 100),
  other_pests = runif(num_rows, 0, 100),
  diseases = runif(num_rows, 0, 100),
  pesticides = runif(num_rows, 0, 100),
  other = runif(num_rows, 0, 100),
  unknown = runif(num_rows, 0, 100)
)

# Afficher les premières lignes du dataframe
head(data_simule)
##         time state_code num_colonies percent_lost varroa_mites other_pests
## 1 2020-01-01         AL         2562     33.28235     35.39046   96.110479
## 2 2020-01-01         AK         2610     48.86130     64.99852   72.839443
## 3 2020-01-01         AZ         8817     95.44738     37.47140   68.637508
## 4 2020-01-01         AR         3085     48.29024     35.54454    5.284394
## 5 2020-01-01         CA         1941     89.03502     53.36879   39.522013
## 6 2020-02-01         AL         9433     91.44382     74.03344   47.784538
##    diseases pesticides    other  unknown
## 1 13.710608   11.94048 13.70675 43.61300
## 2 39.658459   52.60297 90.53096 46.40166
## 3 22.498533   22.50734 57.63018 16.52981
## 4  5.795856   48.64118 39.54489 58.49366
## 5 39.589269   37.02148 44.98025 27.07780
## 6  6.492830   98.33502 70.65019 23.00969
fig <- data_simule %>%
       plot_ly() %>%
       add_trace(
         type = "choropleth",
         locations = ~state_code,
         locationmode = "USA-states",
         z = ~varroa_mites,
         colorscale = "Viridis_r",
         color = ~varroa_mites
       ) %>%
       layout(
         geo = list(scope = "usa"),
         frame = ~time
       )
saveWidget(fig,
           "fig_leaflet_map.html", 
           selfcontained = FALSE)
## Warning: 'layout' objects don't have these attributes: 'frame'
## Valid attributes include:
## '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'

Mise en Page multiple

Pour faire une figure contenant plusieurs graphiques dans la même fenêtre, on doit utiliser la fonction subplot. Les principaux paramètres de cette dernière sont:

…: Une série de graphiques plotly ou ggplot2 nrows: Le nombre de rangés sur lesquelles distribuer les graphiques shareX/shareY: Partager l’axe X / Y

# Graphique 1
gg_quakes <- qplot(long, lat, data = quakes, color = region) + coord_quickmap()
## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
gg_quakes

# Nous avons produit un graphique ggplot classique, non-interactif. Pour le rendre interactif, il suffit d’appliquer la fonction ggplotly ainsi:
p_scatter <-  ggplotly(gg_quakes)


# Graphique 2 
p_box <- plot_ly(data = quakes[quakes$region == "Est",],
                 x = ~ mag, type = "box", name = "Est") %>%
  add_trace(data = quakes[quakes$region == "Ouest",], x = ~ mag, name = "Ouest")

# Multi-graphique :
multiplot <- subplot(p_scatter, p_box, nrows = 1, shareX = FALSE, shareY = FALSE, margin = 0.05) %>%
  layout(title = "Longitude, latitude et magnitude des tremblements de terre",
         xaxis = list(title = "Longitude"),
         yaxis = list(title = "Latitude", scaleanchor = "x"),
         xaxis2 = list(title = "Magnitude"))
## Warning: Can only have one: config
saveWidget(multiplot,
           "multiplot_seisme_leaflet_map.html", 
           selfcontained = FALSE)

Pour en savoir plus rendez-vous sur le site : data to viz

Exercices

Exercice 1

  • Objectif : Créez un graphique en ligne de x et y.
  • Indice : Utilisez mode = "lines".

Exercice 2

  • Objectif : Créez un nuage de points (scatter plot) de x et y.
  • Indice : Utilisez mode = "markers".

Exercice 3

  • Objectif : Créez un diagramme à barres de x et y.
  • Indice : Utilisez type = "bar".

Exercice 4

  • Objectif : Créez un graphique à bulles de x et y. Choisissez la taille et la couleur de votre choix pour chaque marqueur.
  • Indice : Utilisez size et color.

Exercice 5

  • Objectif : Créez une carte de chaleur (heatmap) de l’ensemble de données “volcano”.
  • Indice : Utilisez z.

Exercice 6

  • Objectif : Créez un graphique en aires de x et y.
  • Indice : Utilisez fill = "tozeroy".

Exercice 7

  • Objectif : Ajoutez y3 au nuage de points de l’Exercice 2. Ensuite, créez votre nuage de points avec trace.
  • Indice : Utilisez add_trace().

Exercice 8

  • Objectif : Transformez la trace que vous avez ajoutée dans l’Exercice 7 en légende avec les coordonnées (1,1) et la couleur rouge.
  • Indice : Utilisez layout().

Exercice 9

  • Objectif : Ajoutez des axes au nuage de points que vous avez construit dans l’Exercice 2. Définissez nticks à 40, ajoutez showline, donnez un titre et réglez mirror sur “all”.
  • Indice : Utilisez list().

Exercice 10

  • Objectif : Ajoutez maintenant showgrid, zeroline, réglez nticks à 20 et supprimez showline pour repérer les différences.

Projet : Visualisation des stations velib à Paris et Toulouse

Plusieurs villes dans le monde ont accepté de mettre en ligne les données sur l’occupation des stations velib. Ces données sont facilement accessibles et mises à jour en temps réel. On dispose généralement de la taille et la localisation des stations, la proportion de vélos disponibles… Il est possible de requêter (entre autres) :

  • sur les données Decaux
  • sur Open data Paris
  • sur vlstats pour des données mensuelles ou historiques ou encore sur Velib pour obtenir des fichiers qui sont rafraichis régulièrement.
  1. Récupérer les données actuelles de velib disponibles pour la ville de Paris : https://opendata.paris.fr/explore/dataset/velib-disponibilite-en-temps-reel/information/. Récupérer les données actuelles de velib disponibles pour la ville de Toulouse : https://www.data.gouv.fr/fr/datasets/station-velo-toulouse-toulouse/

  2. Décrire les variables du jeu de données.

  3. Visualiser les positions des stations sur une carte leaflet.

Pour Paris, ajouter un popup qui permet de connaitre le nombre de vélos disponibles (électriques+mécanique) quand on clique sur la station (on pourra utiliser l’option popup dans la fonction addCircleMarkers).

  • Ajouter la nom de la station dans le popup.

Faire de même en utilisant des couleurs différentes en fonction de la proportion de vélos disponibles dans la station. On pourra utiliser les palettes de couleur.

ColorPal1 <- colorNumeric(scales::seq_gradient_pal(low = "#132B43", high = "#56B1F7", space = "Lab"), domain = c(0,1))
ColorPal2 <- colorNumeric(scales::seq_gradient_pal(low = "red", high = "black", space = "Lab"), domain = c(0,1))
  1. Créer une fonction local.station qui permette de visualiser quelques stations autours d’une station choisie.

Voici comment vous pourriez aborder ce challenge en utilisant R et le package Leaflet pour la visualisation des stations Velib à Paris et Toulouse. Ce projet implique plusieurs étapes :

  1. Récupération des données : Importer les données Velib pour Paris et Toulouse.
  2. Exploration et préparation des données : Décrire les variables et préparer les données pour la visualisation.
  3. Visualisation sur une carte Leaflet : Afficher les stations sur une carte et ajouter des fonctionnalités interactives.

Étape 1: Récupération des Données via api

# Données Velib Paris

# Données Velib Toulouse

Étape 2: Exploration et Préparation des Données

# Description des données

# Préparation des données pour la visualisation
# Assurez-vous que les données contiennent les colonnes pour la latitude, la longitude et les informations sur les vélos disponibles.

Étape 3: Visualisation avec Leaflet

library(leaflet)

# Fonction pour la palette de couleurs
ColorPal <- colorNumeric(scales::seq_gradient_pal(low = "red", high = "black", space = "Lab"), domain = NULL)

# Visualisation pour Paris
leaflet(velib_paris) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitude, lat = ~latitude, 
                   color = ~ColorPal(proportion_disponible),
                   popup = ~paste("Station:", nom_station, "<br>", "Vélos disponibles:", nb_velos_dispo)) 

# Visualisation pour Toulouse (ajustez les noms des colonnes en fonction des données)

leaflet(velib_toulouse) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitude, lat = ~latitude, 
                   color = ~ColorPal(proportion_disponible),
                   popup = ~paste("Station:", nom_station, "<br>", "Vélos disponibles:", nb_velos_dispo)) 

Fonction supplémentaire: local.station


local.station <- function(data, station_name, radius = 500) {
  # Trouvez la station par son nom
  station <- data %>% filter(nom_station == station_name)

  if(nrow(station) == 0) {
    stop("Station non trouvée")
  }

  # Calculez la distance à partir de cette station
  distances <- geosphere::distHaversine(matrix(c(station$longitude, station$latitude), ncol = 2), 
                                        matrix(c(data$longitude, data$latitude), ncol = 2))

  # Sélectionnez les stations à moins de `radius` mètres
  nearby_stations <- data[distances <= radius, ]

  # Visualisation
  leaflet(nearby_stations) %>%
    addTiles() %>%
    addCircleMarkers(lng = ~longitude, lat = ~latitude, 
                     color = ~ColorPal(proportion_disponible),
                     popup = ~paste("Station:", nom_station, "<br>", "Vélos disponibles:", nb_velos_dispo))
}

# Exemple d'utilisation : 

local.station(velib_paris, "Nom_Station")

N’oubliez pas d’adapter les noms des colonnes et les fonctions en fonction des données spécifiques que vous récupérez.

La fonction local.station permet d’afficher les stations dans un rayon spécifique autour d’une station donnée. Vous devrez peut-être installer et charger des packages supplémentaires comme geosphere pour les calculs de distance.

Chapitre 8. Exploratory Data Analysis (EDA)

L’EDA est un processus d’analyse qui permet de résumer caractéristiques principales des données. Elle est cruciale pour mieux comprendre les données avant des analyses plus poussées.

Objectif : Identifier des patterns, détecter des anomalies et tester des hypothèses

Formuler des hypothèses

En suivant ces étapes, vous pouvez structurer efficacement le processus de formulation d’hypothèses tout au long de votre EDA.

  • Avant la récolte des données : compréhension préalable du sujet ou du domaine.

  • Pendant l’EDA :

    • en observant les statistiques descriptives et les distributions initiales.
    • en examinant des variables individuelles ou des relations entre deux variables.
    • en examinant les motifs ‘patterns’ révélés par les visualisations comme les graphiques et les diagrammes.
    • en rassemblant toutes les observations pour formuler des hypothèses d’ensemble sur les données.

Une bonne hypothèse est :

-> Basées sur des Observations

-> Testables

-> Informatives

Bien sûr, voici un cours bref sur les fondamentaux de l’Analyse Exploratoire des Données (EDA) :

Introduction à l’EDA

  • Définition : L’EDA est un processus d’analyse de datasets pour résumer leurs caractéristiques principales, souvent avec des méthodes visuelles. Elle est cruciale pour mieux comprendre les données avant des analyses plus poussées.
  • Objectif : Identifier des patterns, détecter des anomalies, tester des hypothèses et vérifier des suppositions.

Les Étapes Clés de l’EDA

  1. Compréhension du Domaine :
    • Comprendre le contexte du dataset.
    • Formuler des questions et hypothèses pertinentes que l’EDA pourrait aider à répondre.
  2. Collecte et Nettoyage des Données :
    • Assurer la qualité des données (traitement des valeurs manquantes, élimination des duplicatas, etc.).
    • Transformer les données si nécessaire (normalisation, standardisation…).
  3. Analyse univariée:
    • Examiner chaque variable individuellement.
    • Utiliser des statistiques descriptives (moyenne, médiane, mode, écart-type).
    • Visualiser les distributions
  4. Analyse bivariée / multivariée :
    • Explorer les relations entre les variables.
    • Utiliser des scatter plots, et des tableaux croisés.
  5. Automatiser votre rapport
    • Utilisation de Rmarkdown ou quarto

Conseils pour une EDA Efficace

  • Soyez Curieux : Posez des questions, explorez différentes hypothèses.
  • Soyez Critique : Ne prenez pas les résultats pour argent comptant; cherchez des explications alternatives.
  • Documentez Votre Processus : Gardez une trace de vos analyses et de vos découvertes.

Conclusion

  • L’EDA est une étape fondamentale dans tout projet de data science.
  • Elle permet de mieux comprendre les données et d’orienter les analyses futures.
  • Les compétences en EDA sont cruciales pour tout data scientist ou analyste de données.

Atelier : 🍜🌟 Ramen Reviews EDA w/ R 📈