Analyse de données avec Python

Wes McKinney

Analyse de données avec Python

Authorized French translation of the English edition of Python for Data Analysis, 2E ISBN 9781491957660 © 2018 William McKinney.

© 2021 Éditions First, un département d’Édi8

92, avenue de France

75013 Paris – France

Tél. : 01 44 16 09 00

Fax : 01 44 16 09 01

Courriel : firstinfo@editionsfirst.fr

Site Internet : www.editionsfirst.fr

ISBN : 9782412069189

Dépôt légal : mars 2021

Traduction de l’anglais : Daniel Rougé, avec le concours d’Olivier Engler

Mise en page : Pierre Brandeis

Cette œuvre est protégée par le droit d’auteur et strictement réservée à l’usage privé du client. Toute reproduction ou diffusion au profit de tiers, à titre gratuit ou onéreux, de tout ou partie de cette oeuvre est strictement interdite et constitue une contrefaçon prévue par les articles L 335-2 et suivants du Code de la propriété intellectuelle. L’éditeur se réserve le droit de poursuivre toute atteinte à ses droits de propriété intellectuelle devant les juridictions civiles ou pénales.

Ce livre numérique a été converti initialement au format EPUB par Isako www.isako.com à partir de l'édition papier du même ouvrage.

Préface

Cette édition française est dédiée à la mémoire de Daniel Rougé, emporté par le Covid-19 alors qu’il finissait la traduction française du présent livre. Nos remerciements à Olivier Engler pour avoir repris le flambeau à sa suite afin de finaliser son travail.

Nouveautés pour la deuxième édition

La première édition (en anglais) de ce livre avait été publiée en 2012, à une époque où les librairies d’analyse de données open source pour Python (telles que pandas) étaient très récentes et se développaient rapidement. Dans cette deuxième édition mise à jour et augmentée, j’ai revu les chapitres pour tenir compte à la fois des changements et des dépréciations incompatibles, ainsi que des nouvelles fonctionnalités qui sont apparues au cours de ces dernières années. J’ai également ajouté du nouveau contenu pour introduire des outils qui n’existaient pas à l’époque, ou qui n’étaient pas assez mûrs pour être alors abordés. Enfin, j’ai tenté de ne pas écrire sur des projets open source nouveaux ou de pointe n’ayant pas encore acquis une maturité suffisante.

Les principales mises à jour de cette nouvelle édition sont les suivantes :

• Tout le code, y compris le tutoriel Python, a été mis à jour pour une version 3.6 ou ultérieure de Python (la première édition utilisant Python 2.7).

• Mise à jour des instructions d’installation pour la distribution Anaconda de Python, et autres packages nécessaires à Python.

Si vous installez Python via Anaconda, la dernière mise à jour de celui-ci fait passer directement à la version 3.8 de Python. Cependant, cela ne devrait avoir aucune incidence sur les exemples de code de ce livre.

• Mises à jour des dernières versions de la librairie pandas.

• Un chapitre s’intéresse de près aux outils plus avancés de pandas, et propose quelques conseils supplémentaires d’utilisation.

• Le livre propose également une brève introduction aux librairies statsmodels et scikit-learn.

Conventions utilisées dans ce livre

Les conventions typographiques suivantes sont utilisées dans ce livre :

Italique

Indique les nouveaux termes, les noms de fichiers et les extensions de fichiers, voire les adresses électroniques.

Police non proportionnelle

Utilisée pour les listings des programmes, ainsi que dans le corps du texte pour faire référence aux éléments de programme tels que les noms de variables ou de fonctions, les bases de données, les types de données, les variables d’environnement, les déclarations et les mots clés, ainsi que pour les URL.

Police non proportionnelle en gras

Pour les commandes ou autres textes qui doivent être tapés littéralement par l’utilisateur.

Police non proportionnelle en italique

Pour le texte qui doit être remplacé par des valeurs fournies par l’utilisateur ou déterminées par le contexte.

Cet élément signifie un conseil ou une suggestion.

Cet élément signifie une note générale.

Cet élément signale un avertissement ou une mise en garde.

L’indication « (N. d. T.) » signale les remarques spécifiques à l’édition française.

Utilisation des exemples de code

Vous pouvez trouver des fichiers de données et du matériel connexe pour chaque chapitre dans le dépôt GitHub de ce livre à l’adresse suivante :

http://github.com/wesm/pydata-book

Vous pouvez télécharger le contenu du dépôt, dans un dossier de travail de votre choix, sur votre système à l’aide d’une commande de shell telle que :

git clone http://github.com/wesm/pydata-book.git

(N. d. T.) Nous avons retesté tous les exemples et vous proposons un fichier archive des calepins dans la page du livre sur le site de l’éditeur français. Rendez-vous à l’adresse https://www.lisez.com puis cliquez sur l’icône de loupe afin de rechercher le titre de ce livre. Une fois sur la page de ce dernier, cliquez sur Contenu additionnel puis sur le bouton Télécharger.

Les exemples de ce livre sont open source et sont hébergés sur github.com. Si vous souhaitez revoir la façon d’utiliser les outils de contrôle des sources git, GitHub propose un tutoriel bien fait, disponible à l’adresse http://bit.ly/2TcDK7K. Si vous voyez une erreur ou si vous souhaitez clarifier quelque chose, vous pouvez envoyer des correctifs via les requêtes GitHub.

(N. d. T.) Notez bien que, puisque tout le code est accessible directement à partir du dépôt GitHub de l’auteur, les commentaires seront toujours traduits, mais pas toujours les variables et les méthodes. Les données des bases de données publiques utilisées dans les exemples ne sont par définition jamais francisées.

