Les analyses des corrélations canoniques sont utilisés pour identifier et mesurer les associations entre deux jeux de données différents mais observés sur un même ensemble d’individus. Les données sont alors corrélées au sein même de leurs jeux de données respectifs mais également entre les deux populations.

Pour donner quelques exemples,Philippe Besse dans https://www.math.univ-toulouse.fr/~besse/Wikistat/pdf/st-m-explo-acc.pdf prend l’exemple de 40 souris dont on étudie leurs réactions biologiques à 21 acides gras hépatiques tout en voulant considérer leurs caractéristiques propres - informations retransmises par leurs gènes (120).

En psychologie, un chercheur peut être intéressé d’explorer les liaisons entre, d’un côté, les réponses d’élèves à un test psycho-métrique (type test de QI) et, d’un autre côté, leurs résultats scolaires.

En business, un manager peut lui vouloir croiser les performances de ses vendeurs avec leurs niveaux de rémunérations ou leurs primes.

Dans la banque, un banquier peut vouloir mettre en lumière la facturation de ses clients en fonction de leur taux d’équipement ou de leur usage quotidien de leur moyen de paiement (nombre de connexions à l’application, nombre de transactions, nombre de paiements par carte, nombre de retrait à un distributeur, …)

Bref, on veut explorer les relations pouvant exister entre deux groupes de variables quantitatives observées sur le même ensemble d’individus, afin d’expliquer un groupe avec l’autre.

Schématiquement, on veut, à partir de deux jeux de données X et Y, les mettre en relation pour observer toutes les corrélations possibles intra (au sein même du groupe) et inter (entre les jeux de données eux-mêmes).

  • ξ1 et η1 sont les premiers composants canoniques

  • ξ2 et η2 sont les second composants canoniques

  • ξ3 et η3 sont les second composants canoniques

Notons qu’il y a au maximum autant de composants canoniques que le nombre de variable dans le plus petit jeu de données. Ici, le dataset Y a 3 variables imposant qu’on aura au mieux 3 composantes canoniques.

1 Quelques mots d’introduction

1.1 Les packages R à charger

1.2 Brève introduction au but du jeu

Supposons que nous avons deux jeu de données X et Y.

Dans X, nous avons p variables : \(\textbf{X} = \left(\begin{array}{c}X_1\\X_2\\\vdots\\ X_p\end{array}\right)\) et q variables \(\textbf{Y} = \left(\begin{array}{c}Y_1\\Y_2\\\vdots\\ Y_q\end{array}\right)\) dans le jeu de données Y

Comme dans une ACP, nous cherchones les combinaisons linéaires existant au sein des jeux de données pour avoir des combinaisons que nous appelerons U et V où U sont les combinaisons linéaires construites sur le jeu de données X et V celles fabriquées sur le jeu de données Y.

En conséquence, \(U_{1}\) est une combinaison linéaire des p variables constituant X et \(V_{1}\) est la combinaison linéaire des q variables composant Y.

\(\begin{array}{ccc} U_1 & = & a_{11}X_1 + a_{12}X_2 + \dots + a_{1p}X_p \\ U_2 & = & a_{21}X_1 + a_{22}X_2 + \dots + a_{2p}X_p \\ & & \vdots \\ U_p & = & a_{p1}X_1 +a_{p2}X_2 + \dots +a_{pp}X_p\\ & & \\ V_1 & = & b_{11}Y_1 + b_{12}Y_2 + \dots + b_{1q}Y_q \\ V_2 & = & b_{21}Y_1 + b_{22}Y_2 + \dots +b_{2q}Y_q \\ & & \vdots \\ V_p & = & b_{p1}Y_1 +b_{p2}Y_2 + \dots +b_{pq}Y_q\end{array}\)

Nous appelerons le couple, \((U_i, V_i)\) la ième paire canonique.

Le but du jeu est alors de trouver les combinaisons linéaires qui maximisent les corrélations entre les membres de chaque variable canonique. Pour cela, il faut étudier de très près le coefficient de corrélation entre Ui et Vi:

\[\text{cov}(U_i, V_j) = \sum_{k=1}^{p} \sum_{l=1}^{q}a_{ik}b_{jl}\text{cov}(X_k, Y_l)\]

