Exercice - Exploration des données, partie 1 : Rechercher les valeurs hors norme
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]])
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.