
Récemment, un stagiaire d’une de mes formations ainsi qu’un lecteur du blog m’ont parlé d’un nouveau package dédié à l’exploration de données : le package explore.
Dans cet article, je vous propose de découvrir ses principales fonctionnalités et d’explorer ses possibilités à travers un jeu de données concret.
Pour ces tests, j’utiliserai le jeu de données heart_disease, inclus dans le package funModeling, que je connais bien. Ce jeu de données concerne la santé cardiaque de 303 patients et contient 14 variables. La variable d’intérêt principale est has_heart_disease (0 = absence de maladie cardiaque, 1 = présence). Les autres variables représentent divers facteurs de risque et mesures cliniques, tels que l’âge, le sexe, la pression artérielle, le taux de cholestérol, la fréquence cardiaque maximale atteinte, etc.
Les données heart_diseasesont inclues dans le package funModeling.
# Installer le packages (si ce n'est pas déjà fait))
if (!require(funModeling)) install.packages("funModeling")
library(funModeling)
data(heart_disease)
#ffichage du jeu de données heart_disease dans une vue tabulaire directement dans RStudio.
#View(heart_disease)
str(heart_disease)
'data.frame': 303 obs. of 16 variables:
$ age : int 63 67 67 37 41 56 62 57 63 53 ...
$ gender : Factor w/ 2 levels "female","male": 2 2 2 2 1 2 1 1 2 2 ...
$ chest_pain : Factor w/ 4 levels "1","2","3","4": 1 4 4 3 2 2 4 4 4 4 ...
$ resting_blood_pressure: int 145 160 120 130 130 120 140 120 130 140 ...
$ serum_cholestoral : int 233 286 229 250 204 236 268 354 254 203 ...
$ fasting_blood_sugar : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 2 ...
$ resting_electro : Factor w/ 3 levels "0","1","2": 3 3 3 1 3 1 3 1 3 3 ...
$ max_heart_rate : int 150 108 129 187 172 178 160 163 147 155 ...
$ exer_angina : int 0 1 1 0 0 0 0 1 0 1 ...
$ oldpeak : num 2.3 1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 ...
$ slope : int 3 2 2 3 1 1 3 1 2 3 ...
$ num_vessels_flour : int 0 3 2 0 0 0 2 0 1 0 ...
$ thal : Factor w/ 3 levels "3","6","7": 2 1 3 1 1 1 1 1 3 3 ...
$ heart_disease_severity: int 0 2 1 0 0 0 3 0 2 1 ...
$ exter_angina : Factor w/ 2 levels "0","1": 1 2 2 1 1 1 1 2 1 2 ...
$ has_heart_disease : Factor w/ 2 levels "no","yes": 1 2 2 1 1 1 2 1 2 2 ... Certaines variables sont quantitatives (numérique ou entière (int)), et d’autres variables sont qualitatives de type factor. Certaines variables codées 0/1 sont de type numérique comme exer_angina alors que d’autres (toujours codée en 0 ou 1) sont de type factor comme exter_angina.
Le package explore a été développé par Roland Krasser. C’est un expert en science des données, qui travaille pour A1 Telekom Austria AG, une grande entreprise de télécommunications en Autriche.
La promesse du package describe est de “permettre l’exploration interactive des données avec une seule ligne de code ou en utilisant un ensemble de fonctions tidy faciles à retenir pour l’analyse exploratoire des données”.
Le package dispose d’une page dédiée sur CRAN : https://cran.r-project.org/web/packages/explore/index.html
Avec notamment de nombreuses vignettes (tutoriels détaillés).