Rappelons que :

  • La variance de Ui est \[\text{var}(U_i) = \sum_{k=1}^{p}\sum_{l=1}^{p}a_{ik}a_{il}cov(X_k, X_l)\]

  • La variance de Vi est \[\text{var}(V_j) = \sum_{k=1}^{p} \sum_{l=1}^{q} b_{jk}b_{jl}\text{cov}(Y_k, Y_l)\]

D’un point de géométrique, on cherche à expliquer les combinaisons linéaires qui minimisent l’angle entre U1 et V1.

La corrélation cannonique pour le ième couple est la corrélation entre \[\rho^*_i = \frac{\text{cov}(U_i, V_i)}{\sqrt{\text{var}(U_i) \text{var}(V_i)}} \]

C’est cette quantité que l’on cherche à maximiser. Ainsi les coefficients \(a_{11}, a_{12}, \dots, a_{1p}\) et \(b_{11}, b_{12}, \dots, b_{1q}\) sont choisis afin de maximiser la corrélation canonique \(\rho^*_1\) du premier couple canonique. Autrement dit, cela revient à dire que la variance du premier couple canonique est égal à 1.

\(\text{var}(U_1) = \text{var}(V_1) = 1\)

En bref,

On veut trouver les coefficients \(a_{i1}, a_{i2}, \dots, a_{ip}\) et \(b_{i1}, b_{i2}, \dots, b_{iq}\) qui maximise la corrélation canonique \(\rho^*_i\) en prenant la contrainte :

\(\text{var}(U_i) = \text{var}(V_i) = 1\),

\(\text{cov}(U_1, U_i) = \text{cov}(V_1, V_i) = 0\),

\(\text{cov}(U_2, U_i) = \text{cov}(V_2, V_i) = 0\),

\(\vdots\)

\(\text{cov}(U_{i-1}, U_i) = \text{cov}(V_{i-1}, V_i) = 0\),

\(\text{cov}(U_1, V_i) = \text{cov}(U_i, V_1) = 0\),

\(\text{cov}(U_2, V_i) = \text{cov}(U_i, V_2) = 0\),

\(\vdots\)

\(\text{cov}(U_{i-1}, V_i) = \text{cov}(U_i, V_{i-1}) = 0\)

1.3 Chargement des données

On s’appuie sur deux jeux de données :

L’un est La performance financière des vendeurs:

  • Sales Growth

  • Sales Profitability

  • New Account Sales

L’autre est Le résultat à un test d’intelligence :

  • Test Scores as a Measure of Intelligence

  • Creativity

  • Mechanical Reasoning

  • Abstract Reasoning

  • Mathematics

dataset<-fread("sales.txt",sep=" ")

colnames(dataset) <- c("Sales_Growth", 
                  "Sales_Profitability", 
                  "New_Account_Sales", 
                  "Creativity", 
                  "Mechanical_Reasoning", 
                  "Abstract_Reasoning", 
                  "Mathematics")

summary(dataset)
##   Sales_Growth    Sales_Profitability New_Account_Sales   Creativity   
##  Min.   : 81.50   Min.   : 87.3       Min.   : 94.30    Min.   : 1.00  
##  1st Qu.: 93.55   1st Qu.: 99.5       1st Qu.: 99.08    1st Qu.: 8.25  
##  Median :100.65   Median :106.2       Median :103.15    Median :10.00  
##  Mean   : 98.84   Mean   :106.6       Mean   :102.81    Mean   :11.22  
##  3rd Qu.:105.05   3rd Qu.:114.8       3rd Qu.:106.45    3rd Qu.:14.00  
##  Max.   :110.80   Max.   :122.3       Max.   :115.30    Max.   :18.00  
##  Mechanical_Reasoning Abstract_Reasoning  Mathematics   
##  Min.   : 5.00        Min.   : 5.00      Min.   : 9.00  
##  1st Qu.:12.00        1st Qu.: 9.00      1st Qu.:21.50  
##  Median :15.00        Median :11.00      Median :31.50  
##  Mean   :14.18        Mean   :10.56      Mean   :29.76  
##  3rd Qu.:17.00        3rd Qu.:12.00      3rd Qu.:37.00  
##  Max.   :20.00        Max.   :15.00      Max.   :51.00

2 Analyse des corrélations canoniques

Découpons le jeu de données entre d’une part les résultats aux tests psychologiques et d’autre part les performances financières des vendeurs.

