Vous êtes sur la page 1sur 31

Project by Romuald KOUADIO - Data Analyst

USE CASE : PREVENTION DES RISQUES DE DEFAUT DE PAIEMENT DANS UNE INSTITUTION DE CREDIT

Dans ce Projet, il s'agira d'essayer de comprendre les facteurs expliquants le comportement des Clients
n'arrivant pas et/ou ne voulant pas rembourser les prets qui leurs sont accordés par l'Institution financière de
Crédit.

Dans cette Première partie, nous allons, par l'Analyse Exploratoire des données et des Tests d'hypothèses,
essayer de comprendre les facteurs sous-jacents expliquant un tel phénomène qui fait partie du quotidien des
Institutions de Crédit.

Concernant les Tests d'hypothèses que nous réaliserons, il s'agira de détecter l'association (corrélation) ou non
existante entre nos Features et notre Target.

Dans une Deuxième partie qui sera dédiée à l' Apprentissage Automatique , Nous allons développer un Modèle
ML qui nous permettra de Prédir des Risques de Défaut de Remboursement ou Non chez certains Emprunteurs.
Ce modèle devrait avoir le meilleur score de précision possible !

Pour ce faire, nous avons importé un jeu de données public disponible sur Kaggle :
https://www.kaggle.com/datasets/laotse/credit-risk-dataset ,retraçant l'historique de prets accordés au Clients
d'une Institut de Crédit. Chaque Client a été identifié comme étant En Defaut de Remboursement (1) ou Pas En
Defaut de Remboursement (0) !

Allons y !!!

Description des Variables de notre Dataset


1- person_age : fait référence à l'age de l'Emprunteur,

2- person_income : fait référence au revenu annuel de l'Emprunteur,

3- person_home_ownership : fait référence à l'accès à la propriété de l'Emprunteur: ('RENT', 'OWN',


'MORTGAGE', 'OTHER'),

4- person_emp_length : fait référence à la durée d'emploi (en année) de l'Emprunteur,

5- loan_intent : fait référence au motif de l'emprunt, ceux pourquoi l'emprunteur sollicite le crédit: ('PERSONAL',
'EDUCATION', 'MEDICAL', 'VENTURE', 'HOMEIMPROVEMENT', 'DEBTCONSOLIDATION'),

6- loan_grade : fait référence à la catégorie de l'emprunt: ('A', 'B', 'C', 'D', 'E', 'F', 'G'),

7- loan_amnt : fait référence au montant de l'emprunt,

8- loan_int_rate : fait référence au taux d'intéret du crédit,

9- loan_status (Target) : C'est la variable à prédire. Le statut de l'emprunt est soit 0 (Pas En Defaut de
Remboursement), soit 1 (En Defaut de Remboursement),

10- loan_percent_income : Taux de recouvrement du Pret,

11- cb_person_default_on_file : L'Emprunteur est-il fichié dans la base des clients ayant deja eu un defaut de
remboursement ? (Yes/No),

12- cb_person_cred_hist_length : Durée de l'historique de Crédit de l'Emprunteur

Les Dépendances
In [1]:
# Pour la manipulation de Tables et de Matrices

import numpy as np
import pandas as pd

# Pour la Visualisation des données


import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

plt.rcParams["figure.figsize"] = (12,8)
font = {'weight' : 'normal',
'size' : 12}
matplotlib.rc('font', **font)

import seaborn as sns

# Pour les Analyses statistique

from scipy.stats import chi2_contingency


from scipy.stats import pearsonr
from scipy.stats import spearmanr
from statsmodels.graphics.gofplots import qqplot
from statsmodels.stats.weightstats import ztest

# Pour le Machine Learning (ML)


from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

# Pour la Gestion des Warnings

import warnings
warnings.filterwarnings("ignore")

Collecte des données


In [2]:
# Chargement du jeu de données en DataFrame
loan_dataset = pd.read_csv('credit_risk_dataset.csv')

In [3]:
type(loan_dataset)
Out[3]:
pandas.core.frame.DataFrame

In [4]:
# Affichons les 5 premières lignes
loan_dataset.head()

Out[4]:

person_age person_income person_home_ownership person_emp_length loan_intent loan_grade loan_amnt loan_int_rate loa

0 22 59000 RENT 123.0 PERSONAL D 35000 16.02

1 21 9600 OWN 5.0 EDUCATION B 1000 11.14

2 25 9600 MORTGAGE 1.0 MEDICAL C 5500 12.87

