R中的聚类分析

机器算法验证 r k-均值
2022-04-21 05:45:55

我有一张员工信息表,每个员工都有以下属性。我想做一个分析,找出它们之间有哪些相似之处,并可能将它们分成 3 或 4 组。我开始使用聚类分析fit = kmeans(mydata,5)fit = dist(mydata,method="euclidean")但收到一条错误消息NA/NaN/Inf in foreign function call (arg 1) In addition: Warning message: In kmeans(sales1, 5) : NAs introduced by coercion

我所有的变量都必须是数字吗?还是我使用了完全错误的方法?

变量列表:

$性别:int 2 2 2 2 1 2 1 2 2 1 ...
$ HISP_LATINO_DESC:因子 w/ 2 个级别“西班牙裔/拉丁裔”,..:2 2 2 2 2 2 2 2 2 2 ...
$ APPRAISAL_CRITERION: 因子 w/ 5 个级别 "","GD","GN","TN",..: 3 5 3 3 3 5 3 3 3 5 ...
$ P2_RT: 因子 w/ 7 个级别 "","HH","HL","HM",..: 4 6 4 3 7 7 7 3 3 6 ...
$ GRADE: 因子 w/ 8 个级别 "21","22","24",..: 6 4 5 2 8 4 6 5 2 4 ...
$ ACTION_RSN_DESC:因素 w/ 9 个级别“IVT 不当行为”,..:4 4 4 7 4 3 4 4 4 3 ...
$ 生成:因子 w/ 4 个级别“婴儿潮一代”,..:2 1 1 2 1 2 2 2 2 2 ...`
$ Date.of.Birth: 因子 w/ 38 个等级 "1/4/1978","10/23/1968",..: 28 6 29 15 11 1 18 3 32 8 ...
$年龄:int 43 55 49 37 48 34 35 45 43 33 ...`
$ Date.of.Hire : 因子 w/ 33 个级别 "1/1/2012","1/2/1998",..: 13 32 7 10 21 16 6 5 15 23 ...
$ Term.Date : 因子 w/ 30 个级别 "1/30/2012","1/31/2012",..: 18 20 4 29 2 1 27 25 22 10 ...
$ 任期:人数 13.4 3.9 5 5.9 4.7 0.8 1.9 7.6 7.4 1.8 ...
$ Tenure.Category : 因子 w/ 5 个级别“1 到少于 3 年”,..: 2 3 3 3 3 5 1 4 4 1 ...
$ Gender_Text : 因子 w/ 2 个级别 "F","M": 1 1 1 1 2 1 2 1 1 2 ...
$种族:因素w / 6个级别“亚洲”,“黑人或非裔美国人”,..:6 6 6 6 6 6 6 6 6 6 ...
$ Reg..vs..Non.Reg。:因素 w/ 2 个级别“无遗憾”,..:2 1 2 2 2 2 2 2 2 1 ...
$横向:因子w / 6个级别“0”,“1”,“2”,“3”,..:2 2 1 2 1 1 1 2 1 1 ...
$ 促销 : 因子 w/ 3 个级别 "0","1","2": 2 1 3 1 2 1 1 2 2 1 ...
$ Geo : 因子 w/ 17 个级别 "Bentonville, AR",..: 1 1 1 1 1 1 2 2 2 3 ...
$ Avg..Time.for.Promo: num 9 0 2.4 0 2.4 0 0 5.5 2.3 0 ...
2个回答

您正在尝试测量类别的欧几里得距离。欧几里得距离是数字上的“正常”距离:7 和 10 的欧几里得距离是 3,-1 和 1 的欧几里得距离是 2。

如果你给你的类别数字,那么你将计算这些数字之间的距离——但它们有意义吗?假设我有类别“最喜欢的冰淇淋”,​​其中包含条目“香草”、“草莓”和“刺猬”,我称它们为 1、2 和 3。然后 R 将计算香草和草莓之间的距离为 1,草莓和草莓之间的距离Hedgehog 为 1,Vanilla 和 Hedgehog 之间为 2。但这个距离并不对应于任何真实的东西——事实上,从 Vanilla 到 Hedgehog 的距离是从 Strawberry 到 Hedgehog 的两倍,这与现实生活中的任何东西都不对应(人们喜欢刺猬冰淇淋的人与香草爱好者的区别并不像草莓爱好者的两倍)。但是您的聚类将基于这些数字,同样毫无意义。

因此,您需要一种用更合理的方法对混合的数值和分类数据进行聚类的方法。在 R 包cluster中,您有方法?daisy,但值得阅读手册页以了解哪些选项对您有意义。

如果您想查看数据在不同维度上的相似性,您可能需要使用一些描述性图,例如用于数字数据的箱线图、用于分类数据计数的条形图、交叉表,如果需要,还可以使用堆叠箱线图(比较一些数据的箱线图)数字变量,根据一个分类变量拆分)。

看:

这就是您通常了解数据的方式。

如果要进行聚类,可以仅使用 kmeans 函数对数值数据进行聚类,也可以使用接受相异矩阵作为输入的 R 包集群。

使用适当的距离函数(如上述包中的菊花函数),您甚至可以计算混合类型数据之间的距离。

但请考虑计算对象之间的数字距离,如(狗,身高:67 厘米,颜色:黑色)和(长颈鹿,身高:485 厘米,颜色:棕色/白色)真的是你想要走的路,你的实际路线是什么?你试图达到的目标。通常情况下,人们希望找到聚类来预测某些东西,在这种情况下,聚类是错误的方法。