/* *********************************************************************/
/* *********************************************************************/
/*            ETUDE DE CAS EN STATISTIQUE DECISIONNELLE
/*                       STEPHANE TUFFERY
/*                    EDITIONS TECHNIP - 2009
/* *********************************************************************/
/* *********************************************************************/

/* 15/06/2009 - Version 1.0                                            */

/* *********************************************************************/
/*                 CHAPITRE 1 : DATA MINING DESCRIPTIF
/* *********************************************************************/

/* Le lecteur désireux de tester le présent programme dans un environnement 
Windows doit préalablement télécharger sur le site des éditions Technip :
- le fichier compressé "base_assurance.zip" contenant la table SAS
"assurancetic.sas7bdat"
- le fichier compressé "analyse_donnees.zip" contenant le catalogue
de macros SAS "sasmacr.sas7bcat".

Le fichier "assurancetic.sas7bdat" doit ensuite être décompressé dans
un répertoire de travail qui sera utilisé tout au long de la session SAS.
C'est le fichier de données en entrée du présent programme.

Le catalogue de macros "sasmacr.sas7bcat" doit être décompressé dans un
sous-répertoire appelé "Macros INSEE" du répertoire de travail.

La macro-variable suivante C correspond au chemin menant au répertoire de travail */

/* Exemple sous Windows Vista : */
%LET C=C:\Users\Stéphane\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-répertoire des macros INSEE sera donc : "&C\Macros INSEE". */

/* La macro-variable suivante correspond à la bibliothèque SAS associée
par un LIBNAME au répertoire de travail. */
LIBNAME assuranc "&C" ;
%LET ASSURANC=assuranc ;

/* ==================================================================== */
/* SECTION 1.2
/* ==================================================================== */

/* LECTURE DU FICHIER DE DONNEES */

DATA test ;
 SET &ASSURANC..assurancetic ;
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_descriptif.doc" STYLE=Styles.EC ;

/* LISTE DES VARIABLES */

%LET var = nbpers_au_foyer catholique protestant autre_religion
sans_religion marie concubin autre_relation celibataire
sans_enfant avec_enfant niv_etude_haut niv_etud_moy niv_etud_bas
PCStop PCScadre PCSagri PCSinter PCSouvr_quali PCSouvr locataire
proprietaire auto1 auto2 auto0 revenu1 revenu2 revenu3 revenu4
revenu5 ;

/* FORMAT SAS UTILISES */

PROC FORMAT ;
VALUE age
1     = ' < 30 ans'
2     = '30-40 ans'
3     = '40-50 ans'
4     = '50-60 ans'
5     = '60-70 ans'
6     = ' > 70 ans' ;
VALUE autrevar
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%' ;
RUN ;

/* CREATION DE VARIABLES D'AGE */

DATA test ;
SET test ;
agemoins30 = (age_moyen = 1) * 9 ;
age30a40 = (age_moyen = 2) * 9 ;
age40a50 = (age_moyen = 3) * 9 ;
age50a60 = (age_moyen = 4) * 9 ;
age60a70 = (age_moyen = 5) * 9 ;
ageplus70 = (age_moyen > 5) * 9 ;
RUN ;

%LET var_avec_age =
&var agemoins30 age30a40 age40a50 age50a60 age60a70 ageplus70 ;

/* ==================================================================== */
/* SECTION 1.3.1
/* ==================================================================== */

/* -------------------------------------------------------------------- */
/* ACP avec l'âge
/* -------------------------------------------------------------------- */

PROC PRINCOMP DATA=test n=4 OUT=individus OUTSTAT=stat;
VAR &var_avec_age;
RUN;

PROC PRINT DATA=stat ;
RUN ;

PROC TRANSPOSE DATA=stat OUT=sortie;
RUN;

PROC TRANSPOSE DATA=stat OUT=eigenval;
BY _name_;
WHERE _type_ = 'EIGENVAL';
RUN;

DATA eigenval;
 SET eigenval;
IF _n_ = 1 THEN l1 = col1;
IF _n_ = 2 THEN l2 = col1;
IF _n_ = 3 THEN l3 = col1;
IF _n_ = 4 THEN l4 = col1;
RUN;

PROC MEANS DATA=eigenval SUM;
VAR l1 l2 l3 l4;
OUTPUT OUT=eigenval SUM=;
RUN;

