0% ont trouvé ce document utile (0 vote)
2 vues82 pages

Analyse en Composantes Principales (ACP)

L'analyse en composantes principales (ACP) est une technique exploratoire utilisée pour résumer et visualiser des données en réduisant leur dimensionnalité tout en préservant l'information essentielle. Elle est particulièrement utile pour analyser des tableaux d'individus et de variables quantitatives, permettant d'identifier des relations entre les variables et des similarités entre les individus. L'ACP est souvent utilisée comme prétraitement avant d'appliquer des techniques de machine learning et est renforcée par des représentations graphiques qui facilitent l'interprétation des résultats.

Transféré par

Oumaima Ghali
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
2 vues82 pages

Analyse en Composantes Principales (ACP)

L'analyse en composantes principales (ACP) est une technique exploratoire utilisée pour résumer et visualiser des données en réduisant leur dimensionnalité tout en préservant l'information essentielle. Elle est particulièrement utile pour analyser des tableaux d'individus et de variables quantitatives, permettant d'identifier des relations entre les variables et des similarités entre les individus. L'ACP est souvent utilisée comme prétraitement avant d'appliquer des techniques de machine learning et est renforcée par des représentations graphiques qui facilitent l'interprétation des résultats.

Transféré par

Oumaima Ghali
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

1 Analyse en composantes principales (ACP)

L’analyse en composantes principales (ACP) est une technique exploratoire très populaire.

Selon les points de vue, on peut la considérer : comme une technique factorielle où l’on essaie

de résumer ou regrouper les descripteurs dans leurs dimensions les plus

importantes représentées par des variables synthétiques appelées composantes ; comme une

technique de visualisation où l’on essaie de préserver les proximités entre les individus dans un

espace de représentation réduit ; comme une technique de compression de l’information ; etc.

Le succès de l’ACP repose en très grande partie sur la richesse des représentations graphiques

qu’elle propose. Elle sont accompagnées d’outils d’aide à l’interprétation qui permettent de saisir

la teneur des composantes (facteurs, axes factoriels) mises en évidence. Les très nombreux

exemples illustratifs que l’on trouve ici ou là soulignent ses propriétés descriptives sur des jeux

de données de taille réduite, elles permettent de mettre en relation les résultats observés avec

des connaissances du domaine. Nous ne dérogerons pas à cette règle.

Mais le champ d’application de l’ACP est plus large. Elle joue un rôle important comme outil de

défrichage des grandes bases de données, tant en nombre d’observations que de variables. En

réduisant la dimensionnalité avec une perte d’information contrôlée, elle peut constituer une

solution de prétraitement privilégiée avant l’utilisation des techniques de machine learning. Son

Méthodes Factorielles 9
ACP 1
rôle complémentaire par rapport aux techniques de classification automatique (clustering) en

particulier est souligné dans la littérature (Lebart et al., 2000 ; section 2.4).

1.1 Principe de l’analyse en composantes principales

1.1.1 Tableau individus-variables

L’analyse en composantes principales traite les tableaux individus-variables, lesquelles sont

toutes quantitatives. Nous reprenons le jeu de données « Autos ». Il décrit les (p = 6)

caractéristiques de (n = 18) véhicules des années 70.

Sous Python, à l’aide de la librairie Pandas, nous chargeons la feuille « DATA_ACP_ACTIF » du

fichier « Data_Methodes_Factorielles.xlsx ». Nous affichons les propriétés de la base et la

matrice des données.

#chargement -- index_col = 0 pour indiquer que la colonne n°0 est un label


import pandas
D = pandas.read_excel("Data_Methodes_Factorielles.xlsx",sheet_name="DATA_ACP_ACTIF",index_col=0)

#affichage des caractéristiques de la base


print([Link]())

<class '[Link]'>
Index: 18 entries, Alfasud TI to Lada 1300
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 CYL 18 non-null int64
1 PUISS 18 non-null int64
2 LONG 18 non-null int64
3 LARG 18 non-null int64
4 POIDS 18 non-null int64
5 VMAX 18 non-null int64
dtypes: int64(6)
memory usage: 1008.0+ bytes
None

#affichage de la matrice des données


print(D)

CYL PUISS LONG LARG POIDS VMAX


Modele
Alfasud TI 1350 79 393 161 870 165
Audi 100 1588 85 468 177 1110 160
Simca 1300 1294 68 424 168 1050 152
Citroen GS Club 1222 59 412 161 930 151
Fiat 132 1585 98 439 164 1105 165

Méthodes Factorielles 10
ACP 2
Lancia Beta 1297 82 429 169 1080 160
Peugeot 504 1796 79 449 169 1160 154
Renault 16 TL 1565 55 424 163 1010 140
Renault 30 2664 128 452 173 1320 180
Toyota Corolla 1166 55 399 157 815 140
Alfetta 1.66 1570 109 428 162 1060 175
Princess 1800 1798 82 445 172 1160 158
Datsun 200L 1998 115 469 169 1370 160
Taunus 2000 1993 98 438 170 1080 167
Rancho 1442 80 431 166 1129 144
Mazda 9295 1769 83 440 165 1095 165
Opel Rekord 1979 100 459 173 1120 173
Lada 1300 1294 68 404 161 955 140

Les variables sont : CYL (cylindrée en cm3), PUISS (puissance en chevaux din), LONG (longueur

en cm), LARG (largeur en cm), POIDS (poids en kg), VMAX (vitesse maximale en km/h).

Dans ce chapitre, nous notons 𝑋 = (𝑥𝑖𝑗 ) cette matrice composée des observations (i = 1, …, n)

et variables (j = 1, …, p) actives, dans le sens où elles vont participer aux calculs lors de la

construction du repère factoriel.

Dans notre base, (𝑥12 = 79) correspond à la puissance (PUISS) de l’Alfasud TI.

Les questions qui viennent naturellement à l’esprit à la lecture de ce type de tableau sont :

− Quels sont les véhicules qui se ressemblent ? Qui s’opposent ? Sur quelles caractéristiques

(variables) sont fondées ces ressemblances et dissemblances.

− Quelles sont les relations entre les variables. A priori, surtout pour des véhicules de cette

époque où il n’y avait pas (très rarement) de turbo, la cylindrée et la puissance sont

certainement positivement corrélées. Mais qu’en est-il des autres ?

− Pour les férus d’automobiles, nous savons qu’elles sont subdivisées en segments (citadines,

polyvalentes, familiales, routières, …). Est-ce qu’il est possible de discerner cette typologie

naturelle d’une manière ou d’une autre ? Dans une représentation graphique

éventuellement ?

Il y a deux manières complémentaires d’appréhender l’information de ce type de tableau

individus-variables : étudier la proximité entre les individus d’une part, analyser les liaisons

entre les variables d’autre part.

Méthodes Factorielles 11
ACP 3
1.1.2 Analyse des proximités entre individus

[Link] Représentation dans le plan (p = 2 variables)

Contentons-nous de traiter les variables CYL et PUISS dans un premier temps. Nous pouvons

représenter les observations dans le plan.

#importer la librairie graphique


import [Link] as plt

#préparer le graphique
fig, ax = [Link](figsize=(10,10))
[Link]([Link],[Link],"wo")
[Link]([1000,3000,50,140])
ax.set_xlabel("CYL")
ax.set_ylabel("PUISS")

#ajouter les labels des véhicules


for v in [Link]:
[Link]([Link][v],[Link][v],v)

#faire afficher
[Link]()

Figure 1 - ACP - Données "Autos" - Nuage de points (CYL vs. PUISS)

Méthodes Factorielles 12
ACP 4
Dans ce repère, nous pouvons distinguer plusieurs informations très facilement :

− Les deux variables (CYL, PUISS) sont fortement liées positivement. Quand la cylindrée

augmente, la puissance croît également.

− L’Opel Rekord et la (Ford) Taunus 2000 présentent des caractéristiques similaires. Ces

véhicules sont en concurrence frontale sur le marché.

− La Lada 1300 et la Simca 1300 présentent des propriétés strictement identiques, raison

pour laquelle ils se superposent dans le graphique. Quand on connaît un peu leur genèse,

on n’est pas vraiment étonné.

− Les Renault 30 et Toyota Corolla en revanche sont complètement opposés (gros moteur

puissant vs. petit moteur anémique).

Remarque : Deux variables sont liées lorsque le nuage de points associé forme une pente,

positive ou négative. Dans ces différentes configurations ci-dessous (Figure 2) : (A) correspond

à une liaison positive ; (B), (C) et (D) correspondent à une absence de liaison, quand la variable

en abscisse varie, celle en ordonnée reste constante en moyenne. On s’intéresse principalement

aux liaisons linéaires ici.

(A) (B)

(D)
(C)

Figure 2 - Types de liens entre deux variables quantitatives

Le graphique (CYL, PUISS) ne fait que révéler des informations contenues dans les données.

Nous aurions pu faire les mêmes constations en triant le tableau selon la cylindrée, mais de

manière moins avenante reconnaissons-le.

Méthodes Factorielles 13
ACP 5
#afficher les deux variables en triant selon CYL
Dbis = D.sort_values(by="CYL",ascending=True)[['CYL','PUISS']]
print(Dbis)

CYL PUISS
Modele
Toyota Corolla 1166 55
Citroen GS Club 1222 59
Lada 1300 1294 68
Simca 1300 1294 68
Lancia Beta 1297 82
Alfasud TI 1350 79
Rancho 1442 80
Renault 16 TL 1565 55
Alfetta 1.66 1570 109
Fiat 132 1585 98
Audi 100 1588 85
Mazda 9295 1769 83
Peugeot 504 1796 79
Princess 1800 1798 82
Opel Rekord 1979 100
Taunus 2000 1993 98
Datsun 200L 1998 115
Renault 30 2664 128

[Link] Représentation lorsque (p > 2) variables

Lorsque (p = 3), un graphique en 3 dimensions reste gérable, même s’il est moins lisible. Au-

delà, nous sommes démunis. Quand elles ne sont pas trop nombreuses, on utilise souvent les

« pairplot » qui sont constitués de nuages de points des variables prises deux à deux. Espérer y

déceler des informations fines sur les proximités entre les individus est illusoire. Lire plusieurs

cadrans simultanément n’est pas facile, et étiqueter les observations rendrait le tout totalement

illisible. Ce type de graphique sert surtout à effectuer un diagnostic rapide des données :

identifier les configurations incongrues (des blocs dans les observations par exemple), les

liaisons fortes, ou encore la présence de points atypiques.

Pour les données « Autos », nous observons (Figure 3) que certaines variables sont fortement

liées [(CYL, PUISS), (LONG, LARG, POIDS)]. Et qu’une observation se démarque des autres par

une inflation des valeurs de cylindrée, puissance, vitesse maximum. Après inspection des

données, on se rend compte qu’il s’agit de la Renault 30, voiture de luxe française emblématique

des années 70. Elle se positionne différemment par rapport aux autres automobiles.

Méthodes Factorielles 14
ACP 6
Sous Python, nous utilisons la librairie « seaborn » pour réaliser un graphique potable en une

ligne de commande (Figure 3).

#librairie graphique
import seaborn as sns

#pairplot
[Link](D)

Figure 3 - ACP - Données "Autos" - Pairplot

L’analyse en composantes principales vise à réduire la dimensionnalité en créant des variables

synthétiques, combinaisons linéaires des variables originelles, en nombre réduit (𝒒 ≪ 𝑝), tout

en préservant au mieux l’information. On comprend l’idée. Mais encore faut-il pouvoir :

Méthodes Factorielles 15
ACP 7
(1) définir et mesurer l’information véhiculée par les données ;
(2) quantifier la qualité de restitution du nouvel espace de représentation .

[Link] Distance entre individus et inertie

Dans la suite de cette section, nous nous en tenons au traitement des (p = 2) variables CYL et

PUISS dans les exemples pour appréhender plus facilement les concepts manipulés (objet Dbis

dans le code Python).

Distance euclidienne. La distance permet de mesure le degré d’éloignement entre les individus.

La plus usuelle est la distance euclidienne. Entre deux individus (i1) et (i2), elle est définie comme

suit :

𝑝
2
𝑑(𝑖1 , 𝑖2 ) = √∑(𝑥𝑖1 𝑗 − 𝑥𝑖2𝑗 )
𝑗=1

Aux fins d’illustrations, calculons les distances entre la « Audi 100 » et deux de ses voisins, la

« Fiat 132 » et la « Mazda 9295 ».

#librairie numpy pour les manipulations matricielles


import numpy

#distance entre l'Audi et la Fiat


[Link]([Link](([Link]['Audi 100']-[Link]['Fiat 132'])**2))

13.341664064126334

#distance entre l'Audi et la Mazda


[Link]([Link](([Link]['Audi 100']-[Link]['Mazda 9295'])**2))

181.01104938649465

Les résultats ne correspondent pas à l’impression visuelle ci-dessus (Figure 3). Contrairement à

ce que l’on perçoit, l’Audi serait nettement plus proche de la Fiat que de la Mazda ?

Distance euclidienne pondérée. Le hic vient de la différence d’unités entre les variables. La

cylindrée est exprimée en cm3, la puissance en chevaux DIN. Les valeurs n’ont absolument pas

la même amplitude. Les outils graphiques font une mise à l’échelle automatique sur l’étendue

(max – min) qui masque cette disparité. Pour retrouver un mécanisme similaire dans le calcul

Méthodes Factorielles 16
ACP 8
des distances, une solution simple consiste à réduire les variables c.-à-d. à les diviser par leurs

écarts-type respectifs. Cela revient à utiliser une distance euclidienne pondérée par l’inverse de

la variance.

𝑝
1 2
𝑑(𝑖1, 𝑖2 ) = √∑ 2 (𝑥𝑖1 𝑗 − 𝑥𝑖2 𝑗 )
𝜎𝑗
𝑗=1

Où 𝜎𝑗2 est l’estimation biaisée de la variance :

𝑛
1 2
𝜎𝑗2 = ∑(𝑥𝑖𝑗 − 𝑥̅𝑗 )
𝑛
𝑖=1

Et 𝑥̅𝑗 est la moyenne de la variable (Xj) :

𝑛
1
𝑥̅𝑗 = ∑ 𝑥𝑖𝑗
𝑛
𝑖=1

Revenons à notre exemple ci-dessus. Nous calculons tout d’abord les écarts-type des variables

puis nous appliquons la nouvelle formule de la distance.

#matrice X numpy – plus facile à manipuler


X = [Link]

#écarts-type des variables CYL et PUISS


sigmas = [Link](X,axis=0,ddof=0)
print(sigmas)

[363.39449027 19.80218531]

#distance pondérée entre l'Audi et la Fiat


[Link]([Link]((1/sigmas**2)*([Link]['Audi 100']-[Link]['Fiat 132'])**2))

0.6565451047185447

#distance entre l'Audi et la Mazda


[Link]([Link]((1/sigmas**2)*([Link]['Audi 100']-[Link]['Mazda 9295'])**2))

0.5082182304292723

Les résultats sont plus conformes à l’intuition visuelle, l’Audi est plus proche de la Mazda que de

la Fiat au regard des caractéristiques de cylindrée et de puissance (Figure 1).

Méthodes Factorielles 17
ACP 9
Remarque sur la correction par les écarts-type. Cette correction est quasi-automatique en

analyse en composantes principales, on parle alors d’ACP normée. Elle est justifiée dans la

plupart des cas. Mais il faut quand-même rester prudent. Si elles sont exprimées dans les mêmes

unités (ex. des notes attribuées à des critères), ou du moins mesurées sur des échelles

similaires, il est parfois intéressant de les traiter nativement pour que les variables qui

présentent une amplitude supérieure pèsent davantage dans les calculs.

Inertie – Version 1. La quantité d’information contenue dans un jeu de données peut être

exprimée par l’inertie. Elle indique la dispersion totale des données. Elle peut être définie par la

moyenne des carrés des distances entre paires d’observations.

𝑛 𝑛
1
𝐼𝑝 = ∑ ∑ 𝑑 2 (𝑖1 , 𝑖2 )
2𝑛2
𝑖1 =1 𝑖2 =1

Sous Python, nous calculons l’inertie sur les donnes (CYL, PUISS) en effectuant une double

boucle de manière à bien détailler les étapes. L’inertie totale est égale à 𝐼𝑝 = 132447.68

#nombre d'observations
n = [Link][0] #18

#inertie version 1 -- distances entre paires d'individus


Ip_v1 = 0

#double boucle (i1, i2)


for i1 in range(n):
for i2 in range(n):
Ip_v1 = Ip_v1 + [Link]((X[i1,:]-X[i2,:])**2)

#moyenne des écarts entre paires d'individus


Ip_v1 = (1/(2*n**2)) * Ip_v1
print("Inertie, Approche 1 = %.2f" % (Ip_v1))

Inertie, Approche 1 = 132447.68

Inertie – Version 2. Une autre manière de considérer l’inertie est de la voir comme une

généralisation multidimensionnelle de la variance. Elle exprime alors la dispersion autour du

barycentre G du nuage de points, défini par le vecteur composé des moyennes des (p) variables

𝑥̅ = (𝑥̅1 , … , 𝑥̅𝑝 )

𝑛
1
𝐼𝑝 = ∑ 𝑑 2 (𝑖, 𝐺)
𝑛
𝑖=1

Méthodes Factorielles 18
ACP 10
Calculons le vecteur moyenne. Dans le plan (CYL, PUISS), nous positionnons le barycentre et

nous situons chaque point par rapport à cette référence (Figure 4).

#moyennes des variables -- Coordonnées de G


moyennes = [Link](X,axis=0)
print(moyennes)

[1631.66666667 84.61111111]

#graphique des points avec le barycentre G


fig, ax = [Link](figsize=(10,10))
[Link]([Link],[Link],color='xkcd:light blue',marker='o',linestyle='None')
[Link]([1000,3000,50,140])
ax.set_xlabel("CYL")
ax.set_ylabel("PUISS")
#ajouter des traits pointillés entre les points et le barycentre
for i in range([Link][0]):
[Link]([moyennes[0],[Link][i]],[moyennes[1],[Link][i]],color='silver',linestyle='dashed')
#barycentre G
[Link](moyennes[0],moyennes[1],"G",fontsize=14)
#faire afficher
[Link]()

Figure 4 - Dispersion des points autour du barycentre G -- Données "Autos" (CYL, PUISS)

Le calcul de l’inertie est autrement plus simple par rapport à la version précédente.

#rappel - vecteur des moyennes


print(moyennes)

[1631.66666667 84.61111111]

Méthodes Factorielles 19
ACP 11
#inertie version 2 - écarts au barycentre
Ip_v2 = [Link](numpy.apply_along_axis(func1d=lambda x: [Link]((x-moyennes)**2),axis=1,arr=X))
print("Inertie, Approche 2 = %.2f" % (Ip_v2))

