Кластеризация очень искаженных, подсчитываемых данных: есть ли какие-либо предложения (трансформировать и т.д.)

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-means не может найти хорошее разбиение для этой переменной.

С другой стороны, если я стандартизирую свои переменные (вычитаем среднее, делим на стандартное отклонение), зеленая переменная «взрывается» из-за своей небольшой дисперсии и принимает значения из гораздо большего диапазона, чем другие переменные, что делает ее более привлекательной важно для 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при использовании относительного количества.)

Если я преобразую свои переменные по-разному, это будет соответствовать разным весам трех членов в ограничении. Если моей целью является оптимальное разделение групп клиентов, нужно ли мне беспокоиться о нарушении этого ограничения? Или «цель оправдывает средства»?

pederpansen
источник
Добро пожаловать в резюме! Спасибо, что сделали свой первый вопрос таким ясным и хорошо написанным.
Серебряная
Я не совсем понял ваш набор данных. Переменные (атрибуты) есть count_red, count_blueа count_greenданные являются счетчиками. Правильно? Какие строки тогда - предметы? И вы собираетесь кластеризовать предметы?
ttnphns
Строки обычно представляют группы агрегированных покупок. Вы можете думать о них как о клиентах, которые купили несколько предметов. Я обновил свой вопрос образцом набора данных, чтобы сделать это более понятным.
pederpansen
Вы хотите объединить «клиентов»?
ttnphns
Да. Я намерен также сгруппировать покупки по временным интервалам и, следовательно, кластеризовать временные интервалы, но пока: клиенты.
pederpansen

Ответы:

7

@ttnphns дал хороший ответ.

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

С другой стороны, ваша основная проблема, по-видимому, в том, что у вас много нулей для зеленых продуктов, и вам особенно интересно, можете ли вы преобразовать только зеленые значения, чтобы сделать их более похожими на остальные. Но поскольку это композиционные данные, вы не можете думать об одном наборе отсчетов независимо от остальных. Более того, похоже, что вас действительно интересует вероятность покупок разноцветных товаров, но поскольку многие из них не приобрели никаких зеленых, вы беспокоитесь, что не можете оценить эти вероятности. Одним из способов решения этой проблемы является использование несколько байесовского подхода, в котором мы подталкиваем предполагаемые пропорции клиентов к средней пропорции, причем величина сдвига зависит от того, насколько далеко они находятся от среднего значения, и сколько данных вам нужно для оценки их истинного вероятности.

