Vous êtes sur la page 1sur 23

Ministère de l’enseignement supérieur et de la recherche scientifique

Université de Sousse
Institut Supérieur des Sciences Appliquées et de Technologie de Sousse

Cahier de synthese :
Projet Data Science avec Méthode CRISP : Loan Prediction
Problem Dataset

Module :
Initiation à la data science

Elaborée par : Encadrée par :

BEN SALEM Yousr Dr.ABOUD Ahlem


HARROUM Alaa

Année Universitaire :

2023/2024
I- Présentation du sujet :
1. Science des données :

Le sujet de ce projet tutoré s’inscrit dans le domaine très vaste de la science des données, en anglais data
science. Cette discipline récente s’appuie sur des outils mathématiques, statistiques et informatiques afin
de traiter et d’exploiter au mieux la grande quantité d’informations dont la société moderne est submergée.
Plus précisément nous avons été placés face à des problèmes d’analyse de données, d’apprentissage
automatique et de prédiction, le tout avec l’aide de l’outil informatique. Nous allons détailler dans ce rapport
comment nous avons fait face à ces défis et quelles méthodes nous avons employées

2. Kaggle :

Kaggle est une plateforme en ligne dédiée à la science des données, à l'apprentissage automatique et à
l'analyse prédictive. Elle offre un environnement où les scientifiques des données, les chercheurs et les
passionnés peuvent accéder à des ensembles de données, participer à des compétitions, collaborer sur des
projets, et développer et partager des modèles d'apprentissage automatique.

Les principales fonctionnalités de Kaggle comprennent :

• Compétitions de science des données : Kaggle propose des compétitions où les participants peuvent
relever des défis en résolvant des problèmes complexes en utilisant des techniques de science des
données et de machine learning. Ces compétitions peuvent couvrir divers domaines tels que la
classification, la régression, la détection d'objets, etc.
• Ensembles de données : Kaggle met à disposition une vaste collection d'ensembles de données
provenant de divers domaines. Les utilisateurs peuvent explorer, télécharger et utiliser ces
ensembles de données pour leurs propres projets.
• Notebooks : Kaggle propose des notebooks interactifs basés sur Jupyter, permettant aux utilisateurs
d'écrire, d'exécuter et de partager du code Python et R. Cela facilite la collaboration et la
visualisation des résultats.
• Forums et communauté : Kaggle héberge des forums où les membres peuvent poser des questions,
partager des idées, discuter de problèmes techniques et collaborer sur des projets.
• Cours et tutoriels : Kaggle propose également des cours en ligne et des tutoriels pour aider les
utilisateurs à développer leurs compétences en science des données et en apprentissage
automatique.
3. Sujet choisi:
Le projet de Data Science basé sur la méthodologie CRISP a pour objectif d'adresser une problématique
bancaire cruciale : évaluer l'éligibilité d'une personne à un crédit en analysant son profil. À travers six
phases distinctes, le projet a débuté par l'évaluation des besoins, suivi de la collecte de données à partir du
système d'information interne de la banque et de bases de données disponibles sur Kaggle. La propreté des
données a été assurée par des procédures de data cleaning, et une exploration approfondie a été effectuée
pour comprendre les nuances de la base de données. La modélisation a ensuite été entreprise avec des
algorithmes de machine learning, et le modèle résultant a été déployé en production à l'aide du framework
Flask, offrant à la banque une interface intuitive pour des prédictions en temps réel sur la solvabilité des
clients. Ce processus rigoureux, aligné sur la méthodologie CRISP, garantit une approche systématique et
efficace pour résoudre la problématique posée par la banque.

II- Travail réalisé :


