top of page

MANIPULATION ET ANALYSE

DE DONNÉES SUR PYTHON

Dans cette fiche vous verrez comment manipuler et analyser des dataframes (tableau de données structurées) avec Python. Je commencerai par une brève introduction sur une plateforme de programmation que je vous conseille d'utiliser pour vos projets d'analyse de données. Puis je vous présenterai de nombreuses fonctions utiles pour la manipulation et l'analyse de données avec Python.

Tout d'abord, pour faire de la manipulation ou de l'analyse de données avec Python, je vous conseille fortement d'utiliser un notebook Jupyter.

Les notebooks Jupyter sont des éditeurs de code qui, dans un même document, peuvent rassembler du texte, des images, des formules mathématiques et du code informatique directement exécutable. 

Ils sont manipulables interactivement depuis un navigateur web.

Le nom de Jupyter provient du fait qu'il étaient initialement développés pour les langages de programmation Julia, Python et R.

La cellule est l'élément de base du notebook Jupyter. Chaque cellule peut contenir du texte (au format Markdown) ou du code.

L’intérêt principal de ce notebook est qu'il n'est plus nécessaire d'utiliser un terminal pour exécuter son code et voir les différentes sorties. Avec Jupyter, vous pouvez directement exécuter et visualiser la sortie d'une cellule. Donc plus besoin d'utiliser la fonction print à tout-va, si vous exécutez une fonction qui renvoie une sortie, celle-ci sera afficher en dessous de votre cellule.

L'autre principal intérêt de ce notebook est que vous ne serez pas obligé de télécharger les différentes bibliothèques de Python relatives à la Data Science (pandas, numpy, seaborn, matplotlib ...).

Pour utiliser un notebook Jupyter, vous pouvez télécharger Anaconda dans lequel Jupyter notebook sera disponible.

Vous pouvez également utiliser la plateforme Google Colab. C'est d'ailleurs ce que je vous conseille.

Google Colab est très intéressant pour sa simplicité d'utilisation (aucun téléchargement nécessaire). De plus, comme sur Google Drive, vous pouvez partager vos notebooks, ce qui peut être utile pour des projets en groupe.

Jupyter notebook avec Google Colab : https://colab.research.google.com/notebook#create=true

 

Capture d'écran d'un notebook Jupyter :

 

Passons maintenant aux différentes fonctions utiles en manipulation et analyse de données. Pour cela, nous allons utiliser la bibliothèque la plus utile en Data Science : pandas.

Si vous utilisez un notebook Jupyter, il vous suffira de l'importer avec "import pandas". Si vous utilisez un éditeur de code plus classique comme Atom ou Visual Studio Code, il vous faudra en plus l’installer avec un 'pip install pandas' en ligne de commande de votre terminal.

Vous avez vu dans la fiche "Importation de données" comment importer des données structurées en observations/variables. Pour faire cela, je vous ai présenté deux fonctions de la bibliothèque pandas : read_csv et read_excel. Ces fonctions créent ce qu'on appelle un dataframe (tableau de données de pandas).

data = pandas.read_csv('fichier.csv', index_col=0, encoding = "ISO-8859-1") # index_col=0 indique que les noms des colonnes sont inscrit sur la première ligne du fichier

data = pandas.read_excel('fichier.xlsx', index_col=0, encoding = "ISO-8859-1")

La fonction head renvoie les 5 premières lignes d'un dataframe. On peut bien sûr changer le nombre de ligne affichées en indiquant un nombre de lignes en paramètre. 

data.head() # Renvoie les 5 premières lignes du dataframe data créé par la fonction read de pandas

data.head(10) # Renvoie les 10 premières lignes du dataframe data créé par la fonction read de pandas

Même principe avec la fonction tail mais pour les dernières lignes d'un dataframe.

data.tail() # Renvoie les 5 dernières lignes du dataframe data créé par la fonction read de pandas

data.tail(10) # Renvoie les 10 dernières lignes du dataframe data créé par la fonction read de pandas

Pour avoir les dimensions d'un dataframe, on utilise la fonction shape qui renvoie un tuple (nombre lignes, nombre colonnes).

data.shape # Renvoie le tuple (nombre lignes, nombre colonnes) du dataframe nommé data

data.shape[0] # Renvoie le nombre de ligne du dataframe nommé data

data.shape[1] # Renvoie le nombre de colonnes du dataframe nommé data

Pour avoir la liste des noms des colonnes d'un dataframe, il faut utiliser la variable columns.

data.columns # Renvoie la liste des noms des variables du dataframe data

Voyons à présent comment manipuler les données d'un dataframe pandas.

