Beruflich Dokumente
Kultur Dokumente
*********************************************************************/
/*
*********************************************************************/
/*
ETUDE DE CAS EN STATISTIQUE DECISIONNELLE
/*
STEPHANE TUFFERY
/*
EDITIONS TECHNIP - 2009
/*
*********************************************************************/
/*
*********************************************************************/
/* 15/06/2009 - Version 1.0
*/
/*
*********************************************************************/
/*
CHAPITRE 2 : DATA MINING PREDICTIF
/*
*********************************************************************/
/* Le lecteur dsireux de tester le prsent programme dans un
environnement
Windows doit pralablement tlcharger sur le site des ditions
Technip :
- le fichier compress "base_assurance_segmentee.zip" contenant la table
SAS
"assurancetic_segm.sas7bdat"
- le code source des macro-programmes SAS xmacro.sas et treedisc.sas
- le fichier sasmacr.sas7bcat, qui contient le code compil du macroprogramme
"discretisation", utilis dans la section 2.5
(- pour les vrifications de la Conclusion (section 2.29) sur
l'chantillon
complmentaire de 4000 clients, le fichier compress
"base_assurance_validation.zip"
contenant la table SAS "assurancetic_validation.sas7bdat").
Le fichier "assurancetic_segm.sas7bdat" doit ensuite tre dcompress
dans
un rpertoire de travail qui sera utilis tout au long de la session
SAS.
C'est le fichier de donnes en entre du prsent programme.
C'est aussi le fichier cr par le programme du 1er chapitre.
Les macro-programmes xmacro.sas et treedisc.sas doivent aussi tre
placs dans le rpertoire de travail, de mme que le fichier
sasmacr.sas7bdat.
La macro-variable suivante C correspond au chemin menant au rpertoire
de travail */
/* Exemple sous Windows Vista : */
%LET C=C:\Users\Stphane\Documents\Datamining\Etudes de
cas\Assurance\Technip;
/* Exemple sous Windows XP : */
%LET C=C:\Documents and Settings\tufferst\My Documents\Data
Mining\Etudes de cas\Assurance\Technip;
/* Le sous-rpertoire des macros INSEE sera donc : "&C\Macros INSEE". */
/* La macro-variable suivante correspond la bibliothque SAS associe
par un LIBNAME au rpertoire de travail. */
LIBNAME assuranc "&C" ;
%LET ASSURANC=assuranc ;
/* ====================================================================
*/
/* SECTION 1.2
/* ====================================================================
*/
/* LECTURE DU FICHIER DE DONNEES */
DATA test ;
SET &ASSURANC..assurancetic_segm ;
RUN ;
/* CREATION D'UN STYLE ODS */
ODS PATH fmtccf.templat(update) sashelp.template(read)
sashelp.tmplmst(read) sasuser.templat(update) work.templat(update);
PROC TEMPLATE ;
DEFINE style Styles.EC ;
PARENT = styles.RTF ;
STYLE Header from HeadersAndFooters
"Controls the header style" /
JUST = center
BACKGROUND = GRAYEE ;
STYLE rowHeader from HeadersAndFooters
"Controls the header style" /
JUST = center
BACKGROUND = GRAYEE ;
END ;
RUN ;
/* OUVERTURE DU FICHIER ODS CONTENANT LES RESULTATS */
ODS RTF FILE = "&C\sas_assurance_predictif.doc" STYLE=Styles.EC ;
/* LISTE DES VARIABLES */
/* variables sociodmographiques */
0 = '
0 %'
1 = '1 - 10 %'
2 = '11 - 23%'
3 = '24 - 36%'
4 = '37 - 49%'
5 = '50 - 62%'
6 = '63 - 75%'
7 = '76 - 88%'
8 = '89 - 99%'
9 = '
100%' ;
VALUE typeclient
1 = 'Successful hedonists'
2 = 'Driven Growers'
3 = 'Average Family'
4 = 'Career Loners'
5 = 'Living well'
6 = 'Cruising Seniors'
7 = 'Retired and Religeous'
8 = 'Family with grown ups'
9 = 'Conservative families'
10 = 'Farmers';
RUN ;
/* ====================================================================
*/
/* SECTION 2.3.1
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* EXPLORATION DES DONNEES : PREMIERS TABLEAUX CROISES
/* -------------------------------------------------------------------*/
PROC UNIVARIATE DATA=test NORMAL ;
VAR &var ;
HISTOGRAM &var / NORMAL (MU=EST SIGMA=EST COLOR=black L=2) MIDPOINTS=0
to 9 by 1 ;
INSET MEAN MEDIAN CV NMISS NORMAL(KSDPVAL) NORMAL(ADPVAL)
NORMAL(CVMPVAL) ;
RUN ;
PROC UNIVARIATE DATA=test NORMAL ;
VAR &var ;
CLASS assur_caravane ;
HISTOGRAM &var / NORMAL (MU=EST SIGMA=EST COLOR=black) MIDPOINTS=0 to 9
by 1 ;
RUN ;
/* ====================================================================
*/
/* SECTION 2.3.2
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* Produits d'assurance : cohrence entre nombre de contrats et
cotisations
/* -------------------------------------------------------------------*/
PROC FREQ DATA=test;
TABLE
nb_RC
*
mt_RC
nb_RC_entreprise *
mt_RC_entreprise
nb_RC_agri
*
mt_RC_agri
nb_auto
*
mt_auto
nb_camion_livraison
*
mt_camion_livraison
nb_moto
*
mt_moto
nb_camion
*
mt_camion
nb_remorque
*
mt_remorque
nb_tracteur
*
mt_tracteur
nb_machine_agri
*
mt_machine_agri
nb_cyclomoteur
*
mt_cyclomoteur
nb_assur_vie
*
mt_assur_vie
nb_accident_perso *
mt_accident_perso
nb_accident_famil *
mt_accident_famil
nb_invalidite
*
mt_invalidite
nb_incendie
*
mt_incendie
nb_planche_voile *
mt_planche_voile
nb_bateau
*
mt_bateau
nb_velo
*
mt_velo
nb_MRH
*
mt_MRH
nb_securite_soc
*
mt_securite_soc
/ NOROW NOCOL ;
FORMAT &varmontant cotisation. ;
RUN ;
/* ====================================================================
*/
/* SECTION 2.3.3
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* Tableaux croiss entre variables explicatives et variable expliquer
/* -------------------------------------------------------------------*/
/* Tableaux croiss des montants avec la variable cible */
PROC FREQ DATA=test ;
/* ====================================================================
*/
/* SECTION 2.3.4
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* Cration de nouvelles variables explicatives
/* -------------------------------------------------------------------*/
DATA test ;
SET test ;
mt_contrats = SUM(OF mt_RC -- mt_securite_soc) ;
nb_contrats = SUM(OF nb_RC -- nb_securite_soc) ;
RUN ;
PROC FREQ DATA = test ;
TABLE (nb_contrats mt_contrats) * assur_caravane / NOCOL ;
RUN ;
PROC UNIVARIATE DATA=test NORMAL ;
VAR mt_contrats nb_contrats ;
HISTOGRAM mt_contrats nb_contrats / NORMAL (MU=EST SIGMA=EST
COLOR=black) MIDPOINTS=0 to 9 by 1 ;
RUN ;
PROC UNIVARIATE DATA=test NORMAL ;
VAR mt_contrats nb_contrats ;
CLASS assur_caravane ;
HISTOGRAM mt_contrats nb_contrats / NORMAL (MU=EST SIGMA=EST
COLOR=black) MIDPOINTS=0 to 9 by 1 ;
RUN ;
/* ====================================================================
*/
/* SECTION 2.3.4
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* Dtention de contrats d'assurance dans chaque segment de clientle
/* -------------------------------------------------------------------*/
/* La caractrisation qui est effectue ici repose sur le test de
Kruskal-Wallis
et la macro %INTERPRET de la section 1.6, cette macro mesurant
lintensit
et le sens de la liaison entre chaque montant de primes dassurances
et lindicatrice de chaque segment.*/
%MACRO interpret(cible) ;
PROC TRANSREG DATA = test DESIGN NOPRINT ;
MODEL CLASS (cluster / ZERO = NONE) ;
ID cle &var ;
OUTPUT OUT = segm_disjonctif (drop = _name_ _type_) ;
RUN ;
ODS EXCLUDE ALL ;
ODS OUTPUT KruskalWallisTest = kruskal WilcoxonScores = wilcoxon ;
PROC NPAR1WAY WILCOXON data=segm_disjonctif CORRECT=no;
CLASS &cible ;
VAR &varmontant ;
RUN ;
ODS SELECT ALL ;
DATA kruskal (keep = Variable nValue1 RENAME=(nValue1=KWallis));
SET kruskal;
WHERE name1 = '_KW_';
RUN;
PROC SORT DATA=wilcoxon; BY variable DESCENDING class;RUN;
DATA wilcoxon (keep = variable signe);
SET wilcoxon (keep = variable class Meanscore);
BY variable ;
RETAIN score 0;
IF first.variable THEN score = meanscore;
IF last.variable THEN do;
IF meanscore > score THEN signe = "moins" ;
ELSE signe = "plus" ;
OUTPUT;
END;
RUN;
PROC SORT DATA = kruskal; BY variable;
PROC SORT DATA = wilcoxon; BY variable;
DATA resultat;
MERGE kruskal wilcoxon ;
BY variable ;
RUN;
PROC SORT DATA=resultat;
BY DESCENDING KWallis;
RUN;
TITLE1 "Caractrisation de la variable &cible" ;
PROC PRINT DATA = resultat (obs = 20); RUN;
TITLE1 " " ;
%MEND interpret ;
%interpret(cluster1);
%interpret(cluster2);
%interpret(cluster3);
%interpret(cluster4);
/* ====================================================================
*/
/* SECTION 2.4
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* REGROUPEMENT DE MODALITES POUR LES VARIABLES DE PRIMES D'ASSURANCE
/* -------------------------------------------------------------------*/
PROC FORMAT;
VALUE cotis_auto
0-5
= '<= 999'
6-high = ' > 999';
VALUE cotis_incendie
0-2
= '
<= 99'
3
= '100 - 199'
4
= '200 - 499'
5-high = '
> 499';
RUN;
PROC FREQ DATA=test;
TABLE (mt_auto mt_incendie)*assur_caravane / CHISQ NOCOL;
FORMAT mt_auto cotis_auto. mt_incendie cotis_incendie.;
RUN;
/* ====================================================================
*/
/* SECTION 2.5
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* DISCRETISATION PAR ARBRE DE DECISION : MACRO TREEDISC DE SAS
/* -------------------------------------------------------------------*/
/* Il faut excuter auparavant les macros XMACRO et TREEDISC */
%INC "&C\xmacro.sas" ;
%INC "&C\treedisc.sas" ;
/* appel de la macro compile */
LIBNAME bibmacro "&C" ;
OPTIONS MSTORED sasmstore=bibmacro ;
%discretisation (test,assur_caravane,&varsociodemo,100,x,WORK);
/* Affichage des formats crs dans la bibliothque de formats
slectionne
et criture des formats crs dans un fichier WORK.FORMATS */
PROC FORMAT LIB=WORK FMTLIB CNTLOUT=formats; RUN ;
/* Cration d'une macro-variable "&vardiscrformat" contenant le nom de
chaque variable discrtise
/* dans l'tape prcdente et le nom du format correspondant cr
galement prcdemment
/* Cration d'une macro-variable "&vardiscr" contenant le nom de chaque
variable discrtise
/* Dans l'tape DATA ci-dessous le WHERE doit correspondre au prfixe
/* pass en paramtre dans la macro prcdente */
DATA temp (DROP=longueur) ;
SET formats (KEEP=fmtname WHERE=(fmtname =: "X"));
BY fmtname ;
longueur = LENGTH(fmtname) - 2;
name = SUBSTR(fmtname,2,longueur);
IF FIRST.fmtname THEN OUTPUT ;
RUN ;
PROC PRINT DATA = temp ;
RUN ;
PROC SQL NOPRINT ;
SELECT STRIP(name),
STRIP(name)!!" "!!STRIP(fmtname)!!"."
INTO : varDiscr
SEPARATED BY " ",
: varDiscrFormat SEPARATED BY " "
FROM temp
;
QUIT ;
/* Affichage de la valeur des macrovariables cres par l'tape
prcdente */
%PUT &vardiscr ;
%PUT &vardiscrformat ;
/* ====================================================================
*/
/* SECTION 2.6
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* Croisement des variables discrtises avec la variable cible
*/
/* -------------------------------------------------------------------*/
/*OPTION FMTSEARCH
= (SASUSER) ;*/
/* ====================================================================
*/
/* SECTION 2.7
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* Reprsentation graphique du taux de souscription de chaque variable
explicative
/* -------------------------------------------------------------------*/
%MACRO Distrivar (data, varY , varX) ;
%LET nb_var = %EVAL(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&varX)),' ')) + 1);
/* Affichage dans la fentre LOG du nombre de variables comptes */
%PUT Nombre de scores traits : &nb_var ;
/* Boucle pour traiter l'ensemble des variables passes en paramtre */
%DO i = 1 %TO &nb_var ;
/* On commence traiter la i me variable. */
/* ====================================================================
*/
/* SECTION 2.8
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* SELECTION DES VARIABLES : CALCULS DE CORRELATION
/* -------------------------------------------------------------------*/
PROC CORR DATA = test PEARSON SPEARMAN OUTP=pearson OUTS=spearman
NOPRINT;
VAR &vardetention;
PROC PRINT DATA=pearson ;
RUN ;
DATA pearson (DROP = _TYPE_ RENAME =(_NAME_ = variable1));
SET pearson;
WHERE _TYPE_ = "CORR";
PROC PRINT DATA=pearson; RUN ;
/* ====================================================================
*/
/* SECTION 2.9
/* ====================================================================
*/
/*
*/
/*
/*
/*
*/
/* ====================================================================
*/
/* SECTION 2.10
/* ====================================================================
*/
/*
*/
/*
/*
/*
*/
/* ====================================================================
*/
/* SECTION 2.11
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* SELECTION DES VARIABLES QUANTITATIVES PAR ANALYSE DISCRIMINANTE
/* -------------------------------------------------------------------*/
ODS OUTPUT Summary = varselec;
PROC STEPDISC DATA= test ;
CLASS assur_caravane ;
VAR &varsociodemo &varmontant ;
RUN;
PROC SQL NOPRINT ;
CREATE TABLE varselec2
AS SELECT Entered AS Variable, step
FROM varselec
WHERE Entered NOT IN (SELECT Removed FROM varselec)
ORDER BY step ;
SELECT Entered INTO : vardiscrim SEPARATED BY ' '
FROM varselec
WHERE Entered NOT IN (SELECT Removed FROM varselec)
ORDER BY step ;
QUIT ;
%PUT &vardiscrim ;
/* ====================================================================
*/
/* SECTION 2.12
/* ====================================================================
*/
/*
*/
/*
/*
/*
/*
/*
/*
/*
*/
model_tmp ParameterEstimates=param_tmp
= &data._tmp ;
= &ref) = &varX ;
%THEN FORMAT &format ; ;
RUN ;
PROC SQL ;
INSERT INTO boot_result
SELECT
a.effect AS variable, a.ProbChiSq AS prob,
(a.ProbChiSq <= 0.01 AND a.ProbChiSq > .) AS sig1,
(a.ProbChiSq > 0.01 AND a.ProbChiSq <= 0.05) AS sig2,
(a.ProbChiSq > 0.05 AND a.ProbChiSq <= 0.1) AS sig3,
(a.ProbChiSq > 0.1) AS sig4,
b.nb_Wald_bas, b.Wald AS Wald
FROM model_tmp AS a LEFT JOIN wald_tmp AS b
ON a.effect = b.variable AND a.replicate = b.replicate ;
QUIT ;
ODS SELECT ALL ;
PROC SUMMARY DATA = boot_result NWAY ;
CLASS variable ;
OUTPUT OUT = out_tmp (drop = _type_ rename = (_freq_ = count))
sum(sig1) = sum(sig2) = sum(sig3) = sum(sig4) = sum(nb_Wald_bas)=
min(Wald)=;
RUN ;
DATA out_tmp ;
SET out_tmp;
IF nb_Wald_bas = . THEN nb_Wald_bas = 0 ;
RUN ;
PROC SORT DATA=out_tmp ;
BY DESCENDING sig1 DESCENDING sig2 DESCENDING sig3 DESCENDING sig4
nb_Wald_bas ;
RUN ;
PROC PRINT DATA=out_tmp LABEL;
LABEL count='Occurrences';
RUN ;
%MEND SelectBoot ;
%SelectBoot(test , assur_caravane , '1' , &vardiscr &varmontant
type_client cluster , &vardiscr &varmontant type_client cluster ,
&vardiscrformat type_client typeclient.
&varmontant supzero. mt_auto cotis_auto. mt_incendie cotis_incendie.
age_moyen age. cluster, 1000);
/*
*/
/*
/*
/*
/*
/*
/* -------------------------------------------------------------------*/
%MACRO SelectBoot(data , varY , ref , varX , class , format , n ) ;
PROC SQL NOPRINT ;
CREATE TABLE boot_result
(variable CHAR(30) LABEL = 'Prdicteur', prob NUM FORMAT = 6.4,
sig1 NUM FORMAT = 4. LABEL = 'Signif 1%', sig2 NUM FORMAT = 4. LABEL =
'Signif 5%',
sig3 NUM FORMAT = 4. LABEL = 'Signif 10%', sig4 NUM FORMAT = 4. LABEL
= 'Non signif 10%',
nb_Wald_bas INT LABEL = 'nb Wald < 3.84',
Wald NUM FORMAT = 6.4 LABEL = '+ petit Wald des modalits') ;
SELECT COUNT(*) INTO :sample FROM &data;
QUIT ;
ODS EXCLUDE ALL ;
%DO i = 1 %TO &n ;
PROC SURVEYSELECT DATA = &data METHOD = urs OUT = &data._tmp SAMPSIZE =
&sample NOPRINT ;
RUN ;
ODS OUTPUT type3 =
PROC LOGISTIC DATA
FREQ numberhits ;
CLASS &class ;
MODEL &varY (event
%IF &format NE " "
RUN ;
model_tmp ParameterEstimates=param_tmp
= &data._tmp ;
= &ref) = &varX ;
%THEN FORMAT &format ; ;
/* ====================================================================
*/
/* SECTION 2.13
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* SYNTHESE DES SELECTIONS DE VARIABLES
/* -------------------------------------------------------------------*/
PROC RANK DATA=ChiSq OUT=ChiSqr DESCENDING ;
VAR abs_V_Cramer ;
RANKS RgCramer ;
RUN ;
PROC PRINT DATA=ChiSqr ; RUN ;
PROC RANK DATA=kruskal OUT=kruskalr DESCENDING ;
VAR KWallis ;
RANKS RgKruskal ;
RUN ;
PROC PRINT DATA=kruskalr ; RUN ;
PROC SORT DATA=varselec2 ; BY Variable ; RUN ;
PROC SORT DATA=ChiSqr ; BY Variable ; RUN ;
PROC SORT DATA=kruskalr ; BY Variable ; RUN ;
DATA synth_selec
MERGE varselec2
ChiSqr
kruskalr
BY Variable ;
IF a OR b OR c;
RUN ;
;
(in=a RENAME=(Step=RgDisc))
(in=b)
(in=c) ;
/* ====================================================================
*/
/* SECTION 2.14
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* SELECTION DE VARIABLES AU VU DU FICHIER SYNTHETIQUE PRECEDENT
/* -------------------------------------------------------------------*/
%LET varselect =
mt_auto
mt_incendie
revenu_moyen
mt_RC
pouvoir_achat
niv_etud_bas
revenu1
proprietaire
niv_etude_haut
auto0
auto1
revenu3
nb_incendie
mt_securite_soc
marie
PCStop
PCSagri
PCSouvr_quali
type_client
CLUSTER
;
/* ====================================================================
*/
/* SECTION 2.15
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* CLASSIFICATION DES VARIABLES
/* -------------------------------------------------------------------*/
PROC VARCLUS DATA = test OUTSTAT = resultat ;
VAR &varsociodemo &varmontant type_client cluster ;
RUN ;
DATA resultat (DROP = _name_) ;
SET resultat ;
WHERE _type_ = "GROUP" ;
RUN ;
PROC SORT DATA = resultat ;
BY DESCENDING _ncl_ ;
RUN ;
PROC SORT DATA = resultat NODUPKEY ;
BY _type_ ;
RUN ;
PROC TRANSPOSE DATA = resultat OUT = classes_var (DROP = _label_) NAME =
Variable PREFIX = noclasse ;
RUN ;
PROC SORT DATA = classes_var ; BY Variable ; RUN ;
PROC SORT DATA = synth_selec ; BY Variable ; RUN ;
DATA synth_selec2 ;
MERGE synth_selec (in=a)
classes_var (in=b) ;
BY Variable ;
IF a ;
RUN ;
PROC SORT ; BY DESCENDING KWallis ; RUN ;
PROC PRINT DATA = synth_selec2 ;
RUN ;
PROC EXPORT DATA = synth_selec2 OUTFILE = "&C\selection_variable2.xls"
DBMS=EXCEL REPLACE ;
RUN ;
/* -------------------------------------------------------------------*/
/* SELECTION DE VARIABLES AU VU DU FICHIER SYNTHETIQUE PRECEDENT
/* -------------------------------------------------------------------*/
%let varselect2 =
auto0
niv_etude_haut
pouvoir_achat
mt_RC_agri
niv_etud_bas
mt_incendie
sans_religion
mt_invalidite
nbpers_au_foyer
revenu_moyen
mt_securite_soc
concubin
PCSagri
mt_MRH
mt_auto
mt_RC
type_client
;
/* ====================================================================
*/
/* SECTION 2.16
/* ====================================================================
*/
/*
*/
/*
/*
/*
*/
%LET seed = 123;
DATA apprent valid test ;
SET test ;
IF RANUNI(&seed) < 0.66 THEN DO ; OUTPUT apprent ; cible =
assur_caravane ; OUTPUT test ; END ;
ELSE DO ; OUTPUT valid ;
cible = . ; OUTPUT
test ; END ;
RUN ;
PROC FREQ DATA = test ; TABLE cible*assur_caravane / MISSING ; RUN ;
PROC FREQ DATA = apprent ; TABLE assur_caravane ; RUN ;
PROC FREQ DATA = valid
; TABLE assur_caravane ; RUN ;
/*
*/
/*
/*
/*
*/
/* ====================================================================
*/
/* SECTION 2.17
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* MACROS DE CALCUL D'AIRE SOUS LA COURBE ROC
/* -------------------------------------------------------------------*/
%MACRO AUC(data,cible,score,ciblepart,borne);
ODS OUTPUT WilcoxonScores = wilcoxon;
PROC NPAR1WAY WILCOXON DATA=&data CORRECT=no;
where &ciblepart LT &borne;
CLASS &cible;
VAR &score;
RUN;
DATA auc;
SET wilcoxon;
n0 = N; R0 = SumOfScores ;
n1 = LAG(N); R1 = LAG(SumOfScores) ;
U1 = (n1*n0) + (n1*(n1+1)/2) - R1 ;
U0 = (n1*n0) + (n0*(n0+1)/2) - R0 ;
AUC = ROUND(MAX(U1,U0)/(n1*n0),0.001) ;
RUN;
PROC PRINT DATA=auc (KEEP = AUC) NOOBS;
TITLE "Aire sous la courbe ROC de &data";
WHERE AUC > .;
RUN;
/* ====================================================================
*/
/* SECTION 2.18
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* ANALYSE DISCRIMINANTE LINEAIRE
/* -------------------------------------------------------------------*/
/* SECTION 2.18.1 */
/* Analyse discriminante sur l'ensemble des variables */
PROC DISCRIM DATA=apprent METHOD=normal POOL=yes CROSSVALIDATE ALL
CANONICAL
OUT=scores OUTSTAT=statdescr TESTDATA=valid TESTOUT=validout ;
CLASS assur_caravane ;
PRIORS prop ;
VAR &varsociodemo &varmontant ;
RUN;
%AUC2(scores,assur_caravane,_1);
%AUC2(validout,assur_caravane,_1);
/* SECTION 2.18.2 */
/* Analyse discriminante sur une slection de 21 variables */
PROC TRANSPOSE DATA = statdescr OUT = coeff_discrim ;
WHERE _type_ = "SCORE";
RUN ;
DATA coeff_discrim ;
SET coeff_discrim ;
Coeff = ABS(Can1) ;
RUN ;
PROC SORT DATA=coeff_discrim ; BY DESCENDING Coeff; RUN;
PROC PRINT DATA=coeff_discrim ;
RUN ;
PROC DISCRIM DATA=apprent METHOD=normal POOL=yes crossvalidate all
canonical
OUT= scores OUTSTAT=statdescr TESTDATA=valid TESTOUT=validout ;
CLASS assur_caravane ;
PRIORS prop;
VAR locataire assur_sante_prive assur_sante_public proprietaire mt_auto
marie niv_etud_bas
mt_bateau autre_relation mt_incendie mt_securite_soc PCSinter
mt_invalidite revenu1
sans_enfant revenu2 age_moyen auto0 niv_etud_moy mt_velo PCSouvr ;
RUN;
%AUC2(scores,assur_caravane,_1);
%AUC2(validout,assur_caravane,_1);
/* SECTION 2.18.3 */
/* Analyse discriminante sur les 10 premires variables de la liste
prcdente */
PROC DISCRIM DATA=apprent METHOD=normal POOL=yes crossvalidate all
canonical
OUT= scores OUTSTAT=statdescr TESTDATA=valid TESTOUT=validout ;
CLASS assur_caravane ;
PRIORS prop ;
VAR locataire assur_sante_prive assur_sante_public proprietaire mt_auto
marie niv_etud_bas mt_bateau autre_relation mt_incendie ;
RUN ;
%AUC2(scores,assur_caravane,_1);
%AUC2(validout,assur_caravane,_1);
/* SECTION 2.18.4 */
/* ====================================================================
*/
/* SECTION 2.19
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* CLASSEMENT PAR ARBRE DE DECISION : MACRO TREEDISC DE SAS
/* -------------------------------------------------------------------*/
/* Il faut excuter auparavant les macros XMACRO et TREEDISC */
%INC "&C\xmacro.sas" ;
%INC "&C\treedisc.sas" ;
%TREEDISC( data=apprent, depvar=assur_caravane, ordinal=&varmontant
&varsociodemo,
outtree=arbre, branch=100, leaf=50, maxdepth=3,
options=noformat, trace=short);
/* Trace l'arbre : cette fonctionnalit ncessite le module SAS/OR pour
la PROC NETDRAW */
%TREEDISC(intree=arbre, draw=lp);
%TREEDISC(intree=arbre, draw=graphics);
/* Gnre le code SAS pour un classement des observations */
%TREEDISC( intree=arbre, code=print);
/* Sauvegarde le code dans un fichier nomm arbre.code */
%TREEDISC( intree=arbre, code="&C\chaid.code")
/* Application du classement par arbre l'chantillon d'apprentissage
*/
DATA arbre_apprent ;
SET apprent ;
%INC "&C\chaid.code" ;
IF into_ = 0 THEN proba = 1-post_ ; ELSE proba = post_ ;
RUN ;
/* Application du classement par arbre l'chantillon de validation */
DATA arbre_valid ;
SET valid ;
%INC "&C\chaid.code" ;
IF into_ = 0 THEN proba = 1-post_ ; ELSE proba = post_ ;
RUN ;
%AUC2(arbre_apprent,assur_caravane,proba);
%AUC2(arbre_valid,assur_caravane,proba);
/* ====================================================================
*/
/* SECTION 2.20
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* REGRESSION LOGISTIQUE SUR VARIABLES QUANTITATIVES
/* -------------------------------------------------------------------*/
/* SECTION 2.20.1 et 2.20.2 */
/* Syntaxe de base de la rgression logistique (sur toutes les
variables) */
PROC LOGISTIC DATA=test ;
MODEL cible (ref='0') = &var / SELECTION=stepwise RSQUARE ;
OUTPUT OUT=modele1 PREDICTED=proba1 ;
RUN ;
%AUC(modele1,assur_caravane,proba1,cible,0);
PROC LOGISTIC DATA=apprent ;
MODEL assur_caravane (ref='0') = &var /SELECTION=stepwise RSQUARE ;
SCORE DATA=apprent OUT=apprent_score;
SCORE DATA=valid
OUT=valid_score;
RUN ;
%AUC2(apprent_score, assur_caravane,P_1);
%AUC2(valid_score, assur_caravane,P_1);
/* SECTION 2.20.3 */
/* Rgression logistique sur toutes les variables avec des seuils plus
svres */
PROC LOGISTIC DATA=test ;
MODEL cible (ref='0') = &var / SELECTION=stepwise SLE=0.01 SLS=0.01
RSQUARE ;
OUTPUT OUT=modele1 PREDICTED=proba1 ;
RUN ;
%AUC(modele1,assur_caravane,proba1,cible,0);
/* SECTION 2.20.4 */
/* Rgression logistique avec slection descendante sur toutes les
variables */
PROC LOGISTIC DATA=test ;
MODEL cible (ref='0') = &var / SELECTION=backward SLE=0.01 SLS=0.01
RSQUARE ;
OUTPUT OUT=modele2 PREDICTED=proba2 ;
RUN ;
%AUC(modele2,assur_caravane,proba2,cible,0);
/* SECTION 2.20.5 */
/* Rgression logistique sur les 21 variables slectionnes par la PROC
STEPDISC */
PROC LOGISTIC DATA=test ;
MODEL cible (ref='0') = &vardiscrim / SELECTION=stepwise RSQUARE ;
/* ====================================================================
*/
/* SECTION 2.21
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* REGRESSION LOGISTIQUE SUR VARIABLES DISCRETISEES
/* -------------------------------------------------------------------*/
/* SECTION 2.21.1 */
/* Syntaxe de base de la rgression logistique (sur toutes les
variables) */
OPTION FMTSEARCH
= (WORK SASUSER) ;
RUN ;
SYMBOL1 v=CIRCLE i=JOIN c=BLACK;
SYMBOL2 v=SQUARE i=JOIN c=BLACK;
SYMBOL3 v=TRIANGLE i=JOIN c=BLACK;
AXIS LABEL = (ANGLE = 90) ;
PROC GPLOT DATA=stats_modele_tmp ;
WHERE Step > 0 ;
PLOT InterceptAndCovariates*step = Criterion / HMINOR = 1 VAXIS=axis ;
RUN ;
QUIT ;
/* SECTION 2.21.5 */
/* Affinage du meilleur modle */
PROC FREQ DATA=test ;
TABLES (revenu_moyen niv_etud_bas mt_auto mt_invalidite mt_incendie
mt_bateau type_client) * assur_caravane / NOCOL;
FORMAT &vardiscrformat type_client typeclient.
&varmontant supzero. mt_auto cotis_auto. mt_incendie cotis_incendie. ;
RUN ;
PROC FORMAT ;
VALUE niv_etud
0-2
= '0 2'
3-high = '3 et plus' ;
VALUE cotis_incendie_bis
0-2
= '
<= 99 ou > 499'
3
= '100 - 199'
4
= '200 - 499'
5-high = '
<= 99 ou > 499' ;
RUN ;
ODS HTML;
ODS GRAPHICS ON;
ODS OUTPUT ParameterEstimates=coeff_logit
/* -------------------------------------------------------------------*/
/* Graphique de la densit du score en fonction des valeurs de la
variable cible */
/* MACRO-PROGRAMME NON PUBLIE DANS L'OUVRAGE
/* -------------------------------------------------------------------*/
%MACRO scoreDist (table, variableScore, variableY, nbPoints = 30) ;
PROC SORT DATA = &table ;
BY &variableY ;
RUN ;
ODS EXCLUDE ALL ;
%IF &sysVer >= 9 %THEN %DO ;
PROC KDE DATA = &table ;
UNIVAR &variableScore / OUT = work.distribution NGRID
= &nbPoints ;
%LET variableScore = value ;
%END ;
%ELSE %DO ;
PROC KDE DATA = &table OUT = work.distribution NGRID =
&nbPoints ;
VAR &variableScore ;
%END ;
BY &variableY ;
RUN ;
ODS SELECT ALL ;
SYMBOL i = spline ;
PROC GPLOT DATA = work.distribution ;
PLOT density * &variableScore = &variableY / HREF = .5
HAXIS = 0
TO 1 BY .2 ;
RUN ; QUIT ;
%MEND scoreDist ;
%scoreDist(modele8,proba8,assur_caravane,nbPoints =10);
/* SECTION 2.21.6 */
/* Implmentation du modle logistique */
DATA modele8 ;
SET modele8 ;
logit = -2.9411
+ (mt_auto >= 6) * 1.4911
- (mt_incendie <= 2) * 1.1303
- (mt_incendie >= 5) * 1.1303
- (mt_incendie = 3) * 0.2967
- (revenu_moyen <= 3) * 0.6029
+ (niv_etud_bas <= 2) * 0.5460 ;
score_logit = exp(logit) / (1 + exp(logit));
IF abs(score_logit - proba8) > 0.01 THEN ecart = 1 ;
ELSE ecart = 0 ;
RUN ;
PROC FREQ ; TABLES ecart ; RUN;
/* ====================================================================
*/
/* SECTION 2.22
/* ====================================================================
*/
/*
*/
/*
/*
/*
/*
*/
/* ====================================================================
*/
/* SECTION 2.23
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* Bagging sur arbres de dcision
/* --------------------------------------------------------------------
*/
%MACRO Bagging (apprent, valid , varY , varXordinal , varXnominal ,
min_feuille, n ) ;
%INC "&C\xmacro.sas" ;
%INC "&C\treedisc.sas" ;
PROC SQL NOPRINT ;
SELECT COUNT(*) INTO :sample FROM &apprent;
QUIT ;
%PUT &sample ;
%DO iter = 1 %TO &n ;
PROC SURVEYSELECT DATA = &apprent METHOD = urs OUT = &apprent._tmp
SAMPSIZE = &sample OUTHITS NOPRINT ;
RUN ;
%TREEDISC( data=&apprent._tmp, depvar=&varY, ordinal=&varXordinal,
nominal=&varXnominal,
outtree=modele, leaf=&min_feuille, maxdepth=3,
options=noformat, trace=none);
%TREEDISC( intree=modele, code="&C\arbre.code")
DATA arbre&iter (KEEP = cle &varY proba) ;
SET &valid ;
%INC "&C\arbre.code" ;
IF into_ = 0 THEN proba = 1-post_ ; ELSE proba = post_ ;
RUN ;
%IF &iter = 1 %THEN %DO ;
DATA bagging_tmp ;
SET arbre&iter ;
RUN ;
%END ;
%ELSE %DO ;
PROC APPEND BASE = bagging_tmp
DATA = arbre&iter ;
RUN ;
%END ;
PROC SORT DATA=bagging_tmp ; BY cle ; RUN ;
PROC SUMMARY DATA = bagging_tmp NWAY ;
CLASS cle ;
OUTPUT OUT = bagging_agreg (drop = _type_ _freq_) MEAN(proba)=
MEAN(&varY)=;
RUN ;
ODS EXCLUDE ALL ;
ODS OUTPUT WilcoxonScores = wilcoxon;
PROC NPAR1WAY WILCOXON DATA=bagging_agreg CORRECT=no;
CLASS &varY;
VAR proba;
RUN;
ODS SELECT ALL ;
DATA auc_tmp (KEEP = auc) ;
SET wilcoxon;
n0 = N; R0 = SumOfScores ;
n1 = LAG(N); R1 = LAG(SumOfScores) ;
U1 = (n1*n0) + (n1*(n1+1)/2) - R1 ;
U0 = (n1*n0) + (n0*(n0+1)/2) - R0 ;
AUC = ROUND(MAX(U1,U0)/(n1*n0),0.001) ;
RUN ;
%IF &iter = 1 %THEN %DO ;
DATA auc_out ;
SET auc_tmp ;
WHERE AUC > .;
RUN ;
%END ;
%ELSE %DO ;
PROC APPEND BASE = auc_out
DATA = auc_tmp ;
WHERE AUC > .;
RUN ;
%END ;
%END ;
PROC SORT DATA=bagging_tmp ; BY cle ; RUN ;
PROC SUMMARY DATA = bagging_tmp NWAY ;
CLASS cle ;
OUTPUT OUT = bagging_out (drop = _type_ rename = (_freq_ = count))
MEAN(proba)= STD(proba) = proba_std MEAN(&varY)=;
RUN ;
%MEND Bagging ;
%Bagging (apprent, valid , assur_caravane , &varmontant &varsociodemo ,
type_client cluster , 50, 100);
/*
*/
/*
/*
/*
*/
%PUT &sample ;
%DO iter = 1 %TO &n ;
PROC SURVEYSELECT DATA = &apprent METHOD = urs OUT = &apprent._tmp
SAMPSIZE = &sample OUTHITS NOPRINT ;
RUN ;
PROC DISCRIM DATA=&apprent._tmp METHOD=normal POOL=yes crossvalidate all
canonical NOPRINT
OUT= scores OUTSTAT=statdescr TESTDATA=&valid TESTOUT=adl&iter (KEEP =
cle &varY _1 RENAME=(_1=proba)) ;
CLASS &varY ;
PRIORS prop;
VAR &varX ;
RUN;
%IF &iter = 1 %THEN %DO ;
DATA bagging_tmp ;
SET adl&iter ;
RUN ;
%END ;
%ELSE %DO ;
PROC APPEND BASE = bagging_tmp
DATA = adl&iter ;
RUN ;
%END ;
PROC SORT DATA=bagging_tmp ; BY cle ; RUN ;
PROC SUMMARY DATA = bagging_tmp NWAY ;
CLASS cle ;
OUTPUT OUT = bagging_agreg (drop = _type_ _freq_) MEAN(proba)=
MEAN(&varY)=;
RUN ;
ODS EXCLUDE ALL ;
ODS OUTPUT WilcoxonScores = wilcoxon;
PROC NPAR1WAY WILCOXON DATA=bagging_agreg CORRECT=no;
CLASS &varY;
VAR proba;
RUN;
ODS SELECT ALL ;
DATA auc_tmp (KEEP = auc) ;
SET wilcoxon;
n0 = N; R0 = SumOfScores ;
n1 = LAG(N); R1 = LAG(SumOfScores) ;
U1 = (n1*n0) + (n1*(n1+1)/2) - R1 ;
U0 = (n1*n0) + (n0*(n0+1)/2) - R0 ;
AUC = ROUND(MAX(U1,U0)/(n1*n0),0.001) ;
RUN ;
%IF &iter = 1
DATA auc_out
SET auc_tmp
WHERE AUC >
%THEN %DO ;
;
;
.;
RUN ;
%END ;
%ELSE %DO ;
PROC APPEND BASE = auc_out
DATA = auc_tmp ;
WHERE AUC > .;
RUN ;
%END ;
%END ;
PROC SORT DATA=bagging_tmp ; BY cle ; RUN ;
PROC SUMMARY DATA = bagging_tmp NWAY ;
CLASS cle ;
OUTPUT OUT = bagging_out (drop = _type_ rename = (_freq_ = count))
MEAN(proba)= STD(proba) = proba_std MEAN(&varY)=;
RUN ;
%AUC2(bagging_out,&varY,proba);
%MEND BaggingADL ;
%BaggingADL (apprent, valid , assur_caravane , mt_auto pouvoir_achat
mt_bateau mt_RC niv_etud_bas marie , 100);
/*
*/
/*
/*
/*
*/
PROC FORMAT ;
VALUE niv_etud
0-2
= '0 2'
3-high = '3 et plus' ;
VALUE cotis_incendie_bis
0-2
= '
<= 99 ou > 499'
3
= '100 - 199'
4
= '200 - 499'
5-high = '
<= 99 ou > 499' ;
RUN ;
%MACRO BaggingLogit (data , varY , varYappr , varX , varXclasse ,
selection, n ) ;
PROC SQL NOPRINT ;
SELECT COUNT(*) INTO :sample FROM &data WHERE &varYappr > . ;
QUIT ;
%PUT &sample ;
/* ====================================================================
*/
/* SECTION 2.22
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* CROISEMENT DES SCORES : DISCRIMINANT, CHAID, LOGISTIQUE
/* ET BAGGING (EN VALIDATION)
/* -------------------------------------------------------------------*/
/*
*/
/*
/*
/*
*/
/*
*/
/*
/*
/*
*/
SORT
SORT
SORT
SORT
DATA
DATA
DATA
DATA
=
=
=
=
DATA compscores ;
MERGE validout
(IN=a KEEP = cle _1 assur_caravane)
arbre_valid (IN=b KEEP = cle proba )
modele8
(IN=c KEEP = cle proba8)
bagging_out (IN=d KEEP = cle proba RENAME=(proba=proba_bagging)) ;
BY cle ;
IF a AND b AND c AND d ;
LABEL _1 = 'ADL' proba = 'CHAID' proba8 = 'LOGIT' proba_bagging =
'BAGGING' ;
RUN ;
ODS HTML ;
ODS GRAPHICS ON ;
PROC CORR DATA = compscores PEARSON SPEARMAN PLOTS = (MATRIX SCATTER) ;
VAR _1 proba proba8 proba_bagging ;
RUN ;
ODS GRAPHICS OFF ;
ODS HTML CLOSE ;
/* AUC des quatre modles sur l'chantillon de validation */
%AUC2(compscores,assur_caravane,_1); /* AUC = 0,745 */
%AUC2(compscores,assur_caravane,proba); /* AUC = 0,737 */
%AUC2(compscores,assur_caravane,proba8); /* AUC = 0,744 */
%AUC2(compscores,assur_caravane,proba_bagging); /* AUC = 0,759 environ
*/
/* -------------------------------------------------------------------*/
/* Modles retenus pour chaque mthode
/* Recalcul sur l'chantillon de validation de 4000 clients (voir la
section 2.29)
/* CODE SAS NON PRESENTE DANS L'OUVRAGE */
/* -------------------------------------------------------------------*/
DATA validation ;
SET &ASSURANC..assurancetic_validation ;
RUN ;
PROC DISCRIM DATA=apprent METHOD=normal POOL=yes crossvalidate all
canonical
OUT= scores OUTSTAT=statdescr TESTDATA=validation TESTOUT=adl_validation
;
CLASS assur_caravane ;
PRIORS prop;
VAR mt_auto pouvoir_achat mt_bateau mt_RC niv_etud_bas marie ;
RUN;
DATA arbre_validation ;
SET validation ;
%INC "&C\chaid.code" ;
IF into_ = 0 THEN proba = 1-post_ ; ELSE proba = post_ ;
run;
DATA logit_validation ;
SET validation ;
nbpoints = SUM (40*(mt_auto >= 6),22*(mt_incendie = 3),30*(mt_incendie
= 4),
16*(revenu_moyen > 3),14*(niv_etud_bas <= 2)) ;
logit = -2.9411 + (mt_auto >= 6) * 1.4911
- (mt_incendie <= 2) * 1.1303
- (mt_incendie >= 5) * 1.1303
- (mt_incendie = 3) * 0.2967
- (revenu_moyen <= 3) * 0.6029
+ (niv_etud_bas <= 2) * 0.5460 ;
score_logit = exp(logit) / (1 + exp(logit));
RUN ;
%Bagging (apprent, validation , assur_caravane , &varmontant
&varsociodemo , type_client cluster , 50, 100);
PROC
PROC
PROC
PROC
SORT
SORT
SORT
SORT
DATA
DATA
DATA
DATA
=
=
=
=
adl_validation ;
arbre_validation
logit_validation
bagging_out ; BY
BY cle ; RUN ;
; BY cle ; RUN ;
; BY cle ; RUN ;
cle ; RUN ;
DATA compscores_valid ;
MERGE adl_validation
(IN=a KEEP = cle _1 assur_caravane)
arbre_validation (IN=b KEEP = cle proba )
logit_validation (IN=c KEEP = cle nbpoints score_logit)
bagging_out
(IN=d KEEP = cle proba
RENAME=(proba=proba_bagging)) ;
BY cle ;
IF a AND b AND c AND d ;
LABEL _1 = 'ADL' proba = 'CHAID' proba8 = 'LOGIT' proba_bagging =
'BAGGING' ;
RUN ;
ODS HTML ;
ODS GRAPHICS ON ;
PROC CORR DATA = compscores_valid PEARSON SPEARMAN PLOTS = (MATRIX
SCATTER) ;
VAR
RUN
ODS
ODS
DATA meilleurs ;
SET meilleurs ;
IF _n_ <= 800 ;
run;
PROC FREQ DATA=meilleurs ;
TABLE assur_caravane ;
RUN ;
/* les 800 meilleurs scors par rgression logistique contiennent 119
souscripteurs */
/* les 800 meilleurs scors par bagging CHAID contiennent environ 117
souscripteurs */
/* pour mmoire, le concours TIC avait un 1er 121, un 2e 115 et
plusieurs 3e ex aequo
112 souscripteurs */
/* ====================================================================
*/
/* SECTION 2.24
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* COURBE DE LIFT ET COURBE ROC
/* -------------------------------------------------------------------*/
RUN ;
DATA roc&i (KEEP = vpos fpos modele);
SET pct&i END = fin;
WHERE pct_col > .;
RETAIN vpos fpos ;
IF &variableY = &ref THEN DO;
vposM + pct_col ;
vpos = vposM ;
END ;
IF &variableY NE &ref THEN DO;
fposM + pct_col ;
fpos = fposM ;
END ;
LENGTH modele $20. ;
modele = "MODELE &i : &score" ;
IF MOD(_n_,2) = 0 THEN OUTPUT ;
IF fin THEN
vpos =
fpos =
modele
OUTPUT
modele
OUTPUT
END ;
IF fin THEN
vpos =
fpos =
modele
OUTPUT
END ;
DO ;
0 ;
0 ;
= "MODELE &i : &score " ;
;
= "ALEATOIRE " ;
;
DO ;
100 ;
100 ;
= "ALEATOIRE " ;
;
RUN ;
%IF &i = 1 %THEN %DO ;
DATA lift_tmp ;
SET lift&i ;
RUN ;
%END ;
%ELSE %DO ;
PROC APPEND BASE = lift_tmp
DATA = lift&i ;
RUN ;
%END ;
%IF &i = 1 %THEN %DO ;
DATA roc_tmp ;
SET roc&i ;
RUN ;
%END ;
%ELSE %DO ;
PROC APPEND BASE = roc_tmp
DATA = roc&i ;
RUN ;
%END ;
%END ;
PROC SORT DATA=lift_tmp;
BY fct_score ;
RUN ;
PROC SORT DATA=roc_tmp;
BY fpos ;
RUN ;
GOPTIONS RESET=all; QUIT;
SYMBOL i = join ;
/*SYMBOL1 v=DOT i=JOIN c=BLACK;
SYMBOL2 v=SQUARE i=JOIN c=BLACK;
SYMBOL3 v=TRIANGLE i=JOIN c=BLACK;
SYMBOL4 v=CIRCLE i=JOIN c=BLACK;
SYMBOL5 v=DIAMOND i=JOIN c=BLACK;
SYMBOL6 v=STAR i=JOIN c=BLACK;*/
PROC GPLOT DATA = lift_tmp ;
TITLE 'Courbe de lift' ;
PLOT lift * fct_score = modele ;
LABEL lift = "% positifs" fct_score = "% population par score
dcroissant" ;
RUN ;
PROC GPLOT DATA = roc_tmp ;
TITLE 'Courbe ROC' ;
PLOT vpos * fpos = modele ;
LABEL vpos = "% vrais positifs" fpos = "% faux positifs" ;
RUN ;
QUIT ;
%MEND Courbelift ;
%Courbelift (compscores , _1 proba proba8 proba_bagging , assur_caravane
, 1 , 20 ) ;
/* ====================================================================
*/
/* SECTION 2.26
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* COURBE ROC
/* -------------------------------------------------------------------*/
DATA roc ;
SET roc8 ;
BY _step_ ;
OUTPUT ;
IF last._step_ THEN DO ;
_sensit_ = 0 ; _1mspec_ = 0 ; OUTPUT ;
END ;
RUN;
SYMBOL1 i=join v=none c=black;
PROC GPLOT DATA=roc ;
/*
WHERE _step_ IN (1 2); */
TITLE 'Courbe ROC' ;
PLOT _sensit_*_1mspec_=1 / VAXIS=0 TO 1 BY .1 ;
RUN;
QUIT;
/* ====================================================================
*/
/* SECTION 2.27
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* CALCUL DE LA GRILLE DE SCORE
/* -------------------------------------------------------------------*/
/*
PROC SQL ;
CREATE TABLE coeff_tmp
AS SELECT Variable , ClassVal0, Estimate , Estimate - MIN(Estimate) AS
delta_coeff FROM coeff_logit GROUP BY Variable ;
SELECT SUM(delta_coeff) INTO : total_poids FROM coeff_tmp
WHERE delta_coeff IN (SELECT delta_coeff FROM coeff_tmp GROUP BY
Variable HAVING delta_coeff = MAX(delta_coeff)) ;
QUIT ;
%PUT &total_poids ;
*/
PROC SORT DATA=coeff_logit OUT=coeff_tmp ;
BY Variable Estimate ;
RUN ;
DATA coeff_tmp2 ;
SET coeff_tmp END=fin ;
BY Variable ;
RETAIN min max delta_tot 0;
IF first.Variable THEN DO min = Estimate ; max = 0 ; END ;
delta_coeff = SUM(Estimate , - min) ;
/* ====================================================================
*/
/* SECTION 2.28
/* ====================================================================
*/
/* -------------------------------------------------------------------*/
/* DECOUPAGE DE LA GRILLE DE SCORE
/* -------------------------------------------------------------------*/
points'
points'
points'
points';