非常偏斜的群集,计数数据:有什么建议(转换等)?


11

基本问题

这是我的基本问题:我正在尝试将包含一些非常偏斜的变量与计数的数据集聚类。变量包含许多零,因此对于我的聚类过程不是很有帮助-这很可能是k-means算法。

很好,您说的是,只需使用平方根,Box Cox或对数转换变量即可。但是由于我的变量是基于分类变量的,所以我担心我可能会通过处理一个变量(基于分类变量的一个值)而使其他变量(基于分类变量的其他值)而产生偏差。 。

让我们更详细些。

数据集

我的数据集代表物品的购买。这些项目具有不同的类别,例如颜色:蓝色,红色和绿色。然后,例如由顾客将购买分组在一起。这些客户中的每一个都由我的数据集的一行代表,因此我必须以某种方式汇总客户的购买量。

我这样做的方式是通过计算购买次数,其中该商品是某种颜色。因此,而不是一个变量color,我结束了三个变量count_redcount_bluecount_green

这是一个示例说明:

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

实际上,最终我不使用绝对计数,而是使用比率(每个客户购买的所有项目中绿色项目的分数)。

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    0.71    |        0.29     |       0.00      |
-----------------------------------------------------------
c1       |    0.43    |        0.57     |       0.00      |
-----------------------------------------------------------
c2       |    0.09    |        0.91     |       0.00      |
-----------------------------------------------------------
c3       |    0.31    |        0.62     |       0.08      |
-----------------------------------------------------------

结果是相同的:对于我的一种颜色,例如绿色(没人喜欢绿色),我得到了一个包含许多零的左偏变量。因此,k均值无法为该变量找到良好的分区。

另一方面,如果我对变量进行标准化(减去均值,除以标准差),则绿色变量会因其较小的方差而“爆炸”,并且取值范围比其他变量大得多,这使其看起来更对于k均值来说,比实际重要。

下一个想法是转换sk(r)ewed绿色变量。

转换偏斜变量

如果我通过应用平方根来变换绿色变量,则它看起来不太偏斜。(此处绿色变量以红色和绿色绘制,以确保混淆。)

在此处输入图片说明

红色:原始变量;蓝色:由平方根转换而成。

假设我对这种转换的结果感到满意(但我不满意,因为零仍然严重扭曲了分布)。尽管红色和蓝色变量的分布看起来不错,但我现在还应该缩放它们吗?

底线

换句话说,我是否通过一种方式处理绿色而不是完全处理红色和蓝色来扭曲聚类结果?最后,这三个变量都属于同一变量,难道不应该以相同的方式处理它们吗?

编辑

需要说明的是:我知道k均值可能不是基于计数的数据的方法。但是,我的问题实际上是关于因变量的处理。选择正确的方法是另一回事。

我变量的固有约束是

count_red(i) + count_blue(i) + count_green(i) = n(i)n(i)是客户的购买总数i

(或者等效地,count_red(i) + count_blue(i) + count_green(i) = 1当使用相对计数时。)

如果我对变量进行不同的变换,则相当于对约束中的三个项赋予不同的权重。如果我的目标是最佳地分离客户群,那么我是否需要担心违反此约束?还是“目的证明手段”?


欢迎来到简历!感谢您提出的第一个问题如此清晰明确。
银鱼

我不太了解您的数据集。变量(属性)count_redcount_bluecount_green与数据计数。对?那么,什么是行-项目?然后您要对项目进行聚类?
ttnphns

这些行通常代表汇总的购买组。您可以将他们视为购买了多个商品的客户。我用示例数据集更新了我的问题,以使其更加清楚。
pederpansen

您想集群“客户”吗?
ttnphns

是。我打算同时按时间间隔对购买进行分组,并因此按时间间隔对购买进行分组,但是现在:客户。
pederpansen

Answers:


7

@ttnphns提供了一个很好的答案。

做好群集通常需要认真思考数据,所以让我们做一些。在我看来,您数据的最基本方面是构成

另一方面,您的主要担忧似乎是绿色产品有很多0,并且特别想知道是否可以仅转换绿色值以使其与其余值更相似。但是,由于这些是构成数据,因此您不能独立于其他计数来考虑一组计数。此外,您真正感兴趣的似乎是客户购买不同颜色产品的可能性,但是由于许多人没有购买任何绿色产品,因此您担心无法估算这些可能性。解决此问题的一种方法是使用某种贝叶斯方法,在该方法中,我们将客户的估计比例推向平均比例,其变化量受其离均值的距离以及要估算其真实值所需的数据量的影响概率。