Par exemple, pour sélectionner une colonne, on indique le nom de dataframe puis le nom de la colonne à sélectionner. Si l'on souhaite sélectionner plusieurs colonnes, il faut indiquer les noms dans une liste.

data['nom colonne'] # Renvoie les données de la colonne nommée 'nom colonne'

data[['colonne1','colonne2']] # Renvoie les données des colonnes nommées 'colonne1' et 'colonne2'

data[['colonne1','colonne2']][:20] # Renvoie les 20 premières lignes des deux colonnes

On peut aussi utiliser un masque logique pour sélectionner les données vérifiant une condition. Il faut faire comme précédemment sauf qu'à la place d'indiquer un nom de colonne, il faut indiquer un vecteur booléen (une condition).

data[data['age'] >= 18] # Renvoie les lignes du dataframe pour lesquelles la variable age est supérieure ou égale à 18

data[(data['age'] >= 18) & (data['sexe'] == 0)] # Même principe mais avec deux conditions

Pour obtenir les modalités d'une variable qualitative, on utilise la fonction unique.

data['variable qualitative'].unique() # Renvoie les modalités de la variable qualitative

On peut analyser le contenu des variables avec la fonction describe et value_counts. 

La fonction describe calcule des statistiques (moyenne, écart-type, minimum, maximum, quartiles, nombre de données non manquantes ...) pour chacune des variables composant le dataframe. Cela est très intéressant pour étudier les répartitions des données pour les variables quantitatives.

data.describe() # Renvoie un tableau rempli de statistiques des variables quantitatives

data.describe(include='O') # Pour les variables qualitatives (avec des chaînes de caractères)

Si vous avez des variables qualitatives dans votre dataframe, vous pouvez aussi utiliser la fonction value_counts qui calculera la répartition (nombre d’occurrences) de chaque modalité de la variable.

data['nom colonne'].value_counts() # Renvoie le nombre d’occurrences pour chaque modalité de la variable 'nom colonne' du dataframe data

data['nom colonne'].value_counts(normalize=True) # On peut rajouter le paramètre normalize=True pour avoir les résultats en pourcentage

data['nom colonne'].value_counts().plot.bar() # On peut aussi afficher le résultat sous forme de diagramme à barres

Il peut être intéressant de voir la répartition des types de variables d'un dataframe. Cela se fait avec la fonction dtypes qui renvoie le type de chaque variable et avec la fonction value_counts précédemment présentée.

data.dtypes # Renvoie le type de chaque variable du dataframe nommé data

data.dtypes.value_counts() # Renvoie le nombre d'occurence pour chaque type de variable du dataframe nommé data

data.dtypes.value_counts().plot.pie() # Même principe mais sous forme de diagramme circulaire

 

La fonction drop permet de supprimer des colonnes d'un dataframe en indiquant leur nom dans une liste :

data = data.drop(['colonne1', 'colonne2', 'colonne5', 'colonne10'], axis=1) # Supprime quatre colonnes du dataframe. axis=1 signifie que l'on veut supprimer les valeurs de la liste selon l'axe 1 du dataframe c'est-à-dire celui des colonnes.

data = data.drop('colonne1', axis=1) # Supprime une colonne

Pour fusionner plusieurs dataframes, on utilise la fonction concat du module pandas.

import pandas as pd

jointure = pd.concat([dataframe1, dataframe2, dataframe3], axis=0) # Fusion verticale (l'un au dessus de l'autre)

jointure = pd.concat([dataframe1, dataframe2, dataframe3], axis=1) # Fusion horizontale (l'un à côté de l'autre)

Voici maintenant des fonctions pour la gestion de données manquantes.

Pour compter le nombre de données manquantes d'une variable, vous pouvez combiner les fonctions is.na et sum.

is.na renvoie un vecteur booléen (True si la donnée est manquante et False si elle est présente). Si on utilise la fonction sum sur ce vecteur, cela comptera les données manquantes car avec is.na une donnée manquante donne la valeur 1 (True).

data.isna()['colonne1'].sum() # Renvoie le nombre de données manquante de la variable 'colonne1'

La fonction count() compte le nombre de données non manquantes d'une colonne.

data['colonne1'].count() # Renvoie le nombre de données non manquantes de la variable 'colonne1' du dataframe data

Il est donc facile de comprendre l'égalité suivante :

data.shape[0] = data.isna()['colonne1'].sum() + data['colonne1'].count() 

 

La fonction dropna permet tout simplement de supprimer les lignes avec des données manquantes.

data = data.dropna(axis=0) # Supprime les lignes du dataframe où il y a au moins une donnée manquante. axis=0 signifie que l'on veut supprimer les lignes.

