Page d'accueil

Espace Pro      
 Mon CV                      
  CV intéractif              
  CV Classique          
  CV imprimable        
  Téléchargement      
 Mes Projets              
  Statistiques              
  C.A.O.                        
  Programmation       
  Contact                     
Espace Perso  
 Liste DVD                  
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.