3 23 65500 RENT 4.0 MEDICAL C 35000 15.23

4 24 54400 RENT 8.0 MEDICAL C 35000 14.27


In [5]:
# Affichons les 5 dernières lignes
loan_dataset.tail()
Out[5]:

person_age person_income person_home_ownership person_emp_length loan_intent loan_grade loan_amnt loa

32576 57 53000 MORTGAGE 1.0 PERSONAL C 5800

32577 54 120000 MORTGAGE 4.0 PERSONAL A 17625

32578 65 76000 RENT 3.0 HOMEIMPROVEMENT B 35000

32579 56 150000 MORTGAGE 5.0 PERSONAL B 15000

32580 66 42000 RENT 2.0 MEDICAL B 6475

In [6]:
# Nombre de lignes et colonnes de notre jeu de données
loan_dataset.shape

Out[6]:
(32581, 12)

In [7]:
# Affichons les colonnes
loan_dataset.columns
Out[7]:
Index(['person_age', 'person_income', 'person_home_ownership',
'person_emp_length', 'loan_intent', 'loan_grade', 'loan_amnt',
'loan_int_rate', 'loan_status', 'loan_percent_income',
'cb_person_default_on_file', 'cb_person_cred_hist_length'],
dtype='object')

In [8]:
# Les Types de données de Variables
loan_dataset.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 32581 entries, 0 to 32580
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 person_age 32581 non-null int64
1 person_income 32581 non-null int64
2 person_home_ownership 32581 non-null object
3 person_emp_length 31686 non-null float64
4 loan_intent 32581 non-null object
5 loan_grade 32581 non-null object
6 loan_amnt 32581 non-null int64
7 loan_int_rate 29465 non-null float64
8 loan_status 32581 non-null int64
9 loan_percent_income 32581 non-null float64
10 cb_person_default_on_file 32581 non-null object
11 cb_person_cred_hist_length 32581 non-null int64
dtypes: float64(3), int64(5), object(4)
memory usage: 3.0+ MB

Notre Jeu de données a 32581 observations avec au total 12 colonnes :

* 8 Colonnes numériques composées de types 'Integer' et 'Float'


* 4 Colonnes catégoriques de types 'Object'
Nettoyage des données
In [9]:
# Remplacer les valeurs 'Y' et 'N' en 0 et 1
loan_dataset = loan_dataset.replace("Y", 1)
loan_dataset = loan_dataset.replace("N", 0)

In [10]:
loan_dataset
Out[10]:

person_age person_income person_home_ownership person_emp_length loan_intent loan_grade loan_amnt loa

0 22 59000 RENT 123.0 PERSONAL D 35000

1 21 9600 OWN 5.0 EDUCATION B 1000

2 25 9600 MORTGAGE 1.0 MEDICAL C 5500

3 23 65500 RENT 4.0 MEDICAL C 35000

4 24 54400 RENT 8.0 MEDICAL C 35000

... ... ... ... ... ... ... ...

32576 57 53000 MORTGAGE 1.0 PERSONAL C 5800

32577 54 120000 MORTGAGE 4.0 PERSONAL A 17625

32578 65 76000 RENT 3.0 HOMEIMPROVEMENT B 35000

32579 56 150000 MORTGAGE 5.0 PERSONAL B 15000

32580 66 42000 RENT 2.0 MEDICAL B 6475

32581 rows × 12 columns

In [11]:
# Controle des Valeurs manquantes
loan_dataset.isna().any()
Out[11]:

person_age False
person_income False
person_home_ownership False
person_emp_length True
loan_intent False
loan_grade False
loan_amnt False
loan_int_rate True
loan_status False
loan_percent_income False
cb_person_default_on_file False
cb_person_cred_hist_length False
dtype: bool

In [12]:
# Identifions les valeurs manquantes de notre dataset

Nous allons Créer une fonction qui nous permettra de compter le Nombre de Valeurs Manquantes et de Calculer
leur Pourcentage pour chaque Variables de notre Dataset

