Réduction de dimension : Analyse en Composant Principal (avec Python)

Pour étudier ou décrire un phénomène statistique, il est dans l’ordre des choses de penser que la prise en compte d’un nombre important de variable améliorerait ou apporterait plus d’information à la compréhension du dit phénomène. Malheureusement, cette logique qui consiste à prendre en compte un nombre important de variables pour gagner en information remet en cause la significativité de cette dernière. C’est l’un des aspects de ce que nous appelons la malédiction de la dimensionnalité ou The curse of dimensionality (moins effrayant en anglais). En effet, plus on n’a de variables ou de dimensions, plus on a besoin d’un échantillon de taille plus importante pour assurer la pertinence ou la significativité de l’information que l’on peut lire des données.

Pour venir about de ce fléau qui mine l’analyse du Big Data, nous pouvons opter pour une réduction du dimensions ce qui implique une perte d’informations mais, perte maîtrisée car nous pouvons alors décider de la quantité d’informations que nous voulons conserver des données originales et donc améliorer la significativité de nos conclusions. La méthode qui permet de réaliser une telle prouesse,  Analyse en Composant Principal (ou ACP seulement pour les intimes),a été proposée par Karl Pearson dès 1901 .

Les caractéristiques des composants principaux

Définition

Au delà de la simple réduction de dimension, l’ACP est une méthode visant à synthétiser l’information contenue dans l’ensemble des variables. En fait, elle appartient à un ensemble d’algorithmes de l’apprentissage machine ou machine learning dits non supervisés car ne nécessitant pas de variable dépendante. Elle tire avantage de la variance des variables plus précisément de la corrélation entre elles en éliminant la redondance de l’information contenue dans les variables. Il faut faire attention à ce niveau, l’ACP ne permet pas d’éliminer des variables ! Elle opère à travers un procédé mathématique qui transforme un nombre important de variables qui sont probablement corrélées en un nombre inférieur de variables non corrélées appelées Composant Principal, du fait de leur caractère à absorber le maximum d’information ou de variance dans les variables de départ.

Concrètement, pour n dimensions ou variables, nous avons n composants principaux obéissant au principes suivants :

  • – Le premier composant principal, est une combinaison linéaire des variables originales, qui maximise la variance dans les données. Géométriquement parlant, ce dernier détermine le sens de variation maximale dans les données. En bref, c’est le composant principal qui absorbe le maximum d’information.
  • – Le second composant principal est également une combinaison linéaire des variables originales, qui maximise la variance avec la condition de non-corrélation avec le précédent composant principal.
  • – Le reste des composants, obéit à la règle du second composant principal.

Formalisation

Considérons X, la matrice des données numériques de dimension n \times p, de moyenne \mu et de variance ou covariance \Sigma, dans laquelle, chaque individu e_i est décrit par les variables numériques X_1, X_2, X_3 \dots X_p. on appelle composant principal Z_i, la combinaison linéaire des variables qui s’exprime comme ceci :

    \[\begin{split} Z_i&=W_{i1}X_1+W_{i2}X_2+W_{i3}X_3+\dots +W_{ip}X_p \\  Z_i &= W_{i}^\top X \text{, avec comme variance} \\ \sigma^{2}(z)_i=W_{i}^\top \Sigma W_i \end{split}\]

 où W_i est un vecteur de p constante.

Nous devons comme mentionner précédemment trouver W_i et en suite Z_i, telle que la variance \sigma^{2}(z)_i soit maximale avec \sum_{j}^{p} w^{2}_{ij} = 1 ou W_{i}^\top W_i=1 (en fait, on introduit cette contrainte pour éviter que W_{i} \rightarrow \infty).

  • –  Pour le premier composant principal Z_1, nous avons le programme suivant à résoudre :

        \[ \begin{cases}\begin{aligned}  \text{Max} & & \sigma^{2}(z)_1&=W_{1}^\top \Sigma W_1\\ \text{sc. de} & & W_{1}^\top W_1&=1 \end{aligned} \end{cases} \]

    En utilisant le multiplicateur de Lagrange on obtient que :

    (1)   \begin{equation*}\Sigma W_1=\lambda_1 W_1\end{equation*}

  • – Pour le second composant principal Z_2, nous aurons à résoudre : 

        \[ \begin{cases}\begin{aligned}  \text{Max} & & \sigma^{2}(z)_2&=W_{2}^\top \Sigma W_2\\ \text{sc. de} & & W_{2}^\top W_2&=1 \\ & & W_{2}^\top W_1&=0\end{aligned} \end{cases} \]

     En utilisant le multiplicateur de Lagrange on obtient que :

    (2)   \begin{equation*}\Sigma W_2=\lambda_2 W_2\end{equation*}

  • –    Pour le reste des composants principaux, on utilise le programme du second composant en incrémentant pour i  allant de  3 à p composant principal. on obtiendra de manière générale que : 

    (3)   \begin{equation*}\Sigma W_i=\lambda_i W_i\end{equation*}

La première remarque que l’on fait c’est que pour que les équations (1), (2) soient possibles et de façon générale l’équation (3) , il faudrait que les vecteurs W_i et les valeurs \lambda_i soient respectivement des vecteurs et valeurs propres de \Sigma. Mieux encore on peut donc conclure que : 

