Основная проблема
Вот моя основная проблема: я пытаюсь кластеризовать набор данных, содержащий некоторые очень искаженные переменные со счетчиками. Переменные содержат много нулей и поэтому не очень информативны для моей процедуры кластеризации, которая, вероятно, будет алгоритмом 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
данные являются счетчиками. Правильно? Какие строки тогда - предметы? И вы собираетесь кластеризовать предметы?