График отношений между двумя порядковыми переменными


46

Какой график подходит для иллюстрации взаимосвязи между двумя порядковыми переменными?

Несколько вариантов, которые я могу придумать:

  1. Разброс графиков с добавлением случайного дрожания, чтобы точки, скрывающие друг друга По-видимому, стандартная графика - Minitab называет это «графиком отдельных значений». На мой взгляд, это может вводить в заблуждение, поскольку визуально способствует некоторой линейной интерполяции между порядковыми уровнями, как если бы данные были получены из интервальной шкалы.
  2. Диаграмма рассеивания адаптирована таким образом, что размер (площадь) точки представляет частоту этой комбинации уровней, а не рисует одну точку для каждой единицы выборки. Я иногда видел такие сюжеты на практике. Их может быть трудно прочитать, но точки лежат на равномерно распределенной решетке, что несколько преодолевает критику графика разбросанного рассеяния, который визуально «разбивает» данные.
  3. В частности, если одна из переменных рассматривается как зависимая, блок-график группируется по уровням независимой переменной. Вероятно, выглядит ужасно, если число уровней зависимой переменной недостаточно велико (очень «плоско» с отсутствующими усами или, что еще хуже, сжимающимися квартилями, что делает визуальную идентификацию медианы невозможной), но, по крайней мере, привлекает внимание к медиане и квартилям, которые соответствующая описательная статистика для порядковой переменной.
  4. Таблица значений или пустая сетка ячеек с тепловой картой для указания частоты. Визуально отличается, но концептуально похож на график рассеяния с точечной областью, показывающей частоту.

Есть ли другие идеи или мысли о том, какие участки предпочтительнее? Существуют ли области исследований, в которых определенные порядковые-против-порядковые графики считаются стандартными? (Кажется, я вспоминаю частотную тепловую карту, широко распространенную в геномике, но подозреваю, что это чаще всего для номинального-против-номинального.) Предложения для хорошего эталонного эталона также были бы очень желательны, я предполагаю кое-что от Агрести.

Если кто-то захочет проиллюстрировать сюжет, используйте R-код для поддельных образцов данных.

"Насколько важно упражнение для вас?" 1 = совсем не важно, 2 = несколько неважно, 3 = ни важно, ни неважно, 4 = несколько важно, 5 = очень важно.

"Как часто вы занимаетесь бегом 10 минут или дольше?" 1 = никогда, 2 = менее одного раза в две недели, 3 = один раз в одну или две недели, 4 = два или три раза в неделю, 5 = четыре или более раз в неделю.

Если было бы естественно трактовать «часто» как зависимую переменную, а «важность» - как независимую переменную, если график различает эти две.

importance <- rep(1:5, times = c(30, 42, 75, 93, 60))
often <- c(rep(1:5, times = c(15, 07, 04, 03, 01)), #n=30, importance 1
           rep(1:5, times = c(10, 14, 12, 03, 03)), #n=42, importance 2
           rep(1:5, times = c(12, 23, 20, 13, 07)), #n=75, importance 3
           rep(1:5, times = c(16, 14, 20, 30, 13)), #n=93, importance 4
           rep(1:5, times = c(12, 06, 11, 17, 14))) #n=60, importance 5
running.df <- data.frame(importance, often)
cor.test(often, importance, method = "kendall") #positive concordance
plot(running.df) #currently useless

Связанный вопрос для непрерывных переменных я нашел полезным, может быть, полезной отправной точкой: каковы альтернативы диаграмм рассеяния при изучении взаимосвязи между двумя числовыми переменными?


1
Что насчет спайнплота?
Дмитрий Васильевич Мастеров

Также может быть актуален связанный вопрос для отображения одномерных порядковых данных по нескольким группам: Отображение порядковых данных - Средние значения, Медианы и Средние ранги
Серебряная

Ответы:


15

