1.5 Science des données avec Python
Objectifs d'apprentissage
À la fin de cette section, vous devriez être en mesure de :
- 1.5.1 Charger des données dans Python.
- 1.5.2 Effectuer une analyse de données de base à l'aide de Python.
- 1.5.3 Utiliser les principes de visualisation pour tracer graphiquement des données à l'aide de Python.
De multiples outils sont disponibles pour écrire et exécuter des programmes Python. Jupyter Notebook est un outil pratique et convivial. La section suivante explique comment configurer l'environnement Jupyter Notebook à l'aide de Google Colaboratory (Colab), puis présente les bases de deux bibliothèques Python open-source appelées Pandas et Matplotlib. Ces bibliothèques sont spécialisées respectivement dans l'analyse de données et la visualisation de données.
Pour aller plus loin
Programmation en Python
Dans la discussion qui suit, nous supposons que vous maîtrisez la syntaxe de base de Python et que vous savez écrire un programme simple en Python. Si vous avez besoin d'un rappel sur les bases, veuillez consulter Das, U., Lawson, A., Mayfield, C., & Norouzi, N. (2024). Introduction to Python Programming. OpenStax. https://openstax.org/books/introduction-python-programming/pages/1-introduction.
Jupyter Notebook sur Google Colaboratory
Jupyter Notebook est un environnement web qui vous permet d'exécuter un programme Python de manière plus interactive, en utilisant du code de programmation, des équations mathématiques, des visualisations et du texte brut. Il existe de multiples applications web ou logiciels que vous pouvez utiliser pour éditer un Jupyter Notebook, mais dans ce manuel, nous utiliserons l'application gratuite de Google appelée Google Colaboratory (Colab), souvent abrégée en Colab. Il s'agit d'une plateforme basée sur le cloud, ce qui signifie que vous pouvez ouvrir, éditer, exécuter et enregistrer un Jupyter Notebook sur votre Google Drive.
La configuration de Colab est simple. Sur votre Google Drive, cliquez sur Nouveau > Plus. Si votre Google Drive a déjà installé Colab auparavant, vous verrez Colaboratory sous Plus. Sinon, cliquez sur « Connecter plus d'applications » et installez Colab en recherchant « Colaboratory » dans la boutique d'applications (Figure 1.15). Pour plus d'informations, consultez l'animation Google Colaboratory Ecosystem.
Cliquez maintenant sur Nouveau > Plus > Google Colaboratory. Un nouveau Jupyter Notebook vierge apparaîtra, comme le montre la Figure 1.16.
La zone grise avec le bouton de lecture s'appelle une cellule. Une cellule (cell) est un bloc dans lequel vous pouvez saisir du code ou du texte brut. Remarquez qu'il y a deux boutons au-dessus de la première cellule : « + Code » et « + Texte ». Ces deux boutons ajoutent respectivement une cellule de code ou de texte. Une cellule de code sert au code que vous souhaitez exécuter ; une cellule de texte permet d'ajouter une description ou une note textuelle.
Exécutons un programme Python sur Colab. Tapez le code suivant dans une cellule de code.
Code Python
print ("hello world!")
La sortie obtenue ressemblera à ceci :
hello world!
Vous pouvez écrire un programme Python réparti sur plusieurs cellules et insérer des cellules de texte entre elles. Colab traitera toutes les cellules de code comme des éléments d'un même programme, s'exécutant du haut vers le bas du Jupyter Notebook actif. Par exemple, les deux cellules de code ci-dessous s'exécutent comme s'il s'agissait d'un programme unique.
En exécutant une cellule à la fois depuis le haut, nous obtenons les résultats suivants sous chaque cellule.
Code Python
a = 1
print ("The a value in the first cell:", a)
La sortie obtenue ressemblera à ceci :
The a value in the first cell: 1
Code Python
b = 3
print ("a in the second cell:", a)
print ("b in the second cell:", b)
a + b
La sortie obtenue ressemblera à ceci :
a in the second cell: 1
b in the second cell: 3
4
Syntaxe Python conventionnelle versus syntaxe Jupyter Notebook
Alors que la syntaxe Python conventionnelle nécessite la syntaxe print() pour afficher un élément dans la console du programme, Jupyter Notebook ne requiert pas print(). Sur Jupyter Notebook, la ligne a+b au lieu de print(a+b) affiche également la valeur de a+b en sortie. Cependant, gardez à l'esprit que s'il y a plusieurs lignes de code qui déclenchent l'affichage de valeurs, seule la sortie de la dernière ligne s'affichera.
Vous pouvez également exécuter plusieurs cellules par lot. Cliquez sur Runtime dans le menu, et vous constaterez qu'il existe plusieurs manières d'exécuter plusieurs cellules en même temps (Figure 1.17). Les deux options les plus couramment utilisées sont « Tout exécuter » et « Exécuter les cellules précédentes ». « Tout exécuter » exécute toutes les cellules dans l'ordre depuis le haut ; « Exécuter les cellules précédentes » exécute toutes les cellules situées avant celle actuellement sélectionnée.
Une chose à garder à l'esprit est que la possibilité de diviser un long programme en plusieurs blocs et d'exécuter un bloc à la fois augmente le risque d'erreur de la part de l'utilisateur. Examinons une version modifiée du code de l'exemple précédent.
Code Python
a = 1
print ("the value in the first cell:", a)
La sortie obtenue ressemblera à ceci :
the value in the first cell: 1
Code Python
b = 3
print ("a in the second cell:", a)
print ("b in the second cell:", b)
a + b
La sortie obtenue ressemblera à ceci :
a in the second cell: 1
b in the second cell: 3
4
Code Python
a = 2
a + b
La sortie obtenue ressemblera à ceci :
5
Le code modifié comporte une cellule supplémentaire à la fin, mettant à jour a de 1 à 2. Remarquez que maintenant a+b renvoie 5 puisque a a été modifié à 2. Supposons maintenant que vous ayez besoin d'exécuter la deuxième cellule pour une raison quelconque, et que vous l'exécutiez à nouveau.
Code Python
a = 1
print ("the a value in the first cell:", a)
La sortie obtenue ressemblera à ceci :
the a value in the first cell: 1
Code Python
b = 3
print ("a in the second cell:", a)
print ("b in the second cell:", b)
a + b
La sortie obtenue ressemblera à ceci :
a in the second cell: 2
b in the second cell: 3
5
Code Python
a = 2
a + b
La sortie obtenue ressemblera à ceci :
5
La valeur de a est passée à 2. Cela implique que l'ordre d'exécution de chaque cellule a de l'importance ! Si vous avez exécuté la troisième cellule avant la deuxième cellule, la valeur de a prendra celle de la troisième, même si cette troisième cellule est située sous la deuxième. Il est donc recommandé d'utiliser « Tout exécuter » ou « Exécuter les cellules précédentes » après avoir apporté des modifications à plusieurs cellules de code. De cette façon, votre code est garanti de s'exécuter séquentiellement depuis le début.
Pandas en Python
L'un des atouts majeurs de Python réside dans sa vaste gamme de bibliothèques libres et open-source. Les bibliothèques sont des ensembles de méthodes préexistantes auxquelles un programmeur peut faire référence, ce qui lui évite d'avoir à créer des fonctions communes à partir de zéro.
Pandas est une bibliothèque Python spécialisée dans la manipulation et l'analyse de données, et elle est très largement utilisée par les scientifiques des données. Elle propose une variété de méthodes permettant aux scientifiques des données de les exploiter rapidement pour l'analyse de données. Vous apprendrez à analyser des données à l'aide de Pandas tout au long de ce manuel.
Colab a déjà Pandas d'installé, il vous suffit donc d'importer Pandas pour être prêt à utiliser toutes les méthodes de Pandas. Notez qu'il est d'usage d'abréger pandas par pd, de sorte que lorsque vous appelez une méthode de Pandas, vous pouvez le faire en utilisant pd au lieu de devoir taper Pandas à chaque fois. Cela apporte un réel confort au programmeur !
Code Python
# import Pandas and assign an abbreviated identifier "pd"
import pandas as pd
Pour aller plus loin
Installer Pandas sur votre ordinateur
Si vous souhaitez installer Pandas sur votre propre ordinateur, consultez la page d'installation du site web de Pandas.
Charger des données avec Pandas en Python
La première étape de l'analyse de données consiste à charger les données qui vous intéressent dans votre Notebook. Créons un dossier sur Google Drive dans lequel vous pourrez conserver un fichier CSV pour le jeu de données et un Notebook pour l'analyse des données. Téléchargez un jeu de données public, ch1-movieprofit.csv, et enregistrez-le dans un dossier de votre Google Drive. Ouvrez ensuite un nouveau Notebook dans ce dossier en y accédant et en cliquant sur Nouveau > Plus > Google Colaboratory.
Ouvrez le Notebook et autorisez-le à accéder aux fichiers de votre Google Drive en suivant ces étapes :
Tout d'abord, cliquez sur l'icône Fichiers dans l'onglet latéral (Figure 1.18).
Cliquez ensuite sur l'icône Monter le Drive (Figure 1.19) et sélectionnez « Se connecter à Google Drive » dans la fenêtre contextuelle.
Notez qu'une nouvelle cellule a été insérée dans le Notebook à la suite de cette action (Figure 1.20).
Connectez votre Google Drive en exécutant la cellule ; votre fichier Notebook peut désormais accéder à tous les fichiers situés sous content/drive. Naviguez dans les dossiers sous drive pour localiser votre Notebook et les fichiers ch1-movieprofit.csv. Cliquez ensuite sur « … » > Copier le chemin d'accès (Figure 1.21).
Remplacez maintenant [Path] par le chemin copié dans le code ci-dessous. Exécutez le code et vous verrez que le jeu de données a été chargé sous forme de tableau et stocké dans la variable Python data.
Code Python
# import Pandas and assign an abbreviated identifier "pd"
import pandas as pd
data = pd.read_csv("[Path]")
data
La sortie obtenue ressemblera à ceci :
La méthode read_csv() de Pandas charge un fichier CSV et le stocke sous forme de DataFrame. Un DataFrame est un type de données que Pandas utilise pour stocker des données tabulaires à plusieurs colonnes. Par conséquent, la variable data contient le tableau de ch1-movieprofit.csv sous la forme d'un DataFrame Pandas.
DataFrame versus Series
Pandas définit deux types de données pour les données tabulaires : DataFrame et Series. Alors que DataFrame est utilisé pour les données tabulaires à plusieurs colonnes, Series est utilisé pour les données à colonne unique. De nombreuses méthodes de Pandas prennent en charge à la fois DataFrame et Series, mais certaines sont réservées à l'un ou à l'autre. Il est toujours bon de vérifier si la méthode que vous utilisez fonctionne comme vous le souhaitez. Pour plus d'informations, consultez la documentation de Pandas ou Das, U., Lawson, A., Mayfield, C., & Norouzi, N. (2024). Introduction to Python Programming. OpenStax. https://openstax.org/books/introduction-python-programming/pages/1-introduction.
Exemple 1.9
Problème
Vous souvenez-vous du jeu de données Iris que nous avons utilisé dans Données et jeux de données ? Chargez le jeu de données ch1-iris.csv dans un programme Python à l'aide de Pandas.
Solution
Le code suivant charge le fichier ch1-iris.csv stocké sur un Google Drive. Assurez-vous de remplacer le chemin d'accès par le chemin réel vers ch1-iris.csv sur votre Google Drive.
Code Python
import pandas as pd
data = pd.read_csv("[Path to ch1-iris.csv]") # Replace the path
data
La sortie obtenue ressemblera à ceci :
Pour aller plus loin
Puis-je charger un fichier téléversé sur le Google Drive de quelqu'un d'autre et partagé avec moi ?
Oui ! Cela s'avère particulièrement utile lorsque votre espace de stockage Google Drive est insuffisant. Il vous suffit d'ajouter le raccourci du fichier partagé à votre propre Drive. Un clic droit > Organiser > Ajouter un raccourci vous permettra de choisir où stocker le raccourci. Une fois cette étape terminée, vous pouvez appeler pd.read_csv() en utilisant le chemin du raccourci.
Résumer des données avec Pandas en Python
Vous pouvez calculer des statistiques de base sur les données très rapidement en utilisant la méthode DataFrame.describe(). Ajoutez et exécutez le code suivant dans une nouvelle cellule. Il appelle la méthode describe() sur data, le DataFrame que nous avons défini précédemment avec ch1-movieprofit.csv.
Code Python
data = pd.read_csv("[Path to ch1-movieprofit.csv]")
data.describe()
comme ceci :
describe() renvoie un tableau dont les colonnes sont un sous-ensemble des colonnes de l'ensemble du jeu de données et dont les lignes sont différentes statistiques. Les statistiques incluent le nombre de valeurs uniques dans une colonne (count), la moyenne (mean), l'écart type (std), les valeurs minimale et maximale (min/max), ainsi que différents quartiles (25%/50%/75%), que vous découvrirez dans Mesures de variation. Grâce à cette représentation, vous pouvez facilement calculer ces statistiques pour différentes colonnes.
Exemple 1.10
Problème
Résumez le jeu de données IRIS en utilisant describe() sur le fichier ch1-iris.csv que vous avez chargé dans l'exemple précédent.
Solution
Le code suivant, placé dans une nouvelle cellule, renvoie le résumé du jeu de données.
Code Python
data = pd.read_csv("[Path to ch1-iriscsv]")
data.describe()
La sortie obtenue ressemblera à ceci :
Sélectionner des données avec Pandas en Python
Le DataFrame Pandas permet à un programmeur d'utiliser directement le nom de la colonne pour sélectionner une colonne. Par exemple, le code suivant affiche toutes les valeurs de la colonne « US_Gross_Million » sous la forme d'une Series (souvenez-vous que les données d'une seule colonne sont stockées sous le type Series dans Pandas).
Code Python
data = pd.read_csv("[Path to ch1-movieprofit.csv]")
data["US_Gross_Million"]
comme ceci :
0 760.51
1 858.37
2 659.33
3 936.66
4 678.82
...
961 77.22
962 177.20
963 102.31
964 106.89
965 75.47
Name: US_Gross_Million, Length: 966, dtype: float64
DataFrame.iloc[] permet une sélection plus avancée : elle donne la possibilité au programmeur de sélectionner à la fois par colonne et par ligne, en utilisant des indices de ligne et de colonne. Examinons quelques exemples de code ci-dessous.
Code Python
data.iloc[:, 2] # select all values in the second column
La sortie obtenue ressemblera à ceci :
0 2009
1 2019
2 1997
3 2015
4 2018
...
961 2010
962 1982
963 1993
964 1999
965 2017
Name: Year, Length: 966, dtype: object
Code Python
data.iloc[2,:] # select all values in the third row
La sortie obtenue ressemblera à ceci :
Unnamed: 0 3
Title Titanic
Year 1997
Genre Drama
Rating 7.9
Duration 194
US_Gross_Million 659.33
Worldwide_Gross_Million 2201.65
Votes 1,162,142
Name: 2, dtype: object
Pour cibler précisément une valeur donnée dans la colonne « US_Gross_Million », vous pouvez utiliser un numéro d'indice.
Code Python
print (data["US_Gross_Million"][0]) # index 0 refers to the top row
print (data["US_Gross_Million"][2]) # index 2 refers to the third row
La sortie obtenue ressemblera à ceci :
760.51
659.33
Vous pouvez également utiliser DataFrame.iloc[] pour sélectionner un groupe spécifique de cellules dans le tableau. Le code d'exemple ci-dessous illustre différentes façons d'utiliser iloc[]. Il existe de multiples manières d'employer iloc[], mais ce chapitre en présente deux des plus courantes. Vous découvrirez d'autres techniques de manipulation de données tout au long de cet ouvrage.
Code Python
data.iloc[:, 1] # select all values in the second column (index 1)
La sortie obtenue ressemblera à ceci :
0 Avatar
1 Avengers: Endgame
2 Titanic
3 Star Wars: Episode VII - The Force Awakens
4 Avengers: Infinity War
...
961 The A-Team
962 Tootsie
963 In the Line of Fire
964 Analyze This
965 The Hitman's Bodyguard
Name: Title, Length: 966, dtype: object
Code Python
data.iloc[[1, 3], [2, 3]]
# select the rows at index 1 and 3, the columns at index 2 and 3
La sortie obtenue ressemblera à ceci :
Exemple 1.11
Problème
Sélectionnez la colonne « sepal_width » du jeu de données IRIS en utilisant le nom de la colonne.
Solution
Le code suivant placé dans une nouvelle cellule renvoie la colonne « sepal_width ».
Code Python
data = pd.read_csv("[Path to ch1-iris.csv]")
data["sepal_width"]
La sortie obtenue ressemblera à ceci :
0 3.5
1 3.0
2 3.2
3 3.1
4 3.6
...
145 3.0
146 2.5
147 3.0
148 3.4
149 3.0
Name: sepal_width, Length: 150, dtype: float64
Exemple 1.12
Problème
Sélectionnez la colonne « petal_length » du jeu de données IRIS en utilisant iloc[].
Solution
Le code suivant placé dans une nouvelle cellule renvoie la colonne « petal_length ».
Code Python
data.iloc[:, 2]
La sortie obtenue ressemblera à ceci :
0 1.4
1 1.4
2 1.3
3 1.5
4 1.4
...
145 5.2
146 5.0
147 5.2
148 5.4
149 5.1
Name: petal_length, Length: 150, dtype: float64
Rechercher des données avec Pandas en Python
Pour rechercher des entrées de données répondant à des critères spécifiques (c'est-à-dire filtrer), vous pouvez utiliser DataFrame.loc[] de Pandas. Lorsque vous indiquez les critères de filtrage entre les crochets, [], la sortie renvoie les lignes filtrées du DataFrame. Par exemple, le code ci-dessous filtre les lignes dont le genre est la comédie. Remarquez que la sortie ne contient que 307 des 3 400 lignes au total. Vous pouvez vérifier la sortie par vous-même : vous constaterez que leurs valeurs de Genre sont toutes « Comedy ».
Code Python
data = pd.read_csv("[Path to ch1-movieprofit.csv]")
data.loc[data['Genre'] == 'Comedy']
La sortie obtenue ressemblera à ceci :
Exemple 1.13
Problème
À l'aide de DataFrame.loc[], recherchez tous les éléments de l'espèce Iris-virginica dans le jeu de données IRIS.
Solution
Le code suivant renvoie un DataFrame filtré dont l'espèce est Iris-virginica. Toutes ces lignes apparaissent dans la sortie.
Code Python
data = pd.read_csv("[Path to ch1-iris.csv]")
data.loc[data['species'] == 'Iris-virginica']
La figure obtenue ressemblera à ceci :
(Rows 109 through 149 not shown.)
Exemple 1.14
Problème
Cette fois, recherchez tous les éléments dont l'espèce est Iris-virginica et dont la largeur de sépale est supérieure à 3,2.
Solution
Vous pouvez utiliser une expression booléenne — c'est-à-dire une expression qui s'évalue à True ou False — à l'intérieur de data.loc[].
Code Python
data.loc[(data['species'] == 'Iris-virginica') & (data['sepal_width'] > 3.2)]
La sortie obtenue ressemblera à ceci :
Visualiser des données avec Matplotlib en Python
Il existe plusieurs manières de tracer des graphiques de données en Python. La façon la plus courante et la plus directe consiste à importer une autre bibliothèque, Matplotlib, qui est spécialisée dans la visualisation de données. Matplotlib est une bibliothèque très vaste, et pour tracer des graphiques, il vous suffit d'importer un sous-module appelé pyplot.
Tapez l'instruction d'importation suivante dans une nouvelle cellule. Notez qu'il est d'usage de désigner matplotlib.pyplot par plt, tout comme on abrège Pandas par pd.
Code Python
import matplotlib.pyplot as plt
Matplotlib propose une méthode pour chaque type de graphique, et vous découvrirez les méthodes de Matplotlib pour tous les types couramment utilisés tout au long de ce manuel. Dans ce chapitre, nous allons toutefois voir brièvement comment tracer un graphique de manière générale avec Matplotlib.
Supposons que vous souhaitiez tracer un nuage de points entre « US_Gross_Million » et « Worldwide_Gross_Million » du jeu de données sur la rentabilité des films (ch1-movieprofit.csv). Vous étudierez les nuages de points plus en détail dans Analyse de corrélation et de régression linéaire. Le code d'exemple ci-dessous trace un tel nuage de points à l'aide de la méthode scatter(). scatter() prend en entrée les deux colonnes de votre choix — data["US_Gross_Million"] et data["Worldwide_Gross_Million"] — et les affecte respectivement aux axes x et y.
Code Python
data = pd.read_csv("[Path to ch1-movieprofit.csv]")
# draw a scatterplot using matplotlib’s scatter()
plt.scatter(data["US_Gross_Million"], data["Worldwide_Gross_Million"])
La sortie obtenue ressemblera à ceci :
Remarquez qu'il s'agit simplement d'un ensemble de points sur un plan blanc. Le graphique lui-même n'indique pas ce que chaque axe représente, quel est le sujet du tracé, etc. Sans ces éléments, il est difficile de comprendre ce que le graphique illustre. Vous pouvez définir ces précisions avec le code suivant. Le tracé résultant ci-dessous montre qu'il existe une corrélation positive entre les recettes nationales et les recettes mondiales.
Code Python
# draw a scatterplot
plt.scatter(data["US_Gross_Million"], data["Worldwide_Gross_Million"])
# set the title
plt.title("Domestic vs. Worldwide Gross")
# set the x-axis label
plt.xlabel("Domestic")
# set the y-axis label
plt.ylabel("Worldwide")
La sortie obtenue ressemblera à ceci :
Vous pouvez également modifier la plage de valeurs le long des axes x et y avec plt.xlim() et plt.ylim(). Ajoutez les deux lignes de code suivantes à la cellule de l'exemple de code Python précédent qui trace le nuage de points.
Code Python
# draw a scatterplot
plt.scatter(data["US_Gross_Million"], data["Worldwide_Gross_Million"])
# set the title
plt.title("Domestic vs. Worldwide Gross")
# set the x-axis label
plt.xlabel("Domestic")
# set the y-axis label
plt.ylabel("Worldwide")
# set the range of values of the x- and y-axes
plt.xlim(1*10**2, 3*10**2) # x axis: 100 to 300
plt.ylim(1*10**2, 1*10**3) # y axis: 100 to 1,000
La sortie obtenue ressemblera à ceci :
Le tracé obtenu avec ces lignes de code supplémentaires présente une plage de valeurs plus restreinte le long des axes x et y.
Exemple 1.15
Problème
En utilisant le jeu de données Iris, tracez un nuage de points entre la longueur du pétale et la largeur du pétale d'Iris setosa. Définissez également convenablement le titre, l'étiquette de l'axe des x et l'étiquette de l'axe des y.
Solution
Code Python
import matplotlib.pyplot as plt
data = pd.read_csv("[Path to ch1-iris.csv]")
# select the rows whose species are Setosa Iris
setosa = data.loc[(data['species'] == 'Iris-setosa')]
# draw a scatterplot
plt.scatter(setosa["petal_length"], setosa["petal_width"])
# set the title
plt.title("Petal Length vs. Petal Width of Setosa Iris")
# set the x-axis label
plt.xlabel("Petal Length")
# set the y-axis label
plt.ylabel("Petal Width")
La sortie obtenue ressemblera à ceci :
Jeux de données
Remarque : Les principaux jeux de données référencés dans le code de ce chapitre peuvent également être téléchargés ici.