Elaboration d`un score sur des emprunts immobiliers privés
Transcription
Elaboration d`un score sur des emprunts immobiliers privés
TECHNIQUES DE SCORING Projet Tutoré 2ième année IUP-IES 2007/2008 Baha-Eddine Aouni Carminda Cid Mael Jauniaux Techniques de Scoring 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 - Techniques de Scoring 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 - 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 … 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 - 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. 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 - Techniques de Scoring 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 - Techniques de Scoring 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 - Techniques de Scoring 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 - Techniques de Scoring 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 Modalités 1 Bornes 0-15.000 Crd_D2 3 1 +105.000 0-15.000 2 15.000- Critère du 105.000 2 3 15.000- 65.000- 65.000 105.000 4 +105.000 0.072 0.079 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 : 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 0.026 khi deux 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 0.339 0.444 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 : 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 0.071 0.091 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 Bornes <20 20-24 +24 <10 10-20 20-24 +24 Critère du 0.025 khi deux 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 Modalités 1 Bornes 0-5.000 2 apport_D2 3 1 +24.000 0-5.000 5.000- Critère du 24.000 2 3 5.000- 24.000- 24.000 160.000 4 +160.000 0.061 0.067 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 Modalités 1 Bornes 0-60.000 initial_D2 2 60.000110.000 Critère du 3 1 +110.000 0-20.000 2 3 20.000- 60.000- 60.000 220.000 +220.000 0.083 khi deux 4 0.094 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 Nbinc12m Modalités 1 2 Variable Bornes 0 +0 d'origine Critère du 0.406 0.515 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 Modalités Bornes Critère du khi deux 1 2 5.400- 14.000- 14.000 35.000 Revenus_D1 3 1 2 +35.000 5.400-14.000 +14.000 0.052 0.062 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 Bornes 0-15 15-27 +27 0-27 +27 Critère du 0.029 khi deux 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 - Techniques de Scoring 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 - 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 : C = { } { } Max x1j ,..., x pj ,0 − Min x1j ,..., x pj ,0 j i k ∑ ( Max{x j =1 i j 1 j p i } { j 1 j p × 100 } ,..., x ,0 − Min x ,..., x ,0 ) i 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 _pret_D1 _D1 _D2 _D2 age_D1 age_pret_D1 inc12m_D1 _D2 4,2 33,9 29,5 5,7 3,9 17 3 3,2 CONTRIBUTION Tableau 11 – Contribution des variables au score VARIABLES 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 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 - Techniques de Scoring 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 - 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. 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 Apprentissage Echantillon Test 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 - Techniques de Scoring 4.3 Indice de robustesse L’indice de robustesse se construit comme suit : IR= 1 − 2 * Giniapprentissage − Ginitest n apprentissage n Max 1 − ); (1 − test ) N test N apprentissage Où n représente le nombre de défaillants et N le nombre d’observations dans chaque base. 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 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 ij = { } Min x1j ,..., x pj − xij i k ∑ ( Max{x j =1 i j 1 } { } ,..., x pj ,0 − Min x1j ,..., x pj ,0 ) i Où x pj 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-0,3158 3,9 1,3 intermédiaire 24.000 >24.000 0 3,9 3,9 peu risqué Pages - 21 - Techniques de Scoring Variables Modalités Estimation Contributions Notes Niveau de risque <20.000 0 17,0 17,0 peu risqué 20.000-1,6743 17,0 2,9 intermédiaire 60.000 INITIAL_D2 60.000-1,597 17,0 3,5 intermédiaire 220.000 >220.000 -2,0147 17,0 0,0 très risqué 5.400-0,3067 2,6 0,0 très risqué REVENUS_D2 14.000 >14.000 0 2,6 2,6 peu risqué <15% 0 3,2 3,2 peu risqué ENDETTEMENT_D2 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 99,82% Score maximum 100 Score minimum 93,5 Classe 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 - 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 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 - Techniques de Scoring 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 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 mnt_apport1 = Montant de l apport Pages - 26 - Techniques de Scoring 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 - Techniques de Scoring Annexe 3 : Les tests utilisés Test de corrélation de Spearman H0 : ( ρ XY = 0 ) contre Ha ( ρ XY ≠ 0 ) n 6∑ ( R Xi − RYi ) 2 ρ = 1− i =1 n(n ² − 1) Où ρ XY est le cœfficient de corrélation entre la variable X et la variable Y, RXi (respectivement RYi) est le rang que prend Xi (respectivement Yi) par rapport aux autres valeurs de l'échantillon des X (respectivement Y) 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 K = ( N − 1) i⋅ −r )2 i =1 G ni ∑∑ (r ij −r )2 i =1 j =1 Où g est le nombre d’observations du groupe, rij le rang de l’observation j du groupe i, N le nombre total d’observations, r i⋅ est la moyenne des rij pour chaque groupe i, r est la moyenne pour tous les rij. ZR: { K ≥ χ ²( g − 1) } Pages - 28 - Techniques de Scoring 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ù 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 : Vuong = 1 N ∑t σ i i 2 t avec t i = ln( lilog it ) - ln( li probit ) 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 Annexe 4 : Programmes SAS %let chemin="H:\Credit-scoring\projet"; libname td &chemin; run; data tab; set td.Base_proj_sco_0708; run; %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"; run; /*************************************************************************/ /**************************NETTOYAGE DE LA BASE***************************/ /*************************************************************************/ /*doublons*/ proc sort data=tab nodupkey by id; run; ; /****TRAITEMENT DES VALEURS MANQUANTES****/ /*Pour les variables quantitatives*/ proc means data=tab; var &variables_quanti; title "valeurs manquantes variables quantitatives"; run; /*Pour les variables qualitatives*/ proc freq data= tab; table &variables_quali &y; title "valeurs manquantes variables qualitatives"; 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 proc means data=tab; var indice indice_age indice_montant; title "valeurs manquantes variables quantitatives"; run; /*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"; run; 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; /****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"; 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******************************/ /*************************************************************************/ /****CONSTRUCTION D'UN ECHANTILLON APPRENTISSAGE****/ 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; /****CONSTRUCTION D'UN ECHANTILLON TEST****/ proc sort data=tab; by id; proc sort data=echantillon_app; by id; run; data echantillon_test; merge tab (in=a) echantillon_app (in=b); by id; if a ne b; run; /****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; run; /*************************************************************************/ /****************************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; run; quit; %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, %kde_description(echantillon_app, %kde_description(echantillon_app, %kde_description(echantillon_app, %kde_description(echantillon_app, %kde_description(echantillon_app, %kde_description(echantillon_app, %kde_description(echantillon_app, %kde_description(echantillon_app, %kde_description(echantillon_app, age_client); crd); age_pret); duree_pret); duree_restante); montant_apport); montant_initial); nbinc12m); revenus); taux_endettement); proc univariate data=echantillon_app; var &variables_quanti; title "description des variables quantitatives"; run; /*Pour les variables qualitatives*/ proc gchart data=echantillon_app; vbar &variables_quali; title "repartition des variables qualitatives"; run; quit; proc freq data=echantillon_app; table &variables_qual; title "description des variables qualitatives"; run; /*************************************************************************/ /****************************ETUDE DES LIAISONS***************************/ /*************************************************************************/ /****VARIABLES QUANTITATIVES - VARIABLES QUANTITATIVES****/ proc corr spearman data=echantillon_app ; var &variables_quanti ; title "liaisons variables quantitatives - variables quantitatives"; run; /*on retire CRD et Duree_restante*/ /****VARIABLES QUALITATIVES - VARIABLES QUANTITATIVES****/ Pages - 33 - Techniques de Scoring proc npar1way wilcoxon data= echantillon_app correct=no; class &y; var &variables_quanti; title "liaisons variables qualitatives - variables quantitatives"; run; /*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; 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**********************/ /*************************************************************************/ /****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"; run; proc kde data=&tab (where=(impaye=1)) out = kdeimpaye1_&var_quanti; var &var_quanti; title "kde &var_quanti"; run; data tab_dens_&var_quanti; merge kdeimpaye0_&var_quanti (rename=(density=dens0)) kdeimpaye1_&var_quanti (rename=(density=dens1)); by &var_quanti; run; proc gplot data=tab_dens_&var_quanti; plot (dens1 dens0)*&var_quanti /overlay haxis= &deb to &fin by &incr; 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*/ proc gchart data=echantillon_app; vbar &variables_quali / subgroup=impaye; title "discretisation des variables qualitatives" ; run; quit; Pages - 35 - Techniques de Scoring /****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")); run; PROC FREQ DATA=class_&base; TABLE AGE_D1 AGE_D2 crd_d1 crd_d2 age_pret_d1 duree_pret_d2 duree_restante_d1 Pages - 36 - age_pret_d2 duree_pret_d1 Techniques de Scoring 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"; run; %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*****************************/ /*************************************************************************/ %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 - Techniques de Scoring title "modelisation logit"; RUN ; 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; run; proc means data=vuong mean std stderr t0 prt; var n_vuong; title"vuong"; run; proc means data=vuong vardef=n; var n_vuong; output out=resultat_vuong mean=moy std=stm n=n; title"vuong"; run; data resultat_vuong; set resultat_vuong; vuong=moy/(stm/sqrt(n)); proc print; title"résultat test de vuong"; run; /*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 - Techniques de Scoring /****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 - 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*****************************/ /*************************************************************************/ 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 - Techniques de Scoring 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); run; %macro classe_risque (tab,deb,fin); proc sort data=&tab; by score; run; proc rank data=&tab out=score descending groups=&fin; var score; ranks classe; run; data &tab; set score; classe=classe+1; run; data score; set &tab; keep score p_logit classe; run; %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; run; %end; %else %do; data classe_risque; set classe_risque classe_risque&i; run; %end; Proc DataSets LIBRARY=WORK ; Delete classe_risque&i ; Pages - 45 - Techniques de Scoring 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; run; PROC EXPORT DATA= classe_risque OUTFILE= "H:\Credit-scoring\projet\echelle_notation.xls" DBMS=excel REPLACE; RUN; Pages - 46 -