Spineplot (мозаичный график) работает хорошо для данных примера здесь, но может быть трудным для чтения или интерпретации, если некоторые комбинации категорий редки или не существуют. Естественно, вполне разумно и ожидаемо, что низкая частота представлена ​​маленькой плиткой, а ноль - вообще никакой, но психологическая трудность может остаться. Также естественно, что люди, которые любят спайнплоты, выбирают примеры, которые хорошо подходят для их бумаг или презентаций, но я часто приводил примеры, которые были слишком грязными, чтобы их можно было публично использовать. С другой стороны, спинной участок хорошо использует доступное пространство.

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

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

Смотрите, например, tabplotв http://www.surveydesign.com.au/tipsusergraphs.html

Для этих данных одним из возможных графиков (созданных с использованием tabplotStata, но должно быть легко в любом приличном программном обеспечении) является

введите описание изображения здесь

Формат означает, что легко связать отдельные столбцы с идентификаторами строк и столбцов и что вы можете аннотировать с частотами, пропорциями или процентами (не делайте этого, если вы думаете, что результат слишком занят, естественно).

Некоторые возможности:

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

  2. Предложение № 1 всегда должно быть превзойдено, если обратное работает лучше, то есть легче думать и интерпретировать.

  3. Процент или вероятность разбивки часто имеют смысл. График необработанных частот тоже может быть полезен. (Естественно, на этом графике отсутствуют мозаичные графики, показывающие оба вида информации одновременно.)

  4. Конечно, вы можете попробовать (гораздо более распространенные) альтернативы сгруппированных гистограмм или гистограмм с накоплением (или все еще довольно необычные сгруппированные точечные диаграммы в смысле WS Cleveland). В этом случае я не думаю, что они работают так же хорошо, но иногда они работают лучше.

  5. Некоторые могут по-разному раскрасить разные категории ответов. У меня нет возражений, и если вы захотите, вы не будете серьезно относиться к возражениям.

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


Спасибо за добавление графики. Это поднимает вопрос о том, как комбинируются графические и текстовые данные - я знаю, что некоторые люди не любят ставить числа на верхнюю часть столбцов (потому что столбцы выглядят выше, чем они есть на самом деле; это но я думаю это общеизвестное мнение).
Серебряная

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

Я не думаю, что вам нужна ссылка; это общее отношение. Я вижу другие варианты: (1) специфичные для дисплея предположения о том, что дисплей слишком занят, неопрятный и т. Д. (2) обращение к представлению о том, что числовой текст является избыточным, поскольку та же информация является неявной (или согласно некоторому явному ) в графике любым способом (3) отношение «мальчики носят синее, а девочки - розовое»: цифры - это цифры, а таблицы - это таблицы, и между ними не должно быть ничего. (3) кажется мне чистым предубеждением; (2) в принципе правильно, но тем не менее цифры могут помочь, (1) нужно продумывать пример за примером.
Ник Кокс

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

30

Вот быстрая попытка составить тепловую карту , я использовал черные ячейки, чтобы разбить ячейки, но, возможно, плитки должны быть разделены больше, как в ответе Glen_b.

Тепловая карта

library(ggplot2)
runningcounts.df <- as.data.frame(table(importance, often))
ggplot(runningcounts.df, aes(importance, often)) +
   geom_tile(aes(fill = Freq), colour = "black") +
   scale_fill_gradient(low = "white", high = "steelblue")

Вот график флуктуаций, основанный на более раннем комментарии Энди У. Как он их описывает, «они в основном представляют собой просто диаграммы рассеяния для категориальных данных, а размер точки сопоставляется с количеством наблюдений, которые попадают в этот интервал». Для справки см.

