Le package GDAtools fournit quelques fonctions dédiées à la description des associations statistiques entre variables. Elles s’appuient sur des mesures de taille d’effet (dites aussi mesures d’association).

Toutes ces mesures sont construites à partir de concepts simples (corrélations, proportion de variance expliquée), elles sont bornées (entre -1 et 1 ou entre 0 et 1) et ne sont pas sensibles aux effectifs.

Les mesures d’associations globales sont les suivantes.

  • Pour la relation entre deux variables catégorielles : le V de Cramér qui, contrairement au khi-deux par exemple, n’est pas sensible aux effectifs ou au nombre de modalités des variables. Il varie entre 0 (absence d’association) et 1 (association parfaite). Mis au carré, il peut être interprété comme la part de variation partagée entre deux variables.

  • Pour la relation entre deux variables continues : les corrélations de rang de Kendall (tau) ou de Spearman (rho), qui détectent les relations monotones entre variables, et non uniquement linéaires comme c’est le cas de la corrélation linéaire de Pearson. Elles varient entre -1 et 1. Une valeur absolue de 0 indique une absence d’association, une valeur absolue de 1 un association parfaite. Le signe indique le sens de la relation.

  • Pour la relation entre une variable catégorielle et une variable continue : le carré du rapport de corrélation (eta²). Il exprime la part de la variance de la variable continue “expliquée” par la variable catégorielle et varie entre 0 et 1.

En plus des mesures d’associations globales, on utilise aussi des mesures d’associations locales, c’est-à-dire au niveau des modalités des variables.

  • Pour la relation entre deux variables catégorielles: le coefficient phi mesure l’attraction ou la répulsion dans une case d’un tableau de contingence. Il varie entre -1 et 1. Une valeur absolue de 0 indique une absence d’association, une valeur absolue de 1 un association parfaite. Il y a attraction si le signe est positif, répulsion si le signe est négatif. Mis au carré, phi, s’interprète comme la proportion de variance partagée par les deux variables binaires associées aux modalités étudiées. Contrairement à la valeur-test, phi n’est pas sensible à la taille de l’échantillon.

  • Pour la relation entre une variable catégorielle et une variable continue: la corrélation bisériale ponctuelle mesure l’amplitude de l’écart entre les moyennes de la variable continue selon que l’on appartient ou non à la modalité étudiée. Elle varie entre -1 et 1. Une valeur absolue de 0 indique une absence d’association, une valeur absolue de 1 un association parfaite. Le signe indique le sens de la relation. Mise au carré, la corrélation bisériale ponstuelle peut s’interpréter comme la proportion de variance de la variable continue “expliquée” par l’appartenance à la modalité de la variable catégorielle.

A noter que si l’on code les modalités des variables catégorielles sous la forme de variables binaires de valeurs 0 ou 1, le coefficient phi et la corrélation bisériale ponctuelle sont équivalentes au coefficient de corrélation de Pearson.

Pour plus de détails sur ces mesures de taille d’effet, voir : Rakotomalala R., « Comprendre la taille d’effet (effect size) »
 

Dans certaines fonctions de GDAtools, les mesures d’association peuvent être complétées par des tests de permutation, qui relèvent de l’inférence combinatoire et constituent une alternative non paramétrique aux tests de signification de l’inférence fréquentiste. Un test de permutation se déroule en plusieurs étapes.

  1. On calcule une mesure d’association entre les deux variables étudiées.

  2. On calcule la même mesure d’association à partir d’une version “permutée” des données, c’est-à-dire en “mélangeant” aléatoirement les valeurs de l’une des variables, afin de “casser” la relation entre les variables.

  3. On répète l’étape 2 un grand nombre de fois. On obtient ainsi une distribution empirique (par opposition avec l’utilisation d’une distribution théorique par l’inférence fréquentiste) de la mesure d’association sous l’hypothèse H0 d’absence de relation entre les deux variables.

  4. On compare le résultat de l’étape 1 avec la distribution obtenue en 3. La p-value du test de permutation est la proportion de valeurs de la distribution H0 qui sont plus extrêmes que la mesure d’association observée en 1.