Inertie, Approche 2 = 132447.68

Cette écriture a pour avantage de mettre en lumière un résultat important : l’inertie est égale à

la somme des variances des variables. En effet :

𝑛
1
𝐼𝑝 = ∑ 𝑑 2 (𝑖, 𝐺)
𝑛
𝑖=1
𝑛 𝑝
1 2
= ∑ ∑(𝑥𝑖𝑗 − 𝑥̅𝑗 )
𝑛
𝑖=1 𝑗=1
𝑝 𝑛
1 2
= ∑ ∑(𝑥𝑖𝑗 − 𝑥̅𝑗 )
𝑛
𝑗=1 𝑖=1
𝑝

= ∑ 𝜎𝑗2
𝑗=1

Nous avions calculé les écarts-type par variables ci-dessus. Il nous suffit de les passer au carré

et de faire la somme pour le vérifier.

#rappel écarts-type par variable


print(sigmas)
[363.39449027 19.80218531]

#vérification -- somme des variances


print("Somme des variances = %.2f" % ([Link](sigmas**2)))

Somme des variances = 132447.68

Oui, l’inertie correspond bien à la somme des variances des variables.

Cas des variables réduites. Lorsque les variables sont réduites, normalisées par les écarts-

type, leur variance est égale à 1. L’inertie est alors égale au nombre de variables (𝐼𝑝 = 𝑝).

Méthodes Factorielles 20
ACP 12
[Link] Principe de l’analyse en composantes principales (1)

Pour des raisons qui seront plus faciles à formuler dans l’étude des relations entre les variables

(section 1.1.3), nous centrons et réduisons les descripteurs. Pour (Xj), la variable transformée

est définie par

𝑥𝑖𝑗 − 𝑥̅𝑗
𝑧𝑖𝑗 =
𝜎𝑗

− Le centrage a pour conséquence de ramener le barycentre à l’origine c.-à-d. le vecteur

des moyennes est composé de valeurs nulles.

− Avec la réduction, l’inertie est égale au nombre (p) de variables.

Objectif de l’ACP : L’objectif de l’ACP est de construire un système de représentation de

dimension réduite (𝒒 ≪ 𝑝) qui préserve au mieux les distances entre les individus ou, c’est la

même chose, qui préserve au mieux la dispersion des données. Ce nouveau repère est décrit par

une succession de (q) variables synthétiques appelées « composantes principales » (facteurs,

axes principaux, axes factoriels). Elles sont définies par des combinaisons linéaires des variables

(𝑧𝑗 ). Pour la composante n°k :

𝐹𝑘 = 𝑎𝑘1 𝑧1 + ⋯ + 𝑎𝑘𝑝 𝑧𝑝

L’enjeu est d’estimer les valeurs des coefficients (𝑎𝑘𝑗 ) à partir des données.

Nous noterons qu’il est possible d’exprimer les facteurs à partir des variables originelles. Un

terme constant apparaît dans ce cas.

𝐹𝑘 = 𝑏𝑘0 + 𝑏𝑘1 𝑥1 + ⋯ + 𝑎𝑘𝑝 𝑥𝑝

La succession de facteurs construits par l’ACP répond au cahier des charges suivant :

1. La première composante F1 est construite de manière à maximiser la dispersion des points

lorsqu’ils y sont projetés. La variance associée indique son pouvoir explicatif, elle correspond

à une fraction de l’inertie totale. La composante est centrée c.-à-d. elle est de moyenne

nulle.

Méthodes Factorielles 21
ACP 13
2. La seconde composante F2 procède de la même manière, mais sur l’information résiduelle,

non-expliquée par F1. Elle est orthogonale à la première. Elle vient compléter l’information

restituée. Sa variance indique toujours la qualité de représentation qu’elle porte. L’addition

des variances des deux premières composantes indique leur pouvoir de représentation

lorsqu’elles sont combinées.

3. La troisième vient compléter les deux premières. Etc.

4. Nous avons restitué toute l’information disponible lorsque le nombre de facteurs (q)

considérés est égal au nombre de variables (p) de la base. La somme des variances des

facteurs est égale à l’inertie totale.

La compression est d’autant meilleure qu’un nombre (q) faible de facteurs permet de reproduire

une fraction importante de l’information initiale.

Pour l’exemple (CYL, PUISS) centrées et réduites, nous matérialisons les deux facteurs de l’ACP

(il ne peut y en avoir que 2 au maximum puisque p = 2) (Figure 5).

Figure 5 - Composantes principales - Données "Autos" (CYL, PUISS)

Méthodes Factorielles 22
ACP 14
Sur l’axe F1, nous souhaitons que les projections des points soient le plus écartés possibles de

l’origine. Ou, de manière équivalente puisque nous avons un triangle rectangle, les distances des

points à la droite (F1) soient les plus faibles possibles. Ainsi, nous pouvons voir l’ACP comme un

ajustement d’un nuage de points par une droite (plan, hyperplan), une régression sans variable

cible où les erreurs sont comptabilisées orthogonalement.

Sous Python, nous standardisons les variables, puis nous allons à l’essentiel avec la classe PCA

de la librairie « scikit-learn » . Nous reviendrons sur le détail des calculs sous-jacentsplus loin

(section 1.2). Nous obtenons les coordonnées factorielles des individus dans un premier

temps, nous les projetons dans le plan.

#données centrées et réduites


Z = (X - moyennes)/sigmas
print([Link](Z,index=[Link]))

0 1
Modele
Toyota Corolla -1.281436 -1.495346
Citroen GS Club -1.127333 -1.293348
Lada 1300 -0.929201 -0.838852
Simca 1300 -0.929201 -0.838852
Lancia Beta -0.920946 -0.131860
Alfasud TI -0.775099 -0.283358
Rancho -0.521930 -0.232859
Renault 16 TL -0.183455 -1.495346
Alfetta 1.66 -0.169696 1.231626
Fiat 132 -0.128419 0.676132
Audi 100 -0.120163 0.019639
Mazda 9295 0.377918 -0.081360
Peugeot 504 0.452217 -0.283358
Princess 1800 0.457721 -0.131860
Opel Rekord 0.955802 0.777131
Taunus 2000 0.994328 0.676132
Datsun 200L 1.008087 1.534623
Renault 30 2.840806 2.191116

#vérification moyennes - nulles


print([Link](Z,axis=0))

[-1.72701359e-16 -1.48029737e-16]

#vérification écarts-type – égaux à 1


print([Link](Z,axis=0,ddof=0))

[1. 1.]

#outil pour l'ACP


from [Link] import PCA
acp = PCA()

#coordonnées factorielles

Méthodes Factorielles 23
ACP 15
coord = acp.fit_transform(Z)

#afficher les nouvelles coordonnées


print([Link](coord,index=[Link]))

0 1
Modele
Toyota Corolla -1.963481 -0.151257
Citroen GS Club -1.711680 -0.117390
Lada 1300 -1.250203 0.063886
Simca 1300 -1.250203 0.063886
Lancia Beta -0.744446 0.557968
Alfasud TI -0.748442 0.347713
Rancho -0.533717 0.204405
Renault 16 TL -1.187092 -0.927647
Alfetta 1.66 0.750898 0.990885
Fiat 132 0.387292 0.568903
Audi 100 -0.071082 0.098855
Mazda 9295 0.209698 -0.324759
Peugeot 504 0.119402 -0.520131
Princess 1800 0.230419 -0.416897
Opel Rekord 1.225369 -0.126340
Taunus 2000 1.181194 -0.224999
Datsun 200L 1.797968 0.372317
Renault 30 3.558106 -0.459400

Figure 6 - Plan factoriel - Données "Autos" (CYL, PUISS)

Méthodes Factorielles 24
ACP 16
#position des véhicules dans le repère factoriel
fig, ax = [Link](figsize=(10,10))
[Link](coord[:,0],coord[:,1],"wo")
[Link]([-4,+4,-4,+4])
[Link]([-4,+4],[0,0],color='silver',linestyle='--')
[Link]([0,0],[-4,+4],color='silver',linestyle='--')
ax.set_xlabel("Comp.1 (89.83%)")
ax.set_ylabel("Comp.2 (10.17%)")

#ajouter les labels des véhicules


for i in range(n):
[Link](coord[i,0],coord[i,1],[Link][i])

#faire afficher
[Link]()

Plusieurs commentaires quant à ce graphique (Figure 6) :

− C’est le même graphique que le précédent (Figure 5), mais après rotation. Nous avons la

composante F1 en abscisse, F2 en ordonnée.

− Il est d’usage de faire apparaître les proportions d’inerties restituées sur les axes pour

situer leurs importances relatives. Ces indications sont cruciales surtout lorsque les

logiciels procèdent à une mise à l’échelle automatique de manière à ce que les min et

max soient situés aux extrémités du graphique, laissant croire à une dispersion identique

en abscisse et ordonnée.

− Une autre manière de se prémunir de ces distorsions intempestives est de fixer

explicitement les mêmes limites en abscisse et ordonnée. Nous constatons ainsi pour

notre exemple que la dispersion est surtout perceptible sur la première composante qui

restitue 89.83% de l’information disponible.

La variance restituée sur les facteurs est égale à :

𝑛
1 2
𝜆𝑘 = ∑ 𝐹𝑖𝑘
𝑛
𝑖=1

Où Fik est la coordonnée de l’individu n°i sur la composante Fk. Rappelons que les moyennes des

facteurs sont nulles par construction puisque les données ont été centrées, d’où cette formule

simplifiée de la variance.

Sur nos données,

Méthodes Factorielles 25
ACP 17
#calculer les lambda
lambada = [Link]([Link](coord,2),axis=0)
print(lambada)

[1.79662771 0.20337229]

(𝜆1 = 1.796 …) et (𝜆2 = 0.203 …).

L’information est plus parlante en proportions de variance restituée.

#part d'inertie expliquée par les axes


print(lambada/[Link](lambada))

[0.89831386 0.10168614]

Nous avons 89.83% de l’information sur le premier facteur, 10.17% sur le second.

Et nous vérifions bien que la somme des variances est égale à l’inertie totale :

𝐼𝑝 = ∑ 𝜆𝑘
𝑘=1

#somme des lambda = inertie totale


print("Somme des lambda = %f" % ([Link](lambada)))

Somme des lambda = 2.000000

[Link] Préservation des distances

Outre la restitution de la dispersion, nous disions plus haut que l’objectif de l’analyse en

composantes principales était aussi de réduire la dimensionnalité tout en préservant les

distances entre les individus. Voyons ce qu’il en est sur quelques exemples en comparant les

distances euclidiennes sur les données centrées et réduites (Z) et celles dans le repère factoriel

(coord), selon le nombre de composantes que nous prenons en compte.

Distance approchée. Dans un premier temps, nous nous intéressons à la qualité

d’approximation lorsque nous prenons en compte qu’une partie des facteurs, le premier ici en

l’occurrence (F1). Nous mesurons (le carré de) la distance entre la « Toyota Corolla » et la

« Citroën GS Club » sur les variables centrées et réduites.

2 2
𝑑 2 (𝐶𝑜𝑟𝑜𝑙𝑙𝑎, 𝐺𝑆) = (−1.2814 − (−1.1273)) + (−1.4953 − (−1.2933))

= 0.06455

Méthodes Factorielles 26
ACP 18
Avec les coordonnées factorielles sur le premier facteur (F1).

2
𝑑{𝐹1}
(𝐶𝑜𝑟𝑜𝑙𝑙𝑎, 𝐺𝑆) = (1.9335 − 1.7117)2

= 0.06340

L’approximation est plutôt bonne dans le cas présent. On s’y attendait un peu, sachant que la

qualité de représentation de la composante (F1) est plutôt intéressante (89.83%).

Maintenant que nous avons compris le principe, effectuons les calculs sous Python. Renouvelons

la comparaison entre la Corolla et la GS.

#data frame des données centrées et réduites


DZ = [Link](Z,index=[Link])

#data frame des coordonnées factorielles


DC = [Link](coord,index=[Link])

#(distance euclidienne)^2 entre les Toyota Corolla et Citroen GS


#données originelles, centrées et réduites
print([Link](([Link]['Toyota Corolla']-[Link]['Citroen GS Club'])**2))

0.06455073567278283

#(distance euclidienne)^2 en en prenant en compte que la première composante


print([Link](([Link]['Toyota Corolla'][0]-[Link]['Citroen GS Club'][0])**2))

0.06340375071089865

Voyons ce qu’il en est pour l’Audi 100 et la Fiat 132 qui étaient des concurrents directs sur le

segment des berlines familiales.

#distance initiale entre Audi 100 et Fiat 132


print([Link](([Link]['Audi 100']-[Link]['Fiat 132'])**2))

0.4310514745298847

#distance approchée (Facteur F1)


print([Link](([Link]['Audi 100'][0]-[Link]['Fiat 132'][0])**2))

0.2101060634608986

Patatras ! Bien que le facteur (F1) ait un pouvoir de restitution élevé, l’approximation est

mauvaise. On en déduit que la justesse de la restitution de la distance dépend certes du mérite

des composantes mises en jeu, mais aussi de la qualité de représentation des points étudiés c.-

à-d. de leurs positions sur ces composantes. Nous approfondirons ces notions lors de l’étude

des outils d’aide à l’interprétation de l’analyse en composantes principales (section 1.3).

Méthodes Factorielles 27
ACP 19
Distance exacte. Lorsque nous prenons en compte tous les facteurs (F1, F2), nous retrouvons

exactement les distances dans l’espace initial. Pour la Corolla et la GS par exemple.

2
𝑑{𝐹1 ,𝐹2 }
(𝐶𝑜𝑟𝑜𝑙𝑙𝑎, 𝐺𝑆) = (1.9335 − 1.7117)2 + (0.1513 − 0.1174)2

= 0.06455
= 𝑑 2 (𝐶𝑜𝑟𝑜𝑙𝑙𝑎, 𝐺𝑆)

Pour l’Audi et la Fiat maintenant.

#distance si on prend en compte (F1, F2)


print([Link](([Link]['Audi 100']-[Link]['Fiat 132'])**2))

0.43105147452988485

Une des questions clés de l’ACP est de définir le nombre de composantes « q » à retenir pour

disposer d’une approximation suffisamment satisfaisante des proximités pour une fraction

suffisamment importante des points, afin que les résultats – et surtout les graphiques – soient

exploitables.

1.1.3 Analyse des relations entre les variables

Dans cette section, nous revenons à l’ensemble des (p = 6) variables de la base « Autos ».

Examiner les relations entre les variables est le second prisme de l’exploration des données. Pour

la base « Autos », selon la pente et l’allongement des nuages de points, nous avions observé

dans le « pairplot » qu’elles étaient plus ou moins liées (Figure 3). Pour traiter les grandes bases,

il nous faut de nouveau une approche synthétique pour mesurer la quantité d’information

disponible à partir de ce point de vue, puis la décomposer par la suite sur les facteurs de l’ACP.

Dans cette section, nous présentons dans un premier temps différents indicateurs permettant

de restituer l’existence et l’intensité de la liaison entre les variables. Nous définirons une

approche alternative pour définir les composantes principales de l’ACP à partir de cette nouvelle

perspective d’analyse dans un second temps.

Méthodes Factorielles 28
ACP 20
[Link] Matrice des covariances

Matrice de covariance. La covariance mesure le sens et l’intensité de la liaison entre deux

variables. Elle identifie leur tendance à être simultanément au-dessus ou en dessous de leurs

espérances respectives. Elle caractérise une liaison monotone (Rakotomalala R., « Analyse de

corrélation. Etude des dépendances – Variables quantitatives », version 1.1, mars 2015). Elle peut

être positive ou négative. Plus sa valeur est élevée en valeur absolue, plus forte est la relation.

Dans un cadre multivarié, la matrice des variances covariances V permet de rendre compte des

liaisons des variables prises deux-à-deux. Elle est de terme :

𝑛
1
𝑣𝑗1 ,𝑗2 = ∑(𝑥𝑖𝑗1 − 𝑥̅𝑗1 )(𝑥𝑖𝑗2 − 𝑥̅𝑗2 )
𝑛
𝑖=1

Nous observons les variances des variables sur la diagonale de la matrice V. La trace de cette

matrice V – la somme des éléments diagonaux - correspond ainsi à la somme des variances c.-

à-d. la quantité totale d’information disponible :

𝑇𝑟(𝑉) = ∑ 𝑣𝑗𝑗
𝑗=1

Nous constatons ainsi que les deux points de vue sur les données - l’analyse des proximités

entre les individus et l’analyse des liaisons entre les variables - sont cohérents. Passer par

l’inertie ou passer par la matrice des covariances permettent de quantifier de manière identique

l’information portée par les données.

Sous Python, nous formons la structure X avec l’ensemble des (p = 6) variables et nous faisons

appel à la fonction cov() de la libraire Numpy pour former la matrice V. Nous calculons sa trace.

#former la matrice X avec (p=6) variables maintenant


X = [Link]

#calculer la matrice de covariance


#rowvar = False pour dire que les variables sont organisées en colonnes
#ddof = 0 pour utiliser (1/n)
V = [Link](X,ddof=0,rowvar=False)
numpy.set_printoptions(precision=2,suppress=True)
print(V)

Méthodes Factorielles 29
ACP 21
[[132055.56 5732.54 5476.56 1181.78 38159.61 2850.87]
[ 5732.54 392.13 272.86 53.26 2017.05 197.27]
[ 5476.56 272.86 461.58 94.22 2482.36 120.64]
[ 1181.78 53.26 94.22 26.67 492.72 28.81]
[ 38159.61 2017.05 2482.36 492.72 17715.36 749.99]
[ 2850.87 197.27 120.64 28.81 749.99 139.2 ]]

#calculer la trace de la matrice V


trace = [Link]()
print(trace)

150790.49382716054

Pour vérifier la cohérence avec l’analyse des proximités entre les individus, nous produisons

l’inertie totale sous la forme de la somme des distances au carré au barycentre, dont nous

calculons tout d’abord les coordonnées.

#vecteur moyenne pour (p = 6) variables


moyennes = [Link](X,axis=0)

#inertie par l'écart au barycentre


print([Link](numpy.apply_along_axis(func1d=lambda x: [Link]((x-moyennes)**2),axis=1,arr=X)))

150790.4938271605

S’il y avait un doute, il est levé. Ce sont bien là deux faces de la même pièce.

Produit matriciel des variables centrées. Le centrage des variables est fondamental en ACP.

Il permet de ramener le barycentre des données à l’origine. Aux descripteurs originels (Xj), nous

substituons (Zj) avec :

𝑧𝑖𝑗 = 𝑥𝑖𝑗 − 𝑥̅𝑗

La matrice de covariance peut être alors obtenue par le produit matriciel (ZTZ) à un facteur près :