Le package dispose également d’une page Github (https://github.com/rolkra/explore), ce qui est très pratique car vous pouvez facilement informer le développeur de bug ou difficultés rencontrées (onglet issue) :

Vous retrouverez également les vignettes en bas de page.
#Installer le packages (si ce n'est pas déjà fait))
if (!require(explore)) install.packages("explore")
library(explore) La fonction explore() permet d’ouvrir une application shiny, directement dans R Studio. Cette application shiny permet alors d’étudier la distribution d’une variable, de manière globale ou en sous groupes. La variable étudiée, et la variable groupe peuvent très facilement être modifiée.
explore(heart_disease)
Par exemple, ci-dessous, l’application représente la distribution de la variable âge dans les deux groupes de la variable cible (la pathologie : 0 = absence de maladie cardiaque, 1 = présence).

Si la variable cible (target) est une variable numérique, l’application propose aussi un scatter-plot pour visualiser la relation entre les deux variables.

L’application propose également d’autres onglets, notamment overview qui affiche une analyse descriptive de chaque variable, en termes de type, nombre de NA, pourcentage de NA, nombre de données unique, min, mean, max, mais malheureusement rien en terme de dispersion (variance, écart type, IQR)
Cette fonction me semble assez utile pour les débutants qui pourront explorer tranquillement, en clique bouton, les relations entre les variables, et les distributions.
Il y a encore un onglet explain qui propose un arbre de régression (je vous en reparle plus loin).
Cette fonction renvoie des visualistions de distribution pour plusieurs variables : des courbes de densités lorsque la variable est numériques continue, et des barplots lorsque la variable est catégorielle (ou numerique avec quelques valeurs).
La fonction explore_all() est tidyverse compatible.
Ici, puisqu’il y a de nombreuses variables, j’ai appliqué la fonction sur les variables numériques, puis catégorielles :
# Installer le package dplyr (si ce n'est pas déjà fait), pour pouvoir employer l'operateur pipe %>%
if (!require(dplyr)) install.packages("dyplr")
library(dplyr)
heart_disease %>%
# sélection des variables numériques
select(where(is.numeric)) %>%
explore_all() 
heart_disease %>%
# sélection des variables de type facteur
select(where(is.factor)) %>%
explore_all() 
Remarque : Pat défaut, la fonction crée, sur une même page, un graphique par variable, ce qui peut rapidement devenir illisible lorsque les variables sont nombreuses. De mémoire, le package DataExplorer gère automatiquement le nombre de visualisations par page, afin qu’elles soient toutes bien visibles.
Une option que j’ai beaucoup appréciée, est la possibilité d’obtenir des visualisations en sous groupe. Par exemple ici, pour les sujets avec et sans pathologie cardiaque :
heart_disease %>%
# sélection des variables numériques, et de la variable heart_disease = variable de groupe
select(where(is.numeric), has_heart_disease) %>%
explore_all(target=has_heart_disease) 
heart_disease %>%
# sélection des variables catégorielle, et de la variable heart_disease = variable de groupe
select(where(is.factor),has_heart_disease) %>%
explore_all(target=has_heart_disease) 
A noter qu’il existe des variantes de la fonction explore pour contraindre le type de visualsation
explore_bar Explore categorical variable using bar chartsexplore_col Explore data without aggregation (label + value)explore_corExplore the correlation between two variablesexplore_count Explore count data (categories + frequency)explore_density Explore density of variableexplore_shiny Explore dataset interactiveexplore_targetpct Explore variable + binary target (values 0/1)La fonction report() vous permet de générer automatiquement un rapport descriptif de vos données, dans un format html.
Attention de bien préciser le lieu d’enregistrement, par exemple à la racine du projet R, avec la syntaxe here::here()
# Installer le package here (si ce n'est pas déjà fait)
if (!require(here)) install.packages("here")
library(here)
# report of all variables
heart_disease %>%
report(output_file = "report_heart_disease.html", output_dir = here::here()) 
La fonction explain_tree() permet de créer un arbre de décision pour expliquer une variable cible (ici la présence de maladie cardiaque). Cette option est également présente dans l’onglet explain de l’application shiny générée par la fonction explore().
heart_disease %>%
# suppression de la variable heart_severity qui explique à elle seule la pathologie dans ce jeud e données
select(-heart_disease_severity) %>%
explain_tree(target = has_heart_disease) 
target=noLa première variable utilisée pour diviser les patients est thal (résultat du test au thallium, un examen d’imagerie cardiaque). Si thal = 6 ou 7, les patients suivent la branche droite. Ils représentent 45% de l’ensemble des patients. Dans ce sous-groupe , la fréquence de la pathologie cardiaque est de 74%. La présence de pathologie étant plus fréquente que l’absence, l’étiquette est target=yes.
Si thal est différent de 6 ou 7, les patients suivent la branche gauche.Il sont 55% de l’ensemble des 100% et ici la pathologie est présente dans 23% des cas ; l’absence de pathologie étant la plus fréquente, l’étiquette est `target=no’.
La seconde variable utiliseée pour séparer les patients est la douleur thoracique (chest_pain). Et la troisième variable est le nombre de vaisseaux visibles en fluoroscopie (num_vesssel_flour).
Grâce à ce type arbre, on peut rapidement identifier les profils de patients les plus à risque et obtenir une aide à la décision pour l’analyse des facteurs influençant la maladie cardiaque.
A noter : L’arbre de régression peut également être réalisé avec l’application shiny, en employant la fonction explore()(voir l’onglet explain).
A noter encore, la possibilité d’employer d’autres fonctions complémentaires :
explain_forest() crée une forêt aléatoire (random forest). La variable cible peut être binaire, catégorielle ou numérique.
explain_xgboost() explique unevariable cible binaire (0/1, FALSE/TRUE) à l’aide d’un algorithme xboost.
explain_logreg() réalise une régression logistique. La variable cible doit être binaire.
balance_target()permet d’équilibrer une variable cible.
weight_target()génère des pondérations pour l’arbre de décision.
Si l’exploration des données vous intéresse particulièrement, je vous recommande de consulter mon article sur le package DataExplorer .
Le package explore offre une approche intéressante pour l’exploration des données, avec une interface intuitive et des visualisations automatiques facilitant l’analyse.
Il peut être particulièrement utile aux débutants grâce à la fonction explore(), qui propose une application Shiny interactive pour manipuler et examiner les variables.
Pour les utilisateurs plus avancés, les fonctions explore_all(), et report() permettent d’obtenir rapidement un aperçu détaillé des données et de générer un rapport structuré en une seule commande.
Un autre point fort de ce package explore est la possibilité de créer facilement des arbres de régression grâce à la fonction explain_tree(). Cette fonctionnalité peut être un vrai atout pour identifier rapidement les variables les plus influentes dans un jeu de données.
Et vous, avez-vous déjà testé ce package explore ?
Qu’en pensez-vous ?
Avez-vous une autre approche ou d’autres packages préférés pour l’analyse exploratoire des données ?
🙏 Partagez votre avis en commentaire
Abonnez-vous gratuitement à la lettre de diffusion du blog pour ne rien manquer !
Vous serez directement informés de la publication de mes nouveaux articles, de la mise à disposition de ressources exclusives, et des actualités sur mes formations.
Vous recevrez également un cadeau 🎁 de bienvenu : des fiches « aide mémoire » (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R
Vous pouvez soutenir mon travail en faisant un don libre sur le Tipeee du blog

Enregistrez vous pour recevoir gratuitement mes fiches « aide mémoire » (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.
2 réponses
Merci pour cette découverte. Quel est à votre avis la plus-value d’utiliser ce package plutôt que DataExplorer que j’utilise (grâce à vous je crois d’ailleurs). Pour l’arbre décisionnel il est à mon sens clairement déconseillé de pouvoir l’utiliser pour déterminer l’importance des variables dans le jeu de données. Pour cela il est préférable d’utiliser les random forest (qui sont en réalité une « somme » d’arbre décisionnel beaucoup plus précis et de générer les variable importance plot avec bien sûr les bonnes pratiques requises (personnellement je fais split des données train/test/validation et 5-fold cross validation avec 10 répétitions). Pour cela, j’utilise l’univers tidymodels. Si besoin d’échange je reste ouvert à la discussion sur ce sujet.
Bonjour François,
Je suis d’accord avec vous pour les arbres de décision. Si on souhaite connaitre l’importance des variables, il vaut mieux passer par un random Forest. Le package propose d’utiliser la fonction explain_forest (en dehors de l’appli shiny).
Les arbres ça parait super de prime abord, mais ils sont rarement robustes : si on fait un split train/test, on obtient souvent des arbres différents. Il me semble qu’ils sont plus robusteq avec la cross validation (type k fold) mais si on a des variables explicatives catégorielles avec peu d’effectifs, il arrive que les catégories soient vides dans un ou plusieurs plis et cela empêche d’obtenir un arbre robuste…..