On aura donc bien deux tableaux distincts où X sera les performances financières des vendeurs et Y les résultats à ces tests

psych <- dataset[, 1:3]
acad <- dataset[, 4:7]

Quelques variables descriptives où l’on calcule le coefficient de corrélation et la distribution des variables (pour pourquoi pas savoir si une loi de probabilité se dessine)

ggpairs(psych)

Plus la couleur est foncée et plus la corrélation est statistiquement forte (que ce soit rouge [positif] ou bleu [négatif]). Au contraire, une couleur pale proche du blanc cassé est signe d’une absence de corrélation linéaire. Dans ce cas, le modèle semble compromis. Dans notre situation, les variables semblent présenter des niveaux de corrélations pertinents.

cormat <- round(cor(acad),2)
melted_cormat <- melt(cormat, na.rm = TRUE)

ggplot(data = melted_cormat, aes(Var2, Var1, fill = value))+
 geom_tile(color = "white")+
 scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
   midpoint = 0, limit = c(-1,1), space = "Lab",
   name="Pearson\nCorrelation") +
  theme_minimal()+ 
 theme(axis.text.x = element_text(angle = 45, vjust = 1, 
    size = 12, hjust = 1))+
 coord_fixed()

On observe les résultats des individus à un premier groupe de variables (les performances financières - X), puis à un second ensemble (les tests psychométriques).

Plus la couleur vire au bleu et plus les corrélations sont négatives - ou au contraire - plus les couleurs virent au rouge et plus les corrélations sont positives. En revanche, une couleur verte pâle est signe d’une absence de corrélation - rendant de fait notre analyse inutile.

correl=matcor(psych, acad)  
img.matcor(correl,  type    =   2)

De fait, les variables appartenant à l’ensemble X semblent très corrélées entre elles mais également avec les variables du jeu de données Y. Les variables du jeu de données Y présentent - certes des corrélations moins fortes - mais néanmoins suffisament intéressantes pour être traitées.

2.1 Estimation des corrélations canoniques

Nous avons que 3 corrélations canoniques parce que le dataset contenant le moins de variable en possède seulement 3.

Le carré de la corrélation canonique peut être interpréter exactement de la même façon que l’est le r2 d’une régression linéaire. En effet, 98.9% de la variation de U1 peut être expliqué par V1. De même, 77.11% de la variation de U2 peut être expliqué par V2 mais seulement 14.72% de la variation de U3 est expliqué par V3 (ce qui paraît faible). En conséquence, on ne s’intéresse qu’aux deux premières corrélations canoniques.

cc1 <- cc(psych, acad)
cc1$cor
## [1] 0.9944827 0.8781065 0.3836057
lapply(cc1$cor, function(x){x*x}) %>%
  as.data.frame() %>%
  set_colnames(c("1ère corrélation canonique au carré", "2ème corrélation canonique au carré", "3ème corrélation canonique au carré")) %>%
  kable("html") %>%
  kable_styling(bootstrap_options = "striped", full_width = F)
1ère corrélation canonique au carré 2ème corrélation canonique au carré 3ème corrélation canonique au carré
0.9889958 0.7710711 0.1471533

Représentons le premier couple de corrélations canoniques pour admirer la relation linéaire [98.9%] entre U1 et V1

cc <- cancor(psych, acad, set.names = c("Performance financière", "Test Psycho"))

plot(cc, smooth = TRUE, id.n = 3, ellipse.args = list(fill = TRUE), col.smooth = "blue", lwd = 3, cex.lab = 1.4, id.cex = 1.25, pch = 20, cex = 1.5) + text(-2,1.75, "1ère dimension canonique:\n    CanR=98.9%", pos = 4, cex = 1.4)

## integer(0)

Concernant le deuxième axe, on voit que la corrélation entre U2 et V2 apparaît déja comme moins parfaite et plus distendue (même s’il est reste linéaire)

plot(cc, which = 2, smooth = TRUE, id.n = 3, ellipse.args = list(fill = TRUE), col.smooth = "blue", lwd = 3, cex.lab = 1.4, id.cex = 1.25, pch = 20, cex = 1.5) +
text(-2.9,2.2, "2nd dimension canonique:\n    CanR=77.1%", pos = 4, cex = 1.4)

## integer(0)