1 𝑇
𝑉= 𝑍 𝑍
𝑛

Nous vérifions cela très facilement sur nos données. Nous centrons d’abord les variables puis

nous formons le produit matriciel, nous obtenons le résultat de cov().

#matrice Z des variables centrées


Z = X - moyennes
print([Link](Z,index=[Link]))

0 1 2 3 4 \
Modele
Alfasud TI -281.666667 -5.611111 -40.5 -5.666667 -208.833333

Méthodes Factorielles 30
ACP 22
Audi 100 -43.666667 0.388889 34.5 10.333333 31.166667
Simca 1300 -337.666667 -16.611111 -9.5 1.333333 -28.833333
Citroen GS Club -409.666667 -25.611111 -21.5 -5.666667 -148.833333
...
5
Modele
Alfasud TI 6.722222
Audi 100 1.722222
Simca 1300 -6.277778
Citroen GS Club -7.277778
...

#(1/n) (Z'Z) ➔ V
print([Link]([Link](Z),Z)/n)

[[132055.56 5732.54 5476.56 1181.78 38159.61 2850.87]


[ 5732.54 392.13 272.86 53.26 2017.05 197.27]
[ 5476.56 272.86 461.58 94.22 2482.36 120.64]
[ 1181.78 53.26 94.22 26.67 492.72 28.81]
[ 38159.61 2017.05 2482.36 492.72 17715.36 749.99]
[ 2850.87 197.27 120.64 28.81 749.99 139.2 ]]

[Link] Matrice des corrélations

Lorsque les variables sont centrées et réduites….

𝑥𝑖𝑗 − 𝑥̅𝑗
𝑧𝑖𝑗 =
𝜎𝑗

… nous aboutissons à la matrice de corrélations,

1 𝑇
𝑅= 𝑍 𝑍
𝑛

De terme :

𝑣𝑗1 ,𝑗2
𝑟𝑗1,𝑗2 =
𝜎𝑗1 × 𝜎𝑗2

Son intérêt est que ses valeurs sont bornées : (−1 ≤ 𝑟𝑗1 ,𝑗2 ≤ +1). Nous situons d’emblée

l’intensité des relations linéaires entre les paires de descripteurs. Et surtout, comme signalé plus

haut (section [Link], « Distance euclidienne pondérée »), la standardisation permet de dépasser

les problèmes de disparités d’échelles entre les variables.

Méthodes Factorielles 31
ACP 23
Puisque la diagonale contient exclusivement des valeurs égales à 1 (la corrélation d’une variable

avec elle-même est égale à 1), la trace de la matrice (R) est égale à (p), le nombre de variables.

Elle correspond également à l’inertie totale.

Sous Python, la fonction corrcoef() de la librairie « Numpy » fait très bien l’affaire.

#matrice des corrélations


R = [Link](X,rowvar=False)
print(R)

[[1. 0.8 0.7 0.63 0.79 0.66]


[0.8 1. 0.64 0.52 0.77 0.84]
[0.7 0.64 1. 0.85 0.87 0.48]
[0.63 0.52 0.85 1. 0.72 0.47]
[0.79 0.77 0.87 0.72 1. 0.48]
[0.66 0.84 0.48 0.47 0.48 1. ]]

Nous vérifions que la même matrice peut obtenue par l’intermédiaire du produit (ZTZ) :

#vecteur ecart-type pour (p = 6) variables


sigmas = [Link](X,axis=0)

#centrage et réduction
Z = (X - moyennes)/sigmas

#correspondance : produit matriciel : (1/n) (Z'Z)


print([Link]([Link](Z),Z)/n)

[[1. 0.8 0.7 0.63 0.79 0.66]


[0.8 1. 0.64 0.52 0.77 0.84]
[0.7 0.64 1. 0.85 0.87 0.48]
[0.63 0.52 0.85 1. 0.72 0.47]
[0.79 0.77 0.87 0.72 1. 0.48]
[0.66 0.84 0.48 0.47 0.48 1. ]]

Un « heatmap » permet de visualiser rapidement les corrélations les plus élevées.

#heatmap pour identifier visuellement les corrélations fortes


[Link](R,xticklabels=[Link],yticklabels=[Link],vmin=-1,vmax=+1,center=0
,cmap="RdBu",linewidths=0.5)

Méthodes Factorielles 32
ACP 24
Figure 7 - "Heatmap" des corrélations croisées - Données "Autos"

Nous notons que les plus fortes corrélations ont lieu entre (PUISS, VMAX), et entre (LONG,

LARG, POIDS). Nous observons également que le niveau global des corrélations est élevé.

Le « heatmap » tient (un peu) du gadget sur (p = 6) variables. Mais sur une plus forte

dimensionnalité, organisé judicieusement à l’aide de l’ACP par exemple, ce type de graphique

peut se révéler décisif pour identifier rapidement les liaisons et/ou groupes de liaisons

importantes qui structurent les données.

[Link] Principe de l’analyse en composantes principales (2)

Ce nouveau prisme nous permet de poser autrement le problème d’analyse en composantes

principales. Elle a pour objectif toujours d’élaborer une succession de facteurs. Le premier est

construit de manière à maximiser la somme des carrés des corrélations avec les variables :

𝜆1 = ∑ 𝑟𝑗2 (𝐹1 )
𝑗=1

Où 𝑟𝑗 (𝐹1 ) indique la corrélation de la variable n°j avec le facteur (F1).

La seconde composante (F2) répond à la même spécification, mais travaille sur la partie

résiduelle, non-expliquée par la précédente. Elle est donc orthogonale à (F1). La troisième

composante, etc.

Méthodes Factorielles 33
ACP 25
Les (𝜆𝑘 ) sont exactement les mêmes que lors de l’analyse des proximités entre les individus.

Elles correspondent à l’inertie restituée par les facteurs (Fk). Comme ces derniers sont deux à

deux orthogonaux, les (𝜆𝑘 ) s’additionnent d’un facteur à l’autre. La somme totale est égale

l’inertie globale. Pour une ACP normée, lorsque nous travaillons à partir de la matrice des

corrélations, elle est égale à p, le nombre de descripteurs.

Nous sollicitons de nouveaux la classe PCA de « scikit-learn » pour réaliser une ACP sur les

données centrées et réduites c.-à-d. une ACP normée. Nous produisons les coordonnées

factorielles des individus. Nous calculons alors les (𝜆𝑘 ) via la somme des carrés des corrélations

entre les variables et les facteurs. La somme des (𝜆𝑘 ) devrait être égale à (p). Nous verrons bien.

#acp sur Z (p = 6 variables)


acp = PCA()

#coordonnées factorielles
coord = acp.fit_transform(Z)

#afficher les nouvelles coordonnées des premiers véhicules


print([Link](coord,index=[Link]).head())

0 1 2 3 4 5
Modele
Toyota Corolla -2.138924 1.785681 0.571862 0.201927 -0.301357 0.053921
Citroen GS Club 1.561459 -1.527040 1.315271 -0.211352 0.148516 -0.327238
Lada 1300 -1.119385 -0.674505 0.456588 -0.167626 -0.375364 0.271803
Simca 1300 -2.573742 0.112884 0.148570 -0.017343 0.226853 0.263476
Lancia Beta 0.427855 0.695567 -0.193286 -0.627754 0.263505 -0.037153

#nombre de variables
p = [Link][1]
print(p)

#corrélation des facteurs avec les variables


Mlambda = [Link](x=coord,y=Z,rowvar=False)[:p,p:]

#affichage des corrélations : lignes = facteurs, colonnes = variables


print(Mlambda)

[[ 0.89 0.89 0.89 0.81 0.91 0.75]


[ 0.11 0.38 -0.38 -0.41 -0.22 0.57]
[-0.22 -0.11 0.04 0.37 -0.3 0.3 ]
[ 0.37 -0.17 -0.13 0.1 -0.14 -0.03]
[ 0.05 -0.09 0.22 -0.15 -0.09 0.06]
[-0.01 -0.13 -0.04 -0.02 0.12 0.1 ]]

#somme des corrélations^2 entre les variables et les facteurs


#on doit obtenir les lambda_k

Méthodes Factorielles 34
ACP 26
slambda = [Link](Mlambda**2,axis=1)
print(slambda)

[4.42 0.86 0.37 0.21 0.09 0.04]

#dont la somme totale (des lambda) = inertie = p puisque ACP normée


print([Link](slambda))

6.000000000000002

La somme des (𝜆𝑘 ) est égale au nombre de variables (p = 6). Dans notre exemple, nous observons

que (𝜆1 = 4.42). Elle explique pour (4.42 / p = 73.68%) de l’information disponible.

Bien sûr, si nous souhaitons faire le pont avec l’approche sous l’angle des proximités entre les

individus (section [Link]), nous obtenons exactement les mêmes (𝜆𝑘 ) en calculant les variances

des facteurs.

#faire le lien avec le premier prisme


#variance des coordonnées factorielles
print([Link](coord,axis=0,ddof=0))

[4.42 0.86 0.37 0.21 0.09 0.04]

[Link] Préservation des corrélations

Comme pour les distances entre individus, nous pouvons approcher les corrélations entre les

variables dans un espace factoriel de dimension réduite. Si 𝑟(𝑉1 , 𝑉2 ) est la corrélation brute entre

les variables (V1,V2), la corrélation approchée sur les (q) premiers facteurs s’écrit :

𝑟{𝐹1,… ,𝐹𝑞 } (𝑉1 , 𝑉2 ) = ∑ 𝑟𝑉1 (𝐹𝑘 ) × 𝑟𝑉2 (𝐹𝑘 )


𝑘=1

Dans le code Python ci-dessus, la matrice (R) représente les corrélations brutes entre les

variables, (Mlambda) les corrélations des variables avec les facteurs. Pour quelques exemples,

voyons de quelle manière les corrélations peuvent être approximées avec la première ou les deux

premières composantes.

(CYL, POIDS). Pour le cas de la corrélation entre CYL et POIDS.

#liste des variables


print([Link])

Index(['CYL', 'PUISS', 'LONG', 'LARG', 'POIDS', 'VMAX'], dtype='object')

Méthodes Factorielles 35
ACP 27
#corrélation entre CYL et POIDS
print(R[0,4])

0.7889520283865826

#corrélation approchée sur le premier facteur


print(Mlambda[0,0]*Mlambda[0,4])

0.8087519932967818

L’approximation est déjà de bonne facture sur la première composante. Elle ne peut être

meilleure si nous rajoutons la seconde.

#corrélation approchée sur les 2 premiers facteurs


print(Mlambda[0,0]*Mlambda[0,4]+Mlambda[1,0]*Mlambda[1,4])

0.7829518411637988

Et c’est bien le cas.

(POIDS, VMAX) Pour le cas de la corrélation entre POIDS et VMAX maintenant.

#corrélation entre POIDS et VMAX


print(R[4,5])

0.4775955992662051

#corrélation approchée sur le premier facteur


print(Mlambda[0,4]*Mlambda[0,5])

0.6831543614480379

L’approximation est mauvaise pour ce cas. Rajoutons de la précision avec la seconde composante.

#corrélation approchée sur les 2 premiers facteurs


print(Mlambda[0,4]*Mlambda[0,5]+Mlambda[1,4]*Mlambda[1,5])

0.55438062524932

Il y a une amélioration certes, mais nous sommes loin du compte encore.

Conclusion : Comme pour les distances entre les individus, la précision de l’approximation des

corrélations dépend : (1) du pouvoir de restitution des facteurs utilisés (pourcentage d’inertie

porté par les facteurs) ; (2) de la qualité de représentation des variables sur ces facteurs, qu’il

faudra pouvoir caractériser (section 1.3).

Méthodes Factorielles 36
ACP 28
1.2 Organisations des calculs

Nous savons maintenant ce que nous souhaitons obtenir. Nous décryptons dans cette section

comment y parvenir à partir de nos données en mettant (un peu) les mains dans le cambouis des

calculs matriciels. Comprendre les mécanismes internes nous donnera une meilleure visibilité sur

la nature de la méthode et la teneur des résultats.

Récapitulons. A partir d’un ensemble de données dont la quantité d’information totale est

comptabilisée par l’inertie 𝐼𝑝 , l’objectif de l’ACP est de construire des facteurs :

𝐹1 = 𝑎11 𝑧1 + 𝑎21 𝑧2 + ⋯ + 𝑎𝑝1 𝑧𝑝



𝐹𝑘 = 𝑎1𝑘 𝑧1 + 𝑎2𝑘 𝑧2 + ⋯ + 𝑎𝑝𝑘 𝑧𝑝