1. Environnement de travail :
• Python : Python est un langage de programmation interprété, de haut niveau, généraliste et
polyvalent. Créé par Guido van Rossum et publié pour la première fois en 1991, Python s'est
rapidement imposé comme l'un des langages de programmation les plus populaires.
• Google colab : Google Colab, abréviation de Google Colaboratory, est une plateforme de notebook
basée sur le cloud, fournie par Google. Elle permet aux utilisateurs d'écrire et d'exécuter du code
Python dans un environnement de notebook interactif, similaire à Jupyter Notebooks, directement
depuis le navigateur web.
• Pycharm : PyCharm est un environnement de développement intégré (IDE) dédié au langage de
programmation Python. Il est développé par JetBrains, une société connue pour ses outils de
développement de haute qualité. PyCharm offre un ensemble de fonctionnalités puissantes pour les
développeurs Python
2. Modélisation du problème :

La méthode CRISP-DM (Cross-Industry Standard Process for Data Mining) est un modèle de processus
standardisé qui guide les professionnels de la data science à travers les différentes étapes d'un projet de data
mining, depuis la compréhension du problème jusqu'à la mise en production des résultats

• Phase 1 : évaluer les besoins et les traduire en problématique Data :

Dans notre projet, nous avons abordé une problématique soulevée par les banques : déterminer si une
personne présentant un profil x est éligible à l'obtention d'un crédit. L'objectif est d'évaluer la solvabilité de
la personne et sa capacité à rembourser le prêt accordé par la banque.

• Phase 2 : Collecte de la donnée :


La banque dispose d'un système d'information qui enregistre les données des clients précédents. Dans notre
cas, nous avons opté pour l'utilisation de bases de données disponibles sur Kaggle pour constituer notre jeu
de données.

Voici le lien de notre base de données de banque Loan sur Kaggle :

https://www.kaggle.com/datasets/altruistdelhite04/loan-prediction-problem-dataset
Voici notre base de données aprés le téléchargement :

Au cours de cette phase, nous avons procédé au nettoyage de la base de données (data Cleaning) afin
d'assurer sa qualité et sa cohérence. Cela inclut la gestion des valeurs manquantes, la détection et la
correction d'éventuelles anomalies, ainsi que la normalisation des données.

Dans 2 figures suivantes nous avons importé les packages nécessaires comme :

• Pandas (import pandas as pd):

Objectif : Pandas est une bibliothèque puissante de manipulation et d'analyse de données pour Python.

Fonctionnalité : Elle offre des structures de données telles que les DataFrames qui permettent de
manipuler et d'analyser facilement des données structurées.

• NumPy (import numpy as np):

Objectif : NumPy est une bibliothèque de calcul numérique pour Python.

Fonctionnalité : Elle prend en charge les tableaux et matrices de grande dimension, ainsi que des
fonctions mathématiques pour effectuer des opérations sur ces tableaux.

• Matplotlib (import matplotlib.pyplot as plt):


Objectif : Matplotlib est une bibliothèque de création de graphiques en 2D pour Python.

Fonctionnalité : Elle permet la création d'une grande variété de visualisations statiques, animées et
interactives en Python.

• Seaborn (import seaborn as sns):

Objectif : Seaborn est une bibliothèque de visualisation de données statistiques basée sur Matplotlib.

Fonctionnalité : Elle offre une interface de haut niveau pour créer des graphiques statistiques attrayants et
informatifs.

• Scikit-learn (from sklearn...):

Objectif : Scikit-learn est une bibliothèque d'apprentissage automatique pour Python.

Fonctionnalité : Elle fournit des outils simples et efficaces pour l'exploration de données et l'analyse de
données, construits sur NumPy, SciPy et Matplotlib. Elle inclut divers algorithmes pour la classification,
la régression, le regroupement, etc.

• LabelEncoder (from sklearn.preprocessing import LabelEncoder):

Objectif : LabelEncoder est une classe utilitaire dans scikit-learn pour encoder les étiquettes catégorielles
avec des valeurs numériques.

Fonctionnalité : Elle transforme les étiquettes catégorielles en format numérique, ce qui est souvent
nécessaire pour les algorithmes d'apprentissage automatique.

