Кластеризація дуже перекошених, порахуйте дані: будь-які пропозиції (перетворення тощо)?


11

Основна проблема

Ось моя основна проблема: я намагаюся згрупувати набір даних, що містить кілька дуже перекошених змінних з підрахунками. Змінні містять багато нулів і тому не дуже інформативні для моєї процедури кластеризації - що, швидше за все, буде алгоритмом k-значень.

Тонко, скажете ви, просто перетворіть змінні за допомогою квадратного корінця, вікна кокса чи логарифму. Але оскільки мої змінні базуються на категоричних змінних, я побоююся, що я можу ввести зміщення, обробляючи змінну (на основі одного значення категоріальної змінної), а залишаючи інші (на основі інших значень категоріальної змінної) такими, якими вони є .

Розглянемо детальніше.

Набір даних

Мій набір даних представляє покупки елементів. Елементи мають різні категорії, наприклад колір: синій, червоний та зелений. Потім покупки групуються, наприклад, за замовниками. Кожен із цих клієнтів представлений одним рядком мого набору даних, тож мені якось доводиться об'єднувати покупки над клієнтами.

Я це роблю, підраховуючи кількість покупок, де товар певного кольору. Таким чином , замість однієї змінної color, я в кінцевому підсумку з трьома змінними count_red, count_blueі count_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.

Перетворення перекосової змінної

Якщо я перетворять зелену змінну, застосовуючи квадратний корінь, вона виглядає трохи менш перекошеною. (Тут зелена змінна нанесена на червоний та зелений колір, щоб забезпечити плутанину.)

введіть тут опис зображення

Червоний: оригінальна змінна; синій: перетворений квадратним коренем.

Скажімо, я задоволений результатом цієї трансформації (якою я не є, оскільки нулі все ще сильно перекручують розподіл). Чи повинен я зараз також масштабувати червоні та сині змінні, хоча їх розподіл виглядає нормально?

Нижня лінія

Іншими словами, чи я спотворюю результати кластеризації, обробляючи зелений колір одним способом, але взагалі не обробляючи червоний і синій? Зрештою, всі три змінні належать разом, тож чи не слід ними обробляти однаково?

EDIT

Для уточнення: я знаю, що 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при використанні відносних підрахунків.)

Якщо я зміню свої змінні по-різному, це відповідає наданню різної ваги трьом умовам обмеження. Якщо моя мета - оптимально розділити групи клієнтів, чи потрібно мені піклуватися про порушення цього обмеження? Або "кінець виправдовує засоби"?


Ласкаво просимо в CV! Дякуємо, що ви зробили своє перше запитання настільки чітким і добре написаним
Срібна рибка

Я не зовсім зрозумів ваш набір даних. Змінні (атрибути) є count_red, count_blueі count_greenдані є підрахунками. Правильно? Які рядки тоді - предмети? А ви збираєтеся кластеризувати елементи?
ttnphns

Рядки зазвичай представляють групи сукупних покупок. Ви можете вважати їх клієнтами, які придбали кілька предметів. Я оновив своє запитання за допомогою зразка набору даних, щоб зробити це більш зрозумілим.
pederpansen

Ви хочете об'єднати "клієнтів"?
ttnphns

Так. Я маю намір згрупувати закупівлі також за тимчасовими інтервалами і, відповідно, кластеризувати інтервали часу, але поки що: клієнти.
pederpansen

Відповіді:


7

@ttnphns дав хорошу відповідь.

Як зробити кластеризацію часто, це дуже важко задуматися над вашими даними, тому давайте зробимо щось із цього. На мій погляд, найбільш фундаментальним аспектом ваших даних є те, що вони є композиційними .

З іншого боку, ваша основна проблема полягає в тому, що у вас є багато 0 для зелених продуктів, і конкретно цікавитесь, чи зможете ви трансформувати лише зелені значення, щоб зробити його більш схожим на решту. Але оскільки це композиційні дані, ви не можете думати про один набір рахунків незалежно від решти. Крім того, виявляється, що вас справді цікавить - це ймовірність покупців придбати різні кольорові продукти, але оскільки багато хто не придбав жодної зеленої, ви переживаєте, що не зможете оцінити ці ймовірності. Одним із способів вирішити це є використання дещо байєсівського підходу, в якому ми підштовхуємо орієнтовні пропорції клієнтів до середньої пропорції, при цьому на величину зрушення впливає те, наскільки вони далекі від середньої величини та скільки даних, які ти маєш оцінити їх правдивістю ймовірності.

