4 super fonctions pour la description de vos données

  Un petit post pour vous parler de 4 nouvelles fonctions que j’ai découvertes récemment, et qui sont géniales pour faire de la description de  données. Ces quatre fonctions appartiennent au package funModeling, développé par Pablo Casas, qui est aussi l’auteur du livre “Data Science Live Book: An intuitive and practical approach to data analysis, data preparation and machine learning, suitable for all ages!” Le livre est vraiment très bien, il contient de bonnes explications et de nombreux exemples pour appliquer les fonctions du packages, (qui s’intègrent au tidyverse) et il ne coûte que 5.64 euros en version kindle ! Pour illustrer ces quatre fonctions utile à la description, je vais utiliser le jeu de données “heart_disease“, contenu dans le package “funModeling”.
library(funModeling)
    head(heart_disease)
    ##   age gender chest_pain resting_blood_pressure serum_cholestoral
    ## 1  63   male          1                    145               233
    ## 2  67   male          4                    160               286
    ## 3  67   male          4                    120               229
    ## 4  37   male          3                    130               250
    ## 5  41 female          2                    130               204
    ## 6  56   male          2                    120               236
    ##   fasting_blood_sugar resting_electro max_heart_rate exer_angina oldpeak
    ## 1                   1               2            150           0     2.3
    ## 2                   0               2            108           1     1.5
    ## 3                   0               2            129           1     2.6
    ## 4                   0               0            187           0     3.5
    ## 5                   0               2            172           0     1.4
    ## 6                   0               0            178           0     0.8
    ##   slope num_vessels_flour thal heart_disease_severity exter_angina
    ## 1     3                 0    6                      0            0
    ## 2     2                 3    3                      2            1
    ## 3     2                 2    7                      1            1
    ## 4     3                 0    3                      0            0
    ## 5     1                 0    3                      0            0
    ## 6     1                 0    3                      0            0
    ##   has_heart_disease
    ## 1                no
    ## 2               yes
    ## 3               yes
    ## 4                no
    ## 5                no
    ## 6                no</pre>
   

1. La fonction df_status

La première fonction de description qui m’a particulièrement plu, c’est “df_status” qui permet d’obtenir :
  • le nombre de valeurs nulles (q_zeros) et son pourcentage (p_zeros)
  • le nombre de valeurs manquantes (q_na) et son pourcentage (p_na)
  • le nombre de valeur infinies (q_inf) et son pourcentage (p_inf)
  • le type des variables : facteur, character, numeric, entier, etc. – le nombre de valeurs uniques.
Je trouve que c’est très intéressant d’avoir ces informations en un clin d’œil
df_status(heart_disease)
 ##                  variable q_zeros p_zeros q_na p_na q_inf p_inf    type
    ## 1                     age       0    0.00    0 0.00     0     0 integer
    ## 2                  gender       0    0.00    0 0.00     0     0  factor
    ## 3              chest_pain       0    0.00    0 0.00     0     0  factor
    ## 4  resting_blood_pressure       0    0.00    0 0.00     0     0 integer
    ## 5       serum_cholestoral       0    0.00    0 0.00     0     0 integer
    ## 6     fasting_blood_sugar     258   85.15    0 0.00     0     0  factor
    ## 7         resting_electro     151   49.83    0 0.00     0     0  factor
    ## 8          max_heart_rate       0    0.00    0 0.00     0     0 integer
    ## 9             exer_angina     204   67.33    0 0.00     0     0 integer
    ## 10                oldpeak      99   32.67    0 0.00     0     0 numeric
    ## 11                  slope       0    0.00    0 0.00     0     0 integer
    ## 12      num_vessels_flour     176   58.09    4 1.32     0     0 integer
    ## 13                   thal       0    0.00    2 0.66     0     0  factor
    ## 14 heart_disease_severity     164   54.13    0 0.00     0     0 integer
    ## 15           exter_angina     204   67.33    0 0.00     0     0  factor
    ## 16      has_heart_disease       0    0.00    0 0.00     0     0  factor
    ##    unique
    ## 1      41
    ## 2       2
    ## 3       4
    ## 4      50
    ## 5     152
    ## 6       2
    ## 7       3
    ## 8      91
    ## 9       2
    ## 10     40
    ## 11      3
    ## 12      4
    ## 13      3
    ## 14      5
    ## 15      2
    ## 16      2
 

2. La fonction profiling_num