data.dropna(axis=0, inplace=True) # inplace=True signifie que l'on va modifie le dataframe "en place". La fonction dropna va alors directement modifier le dataframe et ne rien renvoyer. Ce paramètre peut aussi être utilisé avec la fonction drop présentée précédemment.

La fonction groupby est une fonction très intéressante puisqu'elle permet de faire des analyses en regroupant les données selon les modalités d'une ou plusieurs variables qualitatives. On regroupe les données selon leur modalité puis on calcule une statistique.

data.groupby(['nom colonne qualitative']).mean() # Groupe les données selon les modalité de la variable 'nom colonne qualitative' et calcule la moyenne de chacune des variables du dataframe

data.groupby(['nom colonne qualitative']).std() # Même principe mais avec l'écart-type

Il peut parfois être utile de faire un tableau croisé entre deux variables qualitatives, pour cela on utilise la fonction crosstab de pandas.

import pandas

pandas.crosstab[data['variable1'], data['variable2']) # Renvoie le tableau croisé des occurrences des différentes modalités des deux variables

Enfin, voici deux fonctions très utiles pour créer de nouvelles variables : la fonction map et la fonction apply.

Tout d'abord, voyons la fonction map. Elle permet de créer une nouvelle variable en appliquant une fonction à chaque ligne et en lui renseignant qu'une seule variable du dataframe en paramètre.

def categories_age(age):

    if age < 18:

        return 'mineur'

    else:

        return 'majeur'

data['categorie age'] = data['age'].map(categories_age) # On peut par exemple recoder une variable age en catégories d'ages en définissant au préalable une fonction categories_age répartissant chaque age donné en paramètre dans une catégorie.

On peut aussi utiliser la fonction map pour recoder une variable.

data['sexe'] = data['sexe'].map({'homme':0, 'femme':1}) # On utilise un dictionnaire où les clés sont les valeurs à recoder et les valeurs des clés sont les nouvelles valeurs de recodage. Recode homme en 0 et femme en 1.

data['sexe'].map({'homme':0, 'femme':1}, inplace=True) # inplace=True signifie que l'on va modifie le dataframe "en place". La méthode map va alors directement modifier le dataframe et ne rien renvoyer.

Enfin, la fonction apply permet elle aussi de créer une nouvelle variable en appliquant une fonction à chaque ligne et en lui renseignant plusieurs variables du dataframe en paramètre.

Exemple simple :

def categorie(age, sexe):

    if (age < 18) and (sexe='homme):

        return ' homme mineur'

    elif (age < 18) and (sexe='femme):

        return ' femme mineur'

    elif (age >= 18) and (sexe='homme):

        return ' homme majeur'

    else:

        return 'femme majeur'

data['Categorie'] = data.apply(lambda x : categorie(x['Age'], x['Sexe']), axis=1) # Créer la variable 'Categorie' et la remplit en appliquant la fonction categorie à chaque ligne du dataframe data.

Exemple un peu plus complexe :

def derniere_confrontation(saison, equipe_domicile, equipe_exterieur):

    return (data[(data['Saison'] == saison - 1) &

                          (data['Equipe domicile'] == equipe_domicile) &

                          (data['Equipe exterieur'] == equipe_exterieur)]['Resultat']).to_string()[-1] 

# La fonction derniere_confrontation renvoie pour chaque ligne (ici une ligne correspond à un match) le résultat de la dernière confrontation entre les deux équipes, c'est-à-dire le résultat du match de la saison précédente (data['Saison'] == saison - 1). 

.to_string() permet de transformer la série qui est renvoyée (composée de l'indice de la ligne et du résultat) en une chaîne de caractère. [-1] permet de récupérer le dernier caractère de la chaîne (on prend juste le résultat et non l'indice de la ligne).

data['Derniere confrontation'] = data.apply(lambda x : derniere_confrontation(x['Saison'], x['Equipe domicile'], x['Equipe exterieur']), axis=1)

# Applique la fonction derniere_confrontation à chaque ligne du dataframe data en lui passant les paramètres nécessaires (x['Saison'], x['Equipe domicile'], x['Equipe exterieur']). Cela permet de créer une nouvelle variable 'Derniere confrontation' et de la remplir avec la valeur renvoyée par la fonction derniere_confrontation.

Pour finir, si vous voulez en apprendre plus sur la Data Science et le Machine Learning avec le langage Python je vous conseille fortement la chaîne Youtube Machine Learnia (tenue par un Senior Data Scientist travaillant à Londres).

La chaîne Youtube Machine Learnia : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ

Capture.PNG
bottom of page