Tag Archives: ACP

ACT6100, analyse non-supervisée

On avance tranquillement le cours ACT6100 d’analyse des données en actuariat. Les supports de cours sont en ligne sur https://github.com/freakonometrics/ACT6100. Cette session (mais aussi celle d’hiver) étant en distanciel, le cours est asynchrone, et je poste régulièrement des capsules vidéos. Les capsules présentant les principales méthodes d’analyse non-supervisée sont en ligne

  1. ACP (1) (PCAvideo pdf (48:42)
  2. ACP (2) video pdf (31:10)
  3. ACP (3) video pdf (47:51)
  4. ACP (4) video pdf (39:59)
  5. ACP (5) video pdf (28:53)
  6. CA (1) video pdf (38:33)
  7. CA (2) video pdf (46:51)
  8. MCA (1) video pdf (28:03)
  9. Clusters (k-means) video pdf (48:20)
  10. Clusters (CAH) video pdf (37:38)
  11. NA & Imputations (k-nn) video pdf (17:47)
  12. NA & Imputations (ACP) video pdf (15:28)

Si les liens des vidéos ne marchent pas, je renvoie vers l’ensemble des capsules du cours, ici.

D’un abus de langage…

Dans mon cours d’analyse des données, je commençais par présenter les diverses distances et normes, en particulier, celles qui dérivent d’un produit scalaire, comme la norme Euclidienne \|\boldsymbol{X}\|_{\mathbb{I}}^2=\boldsymbol{X}^\top\boldsymbol{X}, ou plus intéressante, la norme que l’on peut construire à partir d’une matrice \boldsymbol{M} symétrique définie positive, \|\boldsymbol{X}\|_{\boldsymbol{M}}^2=\boldsymbol{X}^\top\boldsymbol{M}\boldsymbol{X}. Un exemple bien connu étant la norme de Mahalanobis, ou la distance associée, où on prend pour \boldsymbol{M}  la matrice \boldsymbol{\Sigma}^{-1}\boldsymbol{\Sigma}=\text{Var}[\boldsymbol{X}]. Sauf que, par abus de langage, j’appelle aussi distance de Mahalanobis le distance obtenue en prenant pour matrice \boldsymbol{M} la matrice diagonale \boldsymbol{\Delta}_{\boldsymbol{\Sigma}}^{-1} définie par \boldsymbol{\Delta}_{\boldsymbol{\Sigma},ii}=\boldsymbol{\Sigma}_{ii}. En fait, c’est cette matrice que l’on utilise principale en analyse de données, par exemple en analyse des correspondances principales… Prenons un petit exemple, avec quelques données centrées

library(FactoMineR)
library(clusterGeneration)
library(mnormt)
n=15
S=genPositiveDefMat("unifcorrmat",dim=4)
X=round(rmnorm(n,varcov=S$Sigma)+8,2)
for(j in 1:ncol(X)) X[,j]=X[,j]-mean(X[,j])
rownames(X)=1:n
colnames(X)=LETTERS[1:4]

et seulement 4 variables. Par défaut, quand on fait une analyse en composantes principales, on va réduire les données

acp = PCA(X,scale.unit = TRUE,graph = FALSE)
fviz_pca_var(acp, col.var = "cos2")

Le fait de centrer et réduire les données fait que l’on travaille avec la matrice de corrélation (\boldsymbol{X}^\top\boldsymbol{X}, à un facteur n, ou n-1, près). D’où le cercle de corrélation qui apparaît sur la figure. Et abusivement, quand je présente l’ACP, je dis qu’on a deux manière de voir : (1) utiliser le produit scalaire et la distance usuelle (Euclidienne) sur les données centrées et réduites, (2) utiliser la distance de Mahalanobis sur les données centrées. Mon abus de langage tient du fait qu’on utilise la version avec la matrice diagonale \boldsymbol{\Delta}_{\boldsymbol{\Sigma}}^{-1} , et pas la vraie distance de Mahalanobis… En discutant avec Gabriel après mon cours de ce matin, je me suis rendu compte de la confusion possible (même si je me faisais la réflexion lors de mes enregistrements de capsules, les jours passés). Mais en réalité, faire une analyse en composantes principales avec la vraie distance de Mahalanobis n’aurait aucun sens.

Pour s’en convaincre, utilisons les données centrées et réduites,

S = var(X)
Sd = diag(diag(S))
X1 = X%*%solve(chol(Sd))
colnames(X1)=colnames(X)
var(X1)
A B C D
A 1.0000000 0.10113165 -0.88021475 0.4733021
B 0.1011316 1.00000000 0.07885109 -0.7400999
C -0.8802147 0.07885109 1.00000000 -0.5743660
D 0.4733021 -0.74009993 -0.57436600 1.0000000

x

acp1 = PCA(X1,scale.unit = FALSE,graph = FALSE)
fviz_pca_var(acp1, col.var = "cos2")

On n’a plus ici, le cercle des corrélations car la fonction ne sait pas que mes données ont été centrées et réduite au préalable… mais on a la même sortie qu’auparavant à part ça…

Si maintenant on utilise la norme de Mahalanobis, on peut là aussi tranformer les données, en notant que \boldsymbol{X}^\top\boldsymbol{M}\boldsymbol{X} peut aussi s’écrire \boldsymbol{X}^\top\boldsymbol{M}^{1/2}\boldsymbol{M}^{1/2}\boldsymbol{X} soit encore la distance euclidienne standard \tilde{\boldsymbol{X}}^\top\tilde{\boldsymbol{X}} sur les données transformées \tilde{\boldsymbol{X}}={\boldsymbol{X}}{\boldsymbol{M}^{1/2}},

S = var(X)
X2 = X%*%solve(chol(S))
colnames(X2)=colnames(X)
> var(X2)
              A             B             C             D
A  1.000000e+00 -3.582611e-17  5.307644e-16 -1.004784e-16
B -3.582611e-17  1.000000e+00 -3.021333e-16  4.164692e-17
C  5.307644e-16 -3.021333e-16  1.000000e+00 -3.649967e-16
D -1.004784e-16  4.164692e-17 -3.649967e-16  1.000000e+00

ce qui donne des données… orthogonales (pour ne pas dire indépendantes, on retrouve ici le processus de whitening, utilisé en ICA, analyse des composantes indépendantes. Et comme on a rendu les données indépendantes… l’analyse des composantes principales n’aura plus grand chose à raconter…

acp2 = PCA(X2,scale.unit = FALSE,graph = FALSE)
fviz_pca_var(acp2, col.var = "cos2")

Chaque axe explique ici pour 25% de l’inertie… bref, on ne va jamais faire une ACP avec la distance de Mahalanobis (la vraie). Elle ne va pas normaliser les variables, mais les orthonormaliser. Et pourtant, par abus de langage, je vais continuer à utiliser ce terme… Désolé…

INF7100, statistiques

La seconde partie de mon intervention sur la science des données, dans le cadre du cours INF7100 portera sur les statistiques, univariées et multivarirées. Le plan sera le suivant

  • 201: De la Statistique aux Sciences de Données pdf video (14:24)
  • 211: Fonctions Usuelles en Statistique (fonction de réparition, densité, histogramme) pdf video (28:37)
  • 221: Indicateurs Statistique: Valeur Centrale (moyenne) pdf video (32:56)
  • 222: Indicateurs Statistique: Dispersion (variance, inégalités) pdf video (22:21)
  • 223: Indicateurs Statistique: Approximations (approximation normale) pdf video (18:42)
  • 224: Indicateurs Statistique: Quantiles pdf video (24:54)
  • 231: Inférence (statistique bayésienne) pdf video (39:33)
  • 241: Tests Statistiques (1) (tests, significativité, p-value) pdf video (43:41)
  • 242: Tests Statistiques (2) (erreurs) pdf video (16:51)
  • 261: Statistiques Bivariées pdf video (25:16)
  • 271: Statistiques Multivariées: Projections pdf video (29:06)
  • 272: Statistiques Multivariées: Clusters pdf video (32:21)
  • 281: Réseaux et Graphs pdf video (32:40)
  • 291: Données Chronologiques pdf video (29:01)

 

Analyse des Correspondances et ACP

Considérons les données suivantes, correspondant à des professions au sein d’un couple. On dispose du tableau de contingence suivant

> base=read.table(
"http://freakonometrics.free.fr/epoux.csv",
sep=";",header=TRUE)
> rownames(base)=base$Nom

Classiquement, avec ce genre de données, on est habitué à utiliser la distance du chi-deux, et les contributions au chi-deux pour voir les modalités qui correspondent fortement

> M=base[1:9,2:10]
> CT=chisq.test(M)

On peut le visualiser de la manière suivante,

> mosaicplot(t(M),main="",las=2,shade=TRUE)

avec les maris en ligne, et les épouses en colonnes. Les contribution importantes sont en bleu ou rouge foncé, les couleurs correspondant respectivement à un lien ‘positif’ (probabilité jointe plus importante que le cas indépendant) ou un lien ‘négatif’ (probabilité jointe moins importante que le cas indépendant)

ou dans l’autre sens

> mosaicplot(M,main="",las=2,shade=TRUE)

mais avec la même conclusion que précédemment: il y a de fortes valeurs bleues sur la diagonale.

Autrement dit, les couples sont relativement homogènes en terme de professions.

En analyse des correspondance, on va regarder notre tableau de contingence, en ligne ou en colonne. Par exemple, on peut définir les profils lignes, qui sont des vecteurs de probabilité \boldsymbol{L}_i=\left(\frac{p_{i1}}{p_{i\cdot}},\cdots,\frac{p_{iJ}}{p_{i\cdot}}\right)\in\mathbb{R}^J

> N=M 
> L=N/apply(N,1,sum)

En notant \boldsymbol{D}_I=\text{diag}(p_{1\cdot},\cdots,p_{I\cdot}), on peut écrire \boldsymbol{L}=\boldsymbol{D}_I^{-1}\boldsymbol{N}Le barycentre de nos vecteurs de lignes est ici\overline{\boldsymbol{L}}=\left(p_{\cdot 1},\cdots,p_{\cdot J}\right)\in\mathbb{R}^J

Là encore, en notant \boldsymbol{D}_J=\text{diag}(p_{\cdot 1},\cdots,p_{\cdot J}), on peut écrire ce barycentre de manière matricielle, \overline{\boldsymbol{L}}=\mathbb{I}_{IJ}\boldsymbol{D}_J.\boldsymbol{L}_{0,i}=\boldsymbol{L}_i-\overline{\boldsymbol{L}}

> Lbar=apply(N,2,sum)/sum(N)
> matL0=t(t(L)-Lbar)

A chaque point, on a associé la fréquence (relative) comme poids, p_{i\cdot}, ce qui correspond à utiliser la matrice \boldsymbol{D}_I. Pour mesurer la distance entre deux points, on va pondérer la distance euclidienne par l’inverse des des probabilités, p_{\cdot j}, ce qui revient à utiliser la matrice \boldsymbol{D}_J^{-1}. La distance entre deux lignes estd(\boldsymbol{L}_{i_1},\boldsymbol{L}_{i_2})=\sum_{j=1}^J\frac{1}{p_{\cdot j}}\left(\frac{p_{i_1j}}{p_{i_1\cdot}}-\frac{p_{i_2j}}{p_{i_2\cdot}}\right)^2

On va alors faire une analyse en composantes principales avec ces différents poids. D’un point de vue matriciel, on va alors l’analyse spectrale de\boldsymbol{H}=\boldsymbol{D}_J^{-1/2}\boldsymbol{L}_0^{\text{T}}\boldsymbol{D}_I\boldsymbol{L}_0\boldsymbol{D}_J^{-1/2}

En particulier, on note \boldsymbol{U}_1,\cdots,\boldsymbol{U}_k les vecteurs propres, et on défini les composantes principales\boldsymbol{C}=\boldsymbol{L}_0\boldsymbol{D}_J^{-1/2}\boldsymbol{U}

La projection sur les deux premières composantes des lignes donne ici

> library(FactoMineR)
> acpL=PCA(matL0,scale.unit=FALSE,
+          row.w=(apply(N,1,sum)),
+          col.w=1/(apply(N,2,sum)))

L’idée est de visualiser le nuage des individus correspondants aux lignes. Dans un second temps, on va faire exactement pareil, mais sur les colonnes\boldsymbol{C}_j=\left(\frac{p_{1j}}{p_{\cdot j}},\cdots,\frac{p_{jI}}{p_{\cdot j}}\right)\in\mathbb{R}^I

> C=t(t(N)/apply(N,2,sum))

Le barycentre est ici\overline{\boldsymbol{C}}=\left(p_{1\cdot},\cdots,p_{I\cdot}\right)\in\mathbb{R}^I

> Cbar=apply(N,1,sum)/sum(N)
> matC0=C-Cbar

et on peut alors faire une analyse en composante principale

> acpC=PCA(t(matC0),scale.unit=FALSE,
+          row.w=(apply(N,2,sum)),
+          col.w=1/(apply(N,1,sum)))

ce qui donne, en regardant le nuage des individus,

La magie de l’analyse des correspondances est qu’on ‘peut’ représenter les deux projections des individus sur le même plan,

> matC=acpC$ind$coord
> matL=acpL$ind$coord
> plot(matC[,1:2],col="red",xlim=c(-.002,.015))
> text(matC[,1:2],rownames(matC),col="red",pos=4)
> points(matL[,1:2],col="blue")
> text(matL[,1:2],rownames(matL),col="blue")

C’est exactement ce que fait la fonction

> afc=CA(N)

Note: en réalité, si on regarde les coordonnées des lignes par ACP on obtient

acpL$ind$coord
                    Dim.1     Dim.2     Dim.3     Dim.4     Dim.5
Agriculteur (M) -0.000056 -0.000414  0.002940  0.000150  0.000011
Artisan (M)     -0.000014  0.000152 -0.000057  0.000323  0.001279
Cadres (M)      -0.000262  0.001734 -0.000015  0.000359 -0.000219
Prof_Int (M)    -0.000194  0.000450 -0.000003 -0.000504  0.000041
Employe (M)     -0.000104 -0.000317 -0.000083 -0.000188  0.000011
Ouvrier (M)     -0.000052 -0.000764 -0.000080  0.000133 -0.000141
Retraite (M)     0.007771  0.000502 -0.000001 -0.000089 -0.000065
Inactif (M)     -0.000018 -0.000150 -0.000163  0.000751 -0.000007
Inconnu(M)       0.000261 -0.000492 -0.000554  0.000398  0.000648

alors que

CA(M, graph = FALSE)$row$coord
                 Dim 1  Dim 2  Dim 3  Dim 4  Dim 5
Agriculteur (M) -0.028 -0.209  1.481  0.076  0.005
Artisan (M)     -0.007  0.077 -0.029  0.163  0.644
Cadres (M)      -0.132  0.873 -0.007  0.181 -0.110
Prof_Int (M)    -0.098  0.227 -0.001 -0.254  0.020
Employe (M)     -0.053 -0.160 -0.042 -0.095  0.006
Ouvrier (M)     -0.026 -0.385 -0.040  0.067 -0.071
Retraite (M)     3.914  0.253 -0.001 -0.045 -0.033
Inactif (M)     -0.009 -0.075 -0.082  0.378 -0.004
Inconnu(M)       0.132 -0.248 -0.279  0.201  0.327

ce qui donne un ratio constant,

acpL$ind$coord/CA(M, graph = FALSE)$row$coord
                      Dim.1       Dim.2       Dim.3       Dim.4       Dim.5
Agriculteur (M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182
Artisan (M)     0.001985182 0.001985182 0.001985182 0.001985182 0.001985182
Cadres (M)      0.001985182 0.001985182 0.001985182 0.001985182 0.001985182
Prof_Int (M)    0.001985182 0.001985182 0.001985182 0.001985182 0.001985182
Employe (M)     0.001985182 0.001985182 0.001985182 0.001985182 0.001985182
Ouvrier (M)     0.001985182 0.001985182 0.001985182 0.001985182 0.001985182
Retraite (M)    0.001985182 0.001985182 0.001985182 0.001985182 0.001985182
Inactif (M)     0.001985182 0.001985182 0.001985182 0.001985182 0.001985182
Inconnu(M)      0.001985182 0.001985182 0.001985182 0.001985182 0.001985182

qui correspond à 1/\sqrt{n}

1/sqrt(sum(M))
[1] 0.001985182

Dualité Individus / Variables en ACP

Dans le cours d’analyse des données, on va commencer l’analyse en composantes principales. Comme on l’a déjà évoqué à plusieurs reprises, il y a une dualité entre les individus dans l’espace des variables, et les variables dans l’espace des individus. Histoire de faire des dessins, on va se contenter de 3 individus, avec 3 variables,

> BD=read.table("https://perso.univ-rennes1.fr/arthur.charpentier/securite.txt",
header=TRUE)
>  M=as.matrix(BD[,2:10])
>  colnames(M)=names(BD)[2:10]
>  rownames(M)=BD$dep
>  M=M[1:3,1:3]
>  n=nrow(M)  
>  M_s=scale(M,scale=TRUE)

 

On peut commencer par visualiser les individus

Les directions principales sont ici

> U=eigen(t(M_s)%*%(M_s))$vectors

 

Les deux premières nous donne le plan principal

La projection sur le plan donne ici

Mais on peut aussi visualiser les données dans l’autre dimension.

Rappelons que les variables ont été centrées et réduites. La encore, l’analyse spectrale nous donne les vecteurs principaux (qui vont maximiser l’inertie en projection),

>  V=eigen((M_s)%*%t(M_s))$vectors

 

Là encore, on peut s’intéresser au plan principal

Là encore on peut regarder la projection dans cette dimension,

Comme on a centré et réduit nos variables, on voit apparaître le “cercle de corrélations“.

Le principe de dualité dit que l’on peut superposer les projections

 

ce qui permettra de faire une réelle analyse des données

Manipulation matricielle de données

Pour travailler un peu la manipulation de matrices, dans le cadre du cours d’analyse de données, quelques lignes de code.

La matrice de données est ici

> BD=read.table("https://perso.univ-rennes1.fr/arthur.charpentier/securite.txt",header=TRUE)
> M=as.matrix(BD[,2:10])
> colnames(M)=names(BD)[2:10]
> rownames(M)=BD$dep
> head(M[,1:5])
    infra  vols  eco crim  vma
D1  44.11 29.51 4.14 2.79 0.08
D2  45.97 26.29 3.97 4.54 0.07
D3  38.83 21.90 4.61 3.33 0.03
D4  49.68 30.11 5.28 4.54 0.07
D5  47.67 27.19 4.94 3.91 0.05
D6 109.21 77.71 6.87 5.25 0.24

La décomposition spectrale de

> round(t(M)%*%M)
       infra   vols   eco  crim vma  vvi  camb  
infra 308599 191433 29179 21290 642 7042 30951 
vols  191433 119961 17859 12967 404 4427 19335 
eco    29179  17859  2946  2042  59  648  2942  
crim   21290  12967  2042  1564  42  448  2129  
vma      642    404    59    42   2   19    62   
vvi     7042   4427   648   448  19  237   665  
camb   30951  19335  2942  2129  62  665  3200  
roul   55363  34745  5089  3792 113 1217  5612 
auto   24841  15747  2214  1676  53  545  2520

(j’ai viré les deux dernières colonnes pour des raisons de présentation) donne ici

> eigen(t(M)%*%M)
$values
[1] 4.471766e+05 1.239465e+03 3.462936e+02 1.764038e+02 1.303316e+02 6.623592e+01 2.624739e+01 1.761801e+01 1.564292e-01
 
$vectors

(etc). Pour rappel, les liens entre la diagonalisation et l’analyse spectrale se voit avec l’écriture

> P=eigen(t(M)%*%M)$vectors
> P%*%diag(eigen(t(M)%*%M)$values)%*%t(P)

Maintenant, deux remarques. Tout d’abord le lien entre la décomposition spectrale de cette matrice, et la décomposition en valeurs singulières

> sqrt(eigen(t(M)%*%M)$values)
[1] 668.7126681  35.2060415  18.6089656  13.2817097  11.4162872   8.1385454   5.1232210   4.1973809   0.3955113
> svd(M)
$d
[1] 668.7126681  35.2060415  18.6089656  13.2817097  11.4162872   8.1385454   5.1232210   4.1973809   0.3955113
 
$u
             [,1]          [,2]          [,3]          [,4]         [,5]          [,6]         [,7]         [,8]          [,9]
 [1,] -0.08156446 -0.0632514738 -2.596265e-02  0.0960587227 -0.064759395 -0.0430947134 -0.024719699 -0.074347281  0.0550356487
 [2,] -0.08087892  0.0541859480 -5.777492e-02 -0.0628249751 -0.099084701 -0.1311683858  0.083484434  0.011872601 -0.0195034904

(etc) et la décomspotion spectrale de l’autre produit matriciel

> sqrt(eigen(M%*%t(M))$values)
 [1] 6.687127e+02 3.520604e+01 1.860897e+01 1.328171e+01 1.141629e+01 8.138545e+00 5.123221e+00 4.197381e+00 3.955113e-01 7.546505e-06 6.656212e-06 5.285131e-06 4.270035e-06

(etc).

Maintenant, pour comprendre un peu mieux la recherche de composantes pricinpales, considérons les deux variables

> sM=M[,c(1,3)]
> plot(sM)

 

On a tout intérêt à centrer et réduire les variables (ou changer la métrique, comme vu en cours)

> sMcr=sM
> for(j in 1:2) sMcr[,j]=(sMcr[,j]-mean(sMcr[,j]))/sd(sMcr[,j])
> plot(sMcr)

Avant de faire des projections sur un axe, introduisons deux fonctions

> prod_scal=function(x,u){
+   ps=rep(NA,nrow(x))
+   for(i in 1:nrow(x)) ps[i]=sum(x[i,]*u)
+   return(ps)
+ }

> proj=function(x,u){
+   px=x
+   for(j in 1:length(u)){
+     px[,j]=prod_scal(x,u)/sqrt(sum(u^2))*u[j]  
+   }
+   return(px)
+ }

Par exemple, si on projette sur l’axe des abscisses,

> points(proj(sMcr,c(1,0)),col="blue")

On peut ensuite chercher la direction de l’axe qui nous donnera le nuage de points qui aura la plus grande inertie

> inertie=function(x) sum(x^2)
> Theta=seq(0,3.141592657,length=101)
> V=unlist(lapply(Theta,function(theta) inertie(proj(sMcr,c(cos(theta),sin(theta))))))
> plot(Theta,V,type='l')

> (angle=optim(0,function(theta) -inertie(proj(sMcr,c(cos(theta),
sin(theta)))))$par)
[1] 0.7853516

Visuellement, on obtient

> plot(sMcr)
> psMcr=proj(sMcr,c(cos(angle),sin(angle)))
> points(psMcr,col="blue")

https://f-origin.hypotheses.org/wp-content/blogs.dir/253/files/2016/01/proj1.png

On notera que l’axe qui donne l’inertie maximale est lié aux vecteurs propres de la décomposition spectrale (celui associé à la plus grande valeur propre)

> c(cos(angle),sin(angle))
[1] 0.7071397 0.7070738
> eigen(t(sMcr)%*%sMcr)
$values
[1] 159.64663  26.35337
 
$vectors
          [,1]       [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068  0.7071068

On continuera demain, à manipuler des matrices de données, de faire des projections, avant de commencer l’analyse en composantes principales, à proprement parler, la semaine prochaine

Analyse des Correspondances, suite

Hier soir, on voyait comment faire une analyse des correspondances à partir du tableau de contingence. Mais on peut avoir le problème autrement, à partir des individus. Certes, ces derniers ne sont pas observés (vraiment), mais peu importe.

> data(HairEyeColor)
> N = HairEyeColor[,,"Male"] + HairEyeColor[,,"Female"]
> Hair = rep(rep(rownames(N),ncol(N)),
+ as.vector(N))
> Eye =  rep(colnames(N),apply(N,2,sum))
> df = data.frame(Ind=1:sum(N),Hair,Eye)
> tail(df)
    Ind  Hair   Eye
587 587 Blond Green
588 588 Blond Green
589 589 Blond Green
590 590 Blond Green
591 591 Blond Green
592 592 Blond Green

Continue reading Analyse des Correspondances, suite

Le “cercle des corrélations” en ACP

Tout au long de l’analyse en composantes principales, nous avons parlé du “cercle des corrélations“. Cette notion est fondamentale en ACP, et je voulais insister un peu sur ce point pour le démystifier,

A chaque point-variable, on associe un point dont la coordonnée sur un axe factoriel est une mesure de la corrélation entre cette variable et le facteur. Dans l’espace de dimension p la distance des points-variables à l’origine est égale à 1. Donc par projection sur un plan factoriel les points-variables s’inscrivent dans un cercle de rayon 1 – le cercle des corrélations – et sont d’autant plus proche du bord du cercle que le pointvariable est bien représenté par le plan factoriel, c’est-à-dire que la variable est bien corrélée avec les deux facteurs constituant ce plan.

L’angle entre 2 variables, mesuré par son cosinus, est égal au coefficient de corrélation linéaire entre les 2 variables: cos(angle) = r(X1,X2)

  • si les points sont très proches (angle proche de 0) : cos(angle) = r(X1,X2) = 1 donc X1 et X2 sont très fortement corrélés positivement
  • si a est égal à 90° , cos(angle) = r(X1,X2) = 0 alors pas de corrélation linéaire entre X1 et X2
  • si les points sont opposés, a vaut 180°, cos(angle) = r(X1,X2) = -1 : X1 et X2 sont très fortement corrélés négativement

Attention, on ne peut interpréter que les variables situées au bord du cercle. En effet, seuls ces points là sont “bien” projetés, comme le rappelle le dession ci-dessous,

ACP avec XLstat, un peu de terminologie

Pour compléter (et clarifier) le premier TD, je voulais revenir sur le type d’ACP proposé sous XLstat,

Pour l’analyse de la covariance, on travaille sur les données brutes. L’analyse de Pearson propose de travailler sur les données centrées-réduites. L’analyse de Spearman est basée sur les rangs. Enfin, l’analyse polychorique propose de travailler sur les rangs normalisés. Les quatre transformations sont proposées ci-dessous,

Les rangs normalisés correspondent à l’étude d’un facteur Gaussien sous-jacent: on retrouve le quantile normal (centré-réduit) pour des seuils de 20%, 40%, 60% et 80%, c’est à dire le rang divisés par la taille de l’échantillon+1. La “robustesse” de ces deux dernières méthodes a été vu en particulier en introduisant un point aberrant dans l’échantillon.

Analyse en Composantes Principales

Les slides de la première partie sont en ligne sur mon blog. Parmi les cours en ligne, à l’agro (Grignon), de Stéphane Guidon, ou plus formalisé, des notes de cours de Joseph Gergaud.

Sinon, pour accéder aux bases de données, les codes R sont les suivants,
elections<-read.table("https://perso.univ-rennes1.fr/arthur.charpentier/election95.csv",header=TRUE,sep=";")
insecurite<-read.table("https://perso.univ-rennes1.fr/arthur.charpentier/ADD-ex-villes.txt",header=TRUE)

La base de données qui seront utilisées en TD est la base departement.xls. On pourra aussi reprendre quelques exemple mentionnés en cours, en particulier l’étude de l’express sur l’insécurité, villes.xls, ou encore la base de décathlon mentionnée en cours, decathlon.xls.

Ce premier cours sera relativement technique puisque seront présentées les principales notions sur les distances, les projections, et utilisera plusieurs résultats “classiques” d’algèbre linéaire et matricielle. En particulier, sur la décomposition en valeurs singulières, je renvoie les élèves intéressés à l’article de wikipedia (svd). Je mets aussi un lien vers des slides sur la décomposition factoriel, en liaison avec la recherche de valeurs propres, et de la décomposition en valeurs singulières.

Sinon pour quelques groupes, les TD se feront sous XLStat, qui comme on le verra, permet de générer un certain nombre de graphiques (que l’on s’attachera à commenter)