Si vous devez, pour une raison ou pour une autre, vous resservir de parties de ce code pour votre propre usage, faites-le librement. En revanche, dans une éventuelle publication, il vous est demandé de citer la source. C’est une question de respect du droit d’auteur en particulier, et du droit des auteurs en général.

Terminologie française

Plus encore que dans le domaine de la programmation informatique, la terminologie mérite un soin particulier en datalogie. Voici nos principales décisions.

Terme utilisé
Terme anglais
Commentaires si nécessaire

1 sur n

one-hot

Encodage binaire dont tous les bits sauf un sont forcés à 0. On rencontre aussi « 1 parmi n ».

aberrant

outlier

Une valeur anormalement éloignée des autres observations.

binning

binning

Répartition de valeurs uniquement numériques en plusieurs bacs ou baquets (chapitre 14) (bins).

baquet

bucket

buckets (ou encore godets ou bien compartiments), réceptacle d’une distribution des données

calepin (de Jupyter)

notebook

Le terme notebook sert d’abord à désigner un ordinateur portable. Le terme calepin permet de bien distinguer le format de fichier hybride qui combine des blocs de code source et des commentaires et graphiques.

datalogie

data science

L’expression science des données tente de remplacer « datascience ». Datalogie utilise le même mécanisme de construction que technologie.

datalogue

data scientist

Personne produisant des informations essentielles (des discours, logos) par distillation probabiliste de données brutes.

enjambement

stride

Valeur entière supérieure à 1 qui détermine le nombre d’octets occupés par chaque élément de données dans un tableau et permet ainsi de progresser parmi les éléments.

erreur quadratique moyenne

Mean Squared Error

S’il est nécessaire, nous conservons l’acronyme anglais MSE.

exétron

thread

Sous-processus d’exécution appelé également fil d’exécution.

grappe

cluster

Résultat de l’opération de partitionnement ou regroupement (clustering)

librairie

library

Terme à privilégier en remplacement de bibliothèque.

sur-ajustement

overfitting

On utilise aussi sur-apprentissage.

In [] et Out[]

Les numéros qui apparaissent dans les calepins Jupyter Notebook pour les sections In [] et Out[] varient en fonction du nombre d’exécutions depuis la dernière ouverture du calepin. Ils ne vont donc pas coïncider avec ceux du livre.

CHAPITRE 1 Préliminaires

1.1 De quoi parle ce livre ?

Ce livre traite des rouages de la manipulation, du traitement, du nettoyage et de l’écrasement des données en Python. Mon but est de vous offrir un guide des parties utiles du langage de programmation Python et de son écosystème de librairies orientées données, ainsi que de vous présenter des outils qui vous permettront de devenir un analyste des données efficace. Au-delà de l’expression « analyse des données », l’accent est mis dans ce livre sur la programmation, les librairies et les outils de Python, par opposition à la méthodologie d’analyse des données. C’est la programmation Python dont vous avez besoin pour l’analyse des données.

Quels types de données ?

Quand je dis « données », à quoi fais-je référence exactement ? Il s’agit avant tout de données structurées, un terme délibérément vague qui englobe de nombreuses formes communes de données, telles que :

• Données tabulaires ou sous forme de tableur, dont chaque colonne peut être d’un type différent (chaîne de caractères, numérique, date ou autre). Cela inclut la plupart des types de données généralement stockées dans des bases de données relationnelles ou des fichiers texte délimités par des tabulations ou des virgules.

• Tableaux multidimensionnels (matrices).

• Tables de données multiples reliées entre elles par des colonnes de clés (ce qui correspondrait à des clés primaires ou étrangères pour un utilisateur de SQL).

• Séries chronologiques espacées de façon égale ou inégale.

Cette liste n’est en aucun cas exhaustive. Même si ce n’est pas toujours évident, un grand pourcentage des jeux de données peut être transformé en une forme structurée plus adaptée à l’analyse et à la modélisation. Sinon, il peut être possible d’extraire des caractéristiques utiles à partir d’un jeu de données sous une forme structurée. Par exemple, une collection d’articles de presse pourrait être traitée dans un tableau de fréquence des mots, susceptible d’être ensuite utilisé pour effectuer une analyse des sentiments (dans le sens d’opinions, d’avis).

La plupart des utilisateurs de tableurs comme Microsoft Excel, peut-être l’outil d’analyse de données le plus utilisé au monde, ne se sentiront pas étrangers à ce genre de données.

1.2 Pourquoi Python pour l’analyse des données ?

Pour beaucoup de gens, le langage de programmation Python a un fort attrait. Depuis son apparition en 1991, Python est devenu l’un des langages de programmation interprétés les plus populaires, avec Perl, Ruby et quelques autres. Python et Ruby sont devenus particulièrement populaires depuis environ une quinzaine d’années pour construire des sites web en utilisant leurs nombreux frameworks, comme Rails (Ruby) et Django (Python). Ces langages sont souvent appelés langages de script, car ils permettent d’écrire rapidement de petits programmes, ou des scripts, servant à automatiser d’autres tâches. En fait, le terme « langage de script » ne me semble pas approprié, car il laisse entendre qu’ils ne peuvent pas être employés pour construire des logiciels sérieux. Parmi les langages interprétés, pour diverses raisons historiques et culturelles, Python a développé une communauté importante et active dans les domaines du calcul scientifique et de l’analyse des données. Au cours des dix dernières années, Python est passé d’un langage informatique scientifique de pointe, ou « à vos risques et périls », à l’un des langages les plus importants pour la science des données, l’apprentissage automatique et le développement de logiciels en général dans le monde universitaire et industriel.

