Çok çarpık, sayım verilerinin kümelenmesi: devam etmek için herhangi bir öneri (dönüşüm vb.)?


11

Temel problem

İşte benim temel sorun: Sayıları ile çok çarpık bazı değişkenler içeren bir veri kümesini kümelenmeye çalışıyorum. Değişkenler çok sayıda sıfır içerir ve bu nedenle kümeleme prosedürüm için çok bilgilendirici değildir - k-ortalama algoritması olması muhtemeldir.

Güzel, sadece değişkenleri kare kök, kutu cox veya logaritma kullanarak dönüştürün. Ancak değişkenlerim kategorik değişkenlere dayandığından, diğerlerini (kategorik değişkenin diğer değerlerine dayalı olarak) bırakırken bir değişkeni (kategorik değişkenin bir değerine dayalı olarak) kullanarak bir önyargı oluşturabileceğimden korkuyorum. .

Biraz daha ayrıntıya girelim.

Veri kümesi

Veri kümem öğelerin satın alınmasını temsil ediyor. Öğelerin farklı kategorileri vardır, örneğin renk: mavi, kırmızı ve yeşil. Satın alımlar daha sonra, örneğin müşteriler tarafından gruplandırılır. Bu müşterilerin her biri veri kümemin bir satırı ile temsil ediliyor, bu yüzden bir şekilde müşterileri satın almam gerekiyor.

Bunu yapmanın yolu, öğenin belirli bir renk olduğu satın alma sayısını saymaktır. Bunun yerine tek bir değişken color, üç değişkenli ile bitirmek count_red, count_blueve count_green.

İşte örnek için bir örnek:

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

Aslında, sonuçta mutlak sayımlar kullanmıyorum, oranlar (müşteri başına satın alınan tüm öğelerin yeşil öğelerinin oranı) kullanıyorum.

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

Sonuç aynı: Renklerimden biri için, örneğin yeşil (kimse yeşili sevmez), çok sayıda sıfır içeren sola eğik bir değişken alıyorum. Sonuç olarak, k-araçları bu değişken için iyi bir bölümleme bulamamaktadır.

Öte yandan, değişkenlerimi standartlaştırırsam (çıkarma ortalaması, standart sapmaya bölün), yeşil değişken küçük varyansı nedeniyle "patlar" ve diğer değişkenlerden çok daha geniş bir aralıktan değerler alır, bu da daha fazla görünmesini sağlar. k-anlamı için olduğundan daha önemlidir.

Bir sonraki fikir sk (r) ewed yeşil değişkenini dönüştürmektir.

Çarpık değişkeni dönüştürme

Yeşil değişkeni karekök uygulayarak dönüştürürsem biraz daha az çarpık görünür. (Burada yeşil değişken, karışıklığı sağlamak için kırmızı ve yeşil olarak çizilmiştir.)

resim açıklamasını buraya girin

Kırmızı: orijinal değişken; mavi: kare kök tarafından dönüştürülür.

Diyelim ki bu dönüşümün sonucundan memnunum. Şimdi dağılımları iyi görünse de kırmızı ve mavi değişkenleri ölçeklendirmeli miyim?

Sonuç olarak

Başka bir deyişle, yeşil rengi tek bir şekilde işleyerek, ancak kırmızı ve maviyi hiç kullanmadan kümeleme sonuçlarını bozabilir miyim? Sonunda, her üç değişken de birbirine aittir, bu yüzden aynı şekilde ele alınmamalıdırlar mı?

DÜZENLE

Açıklığa kavuşturmak için: k-araçlarının muhtemelen sayı temelli veriler için gidilecek yol olmadığının farkındayım . Ancak sorum gerçekten bağımlı değişkenlerin tedavisi ile ilgili. Doğru yöntemi seçmek ayrı bir konudur.

Değişkenlerimdeki doğal kısıtlama

count_red(i) + count_blue(i) + count_green(i) = n(i), n(i)toplam müşteri satın alma sayısı i.

(Veya count_red(i) + count_blue(i) + count_green(i) = 1göreli sayımlar kullanılırken eşdeğer olarak .)