• StratifiedShuffleSplit (from sklearn.model_selection import StratifiedShuffleSplit):

Objectif : StratifiedShuffleSplit est un validateur croisé qui fournit des indices d'entraînement/test pour
diviser les données en ensembles d'entraînement/test tout en maintenant la distribution des classes de la
variable cible.

Fonctionnalité : Elle aide à garantir que chaque classe est représentée de manière proportionnelle dans les
ensembles d'entraînement et de test.

• LogisticRegression (from sklearn.linear_model import LogisticRegression):

Objectif : La régression logistique est un algorithme de classification pour les problèmes de classification
binaire et multiclasse.
Fonctionnalité : Elle modélise la probabilité de la classe par défaut et prédit la classe avec la probabilité la
plus élevée.

• KNeighborsClassifier (from sklearn.neighbors import KNeighborsClassifier):

Objectif : Les k-plus proches voisins sont un algorithme simple et efficace de classification.

Fonctionnalité : Il classe un nouveau point de données en fonction de la classe majoritaire de ses k voisins
les plus proches dans l'espace des caractéristiques.

• DecisionTreeClassifier (from sklearn.tree import DecisionTreeClassifier):

Objectif : Les arbres de décision sont un algorithme populaire d'apprentissage automatique pour la
classification et la régression.

Fonctionnalité : Ils prennent des décisions en posant une série de questions et en apprenant des réponses
pour classer les points de données.

• Accuracy Score (from sklearn.metrics import accuracy_score):

Objectif : Le score d'exactitude est une métrique utilisée pour évaluer les performances d'un modèle de
classification.

Fonctionnalité : Il mesure l'exactitude du modèle en comparant les étiquettes prédites aux étiquettes
réelles.

• Pickle (import pickle):

Objectif : Pickle est un module pour la sérialisation et la désérialisation d'objets Python.

Fonctionnalité : Il permet de sauvegarder et de charger des objets Python, ce qui est utile pour sauvegarder
des modèles d'apprentissage automatique entraînés. Dans votre code, il est probablement utilisé pour
sauvegarder le modèle entraîné en vue d'une utilisation future.

Puis nous avons utilisé la fonction read_csv de Pandas pour lire les données à partir du fichier CSV spécifié
('train_u6lujuX_CVtuZ9i.csv') et les charge dans un DataFrame (df)
Dans cette capture nous avons utilisé la méthode info () en Pandas pour afficher les informations concises
sur notre DataFrame, y compris le nombre total de lignes et de colonnes, le nombre de valeurs non nulles,
le type de données de chaque colonne, et la consommation totale de mémoire

La ligne de « code df.isnull().sum().sort_values(ascending=False) » permet de compter le nombre de


valeurs manquantes (nulles) dans chaque colonne du DataFrame, puis de les trier par ordre décroissant du
nombre de valeurs manquantes. Cela peut vous donner un aperçu rapide des colonnes qui ont le plus de
données manquantes. En effet :

• df.isnull(): Cette expression renvoie un DataFrame de la même taille que df, mais avec des
valeurs booléennes (True si la valeur est nulle, False sinon).
• .sum(): Calcule la somme des valeurs True le long des colonnes, car True est équivalent à 1 et
False à 0.
• .sort_values(ascending=False): Trie les résultats par ordre décroissant, de sorte que les colonnes
avec le plus grand nombre de valeurs manquantes apparaissent en premier.
La méthode « describe » en Pandas est utilisée pour générer des statistiques descriptives d'un DataFrame.
Lorsque vous utilisez « include='O' », cela signifie que vous demandez uniquement des statistiques
descriptives pour les colonnes de type objet (c'est-à-dire, des colonnes contenant des données textuelles ou
catégorielles).

La sortie de cette ligne de code inclura des statistiques descriptives pour les colonnes de type objet, telles
que :

- count : Le nombre total d'observations non nulles dans la colonne.