DATA _null_;
SET eigenval;
CALL SYMPUT('eigen1',l1);
CALL SYMPUT('eigen2',l2);
CALL SYMPUT('eigen3',l3);
CALL SYMPUT('eigen4',l4);
RUN;

DATA sortie2;
SET sortie;
prin1 = prin1 * sqrt(&eigen1);
prin2 = prin2 * sqrt(&eigen2);
prin3 = prin3 * sqrt(&eigen3);
prin4 = prin4 * sqrt(&eigen4);
RUN;

PROC PLOT DATA=sortie2;
PLOT prin2*prin1=_name_ $ _name_ prin3*prin1=_name_ $ _name_ prin3*prin2=_name_ $ _name_ ;
RUN;
QUIT;

/* Recherche des variables les plus liées à l'âge */

ODS OUTPUT ChiSq = ChiSq; 

PROC FREQ DATA=test;
TABLES age_moyen*(avec_enfant nbpers_au_foyer celibataire) / NOCOL NOPERCENT NOCUM CHISQ ;
FORMAT age_moyen age. &var autrevar. nbpers_au_foyer ;
RUN;

DATA ChiSq (keep = Table Value);  
 SET ChiSq;
WHERE  Statistic like '%Cramer%';
RUN;

PROC SORT DATA = ChiSq;
BY DESCENDING Value; 
RUN;

PROC PRINT DATA = ChiSq (obs = 30);
RUN;

PROC CORR DATA=test ;
VAR agemoins30 age30a40 age40a50 age50a60 age60a70 ageplus70 ;
RUN;

/* ==================================================================== */
/* SECTION 1.3.3
/* ==================================================================== */

/* -------------------------------------------------------------------- */
/* ACP sans l'âge
/* -------------------------------------------------------------------- */

ODS OUTPUT Eigenvalues = valprop ;
PROC PRINCOMP DATA = test n=2 OUT=individus OUTSTAT=stat ;
VAR &var;
RUN ;

/* On peut vérifier que la variance d'une composante principale = valeur propre */
PROC UNIVARIATE DATA=individus ;
VAR prin1 prin2 ;
RUN ;

/* On peut vérifier que les composantes principales ont une corrélation nulle */
PROC CORR DATA=individus ;
VAR prin1 prin2 nbpers_au_foyer ;
RUN ;

/* ==================================================================== */
/* SECTION 1.3.4
/* ==================================================================== */

/* -------------------------------------------------------------------- */
/* Affichage du nuage des variables
/* -------------------------------------------------------------------- */

/* Préparation de l'affichage du nuage des variables */

DATA coord ;
MERGE stat (WHERE = (_type_ = "SCORE")) valprop (KEEP = eigenvalue) ;
ARRAY coeff _numeric_ ;
DO OVER coeff ;
	coeff = coeff * SQRT(eigenvalue) ;
END ;
/*DO i = 1 TO DIM(coeff) ;
	coeff{i} = coeff{i} * SQRT(eigenvalue) ;
END ;*/
DROP eigenvalue _type_ ;
RUN ;

PROC PRINT DATA = coord ;
RUN ;

PROC TRANSPOSE DATA = coord OUT = vect (RENAME = (_name_ = Variable)) ;
VAR _numeric_ ;
RUN ;

/* Affichage du nuage des variables en basse résolution */

PROC PLOT DATA = vect ;
PLOT prin2*prin1=Variable $ Variable;
RUN ;
QUIT ;

/* Graphique recourant à l'ANNOTATE comme indiqué dans opus 2 de O. Decourt, page 135 */

DATA vect ;
 SET vect ;
IF prin2 >= 0 THEN angle_var = ARCOS(prin1) ; ELSE angle_var = ARCOS(-prin1) + 3.14159 ;
RUN ;

PROC SORT DATA = vect ;
BY angle_var prin2 ;
RUN ;

DATA planfactoriel ;
	SET vect END = dernier ;
	xsys = "2" ; ysys = "2" ; when = "A" ;
	x = 0 ; y = 0 ; function = "MOVE " ;
	OUTPUT ;
	x = prin1 ; y = prin2 ; function = "DRAW " ;
	OUTPUT ;
	function = "LABEL" ; text = variable ;
	IF prin2 >= 0 THEN POSITION = "2" ; ELSE POSITION = "8" ;
	IF DIF(angle_var) < 0.03 AND ABS(DIF(prin2)) < 0.03 THEN DO ;
		IF prin2 >= 0 THEN POSITION = "9" ; ELSE POSITION = "3" ;
	END ;
	OUTPUT ;
	IF dernier THEN DO ;
		x = 1 ; y = 0 ; function = "MOVE " ;
		OUTPUT ;
		function = "DRAW " ; color = "BLUE" ;
		DO angle = 0 TO 2*3.14 BY 0.04 ;
			x = COS(angle) ; y = SIN(angle) ;
			OUTPUT ;
		END ;
	END ;