Pour l’analyse des données, l’informatique interactive et la visualisation des données, Python sera inévitablement comparé à d’autres langages de programmation open source aussi bien que commerciaux, ainsi qu’avec des outils largement utilisés, tels que R, MATLAB, SAS, Stata et autres. Ces dernières années, le support amélioré de Python pour les librairies pandas et scikit-learn, par exemple, en a fait un choix populaire pour les tâches d’analyse de données. Combiné à la force globale de Python pour le génie logiciel dans un sens général, il représente une excellente option en tant que langage principal pour la construction d’applications de données.

Python, roi du collage

Une partie du succès de Python dans le domaine du calcul scientifique réside dans la facilité avec laquelle il permet d’intégrer du code C, C++ et Fortran. La plupart des environnements informatiques modernes partagent un ensemble similaire de librairies « historiques » Fortran et C pour l’algèbre linéaire, l’optimisation, l’intégration, les transformations de Fourier rapides et d’autres algorithmes de ce type. La même histoire s’est vérifiée pour de nombreuses entreprises et laboratoires d’envergure nationale qui ont utilisé Python pour coller ensemble des dizaines d’années d’anciens logiciels.

De nombreux programmes se composent de petites portions de code où l’on passe le plus de temps, avec de grandes quantités de « code collé » qui ne s’exécute pas souvent. Dans de nombreux cas, le temps d’exécution de ce « code collé » est insignifiant. L’effort est surtout investi de manière fructueuse dans l’optimisation des goulets d’étranglement en matière de calcul, parfois en déplaçant le code vers un langage de niveau d’abstraction inférieur comme le C.

Résoudre le problème des « deux langages »

Dans de nombreuses organisations, il est courant de rechercher, de prototyper et de tester de nouvelles idées avec un langage informatique plus spécialisé comme SAS ou R, puis de porter ces idées pour les intégrer dans un système de production plus large écrit, par exemple, en Java, C# ou C++. Python est un langage particulièrement adapté à la recherche et au prototypage, mais aussi à la construction de systèmes de production. Pourquoi maintenir deux environnements de développement alors qu’un seul suffirait ? Je pense que de plus en plus d’entreprises s’engageront dans cette voie, car il y a souvent des avantages organisationnels importants à ce que les chercheurs et les ingénieurs logiciels travaillent avec le même ensemble d’outils de programmation.

Pourquoi pas Python ?

Bien que Python soit un excellent environnement pour construire de nombreux types d’applications analytiques et de systèmes d’usage général, il sera moins approprié à un certain nombre d’applications.

Du fait que Python est un langage de programmation interprété, la plupart des codes Python s’exécutent en général beaucoup plus lentement que les codes écrits dans un langage compilé comme Java ou C++. Le temps du programmeur étant souvent plus précieux que le temps de CPU, beaucoup sont heureux de faire ce compromis. Toutefois, dans une application avec une très faible latence ou nécessitant une utilisation de ressources importante (par exemple, un système de transactions commerciales en continu), le temps passé à programmer dans un langage de niveau inférieur (mais aussi à faible productivité) comme le C++ pour obtenir les meilleures performances possibles peut être du temps bien utilisé.

Python peut être un langage difficile pour la construction d’applications multi-exétrons (multi-threads) hautement concurrentes, en particulier les applications avec de nombreux exétrons liés au CPU. La raison en est qu’il dépend de son verrouillage d’interpréteur global (GIL), un mécanisme qui empêche l’interpréteur d’exécuter plus d’une instruction Python à la fois. Les raisons techniques qui expliquent l’existence du GIL dépassent le cadre de ce livre. S’il est vrai que, dans de nombreuses grandes applications de traitement des données, un groupe d’ordinateurs peut être nécessaire pour traiter un jeu de données dans un délai raisonnable, un système à processus unique et à plusieurs exétrons sera souhaitable dans bien d’autres situations.

Cela ne veut pas dire que Python ne peut pas exécuter du code parallèle réellement multi-exétron. Les extensions C de Python qui utilisent le multithreading natif (en C ou C++) peuvent exécuter du code en parallèle sans être impactées par le GIL, dès lors qu’elles n’ont pas besoin d’interagir régulièrement avec des objets Python.

1.3 Librairies Python essentielles

Pour ceux qui sont moins familiers avec l’écosystème de données Python et les librairies utilisées tout au long du livre, je vais donner un bref aperçu de certaines d’entre elles.

(N. d. T.) Nous adoptons dans ce livre le terme « librairie » pour library et « exétron » pour thread.

NumPy

