非常に歪んだカウントデータのクラスタリング:実行するための提案(変換など)?


11

基本的な問題

これが私の基本的な問題です。非常にゆがんだ変数とカウントを含むデータセットをクラスター化しようとしています。変数には多くのゼロが含まれているため、私のクラスタリング手順(K平均アルゴリズムの可能性が高い)ではあまり情報がありません。

細かいことは、平方根、ボックスコックス、または対数を使用して変数を変換するだけです。しかし、私の変数はカテゴリー変数に基づいているので、(カテゴリー変数の1つの値に基づいて)変数を処理し、他の変数(カテゴリー変数の他の値に基づいて)をそのままにして、バイアスを導入するのではないかと心配しています。 。

もう少し詳しく見ていきましょう。

データセット

私のデータセットはアイテムの購入を表します。アイテムには、たとえば色:青、赤、緑など、さまざまなカテゴリがあります。購入は、たとえば顧客ごとにグループ化されます。これらの各顧客は、データセットの1行で表されるため、顧客に対する購入を何らかの方法で集計する必要があります。

私がこれを行う方法は、アイテムが特定の色である購入の数を数えることです。だからではなく、単一の変数の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      |
-----------------------------------------------------------

結果は同じです。たとえば、緑(誰も緑が好きではない)など、私の色の1つについて、多くのゼロを含む左に歪んだ変数が得られます。その結果、k-meansはこの変数の適切な分割を見つけることができません。

一方、変数を標準化すると(平均を減算し、標準偏差で除算)、緑色の変数はその小さな分散のために「爆発」し、他の変数よりもはるかに広い範囲から値を取得するため、より見やすくなります。実際よりもk-meansにとって重要です。

次のアイデアは、sk(r)ewed green変数を変換することです。

歪んだ変数の変換

平方根を適用して緑の変数を変換すると、少しゆがんで見えます。(ここでは、混乱を確実にするために、緑の変数が赤と緑でプロットされています。)

ここに画像の説明を入力してください

赤:元の変数。青:平方根によって変換されます。

この変換の結果に満足しているとしましょう(ゼロはまだ分布を強く歪めているので、満足していません)。赤と青の変数もスケーリングする必要がありますが、分布は正常に見えますか?

ボトムライン

つまり、赤と青をまったく処理せずに、緑を一方向に処理することで、クラスタリングの結果を歪めますか?結局、3つの変数はすべて一緒に属しているので、同じように処理するべきではないでしょうか。

編集

明確にするために:私は、k-meansがおそらくカウントベースのデータ取得する方法ではないことを認識しています。しかし、私の質問は、従属変数の扱いについてです。正しい方法の選択は別の問題です。

私の変数に固有の制約は、

count_red(i) + count_blue(i) + count_green(i) = n(i)n(i)は顧客の合計購入数ですi

(または、同等に、count_red(i) + count_blue(i) + count_green(i) = 1相対カウントを使用する場合。)

変数を別の方法で変換すると、これは制約の3つの項に異なる重みを与えることに対応します。私の目標が顧客のグループを最適に分離することである場合、この制約に違反することに注意する必要がありますか?それとも「終わりは手段を正当化する」のでしょうか?


CVへようこそ!最初の質問をわかりやすく説明していただきありがとうございます。
Silverfish

データセットがよくわかりませんでした。変数(属性)がありcount_redcount_blueそしてcount_green、データがカウントされています。正しい?行は何ですか-アイテム?そして、アイテムをクラスター化しますか?
ttnphns

行は通常、集計された購入のグループを表します。複数のアイテムを購入した顧客と考えることができます。これをより明確にするために、サンプルデータセットで質問を更新しました。
pederpansen 2015

「顧客」をクラスター化したいですか?
ttnphns 2015

はい。購入を時間間隔でグループ化し、結果として時間間隔をクラスタ化するつもりですが、今のところは顧客です。
pederpansen 2015

