Correlation funnel plot : l'outil idéal pour explorer les relations avec votre variable d'intérêt principal

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

Table des matières

Principe du correlation funnel plot

Le principe du correlation funnel plot est de :

  • binariser les variables prédictives, quelles soient qualitatives ou quantitatives. C’est à dire que toutes les variables vont être transformées en plusieurs variables codées 0 ou 1.
Binarisation des variables
  • calculer les corrélations entre la variable réponse (binarisée s’il elle ne l’est pas au départ) et chaque variable explicative (prédictive) binarisée aussi, à l’aide du coefficient de corrélation phi.
Calcul du coefficient phi
  • représenter graphiquement les corrélations entre les variables prédictives et la variable réponse, à l’aide du fameux correlation funnel plot

Informations complémentaires

Binarisation des variables quantitatives

Chaque variable prédictive numérique est transformée en 4 (4 par défaut) variables qualitatives, en employant les intervalles suivants :

  • de la valeur minimale au percentile 25%
  • du percentile 25% au percentile 50% (médiane)
  • de la médiane au percentile 75%
  • du percentile 75% à la valeur max.

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  

Binarisation des variables qualitatives

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 

Calcul des corrélations

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 : 

Mise en application du correlation funnel plot

Installation

install.packages("correlationfunnel")
library(correlationfunnel) 

Dataset

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 

Conversion des variables quantitatives et qualitatives en variables binaires

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> 

Corrélations avec la variables réponse

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 

Visualisation par Correlation Funnel

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

  • chest_pain 4
  • max heart rate faibles
  • homme
  • age entre 56 et 61 ans

 

 

C’est plutôt très chouette, non ?

Recommandations de l’auteur du package

Avant la binarisation

  1. Nettoyez les données : Assurez-vous que les données catégoriques et numériques sont nettoyées pour corriger les erreurs et les valeurs manquantes.
  2. 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).

      • Utilisez thresh_infreq pour limiter le nombre de catégories apparaissant rarement.
      • Échantillonnez les données pour réduire le nombre de lignes.
      • Exécutez l’entonnoir de corrélation et sélectionnez les meilleures fonctionnalités. Augmentez les lignes avec les meilleures sélections de fonctionnalités.
      • Exécutez à nouveau l’entonnoir de corrélation sur l’ensemble de données de largeur réduite (colonnes), de hauteur plus grande (lignes).

Pendant la binarisation

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.

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

  2. É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

Avant l’étape de corrélation

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.

Après avoir tracé l’entonnoir de corrélation

“Garbage In, Garbage Out” – Utiliser le package correlationfunnel sur des données qui ont peu de relation ne donnera pas de bons résultats. 

Les avantages de la binarisation

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 

Conclusion

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  🖊️

4 réponses

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

  2. 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 !!

Laisser un commentaire

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

Vous souhaitez vous former à R, ou aux statistiques ?

Retrouver le planning et les programmes de  mes formations ici  👇👇👇 

Vous avez besoin d'un assitance pour analyser vos données ?

Retrouver mes propositions de services ici  👇👇👇 

Vous souhaitez soutenir mon travail ?​

C’est possible en faisant un don  sur la page Tipeee du blog  👇👇👇

Continuez votre lecture

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

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.