• 15 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Ce cours est en vidéo.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

J'ai tout compris !

Mis à jour le 26/02/2019

Téléchargez les données

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Les données et le code informatique

Dans l'archive que vous venez de télécharger, il y a 2 dossiers. Le dossier analyse vous sera utile dans les 3 premières parties du cours, et le dossier nettoyage dans la dernière partie.

Il est composé de fichiers au format :

  • .csv : ce sont les données que nous utiliserons pour illustrer ce cours

  • .py : c'est le code informatique cité tout au long de ce cours, en langage Python.

  • .r : il s'agit du même code que dans les fichiers .py, mais traduits en langage R

  • .ipynb : il s'agit encore du même code, mais cette fois-ci dans le format du notebook Jupyter. Ces notebooks sont utilisables soit en R soit en Python. Pour savoir comment les exécuter, retournez dans la section Lancez un notebook déjà créé du chapitre Installez R ou Python ! ;)

C'est parti !

Pour que ce cours soit plus attrayant, je vous propose d'analyser des données que vous avez générées ! Si vous possédez un compte bancaire consultable en ligne, et qu'il y a sur celui-ci des opérations bancaires fréquentes (c'est le cas notamment si vous utilisez fréquemment une carte bancaire), alors vous pouvez analyser vos comportements de consommation.

Un relevé bancaire est composé de lignes, que l'on appellera opération, opération bancaire ou transaction. Une opération sera donc un individu.

Je vous propose donc dans ce chapitre de télécharger vos relevés de compte, de les charger dans Python, et d'enrichir votre échantillon de nouvelles variables. Si tout se passe bien, cela ne devrait pas prendre beaucoup de temps. Mais si vous rencontrez des erreurs, il vous sera possible de télécharger un fichier final afin de continuer le cours. ;)

Si vous n'avez pas de relevé de comptes, commencez par ouvrir le fichier operations.csv (il est présent dans l'archive téléchargeable en haut du chapitre, dans le dossier analyse.). Il s'agit d'un faux relevé, pour lequel tous les libellés d'opération ont été partiellement censurés.

Ce que nous allons faire

Tous les relevés bancaires ont en commun (pour chaque opération) 3 informations :

  • la date de l'opération

  • le libellé de l'opération

  • le montant de l'opération

A partir de ces 3 informations, nous allons créer plusieurs variables :

  • date_operation

  • libelle

  • montant

  • sens : indique si l'opération est un crédit ou un débit

  • solde_avt_operation : elle indique le solde restant avant que l'opération ne soit effectuée

  • categ : qui indique la catégorie de l'opération, par exemple : "courses", "loyer", "facture", etc.

  • type : indiquant le type d'opération, exemple : "virement", "paiement par carte", 'retrait", etc.

  • tranche_depense : si l'opération est une dépense, indique si celle-ci est petite, moyenne, etc.

  • annee : l'année, déduite de date_operation

  • mois : le mois, déduit de date_operation

  • jour : le jour du mois (compris entre 1 et 31)

  • jour_sem : le jour de la semaine (lundi, mardi, etc.)

  • jour_sem_num : le numéro du jour de la semaine (compris entre 1 et 7)

  • weekend : indique si la date d'opération se situe sur un weekend

  • quart_mois : vaut 1, 2, 3 ou 4, et indique l'avancée dans le mois (1 : début, ..., 4 : fin de mois)

  • attente : indique pour chaque opération de catégorie "courses", la durée (en jours) séparant cette opération de la précédente opération de catégorie "courses". Celle-ci sera en fait calculée plus tard, dans le chapitre sur la régression linéaire.

Certaines de ces variables peuvent être calculées automatiquement, mais certaines nécessiterons votre intervention. Par exemple, vous devrez indiquer vous-même les opérations qui sont des courses ou des paiements de loyers. Ne vous inquiétez pas, je vous faciliterai la tâche afin de ne pas faire ceci entièrement "à la main". ;)

C'est parti !

Télécharger les données

En général, si vous avez accès à vos comptes bancaires à partir d'internet, il existe un endroit où vous pouvez télécharger le relevé de vos opérations.