- unique : Le nombre de valeurs uniques dans la colonne.
- top : La valeur la plus fréquemment observée.
- freq : Le nombre de fois que la valeur la plus fréquente apparaît.
Le code suivant vise à diviser le DataFrame en deux parties : une contenant les variables catégoriques et
l'autre contenant les variables numériques

Ce deux lignes de code vise à remplacer les valeurs manquantes dans les variables catégoriques par les
valeurs les plus fréquentes (mode) de chaque variable catégorique et puis vérifie s'il y a encore des valeurs
manquantes dans la DataFrame cat_data après le remplacement.

Ce code traite les valeurs manquantes dans les variables numériques en utilisant la méthode de remplissage
par la valeur précédente de la même colonne (backward fill) puis érifie s'il reste des valeurs manquantes
dans la DataFrame num_data après le remplissage.
Ce code effectue des transformations sur la colonne cible (Loan_Status) pour préparer les données à
l'analyse.

Transformation de la colonne cible (Loan_Status) :

- target_value = {'Y': 1, 'N': 0} : Crée un dictionnaire qui mappe les valeurs 'Y' à 1 et 'N' à 0.
- target = cat_data['Loan_Status'] : Sélectionne la colonne 'Loan_Status' de la DataFrame cat_data
et la stocke dans la variable target.
- cat_data.drop('Loan_Status', axis=1, inplace=True) : Supprime la colonne 'Loan_Status' de la
DataFrame cat_data car elle sera traitée séparément.
- target = target.map(target_value) : Utilise la méthode map pour remplacer les valeurs 'Y' et 'N' dans
la colonne target par 1 et 0, respectivement.
Ce code utilise la classe LabelEncoder de scikit-learn pour convertir les valeurs catégoriques dans la
DataFrame cat_data en valeurs numériques

Dans la figure suivante :

• La ligne de code cat_data.drop('Loan_ID', axis=1, inplace=True) supprime la colonne 'Loan_ID' de


la DataFrame cat_data
• La ligne de code X = pd.concat([cat_data, num_data], axis=1) crée une nouvelle DataFrame X en
concaténant horizontalement (axis=1) les DataFrames cat_data (contenant les variables
catégoriques transformées en valeurs numériques) et num_data (contenant les variables
numériques). La variable cible y est également créée en utilisant la variable transformée target
• Phase 3 : Exploration de la donnée :

Dans cette étape, nous avons entrepris une exploration approfondie de la base de données. Nous avons
utilisé des techniques de visualisation pour mieux comprendre la distribution des données, identifier des
tendances et repérer d'éventuelles corrélations entre les différentes variables.
Le code dans la figure suivante nous avons fourni réalise deux tâches liées à l'analyse exploratoire des
données (EDA) :

• Affichage du décompte des valeurs de la variable cible (Loan_Status)


• Concatèner horizontalement les DataFrames cat_data, num_data, et target

Visualisation de la variable « Credit_History » en fonction de la variable cible

Visualisation de la variable « Gender » en fonction de la variable cible


Visualisation de la variable « Married » en fonction de la variable cible

Visualisation de la variable « Education » en fonction de la variable cible


Le code que nous avons fourni utilise la fonction « scatter » de « Matplotlib » pour créer un nuage de
points (scatter plot) représentant la relation entre le revenu du demandeur (ApplicantIncome) et le statut
du prêt (Loan_Status).
Le code que nous avons fourni utilise la fonction « scatter » de « Matplotlib » pour créer un nuage de
points (scatter plot) représentant la relation entre le revenu du conjoint de demandeur
(CoapplicantIncome) et le statut du prêt (Loan_Status).

La ligne de code « df.groupby('Loan_Status').median() » utilise la fonction « groupby » de Pandas pour


regrouper les données en fonction de la variable cible « Loan_Status » (crédit accepté ou refusé) et calcule
ensuite la médiane des valeurs pour chaque groupe

• Phase 4 et 5 : Exploitation de la donnée :

