PC & Mobile

Un guide détaillé étape par étape de l'analyse exploratoire des données

Un guide détaillé étape par étape de l'analyse exploratoire des données


Pour moi, il y a les principaux composants de l'exploration des données:

  1. Comprendre vos variables
  2. Nettoyage de votre jeu de données
  3. Analyser les relations entre les variables

Dans cet article, nous allons examiner les deux premiers composants.

Vous ne savez pas ce que vous ne savez pas. Et si vous ne savez pas ce que vous ne savez pas, comment êtes-vous censé savoir si vos idées ont un sens ou non? Vous ne le ferez pas.

Pour donner un exemple, j'explorais les données fournies par la NFL (données ici) pour voir si je pouvais découvrir des informations concernant les variables qui augmentent la probabilité de blessure. Un aperçu que j'ai obtenu est que les secondeurs ont accumulé plus de huit fois plus de blessures que les extrémités serrées. Cependant, je ne savais pas quelle était la différence entre un secondeur et un bout serré, et à cause de cela, je ne savais pas si mes idées avaient un sens ou non. Bien sûr, je peux Google quelles sont les différences entre les deux, mais je ne pourrai pas toujours compter sur Google! Vous pouvez maintenant voir pourquoi la compréhension de vos données est si importante. Voyons comment nous pouvons le faire dans la pratique.

Par exemple, j'ai utilisé le même jeu de données que j'ai utilisé pour créer mon premier modèle de forêt aléatoire, le jeu de données de voitures d'occasion ici. Tout d'abord, j'ai importé toutes les bibliothèques dont je savais que j'avais besoin pour mon analyse et j'ai effectué quelques analyses préliminaires.

# Bibliothèques d'importation
import numpy as np
importer des pandas en tant que pd
importer matplotlib.pylab comme plt
importer seaborn en tant que sns # Comprendre mes variables
df.shape
df.head ()
df.columns

.forme renvoie le nombre de lignes par le nombre de colonnes pour mon jeu de données. Ma sortie était (525839, 22), ce qui signifie que l'ensemble de données a 525839 lignes et 22 colonnes.

.tête() renvoie les 5 premières lignes de mon jeu de données. Ceci est utile si vous souhaitez voir des exemples de valeurs pour chaque variable.

.Colonnes renvoie le nom de toutes vos colonnes dans l'ensemble de données.

sortie df.columns

Une fois que je connaissais toutes les variables de l'ensemble de données, j'ai voulu mieux comprendre les différentes valeurs de chaque variable.

df.nunique (axe = 0)
df.describe (). apply (lambda s: s.apply (lambda x: format (x, 'f'))))

.nunique (axe = 0) renvoie le nombre de valeurs uniques pour chaque variable.

.décris() résume le nombre, la moyenne, l'écart type, min et max pour les variables numériques. Le code qui suit formate simplement chaque ligne au format normal et supprime la notation scientifique (voir ici).

sortie df.nunique (axe = 0)
df.describe (). apply (lambda s: s.apply (lambda x: format (x, 'f'))) output

Immédiatement, j'ai remarqué un problème avec le prix, l'année et le compteur kilométrique. Par exemple, les prix minimum et maximum sont respectivement 0,00 $ et 3 048 344 231,00 $. Vous verrez comment j'ai traité cela dans la section suivante. Je voulais toujours mieux comprendre mes variables discrètes.

df.condition.unique ()

En utilisant .unique(), J’ai jeté un œil à mes variables discrètes, y compris la «condition».

df.condition.unique ()

Vous pouvez voir qu’il existe de nombreux synonymes, comme «excellent» et «comme neuf». Bien que ce ne soit pas le meilleur exemple, il y aura des cas où il est idéal de regrouper différents mots. Par exemple, si vous analysiez les conditions météorologiques, vous souhaiterez peut-être reclassifier «nuageux», «gris», «nuageux avec risque de pluie» et «principalement nuageux» simplement comme «nuageux».

Plus tard, vous verrez que je finis par omettre cette colonne en raison d'un trop grand nombre de valeurs nulles, mais si vous souhaitez reclassifier les valeurs de condition, vous pouvez utiliser le code ci-dessous:

# Colonne de reclassification des conditions
def clean_condition (ligne):

bon = ['good','fair']
excellent = ['excellent','like new']