{ 𝐹𝑝 = 𝑎1𝑝 𝑧1 + 𝑎2𝑝 𝑧2 + ⋯ + 𝑎𝑝𝑝 𝑧𝑝

− La variable (zj) représente la variable originelle (xj) centrée (ACP non-normée) ou centrée

et réduite (ACP normée) ;

− Le degré de représentativité des facteurs est matérialisé par la variance expliquée (𝜆𝑘 ) ;

− Le facteur (Fk) est construit à partir de l’information résiduelle des (k-1) précédents :

o Les facteurs sont par conséquent d’importance décroissante ;

o Et ils sont deux à deux orthogonaux ;

− En pratique, on se contente de ne retenir que sur les (q) premiers, avec (𝑞 ≪ 𝑝), qui

portent une fraction suffisamment importante de l’information disponible. Nous

pouvons ainsi négliger les (p-q) facteurs restants. Cette forme de « compression » fait

tout l’intérêt de l’ACP. Si l’on considère tous les facteurs (q = p), nous disposons de toute

l’information initialement disponible.

− Dans l’espace factoriel défini par les (q) premières composantes, nous devons pouvoir

reconstituer de manière satisfaisante les proximités entre les individus et les liaisons

entre les variables.

Comment obtenir les coefficients (𝑎𝑗𝑘 ) à partir des données ?

Méthodes Factorielles 37
ACP 29
1.2.1 Calculs (1) – Diagonalisation de la matrice des corrélations

Pourquoi la diagonalisation de la matrice des corrélations ? La première approche consiste

à considérer le problème de l’ACP tel qu’il est posé dans l’analyse des relations des variables avec

les facteurs (section [Link]). Si l’on s’en tient au premier facteur, on cherche à estimer le vecteur

𝑎 = (𝑎1 , … , 𝑎𝑝 ) telle que la somme des carrés des corrélations des variables avec le facteur soit

maximale.

En termes matriciels, nous pouvons l’écrire : max 𝑎𝑇 𝑅 𝑎


𝑎

Dans le même temps, on souhaite que le vecteur (a) soit normé : ‖𝑎‖ = 𝑎𝑇 𝑎 = 1

Nous avons donc un problème d’optimisation sous contrainte :

max 𝑎𝑇 𝑅𝑎
{ 𝑎
𝑠. 𝑐.: 𝑎𝑇 𝑎 = 1

Nous passons par le lagrangien pour le résoudre :

𝐿 = 𝑎𝑇 𝑅 𝑎 − 𝜆 (𝑎𝑇 𝑎 − 1)

En calculant la dérivée partielle par rapport à (𝑎), nous obtenons deux résultats importants :

1. (𝑅 𝑎 = 𝜆 𝑎), le vecteur solution (𝑎) est le premier vecteur propre de la matrice des

corrélations R, (λ) est la valeur propre associée.

2. (𝜆 = 𝑎𝑇 𝑅 𝑎), (λ) correspond à la valeur propre.

Exemple de calcul sous Python. Et, de manière générale, les vecteurs et valeurs propres de la

matrice R (en ACP normée) constituent les solutions de l’ACP : les vecteurs propres sont deux à

deux orthogonaux, ils fournissent directement les coefficients (ajk) définissant les composantes

principales (Fk) ; les valeurs propres (λk) traduisent la variance restituée par les facteurs.

La librairie « Numpy » regorge de fonctions qui font notre bonheur. Dans ce qui suit, nous

affichons la matrice des corrélations pour rappel, nous la diagonalisons, nous procédons à

quelques vérifications enfin.

Méthodes Factorielles 38
ACP 30
#rappel matrice des corrélations
print(R)

[[1. 0.8 0.7 0.63 0.79 0.66]


[0.8 1. 0.64 0.52 0.77 0.84]
[0.7 0.64 1. 0.85 0.87 0.48]
[0.63 0.52 0.85 1. 0.72 0.47]
[0.79 0.77 0.87 0.72 1. 0.48]
[0.66 0.84 0.48 0.47 0.48 1. ]]

#calcul des valeurs et vecteurs propres


sol = [Link](R)
print(sol)

#valeurs propres

(array([4.42, 0.86, 0.37, 0.21, 0.09, 0.04]),

#vecteurs propres – organisés en colonnes

array([[-0.42, -0.12, -0.35, 0.81, 0.15, -0.06],


[-0.42, -0.42, -0.18, -0.36, -0.29, -0.63],
[-0.42, 0.41, 0.07, -0.28, 0.73, -0.19],
[-0.39, 0.45, 0.6 , 0.21, -0.48, -0.11],
[-0.43, 0.24, -0.48, -0.3 , -0.3 , 0.58],
[-0.36, -0.62, 0.49, -0.07, 0.19, 0.46]]))

− Si l’on souhaite accéder exclusivement aux valeurs propres.

#valeurs propres
print(sol[0])

[4.42 0.86 0.37 0.21 0.09 0.04]

− Au premier vecteur propre.

#vecteurs propres pour le premier facteur


print(sol[1][:,0])

[-0.42 -0.42 -0.42 -0.39 -0.43 -0.36]

− Vérifions sa norme : elle est égale à 1 (aux erreurs de troncature près)

#vérifions sa norme
print([Link](sol[1][:,0]))

0.9999999999999999

− Est-ce que le repère factoriel est orthonormal ? Oui.

#base orthonormale ?
print([Link]([Link](sol[1]),sol[1]))

[[ 1. -0. 0. 0. -0. -0.]


[-0. 1. 0. 0. 0. 0.]
[ 0. 0. 1. -0. -0. -0.]

Méthodes Factorielles 39
ACP 31
[ 0. 0. -0. 1. -0. 0.]
[-0. 0. -0. -0. 1. 0.]
[-0. 0. -0. 0. 0. 1.]]

Coordonnées factorielles des individus. Pour calculer les coordonnées factorielles des

individus, il suffit d’appliquer les coefficients estimés (les vecteurs propres) sur les variables

centrées et réduites.

𝐹𝑖𝑘 = ∑ 𝑎𝑗𝑘 × 𝑧𝑖𝑗


𝑗=1

Un simple produit matriciel fait l’affaire. Pour le premier facteur :

#coordonnées factorielles sur le premier facteur (n°0)


#produit matriciel
c1 = [Link](Z,sol[1][:,0])

#affichage avec les identifiants des véhicules


print([Link](c1,columns=['F_1'],index=[Link]))

F_1
Modele
Alfasud TI 2.138924
Audi 100 -1.561459
Simca 1300 1.119385
Citroen GS Club 2.573742
Fiat 132 -0.427855
Lancia Beta 0.304238
Peugeot 504 -0.683928
Renault 16 TL 1.948493
Renault 30 -4.409735
Toyota Corolla 3.985782
Alfetta 1.66 -0.437658
Princess 1800 -1.018175
Datsun 200L -2.941080
Taunus 2000 -1.314880
Rancho 0.691111
Mazda 9295 -0.385709
Opel Rekord -2.289768
Lada 1300 2.708574

Présentation des résultats – Corrélation des variables avec les axes. Dans les logiciels, les

(λk) apparaissent sous l’appellation « valeurs propres », on sait pourquoi. On utilise également

le terme « variance expliquée ». Les vecteurs propres apparaissent rarement sous leur forme

native en revanche. On préfère les présenter sous l’angle de la corrélation avec les variables où :

𝑟𝑗 (𝐹𝑘 ) = √𝜆𝑘 × 𝑎𝑗𝑘

Méthodes Factorielles 40
ACP 32
Pour les données « Autos », le calcul est très simple.

#corrélation des variables avec le premier facteur


r_1 = [Link](sol[0][0])*sol[1][:,0]

#affichage des corrélations


print([Link](r_1,index=[Link]))

0
CYL -0.893464
PUISS -0.886858
LONG -0.886155
LARG -0.813536
POIDS -0.905187
VMAX -0.754710

1.2.2 Calculs (2) – Décomposition en valeurs singulières

L’approche alternative pour l’ACP est de passer par la décomposition en valeurs singulières de la

matrice des données centrées et réduites. Elle présente un double avantage par rapport à la

précédente : elle ne nécessite pas le calcul de la matrice des corrélations, cela peut être décisif

si nous traitons des données à très forte dimensionnalité ; elle montre bien le caractère dual de

l’analyse, pédagogiquement je trouve cela intéressant.

Décomposition en valeurs singulières d’une matrice. La décomposition en valeurs singulières

(SVD – singular value decomposition, en anglais) est une procédure de factorisation des

matrices. Schématiquement, il s’agit de décomposer la matrice Z :

𝑍 = 𝑈 Δ 𝑉𝑇

Avec :

𝑍 𝑣𝑘 = 𝛿𝑘 𝑢𝑘
{
𝑍 𝑇 𝑢𝑘 = 𝛿𝑘 𝑣𝑘

Sous Python, nous faisons appel à svd() de la librairie « Numpy ». Nous disposons de 3 éléments

en sortie de la fonction.

#décomposition en valeurs singulières


Us, delta, Vs = [Link](Z)

Méthodes Factorielles 41
ACP 33
Variance restituée par les axes. 𝚫 est une matrice diagonale dite des valeurs singulières (𝛿𝑘 ).

On retrouve très facilement les variances restituées par les axes avec

𝛿𝑘2
𝜆𝑘 =
𝑛

#vecteur des valeurs singulières


print(delta)

[8.92 3.93 2.59 1.96 1.29 0.88]

#et pour obtenir les lambda_k


print((delta**2)/n)

[4.42 0.86 0.37 0.21 0.09 0.04]

Coordonnées des variables. V est une matrice de taille (p, p), constituée d’un ensemble de

vecteurs orthonormés dits « d’entrée ». Concrètement, nous dirons surtout qu’elle correspond

à la matrice des vecteurs propres de (𝑍 𝑇 𝑍). Ainsi, nous disposons directement des résultats (ajk)

issus de la diagonalisation de la matrice des corrélations.

#matrice singulière à droite (d'entrée)


print([Link](Vs))

[[ 0.42 -0.12 0.35 -0.81 -0.15 0.06]


[ 0.42 -0.42 0.18 0.36 0.29 0.63]
[ 0.42 0.41 -0.07 0.28 -0.73 0.19]
[ 0.39 0.45 -0.6 -0.21 0.48 0.11]
[ 0.43 0.24 0.48 0.3 0.3 -0.58]
[ 0.36 -0.62 -0.49 0.07 -0.19 -0.46]]

#vérification -- vecteurs propres de (Z'Z) -- OK


print([Link]([Link]([Link](Z),Z))[1])

[[-0.42 -0.12 -0.35 0.81 0.15 -0.06]


[-0.42 -0.42 -0.18 -0.36 -0.29 -0.63]
[-0.42 0.41 0.07 -0.28 0.73 -0.19]
[-0.39 0.45 0.6 0.21 -0.48 -0.11]
[-0.43 0.24 -0.48 -0.3 -0.3 0.58]
[-0.36 -0.62 0.49 -0.07 0.19 0.46]]

Coordonnées des individus. U est de taille (n, n), constituée de vecteurs orthogonaux dits de

« sortie ». Elle correspond à la matrice des vecteurs propres de (𝑍𝑍 𝑇 ). Concrètement, en nous

en tenant aux (p) premières colonnes, elle nous permet surtout de produire directement les

coordonnées factorielles des individus :

𝐹𝑖𝑘 = 𝛿𝑘 × 𝑢𝑖𝑘

Méthodes Factorielles 42
ACP 34
#matrice singulière à gauche (de sortie)
print(Us)

[[-0.24 -0.45 -0.22 -0.1 0.23 -0.06 0.31 0.21 0.17 -0.23 -0.2 0.14
0.4 -0.03 -0.04 0.24 0.17 -0.3 ]
[ 0.18 0.39 -0.51 0.11 -0.11 0.37 0.09 0.25 0.42 -0.06 -0.11 0.1

... etc. tout afficher n’a pas d’intérêt...

#coordonnées factorielles - 1er facteur


print([Link](Us[:,0]*delta[0],columns=['F_1'],index=[Link]))

F_1
Modele
Alfasud TI -2.138924
Audi 100 1.561459
Simca 1300 -1.119385
Citroen GS Club -2.573742
Fiat 132 0.427855
Lancia Beta -0.304238
Peugeot 504 0.683928
Renault 16 TL -1.948493
Renault 30 4.409735
Toyota Corolla -3.985782
Alfetta 1.66 0.437658
Princess 1800 1.018175
Datsun 200L 2.941080
Taunus 2000 1.314880
Rancho -0.691111
Mazda 9295 0.385709
Opel Rekord 2.289768
Lada 1300 -2.708574

Méthodes Factorielles 43
ACP 35
1.3 Pratique de l’ACP avec « fanalysis » sous Python

Dans cette section, nous déroulons sous Python une étude type d’analyse en composantes

principales sur les données « Autos ». Les thèmes abordés ne sont pas toujours traités dans cet

ordre dans la pratique de l’ACP, mais ils sont plus ou moins incontournables pour exploiter

pleinement les informations portées par les données.

Nous utilisons le package « fanalysis » pour Python développé par Olivier Garcia, un de mes

anciens étudiants du Master SISE (2000). Une courte description de ses fonctionnalités est

disponible sur mon blog (« Analyses factorielles sous Python avec fanalysis », juin 2018). L’outil

a une double finalité : il permet de mener une étude descriptive répondant à la pratique usuelle

des méthodes factorielles ; il permet de les utiliser en tant que techniques de prétraitement

précédant les algorithmes de machine learning dans des mécanismes de pipeline (« Pipeline sous

Python – La méthode DISQUAL », juin 2018).

Pour des raisons de lisibilité, nous recommençons à zéro dans cette section, avec le chargement

des données et la préparation des structures. Nous suivons ensuite la démarche d’analyse

proposée par l’auteur de la librairie (« Package fanalysis – Analyse en Composantes

principales »).

Méthodes Factorielles 44
ACP 36
Importation des données. Aucune difficulté intrinsèque ici, nous avons toujours (n = 18)

observations et (p = 6) variables.

#chargement des données - index_col = 0 : indiquer que la colonne n°0 est un label
import pandas
D = pandas.read_excel("Data_Methodes_Factorielles.xlsx",sheet_name="DATA_ACP_ACTIF",index_col=0)

#affichage des caractéristiques


print([Link]())

<class '[Link]'>
Index: 18 entries, Alfasud TI to Lada 1300
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 CYL 18 non-null int64
1 PUISS 18 non-null int64
2 LONG 18 non-null int64
3 LARG 18 non-null int64
4 POIDS 18 non-null int64
5 VMAX 18 non-null int64
dtypes: int64(6)
memory usage: 1008.0+ bytes

#nombre de variables
p = [Link][1]

#nombre d'observations
n = [Link][0]

#matrice des X
X = [Link]

ACP avec « fanalysis ». Pour lancer l’ACP nous importons la classe de calcul, nous instancions

l’objet de calcul et nous lançons l’analyse.

#importer la classe de calcul


from [Link] import PCA

#instancier l'objet de calcul


#std_unit = True ➔ ACP normée
acp = PCA(std_unit=True,row_labels=[Link],col_labels=[Link])

#lancer les calculs sur les données


[Link](X)

#propriétés de l'objet généré


print(dir(acp))

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format


__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__
', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__
reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__
', '__str__', '__subclasshook__', '__weakref__', '_compute_stats', '_compute_svd',
'_get_param_names', '_get_tags', '_more_tags', 'col_contrib_', 'col_coord_', 'col_

Méthodes Factorielles 45
ACP 37
cor_', 'col_cos2_', 'col_labels', 'col_labels_', 'col_labels_short_', 'col_topanda
s', 'correlation_circle', 'eig_', 'eigen_vectors_', 'fit', 'fit_transform', 'get_p
arams', 'mapping', 'mapping_col', 'mapping_row', 'means_', 'model_', 'n_components
', 'n_components_', 'plot_col_contrib', 'plot_col_cos2', 'plot_eigenvalues', 'plot
_row_contrib', 'plot_row_cos2', 'row_contrib_', 'row_coord_', 'row_cos2_', 'row_la
bels', 'row_labels_', 'row_topandas', 'set_params', 'ss_col_coord_', 'stats', 'std
_', 'std_unit', 'transform']

L’objet possède une série de propriétés et de méthodes que nous exploiterons à l’envi tout au

long de cette section.

1.3.1 Détermination du nombre de facteurs

Le choix du nombre de facteurs à retenir est très important en ACP (TUTO 3). L’enjeu est de

distinguer d’une part l’information pertinente (le « signal ») véhiculée par les axes que l’on

choisit de retenir ; et d’autre part, l’information résiduelle – le « bruit » issu des fluctuations

d’échantillonnage – traduite par les derniers facteurs que l’on choisit de négliger. Et c’est là que

le bât blesse. On nous dit généralement qu’il faut conserver les facteurs intéressants, pourvu

qu’ils soient interprétables. Difficile d’être plus approximatif. Pour un expert, ce n’est pas

vraiment un problème. Attention, l’expertise ne se limite pas à la méthode. Elle englobe une

bonne connaissance du domaine (savoir ce qui est possible d’obtenir ou pas) et des données

manipulées (pouvoir détecter rapidement les anomalies ou les évidences). Bref, il dispose de

tous les garde-fous nécessaires pour produire des résultats valables.

Pour le néophyte, l’à peu près n’est pas gérable. C’est un peu le cas de mes étudiants. Ils

connaissent bien les statistiques. Ils sont en train d’apprendre les techniques factorielles. Mais

pour ce qui est des applications pratiques sur des fichiers de données, ils ne sont ni médecins,

ni spécialistes du marketing, etc. L’expertise métier leur fait défaut pour encadrer les résultats.

Ils ont besoin de repères numériques forts lorsqu’ils mènent une analyse. Et je me suis rendu

compte que la très grande majorité des étudiants se contentaient très souvent de la règle de

Kaiser-Guttman (valeur propre > 1 en ACP normée), et parfois de la règle du coude associée au

« scree plot » mettant en lumière la décroissance des valeurs propres (« éboulis » des valeurs

propres). Pourtant d’autres règles existent. Elles sont malheureusement peu connues, peu

diffusées, et de ce fait peu utilisées.

Méthodes Factorielles 46
ACP 38
Dans cette section, nous passons en revue quelques solutions simples à mettre en œuvre pour

identifier le nombre adéquat de facteurs de l’ACP. Les techniques de rééchantillonnage qui

impliquent plusieurs passages sur les données feront l’objet d’un développement spécifique dans

un autre chapitre (section 2.1).

Ces approches « simples » s’appuient essentiellement sur l’étude des valeurs propres. Rappelons

que la valeur propre correspond à la fraction d’inertie que la composante retranscrit. Plus elle

est élevée, plus le facteur est important dans la lecture des résultats. L’enjeu justement est de

déceler à partir de quel stade l’information restituée peut être considérée négligeable. L’affaire

n’est pas facile. En effet, plusieurs éléments entrent en ligne de compte (Jackson, 1993) : le

nombre d’observations « n » ; le nombre de variables « p » de l’analyse ; le ratio « n:p »entre

le nombre d’observations et le nombre de variables ; le degré de liaison (la corrélation) entre les

variables ; l’existence éventuelle de blocs de variables corrélées dans le tableau de données.

Le ratio « n:p » est particulièrement important. Il détermine la stabilité des résultats. Certaines

références affirment qu’une ACP n’est vraiment viable que s’il est supérieur à 3 (Grossman et

al., 1991). Nous avons juste (18/6 = 3) dans notre fichier. Ouf ! A priori, nous pouvons travailler

en confiance.

[Link] Procédures graphiques

La règle de Cattell (1966, 1977) repose sur l’étude de la courbe de décroissance des valeurs

propres (k) pour identifier le bon nombre de facteurs. Elle est valable pour les ACP normées et

non-normées. L’idée est de détecter les « coudes » (les « cassures ») signalant un changement

de structure. Cette approche est intéressante parce qu’elle est nuancée. Elle permet de dépasser

l’arbitraire purement numérique. Mais elle est compliquée à mettre en œuvre parce qu’elle est

justement soumise à l’arbitraire. La détection n’est pas toujours évidente. Il faut répondre à

plusieurs questions : Où est situé le coude ? Est-ce qu’il est unique ? Est-ce que nous l’incluons

ou pas dans la sélection ?

En règle générale, le coude est très marqué lorsque nous traitons des variables fortement

corrélées. Lorsqu’elles le sont faiblement ou lorsqu’il y a des blocs de variables corrélées, plutôt

Méthodes Factorielles 47
ACP 39
qu’une solution unique « évidente », nous devons envisager plusieurs scénarios. Concernant

l’intégration du coude dans la sélection, Cattel lui-même a varié. Dans un premier temps (Cattell,

1966), il conseillait de ne sélectionner que les facteurs qui sont avant le coude ; puis, dans un

second temps (1977), il préconise finalement de l’intégrer. Tout dépend de la valeur associée au

coude en réalité. Si elle est faible, on peut négliger le facteur. Nous devons le sélectionner en

revanche si elle est élevée.

Sur les données « Autos », la propriété « .eig_ » fournit les valeurs propres de différentes

manières : valeur brute, en proportion d’inertie expliquée, en proportion cumulée.

#valeurs propres
print(acp.eig_)

[[4.42085806e+00 8.56062289e-01 3.73066077e-01 2.13922089e-01


9.28012120e-02 4.32902727e-02]
[7.36809677e+01 1.42677048e+01 6.21776796e+00 3.56536815e+00
1.54668687e+00 7.21504545e-01]
[7.36809677e+01 8.79486725e+01 9.41664404e+01 9.77318086e+01
9.92784955e+01 1.00000000e+02]]

Nous construisons la courbe, que l’on appelle aussi « Eboulis des valeurs propres » ou « Scree

plot » selon les références. J’ai rajouté une ligne pointillée rouge dont nous négligeons la lecture

pour l’instant (Figure 8).

%matplotlib inline

#librairie graphique
import [Link] as plt

#préparer le graphique
fig, ax = [Link](figsize=(5,5))
[Link](range(1,p+1),acp.eig_[0],".-")
ax.set_xlabel("Nb. facteurs")
ax.set_ylabel("Val. propres")
[Link]("Eboulis des valeurs propres")

#rajout du seuil du Kaiser


[Link]([1,6],[1,1],"r--",linewidth=1)

[Link]()

Méthodes Factorielles 48
ACP 40
Figure 8 - Scree plot - Données "Autos"

Il y a un coude évident ici pour (k = 2). Est-ce qu’il faut l’inclure ou pas dans la sélection c.-à-d.

est-ce qu’il faut prendre (q = 1) ou (q = 2) facteurs finalement ? Pour les graphiques, (q = 2) est

incontournable. Mais de manière générale, la décision repose pour beaucoup sur la proportion

d’inertie portée par le facteur concerné. Ici, elle semble assez élevée (14.27%), on serait tenté de

la sélectionner nonobstant les contraintes de représentations graphiques.

Pour préciser la lecture, il semble intéressant de compléter le « scree plot » par un second

graphique décrivant l’évolution de l’inertie expliquée par les (q) premiers axes. Il s’agit ni plus ni

moins de la courbe des valeurs propres cumulées en pourcentage. Un « coude » devrait y être

visible également. Mais la partie subséquente doit présenter une pente moindre, indiquant ainsi

un apport négligeable des facteurs restants.

Nous réalisons ce second graphique pour les données « Autos » (Figure 9).

#proportion de variance expliquée


fig, ax = [Link](figsize=(5,5))
[Link](range(0,p+1),[Link](0,acp.eig_[2]),".-")
ax.set_xlabel("Nb. facteurs")
ax.set_ylabel("% de var. expliquée")
[Link]("Variance expliquée")

[Link]()

Méthodes Factorielles 49
ACP 41
Figure 9 - Courbe de variance expliquée - Données "Autos"

Lorsque l’on passe de (q = 0) à (q = 1) facteur, le gain d’information est important, la pente de

la courbe est forte. Il y a une cassure à (q = 1). Pour le passage de (q = 1) à (q = 2) facteurs, le

gain est moindre certes, mais la pente reste conséquente. Il y a une seconde cassure en (q = 2),

et par la suite, la pente est de plus en plus horizontale.

A l’évidence, le choix se joue entre (q = 1) ou (q = 2). Ce graphique de l’évolution de la variance

expliquée en fonction du nombre de composantes combiné au « scree plot » se révèle souvent

décisif dans l’appréciation du nombre de facteurs à retenir.

[Link] Proportion d’inertie expliquée

On est parfois tenté d’utiliser explicitement la part de variance expliquée pour déterminer le

nombre de facteurs. La règle serait alors : « sélectionner suffisamment d’axes pour expliquer

au moins x% de l’inertie totale ». Cette stratégie est descendue en flammes par toutes les

références que j’ai pu consulter. Pour la simple raison qu’elle ne tient pas compte des

corrélations entre les variables. Dans notre exemple, mettons que l’on souhaite capter 95% de

l’information disponible, nous serions amenés à retenir (q = 3) facteurs. Tout en sachant

pertinemment que la variabilité est très faible à partir du 3ème.

Méthodes Factorielles 50
ACP 42
Néanmoins, après coup, après avoir choisi le nombre d’axes à l’aide d’une des approches décrites

dans ce document, il est intéressant de pouvoir situer la quantité d’information – à l’aide de la

fraction d‘inertie expliquée - que restituent les facteurs sélectionnés.

[Link] Règles de Kaiser simples et améliorées

Règle de Kaiser-Guttman. La règle de Kaiser-Guttamn repose sur une idée simple. Dans une

ACP normée, la somme des valeurs propres étant égale au nombre de variables, leur moyenne

vaut 1. Nous considérons par conséquent qu’un axe est intéressant si sa valeur propre est

supérieure 1.

Il existe d’autres manières de considérer ce seuil : un axe est intéressant s’il contribue plus

qu’une des variables prise individuellement ; ou encore, si les variables étaient deux à deux

orthogonales, les valeurs propres issues de l’analyse seraient toutes égales à 1.

Pour les données « Autos », le seuil a été rajoutée dans le « scree plot » (Figure 8, ligne rouge

pointillée). Cette règle de sélection sert de repère à tous les praticiens de l’analyse en

composantes principales. Elle a le mérite de la popularité. Mais elle a pour inconvénient de ne

tenir compte en aucune manière les caractéristiques des données, notamment ses dimensions

(nombre d’observations et de variables).

Règle de Karlis-Saporta-Spinaki. On pense généralement que le seuil 1 est trop permissif c.-

à-d. nous retenons plus d’axes factoriels qu’il n’en faut. Il n’est réellement fondé que si les

variables sont fortement corrélées, autrement il faudrait le relever. Une règle plus restrictive

consiste à le définir comme suit : moyenne des valeurs propres + 2 fois leur écart-type (Saporta,

2006 ; page 172). Elle rappelle la définition de la valeur critique d’un test unilatéral de conformité

à 5%, où la statistique suit asymptotiquement une loi normale.

La règle d’acceptation devient maintenant :

𝑝−1
𝜆 >𝟏+2√
𝑛−1

Méthodes Factorielles 51
ACP 43
Par rapport à la règle de Kaiser, elle est plus restrictive. Cela va dans le sens souhaité. Notons

également qu’elle dépend du ratio « n:p », déterminant dans la qualité des résultats de l’ACP.

Nous serons d’autant plus exigeants – nous serons enclins à accepter moins de facteurs - que

le nombre de variables « p » est élevé par rapport aux observations disponibles « n ».

Pour nos données, le seuil devient :

𝑝−1 6−1
𝟏+2√ =𝟏+2√ = 2.08
𝑛−1 18 − 1

#librairie pour calc. math


import math

#seuil de Karlis-Saporta-Spinaki
kss = 1+2*[Link]((p-1)/(n-1))
print(kss)

2.084652289093281

Seul le premier facteur échapperait au couperet.

[Link] Test de sphéricité de Bartlett

Bien qu’il existe une variante qui peut être utilisée pour identifier le nombre de facteurs

pertinents (TUTO 3, section 5.2), le test de Bartlett sert avant tout à détecter l’existence de

relations « intéressantes » entre les variables (TUTO 7). En effet, on peut considérer l’ACP

comme une compression de l’information. Elle n’est possible que si les données présentent une

certaine redondance. Si les variables sont deux à deux orthogonales, a fortiori si elles sont deux

à deux indépendantes, il n’y a pas de compression possible, le nombre adéquat de facteurs à

retenir est égal au nombre de variables. Dans ce dernier cas, la matrice des corrélations est

égale à la matrice identité.

Formellement, l’hypothèse nulle (H0) du test de sphéricité de Bartlett correspond à : « toutes

les valeurs propres sont identiques, elles sont égales à 1 ». Si on rejette H0, on sait qu’il existe

au moins un facteur pertinent dans l’ACP. Nous ne pouvons pas spécifier leur nombre toutefois.

La statistique de test est basée sur le déterminant du coefficient de corrélation R, elle s’écrit

Méthodes Factorielles 52
ACP 44
2𝑝+5
𝐶 = − (𝑛 − 1 − ) × ln|𝑅|
6

Où R est la matrice des corrélations, |R| son déterminant.

Sous H0, elle suit une loi du 𝜒 2 à [p x (p – 1) / 2] degrés de liberté.

|R| est égal au produit des valeurs propres. Si les variables sont deux à deux orthogonales, il est

égal à 1, et la statistique de test C est égale à 0. Il s’agit d’apprécier dans quelle mesure nous

nous écartons de cette situation de référence.

Il n’est pas nécessaire de calculer explicitement la matrice de corrélation pour réaliser le test. La

formule peut être réécrite en exploitant les valeurs propres fournies par l’objet ACP :

𝑝
2𝑝+5
𝐶 = − (𝑛 − 1 − ) × ∑ ln 𝜆𝑘
6
𝑘=1

Pour nos données :

#librairie pour calculs matriciels


import numpy

#librairie pour calculs statistiques


import [Link] as stats

#stat. de test Bartlett


C = -(n-1-(2*p+5)/6) * [Link]([Link](acp.eig_[0]))
print(C)

95.11987830353813

#degrés de liberté
ddl = p*(p-1)/2

#p-value
print([Link](C,df=ddl))

1.0891287871572786e-13

Manifestement, il y a de l’information exploitable à revendre dans les données « Autos ».

Il faut quand même prendre avec prudence ce test. Il a tendance à considérer toute configuration

significative à mesure que la taille de l’échantillon « n » augmente. Ce n’est guère étonnant,

« n » intervient dans la statistique mais pas dans le calcul des degrés de liberté. De fait, on

Méthodes Factorielles 53
ACP 45
recommande (Dugard et al., 2010) de ne l’utiliser que lorsque le ratio « n:p » (nombre

d’observations sur nombre de variables) est (approximativement) inférieur à 5 c.-à-d. lorsque

nous avons moins de 5 observations par variable.

[Link] Test des « bâtons brisés »

Ce test est dû à Frontier (1976) et Legendre-Legendre (1983). Il repose sur l’idée que si l’inertie

totale était dispatchée aléatoirement sur les axes, la distribution des valeurs propres suivrait la

loi des « bâtons brisés » (broken-stick). Elle a été tabulée semble-t-il. Mais il est très facile de

calculer la valeur critique pour le choix de « k » facteurs pour un test à 5%. Elle s’écrit :

𝑝
1
𝑏𝑘 = ∑
𝑖
𝑖=𝑘

Pour tester le 1er facteur pour les données « Autos » où (p = 6), la valeur seuil est :

1 1 1
𝑏1 = + + ⋯ + = 2.45
1 2 6

Pour le 2nd facteur,

1 1
𝑏2 = + ⋯ + = 1.45
2 6

Nous pouvons ainsi reconstruire le « Scree plot » en y faisant figurer les seuils définis par le

test des bâtons brisés.

#seuils pour test des bâtons brisés


b = [Link]([Link](1/[Link](p,0,-1)))
print(b)

[2.45 1.45 0.95 0.61666667 0.36666667 0.16666667]

#vérification des v.p. qui passent


fig, ax = [Link](figsize=(5,5))
[Link](range(1,p+1),acp.eig_[0],".-")
ax.set_xlabel("Nb. facteurs")
ax.set_ylabel("Val. propres")
[Link]("Val. propres et seuils des bâtons brisés")

#rajout du seuil des bâtons brisés


[Link](range(1,p+1),b,"r--",linewidth=1)

Méthodes Factorielles 54
ACP 46
[Link]()

Figure 10 - Valeurs propres et seuils des bâtons brisés - Données "Autos"

Ainsi, la procédure des bâtons brisés nous annonce que seul le 1er facteur est réellement

pertinent pour décrire les données.

Le test des bâtons brisés a plutôt bonne réputation. On lui reproche simplement de ne tenir

compte ni de « n » (le nombre d’observations) ni du ratio « n:p » dans la définition des valeurs

critiques (TUTO 3). Elle n’est valable que pour l’ACP normée.

[Link] Conclusion sur la détection du nombre de facteurs

Il n’y a pas de solution miracle pour l’identification du nombre de facteurs. Mis à part le test de

Bartlett qui répond à un cahier de charges très spécifique, les différentes techniques présentées

se valent et apportent des points de vue complémentaires dans notre pratique de l’ACP. Il n’y a

pas de vérités absolues en statistique exploratoire. Il y a seulement des pistes que nous devons

étudier attentivement en le reliant aux caractéristiques (objectifs, contexte) de notre étude et

de nos données. L’expertise métier est essentielle pour valider les résultats. Il y a aussi une part

d’intuition qui tient à l’expérience du data scientist. Sur les données « Autos », il faut en réalité

sélectionner (q = 2) composantes… qui deviennent évidentes : soit après rotation des facteurs

(section 2.2), soit en travaillant sur les corrélations partielles (section 2.4).

Méthodes Factorielles 55
ACP 47
1.3.2 Représentation des variables et aides à l’interprétation

Les composantes représentent les « dimensions » que recèlent les données que nous analysons.

Pour comprendre leur nature, il faut pouvoir les mettre en relation avec les variables qui pèsent

plus ou moins dans leur construction.

Corrélation. La corrélation des variables avec les composantes – qui correspond aussi à leurs

coordonnées - est un outil privilégié pour l’interprétation du repère factoriel. Il n’est pas

nécessaire de les calculer ex-post, nous pouvons les déduire directement des valeurs et vecteurs

propres :

𝑟𝑗 (𝐹𝑘 ) = √𝜆𝑘 × 𝑎𝑗𝑘

Nous affichons les corrélations sur les (q = 2) premières composantes de l’ACP sur « Autos ».

#corrélation des variables avec les facteurs


print([Link](acp.col_coord_[:,:2],index=[Link]))

0 1
CYL 0.893464 -0.114906
PUISS 0.886858 -0.384689
LONG 0.886155 0.381029
LARG 0.813536 0.412736
POIDS 0.905187 0.224532
VMAX 0.754710 -0.573519

Nous observons :

− Que toutes les variables déterminent plus ou moins le 1er facteur, avec des corrélations

élevées (toutes positives ici). On parle d’effet taille dans ce type de situation. Une des

variables pèse sur l’ensemble des autres et masque les différences. Nous en reparlerons plus

loin (section 2.4). En l’état, on peut y voir une opposition entre les citadines (« petites »

voitures à faible encombrement avec un moteur réduit) et les routières (« grosses » voitures

à forte cylindrée). Le facteur traduit la « gamme » des véhicules.

− Pour le 2nd facteur, vu la corrélation avec VMAX, on peut le voir comme reflétant la

« sportivité » des véhicules. On pourrait être amené à penser qu’il y a une opposition entre

(vitesse maximum) d’une part, (largeur) d’autre part. En réalité, il faut être circonspect

parce que la lecture dépend de la position sur le premier facteur. En investiguant deux

Méthodes Factorielles 56
ACP 48
secondes, nous constatons que c’est une fausse impression que l’on ne retrouve absolument

dans les nuages de points des variables prises deux à deux (Figure 3).

Pour une meilleure lisibilité, on privilégie une vue synthétique avec le « cercle des

corrélations ». Ce sont les « directions » qui importent, d’où les flèches dans la représentation

graphique. Elles permettront de comprendre les positions relatives des observations dans la

« carte des individus » (section 1.3.3).

#cercle des corrélations


acp.correlation_circle(num_x_axis=1,num_y_axis=2)

Figure 11 - Cercle des corrélations - Données "Autos"

Clairement ici, la cylindrée joue un rôle central (c’est le cas de le dire) en étant corrélée avec les

autres variables.

Remarque : Nous sommes dans une situation simple dans notre exemple. Les (q = 2) premiers

facteurs suffisent pour décrire les données. Sinon, il faudrait considérer les représentations

factorielles par paires de composantes. La gymnastique est autrement plus complexe.

Cosinus2. Le COS2 désigne la qualité de la représentation des variables (𝑥𝑗 ) sur une composante.

Elle correspond au carré du coefficient de corrélation, elle est définie entre 0 et 1 :

2
𝐶𝑂𝑆𝑗𝑘 = 𝑟𝑗2 (𝐹𝑘 )

Méthodes Factorielles 57
ACP 49
Il présente l’avantage de s’additionner d’un facteur à l’autre. Pour indiquer l’information de la

variable (𝑥𝑗 ) restituée sur les (q) premiers facteurs, nous faisons :

𝑞
2
∑ 𝐶𝑂𝑆𝑗𝑘
𝑘=1

Et lorsque nous considérons l’ensemble des (p) facteurs, nous avons capté toute l’information

portée par une variable :

𝑝
2
∑ 𝐶𝑂𝑆𝑗𝑘 =1
𝑘=1

Dans l’exemple « Autos », mis à part VMAX et LARG, toutes les variables sont bien représentées

dès le 1er facteur. Nous avons épuisé quasiment toute l’information portée par chaque variable

dès le 2nd facteur puisque, dans le pire des cas, nous avons au moins restitué 81% de l’information

disponible (CYL).

#cos2 des variables sur les 2 facteurs


print([Link](acp.col_cos2_[:,:2],index=[Link]))

0 1
CYL 0.798277 0.013203
PUISS 0.786517 0.147986
LONG 0.785270 0.145183
LARG 0.661841 0.170351
POIDS 0.819364 0.050415
VMAX 0.569588 0.328925

#cos2 cumulé sur les 2 premiers facteurs


print([Link]([Link](acp.col_cos2_[:,:2],axis=1),index=[Link]))

0 1
CYL 0.798277 0.811481
PUISS 0.786517 0.934503
LONG 0.785270 0.930453
LARG 0.661841 0.832192
POIDS 0.819364 0.869779
VMAX 0.569588 0.898512

Contributions. Les contributions matérialisent l’influence d’une variable dans la définition de

chaque composante. Elles sont basées également sur le carré des corrélations, mais normalisées

afin que leurs sommes sur chaque composante soit égale à 1.

Sachant que :

Méthodes Factorielles 58
ACP 50
𝑝

∑ 𝑟2𝑗 (𝐹𝑘 ) = 𝜆𝑘
𝑗=1

La contribution de la variable (𝑥𝑗 ) au facteur (Fk) s’écrit :

𝑟2𝑗 (𝐹𝑘 )
𝐶𝑇𝑅𝑗𝑘 =
𝜆𝑘

Voici les contributions aux deux premiers facteurs des données « Autos », exprimées en

pourcentage. La somme en colonne fait bien 100%.

#contributions des variables sur les 2 premiers facteurs (en %)


print([Link](acp.col_contrib_[:,:2],index=[Link]))

0 1
CYL 18.057062 1.542342
PUISS 17.791052 17.286793
LONG 17.762847 16.959384
LARG 14.970882 19.899361
POIDS 18.534057 5.889155
VMAX 12.884099 38.422964

Pas de surprise ici, les variables les plus corrélées avec les facteurs sont celles qui pèsent le plus

dans leur définition.

Remarque 1 : En analyse en composantes principales, les COS2 et CTR apportent peu dans

l’interprétation des résultats par rapport à la corrélation des variables aux facteurs. En effet,

cette dernière étant bornée entre -1 et +1, elle permet déjà des comparaisons directes.

Remarque 2 : Lors de la reconstitution des corrélations dans l’espace factoriel (section [Link]),

l’approximation sera d’autant meilleure que les COS2 des variables traitées seront élevés.

1.3.3 Représentation des individus et aides à l’interprétation

Dans la culture francophone de l’analyse des données, la popularité de l’analyse en composantes

principales repose pour beaucoup sur les cartes des individus. Je trouve pour ma part assez

addictif de pouvoir positionner des objets dans un repère, pouvoir comprendre les proximités et

les oppositions en les reliant à leurs (multiples) caractéristiques, surtout si l’on dispose par

ailleurs de quelques connaissances du domaine. Pour l’exemple des données « Autos », le féru

des automobiles des années 70 que je suis comprend intuitivement pourquoi les voitures

Méthodes Factorielles 59
ACP 51
italiennes (de ces années-là !) sont regroupées dans une zone spécifique du plan factoriel,

pourquoi la Renault 30 est si différente, etc. Pouvoir associer ces connaissances a priori à des

descriptions objectives est jouissif.

Coordonnées des individus. Les coordonnées des individus peuvent être obtenues : soit en

appliquant les vecteurs propres de la matrice des corrélations aux valeurs centrées et réduites

(Z) (section 1.2.1) ; soit en pondérant les vecteurs singuliers à gauche U (left-singular vectors)

par les valeurs singulières lors de la décomposition en valeurs singulières de la matrice Z (section

1.2.2). Elles correspondent au champ « .row_coord_ » de notre objet ACP.

#coordonnées factorielles des individus dans le plan


print([Link](acp.row_coord_[:,:2],index=[Link]))

0 1
Modele
Alfasud TI -2.138924 -1.785681
Audi 100 1.561459 1.527040
Simca 1300 -1.119385 0.674505
Citroen GS Club -2.573742 -0.112884
Fiat 132 0.427855 -0.695567
Lancia Beta -0.304238 0.196149
Peugeot 504 0.683928 0.933057
Renault 16 TL -1.948493 0.980448
Renault 30 4.409735 -1.063633
Toyota Corolla -3.985782 -0.236240
Alfetta 1.66 0.437658 -1.912448
Princess 1800 1.018175 0.841712
Datsun 200L 2.941080 0.559175
Taunus 2000 1.314880 -0.486522
Rancho -0.691111 0.897721
Mazda 9295 0.385709 -0.356185
Opel Rekord 2.289768 -0.104345
Lada 1300 -2.708574 0.143699

Nous nous empressons de réaliser la représentation graphique des individus dans le plan

factoriel. Une fonction dédiée réalise le travail pour nous.

#carte des individus


acp.mapping_row(num_x_axis=1,num_y_axis=2,figsize=(10,10))

Attention ! Les librairies graphiques procèdent quasiment toujours à une mise à l’échelle

automatique pour que les points « remplissent » au mieux le canevas de présentation. De fait,

la lecture doit tenir compte des proportions de variance expliquées en abscisse (73.68%) et en

ordonnée (14.27%) (Figure 12) pour éviter les conclusions intempestives.

Méthodes Factorielles 60
ACP 52
Figure 12 - Carte des individus - Version 1 - Données "Autos"

Sans ces indications, nous serions tentés de dire que :

a. l’écart entre la Simca 1300 et la Lancia Beta se joue plus sur l’ordonnée (Dim 2) que sur

l’abscisse (Dim 1) ;

b. la Peugeot 504 est à égale distance de l’Audi 100 et de la Datsun 200L.

Or, ces deux assertions s’avèrent fausses si l’on procède aux calculs à partir des coordonnées

factorielles. En effet (les coordonnées sont visibles dans la sortie Python ci-dessus) :

2
a. 𝑑 2 (𝑆𝑖𝑚𝑐𝑎, 𝐿𝑎𝑛𝑐𝑖𝑎) = (−1.12 − (−0.30)) + (0.67 − 0.20)2 = 0.66 + 0.23 = 0.89 ; l’écart se

fait plus sur le 1er facteur que sur le 2nd en réalité.

b. 𝑑 2 (𝐴𝑢𝑑𝑖, 504) = (1.56 − 0.68)2 + (1.53 − 0.93)2 = 1.12 et 𝑑 2 (𝐷𝑎𝑡𝑠𝑢𝑛, 504) = (2.94 −

0.68)2 + (0.56 − 0.93)2 = 5.23 ; la Datsun s’avère nettement plus éloignée de la 504 que

ne l’est l’Audi 100, on le perçoit visuellement uniquement si l’on a intégré que la

dispersion est plus forte sur le 1er facteur.

Méthodes Factorielles 61
ACP 53
C’est pour cette raison que je préconise systématiquement de fixer la même échelle en abscisse

et en ordonnée des graphiques factoriels. Les positions relatives sont alors ramenées à de plus

justes proportions, et reflètent plus fidèlement les écarts et leur nature (Figure 13).

#graphique avec les échelles carrées


fig, ax = [Link](figsize=(10,10))
[Link](acp.row_coord_[:,0],acp.row_coord_[:,1],'wo')
[Link]([-5,+5,-5,+5])
[Link]([-5,+5],[0,0],color='silver',linestyle='--')
[Link]([0,0],[-5,+5],color='silver',linestyle='--')
ax.set_xlabel("Dim.1 (73.68%)")
ax.set_ylabel("Dim.2 (14.27%)")
[Link]("Carte des individus")

for i in range(n):
[Link](acp.row_coord_[i,0],acp.row_coord_[i,1],[Link][i])

[Link]()

Figure 13 - Carte des individus - Version 2 - Données "Autos"

Cosinus2 (COS2). Les cosinus expriment la qualité de représentation des individus. Ils sont basés

sur le carré des coordonnées mais normalisées d’une manière spécifique. Pour les comprendre,

intéressons-nous tout d’abord au concept de distance à l’origine.

Méthodes Factorielles 62
ACP 54
Rappelons que l’inertie totale du nuage de points s’écrit :

𝑛
1
𝐼𝑝 = ∑ 𝑑 2 (𝑖, 𝐺)
𝑛
𝑖=1

Nous travaillons sur (Z) qui est centrée, et éventuellement réduite, le barycentre et l’origine

sont confondus, l’inertie devient :

𝑛 𝑛 𝑝
1 1
𝐼𝑝 = ∑ 𝑑𝑖2 = ∑ ∑ 𝑧𝑖𝑗
2
𝑛 𝑛
𝑖=1 𝑖=1 𝑗=1

La quantité (𝑑𝑖2) indique la part de l’individu dans l’inertie totale, dans l’espace des variables

centrées et éventuellement réduites (zj) : c’est le carré de la distance à l’origine.

Notons une équivalence très importante : nous pouvons reconstituer cette distance dans

l’espace factoriel si nous prenons tous les (p) facteurs.

𝑑𝑖2 2
= ∑ 𝐹𝑖𝑘
𝑘=1

Le cosinus² de l’individu n°i sur le facteur (Fk), qui désigne la qualité de représentation de

l’individu, est défini par le rapport :

2
2
𝐹𝑖𝑘
𝐶𝑂𝑆𝑖𝑘 = 2
𝑑𝑖

Un individu est parfaitement représenté lorsque nous prenons en compte l’ensemble des (p)

composantes. Il vient la naturellement,

𝑝
2
∑ 𝐶𝑂𝑆𝑖𝑘 =1
𝑘=1

En pratique, on s’intéressera à la somme cumulée sur les (q) premiers facteurs pour savoir si un

individu est bien représenté dans l’espace factoriel que l’on s’est choisi.

Méthodes Factorielles 63
ACP 55
𝑞
2 2
𝐶𝑂𝑆𝑖(𝑞) = ∑ 𝐶𝑂𝑆𝑖𝑘
𝑘=1

Pour les COS2, je conseille habituellement aux étudiants de regarder en priorité les individus qui

présentent une valeur anormalement faible (par rapport aux autres) sur le cumul des (q) facteurs

analysés. Cela indique qu’ils présentent des particularités qui les distinguent de la « tendance »

générale. Il est toujours intéressant de savoir pourquoi.

Dans le code Python qui suit, nous calculons tout d’abord la distance à l’origine de chaque individu

de deux manières : dans l’espace des variables centrées et réduites, dans l’espace factoriel

incluant tous les facteurs.

#données cenrrées et réduites


Z = ([Link] - acp.means_) / acp.std_

#distance à l'origine des individus dans le repère initial


disto = numpy.apply_along_axis(arr=Z,axis=1,func1d=lambda x: [Link](x**2))

#distance à l'origine à partir des coordonnées factorielles


distoBis = [Link](acp.row_coord_**2,axis=1)

#affichage de contrôle
print([Link]([Link]([Link]([disto,distoBis])),index=[Link]))

0 1
Modele
Alfasud TI 8.225176 8.225176
Audi 100 6.673755 6.673755
Simca 1300 2.159327 2.159327
Citroen GS Club 6.780145 6.780145
Fiat 132 1.169124 1.169124
Lancia Beta 1.134950 1.134950
Peugeot 504 1.512793 1.512793
Renault 16 TL 5.636826 5.636826
Renault 30 21.789657 21.789657
Toyota Corolla 16.290143 16.290143
Alfetta 1.66 4.456770 4.456770
Princess 1800 1.952513 1.952513
Datsun 200L 11.112624 11.112624
Taunus 2000 2.452986 2.452986
Rancho 1.963373 1.963373
Mazda 9295 0.684521 0.684521
Opel Rekord 6.083119 6.083119
Lada 1300 7.922198 7.922198

Les résultats sont cohérents, c’est toujours rassurant. Au-delà du COS2 qui nous calculerons

tout de suite après, nous remarquons le rôle important de la Renault 30, la Toyota Corolla et

Méthodes Factorielles 64
ACP 56
Datsun 200L. C’est sans surprise que nous les retrouvons aux extrémités de la première

composante principale.

Nous formons les COS2 et nous comparons avec ceux fournis directement par la classe PCA.

#cos2 des individus


lig_cos2 = numpy.apply_along_axis(arr=acp.row_coord_[:,:2],axis=0,func1d=lambda x: (x**2)/disto)
print([Link](lig_cos2,index=[Link]))

0 1
Modele
Alfasud TI 0.556218 0.387670
Audi 100 0.365334 0.349406
Simca 1300 0.580284 0.210694
Citroen GS Club 0.976992 0.001879
Fiat 132 0.156579 0.413826
Lancia Beta 0.081555 0.033900
Peugeot 504 0.309202 0.575488
Renault 16 TL 0.673539 0.170535
Renault 30 0.892431 0.051920
Toyota Corolla 0.975219 0.003426
Alfetta 1.66 0.042978 0.820652
Princess 1800 0.530947 0.362855
Datsun 200L 0.778390 0.028137
Taunus 2000 0.704819 0.096496
Rancho 0.243273 0.410469
Mazda 9295 0.217336 0.185337
Opel Rekord 0.861900 0.001790
Lada 1300 0.926052 0.002607

#affichage de contrôle : COS2 de l'outil PCA


print([Link](acp.row_cos2_[:,:2],index=[Link]))

0 1
Modele
Alfasud TI 0.556218 0.387670
Audi 100 0.365334 0.349406
Simca 1300 0.580284 0.210694
Citroen GS Club 0.976992 0.001879
Fiat 132 0.156579 0.413826
Lancia Beta 0.081555 0.033900
Peugeot 504 0.309202 0.575488
Renault 16 TL 0.673539 0.170535
Renault 30 0.892431 0.051920
Toyota Corolla 0.975219 0.003426
Alfetta 1.66 0.042978 0.820652
Princess 1800 0.530947 0.362855
Datsun 200L 0.778390 0.028137
Taunus 2000 0.704819 0.096496
Rancho 0.243273 0.410469
Mazda 9295 0.217336 0.185337
Opel Rekord 0.861900 0.001790
Lada 1300 0.926052 0.002607

Le cumul sur les deux premiers facteurs est plus intéressant puisque nous avons fait le choix de

travailler dans le premier plan factoriel.

Méthodes Factorielles 65
ACP 57
#cumul sur les 2 premiers facteurs
print([Link]([Link](acp.row_cos2_[:,:2],axis=1),index=[Link]))

0 1
Modele
Alfasud TI 0.556218 0.943889
Audi 100 0.365334 0.714741
Simca 1300 0.580284 0.790978
Citroen GS Club 0.976992 0.978871
Fiat 132 0.156579 0.570405
Lancia Beta 0.081555 0.115454
Peugeot 504 0.309202 0.884690
Renault 16 TL 0.673539 0.844075
Renault 30 0.892431 0.944351
Toyota Corolla 0.975219 0.978645
Alfetta 1.66 0.042978 0.863630
Princess 1800 0.530947 0.893802
Datsun 200L 0.778390 0.806527
Taunus 2000 0.704819 0.801315
Rancho 0.243273 0.653742
Mazda 9295 0.217336 0.402674
Opel Rekord 0.861900 0.863690
Lada 1300 0.926052 0.928659

La Lancia Beta ne suit pas la tendance générale visiblement, seule 11% de l’information qu’elle

véhicule (hum !) est captée par les (q=2) premiers facteurs. En revenant au tableau de données,

on se rend compte qu’elle est assez particulière par rapport aux autres : son petit moteur

(cylindrée) n’est pas vraiment en phase avec ce que l’on attendrait en termes de puissance,

vitesse maximale, où on la situerait plutôt parmi les berlines moyennes.

Contributions (CTR). Les contributions sont également basées sur le carré des coordonnées
1
factorielles, mais normalisées par la variance restituée (au facteur près) pour que leur somme
𝑛

par composante soit égale à 1. Elles expriment l’importance relative des individus dans la

construction des facteurs.

2
𝐹𝑖𝑘
𝐶𝑇𝑅𝑖𝑘 =
𝑛 × 𝜆𝑘

Avec

∑ 𝐶𝑇𝑅𝑖𝑘 = 1
𝑖=1

Méthodes Factorielles 66
ACP 58
Dans le cas des contributions, notre œil devrait être attiré par les valeurs fortes. Elles indiquent

les individus déterminants dans la lecture des composantes. Ils permettent d’asseoir les

interprétations. On devra se méfier néanmoins des influences anormalement élevées, elles sont

plutôt symptomatiques d’observations atypiques susceptibles de fausser les résultats.

Nous calculons les contributions sur les 2 premiers facteurs (en pourcentage), puis nous

comparons de nouveau les résultats avec ceux de l’outil PCA. Tout va pour le mieux.

#contributions sur les 2 premiers facteurs


lig_ctr = (acp.row_coord_[:,:2]**2)/(n*acp.eig_[0][:2])*100
print([Link](lig_ctr,index=[Link]))

0 1
Modele
Alfasud TI 5.749254 20.693307
Audi 100 3.063951 15.132933
Simca 1300 1.574636 2.952519
Citroen GS Club 8.324360 0.082697
Fiat 132 0.230046 3.139789
Lancia Beta 0.116318 0.249686
Peugeot 504 0.587817 5.649867
Renault 16 TL 4.771099 6.238372
Renault 30 24.436884 7.341856
Toyota Corolla 19.964025 0.362185
Alfetta 1.66 0.240708 23.735669
Princess 1800 1.302765 4.597791
Datsun 200L 10.870129 2.029163
Taunus 2000 2.172668 1.536130
Rancho 0.600229 5.230043
Mazda 9295 0.186956 0.823327
Opel Rekord 6.588764 0.070658
Lada 1300 9.219391 0.134007

#vérification avec l'outil PCA


print([Link](acp.row_contrib_[:,:2],index=[Link]))

0 1
Modele
Alfasud TI 5.749254 20.693307
Audi 100 3.063951 15.132933
Simca 1300 1.574636 2.952519
Citroen GS Club 8.324360 0.082697
Fiat 132 0.230046 3.139789
Lancia Beta 0.116318 0.249686
Peugeot 504 0.587817 5.649867
Renault 16 TL 4.771099 6.238372
Renault 30 24.436884 7.341856
Toyota Corolla 19.964025 0.362185
Alfetta 1.66 0.240708 23.735669
Princess 1800 1.302765 4.597791
Datsun 200L 10.870129 2.029163
Taunus 2000 2.172668 1.536130
Rancho 0.600229 5.230043
Mazda 9295 0.186956 0.823327

Méthodes Factorielles 67
ACP 59
Opel Rekord 6.588764 0.070658
Lada 1300 9.219391 0.134007

L’outil propose un affichage graphique des (nb_values) contributions les plus importantes selon

les facteurs (num_axis) (Figure 14). Solution pratique lorsque la taille du jeu de données est

importante. Dans une étude réelle, il faudrait se poser des questions sur le rôle de la Renault 30.

C’est la seule routière du lot finalement, la seule équipée d’un moteur V6 de surcroît.

#affichage graphique - 1er facteur


acp.plot_row_contrib(num_axis=1,nb_values=5)

Figure 14 - 5 plus fortes contributions au premier facteur de l’ACP - Données "Autos"

Remarque : Nous comprenons aisément au regard des formules que les individus situés aux

extrémités des facteurs sont les mieux représentés (COS2) et sont les plus influents (CTR).

1.3.4 Relation de transition

Puisque l’analyse en composantes principales est duale par nature, il existe une relation entre

les coordonnées factorielles des individus (𝐹𝑖𝑘 ) et celles des variables [les corrélations, 𝑟𝑗 (𝐹𝑘 )] via

les formules dites de transition.

Pour obtenir les coordonnées de l’individu n°i sur le facteur (Fk) à partir des coordonnées des

variables, la transition s’écrit :

𝑝
1
𝐹𝑖𝑘 = ∑ 𝑧𝑖𝑗 × 𝑟𝑗 (𝐹𝑘 )
√𝜆𝑘 𝑗=1

Méthodes Factorielles 68
ACP 60
Nous vérifions cela très facilement sous Python. Les coordonnées ainsi calculées pour le 1er

facteur correspondent parfaitement aux coordonnées des individus fournies par l’outil PCA.

#coordonnées des individus à partir des variables - Facteur 1


f1 = 1/[Link](acp.eig_[0][0]) * [Link](Z,acp.col_coord_[:,0])

#affichage + vérification avec coordonnées de PCA


print([Link]([Link]([Link]([f1,acp.row_coord_[:,0]])),index=[Link]))

0 1
Modele
Alfasud TI -2.138924 -2.138924
Audi 100 1.561459 1.561459
Simca 1300 -1.119385 -1.119385
Citroen GS Club -2.573742 -2.573742
Fiat 132 0.427855 0.427855
Lancia Beta -0.304238 -0.304238
Peugeot 504 0.683928 0.683928
Renault 16 TL -1.948493 -1.948493
Renault 30 4.409735 4.409735
Toyota Corolla -3.985782 -3.985782
Alfetta 1.66 0.437658 0.437658
Princess 1800 1.018175 1.018175
Datsun 200L 2.941080 2.941080
Taunus 2000 1.314880 1.314880
Rancho -0.691111 -0.691111
Mazda 9295 0.385709 0.385709
Opel Rekord 2.289768 2.289768
Lada 1300 -2.708574 -2.708574

Inversement, il est possible d’obtenir les coordonnées des variables 𝑟𝑗 (𝐹𝑘 ) à partir de celles des

individus (𝐹𝑖𝑘 ) :

𝑛
1
𝑟𝑗 (𝐹𝑘 ) = ∑ 𝑧𝑖𝑗 × 𝐹𝑖𝑘
𝑛 √𝜆𝑘 𝑖=1

De nouveau sous Python, toujours pour le 1er facteur,…

#coordonnées des variables à partir des individus


r1 = 1/(n*[Link](acp.eig_[0][0])) * [Link]([Link](Z),acp.row_coord_[:,0])

#affichage + vérification avec corrélations de PCA


print([Link]([Link]([Link]([r1,acp.col_coord_[:,0]])),index=[Link]))

0 1
CYL 0.893464 0.893464
PUISS 0.886858 0.886858
LONG 0.886155 0.886155
LARG 0.813536 0.813536
POIDS 0.905187 0.905187
VMAX 0.754710 0.754710

Méthodes Factorielles 69
ACP 61
Ces relations légitiment la lecture conjointe des cartes des variables et des individus c.-à-d.

pour expliquer les positions relatives entre les individus, on s’intéresse aux directions exprimées

par les corrélations des variables avec les axes. Par exemple, la Renault 30 et la Toyota Corolla

s’opposent sur le premier axe (Figure 13) à cause du différentiel de cylindrée (Figure 11).

Biplot. Pour aller plus loin, certains outils proposent un graphique « biplot », assez séduisant au

demeurant, pour représenter simultanément les individus et les variables. Il ne doit pas nous

induire en erreur. Pour les individus, nous raisonnons en positions relatives dans le repère ; pour

les variables, nous raisonnons en directions. Mais les proximités entre individus et variables

n’ont aucun sens. Une fois cette précaution assimilée, nous représentons ci-dessous le

graphique « biplot » produit par la fonction princomp() du logiciel R (Figure 15).

Figure 15 - Représentation "biplot" - Données "Autos"

Annoncer par exemple à la lecture de ce graphique que la Renault 30 serait puissante (proche de

PUISS) mais légère (éloigné de POIDS) est erroné. Dire en revanche que le 1er facteur est défini

positivement par l’ensemble des variables, et que la Renault 30, située à son extrémité-est,

réunit les caractéristiques de (POIDS, VMAX, etc.) élevées, est correct.

Méthodes Factorielles 70
ACP 62
1.4 Reconstitution des données

L’ACP préserve au mieux les distances entre individus et les corrélations entre les variables dans

un espace de représentation de dimension réduite. Elle permet également de reconstituer – de

façon approximative - les valeurs initiales des données en se focalisant sur les formes

essentielles captées sur les composantes. Ce faisant, elle évacue le bruit résiduel contenu dans

les données. Cette fonctionnalité est souvent mise en avant dans le traitement d’images, lors

des opérations de compression avec perte, que l’on essaie de contrôler avec la détermination de

la taille de la dimensionnalité à retenir. Elle est moins mise en avant sur les données tabulaires

usuelles. Pourtant, je lui vois au moins une propriété très intéressante, un peu à la manière des

auto-encodeurs (« Auto-encodeur avec Keras sous Python », novembre 2019), elle contribue à

l’identification des observations atypiques par comparaison entre les valeurs observées et

« estimées », celles dont les caractéristiques diffèrent de la tendance générale.

Revenons sur quelques formules importantes pour décrypter le mécanisme. Les coordonnées

factorielles des individus est obtenu par le produit matriciel :

𝐹(𝑝) = 𝑍 𝑎(𝑝)

Où (Z) est la matrice des données centrées et réduites, de dimension (n, p) ; F(p) les coordonnées

factorielles sur l’ensemble des (p) facteurs (n, p) ; a(p) est la matrice des vecteurs propres (p,p),

elle est orthogonale, son inverse est égale à sa transposée.

Il est très facile de calculer les coordonnées dans l’espace originel à partir des coordonnées

factorielles, si l’on prend tous les (p) facteurs :

𝑇
𝑍 = 𝐹(𝑝) 𝑎(𝑝)

Nous avons une approximation si l’on ne prend que les (q < p) premiers facteurs :

𝑍̂ = 𝐹(𝑞) 𝑎(𝑞)
𝑇

Sachant que les variables ont été centrées et réduits avec la formule :

Méthodes Factorielles 71
ACP 63
𝑥𝑖𝑗 − 𝑥̅𝑗
𝑧𝑖𝑗 =
𝜎𝑗

Les valeurs estimées « déstandardisées » s’écrivent :

𝑥̂𝑖𝑗 = 𝑧̂𝑖𝑗 × 𝜎𝑗 + 𝑥̅𝑗

Nous souhaitons reconstituer les données initiales à partir des (q = 2) premiers facteurs pour les

données « Autos ». L’objet PCA nous fournit tous les éléments de calculs. Nous affichons pour

contrôle les vecteurs propres (𝑎𝑗𝑘 ). Si elles ne sont pas directement disponibles, n’oublions pas
𝑟𝑗 (𝐹𝑘 )
que nous pouvons les obtenir à partir des corrélations des variables aux facteurs [ 𝑎𝑗𝑘 = ].
√𝜆𝑘

Puis nous calculons l’approximation des valeurs centrées et réduites.

#vecteurs propres (q = 2) premiers facteurs


print(acp.eigen_vectors_[:,:2])

[[ 0.42493602 -0.12419108]
[ 0.42179441 -0.41577389]
[ 0.42145993 0.41181773]
[ 0.38692224 0.446087 ]
[ 0.43051198 0.24267581]
[ 0.35894427 -0.6198626 ]]

#valeurs centrées et réduites reconstituées


ZC = [Link](acp.row_coord_[:,:2],[Link](acp.eigen_vectors_[:,:2]))
print(ZC)

[[-0.68714004 -0.15974647 -1.6368457 -1.6241662 -1.35417384 0.3391225 ]


[ 0.47387522 0.02371103 1.28695448 1.28535587 1.04280237 -0.38607854]
[-0.55943466 -0.75259209 -0.19400286 -0.13222707 -0.31822269 -0.81989747]
[-1.07965636 -1.03865558 -1.1312167 -1.04619406 -1.1354209 -0.85385718]
[ 0.26819434 0.46966566 -0.10612313 -0.14473684 0.01539943 0.58473234]
[-0.15364146 -0.20987928 -0.04744643 -0.03021689 -0.08337739 -0.23078966]
[ 0.17474853 -0.09946343 0.67249777 0.68085164 0.52086972 -0.33287478]
[-0.94974758 -1.22950797 -0.41744566 -0.31654998 -0.60091837 -1.30714333]
[ 2.00594882 2.30223229 1.42050343 1.23175145 1.64032553 2.2421554 ]
[-1.66436358 -1.58295814 -1.77713557 -1.64757164 -1.77325693 -1.28423718]
[ 0.42348573 0.97974779 -0.60312467 -0.68377858 -0.27568782 1.34254999]
[ 0.32812626 0.07949877 0.77575209 0.76943152 0.64259987 -0.15627763]
[ 1.18032648 1.00804104 1.46982552 1.3874099 1.40186847 0.70907252]
[ 0.61916179 0.75689253 0.35381082 0.29172512 0.44800453 0.77354586]
[-0.40516711 -0.66475603 0.07842183 0.13305548 -0.07967646 -0.80453439]
[ 0.20813654 0.31078209 0.01587771 -0.00964997 0.07961491 0.35923348]
[ 0.98596369 1.00919522 0.92207459 0.83941547 0.96045074 0.88657854]
[-1.16881662 -1.20220742 -1.08237754 -0.98390521 -1.13120118 -1.06130051]]

A partir des moyennes et écarts-type stockées par l’objet lors de la réalisation de l’ACP, nous

formons les valeurs reconstituées, puis nous affichons les valeurs initiales pour comparaisons.

Méthodes Factorielles 72
ACP 64
#moyennes
print(acp.means_)

[[1631.66666667 84.61111111 433.5 166.66666667 1078.83333333


158.27777778]]

#écarts-type
print(acp.std_)

[[363.39449027 19.80218531 21.48449053 5.16397779 133.09906503


11.79833112]]

#déstandardisation et décentrage
XC = [Link]()

#boucle sur les variables


for j in range(p):
XC[:,j] = ZC[:,j] * acp.std_[0][j] + acp.means_[0][j]

#print des valeurs approchées


print([Link](XC,columns=[Link],index=[Link]).round(1))

CYL PUISS LONG LARG POIDS VMAX


Modele
Alfasud TI 1382.0 81.4 398.3 158.3 898.6 162.3
Audi 100 1803.9 85.1 461.1 173.3 1217.6 153.7
Simca 1300 1428.4 69.7 429.3 166.0 1036.5 148.6
Citroen GS Club 1239.3 64.0 409.2 161.3 927.7 148.2
Fiat 132 1729.1 93.9 431.2 165.9 1080.9 165.2
Lancia Beta 1575.8 80.5 432.5 166.5 1067.7 155.6
Peugeot 504 1695.2 82.6 447.9 170.2 1148.2 154.4
Renault 16 TL 1286.5 60.3 424.5 165.0 998.9 142.9
Renault 30 2360.6 130.2 464.0 173.0 1297.2 184.7
Toyota Corolla 1026.8 53.3 395.3 158.2 842.8 143.1
Alfetta 1.66 1785.6 104.0 420.5 163.1 1042.1 174.1
Princess 1800 1750.9 86.2 450.2 170.6 1164.4 156.4
Datsun 200L 2060.6 104.6 465.1 173.8 1265.4 166.6
Taunus 2000 1856.7 99.6 441.1 168.2 1138.5 167.4
Rancho 1484.4 71.4 435.2 167.4 1068.2 148.8
Mazda 9295 1707.3 90.8 433.8 166.6 1089.4 162.5
Opel Rekord 1990.0 104.6 453.3 171.0 1206.7 168.7
Lada 1300 1206.9 60.8 410.2 161.6 928.3 145.8

#print des valeurs initiales pour comparaisons


print(D)

CYL PUISS LONG LARG POIDS VMAX


Modele
Alfasud TI 1350 79 393 161 870 165
Audi 100 1588 85 468 177 1110 160
Simca 1300 1294 68 424 168 1050 152
Citroen GS Club 1222 59 412 161 930 151
Fiat 132 1585 98 439 164 1105 165
Lancia Beta 1297 82 429 169 1080 160
Peugeot 504 1796 79 449 169 1160 154
Renault 16 TL 1565 55 424 163 1010 140
Renault 30 2664 128 452 173 1320 180
Toyota Corolla 1166 55 399 157 815 140
Alfetta 1.66 1570 109 428 162 1060 175

Méthodes Factorielles 73
ACP 65
Princess 1800 1798 82 445 172 1160 158
Datsun 200L 1998 115 469 169 1370 160
Taunus 2000 1993 98 438 170 1080 167
Rancho 1442 80 431 166 1129 144
Mazda 9295 1769 83 440 165 1095 165
Opel Rekord 1979 100 459 173 1120 173
Lada 1300 1294 68 404 161 955 140

Attardons-nous sur la Lancia Beta qui était mal représentée dans le premier plan factoriel avec

un COS2 de 11.54% (section 1.3.3). On sait pourquoi maintenant. Par rapport à ses caractéristiques

(vitesse, puissance, dimensions) qui la place plutôt parmi les berlines familiales de l’époque, elle

devrait présenter une cylindrée plus élevée (1575.8 cm3 estimée vs. 1297 cm3 observée).

1.5 Projection des individus supplémentaires

1.5.1 Principe et fonctions de projection

La projection des individus supplémentaires (ou illustratifs selon la finalité poursuivie) est une

fonctionnalité importante de l’analyse en composantes principales. L’objectif est de positionner

de nouveau individus par rapport à ceux (les individus actifs, l’échantillon d’apprentissage,

l’échantillon de référence) qui ont contribué à la construction du repère factoriel.

On peut voir plusieurs motivations à cette démarche :

− Situer les positions des individus qui ont été collectés après coup.

− Identifier parmi ces individus ceux dont les caractéristiques diffèrent significativement

de l’échantillon de référence. On parle de détection de nouveautés (novelty detection,

« Détection des anomalies sous Python », mars 2020).

− Positionner des individus appartenant à une population différente ou spécifique. Par

exemple, dans les années 70, voir comment se placent les véhicules du bloc de l’est aurait

pu être intéressant. Il y a déjà une Lada dans les individus actifs, mais on pourrait

analyser les caractéristiques des Skoda, Tatra, Dacia et autres Trabant (de l’époque) en

référence à ceux du fichier.

− Intégrer après coup les observations jugées trop atypiques ou influentes, qui étaient

susceptibles de fausser la construction du repère factoriel. On aurait pu écarter la

Méthodes Factorielles 74
ACP 66
Renault 30 des calculs par exemple, du fait de son influence très marquée sur les 2

premiers facteurs, puis l’ajouter comme individu supplémentaire par la suite.

Les coefficients des vecteurs propres (ajk) font office de paramètres dans la fonction de

projection permettant de calculer les coordonnées d’un individu supplémentaire (i*) sur le

facteur (Fk) :

𝐹𝑖 ∗ 𝑘 = 𝑎1𝑘 𝑧𝑖 ∗1 + ⋯ + 𝑎𝑗𝑘 𝑧𝑖 ∗𝑗 + ⋯ + 𝑎𝑝𝑘 𝑧𝑖 ∗𝑝

Où (𝑧𝑖 ∗ 𝑗 ) est la valeur centrée et réduite de (𝑥𝑖 ∗ 𝑗 ) avec les paramètres (moyenne, écart-type)

calculés sur l’échantillon d’apprentissage.

𝑥𝑖 ∗𝑗 − 𝑥̅𝑗
𝑧𝑖 ∗𝑗 =
𝜎𝑗

Certains logiciels comme TANAGRA fournit ainsi les coefficients standardisés (ajk) et les

paramètres de centrage et réduction pour qu’il soit possible de réaliser le déploiement à l’aide

d’autres outils (je demande aux étudiants de le faire sous Excel pour qu’ils décryptent bien le

mécanisme).

Factor Score Coefficients

Attribute Mean Std-dev Axis_1 Axis_2


CYL 1631.66667 363.39449 0.42494 -0.12419
PUISS 84.61111 19.80219 0.42179 -0.41577
LONG 433.50000 21.48449 0.42146 0.41182
LARG 166.66667 5.16398 0.38692 0.44609
POIDS 1078.83333 133.09907 0.43051 0.24268
VMAX 158.27778 11.79833 0.35894 -0.61986

Figure 16 - Coefficients et paramètres pour le déploiement sous TANAGRA - ACP - Données "Autos"

On peut même imaginer produire une fonction de projection avec des coefficients bruts (qui

s’appliquent directement sur les variables originelles, sans transformations préalables) pour

faciliter le déploiement.

𝐹𝑖 ∗ 𝑘 = 𝑏0𝑘 + 𝑏1𝑘 𝑥𝑖 ∗1 + ⋯ + 𝑏𝑗𝑘 𝑥𝑖 ∗𝑗 + ⋯ + 𝑏𝑝𝑘 𝑥𝑖 ∗𝑝

Méthodes Factorielles 75
ACP 67
𝑎𝑗𝑘
− 𝑏𝑗𝑘 = pour (j ≥ 1) ;
𝜎𝑗

𝑎𝑗𝑘 × 𝑥̅ 𝑗
− 𝑏0𝑘 = − ∑𝑝𝑗=1 𝜎𝑗

1.5.2 Exemple sur les données « Autos »

Nous souhaitons positionner deux véhicules supplémentaires dans le plan factoriel : une

« Peugeot 304 S » et une « Peugeot 604 ». Voici leurs caractéristiques :

#chargement des obs. supplémentaires


IndSup = pandas.read_excel("Data_Methodes_Factorielles.xlsx",sheet_name="DATA_ACP_IND_SUP",index_col=0)
print(IndSup)

CYL PUISS LONG LARG POIDS VMAX


Modele
Peugeot 604 2664 136 472 177 1410 180
Peugeot 304 S 1288 74 414 157 915 160

On connaît bien ces véhicules (304 S, petite sportive ; 604, routière statutaire), on imagine très

bien leurs voisinages respectifs. Voyons si l’ACP saura les positionner correctement.

La fonction « .transform() » de l’objet PCA fait merveille ici, nous pouvons lui envoyer la

description brute des individus supplémentaires, sans préparation préalable. Nous obtenons les

coordonnées factorielles (2 observations, p = 6 facteurs).

#coordonnées factorielles des individus supplémentaires


coordSup = [Link]([Link])
print(coordSup)

[[ 5.56329226 -0.33860928 0.46428878 -0.40214608 0.38981076 0.08102064]


[-2.21224139 -1.25777905 0.09304388 0.35370189 -0.648528 -0.12473042]]

Nous les plaçons dans le plan factoriel pour localiser leurs voisinages parmi les observations

actives.

#position des points supplémentaires dans le plan


fig, ax = [Link](figsize=(10,10))
[Link](acp.row_coord_[:,0],acp.row_coord_[:,1],'wo')
[Link]([-6.5,+6.5,-6.5,+6.5])
[Link]([-6.5,+6.5],[0,0],color='silver',linestyle='--')
[Link]([0,0],[-6.5,+6.5],color='silver',linestyle='--')
ax.set_xlabel("Dim.1")
ax.set_ylabel("Dim.2")
[Link]("Carte des individus")

#points actifs
for i in range(n):
[Link](acp.row_coord_[i,0],acp.row_coord_[i,1],[Link][i],color="dimgray")

Méthodes Factorielles 76
ACP 68
#points illutratifs
for i in range([Link][0]):
[Link](coordSup[i,0],coordSup[i,1],[Link][i],color="blue")

[Link]()

Figure 17 - Position des observations supplémentaires - Données "Autos"

Oui, la « 304 S » est une petite sportive, a l’instar de l’Alfasud TI (première version). Quant à la

604, elle était bien une concurrente directe de la Renault 30. Ces résultats confortent la

légitimité des résultats de l’ACP menée sur les données « Autos ».

1.5.3 Ellipse de Hotelling

Pour identifier les « nouveautés » c.-à-d. les individus supplémentaires dont les

caractéristiques diffèrent sensiblement de l’échantillon de référence, nous pouvons utiliser

l’ellipse de Hotelling (Tenenhaus, 2007, pages 178 à 180).

Le T2 de Hotelling d’une observation n°i dans un repère de dimension (q) s’écrit :

Méthodes Factorielles 77
ACP 69
𝑞
2
𝐹𝑖𝑘
𝑇𝑖2 =∑
𝜆𝑘
𝑘=1

On montre que la statistique…

𝑛(𝑛 − 𝑞) 2
𝑇
𝑞(𝑛2 − 1) 𝑖

… suit une loi de Fisher à (q, n-q) degrés de liberté. On peut dès lors définir une zone de

confiance au niveau 95%. Une observation supplémentaire est considérée atypique lorsque

𝑞(𝑛2 − 1)
𝑇𝑖2 ≥ 𝐹 (𝑞, 𝑛 − 𝑞)
𝑛(𝑛 − 𝑞) 0.95

Où 𝐹0.95 est le quantile de la loi de Fisher.

Dans le plan (q = 2), nous avons une ellipse d’équation :

2 2
𝐹𝑖1 𝐹𝑖2 𝑞(𝑛2 − 1)
+ = 𝐹 (𝑞, 𝑛 − 𝑞)
𝜆1 𝜆2 𝑛(𝑛 − 𝑞) 0.95

Pour en dessiner les contours autour de l’origine, nous devons en déterminer le diamètre sur

l’axe des abscisses (lorsque 𝐹2 = 0) et des ordonnées (lorsque 𝐹1 = 0).

𝑞(𝑛2 −1) 2(182 −1)


Si nous posons 𝑐 = 𝐹 = 18(18−2) 3.63 = 8.15. Les étendues en abscisse et ordonnées
𝑛(𝑛−𝑞) 0.95

sont égales à :

𝑒1 = 2√𝜆1 × 𝑐 = 12.0
{
𝑒2 = 2 √𝜆2 × 𝑐 = 5.28

Sous Python, nous calculons les diamètres en abscisse et ordonnée pour les données « Autos ».

#nombre de facteurs à prendre en compte


q = 2

#quantile de la loi de Fisher à 95%


pf = [Link](0.95,q,n-q)
print(pf)

Méthodes Factorielles 78
ACP 70
3.63372346759163

#seuil
c = (q*(n**2-1))/(n*(n-q))*pf
print(c)

8.150643611334003

#étendue en abscisse
e1 = 2*[Link](acp.eig_[0][0]*c)
print(e1)

12.005471835819806

#étendue en ordonnée
e2 = 2*[Link](acp.eig_[0][1]*c)
print(e2)

5.282975914670268

Et nous ajoutons l’ellipse dans le graphique des individus actifs et illustratifs.

#classe pour ellipse


from [Link] import Ellipse

#position des points supplémentaires dans le plan


#rajouter l'ellipse de Hotelling
fig, ax = [Link](figsize=(10,10))
[Link](acp.row_coord_[:,0],acp.row_coord_[:,1],'wo')
[Link]([-6.5,+6.5,-6.5,+6.5])
[Link]([-6.5,+6.5],[0,0],color='silver',linestyle='--')
[Link]([0,0],[-6.5,+6.5],color='silver',linestyle='--')
ax.set_xlabel("Dim.1")
ax.set_ylabel("Dim.2")
[Link]("Ellipse de Hotelling")

#points actifs
for i in range(n):
[Link](acp.row_coord_[i,0],acp.row_coord_[i,1],[Link][i],color="dimgray")

#points illutratifs
for i in range([Link][0]):
[Link](coordSup[i,0],coordSup[i,1],[Link][i],color="blue")

#ellispe de Hotelling – centrée autour de l’origine


ellipse = Ellipse((0,0),width=e1,height=e2,facecolor='none',edgecolor='tomato',linestyle='--')
ax.add_patch(ellipse)

[Link]()

Méthodes Factorielles 79
ACP 71
Figure 18 - Ellipse de confiance - Données "Autos"

La Peugeot 604 est en dehors de l’ellipse de confiance pour le niveau de 95% que l’on s’est choisi.

Ce résultat n’est pas étonnant lorsqu’on revient sur les données. Elle possède les valeurs plus

élevées de cylindrée (à égalité avec la Renault 30), puissance, longueur, largeur (idem Audi 100),

poids et vitesse maximum (idem Renault 30). Elle est « hors norme » en ce sens.

1.6 Traitement des variables illustratives

Les variables illustratives ont pour vocation de renforcer l’interprétation des composantes. Elles

ne sont pas utilisées pour leur construction, elles interviennent seulement après coup pour

mieux comprendre et commenter les résultats. Pour l’exemple des données « Autos », nous

avons utilisé en variables actives les caractéristiques intrinsèques des véhicules (largeur, poids,

puissance, etc.) pour élaborer les facteurs. Nous nous appuyons ensuite sur des variables

illustratives intégrant des considérations subjectives (prix, finition) ou calculées ex-post

Méthodes Factorielles 80
ACP 72
(rapport poids-puissance) pour entériner leurs positions relatives dans la représentation

factorielle.

Pour les données « Autos », nous chargeons la 3ème feuille de calcul composée des variables

illustratives pour les mêmes (n = 18) véhicules.

#variables illustratives
varIllus = pandas.read_excel("Data_Methodes_Factorielles.xlsx",sheet_name="DATA_ACP_VAR_ILLUS",index_col=0)
print(varIllus)

FINITION PRIX RPOIDPUIS


Modele
Alfasud TI 2_B 30570 11.012658
Audi 100 3_TB 39990 13.058824
Simca 1300 1_M 29600 15.441176
Citroen GS Club 1_M 28250 15.762712
Fiat 132 2_B 34900 11.275510
Lancia Beta 3_TB 35480 13.170732
Peugeot 504 2_B 32300 14.683544
Renault 16 TL 2_B 32000 18.363636
Renault 30 3_TB 47700 10.312500
Toyota Corolla 1_M 26540 14.818182
Alfetta-1.66 3_TB 42395 9.724771
Princess-1800 2_B 33990 14.146341
Datsun-200L 3_TB 43980 11.913043
Taunus-2000 2_B 35010 11.020408
Rancho 3_TB 39450 14.112500
Mazda-9295 1_M 27900 13.192771
Opel-Rekord 2_B 32700 11.200000
Lada-1300 1_M 22100 14.044118

L’idée est de conforter les résultats de l’ACP avec ces nouvelles variables. Les indicateurs utilisés

ne sont pas les mêmes selon qu’elles sont quantitatives ou qualitatives.

1.6.1 Variable illustrative quantitative

Corrélation. La corrélation avec les facteurs est l’indicateur naturel pour positionner une

variable supplémentaire quantitative dans le repère factoriel. Si (y) est la variable à analyser, le

coefficient s’écrit :

1 𝑛
∑𝑖=1(𝑦𝑖 − 𝑦̅)(𝐹𝑖𝑘 − 𝐹̅𝑘 )
𝑟𝑦 (𝐹𝑘 ) = 𝑛
𝜎𝑦 × 𝜎𝐹𝑘
1 𝑛
∑𝑖=1(𝑦𝑖 − 𝑦̅) 𝐹𝑖𝑘
= 𝑛
𝜎𝑦 × √𝜆𝑘

Méthodes Factorielles 81
ACP 73
En pratique, il s’agit de faire simplement appel aux librairies de calcul du langage utilisé. Sous

Python, nous utilisons corrcoef() de « Numpy ». Pour « prix » et « rapport poids-puissance »

sur les deux premiers facteurs, nous avons :

#corrélation de PRIX avec les 2 premiers facteurs


cPrix = [Link]([Link],acp.row_coord_[:,:2],rowvar=False)[0,1:]
print(cPrix)

[ 0.77247524 -0.08670844]

#corrélation de RPOIDPUIS avec les 2 premiers facteurs


cRPP = [Link]([Link],acp.row_coord_[:,:2],rowvar=False)[0,1:]
print(cRPP)

[-0.58903888 0.67254512]

Ainsi :

− Le prix est fortement lié positivement au premier facteur, lequel est déterminé par la

cylindrée et l’encombrement des véhicules. Ce n’est pas vraiment étonnant.

− Le rapport poids puissance est un indicateur de performance. Plus il est faible, plus sportif

est le véhicule. Il est quasi-également lié aux deux facteurs : négativement au premier, c’est

tout à fait naturel puisque cette composante traduit la cylindrée et la puissance ;

positivement au second, en opposition à la vitesse maximum, ce que se conçoit très bien.

Insérer ces variables dans le cercle des corrélations donne une vision synthétique toujours bien

sympathique.

#placement des variables illustratives dans le cercle des corrélations


fig, ax = [Link](figsize=(5,5))
[Link]([-1,+1,-1,+1])
[Link]([-1,+1],[0,0],color='silver',linestyle='--')
[Link]([0,0],[-1,+1],color='silver',linestyle='--')
ax.set_xlabel("Dim.1")
ax.set_ylabel("Dim.2")
[Link]("Cercle des corrélations")

#variables actives
for i in range(p):
[Link](acp.col_coord_[i,0],acp.col_coord_[i,1],[Link][i],color="dimgray")

#variables illustratives
[Link](cPrix[0],cPrix[1],'PRIX',color='brown')
[Link](0,0,cPrix[0]-0.1,cPrix[1]+0.04,color='r',head_width=0.05)

[Link](cRPP[0],cRPP[1],'RPOIDPUIS',color="red")
[Link](0,0,cRPP[0]+0.2,cRPP[1]-0.1,color='r',head_width=0.05)

#cercle pour faire joli

Méthodes Factorielles 82
ACP 74
ellipse = Ellipse((0,0),width=2,height=2,facecolor='none',edgecolor='silver',linestyle='--')
ax.add_patch(ellipse)

[Link]()

Figure 19 - Cercle des corrélations avec variables illustratives - ACP - Données "Autos"

Qualité de représentation – COS2. Pour consolider les résultats, on peut éventuellement

calculer les COS2 pour indiquer la qualité de la représentation d’une variable c.-à-d. le carré de

la corrélation. L’intérêt est de disposer d’un indicateur non-signé qui s’additionne d’un facteur

à l’autre. Nous n’avons pas la garantie en revanche que la somme des COS2 sur l’ensemble des

facteurs soit égale à 1 comme nous pouvons le constater pour la variable PRIX.

#corrélation de prix avec l'ensemble des (p = 6) facteurs


cPrixBis = [Link]([Link],acp.row_coord_[:,:],rowvar=False)[0,1:]
print(cPrixBis)

[ 0.77247524 -0.08670844 0.13389277 0.22582891 0.15944978 0.10254878]

#au carré : COS2


print(cPrixBis**2)

[0.596718 0.00751835 0.01792727 0.0509987 0.02542423 0.01051625]

#somme n’est pas égale à 1 sur l’ensemble des facteurs, et c’est normal
print([Link](cPrixBis**2))

0.7091028079636765

Remarque : Au cas où la question viendrait à l’esprit, calculer la contribution n’a aucun sens

pour les variables illustratives puisqu’elles n’ont pas participé à l’élaboration du repère factoriel.

Méthodes Factorielles 83
ACP 75
1.6.2 Variable illustrative qualitative

Le traitement des variables illustratives qualitatives s’apparente à une analyse de variance à 1

facteur (Rakotomalala R., « Comparaisons de populations – Tests paramétriques », version 1.2,

mai 2010 ; section 1.3) : l’objectif est d’apprécier dans quelle mesure les moyennes

conditionnelles définies par les groupes associés aux modalités sont suffisamment écartées sur

le facteur étudié. Nous disposons d’un indicateur global, le carré du rapport de corrélation ; et

d’un indicateur par groupe, la valeur test (« Interpréter la valeur-test », avril 2008).

Moyennes conditionnelles – Coordonnées factorielles. Les moyennes conditionnelles (𝑦̅𝑔𝑘 )

constituent le point de départ de l’analyse, où « g » désigne une des modalités de la variable

supplémentaire (y, à G catégories), « k » le facteur sur lequel nous travaillons.

1
𝑦̅𝑔𝑘 = ∑ 𝐹𝑖𝑘
𝑛𝑔
𝑖:𝑦𝑖 =𝑔

Où (ng) est l’effectif du groupe « g ».

Concrètement, pour la variable illustrative FINITION sur le premier facteur, nous calculons les

effectifs par groupe et les moyennes conditionnelles.

#data frame temporaire


df = [Link]()
df['F1'] = acp.row_coord_[:,0]
df['F2'] = acp.row_coord_[:,1]
print([Link]())

<class '[Link]'>
Index: 18 entries, Alfasud TI to Lada-1300
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 FINITION 18 non-null object
1 PRIX 18 non-null int64
2 RPOIDPUIS 18 non-null float64
3 F1 18 non-null float64
4 F2 18 non-null float64
dtypes: float64(3), int64(1), object(1)
memory usage: 864.0+ bytes
None

#effectif par groupe de FINITION


n_g = pandas.pivot_table(df,values='F1',index='FINITION',aggfunc='count')
print(n_g)

Méthodes Factorielles 84
ACP 76
F1
FINITION
1_M 5
2_B 7
3_TB 6

#moyennes conditionnelles pour le 1er facteur


m_1 = pandas.pivot_table(df,values='F1',index='FINITION',aggfunc='mean')
print(m_1)

F1
FINITION
1_M -2.000355
2_B 0.235313
3_TB 1.392430

#moyennes conditionnelles pour le 2nd facteur


m_2 = pandas.pivot_table(df,values='F2',index='FINITION',aggfunc='mean')
print(m_2)

F2
FINITION
1_M 0.022579
2_B -0.045271
3_TB 0.034001

Ces moyennes conditionnelles correspondent également aux coordonnées factorielles. Plaçons-

les dans notre repère pour disposer d’une vision d’ensemble.

#représentation graphique avec les positions


#des points supplémentaires dans le plan
fig, ax = [Link](figsize=(10,10))
[Link](acp.row_coord_[:,0],acp.row_coord_[:,1],'wo')
[Link]([-5,+5,-5,+5])
[Link]([-5,+5],[0,0],color='silver',linestyle='--')
[Link]([0,0],[-5,+5],color='silver',linestyle='--')
ax.set_xlabel("Dim.1")
ax.set_ylabel("Dim.2")
[Link]("Carte des individus - Modalités de FINITION")

#points actifs
for i in range(n):
[Link](acp.row_coord_[i,0],acp.row_coord_[i,1],[Link][i],color="gray")

#position des modalités de la variable illustrative


for g in range(len(m_1.index)):
[Link](m_1.F1[g],m_2.F2[g],m_1.index[g],color="red",weight="bold",fontsize=16)

[Link]()

Méthodes Factorielles 85
ACP 77
Figure 20 - Position des modalités de la variable illustrative "FINITION" - ACP - Données "Autos"

Remarque : Nous aurions pu également colorier les étiquettes selon le groupe d’appartenance

défini par « FINITION ». Mais le positionnement des moyennes conditionnelles est plus en phase

avec les calculs ultérieurs.

Manifestement, les niveaux de FINITION se distingue fortement sur le 1er facteur, quasiment

pas sur le 2nd. Elle (la finition) est intimement liée à la notion de « gamme » de véhicules mis en

avant lors de la lecture des facteurs. Plus le véhicule monte en gamme, plus élevé est le niveau

de finition.

Hélas, les résultats sont rarement aussi évidents en pratique. Il nous faut disposer d’un

indicateur numérique, qui possède l’avantage de pouvoir s’appliquer à un nombre éventuellement

important de variables illustratives qualitatives.

Rapport de corrélation. Le rapport de corrélation témoigne de la dispersion relative des

moyennes conditionnelles autour de la moyenne globale. Sachant que les facteurs sont centrés

Méthodes Factorielles 86
ACP 78
et que leur variance est égale à la valeur propre, l’expression du carré du rapport de corrélation

pour le facteur Fk est simplifiée :

𝑛𝑔
∑𝐺𝑔=1
𝜂𝐹2𝑘 /𝑦 = 𝑛 𝑦̅𝑔𝑘
𝜆𝑘

Nous les produisons très facilement à partir des effectifs et moyennes conditionnelles calculés

précédemment.

#(carré du) rapport de corrélation sur le 1er facteur


print([Link]((n_g.F1/n)*(m_1.F1**2))/acp.eig_[0][0])

0.40248443698930525

#rapport de corrélation sur le 2nd facteur


print([Link]((n_g.F1/n)*(m_2.F2**2))/acp.eig_[0][1])

0.0015465958518609553

Les indicateurs numériques confortent les impressions visuelles, c’est toujours rassurant : la

discrimination des groupes de FINTION est surtout tangible sur le 1 er facteur (𝜂𝐹21 /𝑦 = 0.402 vs.

𝜂𝐹22 /𝑦 = 0.0015).

Valeur-test. L’idée des « valeurs-test » (VT) s’apparente à un test post-hoc où l’on essaie de

distinguer les groupes qui s’écartent le plus de la moyenne globale c.-à-d. de l’origine puisque

les facteurs sont centrés. Dans le graphique ci-dessus, les groupes de FINITION se distinguent

surtout sur le 1er facteur. Soit. Mais certains sont plus écartés de l’origine que d’autres. Les

réponses sont évidentes visuellement, la valeur-test se charge de les matérialiser.

La formule est de nouveau simplifiée dans le cadre de l’ACP. La valeur-test pour la modalité

« g » de la variable illustrative « y » sur le facteur Fk s’écrit :

𝑦̅𝑔𝑘
𝑉𝑇𝑔𝑘 =
𝑛 − 𝑛𝑔 𝜆
√ 𝑛 − 1 × 𝑛𝑘
𝑔

Réalisons les calculs pour le 1er facteur.

Méthodes Factorielles 87
ACP 79
#valeurs test sur le 1er facteur
vt_1 = (m_1.F1)/[Link]((n-n_g.F1)/(n-1)*(acp.eig_[0][0]/n_g.F1))
print(vt_1)

FINITION
1_M -2.432717
2_B 0.368103
3_TB 1.930766
Name: F1, dtype: float64

Le groupe de finition moyenne (« 1_M ») est la plus éloigné de l’origine, etc.

Là aussi, la conclusion numérique concorde avec la perception visuelle (Figure 20). L’intérêt est

que nous pouvons associer l’indicateur à un test de significativité. En se référant à la normalité

asymptotique de la statistique VT, pour un test bilatéral à 5%, on peut considérer que

l’écartement est significatif dès lors que (|𝑉𝑇| ≥ 2), … à peu près. Très à peu près même, parce

que d’une part les échantillons ne sont ni indépendants, ni appariés, le groupe est inclus dans

l’échantillon global ; d’autre part, tout écart paraît significatif dès que les effectifs augmentent.

En pratique, il faut plutôt voir la valeur-test comme un indicateur qui permet de hiérarchiser

rapidement les écarts d’un facteur à l’autre (le poids des facteurs sous forme de variance

restituée intervient dans les calculs), attirant notre attention sur les résultats qui seraient de

prime abord les plus intéressants.

Cosinus carré – COS2. Le calcul de la qualité de représentation des modalités d’une variable

supplémentaire, le COS2, est analogue à celui des individus (section 1.3.3). Nous devons tout

d’abord produire la distance globale à l’origine de la modalité dans le repère initial, sur les

données (Z), elle nous servira de référence. Ensuite, pour chaque facteur, nous opposons la

distance à l’origine locale avec la globale.

Pour une variable (𝑧𝑗 ), la moyenne conditionnelle pour la modalité « g » est :

1
𝑧̅𝑔𝑗 = ∑ 𝑧𝑖𝑗
𝑛𝑔
𝑖:𝑦𝑖 =𝑔

La distance à l’origine globale du groupe « g » dans l’espace des variables (z) centrées et

éventuellement réduites :

Méthodes Factorielles 88
ACP 80
𝑝
2
𝑑𝑔 = √∑ 𝑧̅𝑔𝑗
𝑗=1

Pour les données « Autos », réalisons les calculs pour la variable supplémentaire FINITION.

Nous créons tout d’abord un data frame temporaire pour accueillir les variables centrées et

réduites Z, nous lui accolons la variable supplémentaire FINITION.

#transformer Z en data frame


dfZ = [Link](Z,columns=[Link],index=[Link])

#rajouter la colonne FINITION


dfZ['FINITION'] = varIllus['FINITION']

#vérification
print([Link]())

<class '[Link]'>
Index: 18 entries, Alfasud TI to Lada-1300
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 CYL 18 non-null float64
1 PUISS 18 non-null float64
2 LONG 18 non-null float64
3 LARG 18 non-null float64
4 POIDS 18 non-null float64
5 VMAX 18 non-null float64
6 FINITION 18 non-null object
dtypes: float64(6), object(1)
memory usage: 1.8+ KB

Nous calculons ensuite les moyennes des (𝑧𝑗 ) conditionnellement à FINITION.

#moyennes conditionnelles sur les variables Z


mz_g = pandas.pivot_table(dfZ,index='FINITION',aggfunc='mean')
print(mz_g)

CYL LARG LONG POIDS PUISS VMAX


FINITION
1_M -0.777851 -0.826236 -0.823850 -0.825200 -0.909552 -0.735509
2_B 0.253299 0.147542 0.083116 -0.050267 -0.009218 0.170188
3_TB 0.352693 0.516398 0.589573 0.746311 0.768714 0.414371

Nous pouvons former les distances à l’origine.

#distance à l'origine
disto2_g = numpy.apply_along_axis(arr=mz_g.values,axis=1,func1d=lambda x:[Link](x**2))
print([Link](disto2_g))

[2.00391116 0.35272284 1.43466388]

Méthodes Factorielles 89
ACP 81
Pour obtenir le COS2 du groupe « g » sur le facteur (Fk), nous opposons le carré de la distance

locale (le carré de la moyenne conditionnelle sur le facteur) avec le carré de la distance globale :

2
2
𝑦̅𝑔𝑘
𝐶𝑂𝑆𝑔𝑘 =
𝑑𝑔2

Pour le 1er facteur de l’ACP sur les données « Autos » :

#COS2 sur le premier facteur


print((m_1.values[:,0]**2)/disto2_g)

[0.99645377 0.44506654 0.94199086]

Pour le 2nd :

#COS2 sur le second facteur


print((m_2.values[:,0]**2)/disto2_g)

[0.00012696 0.01647317 0.00056166]

Méthodes Factorielles 90
ACP 82

Vous aimerez peut-être aussi