C’est toujours une bonne idée d’examiner nos données avant de commencer à tracer. Nous pouvons lire les données dans un dataframe pandas et afficher les 10 premières lignes :
import pandas as pd# Read in data and examine first 10 rows flights = pd.read_csv('data/formatted_flights.csv') flights.head(10)
Les retards à l’arrivée des vols sont exprimés en minutes et les valeurs négatives signifient que le vol était en avance (il s’avère que les vols ont souvent tendance à arriver en avance, juste jamais lorsque nous sommes dessus !) Il y a plus de 300 000 vols avec un retard minimum de -60 minutes et un retard maximum de 120 minutes. L’autre colonne du dataframe est le nom de la compagnie aérienne que nous pouvons utiliser pour les comparaisons.
Une excellente façon de commencer à explorer une seule variable est avec l’histogramme. Un histogramme divise la variable en bacs, compte les points de données dans chaque bac, et montre les bacs sur l’axe des x et les comptes sur l’axe des y. Dans notre cas, les cases seront un intervalle de temps représentant le retard des vols et le nombre sera le nombre de vols entrant dans cet intervalle. La largeur de bac est le paramètre le plus important pour un histogramme et nous devrions toujours essayer quelques valeurs différentes de la largeur de bac pour sélectionner la meilleure pour nos données.
Pour réaliser un histogramme de base en Python, nous pouvons utiliser matplotlib ou seaborn. Le code ci-dessous montre les appels de fonction dans les deux bibliothèques qui créent des figures équivalentes. Pour les appels au tracé, nous spécifions la largeur de bin par le nombre de bins. Pour ce tracé, j’utiliserai des bacs d’une longueur de 5 minutes, ce qui signifie que le nombre de bacs sera l’étendue des données (de -60 à 120 minutes) divisée par la largeur de bac, 5 minutes ( bins = int(180/5)).
Pour les histogrammes les plus basiques, J’irais avec le code de matplotlib car il est plus simple, mais nous utiliserons la fonction seaborn distplot plus tard pour créer différentes distributions et il est bon de se familiariser avec les différentes options.
Comment en suis-je arrivé à 5 minutes pour la largeur de bin ? La seule façon de déterminer une binwidth optimale est d’essayer plusieurs valeurs ! Vous trouverez ci-dessous le code permettant de réaliser la même figure dans matplotlib avec une gamme de binwidths. En fin de compte, il n’y a pas de bonne ou de mauvaise réponse à la largeur de bin, mais je choisis 5 minutes parce que je pense qu’elle représente le mieux la distribution.
Le choix de la largeur de bin affecte de manière significative le graphique résultant. Les petites largeurs de bin peuvent rendre le tracé encombré, mais les grandes largeurs de bin peuvent masquer les nuances dans les données. Matplotlib choisira automatiquement une largeur binaire raisonnable pour vous, mais j’aime spécifier moi-même la largeur binaire après avoir essayé plusieurs valeurs. Il n’y a pas de vraie bonne ou mauvaise réponse, alors essayez quelques options et voyez ce qui fonctionne le mieux pour vos données particulières.
Les histogrammes sont un excellent moyen de commencer à explorer une seule variable tirée d’une catégorie. Cependant, lorsque nous voulons comparer les distributions d’une variable à travers plusieurs catégories, les histogrammes ont des problèmes de lisibilité. Par exemple, si nous voulons comparer les distributions des retards à l’arrivée entre les compagnies aériennes, une approche qui ne fonctionne pas bien est de créer des histogrammes pour chaque compagnie aérienne sur le même graphique :
(Remarquez que l’axe des y a été normalisé pour tenir compte du nombre différent de vols entre les compagnies aériennes. Pour ce faire, passez l’argument norm_hist = True à l’appel de fonction sns.distplot.)
Ce graphique n’est pas très utile ! Toutes les barres qui se chevauchent font qu’il est presque impossible de faire des comparaisons entre les compagnies aériennes. Voyons quelques solutions possibles à ce problème courant.
Solution #1 : Histogrammes côte à côte
Au lieu de superposer les histogrammes des compagnies aériennes, nous pouvons les placer côte à côte. Pour ce faire, nous créons une liste des retards à l’arrivée pour chaque compagnie aérienne, puis nous la passons dans l’appel de fonction plt.hist comme une liste de listes. Nous devons spécifier différentes couleurs à utiliser pour chaque compagnie aérienne et une étiquette afin de pouvoir les distinguer. Le code, y compris la création des listes pour chaque compagnie aérienne est ci-dessous:
By default, si nous passons dans une liste de listes, matplotlib mettra les barres côte à côte. Ici, j’ai changé la binwidth à 15 minutes car sinon le tracé est trop encombré, mais même avec cette modification, ce n’est pas une figure efficace. Il y a trop d’informations à traiter en même temps, les barres ne sont pas alignées avec les étiquettes, et il est toujours difficile de comparer les distributions entre les compagnies aériennes. Lorsque nous créons un graphique, nous voulons qu’il soit aussi facile à comprendre que possible pour le spectateur, et cette figure ne répond pas à ce critère ! Examinons une deuxième solution potentielle.
Solution #2 : barres empilées
Au lieu de tracer les barres de chaque compagnie aérienne côte à côte, nous pouvons les empiler en passant le paramètre stacked = True à l’appel de l’histogramme :
# Stacked histogram with multiple airlines plt.hist(, bins = int(180/15), stacked=True, normed=True, color = colors, label=names)
Avec de nombreux points de données, le rug plot peut devenir surchargé, mais pour certains ensembles de données, il peut être utile de visualiser chaque point de données. Le rug plot nous permet également de voir comment le plot de densité « crée » des données là où il n’y en a pas, car il crée une distribution à noyau à chaque point de données. Ces distributions peuvent s’étendre sur la plage des données d’origine et donner l’impression que les retards d’Alaska Airlines sont à la fois plus courts et plus longs que ceux réellement enregistrés. Nous devons faire attention à cet artefact des diagrammes de densité et le signaler aux téléspectateurs !
Conclusions
Ce post vous a, nous l’espérons, donné une gamme d’options pour visualiser une seule variable à partir d’une ou plusieurs catégories. Il y a encore plus de tracés univariés (à une seule variable) que nous pouvons faire, comme les tracés de densité cumulative empirique et les tracés de quantile-quantile, mais pour l’instant nous en resterons aux histogrammes et aux tracés de densité (et aux tracés de tapis aussi !). Ne vous inquiétez pas si les options vous semblent écrasantes : avec la pratique, faire un bon choix deviendra plus facile, et vous pourrez toujours demander de l’aide si nécessaire. De plus, il n’y a souvent pas de choix optimal et la « bonne » décision dépendra des préférences et des objectifs de la visualisation. La bonne nouvelle est que, quel que soit le tracé que vous souhaitez réaliser, il y aura un moyen de le faire en Python ! Les visualisations sont un moyen efficace de communiquer des résultats, et connaître toutes les options disponibles nous permet de choisir la bonne figure pour nos données.
J’accueille volontiers les commentaires et les critiques constructives et je suis joignable sur Twitter @koehrsen_will.