[ Retour aux Travaux Dirigés de SAS ]
/* Statistiques avec SAS, Corrigé du TD 7 */
/* Jean-Sebastien Roy (js@jeannot.org), 2001 */
%let chemin=//diamant/Data Mi2/sas/stats;
libname tables "&chemin/tables";
/* Quelques macros utiles */
%include "&chemin\util_td7.sas";
/* Normalisation */
data commlimi_norm;
set tables.commlimi;
array h00--femmes;
do over ;
= /pop*100;
end;
run;
/* Classification hierarchique */
/* dipl2 à dipl9 */
proc cluster commlimi_norm ward arbre ;
id nom;
copy dc;
var dipl2-dipl9;
run;
/* On aurait pu aussi choisir :
var jeunes adultes agees;
var cs2-cs7;
*/
/* Visualisation de l'arbre */
proc tree arbre ;
id nom;
run;
/* Visualisation de la variation du critere d'agrégation */
proc sort arbre; by _height_; run;
proc gplot arbre;
where _freq_>1;
symbol join dot;
plot _height_*_ncl_;
run;
quit;
/* On garde 3 classes */
proc tree arbre classes 3;
id dc;
run;
proc sort commlimi_norm; by dc; run;
proc sort classes; by dc; run;
/* On le note dans une table */
data commlimi_norm;
merge commlimi_norm classes;
by dc;
run;
/* Tentative de représentation graphique */
%labelg(commlimi_norm,cs5,cs4,nom);
proc gplot commlimi_norm _anno;
symbol none dot;
plot cs4*cs5=cluster;
run;
quit;
/* ACP */
data commlimi_norm;
set commlimi_norm;
poids=1;
run;
/* Cette macro est très frustre, mais fourni par rapport
à la proc Princomp, des détails suplémentaires */
%acp(commlimi_norm,CS2-CS7 CS81 CS84 CS85 CS86 CS23
JEUNES ADULTES AGEES
FRANC EURO MAGHREB AFRIQ WORLD IBER);
/* On garde deux axes */
goptions 6 6;
%acp_plot(1,2,nom);
%aide_acp(2,dc nom);
/* La commune 92051 est un point abérrant et nuit à l'ACP,
on la supprime */
data filt;
set commlimi_norm;
where dc ne '92051';
run;
%acp(filt,CS2-CS7 CS81 CS84 CS85 CS86 CS23
JEUNES ADULTES AGEES
FRANC EURO MAGHREB AFRIQ WORLD IBER);
%acp_plot(1,2,nom);
%aide_acp(2,dc nom);
/* Idem, 92064 */
data filt;
set commlimi_norm;
where dc not in ('92051','92064');
run;
%acp(filt,CS2-CS7 CS81 CS84 CS85 CS86 CS23
JEUNES ADULTES AGEES
FRANC EURO MAGHREB AFRIQ WORLD IBER);
/* On garde 3 axes*/
%acp_plot(1,2,nom);
%acp_plot(2,3,nom);
%aide_acp(3,dc nom);
/* Queques graphiques combinés ACP/Classification
la macro labelg permet de mettre des labels sur les graphes
(normalement inutile, mais rendu necessaire par un bug de SAS)
*/
%labelg(acp,prin1,prin2,nom, anno1);
%labelg(acp,prin2,prin3,nom, anno2);
proc gplot acp;
symbol1 none dot black;
symbol2 none dot red;
symbol3 none dot blue;
plot prin2*prin1=cluster / anno1;
plot prin3*prin2=cluster / anno2;
run;
quit;
/* Il faudrait pouvoir visualiser des variables suplémentaires
et des individus suplémentaires.
Notamment les variables DIPL0-DIPL9 CELI MARIE VEUF DIVORCE
*/
/* ACM */
/* Lecture du jeu de données du à Tenenhaus sur les chiens */
proc import 'D:/roy/add/chiens.txt' chiens
DLM ;
run;
/* Sans format, impossible de lire les sorties d'une ACM */
proc format;
value tai
1='TAILLE -'
2='TAILLE +'
3='TAILLE ++';
value poi
1='POIDS -'
2='POIDS +'
3='POIDS ++';
value vel
1='VELOCITE -'
2='VELOCITE +'
3='VELOCITE ++';
value int
1='INTEL -'
2='INTEL +'
3='INTEL ++';
value aff
1='AFFECTION -'
2='AFFECTION +';
value agr
1='AGRESSIVITE -'
2='AGRESSIVITE +';
value fon
1='Compagnie'
2='Chasse'
3='Utilite';
run;
proc datasets work ;
modify chiens;
format tai tai. poi poi. vel vel.
int int. aff aff. agr agr.
fon fon.;
run;
quit;
/* L'ACM */
proc corresp chiens acm ;
tables chiens,tai poi vel int aff agr fon;
supplementary fon;
run;
/* Visualisation des sorties */
data _acm; set acm; where _type_ ne 'INERTIA'; run;
%labelg(_acm,dim1,dim2,_name_);
proc gplot _acm _anno;
symbol1 none dot black;
symbol2 none dot red;
symbol3 none dot blue;
plot dim2*dim1=_type_ / -1.4 to 1.4 by .2 -1.4 to 1.4 by .2;
run;
quit;
/* Idem, mais en colorant par fonction du chien */
proc sort acm acm2; by _name_; run;
data fon;
set chiens;
rename chiens=_name_;
keep chiens fon;
run;
proc sort fon; by _name_; run;
data acm2;
merge acm2 fon;
by _name_;
if fon ne . then _type_=putn(fon,'fon.');
if _type_ ne 'INERTIA';
keep _type_ _name_ dim1 dim2;
run;
proc sort acm2; by _type_; run;
%labelg(acm2,dim1,dim2,_name_);
proc gplot acm2 _anno;
symbol1 dot black;
symbol2 dot red;
symbol3 star green;
symbol4 dot blue;
symbol5 star black;
plot dim2*dim1=_type_ / -1.4 to 1.4 by .2 -1.4 to 1.4 by .2;
run;
quit;