下面,我使用您的示例数据集来说明(用R表示)一种解决您的情况的方法。我读入数据并将其转换为按行的比例,然后按列计算平均比例。我将均值添加回每个计数以获得调整后的计数和新的按行比例。这会将每个客户的估计比例推向每种产品的平均比例。如果您希望微调,可以使用多种方法(例如15*mean.props)代替。

d = read.table(text="id  red    blue    green
...
c3  4   8   1", header=TRUE)
tab = as.table(as.matrix(d[,-1]))
rownames(tab) = paste0("c", 0:3)
tab
#    red blue green
# c0  12    5     0
# c1   3    4     0
# c2   2   21     0
# c3   4    8     1
props = prop.table(tab, 1)
props
#           red       blue      green
# c0 0.70588235 0.29411765 0.00000000
# c1 0.42857143 0.57142857 0.00000000
# c2 0.08695652 0.91304348 0.00000000
# c3 0.30769231 0.61538462 0.07692308
mean.props = apply(props, 2, FUN=function(x){ weighted.mean(x, rowSums(tab)) })
mean.props
#        red       blue      green 
# 0.35000000 0.63333333 0.01666667 
adj.counts = sweep(tab, 2, mean.props, FUN="+");  adj.counts
#            red        blue       green
# c0 12.35000000  5.63333333  0.01666667
# c1  3.35000000  4.63333333  0.01666667
# c2  2.35000000 21.63333333  0.01666667
# c3  4.35000000  8.63333333  1.01666667
adj.props = prop.table(adj.counts, 1);  adj.props
#             red         blue        green
# c0 0.6861111111 0.3129629630 0.0009259259
# c1 0.4187500000 0.5791666667 0.0020833333
# c2 0.0979166667 0.9013888889 0.0006944444
# c3 0.3107142857 0.6166666667 0.0726190476

有几个结果。其中之一是,即使客户实际上没有任何购买绿色产品的记录,您现在也可以对购买绿色产品的潜在概率进行非零估计。另一个结果是,您现在有了一些连续的值,而原始比例则更加离散。就是说,可能的估计值集的约束较少,因此像平方欧几里德距离之类的距离度量现在可能更有意义。

我们可以可视化数据以查看发生了什么。由于这些是组成数据,因此实际上我们只有两条信息,因此可以将它们绘制在单个散点图中。由于大多数信息都位于红色和蓝色类别中,因此将其用作轴是很有意义的。您会看到调整后的比例(红色数字)与原始位置略有不同。

windows()
  plot(props[,1], props[,2], pch=as.character(0:3),
       xlab="Proportion Red", ylab="Proportion Blue", xlim=c(0,1), ylim=c(0,1))
  points(adj.props[,1], adj.props[,2], pch=as.character(0:3), col="red")

在此处输入图片说明

此时,您已经有了数据,很多人将从标准化它们开始。同样,由于这些是组成数据,因此我将在不进行任何标准化的情况下运行聚类分析-这些值已经相当,标准化会破坏一些关系信息。实际上,从查看情节来看,我认为您实际上只具有一维信息。(至少在示例数据集中;您的真实数据集可能会有所不同。)除非从业务角度来看,否则您认为重要的是要认识到有很大可能性购买绿色产品的人是不同的客户群,将提取第一个主成分的分数(占该数据集中方差的99.5%),并将其聚类。

pc.a.props = prcomp(adj.props[,1:2], center=T, scale=T)
cumsum(pc.a.props$sdev^2)/sum(pc.a.props$sdev^2)
# [1] 0.9946557 1.000000
pc.a.props$x
#           PC1         PC2
# c0 -1.7398975 -0.03897251
# c1 -0.1853614 -0.04803648
# c2  1.6882400 -0.06707115
# c3  0.2370189  0.15408015
library(mclust)
mc = Mclust(pc.a.props$x[,1])
summary(mc)
# ----------------------------------------------------
# Gaussian finite mixture model fitted by EM algorithm 
# ----------------------------------------------------
# 
# Mclust E (univariate, equal variance) model with 3 components:
# 
#  log.likelihood n df       BIC       ICL
#       -2.228357 4  6 -12.77448 -12.77448
# 
# Clustering table:
# 1 2 3 
# 1 2 1 

+1是因为您认识到这是组成数据,但为什么不将标准转换技术用于组合乐曲呢?数据,而不是这种奇怪的“均值调整后的计数”想法?在我看来,这是临时的,对此或类似内容是否有特定的参考?为什么这比简单的居中对数比转换然后对转换数据的第一个PC分数进行聚类更好?(这将是一个compos的任何合理的评审数据分析应用程序会问什么。)
usεr11852

谢谢,@usεr11852。计数> 2(但有限)的选项是多项式。这是(一种形式的经验)贝叶斯分析,带有Dirichlet先验(共轭)。我相信其他选择也是可行的。但是,我没有立即看到带0的取值比率如何工作。
gung-恢复莫妮卡

2
感谢您的链接。如果您只有一个非零分量维,则可以将其用于累加对数比转换(不包括明显的插补概念;请参见此处的注释)。CLR将关闭,因为它使用了几何平均值。已经进行了“零膨胀成分数据”的工作;例如在这里这里这里
usεr11852

1
听起来,您对这个主题的了解比我要多,@usεr11852。我的回答实际上只是试图使有关事实性质的这些事实明确/提出问题并提出初步建议。为什么不贡献自己的(更好的信息)答案?
gung-恢复莫妮卡

7

分别转换变量是不明智的,因为它们属于同一变量(如您所注意到的),并且因为数据是计数而进行k均值(您可能会这样做,但k均值最好对连续属性(例如长度)进行处理。

在您的位置,我将根据包含计数的变量来计算每对客户之间的卡方距离(计数的完美值)。然后进行分层聚类(例如,平均链接方法或完全链接方法-它们不计算质心,因此不需要欧氏距离)或使用任意距离矩阵进行的其他聚类。

复制问题中的示例数据:

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

考虑配对c0并为其频率表c1计算卡方统计量2x3。取它的平方根(就像在计算通常的欧几里德距离时一样)。那是你的距离。如果距离接近0,则两个客户相似。

它可能会打扰你,金额排在你的表格不同,所以影响了卡方距离比较时,c0c1VS c0c2。然后计算(平方)平方根距离:Phi-sq = Chi-sq/N其中,N是当前考虑的两行(客户)中的总和计数。因此,它是相对于总计数的归一化距离。

Here is the matrix of sqrt(Chi-sq) distance between your four customers
 .000   1.275   4.057   2.292
1.275    .000   2.124    .862
4.057   2.124    .000   2.261
2.292    .862   2.261    .000

And here is the matrix of sqrt(Phi-sq) distance 
.000    .260    .641    .418
.260    .000    .388    .193
.641    .388    .000    .377
.418    .193    .377    .000

因此,数据的任何两行之间的距离为(的平方根)卡方披方统计量的的2 x p频数分布表(p被列在数据的数量)。如果当前2 x p表中的任何列都为零,请将该列切除并根据剩余的非零列计算距离(这是正常的,例如,SPSS在计算距离时就是这样做的)。卡方距离实际上是加权的欧几里得距离。


谢谢您的详尽回答。我很高兴您就我最初提出的问题提出建议:K均值(具有隐式欧几里得距离)是否适合此用例?我怀疑不是,您确认了这一点。但是,我仍然不理解为什么。您能否得出1)为什么卡方(或phi)距离是计数数据的好选择?2)回到我最初的问题:是否有一个很好的(数学/经验)论证,为什么除了“它们属于一起”之外,应该以相同的方式对待所有变量?
pederpansen

