楼主: 李会超
56128 31

[学习分享] 一个用R语言进行聚类分析的例子 [推广有奖]

  • 1关注
  • 31粉丝

教授

33%

还不是VIP/贵宾

-

威望
0
论坛币
121197 个
通用积分
59.1084
学术水平
140 点
热心指数
152 点
信用等级
84 点
经验
56182 点
帖子
1183
精华
1
在线时间
1120 小时
注册时间
2008-11-6
最后登录
2024-4-29

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
今天看到一份做聚类分析的例子,特此分享一下
第一步:对数据集进行初步统计分析
检查数据的维度
> dim(iris)
[1] 150   5

显示数据集中的列名
> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

显示数据集的内部结构
> str(iris)
'data.frame':   150 obs. of  5 variables:
$ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

显示数据集的属性
> attributes(iris)
$names --就是数据集的列名
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

$row.names --个人理解就是每行数据的标号
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20
[21]  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40
[41]  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60
[61]  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80
[81]  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100
[101] 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
[121] 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
[141] 141 142 143 144 145 146 147 148 149 150

$class --表示类别
[1] "data.frame"

查看数据集的前五项数据情况
> iris[1:5,]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa


查看数据集中属性Sepal.Length前10行数据
> iris[1:10, "Sepal.Length"]
[1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

同上
> iris$Sepal.Length[1:10]
[1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

显示数据集中每个变量的分布情况
> summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500                  

显示iris数据集列Species中各个值出现频次
> table(iris$Species)

    setosa versicolor  virginica
        50         50         50

根据列Species画出饼图
> pie(table(iris$Species))



算出列Sepal.Length的所有值的方差
> var(iris$Sepal.Length)
[1] 0.6856935

算出列iris$Sepal.Length和iris$Petal.Length的协方差
> cov(iris$Sepal.Length, iris$Petal.Length)
[1] 1.274315

算出列iris$Sepal.Length和iris$Petal.Length的相关系数, 从结果看这两个值是强相关。
> cor(iris$Sepal.Length, iris$Petal.Length)
[1] 0.8717538

画出列iris$Sepal.Length分布柱状图
> hist(iris$Sepal.Length)

画出列iris$Sepal.Length的密度函数图
> plot(density(iris$Sepal.Length))

画出列iris$Sepal.Length和iris$Sepal.Width的散点图           
> plot(iris$Sepal.Length, iris$Sepal.Width)



绘出矩阵各列的散布图
> plot(iris)
or
> pairs(iris)

第二步:使用knn包进行Kmean聚类分析

将数据集进行备份,将列newiris$Species置为空,将此数据集作为测试数据集
> newiris <- iris
> newiris$Species <- NULL


在数据集newiris上运行Kmean聚类分析, 将聚类结果保存在kc中。在kmean函数中,将需要生成聚类数设置为3
> (kc <- kmeans(newiris, 3))
K-means clustering with 3 clusters of sizes 38, 50, 62: K-means算法产生了3个聚类,大小分别为38,50,62.

Cluster means: 每个聚类中各个列值生成的最终平均值
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.006000    3.428000     1.462000    0.246000
2     5.901613    2.748387     4.393548    1.433871
3     6.850000    3.073684     5.742105    2.071053

Clustering vector: 每行记录所属的聚类(2代表属于第二个聚类,1代表属于第一个聚类,3代表属于第三个聚类)
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[37] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[73] 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3
[109] 3 3 3 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3
[145] 3 3 2 3 3 2

Within cluster sum of squares by cluster: 每个聚类内部的距离平方和   
[1] 15.15100 39.82097 23.87947
(between_SS / total_SS =  88.4 %) 组间的距离平方和占了整体距离平方和的的88.4%,也就是说各个聚类间的距离做到了最大


Available components: 运行kmeans函数返回的对象所包含的各个组成部分
[1] "cluster"      "centers"      "totss"        "withinss"   
[5] "tot.withinss" "betweenss"    "size"  
("cluster"是一个整数向量,用于表示记录所属的聚类  
"centers"是一个矩阵,表示每聚类中各个变量的中心点
"totss"表示所生成聚类的总体距离平方和
"withinss"表示各个聚类组内的距离平方和
"tot.withinss"表示聚类组内的距离平方和总量
"betweenss"表示聚类组间的聚类平方和总量
"size"表示每个聚类组中成员的数量)

创建一个连续表,在三个聚类中分别统计各种花出现的次数
> table(iris$Species, kc$cluster)           
              1  2  3
  setosa      0 50  0
  versicolor  2  0 48
  virginica  36  0 14

根据最后的聚类结果画出散点图,数据为结果集中的列"Sepal.Length"和"Sepal.Width",颜色为用1,2,3表示的缺省颜色
> plot(newiris[c("Sepal.Length", "Sepal.Width")], col = kc$cluster)
在图上标出每个聚类的中心点
〉points(kc$centers[,c("Sepal.Length", "Sepal.Width")], col = 1:3, pch = 8, cex=2)

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:聚类分析 R语言 Attributes Variables attribute names 统计

学无止境,坚持!
沙发
olympic 发表于 2014-11-24 13:46:34 |只看作者 |坛友微信交流群
已有 1 人评分经验 收起 理由
李会超 + 12 鼓励积极发帖讨论

总评分: 经验 + 12   查看全部评分

使用道具

藤椅
olympic 发表于 2014-11-24 14:03:28 |只看作者 |坛友微信交流群
pie(table(iris$Species))

使用道具

板凳
李会超 发表于 2014-11-24 14:05:14 |只看作者 |坛友微信交流群
olympic 发表于 2014-11-24 14:03
pie(table(iris$Species))
发现粘贴的时候,有时候$正常显示,有时候这个符号不能正常显示……

使用道具

报纸
olympic 发表于 2014-11-24 14:14:30 |只看作者 |坛友微信交流群
newiris$Species <- NULL
否则,
> (kc <- kmeans(newiris, 3))
错误于do_one(nmeth) : 外接函数调用时不能有NA/NaN/Inf(arg1)
此外: 警告信息:
In kmeans(newiris, 3) : 强制改变过程中产生了NA

使用道具

地板
SEH123 发表于 2014-11-24 17:28:16 |只看作者 |坛友微信交流群
学习中

使用道具

7
oliyiyi 发表于 2014-11-25 13:09:03 |只看作者 |坛友微信交流群
谢谢分享

使用道具

8
成长的乐趣 发表于 2015-4-29 13:32:05 |只看作者 |坛友微信交流群
楼主,请教下这里的聚类分析是针对样本实现的吗?R里有对变量进行聚类分析的吗?

使用道具

9
hugebear 发表于 2015-4-29 13:47:34 |只看作者 |坛友微信交流群
成长的乐趣 发表于 2015-4-29 13:32
楼主,请教下这里的聚类分析是针对样本实现的吗?R里有对变量进行聚类分析的吗?
对变量聚类和对样本聚类没有本质的区别,用一下转置就可以:设数据框X是通常的形式(每行是一个样本观测值),则欲用kmeans函数(其他的聚类函数如hclust也适用)对变量聚类时,将第一个argument设置为t(X)就可以了(此argument为X时是对样本聚类)。

使用道具

10
成长的乐趣 发表于 2015-4-29 13:55:36 |只看作者 |坛友微信交流群
谢谢楼主

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-4 16:33