Si vous avez le choix, choisissez le format CSV, et téléchargez le plus d'opérations possibles. Si seuls les formats de fichiers XLS ou ODS vous sont proposés, alors il faudra ouvrir le fichier dans un tableur (Excel ou OpenOffice Calc), puis l'enregistrer sous un format CSV. Pour plus de précision, cliquez ici.

Une fois votre fichier CSV obtenu, placez-le dans le même répertoire (dossier) que celui dans lequel se trouve votre script (Python ou R), ou votre notebook. Ensuite, renommez-le en  operations.csv.

Charger vos données dans votre programme

Ouvrez le fichier CSV avec un éditeur de texte (pas avec un tableur !). Sous Windows, utilisez par exemple l'application Bloc-notes, sous Mac Text Edit, sous Linux nano, vim ou gedit.

Votre fichier devrait ressembler à ceci :

identifiant_transaction,date_operation,date_valeur,libelle,debit,credit,solde
242,2023-10-06,2023-10-06,FORFAIT COMPTE SUPERBANK XX XX XX XX,-1.92,,2513.79
69,2023-10-06,2023-10-06,CARTE XX XX CHEZ LUC XX,-10.00,,2515.71

Une fois ouvert, il faut y repérer certaines informations :

  • Quelle(s) colonne(s) contiennent des dates ?

  • Quel est le format des dates ?

  • Pour les nombres, le délimiteur des décimales est-il la virgule  3,24  ou le point 3.24 ?

  • Les colonnes sont-elles délimitées par le caractère  ,  ,  ;  ou par une tabulation\t  ?

  • Le fichier contient-il un en-tête ?

Souvent, la toute première ligne indique le nom des colonnes (on l'appelle en-tête ou header), et les suivantes correspondent aux opérations bancaires. Si l'en-tête est absent, ce n'est pas grave. Mais s'il contient des accents, mieux vaut les remplacer (à la main) par des lettres sans accents.

Prêt à coder ? C'est parti ! Ouvrez un notebook ou un script Python, et utilisez la méthode  read_csv  pour charger votre fichier csv :

import pandas as pd
data = pd.read_csv("operations.csv", [...] )
print(data)

Pour compléter le  [...]  , voici 3 exemples pour vous inspirer :

data = pd.read_csv("operations.csv",parse_dates=[1,2])
data = pd.read_csv("operations.csv",parse_dates=[1,2],header = None)
data = pd.read_csv("operations.csv",parse_dates=[1,2],sep= ';',
    decimal= ',', dayfirst=True)

Bien entendu, ces 3 lignes sont des exemples : vous n'aurez besoin d'utiliser read_csv  qu'une seule fois, pas 3 !  Voici une aide à propos des différents arguments à ajouter dans  read_csv  :

  • parse_date  et  dayfirst  : Dans tous les cas, il faudra indiquer quelles sont les colonnes qui représentent des dates grâce à  parse_date  . Attention, en Python, on indexe à partir de 0 : ainsi, la première colonne du CSV a le numéro 0. Le format des dates sera déduit automatiquement, sauf si les dates sont au format  01/02/2020. Si c'est le cas, il faut spécifier si le  01  indique le jour ou le mois (en Europe, cette date est interprétée comme "1er février 2020", alors qu'aux USA, ce serait "2 janvier 2020"). Si c'est le jour, alors il faut préciser  dayfirst=True, comme en ligne 4 ci-dessus.

  • sep  et  decimal  : Si vos colonnes ne sont pas séparées par des virgules, ou si le délimiteur des décimales n'est pas le point, alors il faudra préciser les paramètres  sep  et/ou  decimal, comme en lignes 3 et 4.

  • header  : Si votre fichier ne contient pas d'en-tête, alors il faudra préciser  header=None, comme en ligne 4.

Vérifiez que l'import s'est bien passé en affichant la variable data en tapant cette ligne, qui affichera un tableau :

print(data)

Pour utiliser le code qui suivra, nous devons tous avoir les mêmes noms de colonnes dans notre dataframe. Renommons donc nos colonnes :

data.columns = ['identifiant_transaction','date_operation','date_valeur',
                'libelle','debit','credit','solde']