Ниже я использую ваш пример набора данных, чтобы проиллюстрировать (на 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 
Gung - Восстановить Монику
источник
+1, потому что вы поняли, что это композиционные данные, но почему бы вам не просто использовать стандартные методы преобразования для композитов. данные вместо этой странной идеи "среднего скорректированного количества"? Мне кажется, ad-hoc, есть ли конкретная ссылка на это или что-то подобное? Почему это лучше, чем простое центрированное преобразование логарифмического соотношения, а затем кластеризация первой компьютерной оценки преобразованных данных? (это было бы то, что любой разумный рецензент приложения анализа данных.)
usεr11852
Спасибо, @ usεr11852. Количество> 2, но конечно, варианты являются многочленами. Это (1 форма эмпирического) байесовского анализа с предварительным Дирихле (сопряженным). Я уверен, что возможны другие варианты. Однако я не сразу вижу, как будут работать коэффициенты с 0.
gung - Восстановить Монику
2
Спасибо за ссылку. Если у вас есть одно ненулевое измерение компонента, вы можете использовать его для аддитивного преобразования логарифмического отношения (исключая очевидную идею вменения; см. Комментарии здесь ). CLR будет отключен, потому что он использует среднее геометрическое. Была проведена работа над «завышенными данными о составе»; смотрите, например, здесь , здесь и здесь .
usεr11852
1
Похоже, вы знаете намного больше об этой теме, чем я, @ usεr11852. Мой ответ на самом деле был просто попыткой сделать эти факты о природе ситуации явными / поднять проблему и предоставить предварительное предложение. Почему бы не внести свой (лучше информированный) ответ?
gung - Восстановить Монику
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и c1и вычислим статистику хи-квадрат для их 2x3таблицы частот. Возьмите квадратный корень из него (как вы берете его, когда вычисляете обычное евклидово расстояние). Это твое расстояние. Если расстояние близко к 0, оба клиента похожи.

Это может беспокоить вас , что суммы в строках таблицы различаются , и поэтому влияет на хи-квадрат расстояния , если сравнить c0с c1против c0с c2. Затем вычислите (корень) расстояния по фи-квадрату : 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

Таким образом, расстояние между любыми двумя рядами данных является (кв. Корень) на хи-квадрат или PHI-квадрат статистики из 2 x pтаблицы частот ( pэто число столбцов в данных). Если какой-либо столбец (столбцы) в текущей 2 x pтаблице является полным нулем, обрежьте этот столбец и вычислите расстояние на основе оставшихся ненулевых столбцов (это нормально, и именно так, например, SPSS делает, когда вычисляет расстояние). Расстояние хи-квадрат на самом деле является взвешенным евклидовым расстоянием.

ttnphns
источник
Спасибо за этот сложный ответ. Я признателен, что вы дали совет по чему-то, что не было моим первоначальным вопросом: является ли K-средство (с неявным евклидовым расстоянием) правильным выбором для этого варианта использования? Я подозревал, что это не так, и вы это подтвердили. Тем не менее, я до сих пор не понимаю, почему . Не могли бы вы объяснить 1) почему расстояние хи-квадрат (или фи-квадрат) является хорошим выбором для данных подсчета? 2) возвращаясь к моему первоначальному вопросу: есть ли хороший (математический / эмпирический) аргумент, почему все переменные должны обрабатываться одинаково, кроме «они принадлежат друг другу»?
pederpansen
Покупатель выбирает один из трех цветов при совершении одной покупки: три цвета не являются концептуально независимыми «переменными». Плюс ваши данные считаются. Мне сразу стало ясно, что мера на основе хи-квадрат должна быть оптимальной. Что касается вашего последнего пункта - я мог бы спросить вас назад: почему к ним следует относиться по-разному? А дал вам решение сделать кластеризацию. Есть ли в этом что-то, что вам не нравится или что вызывает у вас сомнения?
ttnphns
2
Я также не думаю, что k-means (минимизация дисперсии!) - это путь: k-means использует средства . Ваши данные являются целыми числами и имеют много нулей. Центры кластера не будут целыми числами и будут иметь несколько нулей. Они совершенно не похожи на ваши данные, как они могут быть репрезентативными? Итог: не боритесь, чтобы преобразовать ваши данные, чтобы соответствовать k-средних. Поймите проблему и приспособьте алгоритмы к вашей проблеме, а не иначе. Если вы подходите ваши данные проблемы к-значит, он все еще может быть неправильный проблема ...
прекращал - Anony-Мусс
1
Когда вы стандартизируете свои переменные для выравнивания их отклонений, это примерно эквивалентно выравниванию итогов в столбцах таблицы данных. Когда вы изменяете перекос, это примерно эквивалентно увеличению большего, но не меньшего количества в вашей таблице. Вы можете сделать это (и даже после этого вы можете вычислить chi или phi, как я предложил), но имейте в виду, что вы исказили исходные данные. Было ли это оправданным, вы раскрыли и не скрыли ценную информацию? Было ли это ненужным мучением данных? В конце концов, вы единственный, кто решает эти размышления.
ttnphns
2
Легко разрушить фундаментальные свойства путем ненадлежащей нормализации. Например, если ваши данные суммируют до 1 в каждой строке, нормализация каждого столбца уничтожит это свойство. На таких данных вы должны рассмотреть, например, меры дивергенции (расстояния для распределений). При подсчете данных, установите меры пересечения, такие как Jaccard, может быть более информативным; но им нужны двоичные векторы. и т.д.
ВЫЙТИ - Anony-Mousse