Au cours de cette phase, nous avons développé un modèle basé sur des algorithmes de machine Learning
pour prédire la solvabilité des clients. Nous avons entraîné le modèle en utilisant les données disponibles,
ajusté ses paramètres pour optimiser ses performances, et évalué sa précision à l'aide de métriques
appropriées.
Ce code utilise la stratégie de « shuffle » et de split stratifié pour diviser les données en ensembles
d'entraînement et de test de manière équilibrée par rapport à la variable cible (Loan_Status). Cela garantit
que les proportions d'acceptation et de refus de prêt sont similaires dans les ensembles d'entraînement et de
test.

Ce code met en œuvre l'entraînement et l'évaluation de trois modèles d'apprentissage automatique


(Logistic Regression, K-Nearest Neighbors, Decision Tree) sur des ensembles d'entraînement et de test.

• models : Un dictionnaire contenant trois modèles d'apprentissage automatique avec leurs


instances :
Logistic Regression (LogisticRegression).
K-Nearest Neighbors (KNeighborsClassifier).
Decision Tree (DecisionTreeClassifier).

• Fonction accu(y_true, y_pred, retu=False) : Une fonction qui calcule et imprime la précision du
modèle en comparant les vraies valeurs (y_true) avec les valeurs prédites (y_pred). L'argument
retu permet de retourner la précision si nécessaire.
• Fonction train_test_eval(models, X_train, y_train, X_test, y_test) : Une fonction qui itère sur les
modèles du dictionnaire models, entraîne chaque modèle sur l'ensemble d'entraînement, évalue sa
précision sur l'ensemble de test, et imprime les résultats.
• train_test_eval(models, X_train, y_train, X_test, y_test) : Appelle la fonction train_test_eval en
lui passant les modèles et les ensembles d'entraînement et de test
Ce code crée un nouveau DataFrame « X_2 » en sélectionnant trois colonnes spécifiques ('Credit_History',
'Married', 'CoapplicantIncome') à partir du DataFrame d'origine X. Ensuite, il divise cette nouvelle
DataFrame ainsi que la variable cible y en ensembles d'entraînement (X_train, y_train) et de test (X_test,
y_test) en utilisant la méthode de division stratifiée « StratifiedShuffleSplit ».

La ligne de code « train_test_eval(models, X_train, y_train, X_test, y_test) » appelle la fonction


« train_test_eval » pour entraîner les modèles sur le nouvel ensemble d'entraînement (X_train, y_train) et
les évaluer sur l'ensemble de test (X_test, y_test). Cette fonction utilise les modèles spécifiés dans le
dictionnaire « models » et imprime les précisions de chaque modèle.

Maintenant nous avons choisi la régression logistique parce qu’elle admet la précision le plus grande.

Ce code applique la régression logistique sur la base de données X_2 et la variable cible y. Voici une
explication brève du code :

• Classifier = LogisticRegression() : Crée une instance du modèle de régression logistique en


utilisant la classe LogisticRegression de scikit-learn.
• Classifier.fit(X_2, y) : Entraîne le modèle de régression logistique sur les données X_2 et la
variable cible y. La méthode fit ajustée les paramètres du modèle pour minimiser la perte et
rendre le modèle capable de prédire la variable cible.
• pickle.dump(Classifier, open('model.pkl', 'wb')) : Enregistre le modèle entraîné dans un fichier avec
le nom 'model.pkl' en utilisant le module pickle. Cela permet de sauvegarder le modèle pour une
utilisation ultérieure sans avoir à le réentraîner.

Finalement, Voici notre model enregistré dans le drive.

• Phase 6 : Mise en production (déploiement) :

Nous avons choisi le framework Flask pour mettre en production notre modèle. Flask nous a permis de
créer une interface utilisateur conviviale permettant à la banque d'effectuer des prédictions en temps réel
sur la solvabilité des clients. Le déploiement a été réalisé de manière à assurer la stabilité, la sécurité et la
scalabilité de l'application.

Vous aimerez peut-être aussi