si row.condition est en bon état:
rendre le bien'
si row.condition en excellent:
retour 'excellent'
return row.condition # Clean dataframe
def clean_df (playlist):
df_cleaned = df.copy ()
df_cleaned['condition'] = df_cleaned.apply (ligne lambda: clean_condition (ligne), axe = 1)
return df_cleaned # Récupère df avec la colonne 'condition' reclassifiée
df_cleaned = clean_df (df) print (df_cleaned.condition.unique ())

Et vous pouvez voir que les valeurs ont été reclassées ci-dessous.

print (df_cleaned.condition.unique ()) sortie

Vous savez maintenant comment reclasser les données discrètes si nécessaire, mais il y a un certain nombre de choses qui doivent encore être examinées.

une. Suppression de variables redondantes

Je me suis d'abord débarrassé des variables que je pensais redondantes. Cela inclut url, image_url et city_url.

df_cleaned = df_cleaned.copy (). drop (['url','image_url','city_url'], axe = 1)

b. Sélection variable

Ensuite, je voulais me débarrasser de toutes les colonnes qui avaient trop de valeurs nulles. Grâce à mon ami, Richie, j'ai utilisé le code suivant pour supprimer toutes les colonnes contenant 40% ou plus de ses données comme valeurs nulles. Selon la situation, je souhaiterai peut-être augmenter ou diminuer le seuil. Les autres colonnes sont présentées ci-dessous.

NA_val = df_cleaned.isna (). Sum () def na_filter (na, threshold = .4): #sélectionne uniquement les variables qui dépassent le seuil
col_pass = []
pour i dans na.keys ():
si na[i]/df_cleaned.shape[0]<seuil:
col_pass.append (i)
return col_passdf_cleaned = df_cleaned[na_filter(NA_val)]
df_cleaned.columns

c. Suppression des valeurs aberrantes

Revisitant le problème précédemment résolu, j'ai défini des paramètres de prix, d'année et d'odomètre pour supprimer toutes les valeurs en dehors des limites définies. Dans ce cas, j'ai utilisé mon intuition pour déterminer les paramètres - je suis sûr qu'il existe des méthodes pour déterminer les limites optimales, mais je ne l'ai pas encore examiné!

df_cleaned = df_cleaned[df_cleaned['price'].entre (999.99, 99999.00)]
df_cleaned = df_cleaned[df_cleaned['year'] > 1990]
df_cleaned = df_cleaned[df_cleaned['odometer'] <899999.00]df_cleaned.describe (). apply (lambda s: s.apply (lambda x: format (x, 'f')))

Vous pouvez voir que les valeurs minimales et maximales ont changé dans les résultats ci-dessous.

ré. Suppression de lignes avec des valeurs nulles

Enfin, j'ai utilisé .dropna (axe = 0) pour supprimer toutes les lignes avec des valeurs nulles. Après le code ci-dessous, je suis passé de 371982 à 208765 lignes.

df_cleaned = df_cleaned.dropna (axe = 0)
df_cleaned.shape

Matrice de corrélation

La première chose que j'aime faire lors de l'analyse de mes variables est de la visualiser à travers une matrice de corrélation, car c'est le moyen le plus rapide de développer une compréhension générale de tout de mes variables. Réviser, corrélation est une mesure qui décrit la relation entre deux variables - si vous voulez en savoir plus, vous pouvez consulter ma feuille de triche statistique ici.) Ainsi, un matrice de corrélation est un tableau qui montre les coefficients de corrélation entre de nombreuses variables. j'ai utilisé sns.heatmap () pour tracer une matrice de corrélation de toutes les variables dans l'ensemble de données de voiture utilisé.

# calculer la matrice de corrélation
corr = df_cleaned.corr () # trace la carte thermique
sns.heatmap (corr, xticklabels = corr.columns, yticklabels = corr.columns, annot = True, cmap = sns.diverging_palette (220, 20, as_cmap = True))

Nous pouvons voir qu'il existe une corrélation positive entre le prix et l'année et une corrélation négative entre le prix et l'odomètre. Cela a du sens, car les voitures plus récentes sont généralement plus chères et les voitures avec plus de kilométrage sont relativement moins chères. Nous pouvons également voir qu'il existe une corrélation négative entre l'année et le compteur kilométrique - plus une voiture est récente, moins il y a de kilomètres sur la voiture.

Nuage de points

Il est assez difficile de battre les cartes thermiques de corrélation en ce qui concerne les visualisations de données, mais les nuages ​​de points sont sans doute l'une des visualisations les plus utiles en ce qui concerne les données.