RUN ;

SYMBOL INTERPOL = none VALUE = dot POINTLABEL = NONE /*("#variable")*/ ;
AXIS1 ORDER=(-1 TO 1 BY 0.5) ;
PROC GPLOT DATA = vect ;
PLOT prin2 * prin1 / HREF=0 VREF=0 HAXIS=axis1 VAXIS=axis1 ANNOTATE=planfactoriel ;
RUN ;
QUIT ;

/* Autre représentation des variables plus belle qu'avec la PROC PLOT */

%PLOTIT(DATA=vect, plotvars=prin2 prin1, labelvar=Variable, href=0, vref=0, color=black, colors=black)

/* Autre graphique recourant à l'ANNOTATE 
/* Référence : SASV9-Preudhomme.pdf (voir la bibliographie) */
/* VERSION NON PUBLIEE DANS L'OUVRAGE */

DATA ANNOTER;
SET vect; /*On part du fichier SORTIE2*/
X=PRIN1; Y=PRIN2;
TEXT=Variable; /*Le texte à afficher est le nom de la variable*/
SIZE=1;      /*Taille du texte.*/
XSYS='2'; YSYS='2';
IF PRIN2 >= 0 THEN POSITION = "2" ; ELSE POSITION = "8" ;
LABEL Y='AXE 2' X='AXE 1';
RUN;

DATA CERCLE ;
XSYS='2'; YSYS='2'; WHEN = "A" ;
DO angle = 0 TO 360 BY 0.1 ;
IF angle = 0 THEN DO ;
function = "MOVE" ;
x = 1 ;
y = 0 ;
OUTPUT ;
END ;
ELSE DO ;
function = "DRAW" ;
x = cos(angle*3.1416/180) ;
y = sin(angle*3.1416/180) ;
OUTPUT ;
END ;
END ;
RUN ;

DATA ANNOTER ;
SET ANNOTER CERCLE ;
RUN ;

GOPTIONS RESET=all;
QUIT;
PROC GPLOT DATA=ANNOTER;
PLOT Y*X / ANNOTATE=WORK.ANNOTER HREF=0 VREF=0;
RUN;
QUIT;

/* Graphique recourant à l'ODS GRAPHICS et le langage GTL */
/* Référence : Olivier Decourt - Reporting avec SAS (voir la bibliographie) */
/* VERSION NON PUBLIEE DANS L'OUVRAGE */

ODS HTML;
ODS GRAPHICS ON;

PROC TEMPLATE ;
	DEFINE STATGRAPH exemples.acp ;
		LAYOUT OVERLAY / XGRID=TRUE YGRID=TRUE  
						 XAXISOPTS=(LABEL="Axe n°1" TICKS=(-1 0 1))
						 YAXISOPTS=(LABEL="Axe n°2" TICKS=(-1 0 1)) ;
			VECTORPLOT X=prin1 Y=prin2 / DATALABEL=variable XMIN=-1 XMAX=1 YMIN=-1 YMAX=1 ;
			ELLIPSEPARM SEMIMAJOR=1 SEMIMINOR=1 SLOPE=0 /    
               LINECOLOR=BLUE LINEPATTERN=DASH; 
		ENDLAYOUT ;
	END ;
RUN ;
ODS EXCLUDE ALL ;
ODS OUTPUT Eigenvalues = valprop ;
PROC PRINCOMP DATA = test n=2 OUTSTAT=stat ;
VAR &var;
RUN ;
DATA coord ;
MERGE stat (WHERE = (_type_ = "SCORE")) valprop (KEEP = eigenvalue) ;
ARRAY coord _numeric_ ;
DO OVER coord ;
coord = coord * sqrt (eigenvalue) ;
END ;
DROP eigenvalue _type_ ;
RUN ;
PROC TRANSPOSE DATA = coord OUT = vect (RENAME = (_name_ = Variable)) ;
VAR _numeric_ ;
RUN ;
ODS SELECT ALL ;
DATA _NULL_ ;
	SET vect ;
	FILE PRINT ODS=(TEMPLATE="exemples.acp") ;
	PUT _ODS_ ;