Değişkenlerimi farklı şekilde dönüştürürsem, bu kısıtlamadaki üç terime farklı ağırlıklar vermeye karşılık gelir. Amacım müşteri gruplarını en iyi şekilde ayırmaksa, bu kısıtlamayı ihlal etmekle ilgilenmeli miyim? Yoksa "son, araçları haklı çıkarıyor mu?"


CV'ye hoş geldiniz! İlk sorunuzu bu kadar açık ve iyi yazdığınız için teşekkür ederiz.
Silverfish

Veri kümenizi tam olarak anlamadım. Değişkenler (özellikler) vardır count_red, count_blueve count_greenveri sayar bulunmaktadır. Sağ? Öyleyse satırlar nelerdir - öğeler? Ve öğeleri kümeleyecek misin?
ttnphns

Satırlar genellikle toplu alım gruplarını temsil eder. Bunları birden fazla ürün satın alan müşteriler olarak düşünebilirsiniz. Bunu daha açık hale getirmek için sorumu örnek bir veri kümesiyle güncelledim.
pederpansen

"Müşterileri" kümelemek mi istiyorsunuz?
ttnphns

Evet. Satın alımları da zaman aralıklarına göre gruplandırmayı ve sonuç olarak küme zaman aralıklarını gruplandırmayı planlıyorum ama şimdilik: müşteriler.
pederpansen

Yanıtlar:


7

@ttnphns iyi bir cevap verdi.

Kümelemeyi iyi yapmak genellikle verileriniz hakkında çok fazla düşünmektir, bu yüzden bunlardan bazılarını yapalım. Bana göre, verilerinizin en temel özelliği kompozisyon olmalarıdır .

Öte yandan, birincil endişeniz, yeşil ürünler için çok fazla 0ınız olduğu ve özellikle diğerlerine daha benzer hale getirmek için sadece yeşil değerleri dönüştürüp dönüştüremeyeceğinizi merak ediyor gibi görünüyor. Ancak bunlar kompozisyon verileri olduğundan, diğerlerinden bağımsız olarak bir sayı kümesi düşünemezsiniz. Dahası, gerçekten ilgilendiğiniz şey müşterilerin farklı renkli ürünler satın alma olasılıklarıdır, ancak çoğu yeşil ürün satın almadığı için, bu olasılıkları tahmin edemeyeceğinizden endişe ediyorsunuz. Bunu ele almanın bir yolu, müşterilerin tahmini oranlarını ortalama bir orana doğru sürüklediğimiz, ortalamadan ne kadar uzakta olduklarından ve gerçeklerini tahmin etmek için ne kadar veriye sahip olduğunuzdan etkilenen kayma miktarı ile biraz Bayesci bir yaklaşım kullanmaktır. ihtimal.

Aşağıda, örnek veri kümenizi durumunuza yaklaşmanın bir yolunu (R cinsinden) göstermek için kullanıyorum. Verileri okudum ve bunları rowwise oranlara dönüştürdüm ve sonra ortalama oranları sütunlara göre hesapladım. Ayarlanmış sayıları ve yeni rowwise oranlarını almak için her sayıya ortalamaları ekliyorum. Bu, her müşterinin tahmini oranını her bir ürün için ortalama orana doğru iter. Daha güçlü bir dürtü istiyorsanız, 15*mean.propsbunun yerine araçların çoğunu (örneğin ) kullanabilirsiniz.

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

Bunun birkaç sonucu var. Bunlardan biri, bir müşterinin henüz herhangi bir yeşil ürün satın aldığına dair herhangi bir kayda sahip olmasa bile, şimdi yeşil ürün satın alma olasılıklarının sıfır olmayan tahminlerine sahip olmanızdır. Başka bir sonuç, şimdi biraz sürekli değerlere sahip olmanızdır, oysa orijinal oranlar daha ayrıktır; yani, olası tahminler kümesi daha az daraltılmıştır, bu nedenle kareli Öklid mesafesi gibi bir mesafe ölçüsü şimdi daha anlamlı olabilir .

Ne olduğunu görmek için verileri görselleştirebiliriz. Bunlar kompozisyon verileri olduğu için, aslında sadece iki parça bilgimiz var ve bunları tek bir dağılım grafiğinde çizebiliriz. Kırmızı ve mavi kategorilerdeki bilgilerin çoğuyla, bunları eksen olarak kullanmak mantıklıdır. Ayarlanan oranların (kırmızı sayılar) orijinal konumlarından biraz kaydırıldığını görebilirsiniz.

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