En revanche, la 3ème dimension apparaît sans surprise comme très dispersés et la corrélation entre U3 et V3 a disparu. En effet, 85% d’U3 n’est pas expliqué par V3.

plot(cc, which = 3, smooth = TRUE, id.n = 3, ellipse.args = list(fill = TRUE), col.smooth = "blue", lwd = 3, cex.lab = 1.4, id.cex = 1.25, pch = 20, cex = 1.5) +
text(-2.9,2.2, "3ème dimension canonique", pos = 4, cex = 1.4)

## integer(0)

2.2 Les coefficients canoniques

Pour rappel, ce sont les coefficients \(a_{i1}, a_{i2}, \dots, a_{ip}\) et \(b_{i1}, b_{i2}, \dots, b_{iq}\) définis dans l’introduction qu’il faut maximiser (sous contrainte)

cc1[3:4]
## $xcoef
##                            [,1]       [,2]       [,3]
## Sales_Growth        -0.06237788 -0.1740703  0.3771529
## Sales_Profitability -0.02092564  0.2421641 -0.1035150
## New_Account_Sales   -0.07825817 -0.2382940 -0.3834151
## 
## $ycoef
##                             [,1]        [,2]        [,3]
## Creativity           -0.06974814 -0.19239132 -0.24655659
## Mechanical_Reasoning -0.03073830  0.20157438  0.14189528
## Abstract_Reasoning   -0.08956418 -0.49576326  0.28022405
## Mathematics          -0.06282997  0.06831607 -0.01133259

La première variable canonique est déterminée de cette manière :

\(U_1 = -0.0624X_{growth}-0.0209X_{profit}-0.0783X_{new}\)

L’intensité et le sens des coefficients permet de définir la contribution des variables sur la composante canonique associée. Ainsi, avoir de nouveaux clients détermine le plus la variable canonique U1 - alors que paradoxalement le profit apparaît comme plus secondaire.

\(V_1 = -0.0697Y_{create}-0.0307Y_{mech}-0.0896Y_{abstract}-0.0628Y_{math}\)

De même, V1 est déterminé majoritairement par le raisonnement abstrait. Autrement, dit un vendeur habile dans les tests de raisonnement abstrait devrait avoir de meilleures performances financières. (A vérifier en fin d’analyse)

2.3 Interprétation de chaque coefficient

Calculons les corrélations entre chaque variable et les composantes canoniques

2.3.1 Les corrélations entre les résultats financiers et les composantes canoniques

cc2 <- comput(psych, acad, cc1)
cc2[3:6]$corr.X.xscores
##                           [,1]          [,2]         [,3]
## Sales_Growth        -0.9798776  0.0006477883  0.199598477
## Sales_Profitability -0.9464085  0.3228847489 -0.007504408
## New_Account_Sales   -0.9518620 -0.1863009724 -0.243414776

En se penchant sur la première composante canonique, on voit que toutes variables contribuent très fortement à cette dernière (0.9798776 , 0.9464085 , 0.9518620) et dans le même sens. On peut affirmer que les performances financières dans leur ensemble sont constitutives de cette première composante. La seconde composante canonique révèle que le profit contribue le plus à cette dimension et que la prospection commerciale varie dans le sens opposé à la croissance et à la rentabilité. Ce qui apparaît logique du fait que la prospection commerciale peut se faire au détriment des bénéfices. A noter, cependant, que les contributions restent tout de même assez faibles pour pouvoir tirer plus d’information.

2.3.2 Les corrélations entre les tests psychométriques et les composantes canoniques

cc2[3:6]$corr.Y.yscores
##                            [,1]       [,2]        [,3]
## Creativity           -0.6383313 -0.2156981 -0.65140953
## Mechanical_Reasoning -0.7211626  0.2375644  0.06773775
## Abstract_Reasoning   -0.6472493 -0.5013329  0.57422365
## Mathematics          -0.9440859  0.1975329  0.09422619

Toutes les variables contribuent fortement à la construction de la première composante canonique. En conséquence, tous les tests psychométriques sont importants - même si les mathématiques (avec 0.9440859) s’avèrent être le test le plus discriminant. En ce qui concerne la seconde composante canonique, les contributions apparaissent comme plus faibles (donc moins porteur d’information), mais le raisonnement abstrait et la créativité vont de pair quand le mechanical reasoning et les mathématiques sont associés.

L’indicateur le plus significatif aux performances financières s’avère donc être les mathématiques comme il est le plus élevé

