import numpy as np
import pandas as pa
import matplotlib.pyplot as plt
from sklearn import decomposition
from sklearn import preprocessing
data = pa.read_csv('https://www.labri.fr/~zemmari/datasets/eleves.csv', decimal='.', index_col=0, header=0)
data.head()
pca_cols = ['Math', 'Sciences', 'Francais', 'Latin', 'Musique']
data_pca = data[pca_cols]
X = data_pca.values
X
n = X.shape[0]
p = X.shape[1]
corr = np.corrcoef(X, rowvar=0)
corr
std_scaler = preprocessing.StandardScaler()
Z = std_scaler.fit_transform(X)
Z
#On peut vérifier que nos données sont bien centrées réduites :
print(np.mean(Z,axis=0))
print(np.std(Z,axis=0))
nb_composantes = 5
pca = decomposition.PCA(n_components=nb_composantes)
coord_fact = pca.fit_transform(Z)
valeurs_propres = pca.explained_variance_
valeurs_propres
var_cumulee = valeurs_propres.cumsum()
var_cumulee
#On peut également afficher le pourcentage de la variance expliquées par chaque valeur propre:
variance_par_vp = pca.explained_variance_ratio_*100
variance_par_vp
#Et la variance accumulée :
variances_acc = variance_par_vp.cumsum()
variances_acc
plt.plot(np.arange(1,p+1),valeurs_propres)
plt.title("Scree plot")
plt.ylabel("Eigen values")
plt.xlabel("Factor number")
plt.show()
#cumul de variance expliquée
plt.plot(np.arange(1,p+1),np.cumsum(pca.explained_variance_ratio_))
plt.title("Explained variance vs. # of factors")
plt.ylabel("Cumsum explained variance ratio")
plt.xlabel("Factor number")
plt.show()
#Les coordonnées factorielles des individus est données par l'instriction
#coord_fact = pca.fit_transform(Z) --> Voir la cellule correspondante
coord_fact
#contributions aux axes
ctr = coord_fact**2
for j in range(p):
ctr[:,j] = ctr[:,j]/(n*valeurs_propres[j])
print(pa.DataFrame({'id':data.index,'CTR_1':ctr[:,0],'CTR_2':ctr[:,1]}))
#On ne garde que les individus ayant une contribution > à la contribution moyenne 1/n = 1/9
1/9
#Donc pour CP1, il s'git de Jean, Monique et Didier
# et pour CP2, il s'agit de Andre, Pierre, Brigitte (~) et Evelyne
#==> On attends l'interprétation pour les variables pour réinterpréter ces résultats
#On récupère d'abords les vecteurs propres :
vect_propres = pca.components_
print(vect_propres)
#racine carrée des valeurs propres
sqrt_eigval = np.sqrt(valeurs_propres)
#corrélation des variables avec les axes
corvar = np.zeros((p,p))
for k in range(p):
corvar[:,k] = pca.components_[k,:] * sqrt_eigval[k]
#afficher la matrice des corrélations variables x facteurs
print(corvar)
#Les variables sont maintenant en ligne, les facteurs en colonne :
#Si l’on s’en tient spécifiquement aux deux premiers facteurs :
#on affiche pour les deux premiers axes
print(pa.DataFrame({'id':data.columns,'COR_1':corvar[:,0],'COR_2':corvar[:,1]}))
#Contribution des variables aux axes (CTR).
#contributions
ctrvar = corvar**2
for k in range(p):
ctrvar[:,k] = ctrvar[:,k]/valeurs_propres[k]
#on n'affiche que pour les deux premiers axes
print(pa.DataFrame({'id':data.columns,'CTR_1':ctrvar[:,0],'CTR_2':ctrvar[:,1]}))
#On ne garde alors que les variables ayant une ctr > à la contribution moyenne
1/p
#Donc pour CP1: on garde Math, Sciences, Français et latin
#et pour CP2 : Math, Français