Adaptez cette ligne à votre cas, mais assurez-vous bien que les colonnes indiquant la date d'opération, le libellé, le montant des débits et le montant des crédits aient le même nom qu'ici. Si au lieu des colonnes  credit  et  debit, votre fichier ne contient qu'une unique colonne, appelez-la  montant.

Détecter les opérations fréquentes

Vous avez probablement vos habitudes de consommation, par exemple, vous fréquentez sûrement les mêmes endroits pour faire vos courses. Dans ce cas, beaucoup d'opérations auront un libellé contenant le nom de votre magasin préféré.

Nous souhaitons ici déterminer des catégories et des types d'opérations à partir des libellés. Pour cela, je vous ai concocté une petite fonction qui repère les mots les plus fréquents parmi vos libellés. Testez-la, vous m'en direz des nouvelles :

from collections import Counter

def most_common_words(labels):
    words = []
    for lab in labels:
        words += lab.split(" ")
    counter = Counter(words)
    for word in counter.most_common(100):
        print(word)

most_common_words(data['libelle'].values)

Voici le début de ce qu'elle affiche :

('XX', 1428)
('CARTE', 247)
('VIREMENT', 29)
('LES', 20)
('ANCIENS', 20)
('ROBINSON', 20)
('CHEZ', 16)
('LUC', 16)

Je vois que le mot "carte" est présent 247 fois dans mes relevés. Quand je regarde mes relevés, je vois qu'il s'agit de toutes les opérations qui représentent un paiement par carte bancaire. Nous appellerons le mode de paiement le type d'opération.

Aussi, je vois qu'il y a 16 fois les mots "CHEZ" et "LUC". Dans mes relevés, je vois que j'ai mangé 16 fois au restaurant "CHEZ LUC". Ici, nous dirons que le restaurant est la catégorie de l'opération.

Faites cet exercice à partir de vos relevés, puis créez deux variables :  TYPE  et  CATEGS, en suivant cet exemple :

CATEGS = {
    'LOYER': 'LOYER',
    'FORFAIT COMPTE SUPERBANK': 'COTISATION BANCAIRE',
    'LES ANCIENS ROBINSON': 'COURSES',
    "L'EPICERIE DENBAS": 'COURSES',
    'TELEPHONE': 'FACTURE TELEPHONE',
    'LA CCNCF': 'TRANSPORT',
    'CHEZ LUC': 'RESTAURANT',
    'RAPT': 'TRANSPORT',
    'TOUPTIPRI': 'COURSES',
    'LA LOUVE': 'COURSES',
    'VELOC': 'TRANSPORT'
}
TYPES = {
    'CARTE': 'CARTE',
    'VIR': 'VIREMENT',
    'VIREMENT': 'VIREMENT',
    'RETRAIT': 'RETRAIT',
    'PRLV': 'PRELEVEMENT',
    'DON': 'DON',
}

Dernière étape avant le décollage !

Encore 3 lignes à personnaliser et on pourra lancer le programme :

EXPENSES = [80,200] # Bornes des catégories de dépense : petite, moyenne et grosse
LAST_BALANCE = 2400 # Solde du compte APRES la dernière opération en date
WEEKEND = ["Saturday","Sunday"] # Jours non travaillés

Tout d'abord, les bornes des catégories de dépenses (ligne 1). Ici, j'ai considéré qu'une dépense inférieure à 80 € est une petite dépense, qu'une dépense de plus de 200 € est une grosse dépense, et qu'une dépense moyenne se situe entre ces 2 bornes. Ces 2 valeurs sont subjectives, alors personnalisez-les ! Elles doivent être exprimées dans la même devise que celle de vos relevés de compte : si vos relevés ne sont pas en euros, il vous faudra probablement changer ces valeurs.

Lorsque vous téléchargez vos relevés, retenez-bien la somme d'argent présente sur votre compte après la dernière opération de votre fichier CSV. Si votre fichier contient la toute dernière opération que vous avez effectuée, alors indiquez dans  LAST_BALANCE  la somme d'argent actuellement présente sur votre compte.

