А как насчет следующего подхода: поскольку ваши переменные имеют одинаковую шкалу измерения (например, шкалу Лайкерта), вы можете показать распределение каждой переменной в каждом кластере (например, с помощью блокпостов) и визуально сравнить их распределение, используя одинаковые пределы осина каждом кластере.
Это можно сделать, поместив ваши данные в подходящий формат и используя пакет 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
, которая генерирует следующий график.
График может содержать множество переменных, которые у вас есть, поэтому вы можете:
- либо показывать вертикальные прямоугольники, удаляя последние
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