Modélisation du Risque de Crédit
Modélisation du Risque de Crédit
MODELISATION DU RISQUE DE
Code
CREDIT
07/07/2024
L’objectif de ce projet est de décrire le processus de développement d’un modèle de notation de crédit à
la consommation. La modélisation de la probabilité de défaut (PD) est un concept clé pour classifier les
emprunteurs selon leur risque de défaut de paiement.
1. Le revenu plus élevé ainsi que la durée de l’activité professionnelle plus longue de l’emprunteur
réduisent le risque de défaut de paiement. Cela souligne l’importance de la stabilité financière et de
l’expérience professionnelle dans l’évaluation du risque de crédit.
2. Le taux d’endettement plus élevé entraîne une forte augmentation du risque de défaut de paiement.
Ce ratio est crucial pour évaluer la capacité de l’emprunteur à gérer ses dettes par rapport à ses
revenus.
3. Être propriétaire d’un logement diminue la probabilité de défaut de paiement, tandis qu’être locataire
l’augmente. Cette observation pourrait s’expliquer par les dépenses potentiellement moins
importantes et par le patrimoine plus solide des propriétaires par rapport aux locataires.
4. La probabilité de défaut de paiement augmente avec la dégradation des classes de solvabilité. Les
emprunteurs classés dans les catégories inférieures (D, E, F) ont un risque de défaut plus élevé
comparé à ceux classés dans les catégories supérieures (A, B, C).
5. Le taux d’intérêt plus élevé accroît considérablement le risque de défaut de paiement. Cela peut
s’expliquer par la charge financière plus importante, rendant ainsi le remboursement plus difficile.
6. Les prêts destinés à l’éducation, aux besoins médicaux, aux dépenses personnelles ou aux affaires
sont moins risqués pour les banques. En revanche, les prêts pour les travaux de rénovation et la
consolidation des dettes présentent un risque plus élevé de défaut de paiement.
Ce modèle présente une performance de classification élevée, avec une précision de 87 % pour identifier
les emprunteurs potentiels en fonction de leur risque de défaut.
Axes d’amélioration:
1. Élargir la base de données : intégrer des caractéristiques supplémentaires des emprunteurs afin de
capturer davantage de nuances dans les profils de risque.
2. Actualiser régulièrement: mettre à jour régulièrement le modèle avec de nouvelles données pour
s’adapter aux changements du marché et des comportements des emprunteurs.
3. Ajuster les seuils de classification: définir les seuils de manière à maximiser la performance du
modèle en fonction des objectifs spécifiques de la banque.
Donc, ce modèle actuel constitue une base solide pour la prise de décision en matière d’octroi de prêts.
Cependant, l’intégration de nouvelles données et la mise à jour continue permettront d’optimiser encore
davantage la gestion du risque de crédit et de renforcer la robustesse des prédictions.
[1] "/Users/patash/Documents/GitHub/Credit_scoring"
Hide
Hide
# Importer le dataset
df <- [Link]("credit_risk.csv", header = TRUE, sep = ",", dec = ".")
# Structure de la dataframe
str(df)
Hide
summary(df)
cb_person_cred_hist_length
Min. : 2.000
1st Qu.: 3.000
Median : 4.000
Mean : 5.804
3rd Qu.: 8.000
Max. :30.000
Valeurs manquantes
Hide
[Link]("naniar")
Hide
library(naniar)
vis_miss(df)
Hide
[1] 32581
Hide
# Variable person_emp_length
[1] 0
Hide
# Variable loan_int_rate
index_NA_loan_int_rate <- which([Link](df_clean$loan_int_rate))
df_clean$loan_int_rate[index_NA_loan_int_rate] <- median(df_clean$loan_int_rate, n
[Link] = TRUE)
sum([Link](df_clean$loan_int_rate))
[1] 0
Hide
# Boxplots
# age
boxplot(df_clean$person_age, main = "Age")
Hide
# income
boxplot(df_clean$person_income, main = "Revenu")
Hide
# emp_lenght
boxplot(df_clean$person_emp_length, main = "Durée de l'activité pro")
Hide
# loan_percent_income
boxplot(df_clean$loan_percent_income, main = "Ratio dette/revenu")
Hide
# cred_hist_length
boxplot(df_clean$cb_person_cred_hist_length, main = "Historique des antécédents de
crédit")
Hide
# loan_amnt
boxplot(df_clean$loan_amnt, main = "Montant du prêt")
Hide
# loan_int_rate
boxplot(df_clean$loan_int_rate, main = "Taux d'intérêt")
Hide
# 'person_income'
# Calculer les quartiles et l'IQR
Q1 <- quantile(df_clean$person_income, 0.25)
Q3 <- quantile(df_clean$person_income, 0.75)
IQR <- Q3 - Q1
Hide
# 'person_age'
Hide
# 'person_emp_length'
Hide
Hide
str(df_clean)
Analyse univariée
Variable-cible ‘loan_status’
Hide
# Table et proportions
loan_status_table <- table(df_clean$loan_status)
proportions_loan_status <- round([Link](loan_status_table) * 100, 1)
labels <- paste(names(loan_status_table), "\n", proportions_loan_status, "%", sep
="")
# Diagramme en camembert
pie(loan_status_table, labels = labels, main = " Taux de défaut", col = c("red", "
green"))
Variables-facteurs
Hide
# age
hist(df_clean$person_age, main = "Age", col = "blue")
Hide
# income
hist(df_clean$person_income, main = "Revenu", col = "green")
Hide
# emp_lenght
hist(df_clean$person_emp_length, main = "Durée de l'activité pro", col = "red")
Hide
# loan_amnt
hist(df_clean$loan_amnt, main = "Montant du prêt", col = "orange")
Hide
# loan_int_rate
hist(df_clean$loan_int_rate, main = "Taux d'intérêt", col = "purple")
Hide
# loan_percent_income
hist(df_clean$loan_percent_income, main = "Ratio dette/revenu", col = "brown")
Hide
#cred_hist_length
hist(df_clean$cb_person_cred_hist_length, main = "Durée des antécédents de crédits
", col = "violet")
Hide
# 'home_ownership'
barplot_proportion( "person_home_ownership", df_clean, "Propriété des biens immobi
liers")
Hide
# 'loan_intent'
barplot_proportion("loan_intent", df_clean, "Motifs de prêt")
Hide
# + camembert
loan_intent_table<- table(df_clean$loan_intent)
proportions_loan_intent<- round([Link](loan_intent_table) * 100, 1)
labels <- paste(names(loan_intent_table), "\n", proportions_loan_intent, "%", sep
="")
pie(loan_intent_table, labels = labels, main = "Motifs de prêt")
Hide
# 'loan_grade'
barplot_proportion("loan_grade", df_clean, "Catégories d'emprunteurs")
Hide
# 'default_on_file'
barplot_proportion("cb_person_default_on_file",df_clean, "Défaut de paiement dans
le passé ")
Hide
# 'loan_status'
barplot_proportion("loan_status", df_clean, "Défaut de paiement")
Analyse bivariée
Hide
[Link]("ggplot2")
Hide
[Link]("gridExtra")
Hide
[Link]("RColorBrewer")
Hide
[Link]("ggplot2")
Hide
library(ggplot2)
library(gridExtra)
library(RColorBrewer)
Variables qualitatives
Hide
# Convertir en factor
df_clean$person_home_ownership <- factor(df_clean$person_home_ownership, ordered =
FALSE)
df_clean$loan_intent<- factor(df_clean$loan_intent, ordered = FALSE)
df_clean$loan_grade <- factor(df_clean$loan_grade, ordered = FALSE)
df_clean$cb_person_default_on_file <- factor(df_clean$cb_person_default_on_file, o
rdered = FALSE)
# 'home_ownership'
ggplot(df_clean, aes(x = loan_status, fill = person_home_ownership)) +
geom_bar(position = "fill") +
labs(title = "Propriété des biens immobiliers et défaut de paiement",
x = "Défaut de paiement",
y = "Proportion") +
scale_fill_brewer(palette = "Set1") +
theme_minimal()
Hide
# 'loan_intent'
ggplot(df_clean, aes(x = loan_status, fill = loan_intent)) +
geom_bar(position = "fill") +
labs(title = "Motifs de prêt et défaut de paiement",
x = "Défaut de paiement",
y = "Proportion") +
scale_fill_brewer(palette = "Set1") +
theme_minimal()
Hide
# 'loan_grade'
ggplot(df_clean, aes(x = loan_status, fill = loan_grade)) +
geom_bar(position = "fill") +
labs(title = "Catégories d'emprunteurs et défaut de paiement",
x = "Défaut de paiement",
y = "Proportion") +
scale_fill_brewer(palette = "Set1") +
theme_minimal()
Hide
# 'default_on_file'
ggplot(df_clean, aes(x = loan_status, fill = cb_person_default_on_file)) +
geom_bar(position = "fill") +
labs(title = "Défaut de paiement dans le passé et défaut de paiement",
x = "Défaut de paiement",
y = "Proportion") +
scale_fill_brewer(palette = "Set1") +
theme_minimal()
Hide
# Chi-carré
chi_squared_test <- [Link](contingency_table)
# V de Cramer
cramer_v <- sqrt(chi_squared_test$statistic / (nrow(df) * (min(nrow(contingency_
table), ncol(contingency_table)) - 1)))
4 rows
Les tests Chi-square indiquent une association significative entre toutes les variables qualitatives et la
variable-cible avec des niveaux de significativité très élevés (P-value << 0.05). Les valeurs de Cramers V
montrent que ‘loan_grade’ a l’effet le plus marqué sur ‘loan_status’ (30 % des clients en défaut
appartiennent à la catégorie D), suivi par ‘person_home_ownership’ (74 % des clients en défaut louent leur
logement et 23 % ont une hypothèque), ‘cb_person_default_on_file’ (70 % des clients en défaut n’ont pas
eu de défaut de paiement dans le passé), et enfin ’loan_intent.
Variables quantitatives
Hide
# 'person_age'
ggplot(df_clean, aes(x = factor(loan_status), y = person_age, fill = factor(loan_s
tatus))) +
geom_boxplot() +
labs(title = "Âge et Défaut de paiement",
x = "Défaut de Paiement",
y = "Âge") +
theme_minimal()
Hide
# 'person_income'
ggplot(df_clean, aes(x = factor(loan_status), y = person_income, fill = factor(loa
n_status))) +
geom_boxplot() +
labs(title = "Revenu et Défaut de paiement",
x = "Défaut de Paiement",
y = "Revenu") +
theme_minimal()
Hide
# 'person_emp_length'
ggplot(df_clean, aes(x = factor(loan_status), y = person_emp_length, fill = facto
r(loan_status))) +
geom_boxplot() +
labs(title = "Durée de l'acticité pro et Défaut de paiement",
x = "Défaut de Paiement",
y = "Durée de l'activité pro") +
theme_minimal()
Hide
# 'loan_amnt'
ggplot(df_clean, aes(x = factor(loan_status), y = loan_amnt, fill = factor(loan_st
atus))) +
geom_boxplot() +
labs(title = "Montant du prêt et Défaut de paiement",
x = "Défaut de Paiement",
y = "Montant du prêt") +
theme_minimal()
Hide
# 'loan_int_rate'
ggplot(df_clean, aes(x = factor(loan_status), y = loan_int_rate, fill = factor(loa
n_status))) +
geom_boxplot() +
labs(title = "Taux d'intérêt et Défaut de paiement",
x = "Défaut de Paiement",
y = "Taux d'intérêt") +
theme_minimal()
Hide
# 'loan_percent_income'
ggplot(df_clean, aes(x = factor(loan_status), y = loan_percent_income, fill = fact
or(loan_status))) +
geom_boxplot() +
labs(title = "Ration dette/revenu et Défaut de paiement",
x = "Défaut de Paiement",
y = "Ration dette/revenu") +
theme_minimal()
Hide
# 'cb_person_cred_hist_length'
ggplot(df_clean, aes(x = factor(loan_status), y = cb_person_cred_hist_length, fill
= factor(loan_status))) +
geom_boxplot() +
labs(title = "Durée des antécédents de crédits et Défaut de paiement",
x = "Défaut de Paiement",
y = "Durée des antécédents de crédits") +
theme_minimal()
Hide
# Résultats du test
results <- [Link](Variable = character(), Kruskal_Wallis = numeric(), P_value
= numeric())
variables_numeriques <- c("person_age", "person_income", "person_emp_length",
"loan_amnt", "loan_int_rate", "loan_percent_income",
"cb_person_cred_hist_length")
# test de Kruskal-Wallis
for (var in variables_numeriques) {
kruskal_test <- [Link](df_clean[[var]] ~ df_clean$loan_status)
7 rows
Les tests Kruskal-Wallis constatent la liaison significative entre toutes les variables quantitatives et la
variable-cible, avec des niveaux de significativité très élevés (P-value << 0.05). Les valeurs de la statistique
Kruskal_Wallis montrent que ‘person_income’ a l’effet le plus marqué sur ‘loan_status’ (médiane des
revenus des clients en défaut de paiement est de 38K€, contrairement à celle des clients qui remboursent,
qui est de 58K€), suivi par ‘loan_int_rate’ (médiane des taux d’intérêt des clients en défaut de paiement est
de 13%, contrairement à celle des clients qui remboursent, qui est de 11,25%), ‘loan_persent_income’
(médiane des ratios dette/revenu des clients en défaut de paiement est de 23%, contrairement à celle des
clients qui remboursent, qui est de 14%).
Multicolinéarité
Hide
Hide
library(corrplot)
Hide
Hide
# VIF
[Link]("car")
Hide
library(car)
Hide
Les valeurs du VIF (facteur d’inflation de la variance) des variables explicatives numériques sont inférieures
à 10, ce qui indique qu’il n’y a pas de multicolinéarité élevée.
Lors de l’analyse exploratoire, on a remarqué que les moyennes et les écarts-types varient
considérablement d’une variable à l’autre. Cela indique que les données ne sont pas à la même échelle. Il
faudra donc les normaliser avant de modéliser afin d’obtenir des résultats plus précis.
# Normalisation des données (répartir les valeurs entre 0 et 1 tout en gardant les
distributions originales)
for (col in names(df_clean_norm)) {
if () {
df_clean_norm[[col]] <- normalize(df_clean_norm[[col]])
}
}
head(df_clean_norm)
Hide
print(nrow(train_set))
[1] 24872
Hide
print(nrow(test_set))
[1] 6219
Hide
0 1
0.7731586 0.2268414
Hide
0 1
0.7877472 0.2122528
Lors de l’analyse de la fréquence de la variable cible ‘loan_status’ dans les ensembles de données
d’entraînement et de test, on constate un déséquilibre dans la distribution des classes (77% - 23% - train,
79% - 21% - test). Pour résoudre le problème de déséquilibre de classe et améliorer la performance de
classification, on peut appliquer les techniques de rééchantillonnage ROS (Random Over Sampling) et
RUS (Random Under Sampling), puis comparer les courbes ROC et les valeurs AUC pour choisir le
mellieur jeu de données. Les méthodes de rééchantillonnage des données on applique uniquement aux
données d’entraînement. Inconvénient du ROS: il crée beaucoup de doublons d’information, ce qui peut
causer des biais importants lors de l’entraînement. Inconvénient du RUS: il supprime beaucoup
d’informations. Après avoir comparé les courbes ROC et les valeurs AUC, on constate qu’il n’y a pas de
différence significative entre les trois jeux de données (AUC ROC: 0,868, AUC RUS:0,869, AUC train_set:
0,867). Par conséquent, on va utiliser le jeu de données d’origine.
4. Entraînement du modèle
Régression logistique
Hide
Call:
glm(formula = loan_status ~ ., family = "binomial", data = train)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.42885 0.12638 -27.132 < 2e-16 ***
person_age -0.13983 0.38479 -0.363 0.716314
person_income -0.80094 0.24010 -3.336 0.000850 ***
person_home_ownershipOTHER 0.39443 0.30616 1.288 0.197629
person_home_ownershipOWN -1.66639 0.11152 -14.943 < 2e-16 ***
person_home_ownershipRENT 0.81809 0.04584 17.845 < 2e-16 ***
person_emp_length -0.58954 0.22570 -2.612 0.009001 **
loan_intentEDUCATION -0.85906 0.06451 -13.318 < 2e-16 ***
loan_intentHOMEIMPROVEMENT 0.12583 0.07208 1.746 0.080858 .
loan_intentMEDICAL -0.20651 0.06099 -3.386 0.000709 ***
loan_intentPERSONAL -0.60259 0.06552 -9.197 < 2e-16 ***
loan_intentVENTURE -1.07653 0.06980 -15.423 < 2e-16 ***
loan_gradeB 0.23523 0.07158 3.286 0.001016 **
loan_gradeC 0.46440 0.10205 4.551 5.34e-06 ***
loan_gradeD 2.50240 0.12551 19.937 < 2e-16 ***
loan_gradeE 2.73360 0.16282 16.789 < 2e-16 ***
loan_gradeF 2.96751 0.24696 12.016 < 2e-16 ***
loan_gradeG 16.90361 110.58505 0.153 0.878512
loan_amnt -3.24433 0.29627 -10.951 < 2e-16 ***
loan_int_rate 1.13703 0.25862 4.396 1.10e-05 ***
loan_percent_income 10.32291 0.36977 27.917 < 2e-16 ***
cb_person_default_on_fileY 0.03047 0.05677 0.537 0.591515
cb_person_cred_hist_length -0.05305 0.28313 -0.187 0.851377
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Résultats: 1. Plus le revenu et la durée de l’activité professionnelle d’un demandeur de prêt sont élevés,
moins il est probable qu’il soit en défaut de paiement. 2. Plus le ratio dette/revenu est élevé, plus il est
probable d’être en défaut de paiement. 3. Être propriétaire d’un logement diminue la probabilité d’être en
défaut de paiement, par rapport à ceux qui ont une hypothèque, tandis qu’être locataire augmente cette
probabilité. 4. Plus le taux d’intérêt est élevé, plus il est probable d’être en défaut de paiement. En
revanche, plus le montant du prêt est élevé, moins il est probable d’être en défaut de paiement. 5. Les
motifs de prêt tels que ‘éducation’, ‘médical’, ‘personnel’, et ‘business’ ont une probabilité moins
importante d’être en défaut de paiement par rapport à ‘consolidation de dette’ et ‘travaux’. 6. Être dans les
catégories B, C, D, E, ou F augmente la probabilité de défaut de paiement par rapport à la catégorie A.
Hide
Hide
[Link]("DMwR2")
Hide
library(DMwR2)
Hide
[Link]("lmtest")
Hide
library(lmtest)
[Link], [Link]
Hide
Hide
[1] 0.3563152
Nos variables prédictives, malgré leur effet significatif, expliquent 35,6 % de la décision d’être en défaut de
paiement. Donc, pour prédire plus justement les éventuels défauts de paiement, il faut enrichir notre base
de données avec d’autres caractéristiques des emprunteurs.
Hide
# Créer un tableau avec les noms des variables et leurs rapports de cotes
variables <- names(coefficients)
tableau_odds_ratios <- [Link](Variable = variables, OddsRatio = odds_ratios)
Variable OddsRatio
<chr> <dbl>
Odds ratios Emprunteur: ‘revenu’ (0,45) ‘durée de l’actitivté’ (0,55) ‘ratio dette/revenu’(30421) ‘hypothèque’
(référence) ‘propriétaire’ (0,19) ‘locataire’ (2,27) ‘grade A’ (référence) ‘grade B’ (1,26) ‘grade C’ (1,59) ‘grade
D’ (12,2) ‘grade E’ (15,4) ‘grade F’ (19,4) Prêt: ‘montant du prêt’ (0,04) ‘taux d’intrérêt’ (3,12)
‘motif_consolidation_dette’ (référence) ‘motif_éducation’ (0,42) ‘motif_travaux’ (1,13) ‘motif_médical’ (0,81)
‘motif_personnel’ (0,34) ‘motif_business’ (0,55)
Résultats: 1. Si le revenu (OR=0,45 < 1) ou la durée de l’activité professionnelle (OR=0,55 < 1) augmente
d’une unité, le risque de défaut de paiement diminue. 2. Si le ratio dette/revenu (OR=30421 >> 1)
augmente d’une unité, le risque de défaut de paiement augmente fortement. 3. Être propriétaire d’un
logement (OR=0,19 <1) diminue la probabilité d’être en défaut de paiement, tandis qu’être locataire
(OR=2,27 >1) augmente cette probabilité. 4. Si le taux d’intérêt (OR =3,12 > 1) augmente d’une unité, le
risque de défaut de paiement augmente. En revanche, si le montant du prêt augmente d’une unité, le
risque diminue (OR=0,04 < 1 - proche de l’indépendance). 5. Les motifs de prêt tels que ‘éducation’
(OR=0,42 <1), ‘médical’ (OR=0,81 <1), ‘personnel’ (OR=0,34 <1), et ‘business’ (OR=0,55 <1) diminuent la
probabilité d’être en défaut de paiement. En revanche le motif ‘travaux’ augment cette probabilité
(OR=1,13 >1). 6. Être dans les catégories B, C, D, E, ou F augmente la probabilité de défaut de paiement,
la probabilité de défaut augmente avec le déclassement ‘grade B’ (OR=1,26), ‘grade C’ (OR=1,59), ‘grade
D’ (OR=12,2), ‘grade E’ (OR=15,4), ‘grade F’ (OR=19,4)
6. Evaluation et prédictions
Hide
## Courbe ROC
[Link]("pROC")
Hide
library(pROC)
Hide
# Prédictions
probas_train <- predict(log_model, train_set, type = "response")
probas_test <- predict(log_model, test_set, type = "response")
Hide
Hide
par(mfrow=c(1,2))
plot(roc_train, main = "Courbe ROC - Base d'Entraînement", col = "blue", [Link]
= TRUE)
plot(roc_test, main = "Courbe ROC - Base Test", col = "red", [Link] = TRUE)
Hide
Base AUC
<chr> <dbl>
Entraînement 0.8716333
Test 0.8674697
2 rows
La courbe ROC montre comment les taux de vrais positifs et de faux positifs varient lorsque le seuil de
classification est modifié. L’AUC est égal à 0,87 signifie que ce modèle une probabilité de 87% de
distinguer correctement une classe négative (non défaut) d’une classe positive (défaut).
Hide
# Seuil de probabilité
# Prédire les probabilités sur la base d'entraînement
probas_train <- predict(log_model, train_set, type = "response")
# Créer une dataframe avec les probabilités prédites et les étiquettes de 'loan_st
atus'
preds_log_train <- [Link](probabilite = probas_train, loan_status = train_set$
loan_status)
probabilite loan_status
<dbl> <fctr>
6 rows
Hide
Hide
library(ggplot2)
ggplot(preds_log_train, aes(x = probabilite, fill = loan_status)) +
geom_density(alpha = 0.5) +
labs(title = "Densité de Probabilité Prédite - Défaut vs. Non Défaut", x = "Prob
abilité Prédite") +
scale_fill_manual(values = c("Non Défaut" = "blue", "Défaut" = "red")) +
theme_minimal() +
theme([Link] = element_blank()) + # Supprimer le titre de la légende
labs(fill = "Défaut de paiement") # Renommer la légende
À partir de 0,27, la densité de défaut devient plus importante que celle de non-défaut. Donc, on peut
considérer le seuil de classification comme étant 0,3. Accuracy - le pourcentage d’instances correctement
classifiées, c’est-à-dire la somme du nombre de vrais négatifs et de vrais positifs divisée par le nombre
total des observations. Sensibilité - le pourcentage de clients en défaut de paiement (classe positive) qui
ont été classifiés comme tels par le modèle. Spésificité - le pourcentage de clients qui ne sont pas en
défauts de paiement (classe négative) et qui ont été classififiés comme tels par le modèle.
Hide
return(results)
}
model_evaluation(log_model, 0.3)
$`Matrice de confusion`
predicted_status
0 1
0 4278 621
1 365 955
$Accuracy
[1] 0.8414536
$Sensibilité
[1] 0.7234848
$Spécificité
[1] 0.8732394
$`1 - Specificity`
[1] 0.1267606
Seuils: 0,3, 0,4, 0,5 On remarque que plus le seuil est élevé, plus le score de classification augmente, mais
la sensibilité diminue et la spécificité du modèle augmente. Seuil optimal?
Hide
# Création d'une fonction d'affichage des résultats de modèles pour divers seuils
[Link](ggplot2)
Hide
library(ggplot2)
print_results <- function(model) {
for (i in seuils) {
r <- model_evaluation(model, i)
acc_model <- append(acc_model, r[['Accuracy']])
sens_model <- append(sens_model, r[['Sensibilité']])
spec_model <- append(spec_model, r[['Spécificité']])
one_minus_spec_model <- append(one_minus_spec_model, r[['1 - Specificit
y']])
}
# Courbe ROC
roc_curve <- ggplot() +
geom_line(data=resultats, aes(x=one_minus_spec_model, y=sens_m
odel)) +
labs(x = '1 - Specificity', y = 'Sensitivity')
# Résultats
all_results <- list(resultats, plots, roc_curve)
names(all_results) <- c('Metrics', 'Plot', 'ROC Curve')
return (all_results)
Hide
6 rows
Hide
tail(print_results(log_model)[['Metrics']])
6 rows
Hide
La nature croissante du score de classification à mesure que le seuil augmente est une observation
courante pour les modèles de régression logistique, surtout en présence de classes déséquilibrées,
comme dans la modélisation du risque de crédit (meilleur seuil = 0,5 pour des classes équlibrées). En ce
qui concerne la sensibilité et la spécificité, on constate qu’à mesure que le seuil augmente, la sensibilité
diminue (linéaire?) tandis que la spécificité augmente, ce qui est typique pour tous les algorithmes de
classification. Le choix d’un seuil optimal est crucial, car il modifie non seulement les métriques de
performance du modèle, mais aussi les décisions concernant l’octroi de crédit aux nouveaux demandeurs.
Ce seuil détermine si la banque accordera ou non un prêt à un client potentiel. Le meilleur seuil pour
classifier les prédictions d’un modèle peut souvent être déterminé en identifiant le point d’intersection
entre la courbe de Sensibilité (True Positive Rate) et celle de Spécificité (True Negative Rate) sur la courbe
ROC (Receiver Operating Characteristic). Ce point d’intersection correspond généralement au seuil où le
modèle équilibre au mieux la sensibilité et la spécificité, optimisant ainsi la performance globale du
modèle. Cependant, il est également crucial pour une banque (ou toute autre entité utilisant un modèle de
classification) d’évaluer l’impact de ce seuil sur ses décisions de prêt. Le choix du seuil peut avoir des
implications importantes sur la gestion du risque de crédit et sur les performances financières globales.
Par conséquent, il est recommandé d’adapter périodiquement ce seuil en fonction des nouvelles données
disponibles, des changements dans les comportements des emprunteurs et des objectifs spécifiques de
l’institution financière. En résumé, bien que le point d’intersection des courbes Sensibilité et Spécificité sur
la courbe ROC soit souvent considéré comme le meilleur seuil initial, il est essentiel de prendre en compte
les implications pratiques et stratégiques de ce choix pour optimiser la gestion du risque et améliorer
continuellement les performances du modèle.
Code complémentaire
Hide
[Link] Page 61 sur 62
MODELISATION DU RISQUE DE CREDIT 12/07/2024 19:20
Hide
# Seuil
seuil <- 0.3
# Matrice de confusion
conf_mat <- table(test_set$loan_status, preds_status_test)
conf_mat
preds_status_test
0 1
0 4278 621
1 365 955
Hide
# Score de classification
accuracy <- (TP+TN)/nrow(test_set)
accuracy
[1] 0.8414536
Hide
# Spécificité du modèle
specificity <- TN/(TN + FP)
specificity
[1] 0.8732394