Si on réalise l’ensemble des permutations possibles, le test de permutation est dit “exact”. Dans la pratique, le temps de calcul nécessaire est souvent trop important et on ne réalise qu’une partie des permutations possibles, aboutissant à un test dit “approximatif”. Dans les exemples qui suivent, le nombre de permutations est fixé à 100 pour réduire le temps de calcul, mais il est conseillé d’augmenter ce nombre pour obtenir des résultats plus précis et fiables (par exemple nperm=1000).
 

Pour illustrer les fonctions d’analyse des associations statistiques de GDAtools, nous utiliserons des données sur le cinéma. Il s’agit d’un échantillon de 1000 films sortis en France dans les années 2000, pour lesquels on connaît le budget, le genre, le pays d’origine, la labellisation “art et essai”, la sélection en festival (Cannes, Berlin ou Venise), la note moyenne des critiques intellectuels (d’après Allociné) et le nombre d’entrées en salles. Certaines de ces variables sont continues, d’autres catégorielles.

library(GDAtools)
data(Movies)
str(Movies)
'data.frame':   1000 obs. of  7 variables:
 $ Budget   : num  3.10e+07 4.88e+06 3.50e+06 1.63e+08 2.17e+07 ...
 $ Genre    : Factor w/ 9 levels "Action","Animation",..: 1 5 7 1 7 5 1 7 5 7 ...
 $ Country  : Factor w/ 4 levels "Europe","France",..: 4 2 2 1 2 2 4 4 2 4 ...
 $ ArtHouse : Factor w/ 2 levels "No","Yes": 1 1 2 1 2 1 1 1 1 1 ...
 $ Festival : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ Critics  : num  3 1 3.75 3.75 3.6 2.75 1 1 1 3 ...
 $ BoxOffice: num  1013509 24241 39376 6996996 493416 ...

Relations entre deux variables

Le package propose plusieurs fonctions pour étudier la relation statistique entre deux variables, selon la nature (catégorielle ou continue) des ces variables.

Deux variables catégorielles

La fonction assoc_twocat calcule :

  • le tableau de contingence (effectifs)
  • les pourcentages, les pourcentages-lignes et les pourcentages-colonnes
  • les effectifs théoriques, c’est-à-dire en situation d’indépendance
  • le khi-deux
  • le V de Cramér et la p-value du test de permutation correspondant
  • les résidus de Pearson
  • les coefficients phi et les p-values des tests de permutation correspondants
  • les PEM (Pourcentages de l’Ecart Maximal à l’Indépendance, voir Cibois 1993) globaux et locaux
  • un tableau récapitulatif de ces résultats
assoc.twocat(Movies$Country, Movies$ArtHouse, nperm=100)
$tables
$tables$freq
         No  Yes  Sum
Europe   39   33   72
France  212  393  605
Other     6   20   26
USA     257   40  297
Sum     514  486 1000

$tables$prop
          No   Yes   Sum
Europe   3.9   3.3   7.2
France  21.2  39.3  60.5
Other    0.6   2.0   2.6
USA     25.7   4.0  29.7
Sum     51.4  48.6 100.0

$tables$rprop
             No      Yes Sum
Europe 54.16667 45.83333 100
France 35.04132 64.95868 100
Other  23.07692 76.92308 100
USA    86.53199 13.46801 100
Sum    51.40000 48.60000 100

$tables$cprop
               No        Yes   Sum
Europe   7.587549   6.790123   7.2
France  41.245136  80.864198  60.5
Other    1.167315   4.115226   2.6
USA     50.000000   8.230453  29.7
Sum    100.000000 100.000000 100.0

$tables$expected
            No     Yes
Europe  37.008  34.992
France 310.970 294.030
Other   13.364  12.636
USA    152.658 144.342


