
/* 각 Branch level별로 INS의 평균값 구하기 */

proc means data=imputed noprint nway;
   class branch;
   var ins;
   output out=level mean=prop;
run;

proc print data=level;
run;



/* Use ODS to output the ClusterHistory */
/* output object into a data set named  */
/* "cluster."*/

/* ClusterHistory output object를 sas data set cluster로 생성  */
ods output clusterhistory=cluster;

proc cluster data=level method=ward outtree=fortree
        plots=(dendrogram(vertical height=rsq));
   freq _freq_;
   var prop;
   id branch;
run;

/* method=  :Ward의 최소분산방법을 수행 */
/* outtree= :tree diagram 생성하기 위해 tree프로시져에 사용될 
             데이터셋 생성 */
/* freq :지정한 변수의 값으로 관측값의 빈도를 변화시키고자할때 사용 */                
/* var  :군집분석에 사용될 변수 지정 */
/* id   :군집과정 출력과 OUTTREE= 에서 관측값을 확인하기 위한 
         id변수 지정 */




/* optimal cluster의 수를 결정 */
/* FREQ procedure를 사용해서 RANCH*INS table의 Pearson Chi^2 statistic 생성*/

proc freq data=imputed noprint;
   tables branch*ins / chisq;
   output out=chi(keep=_pchi_) chisq;
run;


/* one-to-many merge사용해서 Chi^2 statistic와 clustering결과 병합 */
/* clustering 각 level별로 (log) p-value 계산  */
data cutoff;
   if _n_ = 1 then set chi;
   set cluster;
   chisquare=_pchi_*rsquared;
   degfree=numberofclusters-1;
   logpvalue=logsdf('CHISQ',chisquare,degfree);
run;


/* cluster수별 log p-values plot */
proc sgplot data=cutoff;
   scatter y=logpvalue x=numberofclusters 
           / markerattrs=(color=blue symbol=circlefilled);
   xaxis label="Number of Clusters";
   yaxis label="Log of P-Value" min=-170 max=-130;
   title "Plot of the Log of the P-Value by Number of Clusters";
run;


/* 가장 작은 log p-value를 갖는 cluster number를 매크로 변수(&ncl)로 지정 */
title;
proc sql;
   select NumberOfClusters into :ncl
   from cutoff
   having logpvalue=min(logpvalue);
quit;

ods html close;
proc tree data=fortree nclusters=&ncl out=clus;
   id branch;
run;
ods html;
* nclusters= : n개의 군집수를 지정;
* out= : 출력 데이터셋 지정 ;
* 나무그림에서 개체를 구분할 ID변수를 지정;



proc sort data=clus;
   by clusname;
run;

proc print data=clus;
   by clusname;
   id clusname;
run;

/* 더미변수 생성 : 2번째 cluster를 reference level로 참조 */
data imputed;
   set imputed;
   brclus1=(branch in ('B6','B9','B19','B8','B1','B17','B3',
           'B5','B13','B12','B4','B10'));
   brclus2=(branch='B15');
   brclus3=(branch='B16');
   brclus4=(branch='B14');
run;