res.cc=cc(psych, acad)
plt.cc(res.cc)  

vare.cca <- cca(psych ~ Creativity+Mechanical_Reasoning+Abstract_Reasoning+Mathematics, data=acad)
plot(vare.cca)

# summary(vare.cca)

2.3.3 Tentative d’explication

CCA triplot interpretation using a) type I scaling and b) type II scaling.

  • Two objects (“o1”, “o2”)

  • Three quantitative explanatory variables (“Nitrate”, “Phosphate”, “Silicate”) represented by vectors (arrows) pointing in the direction of increase and extended for clarity (dashed lines)

  • Two states of a nominal (qualitative) variable, sediment type (“Sand”, “Silt”, “Clay”)

Orthogonal projections are shown as dotted red lines.

PLOT A

Object “o1” is very likely to be found in clay sediments while object “o2” is more likely to be found in sand sediments.

Perpendicular projections of object “o1” onto quantitative explanatory variables suggests it realises high values of nitrate concentration, mid-to-low values of phosphate concentration, and low values of silicate concentration.

Object “o2” realises high values of phosphate concentration, mid-range values of silicate concentration and low values of nitrate concentration.

PLOT A

Points representing response variables (“v1”, “v2”) are now the focus of interpretation. Variable “v1” is likely to reach its maximum (e.g. highest abundance) in silty sediments at high concentrations of nitrate (projection not shown), mid-to-low concentrations of silicate, and low concentrations of phosphate.Variable “v2” is likely to reach its maximum in sandy sediments, at mid-to-high phosphate concentrations, low nitrate concentrations and high silicate concentrations.

3 Muscler les résultats

3.1 Petit dictionnaire des mes lectures (à implémenter pour la suite)

Lire cet excellent papier (très synthétique) : https://ncss-wpengine.netdna-ssl.com/wp-content/themes/ncss/pdf/Procedures/NCSS/Canonical_Correlation.pdf

  • Variate Number = This is the sequence number of the canonical correlation. Remember that the first correlation will be the largest, the second will be the next to largest, and so on.

  • Canonical Correlation = The value of the canonical correlation coefficient. This coefficient has the same properties as any other correlation: it ranges between minus one and one, a value near zero indicates low correlation, and an absolute value near one indicates near perfect correlation. R-Squared

  • The square of the canonical correlation coefficient = This gives the R-squared value of fitting the Y canonical variate to the corresponding X canonical variate.

  • F-Value = The value of the F approximation for testing the significance of the Wilks’ lambda corresponding to this row and those below it. In this example, the first F-Value tests the significance of the first, second, and third canonical correlations while the second F-value tests the significance of only the second and third.

  • Num DF = The numerator degrees of freedom of the above F-ratio.

  • Den DF = The denominator degrees of freedom of the above F-ratio.

  • Prob Level This is the probability value for the above F statistic. A value near zero indicates a significant canonical correlation. A cutoff value of 0.05 or 0.01 is often used to determine significance.

  • Wilks’ Lambda for the canonical correlation is the multivariate generalization of R-Squared. The Wilks’ lambda statistic is interpreted just the opposite of R-Squared: a value near zero indicates high correlation while a value near one indicates low correlation.

3.1.1 Wilks’ Lambda [bonus]

Vérifier avant tout si il y a une relation - petite soit-elle - entre les deux jeux de données. Les deux jeux de variables sont peut-être décorrélés entre eux et ne présente aucune liaison (indépendance statistique)

Pour tester l’indépendance entre les performances financières et les résultats académiques, il faut repartir d’une régression linéaire multiple où nous devons essayer de prédire les résultats financiers [variables à expliquer] en fonction des variables explicatives - les résultats aux tests.

De facto, nous avons p régressions multiples où chaque régression multiple cherche à prédire une variable du premier groupe (le dataset X) en fonction des q variables contenus dans le dataset Y.

\(\begin{array}{ccc}X_1 & = & \beta_{10} + \beta_{11}Y_1 +\beta_{12}Y_2 + \dots +\beta_{1q}Y_q + \epsilon_1 \\ X_2 & = & \beta_{20}+ \beta_{21}Y_1 + \beta_{22}Y_2 + \dots +\beta_{2q}Y_q + \epsilon_2 \\ & & \vdots \\ X_p & = & \beta_{p0} + \beta_{p1}Y_1 + \beta_{p2}Y_2 + \dots + \beta_{pq}Y_q + \epsilon_p \end{array}\)