NumPy (https://numpy.org/), abréviation de Numerical Python, est depuis longtemps une des pierres angulaires du traitement numérique en Python. Elle fournit les structures de données, les algorithmes et la « colle » pour les outils de librairie nécessaires à la plupart des applications scientifiques impliquant des données numériques en Python. NumPy contient, entre autres, les éléments suivants :

• un objet tableau multidimensionnel rapide et efficace, ndarray ;

• des fonctions permettant d’effectuer des calculs au niveau des éléments avec des tableaux, ou des opérations mathématiques entre tableaux ;

• des outils de lecture et d’écriture sur disque de jeux de données basés sur des tableaux ;

• des opérations d’algèbre linéaire, de transformée de Fourier et de génération de nombres aléatoires ;

• une interface API C mature pour permettre aux extensions Python et au code natif C ou C++ d’accéder aux structures de données et aux outils de calcul de NumPy

Au-delà des capacités de traitement rapide des tableaux que NumPy ajoute à Python, l’une de ses principales utilisations dans l’analyse des données est de servir de conteneur pour les données à transmettre entre les algorithmes et les librairies. Pour les données numériques, les tableaux NumPy sont plus efficaces pour le stockage et la manipulation des données que les autres structures de données natives de Python. En outre, les librairies écrites dans un langage plus proche du matériel, comme le C ou le Fortran, peuvent fonctionner sur les données stockées dans un tableau NumPy sans réclamer de copier ces données dans une autre représentation en mémoire. Ainsi, de nombreux outils de calcul numérique pour Python soit considèrent les tableaux NumPy comme une structure de données primaire, soit visent une interopérabilité transparente avec NumPy.

pandas

pandas (https://pandas.pydata.org/) fournit des structures de données de haut niveau ainsi que des fonctions conçues pour rendre le travail avec des données structurées ou tabulaires rapide, facile et expressif. Depuis son émergence en 2010, cette librairie a contribué à faire de Python un environnement d’analyse de données puissant et productif. Les principaux objets de pandas qui seront utilisés dans ce livre sont les DataFrame, une structure de données tabulaires, orientée colonnes, avec à la fois des étiquettes de lignes et de colonnes, et Series, un objet tableau étiqueté unidimensionnel.

pandas allie les idées de NumPy en matière de traitement hautement performant de tableaux aux capacités souples de manipulation de données via des tableurs et des bases de données relationnelles (telles que SQL). pandas offre une fonctionnalité d’indexation sophistiquée qui facilite le remodelage, le tranchage et le découpage, effectue des agrégations et sélectionne des sous-ensembles de données. La manipulation, la préparation et le nettoyage des données constituant une compétence très importante dans l’analyse des données, pandas est l’un des principaux thèmes de cet ouvrage.

Pour vous situer un peu le contexte, j’ai commencé à développer pandas au début de l’année 2008 pendant mon mandat chez AQR Capital Management, une société de gestion d’investissements. À l’époque, j’avais un ensemble de besoins différents qui n’étaient pas bien traités par aucun des outils dont je disposais :

• Structures de données avec des axes étiquetés supportant un alignement automatique ou explicite des données – cela évite les erreurs courantes résultant de données mal alignées, ou encore de travailler avec des données indexées différemment et provenant de sources variées.

• Fonctionnalités intégrées pour les séries chronologiques.

• Mêmes structures traitant à la fois les données des séries chronologiques et celles des séries non chronologiques.

• Opérations arithmétiques et réductions qui préservent les métadonnées.

• Traitement souple des données manquantes.

• Fusion et autres opérations relationnelles que l’on trouve dans les bases de données répandues (basées sur SQL, par exemple).

Je voulais pouvoir réaliser toutes ces opérations en un seul endroit, de préférence avec un langage bien adapté au développement de logiciels d’usage général. Python était un bon candidat pour cela, mais, à l’époque, il n’existait pas d’ensemble intégré de structures de données et d’outils fournissant cette fonctionnalité. Initialement conçu pour résoudre des problèmes de finance et d’analyse commerciale, pandas est doté de fonctionnalités particulièrement approfondies pour le traitement des séries chronologiques, ainsi que d’outils bien adaptés au travail avec des données indexées dans le temps qui sont générées par des processus commerciaux.

Dans le cas des utilisateurs du langage R dans le domaine du calcul statistique, le nom DataFrame sera familier, car ce terme a été choisi d’après l’objet similaire de R : data.frame. Contrairement à Python, ces « cadres de données » sont intégrés dans le langage de programmation R et sa librairie standard. Par conséquent, de nombreuses fonctionnalités que l’on trouve dans pandas font généralement partie de l’implémentation de base de R ou sont fournies par des packages complémentaires.

Le nom pandas lui-même est dérivé de l’expression panel data (données de panel), un terme d’économétrie pour les jeux de données structurées multidimensionnels ; c’est aussi un jeu de mots sur l’expression Python data analysis (analyse de données Python).

matplotlib

matplotlib (https://matplotlib.org/) est la librairie Python la plus populaire pour produire des tracés et autres visualisations de données en deux dimensions. Elle a été créée à l’origine par John D. Hunter et sa maintenance est maintenant assurée par une grande équipe de développeurs. Elle est conçue pour créer des tracés pouvant être publiés. Bien qu’il existe d’autres librairies de visualisation disponibles pour les programmeurs Python, matplotlib est la plus utilisée et, en tant que telle, elle s’intègre généralement bien au reste de l’écosystème. Je pense que c’est un choix sûr en tant qu’outil de visualisation par défaut.

IPython et Jupyter

Le projet IPython de Fernando Pérez (http://ipython.org/) a débuté en 2001 avec comme objectif de construire un meilleur interpréteur interactif Python. Au fil du temps, il est devenu l’un des éléments les plus importants de la pile d’outils de Python. Bien qu’il ne fournisse aucun outil de calcul ou d’analyse de données en soi, IPython est conçu de A à Z pour maximiser votre productivité dans le domaine de l’informatique interactive et du développement de logiciels. Il encourage un flux de travail en mode exécution-exploration au lieu du flux de travail typique édition-compilation-exécution de nombreux autres langages de programmation. Il fournit également un accès facile au shell et au système de fichiers de votre système d’exploitation. Étant donné qu’une grande partie du codage de l’analyse des données implique une démarche par exploration, essai, erreur et itération, IPython peut vous aider à travailler plus rapidement.

En 2014, Fernando et l’équipe d’IPython ont annoncé le projet Jupyter (https://jupyter.org/), une initiative plus large visant à concevoir des outils informatiques interactifs non liés à un langage de programmation en particulier. Le Notebook de IPython est devenu le Notebook Jupyter, qui prend désormais en charge plus de quarante langages de programmation. Le système IPython peut maintenant être employé comme noyau (un mode du langage de programmation) dans l’utilisation de Python avec Jupyter.

IPython lui-même est devenu une composante du projet open source Jupyter, beaucoup plus vaste, qui fournit un environnement productif pour l’informatique interactive et exploratoire. Son « mode » le plus ancien et le plus simple est un shell Python amélioré conçu pour accélérer l’écriture, le test et le débogage du code Python. Vous pouvez également utiliser le système IPython par l’intermédiaire de Jupyter Notebook, un gestionnaire de calepins hébergé sur le Web et contenant du code interactif. Il prend en charge des dizaines de langages de programmation. Le shell IPython et les calepins de Jupyter sont particulièrement utiles pour l’exploration et la visualisation de données.

Via le système Jupyter Notebook, vous pouvez également créer du contenu en Markdown et HTML, ce qui permet de produire des documents riches combinant code source et textes de description. D’autres langages de programmation ont implémenté des noyaux pour Jupyter afin de vous permettre d’utiliser également ces langages dans Jupyter.

Personnellement, IPython est généralement impliqué dans la majorité de mes travaux avec Python, y compris l’exécution, le débogage et le test du code.

Dans le dépôt GitHub associé à ce livre, vous trouverez des fichiers calepins Jupyter contenant tous les exemples de code de chaque chapitre (voir l’adresse https://github.com/wesm/pydata-book).

SciPy

SciPy (https://scipy.org/) est une collection de packages qui répondent à un certain nombre de problèmes standard en matière de calcul scientifique. Voici un échantillon des packages qu’il contient :

scipy.integrate

Routines d’intégration numérique et solveurs d’équations différentielles.

scipy.linalg

Routines d’algèbre linéaire et décompositions matricielles allant au-delà de celles fournies dans numpy.linalg.

scipy.optimize

Optimiseurs de fonctions (minimiseurs) et algorithmes de recherche du séro de fonctions.

scipy.signal

Outils de traitement du signal.

scipy.sparse

Matrices creuses et solveurs de systèmes linéaires creux.

scipy.special

Enveloppe autour de SPECFUN une librairie Fortran mettant en œuvre de nombreuses fonctions mathématiques courantes, telles que la fonction gamma.

scipy.stats

Distributions de probabilités continues et discrètes standard (fonctions de densité, échantillonneurs, fonctions de répartition continues), divers tests statistiques et statistiques plus descriptives.

Ensemble, NumPy et SciPy forment une base de calcul raisonnablement complète et mature pour de nombreuses applications de calcul scientifique traditionnelles.

scikit-learn

Depuis le lancement du projet en 2010, scikit-learn (https://scikit-learn.org/stable/) est devenu la première boîte à outils d’apprentissage automatique à usage général pour les programmeurs Python. En quelques années seulement, il a rassemblé plus de 1 500 contributeurs du monde entier. Il comprend des sous-modules pour des modèles tels que :

• Classification : SVM, plus proches voisins, forêt aléatoire, régression logistique…

• Régression : lasso, régression ridge…

• Clustering : k-moyennes, clustering spectral…

• Réduction de la dimensionnalité : PCA, sélection des caractéristiques, factorisation matricielle…

• Sélection des modèles : recherche par quadrillage, validation croisée, métriques.

• Prétraitement : extraction de caractéristiques, normalisation.

Avec pandas, statsmodels et IPython, scikit-learn a permis à Python d’être un langage de programmation scientifique productif. Bien que je ne puisse pas inclure un guide complet de scikit-learn dans ce livre, je proposerai une brève introduction à certains de ses modèles et à la façon de les utiliser avec les autres outils présentés dans cet ouvrage.

statsmodels

statsmodels (https://www.statsmodels.org/stable/index.html) est un package d’analyse statistique issu des travaux de Jonathan Taylor, professeur de statistiques à l’université de Stanford, qui a mis en œuvre un certain nombre de modèles d’analyse de régression populaires dans le langage de programmation R. Skipper Seabold et Josef Perktold ont formellement créé le nouveau projet statsmodels en 2010 et, depuis lors, ils l’ont développé pour atteindre une masse critique d’utilisateurs et de contributeurs actifs. Nathaniel Smith a développé le projet Patsy, qui fournit une formule ou un cadre de spécification de modèle pour statsmodels inspiré du système de formules de R.

Par rapport à scikit-learn, statsmodels contient des algorithmes pour les statistiques classiques (principalement fréquentistes) et l’économétrie. Cela comprend des sous-modules tels que :

• Modèles de régression : régression linéaire, modèles linéaires généralisés, modèles linéaires robustes, modèles linéaires à effets mixtes, etc.

• Analyse de la variance (ANOVA).

• Analyse des séries chronologiques : AR, ARMA, ARIMA, VAR et autres modèles.

• Méthodes non paramétriques : estimation de la densité du noyau, régression par noyau.

• Visualisation des résultats des modèles statistiques.

statsmodels est davantage axé sur l’inférence statistique, fournissant des estimations d’incertitude et des valeurs-p pour les paramètres. scikit-learn, en revanche, est plutôt axé sur la prédiction.

Comme pour scikit-learn, je proposerai une brève introduction à statsmodels et à la façon de l’utiliser avec NumPy et pandas.

1.4 Installation et configuration

L’installation de Python et des packages complémentaires nécessaires sera différente selon l’application utilisée. De plus, comme de nombreux lecteurs ne disposent pas d’un environnement de développement Python complet et adapté pour suivre ce livre, je donnerai des instructions détaillées pour opérer une installation sur chaque système d’exploitation. Je recommande la distribution gratuite Anaconda. Au moment où ces lignes sont écrites, Anaconda est proposé avec les versions 2.7 et 3.8 de Python. Même si les exemples de cet ouvrages ont été conçus avec Python 3.6, je vous encourage à utiliser la dernière version en date, la 3.8 en l’occurrence (qui est d’ailleurs installée sur mon ordinateur au moment où ces lignes sont écrites).

Windows

Pour démarrer sous Windows, téléchargez le programme d’installation d’Anaconda. Je vous recommande de suivre les instructions d’installation pour Windows disponibles sur la page de téléchargement d’Anaconda, qui peuvent avoir changé depuis le moment où ce livre a été publié.

Il faut ensuite vérifier la configuration. Pour ouvrir l’application Invite de commandes (également connue sous le nom de cmd.exe), cliquez avec le bouton droit de la souris sur le menu Démarrer et sélectionnez l’option Invite de commandes. Essayez de démarrer l’interpréteur Python en tapant python. Vous devriez voir un message qui correspond à la version d’Anaconda que vous avez installée :

C:\Users\wesm>python
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Pour quitter le shell, appuyez sur Ctrl-D (sous Linux ou macOS), Ctrl-Z (sous Windows), ou tapez la commande exit() et appuyez sur Entrée.

Apple (OSX, macOS)

Téléchargez l’installateur d’Anaconda pour OS X, dont le nom devrait ressembler à Anaconda3-2020.07-MacOSX-x86_64.pkg (la date peut évidemment être plus récente). Double-cliquez sur le fichier .pkg pour lancer l’installateur. Celui-ci va ajouter automatiquement le chemin de l’exécutable Anaconda à votre fichier .bash_profile. Ce fichier se trouve dans /Users/$USER/. bash_profile.

Pour vérifier que tout fonctionne normalement, essayez de lancer IPython dans le shell du système (ouvrez l’application Terminal pour obtenir une invite de commande) :

$ ipython

Pour quitter le shell, appuyez sur Ctrl-D ou tapez exit() et appuyez sur Entrée.

GNU/Linux

Les détails concernant Linux varieront un peu en fonction de votre distribution, mais je donne ici des détails pour des distributions telles que Debian, Ubuntu, CentOS et Fedora. La configuration est similaire à celle d’OS X, à l’exception de la façon dont Anaconda est installé. L’installateur est un script de shell qui doit être exécuté dans le terminal. Selon que vous avez un système 32 bits ou 64 bits, vous devrez choisir l’installateur x86 (32 bits) ou x86_64 (64 bits). Vous aurez alors un fichier au nom similaire à Anaconda3-2020.07-Linux-x86_64.sh (là encore, la date peut être plus récente). Pour l’installer, exécutez ce script avec bash :

$ bash Anaconda3-2020.07-Linux-x86_64.sh

Certaines distributions Linux possèdent des versions de tous les packages Python nécessaires dans leurs propres gestionnaires de packages, et elles peuvent être installées à l’aide d’un outil tel que apt. L’installation décrite ici utilise Anaconda, car il est à la fois facilement reproductible d’une distribution à l’autre, et plus simple pour mettre à jour les packages vers leurs dernières versions.

Après avoir accepté la licence, vous aurez le choix de l’endroit où placer les fichiers Anaconda. Je vous recommande d’installer les fichiers à l’emplacement par défaut dans votre répertoire d’origine, par exemple, /home/$USER/anaconda (avec votre nom d’utilisateur, bien sûr).

L’installateur d’Anaconda peut vous demander si vous souhaitez ajouter son répertoire bin/ à votre variable $PATH. Si vous rencontrez des problèmes après l’installation, vous pouvez modifier vous-même .bashrc (ou .zshrc, si vous utilisez le shell zsh) avec une commande comme :

export PATH=/home/$USER/anaconda/bin:$PATH

Vous pouvez ensuite soit démarrer un nouveau processus de terminal, soit exécuter de nouveau votre .bashrc avec source ∼/bashrc.

Installation ou mise à jour de packages Python

À un certain moment de votre lecture, vous souhaiterez peut-être installer des paquets Python supplémentaires qui ne sont pas inclus dans la distribution Anaconda. En général, ceux-ci peuvent être installés avec la commande suivante :

conda install nom_package

Si cela ne fonctionne pas, vous pouvez également procéder à l’installation en utilisant l’outil de gestion de packages pip :

pip install nom_package

Vous pouvez mettre à jour les packages avec la commande conda update :

conda update nom_package

pip prend également en charge les mises à jour en utilisant le drapeau –upgrade :

pip install --upgrade nom_package

Vous aurez plusieurs occasions d’essayer ces commandes tout au long du livre.

Bien que vous puissiez utiliser conda et pip pour installer des packages, vous ne devez pas essayer de mettre à jour les packages conda avec pip, car cela peut entraîner des problèmes d’environnement. Lorsque vous utilisez Anaconda ou Miniconda, il est préférable d’essayer d’abord d’effectuer les mises à jour avec conda.

Python 2 et Python 3

La première version de la ligne d’interpréteurs Python 3.x est sortie à la fin de l’année 2008. Elle comprenait diverses modifications qui rendaient incompatibles certains codes Python 2.x écrits précédemment. Comme dix-sept ans s’étaient écoulés depuis la toute première version de Python, en 1991, la création d’une version 3 « de rupture » a été considérée comme étant une excellente chose compte tenu des leçons apprises pendant toutes ces années.

En 2012, une grande partie de la communauté scientifique et de l’analyse des données utilisait encore Python 2.x, parce que de nombreux packages n’avaient pas été rendus entièrement compatibles avec Python 3. De nos jours, les utilisateurs sont libres de choisir entre Python 2.x et 3.x, et disposent en général d’un support complet des librairies avec l’une ou l’autre de ces versions principales.

Cependant, la fin de vie de Python 2.x a été programmée pour 2020 (y compris les correctifs de sécurité critiques), et démarrer de nouveaux projets en Python 2.7 est donc une mauvaise idée. Par conséquent, les exemples de ce livre ont été conçus avec Python 3.8, une version stable, largement déployée et bien supportée. Nous avons appelé Python 2.x « Legacy Python » (Python ancien) et Python 3.x simplement « Python ». Je vous encourage à faire de même.

Si ce livre utilise Python 3.8 comme base, une version un peu plus ancienne, comme la 3.6, conviendra parfaitement, une plus récente aussi. Les exemples de code doivent normalement être totalement compatibles avec les différentes évolutions de Python 3.x. En revanche, certaines parties du code peuvent fonctionner différemment, ou pas du tout, avec Python 2.7.

Environnements de développement intégrés (IDE) et éditeurs de texte

Quand on me demande quel est mon environnement de développement standard, je réponds presque toujours « IPython plus un éditeur de texte ». En général, j’écris un programme, et je teste et débogue itérativement chaque élément de celui-ci dans des calepins IPython ou Jupyter. Il est également utile de pouvoir jouer avec les données de manière interactive, et de vérifier visuellement qu’un ensemble particulier de manipulations des données se comporte comme attendu. Les librairies comme pandas et NumPy sont conçues pour être faciles d’emploi en mode shell.

Cependant, lors de la création d’un logiciel, certains utilisateurs préféreront se servir d’un IDE plus riche en fonctionnalités, plutôt que d’un éditeur de texte relativement primitif comme Emacs ou Vim. En voici quelques-uns que vous pouvez évaluer :

• PyDev (gratuit), un IDE construit sur la plateforme Eclipse ;

• PyCharm de JetBrains (sur abonnement pour les utilisateurs commerciaux, gratuit pour les développeurs de logiciels libres) ;

• Python Tools for Visual Studio (pour les utilisateurs de Windows) ;

• Spyder (gratuit), un IDE actuellement fourni avec Anaconda ;

• Komodo IDE (commercial).

En raison de la popularité de Python, la plupart des éditeurs de texte, comme Atom et Sublime Text 2, ont un excellent support Python.

1.5 Communauté et conférences

En dehors d’une recherche sur Internet, les diverses listes de diffusion Python à orientation scientifique et liées aux données sont généralement utiles et répondent à la plupart des questions (le plus souvent en anglais !). En voici quelques-unes :

• pydata : un groupe Google dédié aux questions relatives à Python pour l’analyse des données et à pandas.

• pystatsmodels : pour les questions relatives à statsmodels ou à pandas.

• Liste de diffusion pour scikit-learn (scikit-learn@python.org) et, plus généralement, l’apprentissage automatique en Python.

• numpy-discussion : pour les questions relatives à NumPy.

• scipy-user : pour des questions générales sur SciPy ou des traitements scientifiques en Python.

J’ai délibérément omis de publier les URL de ces sites au cas où elles changeraient. Ces derniers peuvent être facilement trouvés via une recherche sur Internet.

Chaque année, de nombreuses conférences sont organisées dans le monde entier. Si vous souhaitez entrer en contact avec d’autres programmeurs Python qui partagent vos centres d’intérêt, je vous encourage à y assister. Vous pouvez bénéficier d’une aide financière pour participer à certaines d’entre elles (frais de transport, d’inscription). Par exemple :

• PyCon et EuroPython : les deux principales conférences générales Python, respectivement en Amérique du Nord et en Europe.

• SciPie et EuroSciPie : conférences consacrées à l’informatique scientifique, respectivement en Amérique du Nord et en Europe.

• PyData : une série mondiale de conférences régionales axées sur les cas d’application de la science des données et de l’analyse des données.

• Conférences PyCon internationales et régionales (voir le site http://pycon.org pour une liste complète).

1.6 Naviguer dans ce livre

Si vous n’avez jamais programmé en Python auparavant, prenez le temps d’étudier les Chapitres 2 et 3, notamment les tutoriels condensés sur les fonctionnalités du langage Python, et sur le shell IPython et les calepins Jupyter. Ces notions sont des connaissances préalables indispensables pour suivre le reste du livre. Si vous avez déjà une certaine expérience en programmation Python, vous pourrez éventuellement sauter ces chapitres.

Ensuite, vous découvrirez les principales caractéristiques de NumPy – ses fonctionnalités les plus avancées seront abordées dans l’Annexe A – et vous vous familiariserez avec pandas. Le reste du livre sera consacré à des problèmes d’analyse de données en appliquant pandas, NumPy et matplotlib (pour la visualisation). Même si j’ai structuré mon propos de la manière la plus progressive possible, certaines notions sont reprises d’un chapitre à l’autre.

Bien que les lecteurs puissent avoir de nombreux objectifs finaux différents concernant leur travail, les tâches requises se répartissent généralement en plusieurs grands groupes distincts :

Interactions avec le monde extérieur

Lecture et écriture avec une variété de formats de fichiers et d’enregistrement des données.

Préparation

Nettoyer, combiner, normaliser, remanier, trancher et découper, et transformer les données pour l’analyse.

Transformation

Appliquer des opérations mathématiques et statistiques à des groupes de jeux de données pour en tirer de nouveaux jeux (par exemple, agréger un grand tableau par groupes de variables).

Modélisation et calcul

Connecter vos données à des modèles statistiques, des algorithmes d’apprentissage automatique ou d’autres outils de calcul.

Présentation

Créer des visualisations graphiques interactives ou statiques, ou de résumés textuels.

Exemples de code

La plupart des exemples de code dans le livre sont présentés avec les entrées et les sorties telles qu’elles apparaissent dans le shell IPython ou dans les calepins de Notebook Jupyter :

In [5]: EXEMPLE DE CODE
Out[5]: RESULTAT (SI AFFICHABLE)

L’idée est de taper le code de cet exemple dans le bloc In de votre environnement de programmation et de l’exécuter en appuyant sur la touche Entrée (ou Maj-Entrée dans Jupyter). Vous devriez alors voir s’afficher un résultat similaire à celui qui apparaît dans le bloc Out.

Données pour les exemples

Les jeux de données pour les exemples de chaque chapitre sont hébergés dans le dépôt GitHub associé à cet ouvrage. Vous pouvez télécharger ces données soit en utilisant le système de contrôle de version Git en mode ligne de commande, soit en téléchargeant un fichier compressé zip du dépôt sur le site web. Si vous rencontrez des problèmes, consultez mon site web pour obtenir des instructions à jour sur la manière d’obtenir les documents du livre.

Je me suis efforcé de faire en sorte qu’il contienne tout le nécessaire pour reproduire les exemples, mais il se peut que j’aie fait des erreurs ou des omissions. Si c’est le cas, veuillez envoyer un courriel à l’adresse firstinfo@efirst.com. La meilleure façon de signaler des erreurs dans le livre est de consulter la page d’errata sur le site web d’O’Reilly (en anglais), à l’adresse :

https://www.oreilly.com/catalog/errata.csp?isbn=0636920050896

Conventions d’importation

La communauté Python a adopté un certain nombre de conventions de nommage pour les modules les plus courants :

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import statsmodels as sm

Ainsi, np.arange est une référence à la fonction arange de NumPy. Retenez qu’il est considéré comme étant une mauvaise pratique dans le développement de logiciels Python d’importer tout d’un coup (from numpy import *) à partir d’un gros package tel que NumPy.

Jargon

Dans ce livre, j’emploie certains termes communs à la programmation et à la science des données que vous ne connaissez peut-être pas. Voici donc quelques brèves définitions :

Munge/munging/wrangling

Ces termes, difficilement traduisibles, évoquent une progression par tâtonnements et altérations successives (bidouiller). Ils concernent le processus global de manipulation de données non structurées et/ou désordonnées pour en faire une forme structurée ou propre. Ce mot s’est glissé dans le jargon de nombreux pirates informatiques modernes : « Munge » rime avec « grunge ». (Voir par exemple les adresses https://bit.ly/3loSKwI ou encore https://en.wikipedia.org/wiki/Data_wrangling. Google fournit une traduction tout à fait honorable de ces pages.)

Pseudocode

Description d’un algorithme ou d’un processus qui prend une forme semblable à du code tout en n’étant probablement pas un code source réellement valide.

Sucre syntactique

Syntaxe de programmation qui n’ajoute pas de nouvelles fonctionnalités, mais rend quelque chose plus pratique ou plus facile à taper ou à comprendre.

CHAPITRE 2 Les bases du langage Python, de IPython et des calepins Jupyter

Ce livre est conçu comme un texte d’introduction à la manipulation des données en Python. Il vous donne une vue d’ensemble des principales caractéristiques des structures de données et des librairies natives de Python. Les informations contenues dans ce chapitre, ainsi que dans le Chapitre 3, sont essentielles pour comprendre le reste du livre.

À mon avis, il n’est pas nécessaire de devenir trop compétent dans la création de logiciels en Python pour analyser des données de manière productive. Je vous recommande d’utiliser le shell IPython et les calepins Jupyter pour réaliser des expériences avec les exemples de code et pour explorer la documentation des différents types, fonctions et méthodes. Bien que je me sois efforcé de présenter le contenu de ce livre de manière progressive, vous rencontrerez des concepts qui n’ont pas encore été traitées en détail auparavant.

Une grande partie de ce livre se concentre sur les analyses basées sur des tableaux, ainsi que sur les outils de préparation des données en vue de travailler avec de grands jeux de données. Pour utiliser ces outils, vous devez souvent commencer par procéder à du bidouillage à tâtons (munging) ou à batailler (wrangling) sur les données désordonnées pour les présenter sous une forme plus agréable, c’est-à-dire tabulaire (ou structurée). Heureusement, Python est un langage idéal pour mettre rapidement vos données en forme. Plus vous serez à l’aise avec le langage Python, plus il vous sera facile de préparer de nouveaux jeux de données pour l’analyse.

Certains des outils de ce livre sont davantage compréhensibles s’ils sont manipulés lors d’une session IPython ou Jupyter en direct. Une fois que vous aurez appris à démarrer IPython et Jupyter, vous pourrez vous entraîner à partir des exemples. Comme pour tout environnement de type console pilotée par clavier, le développement d’une mémoire musculaire pour les commandes courantes fait également partie de la courbe d’apprentissage.

Ce chapitre ne couvre pas certains concepts fondamentaux de Python, comme les classes et la programmation orientée objet, notions que vous pourriez trouver utiles dans votre propre travail d’analyse de données avec Python.