Techniques de Scoring et Analyse de Risque
Techniques de Scoring et Analyse de Risque
Baha-Eddine Aouni
Carminda Cid
Mael Jauniaux
Techniques de Scoring
1 INTRODUCTION 4
2 AVANT L’ESTIMATION … 5
3 ESTIMATION DU MODELE 15
3.1 PRESENTATION 15
3.2 ANALYSE DES RESULTATS 15
Pages - 2 -
Techniques de Scoring
6 CONCLUSION 23
ANNEXES ET INDEX 24
Pages - 3 -
Techniques de Scoring
1 Introduction
Les techniques de scoring sont des méthodes dont le but est de sélectionner, classer et
discriminer une population donnée. Ces techniques sont utilisées dans divers secteurs allant
du marketing à la gestion du risque bancaire. Ce projet a pour but de construire une échelle de
notation du niveau de risque et d’en contrôler la performance.
La base de travail rassemble des données concernant les emprunts immobiliers de particuliers.
Nous disposons de données à la fois qualitatives et quantitatives, et d’un critère de défaut.
Nous cherchons à déterminer la probabilité de ne pas être défaillant, c'est-à-dire celle d’une
personne ne pouvant pas rembourser son crédit.
Notre étude s'effectue en plusieurs étapes. Nous commençons par une étape d'analyse des
données. Nous retirons les observations extrêmes et manquantes puis décrivons les variables
et leurs liaisons avec le critère de défaut. Une fois ce travail préparatoire effectué, nous
construisons notre score et en mesurons les performances. Enfin, nous présentons la grille de
score et notre échelle de notation.
Pages - 4 -
Techniques de Scoring
2 Avant l’estimation …
Notre base d’étude comporte 77.000 observations et 15 variables (cf. Annexe 1 : Liste des
variables). Cette base, à l’état brut, présente de nombreuses valeurs aberrantes ou manquantes.
D’où la nécessité de la nettoyer.
Nous avons comptabilisé le nombre de modalités existantes pour chacune de nos variables
quantitatives et qualitatives grâce aux procédures MEANS et FREQ. Si ce nombre se révélait
différent de 77.000 alors la variable contenait des valeurs manquantes, que nous avons
éliminées.
Nous entendons par valeurs aberrantes les outliers susceptibles de biaiser notre estimation
ainsi que les valeurs n’ayant aucun sens. Afin de supprimer ces valeurs nous avons dû établir
un certain nombre de règles de décision.
L’âge du client :
La variable age_client présentait des valeurs comprises entre -19 et 2005. Nous avons décidé
de nous fixer une fourchette entre 18 (âge de la majorité) et 108 (âge maximum raisonnable).
De plus, nous avons créé un indicateur qui permet de se rendre compte de l’âge de l’individu
au moment où il a contracté le prêt (indice_age). Nous avons fait en sorte qu’il soit supérieur
à 18.
Revenus du client :
Nous avons décidé de garder les revenus compris entre le Revenu Minimum d’Insertion
annualisé (5.400€) et un plafond de 1.000.000€.
Pages - 5 -
Techniques de Scoring
Taux d’endettement :
La législation impose un taux d’endettement inférieur à 33.33% au moment du déblocage du
crédit. C’est pourquoi nous avons retiré l’ensemble des valeurs supérieures à ce seuil.
Montant initial :
Il est impossible d’avoir à rembourser un capital supérieur au montant initial du prêt. C’est
pourquoi nous avons créé un indicateur, indice_montant, représentant la différence entre ces
deux variables. Nous retirons alors de notre base l’ensemble des observations pour lesquelles
l’indicateur est positif.
Nous avons jugé qu’il est improbable de constituer un apport 19 fois supérieur au montant
initial. Cela revient à considérer que le montant de l’emprunt doit couvrir au moins 5% de
l’investissement immobilier. D’où la création de la variable indice qui restitue le rapport
entre l’apport personnel et le montant initial du prêt. Nous supprimons donc tutes les
observations pour lesquelles ce rapport sera supérieur à 19.
La réalisation d’un score nécessite de diviser notre base en deux échantillons : l’échantillon
apprentissage (nécessaire pour l’estimation) et l’échantillon test (utilisé pour l’analyse des
performances). Nous avons effectué un tirage aléatoire simple sans remise. L’échantillon
apprentissage représente 70% de la base de départ. A l’issue de cet échantillonnage nous
avons contrôlé que le taux de critère reste constant sur les deux échantillons et la base (soit
environ 5%).
Pages - 6 -
Techniques de Scoring
Montant apport : montant apporté par le client pour le financement de son achat
immobilier
En moyenne les individus de notre échantillon font un apport de 24.000€, alors que la
médiane de cette variable est de 8.800€. Cet apport est nul pour près du quart de notre
échantillon; il atteint à l'opposé 1.000.100€. La majeure partie de notre population fait un
apport personnel inférieur à 100.000€.
Pages - 7 -
Techniques de Scoring
Pages - 8 -
Techniques de Scoring
Nous avons utilisé différentes méthodes selon la nature des variables explicatives étudiées. Le
but de l’étude des liaisons est d’éliminer les variables peu discriminantes vis-à-vis de la
variable à expliquer ou corrélées entre elles.
En analysant les résultats du test de corrélation de Spearman (cf. Annexe 3 : Les tests utilisés)
en sortie de la PROC CORR, nous remarquons que toutes nos variables sont corrélées entre
elles. Cependant nous ne retirerons que celles affichant un degré de corrélation très élevé.
Les variables CRD et montant_initial sont liées par une corrélation quasi unitaire et
significative. Nous choisissons donc de retirer la variable CRD du modèle. Par ailleurs les
variables duree_restante et duree_pret présentent également une forte corrélation. Parmi les
trois variables linéairement liées (age_pret, duree_restante et duree_pret) nous choisissons de
retirer duree_restante. En effet, cette variable a les coefficients de corrélations les plus élevés
avec les deux autres variables et nous paraît moins pertinente en termes d’interprétation.
Nous effectuons un test de Kruskal-Wallis (cf. Annexe 3 : Les tests utilisés) via la PROC
NPAR1WAY entre les variables quantitatives explicatives et la variable à modéliser. Ce test
nous permet de détecter les variables explicatives discriminantes. Pour l’ensemble des
variables, la p-value obtenue est inférieure à notre seuil de confiance (0.05). Nous en
concluons donc que toutes nos variables quantitatives sont discriminantes.
Nous effectuons un test d’indépendance du khi deux afin de déterminer si les classes de nos
variables qualitatives explicatives sont indépendantes de la variable à expliquer. Les résultats
obtenus sont décevants. En effet la statistique de test ne dépasse pas le seuil de 0.04 alors
qu’une variable a une liaison satisfaisante lorsque la statistique dépasse 0.3. Ces résultats nous
laissent penser que les variables qualitatives seront peu contributives à la construction du
score.
Pages - 9 -
Techniques de Scoring
Capital restant dû :
Crd_D1 Crd_D2
Modalités 1 2 3 1 2 3 4
15.000- 15.000- 65.000-
Bornes 0-15.000 +105.000 0-15.000 +105.000
105.000 65.000 105.000
Critère du
0.079 0.072
khi deux
Tableau 1 - Discrétisation de la variable CRD
La discrétisation en trois classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Pages - 10 -
Techniques de Scoring
Age client :
Critère du
0.026 0.037
khi deux
Tableau 2 - Discrétisation de la variable Age_client
La discrétisation en quatre classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Age prêt :
Critère du
0.444 0.339
khi deux
Tableau 3 - Discrétisation de la variable age_pret
La discrétisation en deux classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Durée prêt :
Critère du
0.091 0.071
khi deux
Tableau 4 - Discrétisation de la variable duree_pret
La discrétisation en trois classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Pages - 11 -
Techniques de Scoring
Durée restante :
Duree_restante_D1 Duree_restante_D2
Modalités 1 2 3 1 2 3 4
Critère du
0.025 0.056
khi deux
Tableau 5 - Discrétisation de la variable duree_restante
La discrétisation en quatre classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Montant apport :
apport_D1 apport_D2
Modalités 1 2 3 1 2 3 4
5.000- 5.000- 24.000-
Bornes 0-5.000 +24.000 0-5.000 +160.000
24.000 24.000 160.000
Critère du
0.067 0.061
khi deux
Tableau 6 - Discrétisation de la variable montant_apport
La discrétisation en trois classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Pages - 12 -
Techniques de Scoring
Montant initial :
initial_D1 initial_D2
Modalités 1 2 3 1 2 3 4
60.000- 20.000- 60.000-
Bornes 0-60.000 +110.000 0-20.000 +220.000
110.000 60.000 220.000
Critère du
0.083 0.094
khi deux
Tableau 7 - Discrétisation de la variable montant_initial
La discrétisation en quatre classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Nb_inc12m_D1 Nbinc12m
Modalités 1 2 Variable
Bornes 0 +0 d'origine
Critère du
0.515 0.406
khi deux
Tableau 8- Discrétisation de la variable nbinc12m
La discrétisation en deux classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Revenus :
Revenus_D2 Revenus_D1
Modalités 1 2 3 1 2
5.400- 14.000-
Bornes +35.000 5.400-14.000 +14.000
14.000 35.000
Critère du
0.052 0.062
khi deux
Tableau 9 - Discrétisation de la variable revenus
Pages - 13 -
Techniques de Scoring
La discrétisation en deux classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Taux d’endettement :
endettement_D2 endettement_D1
Modalités 1 2 3 1 2
Critère du
0.029 0.026
khi deux
Tableau 10 - Discrétisation de la variable endettement
La discrétisation en deux classes maximise notre critère du khi deux. Nous retenons la
variable ainsi créée pour la modélisation.
Pour les variables qualitatives, nous avons essayé de procéder à des regroupements logiques
des modalités. La seule variable reclassée retenue est Situfam_R1. Elle regroupe les
concubins et les personnes pacsées au sein d’une même modalité.
Nous avons effectué les transformations et les regroupements optimaux sur la base d'étude et
les deux échantillons. Nous pouvons maintenant passer à l'estimation du modèle.
Pages - 14 -
Techniques de Scoring
3 Estimation du modèle
3.1 Présentation
Notre modèle est bien spécifié selon les trois tests de significativité globale (Wald, Likelihood
Ratio et Score). C’est également ce que laisse supposer le R² ajusté de Nagelkerke (0,5).
La sélection automatique a éliminé les variables CRD_D1, type_bien, PCS, Situfam_R1.
L’ensemble des variables qualitatives de départ et la variable CRD sont donc supprimées
comme nous l’avions prévu lors de l’étude des liaisons.
L’analyse des effets de type 3 permet de déterminer si les variables contribuent
significativement à la construction de la probabilité de ne pas être défaillant. Toutes les
variables ont des pvalues inférieures à notre seuil de confiance, elles sont donc significatives.
L’analyse des estimations de la vraisemblance maximum permet de savoir quelles modalités
sont significatives. Nous remarquons qu’elles le sont toutes (pvalue<0.05).
La régression est d’une bonne qualité. En effet, le Sommer’s D est proche de 1 (0.81).
Pages - 15 -
Techniques de Scoring
Nous avons testé l’adéquation du modèle aux données grâce au test d’Hosmer et Lemeshow.
Ce test permet de vérifier si la probabilité estimée est proche de la probabilité constatée. Or,
notre pvalue est inférieure à notre seuil de confiance donc le modèle est mal calibré.
Toutefois, ignorant comment corriger ce problème, nous avons conservé le modèle en l’état.
La dernière étape de l’analyse de nos résultats est le calcul de la contribution de chaque
variable à l’étendue des valeurs du score. Elle se calcule à partir de la formule suivante :
j
{ }
Max x1j ,..., x pj ,0 − Min x1j ,..., x pj ,0
i i
{ }
C = k
× 100
∑ ( Max{x
j =1
i
1
j j
} {
,..., x ,0 − Min x ,..., x ,0 )
p
i
1
j j
p }
Où x pj est le coefficient estimé de la modalité i (i = 1, …, p) de la variable j (j = 1, …, k) de
l’échantillon apprentissage.
Ci-dessous se trouvent les résultats.
nb_ Duree apport initial revenus Endettement
VARIABLES age_D1 age_pret_D1 inc12m_D1 _pret_D1 _D1 _D2 _D2 _D2
CONTRIBUTION 4,2 33,9 29,5 5,7 3,9 17 3 3,2
Tableau 11 – Contribution des variables au score
Les variables les plus contributives sont l’âge du prêt, le nombre d’incidents et le montant
initial du prêt. Résultat surprenant, les revenus contribuent le moins à la construction du score
(3% seulement).
Pages - 16 -
Techniques de Scoring
L’analyse des performances est nécessaire pour la validation du score. En effet, celui-ci a été
construit sur l’échantillon apprentissage, on doit contrôler sa robustesse sur un échantillon qui
n’a pas servi à sa construction (échantillon test).
Pour analyser la robustesse de notre score, nous pouvons construire les courbes de densités du
score (y_etoile_chapeau) en fonction du critère à modéliser. Si notre score est robuste alors
les deux courbes sont les plus séparées possibles. Sur le graphique, ci-dessous, nous
observons des courbes de densité distinctes. Nous pouvons conclure que notre score est
robuste.
Pages - 17 -
Techniques de Scoring
Cette courbe représente en ordonnée le taux de bon classement parmi les sains (vrais sains) et
en abscisse le taux de mauvais classement parmi les défaillants (faux défaillants). La
statistique c de cette courbe, proche de 1 (0.917), indique une bonne catégorisation de nos
individus.
Cette courbe permet de mettre en relation une part d’individus classés selon leur niveau de
risque avec une part d’individus défaillants. Le score est performant lorsque cette courbe
s’éloigne de la bissectrice vers le bas.
Pages - 18 -
Techniques de Scoring
L’indice de Gini de l’échantillon test est 0,843 et celui de l’échantillon apprentissage 0,813 ce
qui est très bon. Nous remarquons que les courbes de sélection se ressemblent sur les deux
échantillons et se rapprochent du score parfait.
La courbe de performance permet de mettre en relation une part de marché d'individus avec la
part de défaillants parmi l’ensemble des défaillants. Cette courbe est d’autant meilleure
qu’elle est éloignée de la bissectrice vers le bas.
Les deux courbes sont similaires quel que soit l’échantillon. Nous remarquons qu’elles sont
éloignées de la bissectrice, on en conclut donc la performance de notre score.
Pages - 19 -
Techniques de Scoring
2 * Giniapprentissage − Ginitest
IR= 1 −
n apprentissage n
Max 1 − ); (1 − test )
N apprentissage N test
Ici, l’indice de robustesse s’élève à 93% on considère qu’on a perdu moins de 7% de notre
performance de discrimination.
Pages - 20 -
Techniques de Scoring
La grille de score permet d’associer une note comprise entre 0 et 100 à chaque client. Cette
note permet d’évaluer le niveau de risque de toutes les opérations de crédits.
{ }
Min x1j ,..., x pj − xij
i
N ij = k
∑ ( Max{x
j =1
i
1
j
} { }
,..., x pj ,0 − Min x1j ,..., x pj ,0 )
i
Pages - 21 -
Techniques de Scoring
Pages - 22 -
Techniques de Scoring
6 Conclusion
Compte tenu des variables retenues, le score construit est utilisable pour les clients ayant déjà
des crédits. Il serait intéressant de construire un score applicable aux clients sollicitant un
crédit. Pour ce faire, il faudrait retirer la variable age_pret fortement contributive à
l’élaboration du score.
L’individu le moins risqué a entre 24 et 34 ans, détient un crédit depuis moins de 3 ans dont
l’échéance est courte (inférieure à 14 ans) et n’a connu aucun incident de crédits. Cet
individu contracte un prêt d'un montant faible avec un apport personnel important. Il fait
partie des individus les plus aisés et les moins endettés. Ce profil correspond à l’a priori que
nous avions.
Pages - 23 -
Techniques de Scoring
Annexes
et
Index
Pages - 24 -
Techniques de Scoring
Pages - 25 -
Techniques de Scoring
9 duree_pret Num
11 duree_restante Num
14 id Num
15 impaye Num
6 montant_initial Num
3 situfam Alph
8 taux_endettement Num
5 type_bien Alph
Pages - 26 -
Techniques de Scoring
Variable Modalité
CRD_D1 1
PCS Prof_lib
age_D1 2
age_pret_D1 1
duree_pret_D1 1
Apport_D1 3
Initial_D2 1
Nb_inc12M_D1 1
Revenus_D2 2
Situfam_R1 4
Endettement_D2 1
type_bien 2
Pages - 27 -
Techniques de Scoring
H0 : ( ρ XY = 0 ) contre Ha ( ρ XY ≠ 0 )
n
6∑ ( R Xi − RYi ) 2
i =1
ρ = 1−
n(n ² − 1)
α α
ZR: { ρ > t (n,1 − ) ou ρ < t (n, ) }
2 2
Test de Kruskal-Wallis
H0 : (pas de différence entre les k populations) contre Ha : (au moins une des populations est
différente des autres populations)
G
∑ n (r
i =1
i i⋅ −r )2
K = ( N − 1) G ni
∑∑ (r
i =1 j =1
ij −r )2
Pages - 28 -
Techniques de Scoring
H0 : (les variables sont indépendantes) contre Ha : (les variables ne sont pas indépendantes,
l’écart entre la valeur attendue et la valeur observée n’est pas dû au hasard)
(Oij − Eij )²
K= ∑i , j
Eij
Où Oij est la valeur observée et Eij la valeur attendue sous l’hypothèse d’indépendance.
ZR : { K ≥ χ ²((i − 1)( j − 1)) }
Test de Vuong
Le test consiste à comparer les vraisemblances issues des deux méthodes d’estimation et ce
pour chaque individus et de choisir celle qui offre la meilleure représentation (qui est
supérieur).
La statistique de test est :
1
N
∑t i
Vuong = i
2
avec t i = ln( lilog it ) - ln( li probit )
σ t
Donc, lorsque la statistique de test est positive, on préférera l’estimation de type Logit, sinon
on préférera l’estimation de type Probit.
Pages - 29 -
Techniques de Scoring
%let chemin="H:\Credit-scoring\projet";
libname td &chemin;
run;
data tab;
set td.Base_proj_sco_0708;
run;
/*************************************************************************/
/****************************LA BASE DE DONNEES***************************/
/*************************************************************************/
proc contents data=tab;
title "contenu table";
run;
/*************************************************************************/
/**************************NETTOYAGE DE LA BASE***************************/
/*************************************************************************/
/*doublons*/
proc sort data=tab nodupkey ;
by id;
run;
data tab;
set tab;
indice=montant_apport/montant_initial;
indice_age=age_client-age_pret;
indice_montant=CRD-montant_initial;
run;
Pages - 30 -
Techniques de Scoring
data tab;
set tab;
if duree_restante= . then delete;
if montant_initial= . then delete;
if taux_endettement= . then delete;
if pcs="manquant" or pcs="Manquant" then delete;
if situfam="manquant" then delete;
if type_bien="manquant" then delete;
run;
proc sql;
select count(id) into : nobs
from tab;
quit;
data tab;
set tab;
/*if hatmatrix>3*13/&nobs then delete;
if abs(pearson)>2 then delete;*/
if age_client<18 or age_client>108 then delete;
if indice_age<18 then delete;
if indice_montant>0 then delete;
if indice>19 then delete;
if revenus>1000000 then delete;
if taux_endettement>33.33 then delete;
if revenus<5400 then delete;/*RMI*/
run;
/*************************************************************************/
/*****************************DATA SPLITTING******************************/
/*************************************************************************/
proc surveyselect
Pages - 31 -
Techniques de Scoring
data=tab
method=srs
rep=1
seed=1234
samprate=70
out=echantillon_app;
title "construction echantillon apprentissage";
run;
/*************************************************************************/
/****************************ETUDE EXPLORATOIRE***************************/
/*************************************************************************/
/****STATISTIQUES DESCRIPTIVES****/
%macro KDE_description(tab,var_quanti);
proc kde data=&tab
out = kde_&var_quanti ;
Pages - 32 -
Techniques de Scoring
var &var_quanti ;
title "kde &var_quanti";
run;
proc gplot data=kde_&var_quanti;
plot density*&var_quanti ;
symbol color= blue
interpol=join
value=dot
height=0.1;
title "courbe de densite &var_quanti";
run;
quit;
Proc DataSets LIBRARY=WORK ;
Delete kde_&var_quanti ;
Run ;
%mend;
/*impaye=0 rouge*/
%kde_description(echantillon_app, age_client);
%kde_description(echantillon_app, crd);
%kde_description(echantillon_app, age_pret);
%kde_description(echantillon_app, duree_pret);
%kde_description(echantillon_app, duree_restante);
%kde_description(echantillon_app, montant_apport);
%kde_description(echantillon_app, montant_initial);
%kde_description(echantillon_app, nbinc12m);
%kde_description(echantillon_app, revenus);
%kde_description(echantillon_app, taux_endettement);
/*************************************************************************/
/****************************ETUDE DES LIAISONS***************************/
/*************************************************************************/
Pages - 33 -
Techniques de Scoring
/*test du chi-deux*/
%macro test_chideux(tab,var);
Proc Freq data=&tab;
tables impaye*&var/chisq;
output out= resultat n chisq;
run;
Data resultat;
set resultat;
T=sqrt((_pchi_/N)/sqrt(df_pchi));
keep N _pchi_ df_pchi t;
run;
proc print data=Resultat;
title "resultat liaison &var";
run;
Proc DataSets LIBRARY=WORK ;
Delete resultat;
Run ;
quit;
%mend;
%test_chideux (echantillon_app,pcs);
%test_chideux (echantillon_app,situfam);
%test_chideux (echantillon_app,type_bien);
/* proche de 1 variable discriminante*/
/*************************************************************************/
/***********************TRANSFORMATION DES VARIABLES**********************/
/*************************************************************************/
Pages - 34 -
Techniques de Scoring
symbol1 color=red
interpol=join
value=dot
height=0.1;
symbol2 color= green
interpol=join
value=dot
height=0.1;
title "courbes de densité &var_quanti";
run;
quit;
Proc DataSets LIBRARY=WORK ;
Delete kdeimpaye0_&var_quanti ;
Run ;
Proc DataSets LIBRARY=WORK ;
Delete kdeimpaye1_&var_quanti ;
Run ;
quit;
%mend;
/*impaye=0 rouge*/
%kde_discretisation(echantillon_app, age_client,18,103,1);
/*0-24 24-34 34-54 +54
31 31-52 +52*/
%kde_discretisation(echantillon_app, crd,0,400000,10000);
/*20000 20000-100000 +100000
*/
%kde_discretisation(echantillon_app, age_pret,0,8,1);
/*0-3 3-inf
0 1 2 3 inf*/
%kde_discretisation(echantillon_app, duree_pret,3,35,1);
/*0-14 14-24 +24
0è-7 7-12 12-21 21-24 24+*/
%kde_discretisation(echantillon_app, duree_restante,0,30,1);
/*0-20 20-24 +24
0-10 10-20 20-24 +24*/
%kde_discretisation(echantillon_app, montant_apport,0,300000,10000);
/*0-5000 5000-24000 24000+
0-5000 5000-24000 24000-160000 160000+*/
%kde_discretisation(echantillon_app, montant_initial,0,600000,20000);
/*0-60000 60000-110000 110000+
0-20000 20000-60000 +220000*/
%kde_discretisation(echantillon_app, nbinc12m,0,4,1);
/*01234
0 >0*/
%kde_discretisation(echantillon_app, revenus ,0,100000,5000);
/*0-14000 14000-35000 +35000
0-14000 +14000*/
%kde_discretisation(echantillon_app, taux_endettement,0,33,1);
/*0-27 +27
0-15 15-27 +27*/
Pages - 35 -
Techniques de Scoring
%macro regroupement(base);
data class_&base;
set &base;
AGE_D1 = 1*(AGE_CLIENT<24) + 2*(24<=AGE_CLIENT<34) + 3*(34<=AGE_CLIENT<54)
+ 4*(AGE_CLIENT>=54);
AGE_D2 = 1*(AGE_CLIENT<31) + 2*(31<=AGE_CLIENT<52) + 3*(52<=AGE_CLIENT);
CRD_D1 = 1*(CRD<15000) + 2*(15000<=CRD<105000) + 3*(105000<=CRD);
CRD_D2 = 1*(CRD<15000) + 2*(15000<=CRD<65000) +
3*(65000<=CRD<105000)+4*(105000<=CRD);
AGE_PRET_D1 = 1*(AGE_PRET<3) + 2*(AGE_PRET>=3);
AGE_PRET_D2 = 1*(AGE_PRET<1) + 2*(1=<AGE_PRET<2)+3*(2<=AGE_PRET<3) +
4*(3=<AGE_PRET);
DUREE_PRET_D1 = 1*(DUREE_PRET<14) +
2*(14=<DUREE_PRET<24)+3*(24<=DUREE_PRET);
DUREE_PRET_D2 = 1*(DUREE_PRET<7) +
2*(7=<DUREE_PRET<12)+3*(12<=DUREE_PRET<21)
+4*(21=<DUREE_PRET<24)+5*(24<=DUREE_PRET);
DUREE_RESTANTE_D1 = 1*(DUREE_RESTANTE<20) + 2*(20=<DUREE_RESTANTE<24)+
3*(24<=DUREE_RESTANTE);
DUREE_RESTANTE_D2 = 1*(DUREE_RESTANTE<10) +
2*(10=<DUREE_RESTANTE<20)+3*(20<=DUREE_RESTANTE<24)
+4*(24<=DUREE_RESTANTE);
APPORT_D1 = 1*(MONTANT_APPORT<5000) + 2*(5000=<MONTANT_APPORT<24000)+
3*(24000<=MONTANT_APPORT);
APPORT_D2 = 1*(MONTANT_APPORT<5000) + 2*(5000=<MONTANT_APPORT<24000)+
3*(24000<=MONTANT_APPORT<160000)+ 4*(160000<=MONTANT_APPORT);
INITIAL_D1 = 1*(MONTANT_INITIAL<60000) + 2*(60000=<MONTANT_INITIAL<110000)+
3*(110000<=MONTANT_INITIAL);
INITIAL_D2 = 1*(MONTANT_INITIAL<20000) + 2*(20000=<MONTANT_INITIAL<60000)+
3*(60000<=MONTANT_INITIAL<220000)+ 4*(220000<=MONTANT_INITIAL);
NB_INC12M_D1 = 1*(NBINC12M=0) + 2*(0<NBINC12M);
REVENUS_D1 = 1*(REVENUS<14000) + 2*(14000=<REVENUS<35000)+
3*(35000=<REVENUS);
REVENUS_D2 = 1*(REVENUS<14000) + 2*(14000=<REVENUS) ;
ENDETTEMENT_D1 = 1*(taux_ENDETTEMENT<27) + 2*(27=<taux_ENDETTEMENT);
ENDETTEMENT_D2 = 1*(taux_ENDETTEMENT<15) + 2*(15=<taux_ENDETTEMENT<27)+
3*(27=<taux_ENDETTEMENT);
PCS_R1 = 1*(PCS In ("Employé")) + 2*(PCS In ("Ouvrier")) + 3*(PCS IN
("Retraité")) + 4*(PCS IN("cadres","profint")) + 5*(PCS
IN("prof_lib","agrcomart")) ;
PCS_R2 = 1*(PCS In ("Employé")) + 2*(PCS In ("Ouvrier")) + 3*(PCS IN
("Retraité")) + 4*(PCS IN("profint")) + 5*(PCS
IN("cadres","prof_lib","agrcomart")) ;
SITUFAM_R1 = 1*(SITUFAM In ("marié")) + 2*(SITUFAM In ("célibataire")) +
3*(SITUFAM IN ("veuf(ve)","divorcé")) + 4*(SITUFAM IN("vm-concubins","vm-
concubins-pacs")) ;
SITUFAM_R2 = 1*(SITUFAM In ("marié")) + 2*(SITUFAM In
("célibataire","divorcé")) + 3*(SITUFAM IN ("veuf(ve)")) + 4*(SITUFAM
IN("vm-concubins","vm-concubins-pacs")) ;
SITUFAM_R3 = 1*(SITUFAM In ("marié")) + 2*(SITUFAM In
("célibataire","divorcé","veuf(ve)")) + 3*(SITUFAM IN("vm-concubins","vm-
concubins-pacs")) ;
type_bien=1*(type_bien in("ancien")) + 2*(type_bien in("neuf"));
run;
Pages - 36 -
Techniques de Scoring
%mend;
%regroupement(tab);
%regroupement(echantillon_app);
%regroupement(echantillon_test);
Option MacroGen ;
%Macro T_Tschuprow(Tab=,Var_Qual_1=,Var_Qual_2=,Chemin_Out=) ;
ODS LISTING CLOSE ;
Proc Freq Data=&Tab. ;
Tables &Var_Qual_1.*&Var_Qual_2. / ChisQ ;
Output Out=Tab_Out_KD ChisQ ;
Run ;
ODS LISTING ;
Data Tab_Out_KD (Keep=T_Tschuprow) ;
Set Tab_Out_KD ;
Attrib T_Tschuprow Label="Statistique du T de Tschuprow" Format=8.6 ;
T_Tschuprow=(sqrt((_PCHI_/N)/sqrt(DF_PCHI))) ;
Run ;
/*ODS HTML FILE="&Chemin_Out\T_Tshuprow_&Var_Qual_1._&Var_Qual_2..xls"
STYLE=PRINTER ;*/
ODS PROCLABEL "Statistique du T de Tschuprow &var_qual_2" ;
Options NoDate NoNumber ;
Title ;
Proc Print Data=Tab_Out_KD Label NOOBS ;
Var T_Tschuprow ;
Format T_Tschuprow NUMX8.6 ;
Run ;
ODS HTML CLOSE ;
Proc DataSets LIBRARY=WORK ;
Delete Tab_Out_KD ;
Run ;
Quit ;
%Mend ;
%T_Tschuprow(Tab=Class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=AGE_D1,
Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=AGE_D2,
Chemin_Out=&chemin) ;
/*age_d1*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=crd_D1,
Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=crd_D2,
Chemin_Out=&chemin) ;
/*crd_D1*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=AGE_pre
t_D1,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=AGE_pre
t_D2,Chemin_Out=&chemin) ;
/*age_pret_d1*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=duree_p
ret_D1,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=duree_p
ret_D2,Chemin_Out=&chemin) ;
/*duree_pret_d1*/
Pages - 37 -
Techniques de Scoring
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=duree_r
estante_D1,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=duree_r
estante_D2,Chemin_Out=&chemin) ;
/*duree_restante_d2*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=apport_
D1,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=apport_
D2,Chemin_Out=&chemin) ;
/*apport_d1*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=initial
_D1,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=initial
_D2,Chemin_Out=&chemin) ;
/*initial_d2*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=revenus
_D1,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=revenus
_D2,Chemin_Out=&chemin) ;
/*revenus_d2*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=NB_INC1
2M_D1,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=NBINC12
M,Chemin_Out=&chemin) ;
/*NBINC_12M_D1*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=endette
ment_D1,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=endette
ment_D2,Chemin_Out=&chemin) ;
/*endettement_d2*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=pcs_r1,
Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=pcs_r2,
Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=pcs,Che
min_Out=&chemin) ;
/*pcs*/
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=situfam
_r1,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=situfam
_r2,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=situfam
_r3,Chemin_Out=&chemin) ;
%T_Tschuprow(Tab=class_echantillon_app,Var_Qual_1=IMPAYE,Var_Qual_2=situfam
,Chemin_Out=&chemin) ;
/*situfam_r1*/
/*%macro decoupage_dynamique(Tab,Var,deb,fin,incr);
%do i=&deb %to &fin %by &incr;
%do j=&deb %to &fin-&i %by &incr;
data essai;
set &tab;
D_&var = 1*(&Var<&i) + 2*(&i<=&Var<&i+&j)+3*(&i+&j<=&Var);
run;
Proc Freq data=essai;
tables impaye*D_&var/chisq;
output out=resultat n chisq;
title "critére automatique &var";
run;
Data resultat;
set resultat;
Pages - 38 -
Techniques de Scoring
T=sqrt((_pchi_/N)/sqrt(df_pchi));
class1=&i;
class2=&i+&j;
run;
data test_&var;
set test_&var resultat ;
keep t and class1 and class2 ;
run;
%end;
%end;
proc sql;
select class1, class2, T
from test_duree_pret
where t=(select max(T) from test_duree_pret);
title "critére automatique &var";
quit;
Proc DataSets LIBRARY=WORK ;
Delete Essai ;
Run ;
Proc DataSets LIBRARY=WORK ;
Delete resultat ;
Run ;
quit;
%mend;*/
/*%decoupage_dynamique(echantillon_app,duree_pret,0,34,1);
%decoupage_dynamique(echantillon_app,crd,0,3020000,10000);
%decoupage_dynamique(echantillon_app,age_client,18,108,1);
%decoupage_dynamique(echantillon_app,age_pret,0,15,1);
%decoupage_dynamique(echantillon_app,duree_restante,0,30,1);
%decoupage_dynamique(echantillon_app,montant_apport,0,1000100,10000);
%decoupage_dynamique(echantillon_app,montant_initial,0, 3060000,10000);
%decoupage_dynamique(echantillon_app,nbinc12m,0,4,1);
%decoupage_dynamique(echantillon_app,revenus,0, 670355,10000);
%decoupage_dynamique(echantillon_app,taux_endettement,0,33,1);*/
/*************************************************************************/
/************************ESTIMATION DU MODELE*****************************/
/*************************************************************************/
Pages - 39 -
Techniques de Scoring
/****CALIBRAGE DU MODELE****/
/****QUALITE DU MODELE****/
Pages - 40 -
Techniques de Scoring
/****CONTRIBUTION****/
/*************************************************************************/
/************************ANALYSE DES PERFORMANCES*************************/
/*************************************************************************/
/****COURBE DE ROC****/
%kde_discretisation(TAB_SCORE_ECH_APP_logit, y_etoile_chapeau,-2,8,1);
PROC LOGISTIC DATA = class_echantillon_test;
CLASS &variables_class/ PARAM=REF ;
MODEL IMPAYE (Event='1') = &variables_mod
/ OUTROC = Tab_Roc_App Selection=Backward SLS=0.05 Link=logit ;
OUTPUT OUT=TAB_SCORE_ECH_test_logit p=p_logit PREDICTED=Y_Chapeau
XBETA=Y_Etoile_Chapeau ;
title"regression logit test";
RUN ;
%kde_discretisation(TAB_SCORE_ECH_test_logit, y_etoile_chapeau,-2,8,1);
%Macro Indice_Gini(Tab_Score=,Var_Qual=,Var_Score=) ;
Proc SQL NoPrint ;
Create Table Temp_1 As
Select &Var_Qual, &Var_Score From &Tab_Score
Order By &Var_Score DESC ;
Quit ;
Data Temp_1 ;
Set Temp_1 ;
Retain Nb Nb0 Nb1 0 ;
Nb=Nb+1 ;
If &Var_Qual=0 Then Nb0=Nb0+1 ; /* Défaillants */
Else If &Var_Qual=1 Then Nb1=Nb1+1 ; /* Non-défaillants */
Run ;
Pages - 41 -
Techniques de Scoring
Data _NULL_ ;
Set Temp_1 ;
Call Symput ("Nb_Tot",Nb) ;
Call Symput ("Nb_Tot_0",Nb0) ;
Call Symput ("Nb_Tot_1",Nb1) ;
Run ;
/* Courbe de sélection */
Data Temp_1 ;
Set Temp_1 ;
X_Sel=Nb/&Nb_Tot ;
Y_Sel=Nb0/&Nb_Tot_0 ;
If (Nb/&Nb_Tot) <= (&Nb_Tot_1/&Nb_Tot) Then Y_Sel_Max=0 ;
Else Y_Sel_Max=1+((Nb/&Nb_Tot-1)/(&Nb_Tot_0/&Nb_Tot)) ;
y_discr=(Nb-Nb0)/(&Nb_Tot-&Nb_Tot_0);
x_discr=Y_Sel;
y_perf=(Nb0/Nb)/(&Nb_Tot_0/&Nb_Tot);
x_perf=x_sel;
run ;
/* Calcul de l'indice de Gini */
Data Temp_1 ;
Set Temp_1 ;
Aire_Courbe_Sel=(1/&Nb_Tot)*(X_Sel-Y_Sel) ;
Run ;
Proc SQL NoPrint ;
Select Sum(Aire_Courbe_Sel) Into : Som_ACS From Temp_1 ;
Quit ;
%Put N : &Nb_Tot ;
%Put N (Défaillants) : &Nb_Tot_0 ;
%Put N (Non-Défaillants) : &Nb_Tot_1 ;
%Let Gini_Index_Temp=%SysFunc(ABS(&Som_ACS/((1-(&Nb_Tot_0/&Nb_Tot))/2))) ;
%Let Gini_Index=%SysFunc(Round(&Gini_Index_Temp,0.0001)) ;
Proc SQL NoPrint ;
Create Table Gini (Gini Num) ;
Insert Into Gini Values (&Gini_Index) ;
Quit ;
Proc Print Data=Gini ;
Var Gini ;
Format Gini NUMX8.3 ;
Run ;
GOptions Device=win Devmap=winansi Keymap=winansi FTitle=Triplex HTitle=3
CBack=White Border Htext=1 FText=Complex ;
Symbol1 i=join v=none c=Red w=2 ;
Symbol2 i=join v=none c=Orange w=2 l=3 ;
Symbol3 i=join v=none c=yellow w=2 l=3 ;
Symbol4 i=none v=none c=White width=1 ; /* Ligne blanche : permet
d'afficher la statistique de Gini à la ligne */
/*** Proc Gplot - Courbe de sélection ***/
Proc Gplot Data=Temp_1 ;
Title "Courbe de sélection" ;
Axis1 Label=(Color=Black F=Times H=2 Justify=Center "Part des
individus selectionnes") Order=0 To 1 By 0.1 ;
Axis2 Label=(Angle=90 Color=Black F=Times H=2.5 Justify=Center
"Selection") Order=0 To 1 By 0.1 ;
Legend1 Across=1 CBorder=Black Position=(Top Inside Right) OffSet=(-
50,-5) Mode=Share
Value=(Tick=1 "Score analysé" Tick=2 "Score parfait" Tick=3 "Score
aléatoire" Tick=4 "Indice de Gini = &Gini_Index") Shape=symbol(6,2.5)
Label=None ;
Plot (Y_Sel Y_Sel_max X_Sel Nb)*X_Sel
/ OverLay Legend=Legend1 NoFrame Grid HAxis=Axis1 VAxis=Axis2 VRef=1
LVref=2 HRef=1 LHref=2 Name='CRBSEL' ;
Pages - 42 -
Techniques de Scoring
Run ;
Quit ;
/*** Proc Gplot - Courbe de performance ***/
Proc Gplot Data=Temp_1 ;
Title "Courbe de performance" ;
Axis1 Label=(Color=Black F=Times H=2 Justify=Center "Part des
individus selectionnes") Order=0 To 1 By 0.1 ;
Axis2 Label=(Angle=90 Color=Black F=Times H=2.5 Justify=Center
"Sélection") Order=0 To 1 By 0.1 ;
Legend1 Across=1 CBorder=Black Position=(Top Inside Right) OffSet=(-
50,-5) Mode=Share
Value=(Tick=1 "Score analysé" Tick=2 "Score aléatoire" )
Shape=symbol(6,2.5) Label=None ;
Plot (Y_perf X_perf )*X_perf
/ OverLay Legend=Legend1 NoFrame Grid HAxis=Axis1 VAxis=Axis2 VRef=1
LVref=2 HRef=1 LHref=2 Name='CRBSEL' ;
Run ;
/*** Proc Gplot - Courbe de discrimination ***/
Proc Gplot Data=Temp_1 ;
Title "Courbe de discrimination" ;
Axis1 Label=(Color=Black F=Times H=2 Justify=Center "Part des
individus selectionnes") Order=0 To 1 By 0.1 ;
Axis2 Label=(Angle=90 Color=Black F=Times H=2.5 Justify=Center
"Selection") Order=0 To 1 By 0.1 ;
Legend1 Across=1 CBorder=Black Position=(Top Inside Right) OffSet=(-
50,-5) Mode=Share
Value=(Tick=1 "Score analysé" Tick=2 "Score aléatoire" )
Shape=symbol(6,2.5) Label=None ;
Plot (Y_discr X_discr )*X_discr
/ OverLay Legend=Legend1 NoFrame Grid HAxis=Axis1 VAxis=Axis2 VRef=1
LVref=2 HRef=1 LHref=2 Name='CRBSEL' ;
Run ;
Quit ;
Quit ;
/*--- Elimine les tables créées ---*/
/*Proc DataSets LIBRARY=WORK ;
Delete Temp_1 Gini ;
Run ;
Quit ;*/
%Mend ;
%Indice_Gini(Tab_score=TAB_SCORE_ECH_test_logit,Var_Qual=IMPAYE,Var_Score=Y
_Etoile_chapeau) ;
%Indice_Gini(Tab_score=TAB_SCORE_ECH_app_logit,Var_Qual=IMPAYE,Var_Score=Y_
Etoile_chapeau) ;
/****INDICE DE ROBUSTESSE****/
%Indice_Gini(Tab_score=TAB_SCORE_ECH_test_logit,Var_Qual=IMPAYE,Var_Score=Y
_Etoile_chapeau) ;
Data gini_test;
set Gini;
rename gini=gini_test;
i=1;
run;
%Indice_Gini(Tab_score=TAB_SCORE_ECH_app_logit,Var_Qual=IMPAYE,Var_Score=Y_
Etoile_chapeau) ;
Data gini_app;
set Gini;
rename gini=gini_app;
i=1;
Pages - 43 -
Techniques de Scoring
run;
Data IR;
merge gini_test gini_app;
by i;
run;
Proc SQL ;
title "construction Indice de robustesse";
Select Count(*)-Sum(IMPAYE) Into: N_Def_app From TAB_SCORE_ECH_app_logit ;
Select Count(*)Into: NObs_app From TAB_SCORE_ECH_app_logit ;
Select Count(*)-Sum(IMPAYE) Into: N_Def_test From TAB_SCORE_ECH_test_logit
;
Select Count(*)Into : NObs_test From TAB_SCORE_ECH_test_logit ;
Quit ;
Data IR;
set IR;
drop i;
num=abs(gini_app-gini_test);
denom=Max(1-(&N_Def_app/&NObs_app),1-(&N_Def_test/&NObs_test));
IR=1-(2*num/denom);
drop num denom;
run;/*bon indice de robustesse entre 0.90 et 1*/
/*************************************************************************/
/*****************************GRILLE DE SCORE*****************************/
/*************************************************************************/
data score_var;
set tab_score_tab_logit;
if age_D1=1 then note_age=0;
if age_D1=2 then note_age=4.2;
if age_D1=3 then note_age=0.8;
if age_D1=4 then note_age=0.6;
if age_pret_D1=1 then note_age_pret=33.9;
if age_pret_D1=2 then note_age_pret=0;
if nb_inc12m_D1=1 then note_nbinc12m=29.5;
if nb_inc12m_D1=2 then note_nbinc12m=0;
Pages - 44 -
Techniques de Scoring
data &tab;
set score;
classe=classe+1;
run;
data score;
set &tab;
keep score p_logit classe;
run;
Pages - 45 -
Techniques de Scoring
Run ;
Quit ;
%end;
%mend;
%classe_risque (score_var,1,10);
Pages - 46 -