Aller au contenu

Analyse en Composantes Principales (ACP)

L'analyse en composantes principales est un algorithme de réduction de dimensions.

Il s'agit d'une technique linéaire permettant de projeter des données X de dimension d en d'autres données t de dimension p<d. ="" approximer="" as:669402626265091@1536609431065="" avec="" axes="" d="" de="" de:="" des="" dimension="" dimensions="" donnã©es="" donnã©es.="" elle="" en="" entre="" est="" fig1="" figure="" individdus="" l'acp="" l'idã©e="" la="" le="" les="" liaisons="" linã©aire="" nombre="" nuage="" on="" ou="" p="2" p<="" par="" permet="" peut="" point="" principe="" prjection="" projeter="" prã©sentant="" publication="" rã©duire="" sa="" sur="" un="" variabilitã©="" variables="" variance="" visualiser="" www.researchgate.net="" x="" ã©tudier="">d.

L'ACP minimise la variance des points projetés.

On cherche à réaliser une projection \(x € R^d -> t € R^p\), p<d. ##="" <="" acp="" avec="" coude="" coude.="" critã¨re="" de="" div="" du="" kaiser="" l'espace="" la="" le="" linã©aire="" modã¨le="" mã©thode="" non="" p="" peut="" projection="" technique="" un="" ã©valuã©e="" ãªtre="" ã‰valuation="">

Module 3: Apprentissage non supervisé

ACP - Analyse en Composantes Principales

Il s'agit d'une technique linéaire permettant de projeter des données X de dimenson p en d'autres données T de dimmension d < p.
Objectifs * Visualiser les données * Étudier les liens de corrélation linéaire entre les variables * Réduire le nombre de dimensions

L'idée de l'ACP est de projeter les données sur des axes préservant la variance des données. Avec p=2 ou p=3, on peut visualiser ls données.
Principe : approximer un nuage de points X de dimension p par sa projection linéaire en dimension d < p.
L'ACP maximise la variance des points projectés.

On cherche à réaliser la projection x app Rp-->Rd, d<p
L'espace de projection P inclus dans Rd sera construit de manière progressive. * D'abord on va chercher le meilleur axe de projection (1D) u1 * Ensuite le meilleur plan en trouvant le deuxième axe u2 * Et ainsi de suite jusqu'à obtenir P </p

Importation des données

Le jeu de donnés contient des donnés récuellies sur les pays pour l'année 2015, il comporte 158 lignes et 12 colonnes. Nous travaillerons avec les 8 dernières colonnes soit p=8 et la colonne Region pour évaluer notre ACP.

import pandas as pd
dt = pd.read_csv('datasets/counties-happiness-2015.csv')
dt.head()
Country Region Happiness Rank Happiness Score Standard Error Economy (GDP per Capita) Family Health (Life Expectancy) Freedom Trust (Government Corruption) Generosity Dystopia Residual
0 Switzerland Western Europe 1 7.587 0.03411 1.39651 1.34951 0.94143 0.66557 0.41978 0.29678 2.51738
1 Iceland Western Europe 2 7.561 0.04884 1.30232 1.40223 0.94784 0.62877 0.14145 0.43630 2.70201
2 Denmark Western Europe 3 7.527 0.03328 1.32548 1.36058 0.87464 0.64938 0.48357 0.34139 2.49204
3 Norway Western Europe 4 7.522 0.03880 1.45900 1.33095 0.88521 0.66973 0.36503 0.34699 2.46531
4 Canada North America 5 7.427 0.03553 1.32629 1.32261 0.90563 0.63297 0.32957 0.45811 2.45176
X = dt.drop(['Country', 'Region', 'Happiness Rank', 'Standard Error'], axis=1)
X.head()
Happiness Score Economy (GDP per Capita) Family Health (Life Expectancy) Freedom Trust (Government Corruption) Generosity
0 7.587 1.39651 1.34951 0.94143 0.66557 0.41978 0.29678
1 7.561 1.30232 1.40223 0.94784 0.62877 0.14145 0.43630
2 7.527 1.32548 1.36058 0.87464 0.64938 0.48357 0.34139
3 7.522 1.45900 1.33095 0.88521 0.66973 0.36503 0.34699
4 7.427 1.32629 1.32261 0.90563 0.63297 0.32957 0.45811
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder().fit(dt['Region'])
labels = encoder.transform(dt['Region'])
encoder.classes_
array(['Australia and New Zealand', 'Central and Eastern Europe',
       'Eastern Asia', 'Latin America and Caribbean',
       'Middle East and Northern Africa', 'North America',
       'Southeastern Asia', 'Southern Asia', 'Sub-Saharan Africa',
       'Western Europe'], dtype=object)

Centrage et Réduction

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(X)
X_scaled = scaler.transform(X)

ACP avec Scikit-learn

n_comp = 3
from sklearn.decomposition import PCA
pca = PCA(n_components=n_comp)
pca.fit(X_scaled)
X_projected = pca.transform(X_scaled)

import numpy as np
import matplotlib.pyplot as plt
scree = pca.explained_variance_ratio_ * 100
plt.bar(np.arange(len(scree))+1, scree)
plt.plot(np.arange(len(scree))+1, scree.cumsum(), c="red", marker='o')
plt.xlabel("rang de l'axe d'inertie")
plt.ylabel("pourcentage d'inertie")
plt.title("Eboulis des valeurs propres")
plt.show()
No description has been provided for this image

Interprétaion

Le premier axe conserve 41,2% le deuxième axe 19,4% et le troisème axe 14,3%. Les trois axes permettent de conserver environ 75% de variance des données. Si l'on souhaite conserver plus de variance, on peut ajouter un axe supplémentaire ou plus. Remarquons qu'il est peu pertinent de conserver toute la variance, autant travailler avec les données initiales, il ne faut pas perdre de vue que l'un des objectifs de l'ACP, c'est la réduction du nombre de dimensions.

1. Visualiser les données

fig = plt.figure(figsize=(16, 4))

fig.add_subplot(1, 3, 1)
plt.scatter(X_projected[:, 0], X_projected[:, 1], c=labels)
plt.title('Axe 1 vs Axe 2')

fig.add_subplot(1, 3, 2)
plt.scatter(X_projected[:, 1], X_projected[:, 2], c=labels)
plt.title('Axe 2 vs Axe 3')

fig.add_subplot(1, 3, 3)
plt.scatter(X_projected[:, 0], X_projected[:, 2], c=labels)
plt.title('Axe 1 vs Axe 3')

plt.show()
No description has been provided for this image
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection='3d')
ax.scatter(X_projected[:, 0], X_projected[:, 1], X_projected[:, 2], c=labels)
plt.show()
No description has been provided for this image
from utils.acp.functions import display_factorial_planes
names = dt['Country']
display_factorial_planes(X_projected, n_comp, pca, [(0,1),(0,2),(1,2)], labels = np.array(names))
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

2. Étudier les liens de corrélation linéaire entre les variables

from utils.acp.functions import display_circles
features = X.columns
pcs = pca.components_
display_circles(pcs, n_comp, pca, [(0,1),(0,2),(1,2)], labels = np.array(features))
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Interprétaion

Plus un pays est généreux, plus il est corrompu