Метод кластеризации K-средних - PullRequest
0 голосов
/ 21 февраля 2019

Описание данных Я пытаюсь создать в R подходящее графическое отображение средних значений кластера.

Как я могу разместить атрибуты на x-axis и трактовать means для каждого кластера как траектории над предметами?

Все данные непрерывны.

1 Ответ

0 голосов
/ 22 февраля 2019

А как насчет следующего подхода: поскольку ваши переменные имеют одинаковую шкалу измерения (например, шкалу Лайкерта), вы можете показать распределение каждой переменной в каждом кластере (например, с помощью блокпостов) и визуально сравнить их распределение, используя одинаковые пределы осина каждом кластере.

Это можно сделать, поместив ваши данные в подходящий формат и используя пакет ggplot2 для создания графика.Это показано ниже.

Шаг 1. Создайте смоделированные данные для имитации имеющихся у вас числовых данных

Сгенерированные данные содержат четыре неотрицательные целочисленные переменные и кластерную переменную с 3 кластерами.

library(ggplot2)

set.seed(1717)    # make the simulated data repeatable
N = 100
nclusters = 3
cluster = as.numeric( cut(rnorm(N), breaks=nclusters, label=seq_len(nclusters)) )
df = data.frame(cluster=cluster,
                x1=floor(cluster + runif(N)*5),
                x2=floor(runif(N)*5),
                x3=floor((nclusters-cluster) + runif(N)*5),
                x4=floor(cluster + runif(N)*5))
df$cluster = factor(df$cluster)  # define cluster as factor to ease plotting code below
tail(df)
table(df$cluster)

, чей вывод:

    cluster x1 x2 x3 x4
95        2  5  2  5  2
96        3  5  4  0  3
97        3  3  3  1  7
98        2  5  4  3  3
99        3  6  1  1  7
100       3  5  1  2  5

 1  2  3 
15 64 21 

, т. Е. Из 100 смоделированных случаев данные содержат 15 случаев в кластере 1, 64 случая в кластере 2 и 21 случай в кластере 3.

Шаг 2. Подготовьте данные для построения

Здесь мы используем reshape() из пакета stats для транспонирования набора данных из широких в длинные так, чтобы четыре числовые переменные (x1, x2, x3, x4) помещаются в один единственный столбец , подходящий для генерации блокпоста для каждой из четырех переменных, которые затем группируются по кластерной переменной.

vars2transpose = c("x1", "x2","x3", "x4")
df.long = reshape(df, direction="long", idvar="id",
                  varying=list(vars2transpose),
                  timevar="var", times=vars2transpose, v.names="value")
head(df.long)
table(df.long$cluster)

с выходным значением:

     cluster var value id
1.x1       1  x1     5  1
2.x1       1  x1     3  2
3.x1       3  x1     5  3
4.x1       1  x1     1  4
5.x1       2  x1     3  5
6.x1       1  x1     2  6

  1   2   3 
 60 256  84 

Обратите внимание, что число наблюдений в каждом кластере увеличилось в 4 раза (т.е. число числовых переменных), поскольку данные теперь находятся в транспонированном длинном формате.

Шаг 3:Создайте блок-графики переменной по кластеру с помощью линейных средств

Мы строим горизонтальные блок-графики для каждой переменной x1, x2, x3, x4, которые показывают их распределение в каждом кластере, и отмечаемсредние значения с подключенными красными крестиками (траектории, по которым вы идете).

gg <- ggplot(df.long, aes(x=var, y=value))
gg + facet_grid(cluster ~ ., labeller=label_both) +
     geom_boxplot(aes(fill=cluster)) +
     stat_summary(fun.y="mean", geom="point", color="red", pch="x", size=3) +
     stat_summary(fun.y="mean", geom="line", color="red", aes(group=1)) +
     coord_flip()  # swap the x and y axis to make boxplots horizontal instead of vertical

, которая генерирует следующий график.variable distribution by cluster

График может содержать множество переменных, которые у вас есть, поэтому вы можете:

  • либо показывать вертикальные прямоугольники, удаляя последниеcoord_flip() line
  • или удалите все графические поля и просто покажите подключенные красные крестики, исключив линию geom_boxplot().

И если вы хотите сравнить каждую переменную рядомсреди различных кластеров можно поменять местами переменные группировки и оси x следующим образом:

gg <- ggplot(df.long, aes(x=cluster, y=value))
gg + facet_grid(var ~ ., labeller=label_both) +
  geom_boxplot(aes(group=cluster, fill=cluster)) +
  stat_summary(fun.y="mean", geom="point", color="red", pch="x", size=3) +
  stat_summary(fun.y="mean", geom="line", color="red", aes(group=1)) +
  coord_flip()  # swap the x and y axis to make boxplots horizontal instead of vertical

variable distribution side by side

...