delladata

Exploration de données simplifiée avec le package explore : présentation et tests

Test du package explore

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 disease

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

Introduction au package explore

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).

page cran du package explore

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) :

page github du package explore

Vous retrouverez également les vignettes en bas de page.

Instllation et ouverture du package explore

#Installer le packages (si ce n'est pas déjà fait))
if (!require(explore)) install.packages("explore")

library(explore) 

Les principales fonctions du package explore

La fonction exlore()

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.

Exploration simplifiée via une application shiny créé par la fonction explore du package explore

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).

 

La fonction explore_all()

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() 
Visualisation des distributions de l'ensemble des variables numériques
heart_disease %>% 
  # sélection des variables de type facteur
  select(where(is.factor)) %>% 
  explore_all() 
Visualisation de la distribution des variables catégorielle

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) 
Exploration des distributions en sous-groupe
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) 
Visualisation des distributions de l'ensemble des variables catégorielles, par sous groupes

A noter qu’il existe des variantes de la fonction explore pour contraindre le type de visualsation

  • explore_bar Explore categorical variable using bar charts
  • explore_col Explore data without aggregation (label + value)
  • explore_corExplore the correlation between two variables
  • explore_count Explore count data (categories + frequency)
  • explore_density Explore density of variable
  • explore_shiny Explore dataset interactive
  • explore_targetpct Explore variable + binary target (values 0/1)

La fonction report()

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()) 
Génération d'un rapport descriptif des données

La fonction explain_tree()

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) 
arbre de décision permettant d'expliquer la pathologie en fonction des variables explicatives
’ai toujours un peu de difficulté à lire les arbres de régression. D’après ma compréhension, le premier noeud (celui du haut) représente 100% des patients. 46% des patients ont une pathologie cardiaque et 54% n’en ont pas. L’absence de pathologie est la plus fréquente, c’est pour cela que l’étiquette est target=no

La 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.

Pour aller plus loin

Si l’exploration des données vous intéresse particulièrement, je vous recommande de consulter mon article sur le package DataExplorer  .

Conclusion

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 

📩 Envie de recevoir plus d’astuces et de tutoriels sur R ?

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 souhaitez vous former au logiciel R ou aux analyses statistiques ?

Vous souhaitez soutenir mon travail ?

Vous pouvez soutenir mon travail en faisant un don libre sur le Tipeee du blog

2 réponses

  1. 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.

    1. 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…..

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Fonctions statistiques R

Aide mémoire off'R ;)

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.