$global
$global$chi.squared
[1] 220.1263

$global$cramer.v
[1] 0.4691762

$global$permutation.pvalue
[1] 0

$global$global.pem
[1] 59.29383

$global$GK.tau.xy
[1] 0.2201263

$global$GK.tau.yx
[1] 0.1537807


$local
$local$std.residuals
               No        Yes
Europe  0.3274474 -0.3367479
France -5.6123445  5.7717531
Other  -2.0143992  2.0716146
USA     8.4449945 -8.6848595

$local$adj.residuals
               No        Yes
Europe   0.487584  -0.487584
France -12.809366  12.809366
Other   -2.927844   2.927844
USA     14.447862 -14.447862

$local$odds.ratios
               No        Yes
Europe  1.1270813  0.8872474
France  0.1661190  6.0197809
Other   0.2751969  3.6337625
USA    11.1500000  0.0896861

$local$local.pem
              No       Yes
Europe   5.69273  -5.69273
France -51.55493  51.55493
Other  -55.10326  55.10326
USA     72.28804 -72.28804

$local$phi
                No         Yes
Europe  0.01541876 -0.01541876
France -0.40506773  0.40506773
Other  -0.09258656  0.09258656
USA     0.45688150 -0.45688150

$local$phi.perm.pval
                 No          Yes
Europe 2.761573e-01 2.761573e-01
France 1.623107e-35 0.000000e+00
Other  1.494439e-03 1.494439e-03
USA    0.000000e+00 7.219164e-43


$gather
  var.y  var.x freq  prop     rprop      cprop expected std.residuals adj.residuals         or       pem         phi    perm.pval freq.x freq.y prop.x prop.y
1    No Europe   39 0.039 0.5416667 0.07587549   37.008     0.3274474      0.487584  1.1270813   5.69273  0.01541876 2.761573e-01     72    514  0.072  0.514
2    No France  212 0.212 0.3504132 0.41245136  310.970    -5.6123445    -12.809366  0.1661190 -51.55493 -0.40506773 1.623107e-35    605    514  0.605  0.514
3    No  Other    6 0.006 0.2307692 0.01167315   13.364    -2.0143992     -2.927844  0.2751969 -55.10326 -0.09258656 1.494439e-03     26    514  0.026  0.514
4    No    USA  257 0.257 0.8653199 0.50000000  152.658     8.4449945     14.447862 11.1500000  72.28804  0.45688150 0.000000e+00    297    514  0.297  0.514
 [ reached 'max' / getOption("max.print") -- omitted 4 rows ]


La fonction ggassoc_crosstab présente le tableau de contingence sous forme graphique, avec des rectangles dont la surface correspond aux effectifs et le gradient de couleurs aux attractions/répulsions (coefficients phi). Le V de Cramér peut être affiché dans un angle du graphique. Ici, le label “art et essai” est nettement sur-représenté parmi les films français et sous-représenté parmi les films étatsuniens.

ggassoc_crosstab(Movies, ggplot2::aes(x=Country, y=ArtHouse), max.asso=0.8)

La fonction ggassoc_phiplot propose une autre manière de représenter les attractions/répulsions. La largeur des rectangles correspond aux effectifs de la variable x, leur hauteur aux coefficients phi. Les rectangles sont colorés en noir lorsqu’il y a attraction, en blanc lorsqu’il y a répulsion.

ggassoc_phiplot(Movies, ggplot2::aes(x=Country, y=ArtHouse))

Une variable catégorielle et une variable continue

La fonction assoc_catcont calcule :

  • le rapport de corrélation au carré (eta²) et la p-value du test de permutation correspondant
  • les corrélations bisériales ponctuelles et les p-values des tests de permutation correspondants
assoc.catcont(Movies$Country, Movies$Critics, nperm=100)
$eta.squared
[1] 0.0169216

$permutation.pvalue
[1] 3.353028e-07