RUN ;

ODS GRAPHICS OFF;
ODS HTML CLOSE;

/* ==================================================================== */
/* SECTION 1.3.5
/* ==================================================================== */

/* -------------------------------------------------------------------- */
/* Affichage du nuage des individus
/* -------------------------------------------------------------------- */

GOPTIONS RESET = all ; QUIT ;
PROC GPLOT DATA=individus ;
PLOT prin2*prin1 ;
RUN ;
QUIT ;

PROC PLOT DATA=individus ;
PLOT prin2*prin1 ;
RUN ;
QUIT ;

/* ==================================================================== */
/* SECTION 1.4
/* ==================================================================== */

/* -------------------------------------------------------------------- */
/* Classification par la méthode des k-means
/* -------------------------------------------------------------------- */

/*PROC STANDARD DATA= individus OUT=reduit MEAN=0 STD=1;
VAR &var;
RUN;*/

PROC FASTCLUS DATA=individus MAXC=20 MAXITER=50 CONVERGE=0.02
MEAN=centres OUT=partitio CLUSTER=presegm DELETE=5 DRIFT;
VAR &var;
RUN;

PROC PRINT DATA=centres (obs=20); RUN;

PROC PRINT DATA=partitio (obs=10); RUN;

PROC FREQ DATA=partitio ORDER=freq;
TABLE presegm;
RUN;

PROC FREQ DATA=centres;
TABLE _freq_;
RUN;

GOPTIONS RESET=all;
GOPTIONS COLORS=(black);
/*goptions csymbol=black;*/
PROC GPLOT DATA=partitio;
PLOT prin2*prin1=presegm;
RUN;
QUIT;

PROC GPLOT DATA=centres;
PLOT _gap_*_freq_='G' _radius_*_freq_='R'/ OVERLAY;
RUN;
QUIT;

/* ==================================================================== */
/* SECTION 1.5
/* ==================================================================== */

/* -------------------------------------------------------------------- */
/* Classification ascendante hiérarchique
/* -------------------------------------------------------------------- */

PROC CLUSTER DATA=centres OUTTREE=tree METHOD=ward CCC PSEUDO PRINT=10;
/*PROC CLUSTER DATA=centres OUTTREE=tree METHOD=density k=10 CCC PSEUDO PRINT=10;*/
/*PROC CLUSTER DATA=centres OUTTREE=tree METHOD=twostage hybrid CCC PSEUDO PRINT=10;*/
VAR &var;
COPY presegm;
RUN;

PROC PRINT DATA=tree;
RUN;

PROC SORT DATA=tree;
BY _ncl_;
RUN;

SYMBOL1 color=black INTERPOL=join VALUE=dot HEIGHT=1 ;
PROC GPLOT DATA=tree ;
WHERE _ncl_ < 20 ;
PLOT (_rsq_ _sprsq_ _ccc_ _rmsstd_ _psf_ _pst2_) * _ncl_ ;
RUN ;
GOPTIONS RESET=all ;
QUIT ;

PROC TREE DATA=tree NCL=4 OUT=segmhier ;
COPY presegm ;
RUN ;
PROC PRINT DATA=segmhier ;
RUN ;

PROC SORT DATA=partitio; BY presegm; RUN;
PROC SORT DATA=segmhier; BY presegm; RUN;
DATA segm;
MERGE partitio segmhier;
BY presegm;
RUN;

PROC FREQ ORDER=freq; TABLE cluster; RUN;

GOPTIONS RESET=all;
GOPTIONS COLORS=(black);
PROC GPLOT;
PLOT prin2*prin1=cluster;
RUN; QUIT;

/* -------------------------------------------------------------------- */
/* SAUVEGARDE DU FICHIER INITIAL + PRIN1 + PRIN2 + CLUSTER              */
/* -------------------------------------------------------------------- */

DATA &ASSURANC..assurancetic_segm (COMPRESS = BINARY) ;
SET segm ;
DROP presegm clusname _name_ distance ;
RUN ;

/* ==================================================================== */
/* SECTION 1.6
/* ==================================================================== */

/* -------------------------------------------------------------------- */
/* Interprétation des classes d’individus par le test de Kruskal-Wallis
/* -------------------------------------------------------------------- */

