K均值聚类方法

时间:2019-02-21 12:24:33

标签: r k-means

Description of the data 我正在尝试在R中生成聚类平均值的合适图形显示。

如何将属性放在x-axis上,并将每个聚类的means视为项目上的轨迹?

所有数据都是连续的。

1 个答案:

答案 0 :(得分:0)

以下方法怎么样:由于您的变量处于相似的度量范围(例如Likert规模),因此您可以显示每个变量在每个群集中的分布(例如箱形图),并通过使用相同的轴限制直观地比较它们的分布在每个群集上。

这可以通过将数据放入适当的格式并使用ggplot2包来生成图来完成。如下所示。

步骤1:生成模拟数据以模仿您拥有的数字数据

生成的数据包含四个非负整数变量和一个具有3个簇的簇变量。

library(ggplot2)

set.seed(1717)    # make the simulated data repeatable
N = 100
nclusters = 3
cluster = as.numeric( cut(rnorm(N), breaks=nclusters, label=seq_len(nclusters)) )
df = data.frame(cluster=cluster,
                x1=floor(cluster + runif(N)*5),
                x2=floor(runif(N)*5),
                x3=floor((nclusters-cluster) + runif(N)*5),
                x4=floor(cluster + runif(N)*5))
df$cluster = factor(df$cluster)  # define cluster as factor to ease plotting code below
tail(df)
table(df$cluster)

其输出是:

    cluster x1 x2 x3 x4
95        2  5  2  5  2
96        3  5  4  0  3
97        3  3  3  1  7
98        2  5  4  3  3
99        3  6  1  1  7
100       3  5  1  2  5

 1  2  3 
15 64 21 

即,在100个模拟案例中,数据包含聚类1中的15个案例,聚类2中的64个案例,聚类3中的21个案例。

步骤2:准备绘图数据

这里,我们使用reshape()包中的stats将数据集从宽到长转置,以便四个数值变量(x1x2,{{1} },x3)放在一列中,适用于为四个变量中的每一个生成一个箱形图,然后将其按聚类变量分组。

x4

其输出是:

vars2transpose = c("x1", "x2","x3", "x4")
df.long = reshape(df, direction="long", idvar="id",
                  varying=list(vars2transpose),
                  timevar="var", times=vars2transpose, v.names="value")
head(df.long)
table(df.long$cluster)

请注意,由于数据现在采用转置的长格式,因此每个聚类中的案例数增加了4倍(即数字变量的数量)。

第3步:使用线连接方式通过聚类创建变量的箱形图

我们为每个变量 cluster var value id 1.x1 1 x1 5 1 2.x1 1 x1 3 2 3.x1 3 x1 5 3 4.x1 1 x1 1 4 5.x1 2 x1 3 5 6.x1 1 x1 2 6 1 2 3 60 256 84 x1x2x3绘制水平箱线图,以显示它们在每个群集中的分布,并用连接的红叉标记平均值(您所追求的轨迹)。

x4

将生成以下图形。 variable distribution by cluster

图形可能会挤满您拥有的许多变量,因此您可能需要:

  • 可以通过删除最后的gg <- ggplot(df.long, aes(x=var, y=value)) gg + facet_grid(cluster ~ ., labeller=label_both) + geom_boxplot(aes(fill=cluster)) + stat_summary(fun.y="mean", geom="point", color="red", pch="x", size=3) + stat_summary(fun.y="mean", geom="line", color="red", aes(group=1)) + coord_flip() # swap the x and y axis to make boxplots horizontal instead of vertical 行来显示垂直框图
  • 或完全删除方框图,并通过消除coord_flip()行来显示连接的红叉。

如果要在不同聚类中并排比较每个变量,则可以按以下方式交换分组和x轴变量:

geom_boxplot()

variable distribution side by side