Основная проблема
Вот моя основная проблема: я пытаюсь кластеризовать набор данных, содержащий некоторые очень искаженные переменные со счетчиками. Переменные содержат много нулей и поэтому не очень информативны для моей процедуры кластеризации, которая, вероятно, будет алгоритмом 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
при использовании относительного количества.)
Если я преобразую свои переменные по-разному, это будет соответствовать разным весам трех членов в ограничении. Если моей целью является оптимальное разделение групп клиентов, нужно ли мне беспокоиться о нарушении этого ограничения? Или «цель оправдывает средства»?
count_red
,count_blue
аcount_green
данные являются счетчиками. Правильно? Какие строки тогда - предметы? И вы собираетесь кластеризовать предметы?Ответы:
@ttnphns дал хороший ответ.
Хорошая кластеризация часто связана с тщательным осмыслением ваших данных, поэтому давайте сделаем некоторые из них. На мой взгляд, наиболее фундаментальным аспектом ваших данных является то, что они являются композиционными .
С другой стороны, ваша основная проблема, по-видимому, в том, что у вас много нулей для зеленых продуктов, и вам особенно интересно, можете ли вы преобразовать только зеленые значения, чтобы сделать их более похожими на остальные. Но поскольку это композиционные данные, вы не можете думать об одном наборе отсчетов независимо от остальных. Более того, похоже, что вас действительно интересует вероятность покупок разноцветных товаров, но поскольку многие из них не приобрели никаких зеленых, вы беспокоитесь, что не можете оценить эти вероятности. Одним из способов решения этой проблемы является использование несколько байесовского подхода, в котором мы подталкиваем предполагаемые пропорции клиентов к средней пропорции, причем величина сдвига зависит от того, насколько далеко они находятся от среднего значения, и сколько данных вам нужно для оценки их истинного вероятности.
Ниже я использую ваш пример набора данных, чтобы проиллюстрировать (на R) один из подходов к вашей ситуации. Я читаю данные и преобразую их в линейные пропорции, а затем вычисляю средние пропорции по столбцам. Я добавляю средства обратно к каждому счету, чтобы получить скорректированные значения и новые линейные пропорции. Это подталкивает предполагаемую пропорцию каждого клиента к средней пропорции для каждого продукта. Если вы хотите более сильный толчок, вы можете
15*mean.props
вместо этого использовать несколько средств (например, ).Есть несколько результатов этого. Одним из них является то, что теперь у вас есть ненулевые оценки основных вероятностей покупки зеленых продуктов, даже если у клиента на самом деле нет никаких записей о покупке зеленых продуктов. Другое следствие - теперь у вас есть несколько непрерывных значений, тогда как исходные пропорции были более дискретными; то есть набор возможных оценок менее сужен, поэтому мера расстояния, такая как квадрат евклидова расстояния, может иметь больше смысла.
Мы можем визуализировать данные, чтобы увидеть, что произошло. Поскольку это композиционные данные, у нас на самом деле есть только две части информации, и мы можем нанести их на одну диаграмму рассеяния. Имея большую часть информации в красной и синей категориях, имеет смысл использовать их в качестве осей. Вы можете видеть, что скорректированные пропорции (красные цифры) немного смещены от своих исходных положений.
На данный момент у вас есть данные, и многие начинают с их стандартизации. Опять же, поскольку это композиционные данные, я бы запустил кластерный анализ без какой-либо стандартизации - эти значения уже соизмеримы, и стандартизация разрушила бы некоторую реляционную информацию. На самом деле, глядя на сюжет, я думаю, что у вас действительно есть только одно измерение информации здесь. (По крайней мере, в образце набора данных; ваш реальный набор данных вполне может отличаться.) Если, с точки зрения бизнеса, вы не считаете важным признать людей, у которых есть значительная вероятность покупки экологически чистых продуктов, как отдельную группу клиентов, я будет извлекать оценки по первому главному компоненту (который составляет 99,5% дисперсии в этом наборе данных) и просто кластеризовать его.
источник
Не имеет смысла преобразовывать переменные по отдельности, потому что они принадлежат друг другу (как вы заметили), и делать k-means, потому что данные являются счетчиками (вы могли бы, но k-means лучше делать с непрерывными атрибутами, такими как длина, например) ,
На вашем месте я бы вычислил расстояние хи-квадрат (идеально подходит для подсчета) между каждой парой клиентов на основе переменных, содержащих подсчет. Затем выполните иерархическую кластеризацию (например, метод средней связи или метод полной связи - они не вычисляют центроиды и, следовательно, не требуют евклидова расстояния) или какую-то другую кластеризацию, работающую с матрицами произвольных расстояний.
Копирование данных примера из вопроса:
Рассмотрим пару
c0
иc1
и вычислим статистику хи-квадрат для их2x3
таблицы частот. Возьмите квадратный корень из него (как вы берете его, когда вычисляете обычное евклидово расстояние). Это твое расстояние. Если расстояние близко к 0, оба клиента похожи.Это может беспокоить вас , что суммы в строках таблицы различаются , и поэтому влияет на хи-квадрат расстояния , если сравнить
c0
сc1
противc0
сc2
. Затем вычислите (корень) расстояния по фи-квадрату :Phi-sq = Chi-sq/N
гдеN
суммарный общий счет в двух строках (клиентах), рассматриваемых в настоящее время. Таким образом, это нормализованное расстояние по отношению к общему количеству.Таким образом, расстояние между любыми двумя рядами данных является (кв. Корень) на хи-квадрат или PHI-квадрат статистики из
2 x p
таблицы частот (p
это число столбцов в данных). Если какой-либо столбец (столбцы) в текущей2 x p
таблице является полным нулем, обрежьте этот столбец и вычислите расстояние на основе оставшихся ненулевых столбцов (это нормально, и именно так, например, SPSS делает, когда вычисляет расстояние). Расстояние хи-квадрат на самом деле является взвешенным евклидовым расстоянием.источник