PROC TRANSREG DATA = segm DESIGN NOPRINT ;
MODEL CLASS (cluster / ZERO = NONE) ;
ID cle &var ;
OUTPUT OUT = segm_disjonctif (drop = _name_ _type_) ;
RUN ;

%PUT &_TRGIND ;

%MACRO interpret(cible) ;

ODS EXCLUDE ALL ;
ODS OUTPUT KruskalWallisTest = kruskal WilcoxonScores = wilcoxon ;

PROC NPAR1WAY WILCOXON data=segm_disjonctif correct=no;
CLASS &cible ;
VAR &var;
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 "Caractérisation de la variable &cible" ;
PROC PRINT DATA = resultat (OBS = 20) ; RUN ;
TITLE1 " " ;

%MEND interpret ;

%interpret(cluster1);
%interpret(cluster2);
%interpret(cluster3);
%interpret(cluster4);

/* -------------------------------------------------------------------- */
/* INTERPRETATION DES CLASSES PAR UNE MACRO D'OLIVIER DECOURT
/* Référence : http://www.od-datamining.com/
/* VERSION NON PUBLIEE DANS L'OUVRAGE */
/* -------------------------------------------------------------------- */

%MACRO caracParQuanti (tableIn =, varTarget =, varInput = _NUMERIC_, poids =, pValFiltre = 0.15) ;
	/* Format d'affichage des valeurs-tests */
	PROC FORMAT ;
		VALUE vTest
			LOW  - -5  	  = "****|    "
			 -5 <- -2.31  = " ***|    "
		  -2.31 <- -1.64  = "  **|    "
		  -1.64 <- -1.28  = "   *|    "
		  -1.28 <-< 1.28  = "    |    "
		   1.28  -< 1.64  = "    |*   "
		   1.64  -< 2.31  = "    |**  "
		   2.31  -< 5  	  = "    |*** "
			  5  - HIGH   = "    |****"
		;
	RUN ;
	ODS EXCLUDE ALL ;
	ODS OUTPUT simpleStatistics = work.statsGpe (KEEP = variable &varTarget mean n
							WHERE = (&varTarget IS NOT MISSING)) ;
	PROC DISCRIM DATA = &tableIn SIMPLE ;
	CLASS &varTarget ;
	VAR &varInput ;
	%IF &poids NE %THEN %DO ;
		WEIGHT &poids ;
	%END ;
	RUN ;
	ODS OUTPUT simpleStatistics = work.statsTot (KEEP = variable &varTarget mean n stdDev
							WHERE = (&varTarget IS MISSING));
	PROC DISCRIM DATA = &tableIn SIMPLE ;
	CLASS &varTarget ;
	VAR &varInput ;
	%IF &poids NE %THEN %DO ;
		WEIGHT &poids ;
	%END ;
	RUN ;
	ODS SELECT ALL ;
	PROC SQL ;
		CREATE TABLE work.temp AS
			SELECT modalite.&varTarget,
			       modalite.variable AS variable LENGTH = 32,
				   modalite.mean	AS mClasse
								   	   LABEL = "Moyenne dans la classe",
				   ensemble.mean	AS mGen
								   	   LABEL = "Moyenne générale",
				   modalite.n		AS nk
				   					   LABEL = "Effectif dans la classe",
				   (modalite.mean - ensemble.mean) / 
					(SQRT(((ensemble.n - modalite.n)/
	                       ((ensemble.n - 1)*(modalite.n))))*ensemble.stdDev) 
									AS vTest 
									   FORMAT = NUMX8.2
								   	   LABEL = "Valeur test",
				   1-PROBNORM(ABS(CALCULATED vTest)) /* proba d'une loi normale centrée réduite */
									AS pValue
								   	   LABEL = "Probabilité de la valeur test"
									   FORMAT = PVALUE8.4,
				   CALCULATED vTest	AS etoiles
				   					   FORMAT = vTest.
									   LABEL = "---------"	
			FROM work.statsGpe AS modalite,
				 work.statsTot (DROP = &varTarget) AS ensemble
			WHERE modalite.variable = ensemble.variable
			ORDER BY &varTarget,
			         vTest DESC
		;
	QUIT ;
	TITLE1 "Caractérisation de la variable &varTarget" ;
	TITLE2 "Par les variables quantitatives" ;
	PROC PRINT DATA = work.temp NOOBS LABEL ;
		WHERE vTest IS NOT MISSING AND pvalue <= &pValFiltre ;
		VAR variable -- etoiles ;
		BY &varTarget ;
	RUN ;
	PROC SQL ;
		DROP TABLE work.statsGpe ;
		DROP TABLE work.statsTot ;
		DROP TABLE work.temp ;
	QUIT ;
	TITLE1 " " ;
	TITLE2 " " ;
