Exercice - Exploration des données, partie 1 : Rechercher les valeurs hors norme

Effectué

Il vous reste encore à traiter des valeurs manquantes, mais nous allons les laisser de côté pour l’instant. Sinon, vous pourriez être tenté d’imputer des valeurs de remplacement, et les valeurs hors norme possibles dans le jeu de données pourraient fausser vos remplacements.

Les valeurs hors norme sont des valeurs de données tellement éloignées de la distribution des autres valeurs qu’elles mettent en question le fait même d’appartenir au jeu de données. Les valeurs hors norme sont souvent dues à des erreurs dans les données ou à d’autres bruits indésirables. Vous devez toujours rechercher et traiter les possibles valeurs hors norme avant d’analyser les données.

Un moyen rapide d’identifier les valeurs hors norme est d’utiliser la fonction describe() de pandas :

player_df.describe()

Sortie

Ligne id points possessions team_pace GP MPG TS % AST TO USG ORR DRR REBR PER
count 42.000000 42.000000 42.000000 42.000000 36,000000 37,00000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 33,000000
mean 23,738095 1592,380952 1346,323810 106,526190 59,861111 35,27027 0,596357 26,221429 13,083333 30,478571 4,280952 14,850000 8,497619 22,594242
std 13,826555 351,876707 214,503887 6,676791 5,576239 1,91135 0,029284 5,199275 2,038282 4,919079 2,074025 7,277538 4,995876 7,255338
minute(s) 1.000000 183,000000 147,300000 89,700000 48,000000 30,50000 0,511000 14,800000 9,200000 16,500000 0,000000 0,900000 -2,900000 8,710000
25 % 12,250000 1390,750000 1283,650000 102,400000 55,750000 34,10000 0,572250 23,275000 11,350000 26,975000 2,925000 8,475000 5,225000 20,120000
50% 23,500000 1680,000000 1369,800000 106,800000 60,500000 35,40000 0,604000 27,200000 13,500000 30,650000 4,650000 16,800000 9,150000 24,230000
75 % 35,750000 1826,250000 1444,050000 111,950000 64,000000 36,90000 0,618750 30,550000 14,775000 34,850000 5,900000 20,325000 12,875000 28,380000
max 46,000000 2062,000000 1542,000000 118,800000 69,000000 38,80000 0,645000 33,200000 16,200000 36,700000 8,300000 29,400000 16,400000 34,260000

Vous voyez ici par exemple que la moyenne de tous les 42 joueurs est de 1592,38 points. Examinez cependant les nombres pour le minimum (183), 25 % (1390,75), 50 % (1680,0), 75 % (1826,25) et le maximum (2062). Ici, les points du minimum (183) peuvent être des valeurs hors norme. Vous pouvez utiliser des diagrammes en boîte pour visualiser les valeurs et déterminer les possibles valeurs hors norme.

Créer des diagrammes en boîte pour les colonnes

L’outil traditionnel pour la détection des valeurs de données hors norme est le diagramme en boîte. La boîte dans diagramme en boîte fait référence à une boîte dessinée autour de la plage de données qui va du 25ème centile au 75ème centile. (Ces centiles délimitent les quartiles importants des données.Leur plage est appelée interquartile.) Cette boîte correspond au milieu à 50 % des valeurs des données pour une variable donnée (une colonne d’un DataFrame). Vous utilisez une autre ligne pour marquer la médiane des données, qui est le 50ème centile.

Le diagramme en boîte est également appelé boîte à moustaches, car vous dessinez une forme en T au-dessus et en dessous de la boîte pour englober les valeurs maximale et minimale des données, en excluant les valeurs hors norme. Cette dernière partie est importante pour vos besoins, car elle vous permet d’identifier graphiquement les valeurs hors norme.

Dans l’idéal, vous allez produire des diagrammes en boîte pour vos colonnes dans une même matrice que vous pouvez facilement analyser. Malheureusement, aucune fonction individuelle ne produit plusieurs diagrammes en boîte : vous allez donc écrire une boucle for à la place.