(4)   \begin{equation*}\sigma^{2}(z)_i=Var[W_{i}^\top X] = W_{i}^\top\Sigma W_i = \lambda_i\end{equation*}

 Autrement dit, la variance d’un  composant principal est égale à la valeur propre de la matrice de variance – covariance \Sigma

Critère de rétention d’un composant principal

Une fois, nos composants déterminer, nous devons retenir ceux ayant des variances importantes et ignorer ceux ayant de faibles variances. Pour ce faire on peut se baser sur les critères suivantes( ce ne sont pas des lois) :

  • Retenir les k composants ayant une valeur propre supérieure à 1(Critère de Kaiser – Guttman)
  • Retenir les k composants dont les valeurs propres précédent la cassure de la courbe on parle aussi du coude
  • Retenir les k premiers composants qui expliquent y% de la variance.
  • Retenir les k premiers composants dont la part ou proportion de variance est supérieur à la moyenne( y % > 1/p%)

Tutoriel, implémentation avec Python

Nous allons utiliser les données issues du rapport 2016 de Heritage. Elle contiennent 7 variables économiques de 169 pays. Nous aurons besoin d’installer et d’importer les packages suivants pour l’implémentation de l’ACP :

Chargement et description statistique des données :

Nos données sont stockées sous format .csv, aussi nous allons utiliser la fonction read_csv() de la librairie pandas :

Ensuite nous allons avec la fonction describe()  obtenir une description statistique des données, nous avons les principaux indicateurs de tendance centrale et de dispersion :

Pour la visualisation graphique compte tenu du nombre de variables, les projeter individuellement nous donnerait un travail de longue haleine. Heureusement, avec la fonction PairGrid() de la librairie seaborn nous pouvons faire une analyse graphique des variables prises deux à deux et même visualiser la distribution de ces dernières.

Dans notre cas au vu des caractéristiques des données nous avons d’abord procédé à une log-transformation des données(à des fins de visualisations compte tenu de la disparité des échelles des données intra-et inter- variables) ensuite nous avons opté pour des nuages de points et des histogrammes :

scatter_matrix

Vous pourriez naturellement remplacer les données np.nan , par les valeurs minimales ou tout autre mode de traitement de ce type de données. Nous avons choisi de les exclure. Les coefficients de corrélations s’obtiennent comme ceci :

Standardisation des données

Comme mentionner précédemment, il est impératif de centrer et réduire les variables sur lesquelles nous allons procéder à une ACP :

Pour centrer et réduire, on peut utiliser des opérations matricielles comme ci-dessous où recourir à la fonction StandardScaler().fit_transform(db.ix[:,2:9]) , précédée du chargement suivant  from sklearn.preprocessing import StandardScaler

Détermination des valeurs et vecteurs propres

La fonction np.linalg.eig(), permet d’obtenir et les valeurs et les vecteurs propres, malheureusement ces derniers ne sont souvent dans un ordre souhaité :

Notez ici que nous aurions pu procéder à la décomposition avec la fonction np.linalg.svd(Var_X) . Par ailleurs, nous allons calculer ci-dessous l’écart- type, la part ou proportion de variance de chaque composant ainsi que le cumul de variance expliquée afin de mieux visualiser la contribution de chaque composants principal :

Choix des composants principaux :

D’une part dans l’objet res_1 , nous pouvons lire que le premier composant principal capture à lui seul 35% de l’information ou variance et le deuxième composant 20%…etc

Aussi, le cumul des proportions nous montre que les deux premiers composants n’expliquent que 55% de la variance ce que nous jugeons insuffisant donc nous allons retenir les trois premiers composants qui capturent 71%.

Ce tableau peut être visualiser graphiquement, on lit sur le deuxième graphique, le Scree plot notamment que le point de cassure ou le coude, se trouve au niveau du troisième composant et compte tenu de l’importance de l’information contenue dans ce troisième composant  soit 15%(> à la moyenne (1/7 ~ 14%)).

screeplot

D’autres part, dans l’objet res_2 , nous avons les vecteurs propres ou la contribution de chaque variable à chaque composant. Et comme décidé ci-dessus, nous allons extraire seulement les 3 premiers composants ainsi que leur vecteur.

Réduction de dimension et projection graphique

Nous arrivons donc à la fin de cet article, nous allons passer d’un espace à 7 dimensions(ce qui était impossible à projeter graphiquement) à  un sous espace de 3 dimensions(le maximum qu’on peut faire graphiquement parlant), ce qui va nous conduire à réaliser une projection en 3D à la place de l’habituel biplot(dans le cas de deux composants principaux).

Pour finir, dans le code ci-dessus, nous avons calculer les Z= W^\top X qui vont servir à réaliser le graphique ci-dessous :

princp

On peut voir sur le graphique les USA, la Chine et l’inde se distinguer du lot sur l’axe du CP1,ce dernier met avant notamment des pays à Population importante mais aussi à fort PIB, l’axe du CP2 des pays à fort taux corruption,d’inflation …etc vous maintenant !

 

 

Like
2