%MEND caracParQuanti ;

%caracParQuanti (tableIn =segm, varTarget =cluster, varInput = &var, poids =, pValFiltre = 0.15);

/* ==================================================================== */
/* SECTION 1.7
/* ==================================================================== */

/* -------------------------------------------------------------------- */
/* ACP AVEC NOS DE CLASSE en variables actives comme les autres
/* -------------------------------------------------------------------- */

PROC PRINCOMP DATA=segm_disjonctif (KEEP = &var cluster1-cluster4) n=2
OUT=temp OUTSTAT=stat;
VAR &var cluster1-cluster4;
RUN;

PROC TRANSPOSE DATA=stat OUT=sortie; RUN;

PROC TRANSPOSE DATA=stat OUT=eigenval;
BY _name_;
WHERE _type_ = 'EIGENVAL';
RUN;

DATA eigenval;
SET eigenval;
IF _n_ = 1 THEN l1 = col1;
IF _n_ = 2 THEN l2 = col1;
RUN;

PROC MEANS DATA=eigenval SUM;
VAR l1 l2;
OUTPUT OUT=eigenval SUM=;
RUN;

DATA _null_;
SET eigenval;
CALL symput('eigen1',l1);
CALL symput('eigen2',l2);
RUN;

DATA sortie2;
SET sortie;
prin1 = prin1 * sqrt(&eigen1);
prin2 = prin2 * sqrt(&eigen2);
RUN;

PROC PLOT DATA=sortie2;
PLOT prin2*prin1=_name_ $ _name_;
RUN;
QUIT;

/* -------------------------------------------------------------------- */
/* ACP AVEC NOS DE CLASSE en variables supplémentaires : macro INSEE
/* -------------------------------------------------------------------- */

LIBNAME bibmacro "&C\Macros INSEE";
OPTIONS sasmstore=bibmacro mstored ;
%acp(DATAACT=segm_disjonctif,VARACT=&var,VARSUP=cluster1-cluster4,impress=O,vecp=MAX,ioa=0,iva=2,ivs=2,OUT=SOR,NAXER=4,FILL=ALL);

TITLE1 "Les variables dans le plan 1-2";
%PLOTACP(AXEH=1,AXEV=2,POINTS=VARACT VARSUP);
TITLE1 " ";

TITLE1 "Les variables dans le plan 1-3";
%PLOTACP(AXEH=1,AXEV=3,POINTS=VARACT VARSUP);
TITLE1 " ";

/* ==================================================================== */
/* SECTION 1.8
/* ==================================================================== */

/* -------------------------------------------------------------------- */
/* Classification hiérarchique descendante des variables
/* -------------------------------------------------------------------- */

PROC VARCLUS DATA=segm_disjonctif (KEEP = &var cluster1-cluster4)
MAXEIGEN = 1.5 OUTSTAT=coef /* OUTTREE=tree */;
VAR &var cluster1-cluster4;
RUN;

/*PROC TREE DATA=tree HORIZONTAL ;
HEIGHT _propor_ ;
RUN ;*/

DATA coef2;
 SET coef;
IF _ncl_ = . OR _ncl_ = 4;
DROP _ncl_;
RUN;

PROC SCORE DATA=segm_disjonctif (KEEP = &var cluster1-cluster4)
SCORE=coef2 OUT=segm_var_obs ;
VAR &var cluster1-cluster4 ;
RUN ;

%ACP(DATAACT=segm_var_obs,VARACT=&var,varsup=cluster1-cluster4 clus1-clus4,impress=O,vecp=MAX,ioa=0,iva=2,ivs=2,OUT=SOR,NAXER=2,FILL=ALL);

TITLE1 "Les variables dans le plan 1-2";
%PLOTACP(AXEH=1,AXEV=2,POINTS=VARACT VARSUP);
TITLE1 " ";

/* ==================================================================== */
/* SECTION 1.9
/* ==================================================================== */

/* FERMETURE DU FICHIER ODS CONTENANT LES RESULTATS */

ODS RTF CLOSE ;

/* © 2009 www.editionstechnip.com ETUDE DE CAS EN STATISTIQUE DECISIONNELLE par Stéphane Tufféry */