En raison du fonctionnement de la bibliothèque Seaborn dans Python, vous devez déclarer explicitement la cellule dans la matrice où vous voulez rendre chaque diagramme en boîte. Utilisez l’opérateur de division entière avec arrondi à l’entier inférieur de Python (//) pour diviser les 13 colonnes intéressantes (vous n’avez pas besoin d’examiner ID) en lignes. Utilisez l’opérateur modulo (%) pour dériver la colonne.

Tout d’abord, importez les bibliothèques Matplotlib et Seaborn dans votre notebook :

import matplotlib.pyplot as plt
import seaborn as sns

Notes

Si vous recevez une erreur quand vous importez matplotlib ou seaborn, vous devrez peut-être installer les bibliothèques. Pour plus d’informations, consultez le Guide d’installation de matplotlib et le Guide d’installation de Seaborn.

Vous ne devez normalement voir aucune sortie, ce qui indique que les bibliothèques ont été correctement importées. Vous pouvez désormais :

  • Créer une liste des noms de colonne, en excluant ID. Utiliser la liste pour rechercher des valeurs spécifiques dans chaque ligne.
  • Créer une matrice de sous-diagrammes afin de disposer d’une seule figure montrant les 13 colonnes.
  • Ajouter un remplissage autour des sous-diagrammes pour en faciliter la lecture.
  • Créer un diagramme en boîte basé sur les données de chaque colonne, pour l’ensemble des lignes.
# Create a list of all column names, except for ID.
cols = list(player_df.iloc[:, 1:])

# Create a 3x5 matrix of subplots.
fig, axes = plt.subplots(3, 5, figsize=(18, 11))

# Create padding around subplots to make the axis labels readable.
fig.tight_layout(pad=2.0)

# Loop over the columns of the DataFrame and create a box plot for each one.
for i in range(len(cols)):
    sns.boxplot(ax=axes[i//5, i%5], y=player_df[cols[i]])

SortieScreenshot showing DataFrame box plots.

Vous pouvez donc voir deux valeurs hors norme dans points et dans possessions. Ces valeurs hors norme sont représentées sous forme de losanges dans la partie inférieure des deux premiers diagrammes en boîte qui représentent les colonnes points et possessions. Les valeurs sont tellement éloignées de la plage des autres données qu’elles représentent probablement des données incohérentes, et non pas un joueur sérieusement sous-performant.

Ici, l’expertise dans le domaine devient importante. Dans ce cas, cette expertise est une connaissance du basket. La probabilité qu’un joueur professionnel ayant un score d’un seul point dans sa carrière est extrêmement faible. De même, la probabilité qu’un joueur ayant 1 400 possessions de moins que le nombre moyen de possessions est également extrêmement faible. Vous êtes donc ainsi certain que ces données hors norme sont incorrectes.

Dans un autre jeu de données, les facteurs peuvent différer. Ainsi, s’arrêter pour examiner attentivement les valeurs hors norme est donc critique pour le parcours de la science des données.

Identifier et supprimer les lignes qui contiennent les valeurs hors norme

Vous auriez pu investiguer plus avant dans les données si c’était nécessaire. Certaines des données ont-elles été mal tapées ou endommagées d’une quelconque façon ? Avec suffisamment d’expertise du domaine ou de familiarité avec la façon dont les données ont été collectées, vous pourriez essayer de corriger les valeurs erronées. Vous risquez cependant aussi d’introduire votre propre biais ou des idées préconçues sur les données dans le jeu de données. Ces accidents pourraient finalement nuire à votre analyse. Comme vous avez 42 enregistrements restants dans les données, il est probablement plus sûr de supprimer la ou les lignes incriminées.

Le diagramme à boîte vous indique seulement qu’il existe des valeurs hors norme. Vous devez maintenant déterminer les lignes dans lesquelles se trouvent ces valeurs.

Comme les deux valeurs sont inférieures à la valeur minimale de leurs colonnes respectives, vous pouvez utiliser la méthode idxmin() sur les deux colonnes. Cette méthode retourne le numéro d’index de la ligne où se trouve une valeur minimale. (Vous allez rechercher chaque valeur séparément.)

# Identify the index number of the row that has the lowest value in 'points'.
points_outlier = player_df['points'].idxmin()
points_outlier
35
# Identify the index number of the row that has the lowest value in 'possession'.
possession_outlier = player_df['possessions'].idxmin()
possession_outlier
35

Heureusement, les valeurs hors norme sont toutes deux sur la même ligne. Vous pouvez maintenant utiliser la fonction drop() pour supprimer manuellement la ligne.

Vous pourriez entrer manuellement le numéro d’index de la ligne. Cette modification manuelle introduirait cependant le risque d’une frappe incorrecte. Au lieu de cela, utilisez la variable que vous avez créée pour héberger la valeur minimale.

# Drop the row that has the outlying values for 'points' and 'possessions'.
player_df.drop(player_df.index[points_outlier], inplace=True)

# Check the end of the DataFrame to ensure that the correct row was dropped.
player_df.tail(10)

Sortie

Ligne id points possessions team_pace GP MPG TS % AST TO USG ORR DRR REBR PER
31 36 2062,0 1505,7 111,5 NaN 37,0 0,620 29,8 15,6 36,2 4,9 23,9 14.7 27,86
32 37 1845,0 1435,7 113,1 69,0 36,9 0,634 33,2 14,0 36,5 4,1 21,5 16.4 34,26
33 38 1778,0 1526,4 109,3 66,0 34,9 0,612 30,6 15,9 35,9 5.5 18,8 13,7 28,65
34 39 1901,0 1444,1 109,7 67,0 36,5 0,609 27,2 14.8 35,5 5.0 21,8 8,9 20.12
36 41 2030,0 1431,0 112,3 68,0 37,0 0,618 32,5 15,3 34,5 5.7 15,7 13.2 30,07
37 42 1631,0 1465,7 110,1 66,0 37.5 0,613 28,4 14.4 35,7 6.5 20,7 14,0 28,40
38 43 1828,0 1507,2 112,7 64,0 36,5 0,618 31.3 14,0 34,9 5.9 21,3 14.5 NaN
39 44 1821,0 1443,7 118,8 66,0 36.6 0,609 27,3 13,5 35,8 7.0 23.8 11.5 22,96
40 45 1740,0 1443,9 114,1 68,0 37,1 0,611 26,6 15.2 29,3 8.3 17,7 11,1 21,22
41 46 1993,0 1459,0 112,5 NaN 36,9 0,627 30,4 15.0 33,7 6.3 19,3 14,1 28,76

Comme la fonction head(), la fonction tail() montre les cinq dernières valeurs d’un DataFrame. Et bien sûr, vous avez supprimé la ligne que vous deviez supprimer (par exemple la ligne où l’index est 35).

Vous pouvez réinitialiser à nouveau l’index pour le DataFrame de façon à garantir l’exactitude des données :

# Renumber the DataFrame index to reflect the dropped rows.
player_df.reset_index(drop=True, inplace=True)

Si vous réexécutez player_df.tail(10), vous voyez maintenant les index dans l’ordre jusqu’à la ligne 40.

© 2021 Warner Bros. Ent. Tous droits réservés.