|
Retour accueil projet SAS
4. ACP
4.1. Proc Pincomp
Programme | Résultats
4.2. %acp
Programme | Résultats
4. ACP
4.1. Proc Pincomp :
Cette procédure de SAS nous fournit la matrice de corrélation des variables v1 à
v7 ainsi que ses vecteurs propres, qui nous permet de trouver ses composantes
principales.
Le Programme SAS est le suivant : Proc Princomp.sas
PROC PRINCOMP
DATA=Proj
OUTSTAT=Princomp ;
RUN;
PROC PRINT
DATA=Princomp ;
RUN ;
Lorsque l'on exécute le programme, on obtient : Résultat
Pour apprécier ces données, il faut les représenter sur des graphiques. Sur
Internet, on trouve de multiples macros qui les tracent, examinons donc ce que
nous donnent ces graphiques.
4.2. %ACP
Grâce à cette macro, on a directement les graphiques qui nous intéressent.
Le Programme SAS est le suivant : Macro ACP.sas
%macro acp(table,vars,ids);
proc sql noprint;
create table acp_in(drop=poids rename=(npoids=poids)) as
select *, 100*poids/sum(poids) as npoids from &table;
quit;
proc princomp data=Proj out=acp vardef=wgt;
ods output Eigenvalues=eigenvalues Eigenvectors=eigenvectors;
var &vars;
run;
proc transpose data=eigenvalues out=teigenvalues(drop=_name_) prefix=lambda;
var eigenvalue;
run;
proc sql noprint;
select count(*) into :avars from eigenvalues;
quit;
data eigenvectors;
if _n_ = 1 then set teigenvalues;
set eigenvectors;
array c{*} prin1-prin%trim(&avars);
array l{*} lambda1-lambda%trim(&avars);
do i=1 to &avars;
c(i)=c(i)*sqrt(l(i));
end;
keep variable prin1-prin%trim(&avars);
run;
proc gplot data=eigenvalues;
symbol i=join v=dot pointlabel=none;
plot (eigenvalue difference)*Number / overlay legend;
plot2 (proportion cumulative)*Number / overlay legend;
run;
quit;
%mend;
%acp(Proj,v1-v7,ACP);
%macro acp_plot(axe1,axe2,id);
data circle;
do i=0 to 100;
prin&axe1=cos(2*3.141592*i/100);
prin&axe2=sin(2*3.141592*i/100);
z=2;
output;
end;
run;
data circle;
set eigenvectors circle;
if z=. then z=1;
run;
data _anno;
set eigenvectors(keep=prin&axe1 prin&axe2 variable);
retain function 'label' xsys ysys '2' hsys '3' size 2 position '8';
x=prin&axe1;y=prin&axe2;text=variable;
run;
proc gplot data=circle anno=_anno;
symbol1 i=none v=plus pointlabel=none color=black;
symbol2 i=join v=none pointlabel=none color=red;
plot prin&axe2*prin&axe1=z / href=(0) vref=(0) nolegend;
run;
quit;
data _anno;
set acp;
retain function 'label' xsys ysys '2' hsys '3' size 2 position '8';
x=prin&axe1;y=prin&axe2;text=&id;
run;
proc gplot data=acp anno=_anno;
symbol i=none v=dot pointlabel=none;
plot prin&axe2*prin&axe1 / href=(0) vref=(0);
run;
quit;
%mend;
%acp_plot(1,2,nom);
%macro labelg(tab,x,y,text,anno=_anno,size=2);
data &anno;
set &tab(rename=(&x=x &y=y &text=text) keep=&x &y &text);
retain function 'label' xsys ysys '2' hsys '3' size &size position '8';
run;
%mend;
%macro aide_acp(nvars,ids);
proc sql noprint;
select count(*) into :avars from eigenvalues;
quit;
data aide_acp;
if _n_ = 1 then set teigenvalues;
set acp nobs=nind;
array c{*} prin1-prin%trim(&avars);
array co2_{&nvars};
array ctr{&nvars};
array l{*} lambda1-lambda&nvars;
sommec2=uss(of c{*});
do j = 1 to &nvars;
co2_{j}=100*c{j}*c{j}/sommec2;
ctr{j}=poids*c{j}*c{j}/l{j};
end;
qlt=sum(of co2_(*));
contr_=poids*sommec2/(sum(of l{*}));
format co2_1-co2_&nvars 5.1 ctr1-ctr&nvars 5.1 poids 5.1 qlt 5.1 prin1-prin&nvars
7.2;
keep &ids poids prin1-prin&nvars ctr1-ctr&nvars co2_1-co2_&nvars qlt contr_;
run;
proc sql;
create table aide_acp(drop=contr_) as
select *,contr_*100/sum(contr_) as contr format 5.1 from aide_acp;
quit;
proc rank data=aide_acp out=aide_acp descending;
var ctr1-ctr&nvars; ranks rctr1-rctr&nvars;
run;
proc sort data=aide_acp; by &ids;run;
proc print;run;
%mend;
%acp_plot(3,4,nom);
%acp_plot(5,6,nom);
%aide_acp(1, nom);
%aide_acp(2, nom);
%aide_acp(3, nom);
%aide_acp(4, nom);
%aide_acp(5, nom);
%aide_acp(6, nom);
Lorsque l'on exécute le programme, on obtient : Résultat
On obtient les aussi des graphiques : Graph
Faisons une étude rapide pour chaque variable :
v1 est très bien expliquée par les axes 1 et 2
v2 est bien expliquée par l’axe 3
v3 est bien expliquée par l’axe 1
v4 est bien expliquée par l’axe 2
v5 est bien expliquée par les axes 2, 3 et 4
v6 est bien expliquée par l’axe 1
v7 est quasiment entièrement expliquée par l’axe 1
D’autre part, quand on regarde la représentation des différents comtés sur les
axes, on remarque que sur le graphe où sont représentés les comtés sur les axes
3 et 4, le comté de Highland a déjà une valeur aberrante, on verra ce cas plus
loin dans les classifications par arbres.
Enfin, on remarque également que la plupart des comtés sont expliqués par les
deux premiers axes principaux. En effet, sur les graphiques avec les axes 3 et
4, et les axes 5 et 6, quasiment tous les comtés sont au centre du graphe.
|
|