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
- Rbloggers : Blog Populaire sur le langage R
- Datacamp : Plateforme d’apprentissage de la data science interactive
- Big Book of R : Edition qui rassemble des livres open-source sur le langage R
- Introduction accélérée au langage R pour la data science : L’essentiel et plus de tout ce que nous verrons
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.
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.
! 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.
## [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 #.
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
Par exemple, pour installer le package ggplot2, tapez install.packages(“ggplot2”). Pour utiliser le package, tapez 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.
## starting httpd help server ... done
É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
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.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
install.packages("ggplot2")
: permet l’installation du packageggplot2
depuis le CRAN (Comprehensive R Archive Network).ggplot2
est largement utilisé pour la visualisation de données.library(dplyr)
: charge le packagedplyr
dans la session R actuelle.dplyr
est un package pour la manipulation de données.
Utilisation de Jeux de Données
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.?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éesmtcars
, fournissant des informations sur sa structure et son contenu.data("mtcars")
: permet de charger le jeu de donnéesmtcars
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.
- Création de la Variable
x
:x <- 2
crée une variable nomméex
et lui affecte la valeur2
. Le symbole<-
est l’opérateur d’affectation en R, utilisé pour assigner des valeurs aux variables.
- Affichage de la Variable
x
:print(x)
affiche la valeur de la variablex
. Ici, elle affichera2
.
- Affichage du Type de la Variable
x
:typeof(x)
renvoie le type de données stockées dansx
. Pourx <- 2
, le type seradouble
(nombre à virgule flottante).
- Création d’une Chaîne de Caractères :
chaine <- "Hello, World!"
crée une variablechaine
contenant la chaîne de caractères"Hello, World!"
.print(chaine)
affiche cette chaîne de caractères.typeof(chaine)
indique quechaine
est de typecharacter
.
## [1] 2
## [1] "double"
## [1] "Hello, Word!"
## [1] "character"
Règles de Nommage des Variables
Sensibilité à la Casse : R est sensible à la casse, ce qui signifie que
mavariable
etMaVariable
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 :
## [1] "jour"
## [1] "semaine"
## [1] "mois"
Affichage et Formatage de Variables
print()
etsprintf()
:print(x)
affiche la valeur de la variablex
.sprintf("%d", x)
utilise un formatage de style C pour afficherx
.%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 dex
, en remplaçant%d
par la valeur dex
.
## [1] 2
## [1] "2"
## [1] "Hello, Word!"
## [1] "J'ai 3 bananes"
Arrondi de Nombres
- Utilisation de
round()
:mon_nombre <- 3.2
crée une variable avec une valeur à virgule flottante.round(mon_nombre, 0)
arronditmon_nombre
à l’entier le plus proche.
## [1] 3
Vérification et Conversion de Types
- Type et Conversion :
class(mon_nombre)
renvoie le type de la variablemon_nombre
.is.numeric(mon_nombre)
vérifie simon_nombre
est de type numérique.is.character(mon_nombre)
vérifie simon_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.
## [1] "numeric"
## [1] TRUE
## [1] FALSE
# Convertir des variables numériques <- char | char -> numerique
age_character <- "16"
is.character(age_character)
## [1] TRUE
## [1] TRUE
Gestion de l’Environnement de Travail
- Suppression et Listing d’Objets :
rm(age)
supprime l’objetage
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.
## Warning in rm(age): objet 'age' introuvable
## [1] "age_character" "age_numeric" "chaine" "ma.variable"
## [5] "mavariable" "mavariable123" "mon_nombre" "mtcars"
## [9] "x"
Les opérations et les opérateurs
Opérations Arithmétiques de Base
Addition (
+
) :x + y
calcule la somme dex
ety
.
## [1] 8
Soustraction (
-
) :x - y
calcule la différence entrex
ety
.
## [1] -2
Multiplication (
*
) :x * y
calcule le produit dex
ety
.
## [1] 15
Division (
/
) :x / y
calcule le quotient dex
divisé pary
.
## [1] 0.6
Opérations Avancées
Puissance (
^
ou**
) :x ^ 2
oux**2
calculex
à la puissance de 2.
## [1] 9
Racine Carrée (
sqrt()
) :sqrt(25)
calcule la racine carrée de 25, ce qui donne 5.
## [1] 5
Division Entière (
%/%
) :x %/% y
donne le résultat de la division entière dex
pary
. C’est le quotient de la division sans la partie fractionnaire.
## [1] 0
- Modulo (
%%
) :x %% y
donne le reste de la division entière dex
pary
.
## [1] 3
Unité élémentaire : le vecteur
Création et Affichage de Vecteurs
- Création de Vecteurs :
- Les vecteurs sont créés avec la fonction
c()
.mon_vecteur
est un vecteur de nombres entiers, etvecteur_caractere
est un vecteur de chaînes de caractères.
- Les vecteurs sont créés avec la fonction
## [1] 1 9 10 35
## [1] "Hello" "Word" "!"
- 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.
- Dans
# Typage automatique de 2 en chaine de caractère
vecteur_multiple <- c("Hello", 2)
print(vecteur_multiple)
## [1] "Hello" "2"
Indexation des Vecteurs
- 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 demon_vecteur
.
## [1] "Word"
## [1] "!"
## [1] 1 9 10
Opérations sur les Vecteurs
- Calculs avec des Éléments de Vecteur :
addition
montre un exemple de calcul en additionnant des éléments spécifiques du vecteur.length
,sum
, etmean
sont des fonctions pour obtenir la longueur du vecteur, la somme et la moyenne de ses éléments, respectivement.
## [1] 36
## [1] 4
## [1] 55
## [1] 13.75
Gestion des Valeurs Manquantes
- Valeurs Manquantes (
NA
) dans les Vecteurs :sum(vecteur_valeur_manquante, na.rm = TRUE)
etmean(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
## [1] 35
## [1] NA
## [1] 11.66667
Combinaison de Vecteurs
- Fusion de Vecteurs :
nouveau_vecteur
est créé en combinantmon_vecteur1
etmon_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
- Formation de Chaînes de Caractères :
paste
etpaste0
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 quepaste0
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
- 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.
- Lorsque des opérations sont effectuées sur des vecteurs de longueurs
différentes (
# 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"
## [1] 10 81 21 35
Exercices
- 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.
- 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.
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 Arithmétiques (cf.cours1)
## [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.
- Inférieur à (
<
) :x < y
renvoieTRUE
six
est inférieur ày
.- Exemple :
3 < 5
renvoieTRUE
.
## [1] TRUE
- Supérieur à (
>
) :x > y
renvoieTRUE
six
est supérieur ày
.- Exemple :
5 > 3
renvoieTRUE
.
## [1] FALSE
- Inférieur ou égal à (
<=
) :x <= y
renvoieTRUE
six
est inférieur ou égal ày
.- Exemple :
3 <= 3
renvoieTRUE
.
## [1] TRUE
- Supérieur ou égal à (
>=
) :x >= y
renvoieTRUE
six
est supérieur ou égal ày
.- Exemple :
5 >= 5
renvoieTRUE
.
## [1] FALSE
- Égal à (
==
) :x == y
renvoieTRUE
six
est égal ày
.- Exemple :
3 == 3
renvoieTRUE
.
## [1] FALSE
- Différent de (
!=
) :x != y
renvoieTRUE
six
n’est pas égal ày
.- Exemple :
3 != 5
renvoieTRUE
.
## [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.
- ET Logique (
&
et&&
) :x & y
: RenvoieTRUE
six
ETy
sont tous deuxTRUE
. 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
- OU Logique (
|
et||
) :x | y
: RenvoieTRUE
six
OUy
estTRUE
. 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
- NON Logique (
!
) :!x
: RenvoieTRUE
six
estFALSE
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
%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
:
: 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.
[]
: 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
.
## [1] 1 2 3
[[]]
: 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
.
$
: 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
## [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
## [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
## [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"
## [1] "Minimum: 1"
## [1] "Maximum: 5"
## [1] "Somme: 15"
## [1] "Produit: 120"
Nouvelles fonctions
## [1] 1 2 3 4 5
## [1] 5 4 3 2 1
## [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
## [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"
## names prenom
## "roger" "toto"
## names
## "roger"
## [1] 1 2 90 200
## [1] 1 2 90 200 100
## [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
## [1] 1 8 15 22 29 36 43 50
## [1] 5 1 4 2 3
## [1] 1 5 30 78 90
## [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’argumentlevels
.
# 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.
## [[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
## $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
## 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
## [[1]]
## [1] 45 12 56 14 16
##
## [[2]]
## [1] "red" "blue" "marron"
## [[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.
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
## [,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
## x y
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
## [,1] [,2] [,3]
## x 1 2 3
## y 4 5 6
## y
## 5
## y
## 6
## [,1] [,2] [,3]
## y 4 5 6
## a 7 8 9
## [,1] [,2]
## x 2 3
## y 5 6
## a 8 9
## [,1] [,2] [,3]
## x 1 2 3
## a 7 8 9
## y 4 5 6
## [,1] [,2] [,3]
## x 1 2 3
## a 7 8 10
## y 4 5 6
## [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
## [,1] [,2] [,3]
## x 1 2 3
## y 4 5 6
## [,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.
length(df)
: renvoie le nombre de colonnes dans le data framedf
.
## [1] 4
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.
## [1] 10 4
class(df)
: renvoie la classe de l’objet. Pour un data frame, cela renverra"data.frame"
.
## [1] "data.frame"
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.
## '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" ...
attributes(df)
: renvoie une liste des attributs de l’objetdf
, tels que les noms, les rangs des lignes et des colonnes, et d’autres métadonnées.
## $names
## [1] "taille" "poids" "prog" "sexe"
##
## $class
## [1] "data.frame"
##
## $row.names
## [1] 1 2 3 4 5 6 7 8 9 10
View(df)
: ouvre le data framedf
dans une fenêtre de visualisation dans RStudio (notez que cette fonction n’est utile que dans un environnement interactif comme RStudio).
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.
## 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
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.
## 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
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.
## taille poids prog sexe
## 9 163 50 Certificat H
## 10 170 55 DES H
## [1] 50
## [1] 50
## [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
##
## F H
## 2 8
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 framedf
.apply(df_poids, 1, mean)
: Calcule la moyenne de chaque ligne (indiqué par1
) dans le data framedf_poids
.
## taille poids IMC
## 1.734000e+02 6.590000e+01 2.205107e-03
## [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 listemaliste
.
## [[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)
: Commelapply
, mais renvoie un vecteur des moyennes au lieu d’une liste.
## [1] 5.5 15.5 27.0
mapply
- Version multivariée de
sapply
. mapply(median, df[,c("taille", "poids")])
: Applique la fonctionmedian
aux colonnes “taille” et “poids” du data framedf
. Contrairement àsapply
etlapply
,mapply
peut travailler avec plusieurs vecteurs ou listes simultanément.
## 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 framedf
.
## F H
## 172.00 173.75
Exercices
- 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 le vecteur
vec1
contenant la suite des entiers de 1 à 12. Ajoutez à la fin de ce vecteur les valeurs 16, 17, 18.- Affichez tous les éléments sauf les trois premiers.
- Affichez tous les éléments supérieurs à 7.
- Filtrez les éléments pairs de
vec1
dansvec1_pair
et impairs dansvec1_impair
.
- Créez un vecteur
vec2
de 20 nombres aléatoires entre 1 et 100. Triez ce vecteur en ordre croissant puis décroissant. - Créez le vecteur
vec3
contenant 3 fois chacun des 10 chiffres (soit 0, 0, 0 ; 1, 1, 1 ; etc.). - 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 ? - Créez le vecteur
vec5
contenant les noms suivants :individu1
,individu2
, …,individu100
. - 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
- Créez deux matrices, A et B, de dimensions 3x3 avec les valeurs de votre choix.
- Effectuez les opérations suivantes:
- Addition de A et B.
- Produit matriciel de A par B.
- Transposez la matrice A.
- Affectez des
0
dans la diagonale de la matrice A. Aide :diag
,t()
,%*%
.
Exercice 3
- Créez une matrice 5x5 remplie de nombres aléatoires entre -1 et 1.
- Identifiez les indices des éléments de la matrice qui sont supérieurs à 0,5.
- Créez une nouvelle matrice binaire en remplaçant ces éléments par 1 et les autres par 0.
- Calculez la moyenne des éléments de chaque ligne de la matrice binaire.
- Créez une matrice X de dimensions 4x3 contenant des valeurs
aléatoires entre 1 et 100.
- Extrayez la première ligne et la première colonne de la matrice.
- Calculez la somme de chaque colonne.
- Calculez la moyenne de chaque ligne.
- Modifiez la dernière colonne de la matrice pour qu’elle contienne la somme des éléments de chaque ligne.
- Normalisez la matrice (soustrayez la moyenne et divisez par l’écart-type) pour chaque colonne.
Exercice 4
- Créez deux listes distinctes, “liste1” et “liste2”, chacune contenant au moins trois éléments.
- Fusionnez ces deux listes pour former une nouvelle liste “liste_combinee”.
- Ajoutez un nom à chaque élément de la liste_combinee pour indiquer s’il provient de liste1 ou liste2.
Exercice 5
Créez une liste nommée
université
qui contient les éléments suivants:- 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.
- 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”.
- Etudiants : une autre liste qui contient :
Une fois la liste créée, extrayez et affichez
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.
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"
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, …)
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 danssequence
. 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 :
## [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 :
## [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 :
## [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:
- *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.
## [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.
- 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
- Exemple d’Utilisation :
## [1] 3
## 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
- 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
- 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. - 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
etrep()
. - Écrivez une fonction
maximum_de_deux
qui renvoie le plus grand de deux nombres. - 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.
- É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. - 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
Écrivez une fonction
decale
qui prend deux paramètres :lettre
etshift
. Cette fonction renvoie la lettre décalée deshift
. Exemple :cryptage("h",1)
renvoie “i” etcryptage("H",1)
renvoie “I”. Aide :letters
etLETTERS
.Écrivez une fonction
crypter
qui prend deux paramètres :mot
etshift
. Cette fonction renvoie le mot avec toutes ses lettres décalées deshift
.Écrivez un programme qui permet de crypter et décrypter une phrase.
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.
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()
.
- Longueur d’une chaîne : Vous pouvez obtenir la longueur d’une chaîne
de caractères en utilisant la fonction
nchar()
.
- 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()
ettoupper()
: 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.
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 :
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.
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 :
. (point) : Correspond à n’importe quel caractère, sauf le saut de ligne.
* (astérisque) : Correspond à zéro ou plusieurs occurrences du caractère précédent. Par exemple, “ab*c” correspondra à “ac”, “abc”, “abbc”, etc.
+ (plus) : Correspond à une ou plusieurs occurrences du caractère précédent. Par exemple, “ab+c” correspondra à “abc”, “abbc”, etc., mais pas à “ac”.
? (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”.
[] (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.
[^] (crochets inversés) : Inverse la correspondance. “[^aeiou]” correspondra à tout caractère qui n’est pas une voyelle.
() (parenthèses) : Permet de grouper des expressions régulières. Par exemple, “(ab)+” correspondra à “ab”, “abab”, “ababab”, etc.
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.
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”.
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.
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.
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
## [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.
## [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"
## [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
Extraction de Composants Spécifiques d’une Date
## [1] 17
## [1] 10
## [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)
## [1] "2023-11-07"
## [1] "2023-11-06"
## [1] "1H 15M 30S"
## [1] "13H 30M 0S"
## [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
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
## '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.
## [1] "integer"
## [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.
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)
## Saving 8 x 5 in image
Exercices
- 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."
- Extrayez toutes les adresses e-mail valides.
- Remplacez tous les hashtags (mots commençant par “#”) par des espaces.
- Extrayez tous les numéros de téléphone américains au format (xxx) xxx-xxxx.
- Extrayez toutes les dates au format “dd/mm/yyyy”.
- Extrayez tous les noms d’utilisateur Twitter (qui commencent par “@”).
- Extrayez toutes les URL valides commençant par “http://” ou “https://”.
- Extrayez tous les codes postaux américains à cinq chiffres.
- 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.” )
- Chargez la bibliothèque
stringr
. - Créez deux vecteurs vides pour stocker les commentaires positifs et négatifs.
- 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.
- Effectuez l’analyse de sentiment en parcourant chaque commentaire.
- Convertissez le commentaire en minuscules pour une correspondance insensible à la casse.
- Vérifiez si le commentaire contient des mots-clés positifs ou négatifs.
- Attribuez une étiquette “positif” ou “négatif” en fonction des résultats.
- Stockez les commentaires dans les vecteurs commentaires_positifs et commentaires_negatifs en fonction de leur étiquette.
- 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.
- Créez un objet
Corpus
à partir du texte du roman en utilisant le packagetm
. Assurez-vous d’avoir installé et chargé le packagetm
. - Effectuez le prétraitement des données textuelles en suivant ces
étapes :
- Convertissez le texte en minuscules.
- Supprimez la ponctuation et les chiffres.
- Supprimez les mots vides (stop words).
- Effectuez la tokenization (découpage en mots).
- 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. - 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.
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.
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.
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
delubridate
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. Utilisezpaste
pour créer une chaîne de caractères au format “yyyy-mm-01” pour la date. - Utilisez la fonction
days_in_month
delubridate
pour obtenir le dernier jour du mois en spécifiant l’année et le mois.
- 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.
## 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
Importation de Données CSV avec read.csv
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 packagereadxl
, 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 :
- Charger les packages nécessaires : Assurez-vous
d’avoir les packages
httr
etjsonlite
installés. Ils sont utilisés pour effectuer des requêtes HTTP et pour parser les données JSON, respectivement.
- Récupérer les données : Utilisez la fonction
GET
dehttr
pour envoyer une requête HTTP à l’URL fournie, puis utilisezcontent
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")
- Parser les données JSON : Convertissez les données JSON en une liste ou un dataframe R pour un traitement ultérieur.
## [1] "lastUpdatedOther" "ttl" "data"
- 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.
## 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
- 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.
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
View
ouvre une fenêtre interactive pour visualiser la dataframestarwars
. C’est utile pour explorer les données de manière graphique.
Exploration des Données avec
glimpse
glimpse
est un verbe du packagedplyr
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.
## 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.
## # 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>
## # 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>
## # 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 commecontains()
,starts_with()
,ends_with()
, etmatches()
pour sélectionner des colonnes basées sur des motifs dans leurs noms.
## # 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>
## # 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).
## # 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
## # 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 pargroup_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 avecdesc()
pour un tri décroissant.
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.
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
.
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
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
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
Approche Tidyverse :
dplyr
etggplot2
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.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, avecdplyr
, 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.
- 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
- 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
- Sélectionner la dixième ligne du tableau des aéroports (airports).
- Sélectionner les 5 premières lignes de la table airlines.
- Sélectionner l’aéroport avec l’altitude la plus basse.
- Sélectionnez les vols du mois de juillet (variable
month
). - Sélectionnez les vols avec un retard à l’arrivée
(
arr_delay
) compris entre 5 et 15 minutes. - Sélectionnez les vols des compagnies Delta, United et American
(codes DL, UA et AA de la variable
carrier
). - Triez la table flights par retard au départ décroissant.
- Sélectionnez toutes les colonnes de la table airports sauf les
colonnes
tz
ettzone
. - Sélectionnez toutes les colonnes de la table flights dont les noms se terminent par “delay”.
- Dans la table airports, renommez la colonne
alt
enaltitude
et la colonnetzone
enfuseau_horaire
.
Exercice 2
- Réécrivez le code de l’exercice 1 en utilisant le pipe
%>%
. - 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
). - Sélectionnez les vols des mois de septembre et octobre, conservez
les colonnes
dest
etdep_delay
, créez une nouvelle variableretard_h
contenant le retard au départ en heures, et conservez uniquement les 5 lignes avec les plus grandes valeurs deretard_h
.
Exercice 3
- Affichez le nombre de vols par mois.
- Triez la table résultat selon le nombre de vols croissant.
- Calculez la distance moyenne des vols selon l’aéroport de départ
(
origin
). - Calculez le nombre de vols à destination de Los Angeles (LAX) pour chaque mois.
- Calculez le nombre de vols selon le mois et la destination.
- Conservez, pour chaque mois, uniquement la destination avec le plus grand nombre de vols.
- Calculez le nombre de vols par mois et ajoutez une colonne comportant le pourcentage de vols annuels par mois.
- 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
- Faites la jointure de la table airlines sur la table flights avec
left_join
. - Calculez le retard moyen au départ pour chaque compagnie et triez selon ce retard décroissant.
- Faites la jointure de la table airports sur la table flights en utilisant le code de l’aéroport de destination.
- Affichez, pour chaque mois, le nom de l’aéroport de destination ayant eu le moins de vols.
- 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
- 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 dansflights_dest
. - 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)
- 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.
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
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
- Ouvrez votre fichier RMarkdown dans RStudio.
- 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.
- 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.
- 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 :
- rmarkdown : Le package principal pour travailler avec RMarkdown.
- knitr : Utilisé pour “tricoter” le document, c’est-à-dire pour exécuter le code R et le combiner avec le texte.
- ggplot2 (optionnel) : Si votre analyse implique des visualisations de données.
- dplyr (optionnel) : Pour la manipulation de données.
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 :
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:
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

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.
Aperçu des Données
## # 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
## 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
:
##
## 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 :
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:
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
:
Installation de la bibliothèque: Avant de pouvoir utiliser
tbl_summary()
, vous devez installer et charger la bibliothèquegtsummary
dans votre environnement R. Cela se fait généralement avec la commandeinstall.packages("gtsummary")
, suivie delibrary(gtsummary)
.Préparation des données: Assurez-vous que vos données sont dans un dataframe R.
tbl_summary()
fonctionne avec des dataframes.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.
- Syntaxe de base: La fonction s’utilise en passant
votre dataframe comme premier argument. Par exemple,
Personnalisation:
tbl_summary()
offre diverses options de personnalisation, comme le changement des labels des variables, l’ajout de notes au bas du tableau, etc.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 :
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
Top 3 Genres avec le Score Moyen d’Animation le Plus Élevé
Popularité et Favoris Moyens par Genre
Nombre d’Anime pour le Studio ‘Sunrise’
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
- Lien vers le jeu de données Kaggle : Datasets Related to Animation
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
## # 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
scatterplot et jitter
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éesdiamonds
, aveccut
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)
- 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)
## Warning: Removed 3 rows containing missing values (`geom_point()`).
## Removed 3 rows containing missing values (`geom_point()`).
- 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()
, etscale_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
, etviridis
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()
ettheme_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()
etgeom_point()
sont utilisés pour créer un graphique linéaire avec des points mis en évidence.theme_ipsum()
avecbase_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 :
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.
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.
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.
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.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 :
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
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
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
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
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
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
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
IA School Toulouse
- Création du Contenu du Popup :
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.
- Création et Configuration de la Carte avec Popup :
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 :
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.
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.
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.
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"))
)
## 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.
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.
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)
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"
)
)
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
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)
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
)
## 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
## 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.
# 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
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
etcolor
.
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, ajoutezshowline
, donnez un titre et réglezmirror
sur “all”.
- Indice : Utilisez
list()
.
Exercice 10
- Objectif : Ajoutez maintenant
showgrid
,zeroline
, régleznticks
à 20 et supprimezshowline
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.
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/
Décrire les variables du jeu de données.
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))
- 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 :
- Récupération des données : Importer les données Velib pour Paris et Toulouse.
- Exploration et préparation des données : Décrire les variables et préparer les données pour la visualisation.
- Visualisation sur une carte Leaflet : Afficher les stations sur une carte et ajouter des fonctionnalités interactives.
Étape 2: Exploration et Préparation des Données
É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
- Compréhension du Domaine :
- Comprendre le contexte du dataset.
- Formuler des questions et hypothèses pertinentes que l’EDA pourrait aider à répondre.
- 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…).
- Analyse univariée:
- Examiner chaque variable individuellement.
- Utiliser des statistiques descriptives (moyenne, médiane, mode, écart-type).
- Visualiser les distributions
- Analyse bivariée / multivariée :
- Explorer les relations entre les variables.
- Utiliser des scatter plots, et des tableaux croisés.
- 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 📈
Chapitre 9. Introduction à l’analyse en composantes principales
On peut citer les formats
odt
,rtf
, Markdown, etc.↩︎
Comment ça marche ?
{r} et
) pour le code R.