Уикхем, Хэдли и Хайке Хофманн. 2011. Земельные участки . IEEE Транзакции по визуализации и компьютерной графике (Proc. Infovis `11) . Предварительная печать PDF

график колебаний

theme_nogrid <- function (base_size = 12, base_family = "") {
  theme_bw(base_size = base_size, base_family = base_family) %+replace% 
    theme(panel.grid = element_blank())   
}

ggplot(runningcounts.df, aes(importance, often)) +
  geom_point(aes(size = Freq, color = Freq, stat = "identity", position = "identity"), shape = 15) +
  scale_size_continuous(range = c(3,15)) + 
  scale_color_gradient(low = "white", high = "black") +
  theme_nogrid()

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

18

Вот пример того, как будет выглядеть spineplot данных. Я сделал это в Stata довольно быстро, но есть реализация R . Я думаю, что в R это должно быть просто:

spineplot(factor(often)~factor(importance))

Spineplot фактически кажется по умолчанию, если вы зададите R категориальных переменных:

plot(factor(often)~factor(importance))

Дробная разбивка категорий часто показана для каждой категории важности. Сложенные столбцы нарисованы с вертикальным измерением, показывающим долю часто данной категории важности. Горизонтальное измерение показывает долю в каждой категории важности. Таким образом, области мозаичных элементов представляют частоты или, в более общем случае, итоговые значения для каждой перекрестной комбинации важности и часто.

введите описание изображения здесь


1
Я изменил это вокруг.
Дмитрий Владимирович Мастеров

1
Цитируя Ника Кокса (автора spineplot Stata): ограничение на две переменные более очевидно, чем реальное. Составные переменные могут быть созданы путем кросс-комбинации двух или более категориальных переменных .... Переменная ответа обычно лучше показана на оси у. Если одна переменная является бинарной, часто лучше отобразить ее на оси у. Естественно, между этими предложениями может быть некоторая напряженность.
Дмитрий Васильевич Мастеров

3
Я согласен с вышеизложенным. Но схема colo [u] r Stata по умолчанию довольно паршива для порядковых переменных. Несколько хороших альтернатив - это разные оттенки красного и / или синего или просто более масштабный выбор.
Ник Кокс

3
@Dimitriy Мне очень странно использовать произвольное сочетание цветов в одной и той же ситуации! Я не подразумеваю и не делаю вывод о чем-либо из или из точных цветов, какими бы количественными Но дело лишь в том, что градуированная шкала хорошо сочетается с градуированной последовательностью цветов. В раскраске тепловых карт есть некоторый произвол, да и во многих видах тематической картографии.
Ник Кокс

2
Я не вижу проблемы с градуированной цветовой схемой, пока цвета различны. Почему у кого-то возникает соблазн интерполировать? Я не вижу логики для произвольных цветов. Радужные последовательности имеют смысл в физике, но не с точки зрения того, как люди воспринимают цвета (например, желтый и красный слишком разные). У меня есть доказательства того, как многие студенты обсуждают выбор, и я бы сказал, что 80% искренне говорят: «Это намного лучше», когда они видят тонкую градуированную последовательность над радугой или фруктовым салатом. Синий через бледно-голубой через бледно-красный до красного хорошо работает. Обязательно попробуйте это на женщинах, а также на мужчинах.
Ник Кокс

13

То, как я это сделал, немного выдумка, но это можно исправить довольно легко.

Это модифицированная версия метода дрожания.

Удаление осей уменьшает искушение интерпретировать масштаб как непрерывный; Рисование рамок вокруг перемешанных комбинаций подчеркивает, что существует нечто вроде «разрыва шкалы» - что интервалы не обязательно равны

В идеале, метки 1..5 должны быть заменены названиями категорий, но я пока оставлю это для воображения; Я думаю, что это передает смысл этого.

 plot(jitter(often)~jitter(importance),data=running.df,bty="n",
    ylim=c(0.5,5.5),xlim=c(0.5,5.5),cex=0.5,pty="s",xaxt="n",yaxt="n") 
 axis(1,tick=TRUE,col=0)
 axis(2,tick=TRUE,col=0)
 rect(rep(seq(0.75,4.75,1),5),rep(seq(0.75,4.75,1),each=5),
       rep(seq(1.25,5.25,1),5),rep(seq(1.25,5.25,1),each=5),
       border=8)

искаженный порядковый номер


Возможные уточнения:

i) сделать перерывы меньше (лично я предпочитаю больше перерывов, чем это), и

ii) попытка использовать квазислучайную последовательность, чтобы уменьшить частоту видимого паттерна внутри блоков. Хотя моя попытка несколько помогла, вы можете видеть, что в ячейках с меньшим числом точек все еще есть подпоследовательности с более или менее коррелированным видом (например, поле в верхнем ряду, 2-й столбец). Чтобы избежать этого, квазислучайная последовательность может быть инициализирована для каждого субблока. (Альтернативой может быть выборка из латинского гиперкуба.) После того, как это будет отсортировано, его можно вставить в функцию, которая работает точно так же, как и джиттер.

квази-случайный джиттер и большие коробки

library("fOptions")

 hjit <- runif.halton(dim(running.df)[1],2) 
 xjit <- (hjit[,1]-.5)*0.8
 yjit <- (hjit[,2]-.5)*0.8  

 plot(I(often+yjit)~I(importance+xjit),data=running.df,bty="n",
    ylim=c(0.5,5.5),xlim=c(0.5,5.5),cex=0.5,pty="s",xaxt="n",yaxt="n") 
 axis(1,tick=TRUE,col=0)
 axis(2,tick=TRUE,col=0)
 rect(rep(seq(0.55,4.55,1),5),rep(seq(0.55,4.55,1),each=5),
       rep(seq(1.45,5.45,1),5),rep(seq(1.45,5.45,1),each=5),
       border=8)

1
Мне нравится это, для меня разделение действительно подчеркивает порядковый характер данных! К сожалению, человеческий глаз естественным образом обращается к явным закономерностям дрожания, например, к «восходящим трендам» на панелях (4,5) и (5,3). С другой стороны, «подсчет очков» кажется мне гораздо более естественным, чем оценка частоты по размеру точки. Существуют ли варианты, в которых точки расположены равномерно или сгруппированы в правильные узоры в центрах, чтобы не отвлекать «тренды джиттера»?
Серебряная рыба

1
@Silverfish, похожая концепция в географии - это карты плотности точек. Географы нашли некоторые доказательства того, что регулярные шаблоны или шаблоны, которые заполняют определенное количество пробелов (так что они расположены дальше друг от друга, чем случайные), имеют тенденцию создавать более точные представления среди наблюдателей.
Энди W

IMO, это хорошая идея, но расстояние между панелями в этом примере настолько велико, что затрудняет визуализацию любого тренда. Лечение хуже, чем болезнь (но довольно легко сделать панели намного ближе друг к другу).
Энди W

1
@silverfish квази-случайное дрожание было бы возможным решением этой проблемы. Ваша забота - это то, что у меня было.
Glen_b

1
Очень хорошо! ИМО, в данном случае это лучший вариант, чем позвоночник (графики позвоночника или мозаики лучше оценивать условные распределения для любой пары категорий - на этом графике с разбитыми точками легче оценить тренды - используя порядковый характер данных и предполагая некоторые тип монотонных отношений).
Энди W

7

Используя пакет R-реки:

  data$importance <- factor(data$importance, 
                            labels = c("not at all important",
                                       "somewhat unimportant",
                                       "neither important nor unimportant",
                                       "somewhat important",
                                       "very important"))
  data$often <- factor(data$often, 
                       labels = c("never",
                                  "less than once per fortnight",
                                  "once every one or two weeks",
                                  "two or three times per week",
                                  "four or more times per week"))

  makeRivPlot <- function(data, var1, var2, ...) {

    require(plyr)
    require(riverplot)
    require(RColorBrewer)

    names1 <- levels(data[, var1])
    names2 <- levels(data[, var2])

    var1 <- as.numeric(data[, var1])
    var2 <- as.numeric(data[, var2])

    edges <- data.frame(var1, var2 + max(var1, na.rm = T))
    edges <- count(edges)

    colnames(edges) <- c("N1", "N2", "Value")

    nodes <- data.frame(ID     = c(1:(max(var1, na.rm = T) +
                                      max(var2, na.rm = T))),
                        x      = c(rep(1, times = max(var1, na.rm = T)),
                                   rep(2, times = max(var2, na.rm = T))),
                        labels = c(names1, names2) ,
                        col    = c(brewer.pal(max(var1, na.rm = T), "Set1"),
                                   brewer.pal(max(var2, na.rm = T), "Set1")),
                        stringsAsFactors = FALSE)

    nodes$col <- paste(nodes$col, 95, sep = "")

    return(makeRiver(nodes, edges))

  }

a <- makeRivPlot(data, "importance", "often")

riverplot(a, srt = 45)

введите описание изображения здесь


1
(+1) Мне нравится идея использовать для этого параллельные координаты ! Я думаю, что было бы легче проследить пути через диаграмму и посмотреть, как «часто» ответы разлагаются, если цвета текут слева направо (схема, которая будет эффективно отображать «часто» в качестве зависимой переменной и « важность »как объясняющая переменная). В некоторых интерактивных реализациях таких графиков вы можете щелкнуть ось, чтобы покрасить эту переменную, что полезно.
Серебряная рыба

1
Для сравнения, визуализация «параллельных множеств» Роберта Косары , которая предназначена для категориальных данных, имеет цвета, проходящие через диаграмму.
Серебряная рыба

6

Другая идея, о которой я изначально не думал, была сито .

введите описание изображения здесь

Размер каждой плитки пропорционален ожидаемой частоте; маленькие квадраты внутри прямоугольников представляют реальные частоты. Следовательно, большая плотность квадратов указывает на более высокую, чем ожидалось, частоту (и закрашена синим цветом); меньшая плотность квадратов (красный) для частоты ниже ожидаемой.

Я думаю, я бы предпочел, чтобы цвет представлял собой размер, а не просто знак остатка. Это особенно верно для краевых случаев, когда ожидаемые и наблюдаемые частоты похожи, а остаток близок к нулю; дихотомическая красно-синяя схема, кажется, переоценивает небольшие отклонения.

Реализация в R:

library(vcd)
runningcounts.df <- as.data.frame(table(importance, often))
sieve(Freq ~ often + importance, data=runningcounts.df, shade= TRUE)

1
Что касается вашего предпочтения, что цвет представляет размер, а также знак, одна возможность состоит в том, чтобы сделать цвета более серыми, когда отличие от ожидаемого является относительно небольшим.
Glen_b

6

Столбчатая гистограмма в R. Она очень четко показывает распределение «часто» на каждом уровне «важности». Но это не сработало бы так хорошо, если бы максимальное количество варьировалось больше между уровнями «важности»; это достаточно просто установить scales="free_y"в ggplot ( см. здесь ), чтобы избежать большого количества пустого пространства, но форму распределения будет трудно различить на низкочастотных уровнях «важности», поскольку столбцы будут очень маленькими. Возможно, в этих ситуациях лучше использовать относительную частоту (условную вероятность) на вертикальной оси.

граненая гистограмма

Он не такой «чистый», как табулатура в Stata, с которой связывался Ник Кокс, но передает аналогичную информацию.

Код R:

library(ggplot)
running2.df <- data.frame(often = factor(often, labels = c("never", "less than once per fortnight", "once every one or two weeks", "two or three times per week", "four or more times per week")), importance = factor(importance, labels = c("not at all important", "somewhat unimportant", "neither important nor unimportant", "somewhat important", "very important")))
ggplot(running2.df, aes(often)) + geom_bar() +
  facet_wrap(~ importance, ncol = 1) +
  theme(axis.text.x=element_text(angle = -45, hjust = 0)) +
  theme(axis.title.x = element_blank())
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.