In [13]:
cm = sns.light_palette("green", as_cmap = True)
def missing_value_table(donnees):
missing_value = donnees.isna().sum().sort_values(ascending=False)
missing_value_percent = 100 * donnees.isna().sum()//len(donnees)
missing_value_table = pd.concat([missing_value, missing_value_percent], axis=1)
missing_value_table_return = missing_value_table.rename(columns = {0:'Données manqua
ntes', 1:'%Taux'})
missing_value_table_return = missing_value_table_return.style.background_gradient(cma
p=cm)
return missing_value_table_return

missing_value_table(loan_dataset)
Out[13]:

Données manquantes %Taux

loan_int_rate 3116 9

person_emp_length 895 2

cb_person_cred_hist_length 0 0

cb_person_default_on_file 0 0

loan_percent_income 0 0

loan_status 0 0

loan_amnt 0 0

loan_grade 0 0

loan_intent 0 0

person_home_ownership 0 0

person_income 0 0

person_age 0 0

Notre jeu de données contient des Valeurs Manquantes au sein des variables "loan_int_rate" ( 3116 soit 9% des
valeurs totales ) et "person_emp_length" ( 895 soit 2% des valeurs totales ).

C'est quand meme bizarre que 9% des données de la Variable "loan_int_rate" (Taux d'intéret du pret) soit Null
alors qu'un pret est sensé etre accordé avec un taux d'intéret. C'est énorme ! Le Data Engineer ou l'Equipe
Métier doit nous éclaircir sur ce sujet.

Quant aux 2% de Valeurs manquantes au niveau de la variable "person_emp_length", faisant référence à la


durée d'emploi des Emprunteurs en Année, il pourrait s'agir des personnes qui n'ont jamais été employés. Mais
On va aussi se renseigner sur eux !

In [14]:
loan_dataset.dropna(inplace=True)

In [15]:
loan_dataset.isna().any()
Out[15]:
person_age False
person_income False
person_home_ownership False
person_emp_length False
loan_intent False
loan_grade False
loan_amnt False
loan_int_rate False
loan_status False
loan_percent_income False
cb_person_default_on_file False
cb_person_cred_hist_length False
dtype: bool
In [16]:
# Stats descriptives (ce sont les variables numériques qui sont présentées)
loan_dataset.describe().T.style.background_gradient(cmap=cm)
Out[16]:

count mean std min 25% 50% 75%

person_age 28638.000000 27.727216 6.310441 20.000000 23.000000 26.000000 30.000000

person_income 28638.000000 66649.371884 62356.447405 4000.000000 39480.000000 55956.000000 80000.000000 6000

person_emp_length 28638.000000 4.788672 4.154627 0.000000 2.000000 4.000000 7.000000

loan_amnt 28638.000000 9656.493121 6329.683361 500.000000 5000.000000 8000.000000 12500.000000

loan_int_rate 28638.000000 11.039867 3.229372 5.420000 7.900000 10.990000 13.480000

loan_status 28638.000000 0.216600 0.411935 0.000000 0.000000 0.000000 0.000000

loan_percent_income 28638.000000 0.169488 0.106393 0.000000 0.090000 0.150000 0.230000

cb_person_default_on_file 28638.000000 0.178190 0.382679 0.000000 0.000000 0.000000 0.000000

cb_person_cred_hist_length 28638.000000 5.793736 4.038483 2.000000 3.000000 4.000000 8.000000

Analyse Exploratoire des Données

Analyse Univariée
In [17]:
# Créons des Histogrammes afin d'observer les distributions
sns.distplot(loan_dataset['person_age'], kde=True,color='green');

Nous observons une distribution positivement asymétrique des Ages des Emprunteurs.

Il y a une forte proportion des Emprunteurs ayant entre 20 ans et 40 ans !


Il y a des Emprunteurs qui ont des Ages s'éloignant considérablement des autres. Ce sont des Outliers
(valeurs aberrantes) : Plus de 60 ans !

In [18]:
sns.distplot(loan_dataset['person_age'][loan_dataset['person_age']>60], kde=True,color='
green');

In [19]:
sns.distplot(loan_dataset['person_emp_length'], kde=True,color='green');
In [20]:
sns.distplot(loan_dataset['person_emp_length'][loan_dataset['person_emp_length']<30], kde
=True,color='green');

Il y a une forte proportion des Emprunteurs ayant entre 0 ans et 20 années d'expérience de Travail !

In [21]:
sns.distplot(loan_dataset['person_income'], kde=True,color='green');
In [22]:
sns.distplot(loan_dataset['person_income'][loan_dataset['person_income']<500000], kde=Tru
e,color='green');

Il y a une forte proportion des Emprunteurs ayant un Revenu Annuel inférieur ou égal à 200000 !

In [23]:
loan_dataset['person_home_ownership'].value_counts(normalize=True)*100
Out[23]:
RENT 50.810112
MORTGAGE 41.207487
OWN 7.654166
OTHER 0.328235
Name: person_home_ownership, dtype: float64

In [24]:
sns.countplot(loan_dataset['person_home_ownership']);
La Plupart des Emprunteurs sont soit en situation de Locataire 'RENT' (50%) ou d'Hypothèque 'MORTGAGE'
(41%) de leurs domiciles !

In [25]:
loan_dataset['loan_intent'].value_counts(normalize=True)*100
Out[25]:

EDUCATION 19.917592
MEDICAL 18.482436
VENTURE 17.462812
PERSONAL 17.029821
DEBTCONSOLIDATION 15.940359
HOMEIMPROVEMENT 11.166981
Name: loan_intent, dtype: float64

In [26]:
sns.countplot(loan_dataset['loan_intent']);

In [27]:
loan_dataset['loan_grade'].value_counts(normalize=True)*100

Out[27]:
A 32.830505
A 32.830505
B 31.954047
C 19.900133
D 11.341574
E 3.037922
F 0.729800
G 0.206020
Name: loan_grade, dtype: float64

In [28]:

sns.countplot(loan_dataset['loan_grade']);

In [29]:
sns.distplot(loan_dataset['loan_amnt'], kde=True,color='green');
Les prets accordés varient entre 500 et 35000 !

In [30]:
sns.distplot(loan_dataset['loan_int_rate'], kde=True,color='green');

Les prets sont accordés à des Taux d'Intéret qui varient entre 5,42% et 23,22% !

Il y a une forte Proportion de Prets accordés aux Taux d'intéret de :

5,42% - 7,5%
10% - 20%

In [31]:
loan_dataset['loan_status'].value_counts(normalize=True)*100

Out[31]:
0 78.339968
1 21.660032
Name: loan_status, dtype: float64

In [32]:
sns.countplot(loan_dataset['loan_status']);
78% des Emprunteurs arrivent à respecter leurs engagements de Remboursement des Prets qui leurs sont
accordés
22% des Emprunteurs sont en Defaut de Remboursement !

In [33]:
sns.distplot(loan_dataset['loan_percent_income'], kde=True,color='green');

Les Taux de Remboursement des Prets varient entre 2% et 83%


Il y a une forte proportion des Clients ayant des Taux de Remboursement compris entre 2% et 40%

In [34]:

loan_dataset['cb_person_default_on_file'].value_counts(normalize=True)*100
Out[34]:

0 82.181018
1 17.818982
Name: cb_person_default_on_file, dtype: float64

In [35]:

sns.countplot(loan_dataset['cb_person_default_on_file']);

82% des Emprunteurs ont des Antécédents de prets remboursés !


18% des Emprunteurs ont des Antécédents de Defaut de Remboursement (Impayés) !

Vérifions si les données sont normalement distribuées à l'aide d'un qqplot

In [36]:

qqplot(loan_dataset["person_age"].dropna(), fit=True, line="45")


plt.show();
In [37]:

qqplot(loan_dataset["person_income"].dropna(), fit=True, line="45")


plt.show();

In [38]:
qqplot(loan_dataset["person_emp_length"].dropna(), fit=True, line="45")
plt.show();
In [39]:
qqplot(loan_dataset["loan_amnt"].dropna(), fit=True, line="45")
plt.show();

In [40]:

qqplot(loan_dataset["loan_int_rate"].dropna(), fit=True, line="45")


plt.show();
In [41]:

qqplot(loan_dataset["loan_percent_income"].dropna(), fit=True, line="45")


plt.show();

Analyse Mutivariée
In [42]:

loan_dataset.groupby(['loan_status'])['person_age'].mean()
Out[42]:

loan_status
0 27.804636
1 27.447203
Name: person_age, dtype: float64

L' Age Moyen des Emprunteurs en Defaut de Remboursement est de 28 ans


L' Age Moyen des Emprunteurs Non en Defaut de Remboursement est de 27 ans

In [43]:

sns.distplot(loan_dataset.loc[loan_dataset['loan_status'] == 1, 'person_age'], label="En


Defaut")
sns.distplot(loan_dataset.loc[loan_dataset['loan_status'] == 0, 'person_age'], label="Pa
s en Defaut")
plt.legend();
In [44]:

sns.boxplot(data=loan_dataset,x='loan_status',y='person_age', hue='loan_status');

In [45]:

sns.kdeplot(loan_dataset['person_income'][loan_dataset['person_income']<500000],color='g
reen', hue=loan_dataset['loan_status']);
In [46]:

sns.kdeplot(loan_dataset['person_emp_length'][loan_dataset['person_emp_length']<30], hue
=loan_dataset['loan_status']);

In [47]:

sns.kdeplot(loan_dataset['loan_int_rate'],color='green', hue=loan_dataset['loan_status']
);
In [48]:

# Tableau de contingence
tab1=pd.crosstab(loan_dataset['person_home_ownership'],loan_dataset.loan_status).style.b
ackground_gradient(cmap = cm)
tab1

Out[48]:

loan_status 0 1

person_home_ownership

MORTGAGE 10316 1485

OTHER 67 27

OWN 2046 146

RENT 10006 4545

In [49]:
sns.countplot(data=loan_dataset, x="person_home_ownership",hue="loan_status");
In [50]:
# Tableau de contingence
tab2= pd.crosstab(loan_dataset['loan_intent'],loan_dataset.loan_status).style.background
_gradient(cmap = cm)
tab2

Out[50]:

loan_status 0 1

loan_intent

DEBTCONSOLIDATION 3269 1296

EDUCATION 4733 971

HOMEIMPROVEMENT 2377 821

MEDICAL 3872 1421

PERSONAL 3914 963

VENTURE 4270 731

In [51]:

sns.countplot(data=loan_dataset, x="loan_intent",hue="loan_status");

In [52]:
# Tableau de contingence
tab3= pd.crosstab(loan_dataset['loan_grade'],loan_dataset.loan_status).style.background_
gradient(cmap = cm)
tab3
Out[52]:

loan_status 0 1

loan_grade

A 8498 904
loan_status 0 1453
B 7698 1

loan_grade
C 4542 1157

D 1325 1923

E 308 562

F 63 146

G 1 58

In [53]:
sns.countplot(data=loan_dataset, x="loan_grade",hue="loan_status");

Les Prets de Grade 'D','E','F','G' comptent Plus d'Emprunteurs en Defaut de Paiement que de Bon Payeurs !

In [54]:
# Tableau de contingence
tab4= pd.crosstab(loan_dataset['cb_person_default_on_file'],loan_dataset.loan_status).st
yle.background_gradient(cmap = cm)
tab4
Out[54]:

loan_status 0 1

cb_person_default_on_file

0 19259 4276

1 3176 1927

In [55]:

sns.countplot(data=loan_dataset, x="cb_person_default_on_file",hue="loan_status");
In [56]:
loan_dataset.head()
Out[56]:

person_age person_income person_home_ownership person_emp_length loan_intent loan_grade loan_amnt loan_int_rate loa

0 22 59000 RENT 123.0 PERSONAL D 35000 16.02

1 21 9600 OWN 5.0 EDUCATION B 1000 11.14

2 25 9600 MORTGAGE 1.0 MEDICAL C 5500 12.87

3 23 65500 RENT 4.0 MEDICAL C 35000 15.23

4 24 54400 RENT 8.0 MEDICAL C 35000 14.27

In [57]:
loan_dataset['loan_grade'].replace(to_replace=['A','B','C','D','E','F','G'], value=[0,1,
2,3,4,5,6],inplace=True)
loan_dataset['person_home_ownership'].replace(to_replace=['RENT','OWN','MORTGAGE','OTHER
'], value=[0,1,2,3],inplace=True)
loan_dataset['loan_intent'].replace(to_replace=['PERSONAL','EDUCATION','MEDICAL','VENTURE
','HOMEIMPROVEMENT','DEBTCONSOLIDATION'], value=[0,1,2,3,4,5],inplace=True)
loan_dataset.head(3)
Out[57]:

person_age person_income person_home_ownership person_emp_length loan_intent loan_grade loan_amnt loan_int_rate loan

0 22 59000 0 123.0 0 3 35000 16.02

1 21 9600 1 5.0 1 1 1000 11.14

2 25 9600 2 1.0 2 2 5500 12.87

In [58]:

##### Sauvegardons notre jeu de données en format csv et excel


loan_dataset.to_csv('LoanFileOutput.csv')
loan_dataset.to_excel('LoanFileOutput.xlsx')
Interprètation de la Distribution des données
En observant ces graphiques, les données ne sont pas normalement distribuées !

Suggestions
Au regard de notre Analyse Exploratoire et tous les Traitements effectués précedemment, nous nous sommes
rendu comptes que nos données contenaient plusieurs valeurs aberrantes et n'étaient pas normalement
distribuées. Nous suggerons la réalisation de Test de Corrélation afin de détecter s'il existe une Relation Linéaire
entre nos variables ! Dans notre cas, une Analyse de Corrélation de Spearman serait appropriée !!!

In [59]:
# Correlation Matrix of features

corr = loan_dataset.corr()
ax = sns.heatmap(
corr,
annot=True,
vmin=-1, vmax=1, center=0,
cmap= sns.diverging_palette(20, 220, n=200),
square=True
)
ax.set_xticklabels(
ax.get_xticklabels(),
rotation=45,
horizontalalignment='right'
);
corr.style.background_gradient(cmap = cm)

Out[59]:

person_age person_income person_home_ownership person_emp_length loan_intent loan_grade loan

person_age 1.000000 0.178899 0.034177 0.165787 0.027579 0.013515 0.0

person_income 0.178899 1.000000 0.198445 0.136825 0.016808 0.001392 0.2

person_home_ownership 0.034177 0.198445 1.000000 0.232468 0.018167 -0.115950 0.1

person_emp_length 0.165787 0.136825 0.232468 1.000000 0.016237 -0.049265 0.1

loan_intent 0.027579 0.016808 0.018167 0.016237 1.000000 0.011253 0.0

loan_grade 0.013515 0.001392 -0.115950 -0.049265 0.011253 1.000000 0.1

loan_amnt 0.054172 0.265879 0.128325 0.110759 0.018185 0.149937 1.0

loan_int_rate 0.011019 -0.001381 -0.135297 -0.056405 0.007446 0.933497 0.1

loan_status -0.023333 -0.139938 -0.215998 -0.082638 0.064440 0.379683 0.1

loan_percent_income -0.041065 -0.251511 -0.135130 -0.055167 -0.001902 0.125788 0.5

cb_person_default_on_file 0.007765 -0.002709 -0.061136 -0.027863 0.007620 0.535833 0.0

cb_person_cred_hist_length 0.859544 0.117076 0.024733 0.146336 0.017446 0.014570 0.0


Test d'Hypothèse
Test de Significativité du Coeficient de Corrélation de Spearman !

Questions:
1. Existe t-il une Relation entre 'person_age' et 'loan_status' ?
2. Existe t-il une Relation entre 'person_income' et 'loan_status' ?
3. Existe t-il une Relation entre 'person_home_ownership' et 'loan_status' ?
4. Existe t-il une Relation entre 'person_emp_length' et 'loan_status' ?
5. Existe t-il une Relation entre 'loan_intent' et 'loan_status' ?
6. Existe t-il une Relation entre 'loan_grade' et 'loan_status' ?
7. Existe t-il une Relation entre 'loan_amnt' et 'loan_status' ?
8. Existe t-il une Relation entre 'loan_int_rate' et 'loan_status' ?
9. Existe t-il une Relation entre 'loan_percent_income' et 'loan_status' ?
10. Existe t-il une Relation entre 'cb_person_default_on_file' et 'loan_status' ?

In [60]:
# Créons un tableau numpy 2D à partir de loan_data_to_test
loan_data_to_test_array = loan_dataset.values

In [61]:

loan_data_to_test_array_scaled = preprocessing.StandardScaler().fit(loan_data_to_test_arr
ay).transform(loan_data_to_test_array)
loan_data_to_test_array_scaled

Out[61]:
array([[-0.90759357, -0.12267385, -0.94657827, ..., 3.95252678,
2.14755511, -0.69179063],
[-1.06606387, -0.91490728, 0.09300251, ..., -0.65314095,
-0.46564579, -0.93941272],
[-0.43218267, -0.91490728, 1.1325833 , ..., 3.76454035,
-0.46564579, -0.69179063],
...,
[ 5.9066293 , 0.14995709, -0.94657827, ..., 2.73061494,
-0.46564579, 5.4987615 ],
[ 4.4803966 , 1.33670353, 1.1325833 , ..., -0.65314095,
-0.46564579, 5.00351733],
[ 6.06509959, -0.39530479, -0.94657827, ..., -0.18317486,
-0.46564579, 5.99400567]])
-0.46564579, 5.99400567]])

In [62]:
person_age_array_scaled = loan_data_to_test_array_scaled[:,0]
person_income_array_scaled = loan_data_to_test_array_scaled[:,1]
person_home_ownership_array_scaled = loan_data_to_test_array_scaled[:,2]
person_emp_length_array_scaled = loan_data_to_test_array_scaled[:,3]
loan_intent_array_scaled = loan_data_to_test_array_scaled[:,4]
loan_grade_array_scaled = loan_data_to_test_array_scaled[:,5]
loan_amnt_array_scaled = loan_data_to_test_array_scaled[:,6]
loan_int_rate_array_scaled = loan_data_to_test_array_scaled[:,7]
loan_status_array_scaled = loan_data_to_test_array_scaled[:,8]
loan_percent_income_array_scaled = loan_data_to_test_array_scaled[:,9]
cb_person_default_on_file_array_scaled = loan_data_to_test_array_scaled[:,10]
cb_person_cred_hist_length_array_scaled = loan_data_to_test_array_scaled[:,11]

In [63]:
person_age_array_scaled

Out[63]:
array([-0.90759357, -1.06606387, -0.43218267, ..., 5.9066293 ,
4.4803966 , 6.06509959])

Analyse de Corrélation à l'aide du module Spearmanr de Scipy

Existe t-il une Relation Linéaire entre 'person_age' et 'loan_status' ?

------------------------
Test-1:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'person_age' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'person_age' et la target 'loan_status' .

Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !

In [64]:
stat, pval = spearmanr(person_age_array_scaled, loan_status_array_scaled)
print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable person_age et loan_sta
tus .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable person_age et loan_status .
(Probablement dépendant)")

stat=-0.034, pval=0.000
H1: Il existe une Relation Linéaire entre la variable person_age et loan_status .(Probabl
ement dépendant)

Existe t-il une Relation Linéaire entre 'person_income' et 'loan_status' ?

------------------------
Test-2:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'person_income' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'person_income' et la target 'loan_status' .

Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !


In [65]:
stat, pval = spearmanr(person_income_array_scaled, loan_status_array_scaled)
print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable person_income et loan_
status .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable person_income et loan_statu
s .(Probablement dépendant)")

stat=-0.265, pval=0.000
H1: Il existe une Relation Linéaire entre la variable person_income et loan_status .(Prob
ablement dépendant)

Existe t-il une Relation Linéaire entre 'person_home_ownership' et 'loan_status' ?

------------------------
Test-3:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'person_home_ownership' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'person_home_ownership' et la target 'loan_status' .

Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !

In [66]:

stat, pval = spearmanr(person_home_ownership_array_scaled, loan_status_array_scaled)


print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable person_home_ownership
et loan_status .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable person_home_ownership et lo
an_status .(Probablement dépendant)")

stat=-0.219, pval=0.000
H1: Il existe une Relation Linéaire entre la variable person_home_ownership et loan_statu
s .(Probablement dépendant)

Existe t-il une Relation Linéaire entre 'person_emp_length' et 'loan_status' ?

------------------------
Test-4:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'person_emp_length' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'person_emp_length' et la target 'loan_status' .

Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !

In [67]:
stat, pval = spearmanr(person_emp_length_array_scaled, loan_status_array_scaled)
print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable person_emp_length et l
oan_status .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable person_emp_length et loan_s
tatus .(Probablement dépendant)")

stat=-0.098, pval=0.000
stat=-0.098, pval=0.000
H1: Il existe une Relation Linéaire entre la variable person_emp_length et loan_status .(
Probablement dépendant)

Existe t-il une Relation Linéaire entre 'loan_intent' et 'loan_status' ?

------------------------
Test-5:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'loan_intent' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'loan_intent' et la target 'loan_status' .

Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !

In [68]:
stat, pval = spearmanr(loan_intent_array_scaled, loan_status_array_scaled)
print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable loan_intent et loan_st
atus .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable loan_intent et loan_status
.(Probablement dépendant)")

stat=0.061, pval=0.000
H1: Il existe une Relation Linéaire entre la variable loan_intent et loan_status .(Probab
lement dépendant)

Existe t-il une Relation Linéaire entre 'loan_grade' et 'loan_status' ?

------------------------
Test-6:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'loan_grade' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'loan_grade' et la target 'loan_status' .

Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !

In [69]:
stat, pval = spearmanr(loan_grade_array_scaled, loan_status_array_scaled)
print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable loan_grade et loan_sta
tus .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable loan_grade et loan_status .
(Probablement dépendant)")

stat=0.339, pval=0.000
H1: Il existe une Relation Linéaire entre la variable loan_grade et loan_status .(Probabl
ement dépendant)

Existe t-il une Relation Linéaire entre 'loan_amnt' et 'loan_status' ?

------------------------
Test-7:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'loan_amnt' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'loan_amnt' et la target 'loan_status' .
Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !

In [70]:

stat, pval = spearmanr(loan_amnt_array_scaled, loan_status_array_scaled)


print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable loan_amnt et loan_stat
us .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable loan_amnt et loan_status .(
Probablement dépendant)")

stat=0.093, pval=0.000
H1: Il existe une Relation Linéaire entre la variable loan_amnt et loan_status .(Probable
ment dépendant)

Existe t-il une Relation Linéaire entre 'loan_int_rate' et 'loan_status' ?

------------------------
Test-8:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'loan_int_rate' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'loan_int_rate' et la target 'loan_status' .

Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !

In [71]:
stat, pval = spearmanr(loan_int_rate_array_scaled, loan_status_array_scaled)
print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable loan_int_rate et loan_
status .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable loan_int_rate et loan_statu
s .(Probablement dépendant)")

stat=0.324, pval=0.000
H1: Il existe une Relation Linéaire entre la variable loan_int_rate et loan_status .(Prob
ablement dépendant)

Existe t-il une Relation Linéaire entre 'loan_percent_income' et 'loan_status' ?

------------------------
Test-9:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'loan_percent_income' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'loan_percent_income' et la target 'loan_status' .

Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !

In [72]:
stat, pval = spearmanr(loan_percent_income_array_scaled, loan_status_array_scaled)
print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable loan_percent_income et
loan_status .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable loan_percent_income et loan
_status .(Probablement dépendant)")

stat=0.314, pval=0.000
H1: Il existe une Relation Linéaire entre la variable loan_percent_income et loan_status
.(Probablement dépendant)

Existe t-il une Relation Linéaire entre 'cb_person_default_on_file' et 'loan_status' ?

------------------------
Test-10:------------------------

H0: Il n'existe pas de Relation Linéaire entre la variable 'cb_person_default_on_file' et la target 'loan_status' .

H1: Il existe une Relation Linéaire entre la variable 'cb_person_default_on_file' et la target 'loan_status' .

Interprètation du Test

Si p-value > 0.05 , On va Rejetter l'Hypothèse H0 et Accepter l'Hypothèse Alternative H1 !

In [73]:
stat, pval = spearmanr(cb_person_default_on_file_array_scaled, loan_status_array_scaled)
print('stat=%.3f, pval=%.3f' % (stat, pval))
if pval > 0.05:
print("H0: Il n'existe pas de Relation Linéaire entre la variable cb_person_default_on_f
ile et loan_status .(Probablement indépendant)")
else:
print("H1: Il existe une Relation Linéaire entre la variable cb_person_default_on_file e
t loan_status .(Probablement dépendant)")

stat=0.182, pval=0.000
H1: Il existe une Relation Linéaire entre la variable cb_person_default_on_file et loan_s
tatus .(Probablement dépendant)

Interprètation de l'Analyse des Corrélations


1- Nous remarquons que la plupart des Variables X ont une Relation Linéaire avec la Target Mais avec un
Coéfficient de Corrélation faible (Pas Significatif) :

On voit : 0.5 > r > 0 !

Exemple :

loan_intent : Coéfficient de Corrélation ---> 0.06


loan_grade : Coéfficient de Corrélation ---> 0.3
loan_amnt : Coéfficient de Corrélation ---> 0.09
loan_int_rate : Coéfficient de Corrélation ---> 0.3
loan_percent_income : Coéfficient de Corrélation ---> 0.3
cb_person_default_on_file : Coéfficient de Corrélation ---> 0.18

2- Cependant, il existe de forte Corrélation entre les Features:

loan_int_rate et loan_grade : Coéfficient de Corrélation ---> 0.93


person_age et cb_person_cred_hist_length : Coéfficient de Corrélation ---> 0.86
loan_amnt et loan_percent_income : Coéfficient de Corrélation ---> 0.58

Reponse à la question posée dans le post LinkedIn :


Au regard du Test effectué, nous pouvons estimer *avec moins de certitude que le Taux d'Intéret du Crédit
('loan_int_rate') accordé au Client est lié à la probabilité que celui-ci soit en Défaut de Remboursement ou
Non ('loan_status' = 0 / 1)

Vous aimerez peut-être aussi