🐼 Pandas et 🤖 Scikit-learn
- Intro
- 🐼 Pandas DataFrame
- Filtrer Trier
- Sélectionner Series Parcourir
- Transformer
- Statisques Agréger Pivot
- Nettoyer
- Visualiser
- 🤖 Scikit-learn
- Activités
📊 Pour votre TP2, vous allez devoir manipuler des données réelles :
- 📥 Charger des ensembles de données à partir de fichiers CSV.
- 🧹 Nettoyer et prétraiter les données pour les rendre exploitables.
- 🔍 Analyser les données pour en extraire des informations pertinentes.
- 📈 Visualiser les données à l'aide de graphiques.
- 🤖 Utiliser des techniques d’apprentissage automatique pour construire des modèles prédictifs.
🧠 Cela nécessite une bonne compréhension des concepts et des outils d’analyse de données.
🔬 L’analyse de données est un processus essentiel qui consiste à examiner, nettoyer, transformer et modéliser des données dans le but de découvrir des informations utiles, informer des conclusions et soutenir la prise de décision.
🧰 Bibliothèques Python couramment utilisées pour l’analyse de données :
- 🐼 Pandas : pour la manipulation et l’analyse de données, offrant des structures de type DataFrame.
- 🔢 NumPy : pour le calcul scientifique et les opérations sur des tableaux multidimensionnels.
- 🤖 Scikit-learn : pour l’apprentissage automatique et la modélisation prédictive.
- 🧠 Keras et TensorFlow : pour le développement de modèles d’apprentissage profond (deep learning).
- 🎨 Matplotlib et Seaborn : pour la visualisation de données.
- … et bien d’autres selon les besoins !
🧩 Vous connaissez déjà :
- 🎨 Matplotlib pour la visualisation
- 🔢 NumPy pour les calculs numériques
📅 Cette semaine, nous allons apprendre à utiliser deux nouvelles bibliothèques essentielles pour votre TP2 :
🐼 Pandas et 🤖 Scikit-learn.
👉 La semaine prochaine, nous aborderons les concepts d’intelligence artificielle et d’apprentissage profond (deep learning).
Pandas est une bibliothèque Python essentielle pour la manipulation et l'analyse de données.
Elle offre des structures de données flexibles et performantes, telles que les DataFrames, qui facilitent le traitement des données tabulaires.
Le DataFrame est la structure de données principale de Pandas. Il s'agit d'une table bidimensionnelle, similaire à une feuille de calcul Excel, où les données sont organisées en lignes et en colonnes. Chaque colonne peut contenir des types de données différents (nombres, chaînes de caractères, dates, etc.).
On peut créer un DataFrame à partir de diverses sources de données, telles que des fichiers CSV, des bases de données SQL, ou même des dictionnaires Python.
Voici un exemple simple de création d'un DataFrame à partir d'un dictionnaire :
import pandas as pd
# Création d'un DataFrame à partir d'un dictionnaire
data = {'Nom': ['Alice', 'Bob', 'Charlie'],
'Âge': [25, 30, 35],
'Ville': ['Paris', 'Lyon', 'Marseille']}
df = pd.DataFrame(data)
# Affichage du DataFrame
print(df)
Cela produira le DataFrame suivant :
Nom Âge Ville
0 Alice 25 Paris
1 Bob 30 Lyon
2 Charlie 35 Marseille
- Les clés du dictionnaire deviennent les noms des colonnes, et chaque liste associée à une clé devient une colonne de données.
- La première ligne représente les en-têtes des colonnes.
- La première colonne (0, 1, 2) est l'index par défaut des lignes suivantes.
- Chacune de ces lignes représente un enregistrement (une personne dans cet exemple).
Le fichier tips_dataset.csv contient des données sur les pourboires donnés dans un restaurant, avec les colonnes suivantes : le montant total de la facture, le pourboire, le sexe du serveur, si le client est fumeur, le jour de la semaine, le moment de la journée (dîner/lunch ou souper/dinner) et la taille du groupe :
total_bill,tip,sex,smoker,day,time,size
16.99,1.01,Female,No,Sun,Dinner,2
10.34,1.66,Male,No,Sun,Dinner,3
21.01,3.5,Male,No,Sun,Dinner,3
23.68,3.31,Male,No,Sun,Dinner,2
...
Si vous le téléchargez et le placez dans votre projet Pycharm, vous pouvez le lire avec Pandas comme ceci :
import pandas as pd
# Lire le fichier CSV dans un DataFrame
df = pd.read_csv('tips_dataset.csv') # la variable df contiendra un DataFrame
# Afficher les premières lignes du DataFrame
print(df.head())
Cela produira un DataFrame qui ressemble à ceci (seules les 5 premières lignes sont affichées) :
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
Nous utiliserons ces données pour illustrer diverses opérations avec Pandas.
- Chargez-les et expérimentez par vous-même ! 🎯
Si votre DataFrame a trop de colonnes ou du contenu trop long, il se peut que certaines colonnes soient remplacées par des ...
Dans ce cas, ajoutez ces 2 instructions juste après vos importations en haut de votre script :
import pandas as pd
# Permet d'afficher entièrement le contenu des colonnes, sans limite de longueur
pd.set_option('display.max_colwidth', None)
# Empêche Pandas d'étendre l'affichage du DataFrame sur plusieurs lignes (si possible)
pd.set_option('display.expand_frame_repr', False)
Une fois vos données chargées dans un DataFrame (ici nommé df), vous pouvez effectuer une grande variété d’opérations.
L'une des premières opérations consiste généralement à explorer les données afin de découvrir les colonnes, leur format, etc.
# Afficher les 5 premières lignes du DataFrame
print(df.head())
# Afficher les 20 premières lignes du DataFrame
print(df.head(20))
# Afficher les informations sur les colonnes et les types de données
df.info()
# Afficher les noms des colonnes uniquement sous forme d'une liste de string
print(df.columns.to_list())
# Afficher le nombre de lignes dans le DataFrame
print(len(df))
# Afficher des statistiques descriptives (moyenne, min, max, etc.)
print(df.describe())
Remarquez que toutes ces opérations ne modifient pas le DataFrame original df.
Elles retournent des informations ou des nouveaux objets basés sur le contenu de df, mais df lui-même reste inchangé.
Seule la méthode df.info() affiche des informations sur le DataFrame sans retourner un nouvel objet, donc on n'a pas besoin de faire print(df.info()).
La dernière commande df.describe() permet d’obtenir sous forme d'un DataFrame un résumé statistique rapide des colonnes numériques du DataFrame, incluant des mesures telles que la moyenne (mean), l’écart-type (std), les valeurs minimales (min) et maximales (max), ainsi que les quartiles (25%, 50%, 75%) :
total_bill tip size
count 244.000000 244.000000 244.000000
mean 19.785943 2.998279 2.569672
std 8.902412 1.383638 0.951100
min 3.070000 1.000000 1.000000
25% 13.347500 2.000000 2.000000
50% 17.795000 2.900000 2.000000
75% 24.127500 3.562500 3.000000
max 50.810000 10.000000 6.000000
Il est possible de créer un nouveau DataFrame en filtrant des lignes.
Par exemple, on peut filtrer pour ne conserver que :
# les lignes où le pourboire est supérieur à 5
df_filtre1 = df[df["tip"] > 5]
print(df_filtre1)
# les lignes où le jour est "Sun" et le temps est "Dinner"
df_filtre2 = df[(df["day"] == "Sun") & (df["time"] == "Dinner")]
print(df_filtre2)
# les lignes où le jour contient la chaîne de caractère "u"
# (ceci limite les résultats aux jours : Sun et Thur)
df_filtre3 = df[df["day"].str.contains("u")]
print(df_filtre3)
# les lignes où le serveur est une femme et le pourboire est supérieur à 3
df_filtre4 = df[(df["sex"] == "Female") & (df["tip"] > 3)]
print(df_filtre4)
# les lignes où la longueur de la chaîne dans la colonne "day" est supérieure à 3
df_filtre5 = df[df["day"].str.len() > 3]
print(df_filtre5)
# les lignes où le jour est dans une liste de valeur souhaitées
liste_journees_a_conserver = ["Fri", "Sat"]
df_filtre6 = df[df["day"].isin(liste_journees_a_conserver)]
print(df_filtre6)
Toutes ces opérations (et celles qui suivent) ne modifient pas le DataFrame original df.
Elles renvoient un nouveau DataFrame basé sur les critères spécifiés.
Il est cependant possible de stocker le résultat dans une nouvelle variable (si nécessaire) :
df_filtered = df[df["tip"] > 5]
df_filtered contiendra alors un nouveau DataFrame avec uniquement les lignes où le pourboire est supérieur à 5.
Il est possible de créer un nouveau DataFrame trié sur une ou plusieurs colonnes :
# Trier par montant total de la facture (total_bill) en ordre croissant
df_trie1 = df.sort_values(by="total_bill")
print(df_trie1)
# Trier par pourboire (tip) en ordre décroissant
df_trie2 = df.sort_values(by="tip", ascending=False)
print(df_trie2)
# Trier par jour puis par montant total de la facture
df_trie3 = df.sort_values(by=["day", "total_bill"])
print(df_trie3)
Il est possible de chaîner les opérations. Par exemple, on peut filtrer les données, puis les trier immédiatement. Cela peut se faire en deux instructions séparées, tout comme il est possible de le faire en une seule ligne!
# Création de 2 DataFrames contenant les mêmes lignes
# (les données de la fin de semaine triées en ordre du montant total de la facture)
# Version détaillée (en 2 étapes)
df_version1 = df[df["day"].isin(["Sun","Sat"])]
df_version1 = df_version1.sort_values(by="total_bill")
print(df_version1)
# Version compacte (en 1 seule instruction : "Method Chaining")
df_version2 = df[df["day"].isin(["Sun","Sat"])].sort_values(by="total_bill")
print(df_version2)
Lorsque vous combinez plusieurs opérations, il peut être complexe d'identifier la source d'une erreur. Le débogage est souvent plus simple en décomposant les instructions sur des lignes distinctes. Cela permet de vérifier l'état du DataFrame après chaque transformation.
En programmation, on applique souvent le principe de réduction précoce (early filtering) : plus tôt on réduit la taille du jeu de données, plus les opérations suivantes seront fluides et performantes. Par conséquent, commencez toujours par filtrer vos données avant de les trier.
Nous avons vu comment filtrer des lignes en fonction de critères spécifiques.
Voyons maintenant comment sélectionner des colonnes ou des lignes spécifiques d'un DataFrame.
Il est possible de créer un NOUVEAU DataFrame à partir d'un DataFrame existant en ne conservant que certaines colonnes ou certaines lignes.
📌 Sélection de colonnes
Pour sélectionner plusieurs colonnes, on utilise une liste de noms de colonnes :
colonnes_a_conserver = ["total_bill", "tip", "day"]
df_plusieurs_colonnes = df[colonnes_a_conserver]
print(df_plusieurs_colonnes)
On peut aussi le faire directement (attention aux doubles crochets [[...]]) :
df_plusieurs_colonnes = df[["total_bill", "tip", "day"]]
print(df_plusieurs_colonnes)
📌 Sélection de lignes
On peut sélectionner des lignes avec différentes méthodes :
# Créer un nouveau DataFrame avec les 10 premières lignes
df_debut = df.head(10)
print(df_debut)
# Créer un DataFrame avec un intervalle de lignes (index 3 à 9)
df_plage_lignes = df.iloc[3:10]
print(df_plage_lignes)
# Créer un DataFrame avec des lignes spécifiques (index 0, 5 et 10)
df_lignes_specifiques = df.iloc[[0, 5, 10]]
print(df_lignes_specifiques)
📌 Sélection d'une seule colonne ou d'une seule ligne
On peut aussi sélectionner une seule colonne ou une seule ligne.
👉 Dans ce cas, le résultat n’est plus un DataFrame, mais une Series.
Une Series est une structure de données à une dimension, semblable à une liste, mais avec des index (étiquettes).
# Une seule colonne → Series
serie_total_bill = df["total_bill"]
print(serie_total_bill)
# Une seule ligne → Series
serie_une_ligne = df.iloc[3]
print(serie_une_ligne)
⚠️ Piège important
Le type retourné dépend de comment on sélectionne, pas seulement du nombre d’éléments :
df.iloc[3] # → Series
df.iloc[[3]] # → DataFrame
df["total_bill"] # → Series
df[["total_bill"]] # → DataFrame
👉 Les crochets simples vs doubles changent tout !