Cours : Analyse de données
Prof. I. Akharraz
Faculté des Sciences - Agadir.
TP2 : Manipulation et analyse de données avec PANDAS.
Partie 1 : Séries et DataFrames
Introduction.
- Pandas est une bibliothèque logicielle dans Python permettant la manipulation et l'analyse des données.
- Puissante et simple d’usage.
- Largement utilisée dans : la science des données, l’analyse statistique, le machine learning et la finance.
- Elle propose deux structures de données principales :
(1) DataFrame : représentation tabulaire des données (lignes et colonnes), comparable à une feuille de calcul Excel ou une table SQL.
(2) Series : structure monodimensionnelle représentant une colonne d’un DataFrame ou une liste de valeurs avec un index associé.
- L’une des grandes forces de Pandas réside dans sa capacité à gérer les données manquantes, à effectuer des tris, des regroupements (groupby ), des jointures, ainsi que des opérations temporelles.
- Elle s’intègre parfaitement avec d’autres bibliothèques Python comme NumPy, Matplotlib et Scikit-learn.
1. Séries (vecteurs)
- Les Séries (Series) peuvent être vues comme des tableaux unidimensionnels- Capables de stocker n’importe quel type de données accompagnés d’un index qui permet d’accéder aux valeurs de manière intuitive.
- Une serie ressemble à une seule colonne d’un tableau Excel ou d’une base de données.
- Elle peut être indexée non seulement par des nombres (comme dans une liste classique), mais aussi par des étiquettes personnalisées (comme des noms, des dates, etc.).
1.1. Création et accès. (vecteurs)
import pandas as pd
# Créer une Series
s = pd.Series([1, 3, 3, 4], index=['a', 'b', 'c', 'd'])
print(s)
# Exemple 2.
ventes_hebdomadaires = pd.Series([250, 400, 300, 450],
index=['Semaine 1', 'Semaine 2', 'Semaine 3', 'Semaine 4'])
# Affichage de la Series
print(ventes_hebdomadaires)
# Accéder aux valeurs par leur label
print(ventes_hebdomadaires['Semaine 3'])
1.2. Opérations sur une série :
Opérations mathématiques basiques
import pandas as pd
# Création d'une série
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
# Exemples d'opérations
print(s + 5) # Ajout de 5 à chaque élément
print(s * 2) # Multiplication par 2
print(s / 10) # Division par 10
print(s ** 2) # Carré de chaque valeur
Opérations entre deux Series
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([10, 20, 30], index=['a', 'b', 'd'])
# Addition de deux Series
print(s1 + s2)
Fonctions statistiques intégrées
s = pd.Series([10, 20, 30, 40])
print(s.mean()) # Moyenne
print(s.sum()) # Somme
print(s.std()) # Écart-type
print(s.min(), s.max()) # Minimum et maximum
print(s.median()) # Médiane
Filtrage (indexation booléenne)
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
# Sélectionner les éléments supérieurs à 25
print(s[s > 25])
# Sélectionner selon conditions
print(s[(s > 15) & (s < 35)])
Gestion des valeurs manquantes (NaN)
s = pd.Series([10, None, 30, None, 50])
print(s.isna()) # Vérifie si la valeur est NaN
print(s.fillna(0)) # Remplace NaN par 0
print(s.dropna()) # Supprime les NaN
Remplaces les NaN avec la moyenne
import pandas as pd
import numpy as np
# Exemple de Series avec des NaN
s = pd.Series([10, 20, np.nan, 40, np.nan, 60])
# Calcul de la moyenne (en ignorant les NaN)
moyenne = s.mean()
# Remplacement des NaN par la moyenne
s_rempli = s.fillna(moyenne)
print("Avant remplissage :\n", s)
print("\nAprès remplissage par la moyenne :\n", s_rempli)
2. DataFrame (Tableau)
- Le DataFrame est la structure de données la plus utilisée dans la bibliothèque Pandas .- Il représente les données sous forme d’un tableau à deux dimensions , organisé en lignes et colonnes.
- Comparable à une feuille Excel, une table SQL ou encore un tableau de données en CSV.
- Chaque colonne du DataFrame peut avoir un type de données différent (entier, flottant, chaîne de caractères, booléen, etc.), ceci le rend très flexible pour manipuler des données réelles issues de fichiers, bases de données ou API.
2.1. Création :
# Créer un DataFrame
import pandas as pd
data = {
'Nom': ['Ali', 'Badr', 'Chams', 'Souad', 'Mohamed'],
'Âge': [25, 30, 35, 42, 46],
'Ville': ['Taza', 'Nador', 'Marakech', 'Fes', 'Rabat']
}
df = pd.DataFrame(data)
print(df)
2.2. Afficher les bordures :
import pandas as pd
data = {
'Nom': ['Ali', 'Badr', 'Chams', 'Souad', 'Mohamed'],
'Âge': [25, 30, 35, 42, 46],
'Ville': ['Taza', 'Nador', 'Marakech', 'Fes', 'Rabat']
}
df = pd.DataFrame(data)
# Afficher avec des bordures
styled_df = df.style.set_properties(**{
'border': '1px solid black',
'text-align': 'center'
}).set_table_styles([{
'selector': 'th',
'props': [('border', '1px solid black'), ('background-color', '#f2f2f2')]
}])
styled_df
2.3. Opérations sur les DataFrame
2.3.1. Affichage
# Afficher les premières lignes
print(df.head())
# Afficher les 2 premières lignes
print(df.head(2))
# Afficher les dernières lignes
print(df.tail(1))
# Afficher colonnes
print(df['Nom'])
df[['Nom', 'Ville']]
# Afficher les noms de colonnes
print(df.columns)
2.3.2. Filtrage
df[df['Âge'] > 30]
# Accès par label : .loc[]
print(df.loc[2, 'Ville']) # Accès à la ville de Chams
# Accès par position : Utiliser .iloc[]
print(df.iloc[2, 2]) # Âge de la 3e personne
2.3.3. Modification de structure
# Ajouter de nouvelles colonnes
df['Taille_cm'] = [170, 165, 168, 175, 180]
df['Poid_kg'] = [70, 65, 60, 75, 80]
print(df)
# Renommer une colonne
df.rename(columns={'Taille_cm': 'Taille'}, inplace=True)
print(df.columns)
df
# Supprimer une colonne
df.drop('Poid_kg', axis=1, inplace=True)
print(df.columns)
2.3.4. Tri
# Trier les personnes du plus âgé au plus jeune :
df_triée = df.sort_values(by='Âge', ascending=True)
print(df_triée)
2.3.5. Statistiques descriptives
# description global
print(df.describe())
# Moyenne d'âge
print(df['Âge'].mean())
# Groupement de moyenne par ville
df_groupé = df.groupby('Ville')['Âge'].mean()
print(df_groupé)
# Appliquer une fonction personnalisée
# Créer une colonne catégorie :
df['Catégorie'] = df['Âge'].apply(lambda x: 'Jeune' if x < 35 else 'Adulte')
print(df)
2.4. Visualisation
### Histogramme : Répartition des âges
import matplotlib.pyplot as plt
plt.hist(df['Âge'], bins=5, color='skyblue', edgecolor='black')
plt.title('Répartition des âges')
plt.xlabel('Âge')
plt.ylabel('Nombre de personnes')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
# Diagramme en barres : Âge par personne
plt.bar(df['Nom'], df['Âge'], color='teal')
plt.title("Âge par personne")
plt.xlabel("Personne")
plt.ylabel("Âge")
plt.grid(axis='y', linestyle='--')
plt.show()
# Camembert (en secteur) : Répartition par ville
ville_counts = df['Ville'].value_counts()
plt.pie(ville_counts, labels=ville_counts.index, autopct='%1.1f%%', startangle=90, colors=['#ff9999','#66b3ff','#99ff99','#ffcc99','#c2c2f0'])
plt.title('Répartition par ville')
plt.axis('equal') # Pour un cercle parfait
plt.show()
# Sauvegarder un graphique en image
plt.bar(df['Nom'], df['Âge'], color='teal')
plt.title("Âge par personne")
plt.xlabel("Personne")
plt.ylabel("Âge")
plt.savefig('age_par_personne.png') # Sauvegarde l'image
# print("Graphique sauvegardé sous 'age_par_personne.png'")
2.5. Exporter dans un fichier CSV
df.to_csv('personnes2.csv', index=False)
Aucun commentaire:
Enregistrer un commentaire