$cor
Europe France  Other    USA 
 0.011  0.102  0.036 -0.128 

$cor.perm.pval
      Europe       France        Other          USA 
3.538843e-01 8.416497e-04 1.311516e-01 3.906333e-05 


La fonction ggassoc_boxplot représente la relation entre les variables sous forme de boîtes à moustaches (box-plots) et/ou de distributions “en violons”. La valeur de l’eta² est affichée dans un angle du graphique.

ggassoc_boxplot(Movies, ggplot2::aes(x=Country, y=Critics))

Deux variables continues

La fonction assoc_twocont calcule les corrélations de rang de Kendall et de Spearman et la corrélation linéaire de Pearson, ainsi que les p-values des tests de permutation correspondants.

assoc.twocont(Movies$Budget, Movies$BoxOffice, nperm=100)
                     pearson  spearman   kendall
value              0.6053018 0.7084613 0.5184719
permutation.pvalue 0.0000000 0.0000000 0.0000000


La fonction ggassoc_scatter représente la relation entre les deux variables sous forme d’un nuage de points, avec une approximation par lissage (avec la méthode de “Generalized Additive Model”). Le tau de Kendall est affiché dans un angle du graphique.

ggassoc_scatter(Movies, ggplot2::aes(x=Budget, y=BoxOffice))

Relations entre une variable Y et un ensemble de variables X

Bien souvent, on n’étudie pas seulement deux variables, mais un ensemble plus important de variables. Lorsqu’une de ces variables a le statut de variable “à expliquer”, on utilise généralement des modèles de régression ou, éventuellement, des modèles d’apprentissage surpervisé (voir la vignette du package moreparty pour un exemple). Il est cependant indispensable de bien connaître l’ensemble des relations bivariées du jeu de données avant de passer à une approche “toute chose égale par ailleurs”.

On notera d’ailleurs que si on fait ce travail de manière minutieuse, en y ajoutant éventuellement l’analyse descriptive des relations entre trois ou quatre variables, on s’aperçoit souvent que le surplus de connaissance apporté par les modèles de régression est assez limité.

La fonction assoc.yx calcule l’association globale entre Y et chacune des variables de X, ainsi que pour toutes les paires de variables de X.

assoc.yx(Movies$BoxOffice, Movies[,-7], nperm=100)
$YX
  variable       measure association permutation.pvalue
1    Genre          Eta2       0.173              0.000
2 ArtHouse          Eta2       0.075              0.000
3  Country          Eta2       0.048              0.000
4   Budget Kendall's tau       0.518              0.000
5  Critics Kendall's tau       0.006              0.474
6 Festival          Eta2       0.000              0.728

$XX
   variable1 variable2       measure association permutation.pvalue
1      Genre  ArtHouse    Cramer's V       0.554              0.000
2    Country  ArtHouse    Cramer's V       0.469              0.000
3      Genre   Country    Cramer's V       0.275              0.000
4   ArtHouse  Festival    Cramer's V       0.229              0.000
5     Budget   Country          Eta2       0.287              0.000
6     Budget     Genre          Eta2       0.281              0.000
7   ArtHouse   Critics          Eta2       0.236              0.000
8     Budget  ArtHouse          Eta2       0.181              0.000
9      Genre   Critics          Eta2       0.090              0.000
10  Festival   Critics          Eta2       0.041              0.000
11    Budget   Critics Kendall's tau      -0.178              0.000
12     Genre  Festival    Cramer's V       0.183              0.000
13   Country   Critics          Eta2       0.017              0.000
14    Budget  Festival          Eta2       0.003              0.094
15   Country  Festival    Cramer's V       0.035              0.783


Les fonctions catdesc et condesc permettent de rentrer plus dans le détail des relations, en passant au niveau des modalités.