回答:


7

@ttnphnsは良い答えを提供してくれました。

多くの場合、クラスタリングを適切に行うには、データについて非常に慎重に考える必要があるため、そのいくつかを実行してみましょう。私の考えでは、データの最も基本的な側面は、それらが構成的であるということです。

一方、あなたの主な関心事は、グリーン製品に多くの0があることであり、特にグリーン値のみを変換して他のものに類似させることができるかどうか疑問に思っています。ただし、これらは構成データであるため、1セットのカウントを他のセットと独立して考えることはできません。また、実際に興味を持っているのは色違いの商品を購入する顧客の確率だそうですが、多くは緑色のものを購入していないため、それらの確率を見積もることができないのではないかと心配しています。これに対処する1つの方法は、顧客の推定比率を平均比率に向かってナッジする、いくらかのベイジアンアプローチを使用することです。シフトの量は、平均からどれだけ離れているか、および真の推定に必要なデータ量に影響されます。確率。

以下では、サンプルデータセットを使用して、状況にアプローチする1つの方法を(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

これにはいくつかの結果があります。その1つは、お客様が実際にグリーン製品を購入したという記録がまだない場合でも、グリーン製品を購入する根本的な確率の推定値がゼロでないことです。もう1つの結果は、元の比率がより離散的であったのに対して、いくぶん連続した値になることです。それはそう乗ユークリッド距離のような距離測定値は、可能な推定値のセットが少ないくびれている、あるかもしれません、今より多くの意味を作ります。

データを視覚化して、何が起こったかを確認できます。これらは構成データであるため、実際には2つの情報しかなく、これらを1つの散布図にプロットできます。赤と青のカテゴリのほとんどの情報で、それらを軸として使用することは理にかなっています。調整された比率(赤い数字)が元の位置から少しずれていることがわかります。

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")

ここに画像の説明を入力してください

この時点で、データがあり、多くの人がそれらを標準化することから始めます。繰り返しますが、これらは構成データであるため、標準化を行わずにクラスター分析を実行します。これらの値はすでに釣り合っており、標準化によって一部の関係情報が破壊されます。実際、プロットを見ると、ここには1次元の情報しかないと思います。(少なくともサンプルデータセットでは、実際のデータセットは大きく異なる可能性があります。)ビジネスの観点から、グリーン製品を購入する可能性が高い人々を別個の顧客のクラスターとして認識することが重要だと思わない限り、最初の主成分(このデータセットの分散の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より大きいが有限のオプションは多項式です。これは(経験的な1つの形式)ベイジアン分析と事前ディリクレ(共役)です。他のオプションも可能だと思います。ただし、比率を取ることで0がどのように機能するかはすぐにはわかりません。
ガン-モニカの回復

2
リンクをありがとう。ゼロ以外のコンポーネントディメンションが1つある場合は、それを追加の対数比変換に使用できます(代入の明白なアイデアは除きます。ここのコメントを参照してください)。CLRは幾何平均を使用するため、オフになります。「ゼロインフレ組成データ」に関する作業が行われています。例えば参照ここではここここ
usεr11852

1
このトピックについては、@usεr11852より私が知っているようです。私の答えは、状況の性質に関するこれらの事実を明確にすること、問題を提起すること、そして予備的な提案を提供することです。自分の(より詳しい情報に基づく)回答を投稿してみませんか?
ガン-モニカの復活

7

変数は一緒に属しているため(お気付きのとおり)変数を個別に変換し、データがカウントであるためにk-meansを実行することは賢明ではありません(たとえば、k-meansは、長さなどの連続属性に対して実行することをお勧めします)。 。

あなたの代わりに、カウントを含む変数に基づいて、顧客のすべてのペア間のカイ二乗距離(カウントに最適)を計算します。次に、階層的クラスタリング(たとえば、平均リンケージ法または完全リンケージ法-重心を計算しないため、ユークリッド距離を必要としません)または任意の距離行列で機能する他のクラスタリングを実行します。

質問からサンプルデータをコピーする:

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

ペアc0を検討し、頻度テーブルのカイ2乗統計をc1計算します。その平方根を取ります(通常のユークリッド距離を計算するときに取るように)。それはあなたの距離です。距離が0に近い場合、2人の顧客は類似しています。2x3

それは、カイ二乗距離に影響を与えますので、あなたが比較すると、あなたのテーブル内の行の合計が異なるとすることをお邪魔するc0c1c0を持ちますc2。次に、ファイ平方距離(のルート)を計算しますPhi-sq = Chi-sq/NNは、現在考慮されている2つの行(顧客)の合計数の合計です。したがって、全体のカウントに対する正規化された距離です。

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つの行の間の距離は、度数分布表のカイ2乗またはファイ2乗の統計(の平方根)です2 x ppはデータの列数です)。現在の2 x pテーブルのいずれかの列が完全にゼロである場合、その列を切り取り、残りの非ゼロ列に基づいて距離を計算します(これは問題ありません。これは、たとえば、SPSSが距離を計算するときに行う方法です)。カイ二乗距離は、実際には重み付きユークリッド距離です。


この精巧な答えをありがとう。私の元の質問ではなかった何かについてアドバイスを提供してくれたことに感謝します。K-means(暗黙のユークリッド距離を使用)は、このユースケースの正しい選択ですか?私はそうではないと疑いました、そしてあなたはそれを確認しました。ただし、その理由はまだわかりません。1)カイ2乗(またはファイ2乗)距離がカウントデータに適している理由を教えてください。2)私の元の質問に戻ります:なぜすべての変数が「それらが一緒に属している」以外の方法で同じように扱われるべきかという良い(数学的/経験的)議論がありますか?
pederpansen 2015