Dans notre cas précis, nous avons 3 variables provenant du jeu de données des performances financières que nous voulons expliquer par les 4 variables composant le jeu de données Y. Conséquemment, nous voulons tester l’hypothèse nulle que ces coefficients de régression (excepté pour les intersections) sont tous égaux à zéro. Autrement dit, le premier jeu de variables est indépendant du second jeu de données.

\(H_0: \beta_{ij} = 0;\) ( i = 1,2, , p; j = 1,2, , q)

Pour faire cela, intéressons-nous au Wilks lambda.

ev <- (1 - cc1$cor^2)

n <- dim(psych)[1]
p <- length(psych)
q <- length(acad)
k <- min(p, q)
m <- n - 3/2 - (p + q)/2

w <- rev(cumprod(rev(ev)))

d1 <- d2 <- f <- vector("numeric", k)

for (i in 1:k) {
    s <- sqrt((p^2 * q^2 - 4)/(p^2 + q^2 - 5))
    si <- 1/s
    d1[i] <- p * q
    d2[i] <- m * s - p * q/2 + 1
    r <- (1 - w[i]^si)/w[i]^si
    f[i] <- r * d2[i]/d1[i]
    p <- p - 1
    q <- q - 1
}

pv <- pf(f, d1, d2, lower.tail = FALSE)

dmat <- cbind(WilksL = w, F = f, df1 = d1, df2 = d2, p = pv) %>%
  kable("html") %>%
  kable_styling(bootstrap_options = "striped", full_width = F)

Wilks lambda pour la première composante canonique :

  • Λ = 0.00215

  • F = 87.39

  • d.f. = 12, 114

  • p < 0.0001.

Wilks lambda is a ratio of two variance-covariance matrices (raised to a certain power). If the values of these statistics are large (small p-value), then we reject the null hypothesis. In our example, we reject the null hypothesis that there is no relationship between the two sets of variables and conclude that the two sets of variables are dependent. Note also that the above null hypothesis is equivalent to testing the null hypothesis that all p canonical variate pairs are uncorrelated, or

\(H_0: \rho^*_1 = \rho^*_2 = \dots = \rho^*_p = 0 \)

Because Wilks lambda is significant and the canonical correlations are ordered from largest to smallest, we can conclude that at least \(\rho^*_1 \ne 0\).

We may also wish to test the hypothesis that the second or the third canonical variate pairs are correlated. We can do this in successive tests. Next, test whether the second and third canonical variate pairs are correlated…

\(H_0: \rho^*_2 = \rho^*_3 = 0\)

We can look again at the SAS output above. In the second row for the likelihood ratio test statistic we find L’ = 0.19524; F = 18.53; d.f. = 6, 88; p < 0.0001. From this test we can conclude that the second canonical variate pair is correlated, \(\rho^*_2 \ne 0\).

Finally, we can test the significance of the third canonical variate pair.

\(H_0: \rho^*_3 = 0\)

The third row of the SAS output contains the likelihood ratio test statistic L’ = 0.8528; F = 3.88; d.f. = 2, 45; p = 0.0278. This is also significant and so we conclude that the third canonical variate pair is correlated.

All three canonical variate pairs are significantly correlated and dependent on one another. This suggests that we may summarize all three pairs. In practice, these tests are carried out successively until you find a non-significant result. Once a non-significant result is found, you stop. If this happens with the first canonical variate pair, then there is not sufficient evidence of any relationship between the two sets of variables and the analysis may stop.

If the first pair shows significance, then you move on to the second canonical variate pair. If this second pair is not significantly correlated then stop. If it was significant you would continue to the third pair, proceeding in this iterative manner through the pairs of canonical variates testing until you find non-significant results.

4 Next steps et prochain sujet d’étude

Dans le pipeline, utilisation des analyses canoniques de corrélation pour associer une image à un mot, pour réconcilier une photo à un libellé.

Par exemple, avoir un premier jeu de données avec du texte (“chèvres”, “oies”, “voitures”, “cheval”, “chocolat”, “vache”, …) puis un second jeu de données avec des images. En utilisant une analyse canonique des corrélations, il est possible de réconcilier le label avec l’image correspondante.