La deuxième fonction de description est “profiling_num”, qui calcule tous les paramètres classiquement utilisés pour faire de la description de données numériques : la moyenne, la médiane, l’écart type, le coefficient de variation, les 1er et 3ème quartile, etc… ainsi les valeurs de kurtosis et de skewness pour juger de la présence d’outlier et de la symétrie de donnés. Un des points que j’apprécie, c’est qu’on n’a pas besoin de faire un subset préalable du jeu de données pour sélectionner uniquement les variables numériques. On donne en entrée le jeu de données dans sa globalité, et la fonction se débrouille !
 profiling_num(heart_disease)

    ##                 variable   mean std_dev variation_coef p_01 p_05 p_25
    ## 1                    age  54.44    9.04           0.17   35   40   48
    ## 2 resting_blood_pressure 131.69   17.60           0.13  100  108  120
    ## 3      serum_cholestoral 246.69   51.78           0.21  149  175  211
    ## 4         max_heart_rate 149.61   22.88           0.15   95  108  134
    ## 5            exer_angina   0.33    0.47           1.44    0    0    0
    ## 6                oldpeak   1.04    1.16           1.12    0    0    0
    ## 7                  slope   1.60    0.62           0.38    1    1    1
    ## 8      num_vessels_flour   0.67    0.94           1.39    0    0    0
    ## 9 heart_disease_severity   0.94    1.23           1.31    0    0    0
    ##    p_50  p_75  p_95  p_99 skewness kurtosis  iqr        range_98
    ## 1  56.0  61.0  68.0  71.0    -0.21      2.5 13.0        [35, 71]
    ## 2 130.0 140.0 160.0 180.0     0.70      3.8 20.0      [100, 180]
    ## 3 241.0 275.0 326.9 406.7     1.13      7.4 64.0   [149, 406.74]
    ## 4 153.0 166.0 181.9 192.0    -0.53      2.9 32.5 [95.02, 191.96]
    ## 5   0.0   1.0   1.0   1.0     0.74      1.5  1.0          [0, 1]
    ## 6   0.8   1.6   3.4   4.2     1.26      4.5  1.6        [0, 4.2]
    ## 7   2.0   2.0   3.0   3.0     0.51      2.4  1.0          [1, 3]
    ## 8   0.0   1.0   3.0   3.0     1.18      3.2  1.0          [0, 3]
    ## 9   0.0   2.0   3.0   4.0     1.05      2.8  2.0          [0, 4]
    ##         range_80
    ## 1       [42, 66]
    ## 2     [110, 152]
    ## 3 [188.8, 308.8]
    ## 4   [116, 176.6]
    ## 5         [0, 1]
    ## 6       [0, 2.8]
    ## 7         [1, 2]
    ## 8         [0, 2]
    ## 9         [0, 3]
 

3. La fonction plot_num

La fonction plot_num permet d’obtenir une visualisation des distributions de ces variables, là encore en un clin d’oeil !
plot_num(heart_disease)
  description statistique logiciel R Personnellement, je préfère le plot des densités, alors j’ai crée la fonction “plot_num_density”. Pour la faire tourner vous aurez besoin du package “reshape”.
  library(reshape)

    ## Warning: package 'reshape' was built under R version 3.5.1

    plot_num_density <- function (data, path_out = NA) 
    {
        wide_data = suppressMessages(melt(data))
        p = ggplot(data = wide_data,  aes(x = value)) + 
            geom_density( na.rm = T) + 
            facet_wrap(~variable, 
            scales = "free") + aes(fill = variable) + guides(fill = FALSE)
        if (!is.na(path_out)) {
            export_plot(p, path_out, "density")
        }
        plot(p)
    }

plot_num_density(heart_disease)
  description statistique logiciel R

4. La fonction “freq”

La quatrième fonction de description dont je voulais parler est la fonction “freq” qui permet d’obtenir les paramètres descriptifs des variables catégorielles ou facteurs. Pour chaque facteur, la fonction renvoie :
  • la fréquence, le pourcentage et le pourcentage cumulé de chaque modalité
  • un barplot avec les modalités ordonnées.
freq(heart_disease, c("gender", "thal"))
  description statistique avec R  
    ##   gender frequency percentage cumulative_perc
    ## 1   male       206         68              68
    ## 2 female        97         32             100
  description statistique avec R
    ##   thal frequency percentage cumulative_perc
    ## 1    3       166      54.79              55
    ## 2    7       117      38.61              93
    ## 3    6        18       5.94              99
    ## 4 <NA>         2       0.66             100

    ## [1] "Variables processed: gender, thal"
  Voilà, j’espère que ces quatre fonctions vous plairont également ! En ce qui me concerne, je les ai intégré dans mes routines d’analyses.   Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee 🙏 👉 Cliquez ici pour soutenir le blog Statistiques et Logiciel R     Note : je touche une petite commission (entre 3 et 6%) si vous passez par le liens Amazon de cet article pour acheter le livre mentionné, cela m’aide à entretenir ce blog, merci si vous le faites ! 😉  Crédit photo : StartupStockPhotos

Retrouvez ici d’autres articles “astuce” :

7 réponses

  1. Bonjour Claire.
    Je ne cesserai pas de te dire merci, franchement, pour tout ce que tu entreprends dans le but de nous simplifier la tâche dans nos analyses statistiques et bien d’autres.

  2. Bonjour,
    Merci beaucoup pour tous vos articles qui me sont très utiles.

    Une question : le package reshape a semble-t-il été remplacé par le package reshape2, et je n’arrive pas à faire fonctionner la fonction plot_num_density. Savez-vous si cette fonction que vous avez crée existe toujours?
    merci pour votre aide,
    Cordialement,
    Elsa

    1. Bonjour,

      je viens d’essayer et cela fonctionne toujours. J’utilise R version 3.6.2 (2019-12-12), funModeling_1.9.3,reshape2_1.4.3, ‘reshape’ version 0.8.8.
      J’espère que cela vous aide.
      Bonne continuation.

Laisser un commentaire

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