客户在进行一次购买时会在三种颜色中进行选择:这三种颜色在概念上并不是独立的“变量”。再加上您的数据很重要。我立即清楚地知道,基于卡方的度量应该是最佳的。关于您的最后一点-我可以再问一遍:为什么应该区别对待它们?A为您提供了执行群集工作的解决方案。里面有什么您不喜欢的东西或使您产生疑问的东西吗?
ttnphns

2
我也不认为k-means(方差最小化!)是要走的路:k-means使用mean。您的数据是整数,并且有很多零。聚类中心将不是整数,并且几乎没有零。它们完全不同于您的数据点,它们如何代表?底线:不要为转换数据以适应k均值而战斗。了解问题,并使算法适合您的问题,而不是相反。如果您使数据适合k均值问题,则可能仍然是错误的问题……
QUIT--Anony-Mousse 2015年

1
当您标准化变量以均衡其方差时,它大致等于均衡数据表各列中的总数。转换倾斜时,大致等效于增加表中的较大但不较小的计数。您可以执行此操作(甚至可以按照我的建议计算出chi或phi),但是请注意,您已经扭曲了原始数据。是否有保证,您发现并没有隐藏有价值的信息吗?不必要折磨数据吗?最后,您是唯一决定这些思考的人。
ttnphns

2
通过不适当的标准化很容易破坏基本属性。例如,如果您的数据在每一行中总计为1,则对每一列进行规范化将破坏此属性。在此类数据上,您应考虑使用例如差异度量(分布的距离)。在对数据进行计数时,设置交叉口度量(例如Jaccard)可能会提供更多信息;但他们需要二进制向量。等
已退出– Anony-Mousse 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.