Графік залежності двох порядкових змінних


46

Що є відповідним графіком для ілюстрації зв’язку між двома порядковими змінними?

Я можу придумати кілька варіантів:

  1. Графік розсіювання з доданим випадковим тремтінням, щоб зупиняти точки, приховуючи один одного. Мабуть, стандартна графіка - Minitab називає це "індивідуальним графіком значень". На мою думку, це може ввести в оману, оскільки візуально заохочує своєрідну лінійну інтерполяцію між порядковими рівнями, як би дані були з інтервальної шкали.
  2. Діаграма розсіювання адаптована таким чином, що розмір (площа) точки представляє частоту цієї комбінації рівнів, а не малювання однієї точки для кожної одиниці вибірки. Я періодично бачив такі сюжети на практиці. Їх важко читати, але точки лежать на регулярно розташованій решітці, яка дещо переборює критику розрізненого розсіяного сюжету, що він візуально "інтервалізує" дані.
  3. Особливо, якщо одна із змінних трактується як залежна, графік вікна, згрупований за рівнями незалежної змінної. Ймовірно, це виглядатиме жахливо, якщо кількість рівнів залежної змінної не є достатньо високою (дуже "плоскою" з відсутніми вусами або ще гіршими згортаннями квартілів, що робить візуальну ідентифікацію медіани неможливою), але, принаймні, звертає увагу на медіану та квартілі, які є відповідна описова статистика для порядкової змінної.
  4. Таблиця значень або порожня сітка комірок з тепловою картою для позначення частоти. Візуально відрізняється, але концептуально схожий на графік розсіювання з точковою площею, що показує частоту.

Чи є інші ідеї чи думки щодо того, які сюжети є кращими? Чи є сфери досліджень, в яких певні порядкові та порядкові сюжети вважаються стандартними? (Здається, я пам'ятаю, що частотна теплова карта є широко поширеною в геноміці, але підозрюю, що це частіше для номіналу проти номіналу.) Пропозиції щодо хорошої стандартної посилання також будуть дуже вітаються, я здогадуюсь про щось із Agresti.

Якщо хтось хоче проілюструвати сюжет, наступним є код 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

Шпинеплот (мозаїчний сюжет) добре працює для наведених тут прикладів даних, але їх важко прочитати чи інтерпретувати, якщо деякі комбінації категорій рідкісні або не існують. Звичайно, розумно і очікувано, що низька частота представлена ​​невеликою плиткою, а нуль взагалі жодною плиткою, але психологічні труднощі можуть залишатися. Також природно, що люди, які люблять спінеплоти, вибирають приклади, які добре працюють для їхніх робіт чи презентацій, але я часто наводив приклади, які були занадто безладними, щоб використовувати їх на публіці. І навпаки, спінеплот добре використовує наявний простір.

Деякі реалізації передбачають інтерактивну графіку, щоб користувач міг допитати кожну плитку, щоб дізнатися більше про неї.

Альтернативою, яка також може працювати досить добре, є двостороння смугова діаграма (існує багато інших імен).

Дивіться, наприклад, 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

Ось приклад того, як виглядатиме спінеплот даних. Я зробив це в Stata досить швидко, але є реалізація R . Я думаю, що в R це повинно бути просто:

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

Спінеплот насправді здається за замовчуванням, якщо ви даєте категоричні змінні R:

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

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

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


1
Я змінив це навколо.
Мастеров Димитрій Вікторович

1
Цитуючи Ніка Кокса (автора спінеплота штата): Обмеження на дві змінні є більш очевидним, ніж реальним. Складові змінні можуть бути створені шляхом перехресної комбінації двох або більше категоричних змінних .... Змінна відповіді зазвичай краще відображається на осі y. Якщо одна змінна є двійковою, часто краще побудувати її на осі y. Природно, що між цими пропозиціями може виникнути деяка напруженість.
Мастеров Дмитро Васильович

3
Я згоден з вищесказаним. Але схема colo [u] r за замовчуванням для порядкових змінних досить хитра. Кілька хороших альтернативних варіантів - це різні відтінки червоного та / або синього, або ж просто вибір.
Нік Кокс

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) спроба використовувати квазі випадкову послідовність, щоб зменшити частоту появи очевидного малюнка в полях. Хоча моя спроба дещо допомогла, ви можете помітити, що в клітинках з меншою кількістю точок все ще є підряди з більш-менш співвіднесеним виглядом (наприклад, поле у ​​верхньому рядку, другий стовпець). Щоб уникнути цього, квазі-випадкова послідовність може бути ініціалізована для кожного під-вікна. (Альтернативою може бути вибірка з латинської гіперкуби.) Після того, як це було розібрано, це можна було б вставити у функцію, яка працює точно як тремтіння.

квазі-випадковий тремтіння та більші ящики

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, аналогічне поняття в географії - це точки густини. Географи знайшли певні докази того, що регулярні візерунки або візерунки, які заповнюють певну кількість пробілів (настільки віддалені від випадкових, ніж випадкові), як правило, дають точніші уявлення серед спостерігачів.
Andy W

IMO, це чудова ідея, але відстань між панелями настільки велика в цьому прикладі, що робить візуалізацію будь-якої тенденції дуже складною. Вилікувати гірше, ніж хвороба (але зробити панелі потрібно набагато ближче один до одного).
Енді Ш

1
Квазі випадкове тремтіння @silverfish було б можливим рішенням для цього. Ваша турбота - це я, яку я мав сам.
Glen_b

1
Дуже хороша! ІМО - це кращий варіант, ніж спінеплот у цьому випадку (сюжетні або мозаїчні сюжети краще оцінювати умовні розподіли для будь-якої пари категорій - цей урізаний точковий сюжет простіше оцінити тенденції - скориставшись порядковим характером даних та припустивши, що деякі тип монотонного відношення).
Andy 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

Гранітна смуга в Р. Він дуже чітко показує розподіл "часто" на кожному рівні "важливості". Але це не працювало б так добре, якби максимальна кількість різнилася між рівнями "важливості"; досить просто встановити 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.