TECHNIQUES DE SCORING Projet Tutoré 2 ième année IUP-IES 2007/2008 Baha-Eddine Aouni Carminda Cid Mael Jauniaux
Table des Matières 1 INTRODUCTION 4 2 AVANT L ESTIMATION 5 2.1 NETTOYAGE ET DATA SPLITTING 5 2.1.1 TRAITEMENT DES VALEURS MANQUANTES 5 2.1.2 TRAITEMENT DES VALEURS ABERRANTES 5 2.1.3 DATA SPLITTING 6 2.2 STATISTIQUES UNIVARIEES 6 2.3 PRESELECTION DES VARIABLES ET ETUDES DES LIAISONS 9 2.3.1 VARIABLES QUANTITATIVES VS. VARIABLES QUANTITATIVES 9 2.3.2 VARIABLES QUALITATIVES VS. VARIABLES QUANTITATIVES 9 2.3.3 VARIABLES QUALITATIVES VS. VARIABLES QUALITATIVES 9 2.4 TRANSFORMATION DES VARIABLES 10 2.4.1 DISCRETISATION DES VARIABLES QUANTITATIVES 10 2.4.2 REGROUPEMENT DES VARIABLES QUALITATIVES 14 3 ESTIMATION DU MODELE 15 3.1 PRESENTATION 15 3.2 ANALYSE DES RESULTATS 15 4 ANALYSE DES PERFORMANCES 17 4.1 COURBES DE DENSITE 17 4.2 COURBES DE PERFORMANCE 18 4.2.1 COURBE DE ROC 18 4.2.2 COURBES DE SELECTION 18 4.2.3 COURBES DE PERFORMANCE 19 4.2.4 COURBES DE DISCRIMINATION 19 4.3 INDICE DE ROBUSTESSE 20 5 GRILLE DE SCORE ET ECHELLE DE NOTATION 21 5.1 LA GRILLE DE SCORE 21 Pages - 2 -
5.2 ECHELLE DE NOTATION 22 6 CONCLUSION 23 ANNEXES ET INDEX 24 INDEX DES TABLEAUX 25 ANNEXE 1 : LISTE DES VARIABLES 26 ANNEXE 2 : REFERENCE DES VARIABLES EXPLICATIVES 27 ANNEXE 3 : LES TESTS UTILISES 28 TEST DE CORRELATION DE SPEARMAN 28 TEST DE KRUSKAL-WALLIS 28 TEST DU KHI DEUX 29 TEST DE VUONG 29 ANNEXE 4 : PROGRAMMES SAS 30 Pages - 3 -
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 -
2 Avant l estimation 2.1 Nettoyage et Data Splitting 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. 2.1.1 Traitement des valeurs manquantes 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. 2.1.2 Traitement des valeurs aberrantes 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 -
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. 2.1.3 Data Splitting 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%). 2.2 Statistiques Univariées Les statistiques présentées ci-dessous sont issues de l échantillon d apprentissage. Capital restant dû : montant du capital restant à rembourser La variable oscille autour d une moyenne de 72.455 avec une médiane de 67.886. En étudiant la courbe de densité, nous remarquons deux modes autour de 10.000 et 100.000. Pages - 6 -
Age client : âge du client détenant le crédit immobilier Notre échantillon est composé d'individus dont la moyenne d'âge est de 37 ans et la médiane 35 ans. L échantillonnage a réduit notre fourchette d âge. Les valeurs extrêmes sont 19 et 89 ans. Age prêt : durée passée depuis le déblocage du prêt Les individus de notre échantillon ont contracté leur emprunt depuis un an en moyenne. L emprunt le plus ancien a 15 ans. En observant la courbe de densité, nous remarquons que le nombre d emprunts contractés il y a plus de trois ans est faible. Durée prêt : durée totale déterminée à l origine du prêt La durée moyenne d un prêt est de 18 ans, alors que la médiane est de 20 ans. La durée d'un prêt peut atteindre la valeur extrême de 30 ans. La courbe de densité s'organise autour de deux modes (8 ans et 25 ans). Cette variable est fortement volatile : sa variance est de 43,5. Durée restante : durée restant avant la dernière échéance du prêt La durée restante est une fonction linéaire de l âge du prêt et de la durée du prêt. Nous observons que sa moyenne est de 17, sa médiane est de 19. Tout comme durée_prêt, la variable durée_restante est organisée autour de deux modes et présente une forte volatilité. 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. Montant initial : montant du prêt déterminé à l origine du prêt L emprunt moyen s élève à plus de 87.000. La médiane est de 89.000. L emprunt minimum s élève à 1.300 tandis que l emprunt maximum s élève à 1.800.000. Nombre de trimestres en incident sur l année d observation : La majeure partie des individus (plus de 90% de notre échantillon) n a pas connu d incident de paiement. Cette part diminue avec le nombre d incidents. Pages - 7 -
Revenus : revenus du client Les revenus des clients s élèvent en moyenne à 20.500. La médiane est de 17.000. Le revenu minimum correspond au R.M.I., le revenu maximum est de 700.000. La courbe de densité montre une forte concentration de la variable autour de son mode (18.000 ); très peu de revenus sont supérieurs à 40.000. Taux d endettement : taux d endettement du client à la date de déblocage du crédit immobilier et en tenant compte de ce dernier Les individus sont endettés en moyenne à hauteur de 24%, ce taux pouvant fluctuer entre 0.1% et 33.33%. Nous remarquons que les individus à fort taux d endettement sont plus représentés dans notre échantillon. Plus de la moitié de notre échantillon a un taux d'endettement supérieur à 26%. PCS : Catégorie Socioprofessionnelle Les catégories les plus représentées sont celles des employées, des ouvriers et des professions intermédiaires. Ces catégories comptent en moyenne 6.000 individus. Les catégories les moins représentées sont les professions libérales et la catégorie regroupant les agriculteurs, les commerçants et les artisans. Situation familiale : situation familiale du client Nous comptons environ 12.500 individus mariés. Ce sont les individus les plus représentés devant les concubins et les célibataires. Les personnes veuves ou pacsées sont très faiblement représentées. Type bien : bien immobilier ancien ou neuf La plupart des emprunts contractés sont destinés à financer un bien immobilier neuf (près de 16.000 individus). Pages - 8 -
2.3 Présélection des variables et études des liaisons 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. 2.3.1 Variables quantitatives vs. Variables quantitatives 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. 2.3.2 Variables qualitatives vs. Variables quantitatives 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. 2.3.3 Variables qualitatives vs. Variables qualitatives 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 -
2.4 Transformation des variables Afin de faciliter l'estimation et la lisibilité de la grille de score, il est recommandé de discrétiser les variables quantitatives et de regrouper les modalités des variables qualitatives. Afin d optimiser ces transformations et notamment d éviter les effets de seuil, nous maximisons un critère d'indépendance du khi deux. 2.4.1 Discrétisation des variables quantitatives Deux approches s'offrent à nous : l'approche graphique et l'approche statistique. L'approche graphique consiste à comparer les courbes de densité de chaque variable pour chaque sousgroupe de la variable à expliquer. L approche statistique est un approche dynamique qui consiste à maximiser systématiquement le critère du khi deux. A cet effet, nous avons conçu une macro boucle maximisant ce critère pour chaque découpage en trois classes possible. Toutefois l utilisation de cette macro nécessitait un espace sur le disque dur trop important pour tourner. Les classes que nous proposons ci-dessous résultent donc de l approche graphique. 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 -
Age client : Age _D2 Age _D1 Modalités 1 2 3 1 2 3 4 Bornes 18-31 31-52 +52 18-24 24-34 34-54 +54 Critère du khi deux 0.026 0.037 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 : Age _pret_d1 Age _pret_d2 Modalités 1 2 1 2 3 4 Bornes 0-3 +3 0-1 1-2 2-3 +3 Critère du khi deux 0.444 0.339 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 : duree _pret_d1 duree _pret_d2 Modalités 1 2 3 1 2 3 4 5 Bornes <14 14-24 +24 <7 7-12 12-21 21-24 +24 Critère du khi deux 0.091 0.071 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 -
Durée restante : Duree_restante_D1 Duree_restante_D2 Modalités 1 2 3 1 2 3 4 Bornes <20 20-24 +24 <10 10-20 20-24 +24 Critère du khi deux 0.025 0.056 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 -
Montant initial : 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. Nombre de trimestres en incident sur l année d observation : Nb_inc12m_D1 Modalités 1 2 Bornes 0 +0 Nbinc12m Variable 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 : 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 Revenus_D2 Revenus_D1 Modalités 1 2 3 1 2 Bornes 5.400-14.000-14.000 35.000 +35.000 5.400-14.000 +14.000 Critère du khi deux 0.052 0.062 Tableau 9 - Discrétisation de la variable revenus Pages - 13 -
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 Bornes 0-15 15-27 +27 0-27 +27 Critère du khi deux 0.029 0.026 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. 2.4.2 Regroupement des variables qualitatives 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 -
3 Estimation du modèle 3.1 Présentation L estimation s effectue sur notre échantillon d apprentissage. L ensemble des variables explicatives sont désormais qualitatives. Il nous faut alors spécifier une modalité de référence pour chacune d entre elles (cf. Annexe 2 : Référence des variables explicatives). Cette référence représente la modalité la moins risquée de manière à obtenir des coefficients négatifs facilitant l interprétation et la construction de la grille de score. Etant donné que la variable à modéliser est binaire, nous estimons le modèle via une régression du type Logit puis Probit. Nous modélisons la probabilité de ne pas être défaillant (impaye=1). Pour chaque type de régression, trois démarches de sélection des variables sont possibles : backward, forward et stepwise. Pour sélectionner la meilleure, il suffit de comparer les statistiques d ajustement du modèle. Nous choisirons la méthode avec le critère d AIC maximum. Or, il s est avéré que ces critères étaient proches pour chaque méthode. Nous avons préféré la sélection du type backward. Le test de Vuong nous permet de déterminer laquelle des deux régressions est la plus appropriée (cf. Annexe 3 : Les tests utilisés). Sa statistique est de 1. Ainsi, la régression du type Logit représente le mieux nos données. 3.2 Analyse des résultats 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 -
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 : Où C j x p est le coefficient estimé de la modalité i (i = 1,, p) de la variable j (j = 1,, k) de l échantillon apprentissage. j= 1 ( Max Ci-dessous se trouvent les résultats. VARIABLES age_d1 age_pret_d1 j = k Max i i j j j j { x,..., x,0} Min{ x,..., x,0} 1 j j j j { x,..., x,0} Min{ x,..., x,0}) 1 p p nb_ inc12m_d1 Duree _pret_d1 apport _D1 100 initial _D2 revenus _D2 Endettement _D2 CONTRIBUTION 4,2 33,9 29,5 5,7 3,9 17 3 3,2 Tableau 11 Contribution des variables au score i i 1 1 p p 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 -
4 Analyse des performances 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). 4.1 Courbes de densité 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 -
4.2 Courbes de performance 4.2.1 Courbe de Roc 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. 4.2.2 Courbes de sélection Echantillon test Echantillon apprentissage 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 -
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. 4.2.3 Courbes de performance Echantillon Test Echantillon Apprentissage 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. 4.2.4 Courbes de discrimination Echantillon Test Echantillon Apprentissage La courbe de discrimination relie la part d individus sains à la part d individus défaillants. Les courbes sont similaires sur les deux échantillons et sont éloignées de la bissectrice vers le haut, ce qui confirme les conclusions tirées des précédentes courbes. Pages - 19 -
4.3 Indice de robustesse L indice de robustesse se construit comme suit : IR= 1 2 * Gini n Max 1 N apprentissage apprentissage apprentissage Gini test n );(1 N Où n représente le nombre de défaillants et N le nombre d observations dans chaque base. test 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 -
5 Grille de score et échelle de notation 5.1 La grille de score 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. N j i = k j= 1 ( Max i Min j j { x,..., x } x j j j j { x,..., x,0} Min{ x,..., x,0}) 1 i 1 p p i j i 1 p Où j x p est le coefficient de la modalité i (i = 1,, p) de la variable j (j = 1,, k). La grille de score se construit à partir des estimations sur l échantillon apprentissage. L estimation de notre référence est fixée, par définition, à 0. Les notes les plus basses correspondent au niveau de risque le plus élevé. Les individus sont répartis selon trois niveaux de risque : faible, intermédiaire, élevé. De plus, la note maximale de la variable correspond bien à sa contribution. Les résultats sont présentés dans le tableau suivant. Variables AGE_D1 AGE_PRET_D1 NB_INC12M_D1 DUREE_PRET_D1 APPORT_D1 Modalités Estimation Contributions Notes Niveau de risque 18-24 -0,5 4,2 0,0 très risqué 24-34 0 4,2 4,2 peu risqué 34-54 -0,4025 4,2 0,8 très risqué >54-0,4271 4,2 0,6 intermédiaire 0-3 0 33,9 33,9 peu risqué >3-4,0058 33,9 0,0 très risqué 0 0 29,5 29,5 peu risqué >0-3,4868 29,5 0,0 très risqué <14 0 5,7 5,7 peu risqué 14-24 -0,6689 5,7 0,0 très risqué >24-0,4366 5,7 2,0 intermédiaire <5.000-0,466 3,9 0,0 très risqué 5.000-24.000-0,3158 3,9 1,3 intermédiaire >24.000 0 3,9 3,9 peu risqué Pages - 21 -
Variables INITIAL_D2 REVENUS_D2 ENDETTEMENT_D2 Modalités Estimation Contributions Notes Niveau de risque <20.000 0 17,0 17,0 peu risqué 20.000-60.000-1,6743 17,0 2,9 intermédiaire 60.000-220.000-1,597 17,0 3,5 intermédiaire >220.000-2,0147 17,0 0,0 très risqué 5.400-14.000-0,3067 2,6 0,0 très risqué >14.000 0 2,6 2,6 peu risqué <15% 0 3,2 3,2 peu risqué 15-27% -0,3156 3,2 0,5 très risqué >27% -0,3805 3,2 0,0 très risqué Tableau 12 Grille de score 5.2 Echelle de notation L échelle de notation permet d effectuer un découpage de notre score en 10 classes afin d avoir des probabilités de ne pas être défaillant différentes pour chaque classe. Le numéro de classe est croissant avec le risque associé et décroissant avec la probabilité estimée. Probabilité de ne pas être défaillant Score maximum Score minimum Classe 99,82% 100 93,5 1 99,72% 93,4 88,7 2 99,40% 88,5 79,8 3 98,87% 79,7 77 4 98,54% 76,9 75,5 5 98,37% 75,5 74,2 6 98,05% 74,1 72,9 7 97,72% 72,8 71,1 8 97,03% 71 67,7 9 57,56% 67,6 3,7 10 Tableau 13 Echelle de notation Pages - 22 -
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 -
Annexes et Index Pages - 24 -
Index des tableaux TABLEAU 1 - DISCRETISATION DE LA VARIABLE CRD 10 TABLEAU 2 - DISCRETISATION DE LA VARIABLE AGE_CLIENT 11 TABLEAU 3 - DISCRETISATION DE LA VARIABLE AGE_PRET 11 TABLEAU 4 - DISCRETISATION DE LA VARIABLE DUREE_PRET 11 TABLEAU 5 - DISCRETISATION DE LA VARIABLE DUREE_RESTANTE 12 TABLEAU 6 - DISCRETISATION DE LA VARIABLE MONTANT_APPORT 12 TABLEAU 7 - DISCRETISATION DE LA VARIABLE MONTANT_INITIAL 13 TABLEAU 8- DISCRETISATION DE LA VARIABLE NBINC12M 13 TABLEAU 9 - DISCRETISATION DE LA VARIABLE REVENUS 13 TABLEAU 10 - DISCRETISATION DE LA VARIABLE ENDETTEMENT 14 TABLEAU 11 CONTRIBUTION DES VARIABLES AU SCORE 16 TABLEAU 12 GRILLE DE SCORE 22 TABLEAU 13 ECHELLE DE NOTATION 22 Pages - 25 -
Annexe 1 : Liste des variables # Variable Type Libellé 1 CRD Num CRD = Capital restant dû 4 PCS Alph cl_profession = CSP en modalités 2 age_client Num age_client = age du client 12 age_pret Num age_pret = Age du prêt 9 duree_pret Num 11 duree_restante Num 14 id Num 15 impaye Num 7 montant_apport Num mnt_apport1 = Montant de l apport 6 montant_initial Num 13 nbinc12m Num inc = Nombre de trimeste en incident l année N 10 revenus Num revenu1 = Montant des revenus 3 situfam Alph 8 taux_endettement Num 5 type_bien Alph Pages - 26 -
Annexe 2 : Référence des variables explicatives 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 -
Annexe 3 : Les tests utilisés Test de corrélation de Spearman Où ρ XY H 0 : ( ρ XY= 0 ) contre Ha ( ρ XY 0 ) ρ = 6 n i= 1 1 ( R Xi R n( n² 1) est le cœfficient de corrélation entre la variable X et la variable Y, R Xi (respectivement R Yi ) est le rang que prend X i (respectivement Y i ) par rapport aux autres valeurs de l'échantillon des X (respectivement Y) Yi ) 2 α α ZR: { ρ > t ( n,1 ) ou ρ < t( n, ) } 2 2 Test de Kruskal-Wallis H 0 : (pas de différence entre les k populations) contre Ha : (au moins une des populations est différente des autres populations) K G i i= 1 = ( N 1) G ni 2 n ( r r) i= 1 j = 1 i 2 ( r r) ij Où g est le nombre d observations du groupe, r ij le rang de l observation j du groupe i, N le nombre total d observations, pour tous les r ij. r i est la moyenne des r ij pour chaque groupe i, r est la moyenne ZR: { K χ ²( g 1) } Pages - 28 -
Test du khi deux 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) K= i, j ( Oij Eij)² Eij Où O ij est la valeur observée et E ij 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 ti N i Vuong = avec t 2 i = σ t ln( l log it i ) - ln( l probit i ) 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 -
Annexe 4 : Programmes SAS %let chemin="h:\credit-scoring\projet"; libname td &chemin; data tab; set td.base_proj_sco_0708; %let variables_quanti= crd age_client age_pret duree_pret duree_restante montant_apport montant_initial nbinc12m revenus taux_endettement; /*variables quantitatives de la base*/ %let variables_quali=pcs situfam type_bien; /*variables qualitatives de la base*/ %let y=impaye; /*variable à modéliser*/ /*************************************************************************/ /****************************LA BASE DE DONNEES***************************/ /*************************************************************************/ proc contents data=tab; title "contenu table"; /*************************************************************************/ /**************************NETTOYAGE DE LA BASE***************************/ /*************************************************************************/ /*doublons*/ proc sort data=tab nodupkey ; by id; /****TRAITEMENT DES VALEURS MANQUANTES****/ /*Pour les variables quantitatives*/ proc means data=tab; var &variables_quanti; title "valeurs manquantes variables quantitatives"; /*Pour les variables qualitatives*/ proc freq data= tab; table &variables_quali &y; title "valeurs manquantes variables qualitatives"; data tab; set tab; indice=montant_apport/montant_initial; indice_age=age_client-age_pret; indice_montant=crd-montant_initial; Pages - 30 -
proc means data=tab; var indice indice_age indice_montant; title "valeurs manquantes variables quantitatives"; /*on prend un seuil de 19 ie. apport 19* sup au prêt*/ proc means data=tab; class pcs; var revenus; title "description pcs*revenus"; 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; /****TRAITEMENT DES VALEURS ABERRANTES****/ /*Proc Logistic Data=tab ; Class &variables_quali / PARAM=REF ; Model IMPAYE (Event='1')= &variables_quanti &variables_quali / Link=logit ; output out=respearson reschi=pearson h=hatmatrix; Run ; proc means data=respearson; where pearson<-2 or pearson>2; var pearson; title "valeurs aberrantes _ Pearson"; */ 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*/ /*************************************************************************/ /*****************************DATA SPLITTING******************************/ /*************************************************************************/ /****CONSTRUCTION D'UN ECHANTILLON APPRENTISSAGE****/ proc surveyselect Pages - 31 -
data=tab method=srs rep=1 seed=1234 samprate=70 out=echantillon_app; title "construction echantillon apprentissage"; /****CONSTRUCTION D'UN ECHANTILLON TEST****/ proc sort data=tab; by id; proc sort data=echantillon_app; by id; data echantillon_test; merge tab (in=a) echantillon_app (in=b); by id; if a ne b; /****VERIFICATION DE LA COHERANCE DES ECHANTILLONS****/ proc freq data=echantillon_app; table &y; title "verification echantillonnage"; proc freq data=echantillon_test; table &y; proc freq data=tab; table &y; /*************************************************************************/ /****************************ETUDE EXPLORATOIRE***************************/ /*************************************************************************/ /****STATISTIQUES DESCRIPTIVES****/ /*Pour les variables quantitatives*/ Proc gchart data=echantillon_app; title "statistiques descriptives "; vbar age_client/ subgroup=impaye midpoints=18 to 78 by 1; vbar crd/subgroup=impaye midpoints=0 to 660000 by 10000; vbar age_pret/ subgroup=impaye midpoints=0 to 21 by 1; vbar duree_pret/subgroup=impaye midpoints=0 to 40 by 1; vbar duree_restante/ subgroup=impaye midpoints=18 to 30 by 1; vbar montant_apport/subgroup=impaye midpoints=0 to 300000 by 10000; vbar montant_initial/ subgroup=impaye midpoints=0 to 300000 by 10000; vbar nbinc12m/subgroup=impaye midpoints=0 to 4 by 1; vbar revenus/ subgroup=impaye midpoints=0 to 217000 by 10000 ; vbar taux_endettement/subgroup=impaye; quit; %macro KDE_description(tab,var_quanti); proc kde data=&tab out = kde_&var_quanti ; Pages - 32 -
var &var_quanti ; title "kde &var_quanti"; 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"; 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); proc univariate data=echantillon_app; var &variables_quanti; title "description des variables quantitatives"; /*Pour les variables qualitatives*/ proc gchart data=echantillon_app; vbar &variables_quali; title "repartition des variables qualitatives"; quit; proc freq data=echantillon_app; table &variables_qual; title "description des variables qualitatives"; /*************************************************************************/ /****************************ETUDE DES LIAISONS***************************/ /*************************************************************************/ /****VARIABLES QUANTITATIVES - VARIABLES QUANTITATIVES****/ proc corr spearman data=echantillon_app ; var &variables_quanti ; title "liaisons variables quantitatives - variables quantitatives"; /*on retire CRD et Duree_restante*/ /****VARIABLES QUALITATIVES - VARIABLES QUANTITATIVES****/ Pages - 33 -
proc npar1way wilcoxon data= echantillon_app correct=no; class &y; var &variables_quanti; title "liaisons variables qualitatives - variables quantitatives"; /*pval<0.05 variable discriminante*/ /****VARIABLES QUALITATIVES - VARIABLES QUALITATIVES****/ /*test du chi-deux*/ %macro test_chideux(tab,var); Proc Freq data=&tab; tables impaye*&var/chisq; output out= resultat n chisq; Data resultat; set resultat; T=sqrt((_pchi_/N)/sqrt(df_pchi)); keep N _pchi_ df_pchi t; proc print data=resultat; title "resultat liaison &var"; 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**********************/ /*************************************************************************/ /****DISCRETISATION DES VARIABLES QUANTITATIVES****/ %macro KDE_discretisation (tab,var_quanti,deb,fin,incr); proc kde data=&tab (where=(impaye=0)) out = kdeimpaye0_&var_quanti ; var &var_quanti ; title "kde &var_quanti"; proc kde data=&tab (where=(impaye=1)) out = kdeimpaye1_&var_quanti; var &var_quanti; title "kde &var_quanti"; data tab_dens_&var_quanti; merge kdeimpaye0_&var_quanti (rename=(density=dens0)) kdeimpaye1_&var_quanti (rename=(density=dens1)); by &var_quanti; proc gplot data=tab_dens_&var_quanti; plot (dens1 dens0)*&var_quanti /overlay haxis= &deb to &fin by &incr; Pages - 34 -
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"; 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*/ proc gchart data=echantillon_app; vbar &variables_quali / subgroup=impaye; title "discretisation des variables qualitatives" ; quit; Pages - 35 -
/****DISCRETISATION DES VARIABLES QUANTITATIVES****/ %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","vmconcubins-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","vmconcubins-pacs")) ; type_bien=1*(type_bien in("ancien")) + 2*(type_bien in("neuf")); PROC FREQ DATA=class_&base; TABLE AGE_D1 AGE_D2 crd_d1 crd_d2 age_pret_d1 age_pret_d2 duree_pret_d1 duree_pret_d2 duree_restante_d1 Pages - 36 -
duree_restante_d2 apport_d1 apport_d2 initial_d1 initial_d2 revenus_d1 revenus_d2 endettement_d1 endettement_d2 pcs_r1 pcs_r2 situfam_r1 situfam_r2 situfam_r3 type_bien; title "verif discretisation &base"; %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 -
%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); Proc Freq data=essai; tables impaye*d_&var/chisq; output out=resultat n chisq; title "critére automatique &var"; Data resultat; set resultat; Pages - 38 -
T=sqrt((_pchi_/N)/sqrt(df_pchi)); class1=&i; class2=&i+&j; data test_&var; set test_&var resultat ; keep t and class1 and class2 ; %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*****************************/ /*************************************************************************/ %let variables_mod=age_d1 crd_d1 age_pret_d1 NB_INC12M_D1 duree_pret_d1 /*duree_restante_d2*/ apport_d1 initial_d2 revenus_d2 endettement_d2 pcs situfam_r1 type_bien; %let variables_class=age_d1 (ref="2") crd_d1 (ref="1") age_pret_d1 (ref="1") duree_pret_d1 (ref="1") /*duree_restante_d2*/ apport_d1 (ref="3") initial_d2 (ref="1") revenus_d2 (ref="2") endettement_d2 (ref="1") pcs (ref="prof_lib") situfam_r1 (ref="4") type_bien (ref="2") NB_INC12M_D1 (ref="1"); /*référence modalité la moins risquée*/ /****CHOIX DU MODELE PAR LE TEST DE VUONG****/ PROC LOGISTIC DATA = class_echantillon_app; 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_APP_logit p=p_logit PREDICTED=Y_Chapeau XBETA=Y_Etoile_Chapeau ; Pages - 39 -
RUN ; title "modelisation logit"; PROC LOGISTIC DATA = class_echantillon_app; CLASS &variables_class/ PARAM=REF ; MODEL IMPAYE (Event='1') = &variables_mod / OUTROC = Tab_Roc_App Selection=Backward SLS=0.05 Link=Probit; OUTPUT OUT=TAB_SCORE_ECH_APP_probit p=p_probit PREDICTED=Y_Chapeau XBETA=Y_Etoile_Chapeau ; title "modelisation probit"; RUN ; data vuong; merge TAB_SCORE_ECH_APP_logit TAB_SCORE_ECH_APP_probit; l_logit=impaye*log(p_logit)+(1-impaye)*log(1-p_logit); l_probit=impaye*log(p_probit)+(1-impaye)*log(1-p_probit); n_vuong=l_logit-l_probit; proc means data=vuong mean std stderr t0 prt; var n_vuong; title"vuong"; proc means data=vuong vardef=n; var n_vuong; output out=resultat_vuong mean=moy std=stm n=n; title"vuong"; data resultat_vuong; set resultat_vuong; vuong=moy/(stm/sqrt(n)); proc print; title"résultat test de vuong"; /*Suite au test de vuong, on choisit le logit*/ /****CALIBRAGE DU MODELE****/ PROC LOGISTIC DATA = class_echantillon_app; CLASS &variables_class / PARAM=REF ; MODEL IMPAYE (Event='1') = &variables_mod / OUTROC = Tab_Roc_App Selection=Backward SLS=0.05 Link=logit lackfit; OUTPUT OUT=TAB_SCORE_ECH_APP_logit p=p_logit PREDICTED=Y_Chapeau XBETA=Y_Etoile_Chapeau ; title "regression logit Test d'hosmer et Lemeshow "; RUN ; /*si pval>0.05 alors le modèle ne trahit pas les données ici, la pval est inférieure */ /****QUALITE DU MODELE****/ PROC LOGISTIC DATA = class_echantillon_app; CLASS &variables_class / PARAM=REF ; MODEL IMPAYE (Event='1') = &variables_mod / OUTROC = Tab_Roc_App Selection=Backward SLS=0.05 Link=logit RSQUARE ; OUTPUT OUT=TAB_SCORE_ECH_APP_logit p=p_logit PREDICTED=Y_Chapeau XBETA=Y_Etoile_Chapeau ; title"regression logit R² ajusté de Nagelkerke"; RUN ; /* R2 de 0.50*/ Pages - 40 -
/****CONTRIBUTION****/ /*cf grille de score sur fichier Excel*/ /*************************************************************************/ /************************ANALYSE DES PERFORMANCES*************************/ /*************************************************************************/ /****COURBE DE ROC****/ Proc Logistic Data=class_echantillon_App OutEst=Tab_Est ; Class &variables_class / PARAM=REF ; Model IMPAYE (Event='1')= &variables_mod / Link=logit OutRoc=ROC_APP ; Run ; proc gplot data= class_echatillon_app ; PLOT _SENSIT_*(_1MSPEC SENSIT_) / OVERLAY ; title "courbe de Roc echantillon apprentissage"; RUN ; QUIT ; /*--- Echantillon test ---*/ Proc Logistic Data=class_echantillon_Test InEst=Tab_Est ; Class &variables_class / PARAM=REF ; Model IMPAYE (Event='1')= &variables_mod /Link=logit OutRoc=ROC_TEST MaxIter=0 ; Run ; PROC GPLOT DATA = ROC_TEST ; PLOT _SENSIT_*(_1MSPEC SENSIT_) / OVERLAY ; title "Courbe de Roc "; RUN ; QUIT ; /****COURBES DE DENSITE DES SCORES****/ %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); /****COURBES DE SELECTION, PERFORMANCE, DISCRIMINATION****/ %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 -
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 -
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; %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 -
Data IR; merge gini_test gini_app; by i; 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; /*bon indice de robustesse entre 0.90 et 1*/ /*************************************************************************/ /*****************************GRILLE DE SCORE*****************************/ /*************************************************************************/ ods HTML FILE=&chemin; PROC LOGISTIC DATA = class_echantillon_app; 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_app_logit p=p_logit PREDICTED=Y_Chapeau XBETA=Y_Etoile_Chapeau ; title"coeff pour contribution"; RUN ; ods HTML close; ods HTML FILE=&chemin; PROC LOGISTIC DATA = class_tab; 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_tab_logit p=p_logit PREDICTED=Y_Chapeau XBETA=Y_Etoile_Chapeau ; title"grille score"; RUN ; ods HTML close; 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 -
if duree_pret_d1=1 then note_duree_pret=5.7; if duree_pret_d1=2 then note_duree_pret=0; if duree_pret_d1=3 then note_duree_pret=2; if apport_d1=1 then note_apport=0; if apport_d1=2 then note_apport=1.3; if apport_d1=3 then note_apport=3.9; if initial_d2=1 then note_initial=17; if initial_d2=2 then note_initial=2.9; if initial_d2=3 then note_initial=3.5; if initial_d2=4 then note_initial=0; if revenus_d2=1 then note_revenus=0; if revenus_d2=2 then note_revenus=2.6; if endettement_d2=1 then note_endettement=3.2; if endettement_d2=2 then note_endettement=0.5; if endettement_d2=3 then note_endettement=0; score=sum (note_age, note_age_pret,note_nbinc12m, note_duree_pret, note_apport, note_initial, note_revenus, note_endettement); %macro classe_risque (tab,deb,fin); proc sort data=&tab; by score; proc rank data=&tab out=score descending groups=&fin; var score; ranks classe; data &tab; set score; classe=classe+1; data score; set &tab; keep score p_logit classe; %do i=&deb %to &fin; proc sql; create table classe_risque&i as select mean(p_logit*100)as probabilite_sain, max(score) as score_max, min(score)as score_min, classe from score where classe=&i group by classe; quit; %if &i=1 %then %do ; data classe_risque; set classe_risque&i; %end; %else %do; data classe_risque; set classe_risque classe_risque&i; %end; Proc DataSets LIBRARY=WORK ; Delete classe_risque&i ; Pages - 45 -
Run ; Quit ; %end; %mend; %classe_risque (score_var,1,10); proc sort data=score_var; by classe; proc univariate data=score_var; var &variables_quanti; by classe; PROC EXPORT DATA= classe_risque OUTFILE= "H:\Credit-scoring\projet\echelle_notation.xls" DBMS=excel REPLACE; RUN; Pages - 46 -