顧客は、1回の購入で3つの色から選択します。3つの色は、概念的に独立した「変数」ではありません。さらに、データは重要です。カイ2乗ベースの測定が最適であることはすぐにわかりました。あなたの最後の点に関して-私はあなたに尋ねることができます:なぜ彼らは異なって扱われるべきですか?Aは、クラスタリングジョブを実行するためのソリューションを提供しました。嫌いなところや疑問に思うところはありますか?
ttnphns 2015

2
また、k-means(分散最小化!)が適切な方法だとは思いません。k-meansは平均を使用します。データは整数であり、多くのゼロがあります。クラスターの中心は整数ではなく、ゼロはほとんどありません。それらはあなたのデータポイントは全く異なりますが、どのように代表することができますか?結論:k-meansに適合するようにデータを変換するために戦わないでください。問題を理解し、アルゴリズムを問題に適合させます。データをk-means問題に当てはめる場合でも、それは間違った問題である可能性があります...
QUITあり-Anony-Mousse

1
変数を標準化してそれらの分散を等しくすることは、データテーブルの列の合計を等しくすることとほぼ同じです。スキューを変換する場合、テーブル内のカウントを大きくするが小さくはしないこととほぼ同じです。あなたはそれをするかもしれません(そして、それの後でさえ私が提案したようにchiまたはphiを計算するかもしれません)が、あなたは元のデータをひねったことに注意してください。それは正当なものでしたか、貴重な情報を明らかにして隠しませんでしたか?データの拷問は不要でしたか?結局、あなたはこれらの反射を決定する唯一の人です。
ttnphns 2015

2
不適切な正規化によって基本的なプロパティを破壊するのは簡単です。たとえば、データの各行の合計が1になる場合、各列を正規化すると、このプロパティが破壊されます。このようなデータについては、代わりに、たとえば、相違測度(分布の距離)を検討する必要があります。データをカウントする際に、Jaccardなどの交差測定値を設定すると、より有益な場合があります。ただし、バイナリベクトルが必要です。など
QUITあり-匿名-ムース2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.