resim açıklamasını buraya girin

Bu noktada verileriniz var ve birçok insan bunları standart hale getirerek başlayacaktı. Yine, bunlar bileşimsel veriler olduğundan, herhangi bir standardizasyon yapmadan küme analizleri yürütürdüm - bu değerler zaten orantılıdır ve standardizasyon ilişkisel bilgilerin bir kısmını yok eder. Aslında, arsaya baktığımda, burada gerçekten sadece bir boyut boyutuna sahip olduğunuzu düşünüyorum. (En azından örnek veri kümesinde; gerçek veri kümeniz farklı olabilir.) Bir iş açısından bakıldığında, yeşil ürünleri farklı bir müşteri kümesi olarak satın alma olasılığı olan kişileri tanımanın önemli olduğunu düşünmüyorum, ilk temel bileşende (bu veri kümesindeki varyansın% 99,5'ini oluşturan) puanlar alır ve bunu kümelendirir.

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 çünkü bunun bileşimsel veri olduğunu fark ettiniz, ancak neden yalnızca besteler için standart dönüşüm tekniklerini kullanmayasınız? yerine bu garip "ortalama ayarlanmış sayımlar" fikri? Bana göre geçici gibi görünüyor, bunun için özel bir referans veya benzer bir şey var mı? Bu neden basit merkezli bir günlük oranı dönüşümünden ve daha sonra dönüştürülen verilerin ilk PC puanını kümelemekten daha iyidir? (Bu herhangi bir
kompozit

Teşekkürler, @ usεr11852. > 2, ancak sonlu seçeneklerin sayısı multinomiyallerdir. Bu (önceden ampirik bir biçimdir) önceden Dirichlet (konjugat) olmadan Bayes analizidir . Eminim başka seçenekler de mümkün. Ancak, oranların 0'larla nasıl çalışacağını hemen görmüyorum.
gung - Monica'yı eski durumuna getirin

2
Bağlantı için teşekkürler. Sıfır olmayan tek bir bileşen boyutunuz varsa, bunu ek bir günlük oranı dönüşümü için kullanabilirsiniz (bariz imputation fikri hariç; buradaki yorumlara bakın ). CLR kapalı olacaktır, çünkü geometrik bir ortalama kullanır. "Sıfır şişirilmiş bileşim verileri" üzerinde çalışmalar yapılmıştır; örneğin burada , burada ve burada .
usεr11852

1
Bu konu hakkında benden çok daha fazla şey biliyor gibisin, @ usεr11852. Cevabım gerçekten sadece durumun doğası hakkındaki bu gerçekleri açıklaştırmaya / sorunu gündeme getirmeye ve bir ön öneri sunmaya çalışmaktı. Neden kendi (daha bilgili) cevabınıza katkıda bulunmuyorsunuz?
gung - Monica'yı eski durumuna getirin

7

Değişkenleri tek tek dönüştürmek akıllıca değildir, çünkü bir araya geldikleri (fark ettiğiniz gibi) ve veriler sayıldığından k-ortalamaları yapmak mümkündür (olabilirsiniz, ancak k-ortalamaları, örneğin uzunluk gibi sürekli özniteliklerde yapmak daha iyidir) .

Yerinizde, sayılar içeren değişkenlere dayanarak her bir müşteri çifti arasında ki-kare mesafesini (sayımlar için mükemmel) hesaplardım. Daha sonra hiyerarşik kümeleme (örneğin, ortalama bağlantı yöntemi veya tam bağlantı yöntemi - sentroidleri hesaplamaz ve bu nedenle öklid mesafesi gerektirmez) veya rasgele mesafe matrisleriyle çalışan başka bir kümeleme yapın.

Sorudan örnek veriler kopyalanıyor:

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

Frekans tablosu için çiftleri düşünün c0ve Ki-kare istatistiği c1hesaplayın . Bunun karekökünü alın (normal öklid mesafesini hesaplarken aldığınız gibi). Bu senin mesafen. Mesafe 0'a yakınsa, iki müşteri benzerdir.2x3

Bu sizin tablodaki sıralar halinde toplamlar farklı olması seni rahatsız olabilir ve karşılaştırdığımızda bu yüzden ki-kare mesafesi etkiler c0ile c1vs c0ile c2. Sonra (kök) hesaplamak Phi-kare : mesafenin iki sıra (müşteriler) kombine toplam sayım şu anda kabul edilir. Böylece toplam sayılara göre normalize edilmiş mesafedir.Phi-sq = Chi-sq/NN

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

Bu nedenle, verilerin herhangi iki satırı arasındaki mesafe , frekans tablosunun ki-kare veya phi-kare istatistiğidir ( verilerdeki sütun sayısıdır). Geçerli tablodaki herhangi bir sütun tamamen sıfırsa, bu sütunu kesin ve kalan sıfır olmayan sütunlara göre mesafeyi hesaplayın (sorun yok ve örneğin SPSS mesafeyi hesaplarken bunu yapar). Ki-kare mesafesi aslında ağırlıklı bir öklid mesafesidir.2 x pp2 x p


Bu ayrıntılı cevap için teşekkür ederim. Orijinal sorum olmayan bir şey hakkında tavsiyede bulunduğunuz için teşekkür ederim: K-araçları (örtülü Öklid mesafesiyle) bu kullanım durumu için doğru seçim mi? Olmadığından şüpheliydim ve bunu doğruladın. Ancak, hala nedenini anlamıyorum . Neden 1) ki-kare (veya phi-square) mesafesinin sayım verileri için neden iyi bir seçim olduğunu söyleyebilir misiniz? 2) orijinal soruma geri dönüyorum: Tüm değişkenlerin neden "birbirine ait oldukları" dışında aynı şekilde ele alınması gerektiği konusunda iyi (matematiksel / ampirik) bir argüman var mı?
pederpansen

