• 15 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 01/02/2019

TP — ACP d’un jeu de données sur les performances d’athlètes olympiques

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Nous allons maintenant faire une analyse en composantes principales des performances d'athlètes olympiques au décathlon.

Ce jeu de données contient 41 entrées, qui décrivent chacune les performances d'un athlète à une compétition de décathlon. Nous allons faire une ACP des dix variables décrivant les performances à chacune des épreuves du décathlon (100 mètres, saut en hauteur, lancer de poids, saut en hauteur, 400 mètres, 110 mètres haies, lancer de disque, saut à la perche, javelot, et 1500 mètres).

import pandas as pd

# charger les données
data = pd.read_csv('decathlon.txt', sep="\t")

# éliminer les colonnes que nous n'utiliserons pas
my_data = data.drop(['Points', 'Rank', 'Competition'], axis=1)

# transformer les données en array numpy
X = my_data.values

Rappelez-vous: nous avons fait l'hypothèse que les données étaient centrées. Nous allons donc commencer par les standardiser.

from sklearn import preprocessing

std_scale = preprocessing.StandardScaler().fit(X)
X_scaled = std_scale.transform(X)

Calcul des composantes principales

Calculons maintenant les deux premières composantes principales :

from sklearn import decomposition

pca = decomposition.PCA(n_components=2)
pca.fit(X_scaled)

Pourcentage de variance expliquée

pca.explained_variance_ratio_ nous donne le pourcentage de variance expliquée par chacune des composantes.

print pca.explained_variance_ratio_
print pca.explained_variance_ratio_.sum()

La première composante explique environ un tiers de la variance observée dans les données et la deuxième 17.3%. Au total, ces deux composantes expliquent 50% de la variance totale, en utilisant seulement un cinquième des dimensions initiales.

Nous pouvons représenter chaque athlète/compétition selon ces deux dimensions uniquement, et colorer chacun des points correspondant en fonction du classement de l'athlète lors de cette compétition.

# projeter X sur les composantes principales
X_projected = pca.transform(X_scaled)

# afficher chaque observation
plt.scatter(X_projected[:, 0], X_projected[:, 1],
    # colorer en utilisant la variable 'Rank'
    c=data.get('Rank'))

plt.xlim([-5.5, 5.5])
plt.ylim([-4, 4])
plt.colorbar()
Données projetées sur les deux premières composantes principales et colorée par classement final.
Données projetées sur les deux premières composantes principales et colorée par classement final.

Les bonnes performances (points bleu foncé) sont plutôt situées dans la partie droite du graphe (PC1 > 0) et les moins bonnes (points jaunes) plutôt dans la partie gauche (PC1 < 0).

Contribution de chaque variable aux composantes principales

Pour mieux comprendre ce que capture ces composantes principales, nous pouvons utiliserpca.components_, qui nous donne les coordonnées des composantes principales dans l'espace initial (celui à 10 variables). Nous allons afficher, pour chacune des 10 performances, un point dont l'abscisse sera sa contribution à la première PC et l'ordonnée sa contribution à la deuxième PC.

pcs = pca.components_

for i, (x, y) in enumerate(zip(pcs[0, :], pcs[1, :])):
    # Afficher un segment de l'origine au point (x, y)
    plt.plot([0, x], [0, y], color='k')
    # Afficher le nom (data.columns[i]) de la performance
    plt.text(x, y, data.columns[i], fontsize='14')

# Afficher une ligne horizontale y=0
plt.plot([-0.7, 0.7], [0, 0], color='grey', ls='--')

# Afficher une ligne verticale x=0
plt.plot([0, 0], [-0.7, 0.7], color='grey', ls='--')

plt.xlim([-0.7, 0.7])
plt.ylim([-0.7, 0.7])
Contribution de chaque variable à chacune des deux composantes.
Contribution de chaque variable à chacune des deux composantes.

Les variables qui ont une contribution négative à la première composante principale correspondent aux disciplines pour lesquelles une bonne performance est représentée par un petit nombre (temps de course), et inversement pour les variables ayant une contribution positive. Cette composante permet de séparer les athlètes qui ont de très bonnes performances de ceux qui sont (relativement !) plus mauvais dans toutes les disciplines, comme nous l'avions remarqué.

La deuxième composante principale permet de séparer les athlètes plus forts (bonnes performances aux lancers) et moins endurants (basse performance aux 400m et 1500m) des autres.

Ce graphique nous permet aussi d'observer que certaines variables sont très corrélées, commeDiscus (performance au lancer de disque) etShot put (performance au lancer de poids).

Résumé

L'ACP nous a permis de :

  • représenter les données en deux dimensions ;

  • établir des profils des athlètes ;

  • mettre à jour des corrélations entre des variables.

 

Exemple de certificat de réussite
Exemple de certificat de réussite