catdesc traite les cas où Y est une variable catégorielle. Pour une variable catégorielle X1, elle calcule, pour une modalité de Y et une modalité de X1 données :

  • le pourcentage de la modalité de Y dans la modalité de X1
  • le pourcentage de la modalité de X1 dans la modalité de Y
  • le pourcentage de la modalité de X1 dans l’ensemble de l’échantillon
  • le coefficient phi

Les résultats sont triés par coefficient phi décroissant et peuvent être filtrés pour ne conserver que les associations supérieures à un seuil donné (en valeur absolue).

Pour une variable continue X2, pour une modalité de Y donnée, elle calcule :

  • la médiane de X2 dans la modalité de Y
  • la médiane de X2 dans l’ensemble de l’échantillon
  • la dispersion de X2 dans la modalité de Y
  • la dispersion de X2 dans l’ensemble de l’échantillon
  • la corrélation bisériale ponctuelle

La dispersion est mesurée par l’écart absolu médian (MAD), c’est-à-dire la médiane des écarts absolus par rapport à la médiane. La médiane et le MAD sont des indicateurs dits “robustes”, non sensibles aux valeurs aberrantes.

catdesc(Movies$Festival, Movies[,-5])$bylevel$Yes
$categories
          categories pct.ycat.in.xcat pct.xcat.in.ycat pct.xcat.global    phi
2       ArtHouse.Yes            0.140            0.883           0.486  0.229
3        Genre.Drama            0.149            0.468           0.241  0.153
9        Genre.Other            0.115            0.039           0.026  0.024
10    Country.Europe            0.097            0.091           0.072  0.021
11    Country.France            0.081            0.636           0.605  0.019
12     Genre.ComDram            0.087            0.169           0.149  0.016
14      Genre.Action            0.079            0.169           0.165  0.003
16     Country.Other            0.077            0.026           0.026  0.000
18       Genre.SciFi            0.061            0.039           0.049 -0.013
23       Country.USA            0.064            0.247           0.297 -0.032
24   Genre.Animation            0.022            0.013           0.046 -0.046
25      Genre.Horror            0.000            0.000           0.025 -0.046
26 Genre.Documentary            0.026            0.026           0.077 -0.055
27      Genre.Comedy            0.027            0.078           0.222 -0.100
29       ArtHouse.No            0.018            0.117           0.514 -0.229

$continuous.var
  variables median.x.in.ycat median.x.global mad.x.in.ycat mad.x.global    cor
1   Critics              3.5             2.9           0.6          0.6  0.204
3 BoxOffice         236910.7        138608.8      212598.2     137253.1  0.008
5    Budget        7689956.0       7040470.9     4865250.9    5920656.2 -0.057


condesc traite les cas où Y est une variable continue. Pour une variable catégorielle X1, elle calcule :

  • la médiane de Y dans la modalité de X1
  • la médiane de Y dans l’ensemble de l’échantillon
  • la dispersion de Y dans la modalité de X1
  • la dispersion de Y dans l’ensemble de l’échantillon
  • la corrélation bisériale ponctuelle

Les résultats sont triés par corrélation bisériale ponctuelle décroissante et peuvent être filtrés pour ne conserver que les associations supérieures à un seuil donné (en valeur absolue).

Pour les variables continues de X, elle calcule le tau de Kendall.

condesc(Movies$BoxOffice, Movies[,-7], nperm=100)
$variables
  variable       measure association permutation.pvalue
1    Genre          Eta2       0.173              0.000
2 ArtHouse          Eta2       0.075              0.000
3  Country          Eta2       0.048              0.000
4   Budget Kendall's tau       0.518              0.000
5  Critics Kendall's tau       0.006              0.303
6 Festival          Eta2       0.000              0.694

$categories
        categories median.y.in.xcat median.y.global mad.y.in.xcat mad.y.global    cor