Bir müşteri tek bir satın alma işlemi yaparken üç renk arasından seçim yapar: üç renk kavramsal olarak bağımsız "değişken" değildir. Ayrıca verileriniz de sayılır. Ki-kare tabanlı bir önlemin optimal olması gerektiği hemen anlaşıldı. Son noktanıza gelince - size geri dönebilirim: neden farklı muamele görmeliler? A, size kümeleme işini yapmanız için bir çözüm sundu. İçinde sevmediğiniz veya sizi şüphe eden bir şey var mı?
ttnphns

2
K-ortalamalar kullanır: Ben de gitmek için bir yoldur (! Varyans minimizasyonu) k-ortalama sanmıyorum araçları . Verileriniz tamsayıdır ve çok sayıda sıfır içerir. Küme merkezleri tamsayı olmayacak ve birkaç sıfır içerecektir. Veri noktalarınızdan tamamen farklıdırlar , nasıl temsilci olabilirler? Alt satır: verilerinizi k-araçlarına sığdırmak için savaşmayın. Sorunu anlayın ve algoritmaları probleminize uydurun, aksi şekilde değil. Verilerinizi k-demektir sorununa sığdırırsanız, yine de yanlış sorun olabilir ...
QUIT (ÇIK) - Anony-Mousse

1
Değişkenlerinizi varyanslarını dengelemek için standartlaştırdığınızda, veri tablonuzun sütunlarındaki toplamları eşitlemek kabaca eşdeğerdir. Eğriyi dönüştürdüğünüzde, tablonuzdaki daha büyük ancak daha küçük sayıları artırmak kabaca eşdeğerdir. Bunu yapabilirsiniz (ve hatta önerdiğim gibi chi veya phi hesaplayabilirsiniz), ancak orijinal verileri büktüğünüzü unutmayın. Garantili miydi, değerli bilgileri ortaya çıkardınız ve gizlemediniz mi? Verilere işkence yapmak gereksiz miydi? Sonunda, bu yansımalara karar veren tek kişi sensin.
ttnphns

2
Uygun olmayan normalleştirme ile temel özellikleri yok etmek kolaydır. Örneğin, verileriniz her satırda 1'e kadar çıkarsa, her sütunu normalleştirmek bu özelliği yok eder. Bu tür verilerde, bunun yerine örneğin sapma önlemlerini (dağılım mesafeleri) dikkate almalısınız. Veri sayılırken, Jaccard gibi ayarlanmış kavşak ölçümleri daha bilgilendirici olabilir; fakat ikili vektörlere ihtiyaç duyarlar. vs
çıkıldı - Anony-Mousse
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.