Visualisation des données Python pour les débutants – Real Python

By | septembre 14, 2020

trouver un expert Python

Que vous appreniez à connaître un ensemble de données ou que vous vous prépariez à publier vos résultats, visualisation est un outil essentiel. La bibliothèque d'analyse de données populaire de Python, pandas, offre plusieurs options différentes pour visualiser vos données avec .terrain(). Même si vous êtes au début de votre voyage avec les pandas, vous allez bientôt créer des graphiques de base qui vous donneront des informations précieuses sur vos données.

Dans ce didacticiel, vous apprendrez:

  • Quels sont les différents types de parcelles de pandas sont et quand les utiliser
  • Comment obtenir une vue d'ensemble de votre ensemble de données avec un histogramme
  • Comment découvrir la corrélation avec un nuage de points
  • Comment analyser différents catégories et leur ratios

Configurez votre environnement

Vous pouvez mieux suivre le code de ce didacticiel dans un bloc-notes Jupyter. De cette façon, vous verrez immédiatement vos tracés et pourrez jouer avec eux.

Vous aurez également besoin d'un environnement Python fonctionnel comprenant des pandas. Si vous n'en avez pas encore, vous avez plusieurs options:

  • Si vous avez des projets plus ambitieux, téléchargez la distribution Anaconda. C'est énorme (environ 500 Mo), mais vous serez équipé pour la plupart des travaux de science des données.

  • Si vous préférez une configuration minimaliste, consultez la section sur l'installation de Miniconda dans Configuration de Python pour l'apprentissage automatique sur Windows.

  • Si vous voulez vous en tenir à pépin, puis installez les bibliothèques décrites dans ce tutoriel avec pip installer pandas matplotlib. Vous pouvez également récupérer Jupyter Notebook avec pip installer jupyterlab.

  • Si vous ne souhaitez effectuer aucune configuration, suivez un essai en ligne de Jupyter Notebook.

Une fois votre environnement configuré, vous êtes prêt à télécharger un ensemble de données. Dans ce didacticiel, vous allez analyser des données sur les majors universitaires provenant de l’échantillon de microdonnées à grande diffusion de l’American Community Survey 2010-2012. Il a servi de base au guide économique pour choisir un collège majeur présenté sur le site Web FiveThirtyEight.

Tout d'abord, téléchargez les données en transmettant l'URL de téléchargement à pandas.read_csv ():

>>>

Dans [1]: importer pandas comme pd

Dans [2]: download_url = (
            ...:     "https://raw.githubusercontent.com/fivethirtyeight/"
            ...:     "data / master / college-majors / recent-grads.csv"
            ...: )

Dans [3]: df = pd.read_csv(download_url)

Dans [4]: type(df)
En dehors[4]: pandas.core.frame.DataFrame

En appelant read_csv (), vous créez un DataFrame, qui est la principale structure de données utilisée dans les pandas.

Maintenant que vous avez un DataFrame, vous pouvez jeter un œil aux données. Tout d'abord, vous devez configurer le display.max.colonnes option pour s'assurer que les pandas ne masquent aucune colonne. Ensuite, vous pouvez afficher les premières lignes de données avec .tête():

>>>

Dans [5]: pd.set_option("display.max.columns", Aucun)

Dans [6]: df.tête()

Vous venez d'afficher les cinq premières lignes du DataFrame df en utilisant .tête(). Votre sortie devrait ressembler à ceci:

La sortie de df.head ()

Le nombre de lignes par défaut affiché par .tête() est cinq, mais vous pouvez spécifier n'importe quel nombre de lignes comme argument. Par exemple, pour afficher les dix premières lignes, vous utiliseriez tête df (10).

Créez votre premier tracé de pandas

Votre ensemble de données contient des colonnes liées aux revenus des diplômés dans chaque majeure:

  • "Médian" est le salaire médian des travailleurs à temps plein toute l'année.
  • "P25th" est le 25e centile des gains.
  • «P75e» est le 75e centile des gains.
  • "Rang" est le rang de la major en termes de gains médians.

Commençons par un tracé affichant ces colonnes. Tout d'abord, vous devez configurer votre bloc-notes Jupyter pour afficher les tracés avec le % matplotlib commande magique:

>>>

Dans [7]: %matplotlib
Utilisation du backend matplotlib: MacOSX

le % matplotlib La commande magic configure votre Jupyter Notebook pour afficher les graphiques avec Matplotlib. Le backend graphique standard de Matplotlib est utilisé par défaut, et vos tracés seront affichés dans une fenêtre séparée.

Vous êtes maintenant prêt à créer votre première intrigue! Vous pouvez le faire avec .terrain():

>>>

Dans [8]: df.terrain(X="Rang", y=[[[["P25th", "Médian", «P75e»])
En dehors[8]: 

.terrain() renvoie un graphique linéaire contenant les données de chaque ligne du DataFrame. Les valeurs de l'axe des abscisses représentent le rang de chaque institution et le "P25th", "Médian", et «P75e» les valeurs sont tracées sur l'axe des y.

La figure produite par .terrain() est affiché dans une fenêtre séparée par défaut et ressemble à ceci:

graphique linéaire avec P25, médiane, gains P75

En regardant le graphique, vous pouvez faire les observations suivantes:

  • Le revenu médian diminue à mesure que le rang diminue. Ceci est attendu car le rang est déterminé par le revenu médian.

  • Certaines majors ont de grands écarts entre les 25e et 75e centiles. Les personnes titulaires de ces diplômes peuvent gagner beaucoup moins ou beaucoup plus que le revenu médian.

  • D'autres majors ont de très petits écarts entre les 25e et 75e centiles. Les personnes titulaires de ces diplômes gagnent des salaires très proches du revenu médian.

Votre premier tracé indique déjà qu'il y a beaucoup plus à découvrir dans les données! Certaines majors ont une large gamme de revenus, et d'autres une fourchette plutôt étroite. Pour découvrir ces différences, vous utiliserez plusieurs autres types de tracés.

.terrain() a plusieurs paramètres facultatifs. Plus particulièrement, le gentil Le paramètre accepte onze valeurs de chaîne différentes et détermine le type de tracé que vous allez créer:

  1. "zone" est pour les parcelles de surface.
  2. "bar" est pour les graphiques à barres verticales.
  3. "barh" est pour les graphiques à barres horizontales.
  4. "boîte" est pour les box plots.
  5. "hexbin" est pour les tracés hexbin.
  6. "hist" est pour les histogrammes.
  7. "kde" est pour les graphiques d'estimation de la densité du noyau.
  8. "densité" est un alias pour "kde".
  9. "ligne" est pour les graphiques linéaires.
  10. "tarte" est pour les graphiques à secteurs.
  11. "dispersion" est pour les nuages ​​de points.

La valeur par défaut est "ligne". Les graphiques linéaires, comme celui que vous avez créé ci-dessus, offrent un bon aperçu de vos données. Vous pouvez les utiliser pour détecter les tendances générales. Ils fournissent rarement des informations sophistiquées, mais ils peuvent vous donner des indices sur l'endroit où effectuer un zoom avant.

Si vous ne fournissez pas de paramètre à .terrain(), puis il crée un tracé linéaire avec l'index sur l'axe des x et toutes les colonnes numériques sur l'axe des y. Bien que ce soit une valeur par défaut utile pour les ensembles de données avec seulement quelques colonnes, pour l'ensemble de données des majors du collège et ses plusieurs colonnes numériques, cela ressemble à un gâchis.

Maintenant que vous avez créé votre premier complot de pandas, voyons de plus près comment .terrain() travaux.

Regardez sous le capot: Matplotlib

Quand vous appelez .terrain() sur un Trame de données objet, Matplotlib crée le tracé sous le capot.

Pour vérifier cela, essayez deux extraits de code. Tout d'abord, créez un tracé avec Matplotlib en utilisant deux colonnes de votre DataFrame:

>>>

Dans [9]: importer matplotlib.pyplot comme plt

Dans [10]: plt.terrain(df[[[["Rang"], df[[[[«P75e»])
En dehors[10]: [[[[]

Tout d'abord, vous importez le matplotlib.pyplot module et renommez-le en plt. Alors tu appelles terrain() et passer le Trame de données objets "Rang" colonne comme premier argument et le «P75e» colonne comme deuxième argument.

Le résultat est un graphique linéaire qui trace le 75e centile sur l'axe des y par rapport au rang sur l'axe des x:

tracé linéaire avec P75

Vous pouvez créer exactement le même graphique en utilisant le Trame de données objets .terrain() méthode:

>>>

Dans [11]: df.terrain(X="Rang", y=«P75e»)
En dehors[11]: 

.terrain() est un emballage pour pyplot.plot (), et le résultat est un graphique identique à celui que vous avez produit avec Matplotlib:

tracé linéaire avec P75

Vous pouvez utiliser les deux pyplot.plot () et df.plot () pour produire le même graphique à partir des colonnes d'un Trame de données objet. Cependant, si vous avez déjà un Trame de données exemple, alors df.plot () offre une syntaxe plus claire que pyplot.plot ().

Maintenant que vous savez que le Trame de données objets .terrain() method est un wrapper pour Matplotlib pyplot.plot (), plongons dans les différents types de tracés que vous pouvez créer et comment les créer.

Sondez vos données

Les graphiques suivants vous donneront un aperçu général d'une colonne spécifique de votre ensemble de données. Tout d'abord, vous allez examiner la distribution d'une propriété avec un histogramme. Ensuite, vous apprendrez à connaître certains outils pour examiner les valeurs aberrantes.

Distributions et histogrammes

Trame de données n'est pas la seule classe de pandas avec un .terrain() méthode. Comme cela arrive souvent chez les pandas, le Séries objet fournit des fonctionnalités similaires.

Vous pouvez obtenir chaque colonne d'un DataFrame en tant que Séries objet. Voici un exemple utilisant le "Médian" colonne du DataFrame que vous avez créé à partir des principales données du collège:

>>>

Dans [12]: median_column = df[[[["Médian"]

Dans [13]: type(median_column)
En dehors[13]: pandas.core.series.Series

Maintenant que vous avez un Séries objet, vous pouvez créer un tracé pour celui-ci. Un histogramme est un bon moyen de visualiser la répartition des valeurs dans un ensemble de données. Les histogrammes regroupent les valeurs en bacs et afficher un décompte des points de données dont les valeurs se trouvent dans une case particulière.

Créons un histogramme pour le "Médian" colonne:

>>>

Dans [14]: median_column.terrain(gentil="hist")
En dehors[14]: 

Tu appelles .terrain() sur le median_column Série et passer la chaîne "hist" à la gentil paramètre. C'est tout ce qu'on peut en dire!

Quand vous appelez .terrain(), vous verrez la figure suivante:

graphique d'hist médian

L'histogramme montre les données regroupées en dix catégories allant de 20000 USD à 120000 USD, et chaque zone a un largeur de 10 000 $. L'histogramme a une forme différente de la distribution normale, qui a une forme de cloche symétrique avec un pic au milieu.

L'histogramme des données médianes, cependant, culmine à gauche en dessous de 40 000 $. le queue s'étend loin vers la droite et suggère qu'il existe effectivement des domaines dont les majors peuvent s'attendre à des revenus nettement plus élevés.

Valeurs aberrantes

Avez-vous repéré ce petit bac solitaire sur le bord droit de la distribution? Il semble qu'un point de données ait sa propre catégorie. Les majors dans ce domaine obtiennent un excellent salaire par rapport non seulement à la moyenne mais aussi au finaliste. Bien que ce ne soit pas son objectif principal, un histogramme peut vous aider à détecter une telle valeur aberrante. Examinons un peu plus la valeur aberrante:

  • Quelles majeures représentent cette valeur aberrante?
  • Quelle est sa largeur?

Contrairement au premier aperçu, vous ne voulez comparer que quelques points de données, mais vous voulez voir plus de détails à leur sujet. Pour cela, un graphique à barres est un excellent outil. Tout d'abord, sélectionnez les cinq majors ayant les gains médians les plus élevés. Vous aurez besoin de deux étapes:

  1. Pour trier par "Médian" colonne, utiliser .sort_values ​​() et indiquez le nom de la colonne que vous souhaitez trier ainsi que la direction croissant = Faux.
  2. Pour obtenir les cinq premiers éléments de votre liste, utilisez .tête().

Créons un nouveau DataFrame appelé Top 5:

>>>

Dans [15]: Top 5 = df.sort_values(par="Médian", Ascendant=Faux).tête()

Vous avez maintenant un DataFrame plus petit contenant uniquement les cinq majors les plus lucratives. À l'étape suivante, vous pouvez créer un diagramme à barres qui montre uniquement les majors avec ces cinq premiers salaires médians:

>>>

Dans [16]: Top 5.terrain(X="Majeur", y="Médian", gentil="bar", pourrir=5, taille de police=4)
En dehors[16]: 

Notez que vous utilisez le pourrir et taille de police paramètres pour faire pivoter et dimensionner les étiquettes de l'axe des x afin qu'elles soient visibles. Vous verrez un graphique avec 5 barres:

Bar plot avec top 5 médian

Ce graphique montre que le salaire médian des majors du génie pétrolier est plus de 20 000 $ plus élevé que le reste. Les gains des majors de la deuxième à la quatrième place sont relativement proches les uns des autres.

Si vous avez un point de données avec une valeur beaucoup plus élevée ou plus basse que le reste, vous voudrez probablement approfondir vos recherches. Par exemple, vous pouvez consulter les colonnes contenant des données associées.

Examinons toutes les majors dont le salaire médian est supérieur à 60 000 USD. Tout d'abord, vous devez filtrer ces majors avec le masque df[df["Median"] > 60000]. Ensuite, vous pouvez créer un autre diagramme à barres affichant les trois colonnes de revenus:

>>>

Dans [17]: top_medians = df[[[[df[[[["Médian"] > 60000].sort_values("Médian")

Dans [18]: top_medians.terrain(X="Majeur", y=[[[["P25th", "Médian", «P75e»], gentil="bar")
En dehors[18]: 

Vous devriez voir un graphique avec trois mesures par majeure, comme ceci:

diagramme à barres avec plusieurs colonnes

Les 25e et 75e centiles confirment ce que vous avez vu ci-dessus: les majors en génie pétrolier étaient de loin les nouveaux diplômés les mieux payés.

Pourquoi devriez-vous être si intéressé par les valeurs aberrantes dans cet ensemble de données? Si vous êtes étudiant et que vous vous demandez quelle majeure choisir, vous avez au moins une raison assez évidente. Mais les valeurs aberrantes sont également très intéressantes du point de vue de l'analyse. Ils peuvent indiquer non seulement les industries avec une abondance d'argent, mais aussi des données invalides.

Des données non valides peuvent être causées par un certain nombre d'erreurs ou d'oublis, y compris une panne de capteur, une erreur lors de la saisie manuelle des données ou un enfant de cinq ans participant à un groupe de discussion destiné aux enfants de dix ans et plus. L'étude des valeurs aberrantes est une étape importante du nettoyage des données.

Même si les données sont correctes, vous pouvez décider qu'elles sont tellement différentes des autres qu'elles produisent plus de bruit que d'avantages. Supposons que vous analysiez les données de vente d'un petit éditeur. Vous regroupez les revenus par région et vous les comparez au même mois de l'année précédente. Puis à l'improviste, l'éditeur décroche un best-seller national.

Cet événement agréable rend votre rapport inutile. Avec les données du best-seller incluses, les ventes augmentent partout. Effectuer la même analyse sans la valeur aberrante fournirait des informations plus précieuses, vous permettant de voir qu'à New York, vos chiffres de vente se sont considérablement améliorés, mais à Miami, ils ont empiré.

Vérifier la corrélation

Vous voulez souvent voir si deux colonnes d'un ensemble de données sont connectées. Si vous choisissez une majeure avec des gains médians plus élevés, avez-vous également moins de risques de chômage? Dans un premier temps, créez un nuage de points avec ces deux colonnes:

>>>

Dans [19]: df.terrain(X="Médian", y="Taux de chômage", gentil="dispersion")
En dehors[19]: 

Vous devriez voir un graphique assez aléatoire, comme celui-ci:

nuage de points chômage médian

Un rapide coup d'œil à ce chiffre montre qu'il n'y a pas de corrélation significative entre les revenus et le taux de chômage.

Bien qu'un nuage de points soit un excellent outil pour avoir une première impression sur une corrélation possible, ce n'est certainement pas une preuve définitive d'une connexion. Pour un aperçu des corrélations entre les différentes colonnes, vous pouvez utiliser .corr (). Si vous suspectez une corrélation entre deux valeurs, vous disposez de plusieurs outils pour vérifier votre intuition et mesurer la force de la corrélation.

Gardez à l'esprit, cependant, que même s'il existe une corrélation entre deux valeurs, cela ne signifie toujours pas qu'une modification de l'une entraînerait une modification de l'autre. En d'autres termes, la corrélation n'implique pas de causalité.

Analyser les données catégoriques

Pour traiter de plus gros morceaux d'informations, l'esprit humain trie consciemment et inconsciemment les données en catégories. Cette technique est souvent utile, mais elle est loin d’être parfaite.

Parfois, nous classons les choses dans une catégorie qui, après un examen plus approfondi, ne sont pas si similaires. Dans cette section, vous découvrirez certains outils permettant d'examiner les catégories et de vérifier si une catégorisation donnée a du sens.

De nombreux ensembles de données contiennent déjà une catégorisation explicite ou implicite. Dans l'exemple actuel, les 173 majors sont divisées en 16 catégories.

Regroupement

Une utilisation de base des catégories est le regroupement et l'agrégation. Vous pouvez utiliser .par groupe() pour déterminer la popularité de chacune des catégories de l'ensemble de données principal du collège:

>>>

Dans [20]: cat_totals = df.par groupe("Major_category")[[[["Total"].somme().sort_values()

Dans [21]: cat_totals
En dehors[21]:
Major_category
Interdisciplinaire 12296.0
Agriculture et ressources naturelles 75620,0
Droit et politique publique 179107.0
Sciences physiques 185479.0
Arts industriels et services aux consommateurs 229792,0
Informatique et mathématiques 299008.0
Arts 357130.0
Communications et journalisme 392601.0
Biologie et sciences de la vie 453862.0
Santé 463230.0
Psychologie et travail social 481007.0
Sciences sociales 529966.0
Ingénierie 537583.0
Éducation 559129,0
Sciences humaines et arts libéraux 713468.0
Affaires 1302376.0
Nom: Total, dtype: float64

Avec .par groupe(), vous créez un DataFrameGroupBy objet. Avec .somme(), vous créez une série.

Trouvons un graphique à barres horizontales montrant tous les totaux des catégories dans cat_totals:

>>>

Dans [22]: cat_totals.terrain(gentil="barh", taille de police=4)
En dehors[22]: 

Vous devriez voir un graphique avec une barre horizontale pour chaque catégorie:

catégories de graphique en barh

Comme le montre votre intrigue, les affaires sont de loin la principale catégorie la plus populaire. Alors que les sciences humaines et les arts libéraux sont clairement les seconds, les autres domaines sont plus similaires en popularité.

Déterminer les ratios

Les graphiques à barres verticales et horizontales sont souvent un bon choix si vous souhaitez voir la différence entre vos catégories. Si vous êtes intéressé par les ratios, les graphiques à secteurs sont un excellent outil. Cependant, depuis cat_totals contient quelques catégories plus petites, créant un diagramme à secteurs avec cat_totals.plot (genre = "tarte") produira plusieurs minuscules tranches avec des étiquettes qui se chevauchent.

Pour résoudre ce problème, vous pouvez regrouper les catégories plus petites dans un seul groupe. Fusionner toutes les catégories avec un total inférieur à 100 000 dans une catégorie appelée "Autre", puis créez un diagramme à secteurs:

>>>

Dans [23]: small_cat_totals = cat_totals[[[[cat_totals < 100_000]

Dans [24]: big_cat_totals = cat_totals[[[[cat_totals > 100_000]

Dans [25]: # Ajout d'un nouvel élément "Autre" avec la somme des petites catégories

Dans [26]: small_sums = pd.Séries([[[[small_cat_totals.somme()], indice=[[[["Autre"])

Dans [27]: big_cat_totals = big_cat_totals.ajouter(small_sums)

Dans [28]: big_cat_totals.terrain(gentil="tarte", étiquette="")
En dehors[28]: 

Notez que vous incluez l'argument label = "". Par défaut, pandas ajoute une étiquette avec le nom de la colonne. Cela a souvent du sens, mais dans ce cas, cela ne ferait qu'ajouter du bruit.

Vous devriez maintenant voir un diagramme à secteurs comme celui-ci:

catégorie de graphique à secteurs

le "Autre" la catégorie ne représente encore qu’une très petite part du gâteau. C’est un bon signe que la fusion de ces petites catégories était le bon choix.

Zoom avant sur les catégories

Parfois, vous souhaitez également vérifier si une certaine catégorisation a du sens. Les membres d'une catégorie sont-ils plus similaires les uns aux autres qu'ils ne le sont au reste de l'ensemble de données? Encore une fois, une distribution est un bon outil pour avoir un premier aperçu. En général, nous nous attendons à ce que la distribution d'une catégorie soit similaire à la distribution normale mais qu'elle ait une gamme plus petite.

Créez un histogramme montrant la distribution des gains médians des majors d'ingénierie:

>>>

Dans [29]: df[[[[df[[[["Major_category"] == "Ingénierie"][[[["Médian"].terrain(gentil="hist")
En dehors[29]: 

Vous obtiendrez un histogramme que vous pourrez comparer à l'histogramme de toutes les disciplines majeures depuis le début:

Gains médians de l'ingénierie graphique hist

La fourchette des principaux gains médians est un peu plus petite, à partir de 40 000 $. La distribution est plus proche de la normale, bien que son pic soit toujours à gauche. Ainsi, même si vous avez décidé de choisir une majeure dans la catégorie ingénierie, il serait sage de plonger plus profondément et d'analyser vos options plus en profondeur.

Conclusion

Dans ce didacticiel, vous avez appris comment démarrer visualiser votre jeu de données en utilisant Python et la bibliothèque pandas. Vous avez vu comment certains graphiques de base peuvent vous donner un aperçu de vos données et guider votre analyse.

Dans ce didacticiel, vous avez appris à:

  • Obtenez un aperçu de la distribution de votre ensemble de données avec un histogramme
  • Découvrez la corrélation avec un nuage de points
  • Analysez les catégories avec parcelles à barres et leurs ratios avec parcelles à secteurs
  • Déterminez quel tracé est le plus adapté à votre tâche actuelle

En utilisant .terrain() et un petit DataFrame, vous avez découvert de nombreuses possibilités pour fournir une image de vos données. Vous êtes maintenant prêt à tirer parti de ces connaissances et à découvrir des visualisations encore plus sophistiquées.

Si vous avez des questions ou des commentaires, veuillez les mettre dans la section commentaires ci-dessous.

Lectures complémentaires

Bien que les pandas et Matplotlib facilitent la visualisation de vos données, il existe des possibilités infinies pour créer des graphiques plus sophistiqués, plus beaux ou plus attrayants.

Un bon point de départ est la section de traçage de la documentation de pandas DataFrame. Il contient à la fois un excellent aperçu et des descriptions détaillées des nombreux paramètres que vous pouvez utiliser avec vos DataFrames.

Si vous souhaitez mieux comprendre les fondements du traçage avec des pandas, familiarisez-vous davantage avec Matplotlib. Bien que la documentation puisse parfois être écrasante, Anatomy of Matplotlib fait un excellent travail en introduisant certaines fonctionnalités avancées.

Si vous souhaitez impressionner votre public avec des visualisations interactives et l'encourager à explorer les données par lui-même, faites de Bokeh votre prochain arrêt. Vous pouvez trouver un aperçu des fonctionnalités de Bokeh dans la visualisation interactive des données en Python avec Bokeh. Vous pouvez également configurer les pandas pour utiliser Bokeh au lieu de Matplotlib avec le pandas-bokeh bibliothèque

Si vous souhaitez créer des visualisations pour une analyse statistique ou pour un article scientifique, consultez Seaborn. Vous pouvez trouver une courte leçon sur Seaborn dans le traçage d'histogramme Python.