🐼 Pandas et 🤖 Scikit-learn
- Analyse de données
- 🐼 Pandas
- 🤖 Scikit-learn
- Exercices
📊 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.
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 colonne (0, 1, 2) est l'index par défaut des lignes.
- La première ligne représente les en-têtes des colonnes.
- Chaque ligne suivante 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')
# 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, précédez l'appel de la fonction head() de ces 2 instructions :
pd.set_option('display.max_colwidth', None) # Permet d'afficher entièrement le contenu des colonnes, sans limite de longueur
pd.set_option('display.expand_frame_repr', False) # Empêche Pandas d'étendre l'affichage du DataFrame sur plusieurs lignes (si possible)
print(df.head())
Une fois vos données chargées dans un DataFrame, vous pouvez effectuer une grande variété d’opérations pour les explorer, les transformer et en extraire de l’information utile.
Voici quelques exemples pratiques avec le DataFrame df du fichier tips_dataset.csv :
👀 Afficher et explorer les données
# Affiche les 5 premières lignes du DataFrame
print(df.head())
# Affiche les informations sur les colonnes et les types de données
df.info()
# Affiche des statistiques descriptives (moyenne, min, max, etc.)
print(df.describe())
Cette 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%, 75%, 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
🔍 Récupérer le contenu d'une ligne et d'une colonne en particulier
On peut récupérer par programmation le contenu spécifique d'un DataFrame à l'aide de la méthode loc.
Cette méthode permet de récupérer le contenu à une ligne et une colonne spécifiée :
# Résumé statistique
desc = df.describe()
# Extraire la moyenne de la colonne 'tip'
mean_tip = desc.loc['mean', 'tip']
print("Moyenne de tip :", mean_tip) # 2.998279
🎯 Sélectionner des colonnes et des lignes
Il est possible de créer un nouveau DataFrame à partir d'un DataFrame existant en ne conservant que certaines colonnes ou certaines lignes :
# Créer un nouveau DataFrame avec seulement la colonne "total_bill"
df_total_bill = df["total_bill"]
print(df_total_bill)
# Créer un nouveau DataFrame avec ces 3 colonnes :
df_plusieurs_colonnes = df[["total_bill", "tip", "day"]]
print(df_plusieurs_colonnes)
# Créer un nouveau DataFrame avec la ligne 4 uniquement
df_une_seule_ligne = df.iloc[3] # 4ème ligne (index 3)
print(df_une_seule_ligne)
# Créer un nouveau DataFrame avec les lignes 4 à 9
df_plusieurs_lignes = df.iloc[3:10]
print(df_plusieurs_lignes)
Prenez le temps d'observer à l'aide de PyCharm le contenu affiché à l'aide de la fonction print() :
- Si un DataFrame ne contient qu'une seule colonne, le nom de la colonne est retiré (ex : df_total_bill).
- Si un DataFrame ne contient qu'une seule ligne, l'affichage est différent (ex : df_une_seule_ligne).
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 besoin :
df_filtered = df[df["tip"] > 5]
df_filtered contiendra alors un nouveau DataFrame avec uniquement les lignes où le pourboire est supérieur à 5.
🔍 Filtrer les données
Il est possible de créer un nouveau DataFrame en filtrant (retirant) des lignes :
# Filtrer les lignes où le pourboire est supérieur à 5
df_filtre1 = df[df["tip"] > 5]
print(df_filtre1)
# Filtrer les lignes pour le jour "Sun" et le temps "Dinner"
df_filtre2 = df[(df["day"] == "Sun") & (df["time"] == "Dinner")]
print(df_filtre2)
# Filtrer les lignes où le serveur est une femme et le pourboire supérieur à 3
df_filtre3 = df[(df["sex"] == "Female") & (df["tip"] > 3)]
print(df_filtre3)
# Filtrer les lignes où la longueur de la chaîne dans la colonne "day" est supérieure à 3
df_filtre4 = df[df["day"].str.len() > 3]
print(df_filtre4)
📈 Trier et ordonner les données
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)
🧮 Créer de nouvelles colonnes
Parfois, nous souhaitons créer, dans un DataFrame, de nouvelles colonnes basées sur le contenu de colonnes déjà présentes :
# Ajouter une colonne pour le pourcentage de pourboire
df["tip_percentage"] = (df["tip"] / df["total_bill"]) * 100
# Ajouter une colonne indiquant si la journée fait partie de la fin de semaine
df["is_weekend"] = df["day"].str.slice(0, 1) == "S"
# str permet de récupérer le contenu de "day" en tant que chaine de caractères.
# La méthode slice(start, stop) permet de ne récupérer qu'une partie d'une chaîne :
# start = 0 → récupérer à partir de l'index 0 (inclus)
# stop = 1 → arrêter la récupération à l'index 1 (exclus)
# Résultat : slice retourne ici la première lettre du jour de la semaine
# ici : 'T' pour 'Thur', 'F' pour 'Fri', 'S' pour 'Sat' et 'S' pour 'Sun'
# On compare ensuite cette lettre à 'S' pour savoir si c'est le weekend ou pas,
# ce qui retourne True ou False.
# Afficher uniquement 5 colonnes des 10 premières lignes triées par montant de la facture
print(df[["total_bill", "tip", "tip_percentage", "day", "is_weekend"]].sort_values(by="total_bill").head(10))
Cela ajoute deux nouvelles colonnes au DataFrame : tip_percentage et is_weekend, la première calculant le pourcentage de pourboire par rapport au montant total de la facture et l'autre indiquant si la journée fait partie de la fin de semaine ou pas :
total_bill tip tip_percentage day is_weekend
67 3.07 1.00 32.573290 Sat True
92 5.75 1.00 17.391304 Fri False
111 7.25 1.00 13.793103 Sat True
172 7.25 5.15 71.034483 Sun True
149 7.51 2.00 26.631158 Thur False
195 7.56 1.44 19.047619 Thur False
218 7.74 1.44 18.604651 Sat True
145 8.35 1.50 17.964072 Thur False
135 8.51 1.25 14.688602 Thur False
126 8.52 1.48 17.370892 Thur False