Нижче я використовую ваш приклад набору даних, щоб проілюструвати (в R) один із способів підходу до вашої ситуації. Я читаю дані і перетворюю їх у пропорції rowwise, а потім обчислюю середні пропорції за стовпцями. Я додаю засоби до кожного підрахунку, щоб отримати коригувані підрахунки та нові пропорції rowwise. Це приводить орієнтовну пропорцію кожного клієнта до середньої пропорції для кожного продукту. Якщо ви хочете сильніше натиснути, 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, оскільки ви визнали, що це композиційні дані, але чому б ви не просто використовували стандартні методи перетворення для композиції. дані замість цієї дивної ідеї "середнього значення рахунку"? Мені здається, ad hoc, чи є певна посилання на це чи щось подібне? Чому це краще, ніж просте перетворення по центру з коефіцієнтом журналу, а потім кластеризація першої оцінки ПК перетворених даних? (Що було б , що будь-яка розумна рецензент через COMPOS додаток для аналізу даних буде запитати.)
usεr11852

Спасибі, @ usεr11852 Кількість> 2, але кінцеві варіанти - багаточлени. Це (1 форма емпіричного) байєсівського аналізу без попереднього Діріхле (кон'югат). Я впевнений, що можливі й інші варіанти. Однак я не відразу бачу, як співвідношення співпрацює з 0/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та обчислимо статистику Chi-квадрата для їх 2x3частотної таблиці. Візьміть його квадратний корінь (як ви приймаєте його, коли обчислюєте звичайну евклідову відстань). Це ваша відстань. Якщо відстань близька до 0, два клієнти схожі.

Це може турбувати вас , що суми в рядках таблиці розрізняються , і тому впливає на хі-квадрат відстані , якщо порівняти c0з c1проти c0з c2. Потім обчисліть (корінь) відстань Phi-квадрата : Phi-sq = Chi-sq/Nде Nв даний час розглянуто загальне підрахунок у двох рядках (клієнтах). Таким чином, нормалізується дистанція WR до загальних показників.

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

Таким чином, відстань між будь-якими двома рядами даних є (кв. Корінь) на хі-квадрат або PHI-квадрат статистики з 2 x pтаблиці частот ( pце число стовпців в даних). Якщо будь-який стовпець у поточній 2 x pтаблиці дорівнює нулю, відріжте цей стовпець і обчисліть відстань на основі решти ненульових стовпців (це нормально, і це, як, наприклад, робить SPSS під час обчислення відстані). Відстань Chi-квадрат - це фактично зважена евклідова відстань.


Дякую за цю детальну відповідь. Я вдячний, що ви дали поради щодо чогось, що не було моїм початковим запитанням: Чи K-засоби (з неявною евклідовою дистанцією) - правильний вибір для цього випадку використання? Я підозрював, що це не так, і ви це підтвердили. Однак я досі не розумію, чому . Чи можете ви обґрунтувати 1) чому відстань чі-квадрат (або фі-квадрат) є хорошим вибором для підрахунку даних? 2) повертаючись до мого початкового запитання: чи є хороший (математичний / емпіричний) аргумент, чому до всіх змінних слід ставитися так само, окрім як «вони належать разом»?
pederpansen

Клієнт вибирає серед трьох кольорів, коли робить одну покупку: три кольори не є концептуально незалежними "змінними". Плюс ваші дані - це підрахунок. Мені відразу було зрозуміло, що міра на основі чі-квадрата повинна бути оптимальною. Стосовно вашого останнього моменту - я можу вас запитати: чому до них слід ставитися по-різному? Дав вам рішення виконати роботу з кластеризації. Чи є в ньому щось, що вам не подобається або що викликає сумніви?
ttnphns

2
Я також не думаю, що k-засоби (мінімізація дисперсії!) - це шлях: k-означає використовує засоби . Ваші дані є цілими числами та мають багато нулів. Центри кластерів не будуть цілими числами і матимуть кілька нулів. Вони абсолютно не схожі на ваші точки даних, як вони можуть бути репрезентативними? Підсумок: не намагайтеся перетворити ваші дані на k-засоби. Зрозумійте проблему та підходите алгоритми до вашої проблеми, а не іншим способом. Якщо ви підходите до своїх даних до проблеми k-означає, це все ж може бути помилковою проблемою ...
Має QUIT - Anonymous-Mousse

1
Коли ви стандартизуєте свої змінні для вирівнювання їх відхилень, це приблизно еквівалентно вирівнюванню підсумків у стовпцях таблиці даних. Коли ви трансформуєте перекос, це приблизно еквівалентно збільшенню більшої, але не меншої кількості у вашій таблиці. Ви можете це зробити (і навіть після цього ви можете обчислити чі чи фі, як я запропонував), але пам’ятайте, що ви скрутили оригінальні дані. Чи було це обґрунтовано, ви розкривали та не приховували цінну інформацію? Чи було зайвим катування даних? Зрештою, ти єдиний, хто приймає рішення про ці роздуми.
ttnphns

2
Руйнувати основні властивості легко за допомогою невідповідної нормалізації. Наприклад, якщо ваші дані підсумовують до 1 у кожному рядку, нормалізація кожного стовпця знищить цю властивість. На таких даних слід замість цього розглянути, наприклад, заходи дивергенції (відстані до розподілів). Що стосується підрахунку даних, набір заходів перехрестя, таких як Жакард, може бути більш інформативним; але їм потрібні бінарні вектори. і т. д.
має QUIT - Anonymous-Mousse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.