Premiers pas avec Pandas
Dans le cours DS&SC-4, nous avons exploré en détail le package NumPy
. Son objet principal est le ndarray
, qui permet le stockage et la manipulation efficaces de tableaux homogènes. Cet object, bien qu’idéal pour les valeurs numériques (et donc pour la mise en ouevre de schémas d’approximation numériques), ne peut pas traiter des données variées telles que des catégories, des labels, des dates ou du texte.
En analyse de données, les informations sont souvent organisées avec chaque ligne représentant un individu et chaque colonne une caractéristique spécifique, qui n’est pas forcement une valeur numérique. Par exemple :
- dans le domaine automobile, chaque individu pourrait être une voiture, avec des caractéristiques telles que la puissance du moteur, les dimensions, la marque, le modèle, la couleur, etc.;
- dans une étude de grande distribution, chaque individu pourrait être un produit, avec des informations comme le prix et la catégorie;
- dans le secteur bancaire, chaque individu serait une personne, avec des informations comme le salaire moyen, l’age et les mensualités de remboursement d’un prêt.
Nous cherchons donc un outil qui permette :
- de représenter les données avec le format souhaité (individus/variables),
- de manipuler différents types de données,
- de lire les données provenant de différentes sources.
Pour manipuler efficacement ces données hétérogènes et lire des données de différentes sources, nous utilisons la librairie Pandas
. Dans ce cours, nous allons explorer ses fonctionnalités de base : lire et écrire des données, sélectionner des données, filtrer, trier, agréger et fusionner des données, et comment manipuler les données manquantes. Nous verrons également comment visualiser les données et comment combiner Pandas avec d’autres librairies de visualisation de données comme Matplotlib et Seaborn.
1 Importation de Pandas
Une fois Pandas installé, vérifions s’il fonctionne correctement. La communauté Python a adopté un certain nombre de conventions de nommage pour les modules les plus courants :
On peut choisir des options par défaut pour la création des figures:
plt.rcParams['font.size'] = 15
plt.rcParams['figure.figsize'] = (15, 7) # Taille par défaut des figures
# plt.style.use('ggplot') # set ggplot style
sns.set_theme(context = "notebook", # paper, notebook, talk, poster
style = "darkgrid", # ticks, whitegrid, darkgrid, white, dark
palette = "pastel", # None, Set2, husl, deep, muted, bright, pastel, dark, colorblind
rc = {"axes.spines.right": False,
"axes.spines.top": False}
)
Quelques remarques à propos des bibliothèques de visualisation de données : lorsqu’on choisit une bibliothèque pour la visualisation de données, trois options populaires se distinguent : Matplotlib, Seaborn et Plotly. Chacune d’elles a ses propres forces et particularités.
- Matplotlib est la bibliothèque de base pour la visualisation en Python. Elle offre une gande flexibilité et un contrôle fin de tous les aspects des graphiques, des tracés de lignes simples aux visualisations complexes. C’est l’outil idéal lorsque vous avez besoin d’une personnalisation poussée et d’un large éventail de types de graphiques. Cependant, cette flexibilité vient avec une complexité accrue, nécessitant souvent beaucoup de code pour atteindre le résultat désiré.
- Seaborn, construit sur Matplotlib, simplifie la création de graphiques statistiques et esthétiques. Il propose des thèmes intégrés et des palettes de couleurs qui rendent les visualisations non seulement plus attrayantes mais aussi plus informatives. Seaborn simplifie considérablement la création de graphiques statistiques, mais il est parfois limité pour les personnalisations très spécifiques.
- Plotly se distingue par sa capacité à créer des visualisations interactives et dynamiques. Il est particulièrement adapté pour les tableaux de bord interactifs et les explorations de données en temps réel. Plotly supporte également des graphiques en 3D et des cartes géographiques, ce qui le rend très puissant.
2 Un tableau monodimensionnel : la série
On va commencer par créer un ensemble de données réparties de manière aléatoire et on traçe son histogramme. Il s’agit d’une série, généralisation d’un array à une dimension de NumPy.
np.random.seed(0) # for reproducibility
values = np.random.randn(100) # array of normally distributed random numbers
s = pd.Series(values) # generate a pandas series
display(s)
0 1.764052
1 0.400157
2 0.978738
3 2.240893
4 1.867558
...
95 0.706573
96 0.010500
97 1.785870
98 0.126912
99 0.401989
Length: 100, dtype: float64
s.plot(kind='hist', title='Normally distributed random values', color='c', bins=10, edgecolor='black'); # histogram of the data
sns.displot(s, bins=10, color='c', aspect=15/7); # seaborn histogram
Vérifions certaines des statistiques des données (moyenne, écart-type, nombre d’observations, minimum, maximum et quartiles) à l’aide de la méthode .describe()
:
3 Un tableau bidimensionnel : le DataFrame
Voyons maintenant un exemple avec un DataFrame.
Un DataFrame est une structure de données bidimensionnelle, similaire à une table de base de données, ou à une feuille de calcul Excel. Les DataFrames sont particulièrement utiles pour gérer des données hétérogènes, c’est-à-dire des données qui peuvent être de différents types (entiers, chaînes de caractères, dates, etc.).
df = pd.DataFrame({'Colonne A': [1, 2, 1, 4, 3, 5, 2, 3, 4, 1],
'Colonne B': [12, 14, 11, 16, 18, 18, 22, 13, 21, 17],
'Colonne C': ['a', 'a', 'b', 'a', 'b', 'c', 'b', 'a', 'b', 'a']})
display(df)
Colonne A | Colonne B | Colonne C | |
---|---|---|---|
0 | 1 | 12 | a |
1 | 2 | 14 | a |
2 | 1 | 11 | b |
3 | 4 | 16 | a |
4 | 3 | 18 | b |
5 | 5 | 18 | c |
6 | 2 | 22 | b |
7 | 3 | 13 | a |
8 | 4 | 21 | b |
9 | 1 | 17 | a |
Vérifions à nouveau certaines des statistiques des données (moyenne, écart-type, nombre d’observations, minimum, maximum et quartiles) à l’aide de la méthode .describe()
:
Colonne A | Colonne B | |
---|---|---|
count | 10.000000 | 10.000000 |
mean | 2.600000 | 16.200000 |
std | 1.429841 | 3.705851 |
min | 1.000000 | 11.000000 |
25% | 1.250000 | 13.250000 |
50% | 2.500000 | 16.500000 |
75% | 3.750000 | 18.000000 |
max | 5.000000 | 22.000000 |
On remarque que, puisque la colonne C ne contient pas de valeurs numériques, elle est exclue de la sortie. Dans ce cas, on peut afficher le nombre d’observations par catégorie ou encore le nombre d’éléments uniques, le mode et la fréquence du mode.
On peut également croiser les données en utilisant crosstab()
et afficher les graphiques :
Colonne C | a | b | c |
---|---|---|---|
Colonne A | |||
1 | 2 | 1 | 0 |
2 | 1 | 1 | 0 |
3 | 1 | 1 | 0 |
4 | 1 | 1 | 0 |
5 | 0 | 0 | 1 |