Un nuage de points est un type de graphique qui «trace» les valeurs de deux variables sur deux axes, comme l'âge et la taille. Les diagrammes de dispersion sont utiles pour de nombreuses raisons: comme les matrices de corrélation, il vous permet de comprendre rapidement une relation entre deux variables, il est utile pour identifier les valeurs aberrantes et il joue un rôle dans les modèles de régression polynomiale multiple (que nous aborderons dans le prochain article). j'ai utilisé .terrain() et définissez le «type» de graphique comme dispersion. J'ai également défini l'axe x sur «odomètre» et l'axe y sur «prix», car nous voulons voir comment différents niveaux de kilométrage affectent le prix.

df_cleaned.plot (kind = 'scatter', x = 'odometer', y = 'price')

Cela raconte la même histoire qu'une matrice de corrélation - il existe une corrélation négative entre l'odomètre et le prix. Ce qui est bien avec les nuages ​​de points, c'est qu'ils communiquent plus d'informations que cela. Vous pouvez également supposer que le kilométrage a un effet décroissant sur le prix. En d'autres termes, la quantité de kilométrage qu'une voiture accumule au début de sa vie influe beaucoup plus sur le prix que plus tard quand une voiture est plus âgée. Vous pouvez le voir car les graphiques montrent une forte baisse au début, mais deviennent moins raides à mesure que davantage de kilométrage est ajouté. C'est pourquoi les gens disent que ce n'est pas un bon investissement pour acheter une voiture neuve!

df_cleaned.plot (kind = 'scatter', x = 'year', y = 'price')

Pour donner un autre exemple, le diagramme de dispersion ci-dessus montre la relation entre l'année et le prix - plus la voiture est récente, plus elle est susceptible d'être chère.

En prime, sns.pairplot () est un excellent moyen de créer des nuages ​​de points entre toutes vos variables.

sns.pairplot (df_cleaned)

Histogramme

Les matrices de corrélation et les diagrammes de dispersion sont utiles pour explorer la relation entre deux variables. Mais que se passe-t-il si vous ne souhaitez explorer qu'une seule variable seule? C'est à ce moment que les histogrammes entrent en jeu. Les histogrammes ressemblent à des graphiques à barres, mais ils montrent la distribution de l'ensemble de valeurs d'une variable.

df_cleaned['odometer'].plot (kind = 'hist', bins = 50, figsize = (12,6), facecolor = 'grey', edgecolor = 'black') df_cleaned['year'].plot (kind = 'hist', bins = 20, figsize = (12,6), facecolor = 'grey', edgecolor = 'black')
df_cleaned['year'].plot (kind = 'hist', bins = 20, figsize = (12,6), facecolor = 'grey', edgecolor = 'black')

Nous pouvons rapidement remarquer que la voiture moyenne a un odomètre de 0 à un peu plus de 200 000 km et une année d'environ 2000 à 2020. La différence entre les deux graphiques est que la distribution de «l'odomètre» est faussée positivement tandis que la distribution de «l'année 'est biaisé négativement. L’asymétrie est importante, en particulier dans des domaines comme la finance, car de nombreux modèles supposent que toutes les variables sont normalement distribuées, ce qui n’est généralement pas le cas.

Boxplot

Une autre façon de visualiser la distribution d'une variable est un boxplot. Nous allons regarder le «prix» cette fois-ci comme exemple.

df_cleaned.boxplot ('prix')

Les boîtes à moustaches ne sont pas aussi intuitives que les autres graphiques ci-dessus, mais elles communiquent beaucoup d'informations à leur manière. L'image ci-dessous explique comment lire un boxplot. Immédiatement, vous pouvez voir qu'il existe un certain nombre de valeurs aberrantes pour le prix dans la fourchette supérieure et que la plupart des prix se situent entre 0 et 40 000 $.

Il existe plusieurs autres types de visualisations non couvertes que vous pouvez utiliser en fonction de l'ensemble de données, comme des graphiques à barres empilées, des graphiques en aires, des graphiques en violon et même des visuels géospatiaux.

En passant par les trois étapes de l'analyse exploratoire des données, vous aurez une bien meilleure compréhension de vos données, ce qui vous permettra de choisir plus facilement votre modèle, vos attributs et de l'affiner globalement.

Afficher plus

SupportIvy

SupportIvy.com : Un lieu pour partager le savoir et mieux comprendre le monde. Meilleure plate-forme de support gratuit pour vous, Documentation &Tutoriels par les experts.

Articles similaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bouton retour en haut de la page
Fermer