Indiquez enfin dans  WEEKEND  s'il y a des jours durant lesquels votre quotidien change. Pour quelqu'un qui travaille du lundi au vendredi, le quotidien changera les samedis et dimanches car il ne travaille pas. Vous pouvez laisser cette liste vide en écrivant  WEEKEND = []. Choisissez ces valeurs parmi celles-ci, en respectant les majuscules/minuscules :

 ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

Décollage !

C'est quasi-fini ! Il ne vous reste plus qu'à copier-coller ce code les yeux fermés :

# Controle des colonnes
for c in ['date_operation','libelle','debit','credit']:
    if c not in data.columns:
        if (c in ['debit','credit'] and 'montant' not in data.columns) or \
        (c not in ['debit','credit']):
            msg = "Il vous manque la colonne '{}'. Attention aux majuscules "
            msg += "et minuscules dans le nom des colonnes!"
            raise Exception(msg.format(c))

# Suppression des colonnes innutiles
for c in data.columns:
    if c not in ['date_operation','libelle','debit','credit','montant']:
        del data[c]

# Ajout de la colonne 'montant' si besoin
if 'montant' not in data.columns:
    data["debit"] = data["debit"].fillna(0)
    data["credit"] = data["credit"].fillna(0)
    data["montant"] = data["debit"] + data["credit"]
    del data["credit"], data["debit"]

# creation de la variable 'solde_avt_ope'
data = data.sort_values("date_operation")
amount = data["montant"]
balance = amount.cumsum()
balance = list(balance.values)
last_val = balance[-1]
balance = [0] + balance[:-1]
balance = balance - last_val + LAST_BALANCE
data["solde_avt_ope"] = balance

# Assignation des operations a une categorie et a un type
def detect_words(values, dictionary):
    result = []
    for lib in values:
        operation_type = "AUTRE"
        for word, val in dictionary.items():
            if word in lib:
                operation_type = val
        result.append(operation_type)
    return result
data["categ"] = detect_words(data["libelle"], CATEGS)
data["type"] = detect_words(data["libelle"], TYPES)

# creation des variables 'tranche_depense' et 'sens'
def expense_slice(value):
    value = -value # Les dépenses sont des nombres négatifs
    if value < 0:
        return "(pas une dépense)"
    elif value < EXPENSES[0]:
        return "petite"
    elif value < EXPENSES[1]:
        return "moyenne"
    else:
        return "grosse"
data["tranche_depense"] = data["montant"].map(expense_slice)
data["sens"] = ["credit" if m > 0 else "debit" for m in data["montant"]]

# Creation des autres variables
data["annee"] = data["date_operation"].map(lambda d: d.year)
data["mois"] = data["date_operation"].map(lambda d: d.month)
data["jour"] = data["date_operation"].map(lambda d: d.day)
data["jour_sem"] = data["date_operation"].map(lambda d: d.weekday_name)
data["jour_sem_num"] = data["date_operation"].map(lambda d: d.weekday()+1)
data["weekend"] = data["jour_sem"].isin(WEEKEND)
data["quart_mois"] = [int((jour-1)*4/31)+1 for jour in data["jour"]]
        
# Enregistrement au format CSV
data.to_csv("operations_enrichies.csv",index=False)

Ce code supprimera les colonnes dont nous n'avons pas besoin (par exemple date_valeur), et vérifiera que votre dataframe contient bien les colonnes dont nous aurons besoin (leur nom doit être correctement orthographié). Ensuite, il créera toutes les variables citées tout en haut du chapitre !

Le résultat sera enregistré dans une nouveau fichier CSV :  operations_enrichies.csv.

Voilà, vous êtes fin prêts à analyser vos comportements de consommation !

Et si ça a planté...?

Si vous rencontrez des erreurs, vous pourrez utiliser pour les chapitres suivants le fichier operations_enrichies.csv(il est présent dans l'archive téléchargeable en haut du chapitre, dans le dossier analyse) . Faites-nous part de vos erreurs sur le forum de ce cours (sans copier-coller vos relevés !), et si votre erreur est fréquente, nous ajouterons sa solution ci-dessous.

Erreurs fréquentes

Aucune erreur fréquente recensée à ce jour.

Exemple de certificat de réussite
Exemple de certificat de réussite