Dans cet article, je vous propose de tester un nouvel outil visuel pour explorer les relations entre des variables prédictives (qualitatives et quantitatives) et une variable réponse (qunatitative ou qualitative) : le correlation funnel plot.
L’objectif de ce nouvel outil visuel est d’évaluer ultra rapidement quelles sont les variables fortement corrélées à une variable réponse d’intérêt principal.
Il a été développé par Matt Dancho, et il est disponible dans le package correlationfunnel
Le principe du correlation funnel plot est de :
représenter graphiquement les corrélations entre les variables prédictives et la variable réponse, à l’aide du fameux correlation funnel plot
Chaque variable prédictive numérique est transformée en 4 (4 par défaut) variables qualitatives, en employant les intervalles suivants :
Et chacune de ces nouvelles variables qualitatives contient des 0 ou de 1, en fonction de la valeur quantitative initiale.
Par exemple :
library(tidyverse)
library(correlationfunnel)
# simulation de données quantitatives
set.seed(1)
age <- round(runif(n=30,min=0, max=50),0)
df1 <- tibble(age)
# affichage des données
df1
# A tibble: 30 × 1
age
<dbl>
1 13
2 19
3 29
4 45
5 10
6 45
7 47
8 33
9 31
10 3
# ℹ 20 more rows
# Binarisation de la variable age
df1_bin <- df1 %>%
binarize()
# affichage des données
df1_bin
# A tibble: 30 × 4
`age__-Inf_13` age__13_22 age__22_37.5 age__37.5_Inf
<dbl> <dbl> <dbl> <dbl>
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 1
5 1 0 0 0
6 0 0 0 1
7 0 0 0 1
8 0 0 1 0
9 0 0 1 0
10 1 0 0 0
# ℹ 20 more rows
Les bornes choisies correspondent bien aux percentiles 25, 50 et 75 :
# affichages des percentiles 25 50 et 75 :
quantile(df1$age, probs=c(0.25,0.50, 0.75))
25% 50% 75%
13.0 22.0 37.5
Une variable qualitative à K modalités est transformée en K variables contenant des 0 et des 1. Il s’agit d’une binarisation nommée One-Hot Encoding. Elle est différente de la binarisation de type Dummy Encoding qui elle transforme K modélités en K-1 variables.
Par exemple :
# creation d'une variable group
group <- rep(c("G1","G2", "G3"), times=10)
df2 <- tibble(group)
df2
# A tibble: 30 × 1
group
<chr>
1 G1
2 G2
3 G3
4 G1
5 G2
6 G3
7 G1
8 G2
9 G3
10 G1
# ℹ 20 more rows
# binarisation de la variable group
df2_bin <- df2 %>%
binarize()
df2_bin
# A tibble: 30 × 3
group__G1 group__G2 group__G3
<dbl> <dbl> <dbl>
1 1 0 0
2 0 1 0
3 0 0 1
4 1 0 0
5 0 1 0
6 0 0 1
7 1 0 0
8 0 1 0
9 0 0 1
10 1 0 0
# ℹ 20 more rows
Le coefficient de corrélation phi est défini par :
\[\phi=\frac{f_{11} * f_{00}-f_{01} * f_{10}}{\sqrt{\left(f_{11}+f_{01}\right) *\left(f_{10}+f_{00}\right) *\left(f_{00}+f_{01}\right) *\left(f_{10}+f_{11}\right)}}\]
Avec :
install.packages("correlationfunnel")
library(correlationfunnel)
Nous allons employer le dataset heart_disease
du package funModeling
, en gardant uniquement quelques variables numériques et qualitatives pour bien comprendre le fonctionnement du correlatio funnel plot.
Nous allons conserver les variables numériques age
et max_heart_rate
, et les variables qualitatives gender
, chest_pain
(type de douleurs thoracique) et has_heart_disease
(présence ou pas d’une pathologie cardiaque).
Pour visualiser ce dataset, vous pouvez employer la commande View(heart_disease)
Ici, il s’agit d’explorer quelles variables prédictives sont le plus liées au fait d’avoir une pathologie cardiaque (has_heart_disease=“yes”)
library(dplyr)
library(funModeling)
# creation du jeu de données
HD <- heart_disease %>%
select(age, gender, chest_pain, max_heart_rate, has_heart_disease)
# visualisation des 6 premières lignes
head(HD)
age gender chest_pain max_heart_rate has_heart_disease
1 63 male 1 150 no
2 67 male 4 108 yes
3 67 male 4 129 yes
4 37 male 3 187 no
5 41 female 2 172 no
6 56 male 2 178 no
Dans la fonction binarize()
l’argument n_bins
correspond au nombre de catégories à créer pour les variables quantitatives. Par défaut c’est 4.
L’argument thresh_infreq
: correspond au pourcentage minimal d’observation nécessaire pour créer une catégorie pour les variables qualitatives ; par défaut c’est 1%. Par ex si 2 catégories ont chacune moins de 1% des observations, elles seront regroupées dans une même variable “Other”.
HD_binarized <- HD %>%
binarize(n_bins = 4, thresh_infreq = 0.01)
# visualisation des 6 premières lignes
head(HD_binarized)
# A tibble: 6 × 16
`age__-Inf_48` age__48_56 age__56_61 age__61_Inf gender__female gender__male
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0 0 0 1 0 1
2 0 0 0 1 0 1
3 0 0 0 1 0 1
4 1 0 0 0 0 1
5 1 0 0 0 1 0
6 0 1 0 0 0 1
# ℹ 10 more variables: chest_pain__1 <dbl>, chest_pain__2 <dbl>,
# chest_pain__3 <dbl>, chest_pain__4 <dbl>,
# `max_heart_rate__-Inf_133.5` <dbl>, max_heart_rate__133.5_153 <dbl>,
# max_heart_rate__153_166 <dbl>, max_heart_rate__166_Inf <dbl>,
# has_heart_disease__no <dbl>, has_heart_disease__yes <dbl>
Ici la variable réponse est has_heart_disease__yes
. Les corrélations sont calculées avec la fonction correlate() :
HD_binarized %>%
correlate(has_heart_disease__yes )
# A tibble: 16 × 3
feature bin correlation
<fct> <chr> <dbl>
1 has_heart_disease no -1
2 has_heart_disease yes 1
3 chest_pain 4 0.516
4 max_heart_rate -Inf_133.5 0.323
5 chest_pain 3 -0.315
6 max_heart_rate 166_Inf -0.308
7 gender female -0.277
8 gender male 0.277
9 chest_pain 2 -0.249
10 age 56_61 0.234
11 age -Inf_48 -0.203
12 max_heart_rate 153_166 -0.0983
13 chest_pain 1 -0.0888
14 age 48_56 -0.0856
15 max_heart_rate 133.5_153 0.0790
16 age 61_Inf 0.0693
HD_binarized %>%
correlate(has_heart_disease__yes ) %>%
plot_correlation_funnel()
Nous pouvons ainsi facilement appréhender que les variables les plus liées au fait d’avoir une pathologie cardiaque sont, dans l’ordre
C’est plutôt très chouette, non ?
Préparer les variables: Assurez-vous de conserver les informations utiles des champs de texte (par exemple, les champs de description). Veillez à ce que les champs de date soient convertis en données catégoriques telles que le jour de la semaine.
Supprimez les variables connues pour ne pas avoir de valeur prédictive – Par exemple, les champs d’identification.
Supprimez toutes les données non numériques et non catégoriques – Supprimez les fonctionnalités de date ou d’heure, les champs de description génériques.
Échantillonnez les données si elles sont volumineuses. Les performances peuvent devenir lentes sur des ensembles de données volumineux (de nombreuses colonnes, de nombreuses lignes et de nombreux niveaux de catégorie dans les colonnes catégoriques).
La fonction binarize()
effectue la transformation des données numériques/catégoriques en données binaires. Utilisez les paramètres suivants pour vous assurer que l’étape de corrélation se déroule bien.
Spécifiez le nombre de bacs (données numériques) – Utilisez n_bins pour contrôler le nombre de bacs dans lesquels les données numériques sont regroupées. Trop nombreux et les données deviennent excessivement discrètes.Trop peu et la tendance peut être manquée. Généralement, 4 ou 5 bacs sont suffisants.
Éliminez les catégories peu fréquentes (données catégoriques) – Utilisez thresh_infreq pour contrôler l’apparition des catégories peu fréquentes. Cela accélérera le traitement de la corrélation et évitera que la dimensionnalité (largeur des colonnes) ne devienne incontrôlable. Généralement, un seuil de 0,01 est suffisant
Traitez le déséquilibre des données : l’analyse de corrélation est sensible au déséquilibre des données. Essayez de réduire le nombre de lignes de la classe majoritaire pour obtenir une proportion de 75% à 25% entre la classe majoritaire et la classe minoritaire.
“Garbage In, Garbage Out” – Utiliser le package correlationfunnel
sur des données qui ont peu de relation ne donnera pas de bons résultats.
Si la variable réponse est de type numérique, le fait de passer par une binarisation permet d’explorer des relations non linéaires avec les variables prédictives quantitatives (contrairement au coefficient de Pearson que l’on peut retrouver dans d’autres outils qui n’évalue que les relations linéaires).
Pour plus d’informations : 👉 https://cran.r-project.org/web/packages/correlationfunnel/vignettes/key_considerations.html
Cet outil me semble vraiment très intéressant ; pour ma part, je suis convaincue, et je vais l’inclure dans mes routines d’analyse 🤩
Et vous, qu’en pensez vous ? 🤔
👉 Dites-le-moi en commentaire 🖊️
Retrouver le planning et les programmes de mes formations ici 👇👇👇
Retrouver mes propositions de services ici 👇👇👇
C’est possible en faisant un don sur la page 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.
4 réponses
Bonjours , c’est un tres bon outils aussi pour moi surtout dans les modelisation predictives . je pense qu’avec l’usage on reviendra avec d’autres commentaires ou recommandations .
Merci pour le partage .
Merci pour le partage, c’est très apprécié
Intéressant. Ça pourrait effectivement me servir pour certaines enquêtes que mes collègues font.
Merci ! 🙂
Je trouve que c’est un outil très pratique pour dégager rapidement des corrélations, beaucoup plus facile à utiliser que l’analyse multifactorielle classique avec FactoMiner par exmeple. C’est moins puissant certes, mais beaucoup plus rapide pour avoir un aperçu et ensuite “creuser” un peu plus si besoin est aevc Factominer. Merci Claire !!