9      Genre.SciFi           944784          138609        853626       137253  0.294
14     ArtHouse.No           298718          138609        257715       137253  0.274
2  Genre.Animation           954956          138609        853018       137253  0.211
13     Country.USA           356692          138609        286508       137253  0.192
1     Genre.Action           291945          138609        247538       137253  0.087
10  Country.Europe           153755          138609        150015       137253  0.068
17    Festival.Yes           228749          138609        207635       137253  0.008
5     Genre.Comedy           230615          138609        210550       137253  0.004
3      Genre.Other           249037          138609        231954       137253 -0.005
16     Festival.No           129629          138609        127957       137253 -0.008
12   Country.Other            64893          138609         46042       137253 -0.013
8     Genre.Horror           293118          138609        176131       137253 -0.015
 [ reached 'max' / getOption("max.print") -- omitted 5 rows ]


La fonction darma présente les résultats sous une forme proche de celle d’un tableau de résultats d’une régression.

Lorsque la variable Y est continue, la fonction calcule :

  • pour les variables de X continues, le tau de Kendall et la p-value du test de permutation correspondant
  • pour les modalités des variables de X catégorielles, la médiane de Y dans la modalité, la corrélation bisériale ponctuelle et la p-value du test de permutation correspondant
darma(Movies$BoxOffice, Movies[,-7], nperm=100)
variable category median association perm.pvalue
Budget NA 0.518 0.000
Genre Action 301483.7 0.087 0.002
Animation 990790.2 0.211 0.000
Other 254002.8 -0.005 0.479
ComDram 96221.7 -0.114 0.000
Comedy 236703.8 0.004 0.431
Documentary 13823.2 -0.108 0.000
Drama 51111.1 -0.162 0.000
Horror 296015.2 -0.015 0.306
SciFi 989158.5 0.294 0.000
Country Europe 161441.5 0.068 0.012
France 82312.8 -0.211 0.000
Other 64304.0 -0.013 0.368
USA 366233.7 0.192 0.000
ArtHouse No 307344.0 0.274 0.000
Yes 47084.8 -0.274 0.000
Festival No 134006.6 -0.008 0.345
Yes 236910.7 0.008 0.349
Critics NA 0.006 0.421


Lorsque la variable Y est catégorielle, la fonction calcule :

  • pour les variables de X continues, la corrélation bisériale ponctuelle et la p-value du test de permutation correspondant
  • pour les modalités des variables de X catégorielles, le pourcentage de Y dans la modalité, le coefficient phi et la p-value du test de permutation correspondant.
darma(Movies$Festival, Movies[,-5], target=2, nperm=100)
variable category percent association perm.pvalue
Budget NA -0.057 0.087
Genre Action 7.9 0.003 0.500
Animation 2.2 -0.046 0.072
Other 11.5 0.024 0.215
ComDram 8.7 0.016 0.347
Comedy 2.7 -0.100 0.001
Documentary 2.6 -0.055 0.026
Drama 14.9 0.153 0.000
Horror 0.0 -0.046 0.089
SciFi 6.1 -0.013 0.318
Country Europe 9.7 0.021 0.276
France 8.1 0.019 0.316
Other 7.7 0.000 0.522
USA 6.4 -0.032 0.177
ArtHouse No 1.8 -0.229 0.000
Yes 14.0 0.229 0.000
Critics NA 0.204 0.000
BoxOffice NA 0.008 0.776

Relations entre toutes les variables d’un ensemble

Pour finir, les fonctions ggassoc_* sont prévues pour pouvoir s’intégrer dans les matrices de graphiques du package GGally. Il est donc possible de les utiliser pour représenter dans un seul graphique l’ensemble des relations bivariées d’un groupe de variables.

library(GGally)
ggpairs(Movies,
        lower = list(continuous = ggassoc_scatter,
                     combo = ggassoc_boxplot,
                     discrete = ggassoc_crosstab),
        upper = list(continuous = ggassoc_scatter,
                     combo = ggassoc_boxplot,
                     discrete = ggassoc_crosstab),
        diag = list(continuous = wrap("diagAxis", gridLabelSize = 3),
                           discrete = wrap("diagAxis", gridLabelSize = 3)))