[转]多元分析之聚类(1)–proc cluster

本文主要对SAS做聚类分析的proc cluster步的应用做一个简单的摘录,相关的理论知识细节,请参见SAS help文档及其他统计学相关文献等。
1.简介
proc cluster一般适用于规模较小的样本观测聚类(即Q型聚类)。proc
cluster为系统聚类,包括11种方法,根据“距离”作为分类标准。
http://saslist.com/hssnow/files/2011/04/proc-cluster.pngcluster" />
2.proc cluster
常用语法格式:
PROC CLUSTER METHOD = name < options > ;
COPY variables ;
ID variable ;
VAR variables ;
Method=average|ward|centroid|single|complete|median|flexible|mcquitty|eml|density|twostage,分别指定11类系统聚类法。
proc cluster常用选项及语句说明:
data=
关于type=distance的数据集,用如下方式就可建立:
data dis_data(type=distance);
input a b c;
……
用proc contents等方法可以查看到其“Data Set Type DISTANCE”
outtree=
proc tree主要用于根据proc cluster产生的结果作树状图dendrograms。常用语句如:proc tree data= out= nclusters= horizontal; 等。其中data=指定输入数据集,out=输出数据集,nclusters=指定输出数据集中的分类数,horizontal要求画水平聚类图。
standard|std
聚类分析中,样本间的聚类通常是采用欧氏距离,为消除变量不同量纲对聚类分析的影响,通常进行标准化的处理。
rsquare|rsq
这两个统计量是用来帮助确定分类个数的。R^2越大表示各个类区分的越开,聚类效果越好。而又不能以 的大小简单的确定分类个数,应考察 值的变化,即半偏 ,即上一步 与该步 之差。若某步半偏 较大,说明本次并类效果不好,应当考虑聚类到上一步是否应停止。
pseudo
这两个统计量同样是用来帮助确定分类个数的。类似R^2和半偏R^2,伪F统计量值越大分来效果越好;若某步伪T统计量值较大,说明该步并类效果不好,应当考虑聚类到上一步是否应停止。
print|p=k
copy语句
id语句
var语句
难点——分类个数的确定:
1)R**2: G小,而且R方不再大幅度的增大为好。
2)CCC:大的CCC值表示好的聚类,峰值建议分类数。(而大的负数值表示离群值);
3)半偏相关SPRSQ:(BKL/T)如果由于G类合并为G-1类时半偏相关急剧增大,就应该取G类;
4)伪F统计量PSF:相对大值表示终止点;
5)伪t^2统计量PFT2:可以评价上一次聚类的效果。该值大说明不应该合并这两类,应该取合并前的水平。
6)Normalized RMS
用此距离可以判断聚类的合适数量,当某一步的 标准化的均方根距离 增加的幅度最大时,此步骤前的聚类数最合适。
3.实例
摘用《统计分析与SAS》(张晓冉 编著)的例11.1.1问题:根据2004年我国31个省市农民人均年生活消费支出情况,进行分类。数据参见下数据集(数据单位:元)。
data consume2004; input area$ x1-x8; label area="地区" x1='食品' x2='衣着' x3='居住' x4='家庭设备及服务' x5='医疗保健' x6='交通和通讯' x7='文教娱乐' x8='其他商品及服务'; datalines;; 北京 1495.09 308.85 746.04 227.27 507.55 512.23 743.72 76.18 天津 1017.72 181.21 508.06 108.51 177.10 230.41 376.87 42.23 河北 780.09 127.06 340.88 80.42 115.97 176.60 182.56 31.33 山西 748.90 171.69 179.22 59.27 84.20 130.00 235.01 28.17 内蒙古 889.05 133.54 266.43 69.91 154.51 241.90 291.98 35.25 辽宁 962.00 154.97 290.08 72.58 145.19 186.77 217.95 43.42 吉林 899.00 133.54 216.82 62.08 161.16 214.97 237.34 46.31 黑龙江 750.57 123.87 388.87 49.87 131.04 175.85 188.51 28.78 上海 2191.15 279.73 1446.15 344.41 424.55 720.37 805.56 116.94 江苏 1317.88 163.53 467.62 141.43 163.16 293.07 373.39 72.47 浙江 1838.57 258.58 798.88 242.09 326.12 496.86 597.96 100.05 安徽 861.34 86.87 299.82 75.97 91.95 163.93 199.95 33.88 福建 1408.54 159.60 430.14 154.44 136.40 306.06 313.09 107.32 江西 1125.13 107.19 234.69 66.89 110.32 171.89 237.28 42.10 山东 1000.13 139.18 365.97 110.12 155.85 221.93 298.23 97.85 河南 808.27 108.08 268.72 63.68 95.22 121.17 168.04 30.91 湖北 1076.35 93.52 274.10 75.11 110.73 162.65 245.68 50.85 湖南 1338.65 112.38 293.23 92.37 124.12 174.53 279.96 57.05 广东 1581.68 116.83 494.89 131.17 153.17 350.27 314.34 98.44 广西 1047.58 64.42 311.48 64.87 83.64 140.13 178.83 37.65 海南 1027.90 58.96 134.00 83.16 86.57 133.77 164.42 56.59 重庆 1039.00 79.08 201.03 74.81 115.31 119.68 198.65 26.38 四川 1123.18 92.87 234.31 79.15 117.40 127.60 209.68 31.54 贵州 754.39 55.63 165.95 41.48 47.19 70.41 140.21 21.07 云南 848.30 61.87 239.29 61.78 87.66 105.52 143.20 23.42 西藏 941.08 157.87 118.55 75.55 28.93 89.16 37.84 21.72 陕西 686.38 91.78 237.32 65.46 118.12 126.13 258.83 34.04 甘肃 703.41 82.33 179.86 58.91 85.33 130.22 202.64 21.64 青海 813.35 121.83 233.16 65.48 126.60 176.41 108.14 31.48 宁夏 808.54 122.50 325.21 65.30 186.90 155.26 217.06 46.05 新疆 763.43 138.88 304.81 56.03 141.97 131.59 126.92 26.28 ; run;
用proc cluster做聚类分析,采用Ward法,如下:
ods graphics on; proc cluster data=consume2004 method=ward std rsquare pseudo outtree=ave_tree; var x1-x8; id area; run; ods graphics off;
得到聚类历史如下图(其中省略了一些中间的历史记录):
http://saslist.com/hssnow/files/2011/04/cluster_history.pngcluster" />
首先对Cluster History进行下简单的说明:
Cluster History中的变量依次表示分类的类数、原分类、每步合并入的类、此步类中的观测数、半偏R平方、R平方、伪F统计量,伪T统计量。
如前介绍,系统聚类法首先将所有样本观测各独自视为1类,然后逐步合并至只有1类。本例中,用ward法,样本观测就是31个省市:初始时有31类;第1步将重庆、四川合为1类,其他29个省市仍各自为1类,记30类;第2步将江西、湖北合为1类,记29类;依次类推。注意,上图NCL=8时,即记8类时,是将之前记的13类和西藏合并得到的。
接下来,下图描述了伪F统计量,伪T统计量的情况,为我们判断确定分类组数提供了初步参考。如可以看出:在类数为5—15的区间内,伪F统计量都相对小些;在类数为1、4、5等处,伪T统计量相对较大。
http://saslist.com/hssnow/files/2011/04/PsfAndPsTSqPlot5.pngcluster" />
下面,为确定分类数,对Cluster History进行详细分析。
我们人为假定分类数不应超过8,则对Cluster
History的最后8次合并分析即可,根据半偏R平方、伪F统计量,伪T统计量,得到的前4中最好分类为:
- 半偏R平方:2,3,4,5,6
- 伪F统计量:2,3,4,5,6
- 伪T统计量:2,3,5,6,8
解释一下:
- 对半偏R^2,前面介绍到“若某步半偏R^2较大,说明该步并类效果不好,应当考虑聚类到上一步是否应停止”。在最后8次并类中,半偏R^2最大为0.6754,在NCL=1时得到,考虑在上一步停止分类,即分类数为2;半偏R^2第二大为0.1317,在NCL=2时得到,考虑在上一步停止分类,即分类数为3;依次类推,得到最好分类数依次为:2,3,4,5,6。
- 伪F统计量,其统计量值越大分来效果越好,很容易排序得到最好分类数依次为:2,3,4,5,6。
- 伪T统计量,类似于半偏R^2,若某步较大,说明该步并类效果不好,应当考虑聚类到上一步是否应停止。得到最好分类数依次为:2,3,5,6,8。
另外,若我们再假定分类数应大于3,则分类数大致可以为4,5,6。至于如何最终确定分类数,可以参考其他聚类方法结果、画出树状图等,综合考虑,个人作出判断,这里选定分类数为5。
接下来,可以用proc tree和proc means进一步完善后续工作。
proc tree data=ave_tree out=result ncl=5 horizontal; copy x1-x8; run; proc sort data=result; by cluster; run; proc means data=result noprint; var x1-x8; by cluster; output out=clus_mean mean=x1 x2 x3 x4 x5 x6 x7 x8; data clus_mean; set clus_mean; sum=sum(x1,x2,x3,x4,x5,x6,x7,x8); label sum='总和'; format x1-x8 sum 8.2; run;
最后,根据数据集result可以得到将31个省市分为5类,分别是:
- 第一类:重庆 四川 江西 湖北 安徽 河南 贵州 云南 陕西 甘肃 广西 湖南 海南 西藏
- 第二类:河北 黑龙江 内蒙古 吉林 青海 新疆 辽宁 宁夏 山西 天津
- 第三轮:福建 广东 江苏 山东
- 第四类:北京 浙江
- 第五类:上海
树状图如下:
http://saslist.com/hssnow/files/2011/04/dendrograms.pngcluster" />
汇总数据集如下,即得到各个类各消费情况的平均水平及总和:
http://saslist.com/hssnow/files/2011/04/clus_mean.pngcluster" />