Menu

Диаграмма рассеяния в R: plot(), линии регрессии и pairs()

Как построить диаграмму рассеяния в R — нарисовать две переменные через plot(), добавить линию регрессии через abline(lm()), сгладить через lowess() и построить матрицу pairs().

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Что показывает диаграмма рассеяния

Диаграмма рассеяния отображает связь между двумя числовыми переменными: каждое наблюдение становится точкой, позиция которой задаётся первым значением по горизонтальной оси и вторым по вертикальной. Если переменные движутся вместе, точки образуют узор; если нет — вы получаете бесформенное облако. Это стандартный первый взгляд перед подгонкой любой модели, и R рисует её той же функцией plot(), что разобрана в руководстве по plot().

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

Построение графика

wt — вес в тысячах фунтов, hp — лошадиные силы:

plot(mtcars$wt, mtcars$hp,
     main = "Horsepower vs. weight",
     xlab = "Weight (1000 lbs)",
     ylab = "Horsepower",
     pch  = 19,
     col  = "steelblue")

Картина такова: тридцать две закрашенные точки поднимаются из нижнего угла графика (лёгкие машины, около 1.5 по шкале веса, порядка 60–90 лошадиных сил) к тяжёлым машинам за 5, перешагивающим 200 лошадиных сил. Подъём безошибочный, но не аккуратный: при любом фиксированном весе точки разбросаны по приличной полосе мощности.

Оформление — обычный инструментарий базовой графики: pch = 19 для закрашенных кружков (полые по умолчанию исчезают на скриншотах), col для цвета, cex = 1.3, если точки должны быть крупнее. Чтобы раскрасить точки по третьей, категориальной переменной, индексируйте вектор цветов фактором — col = c("tomato", "steelblue", "darkgreen")[factor(mtcars$cyl)] даёт каждому числу цилиндров свой цвет.

Как читать: направление, сила, форма

Три вопроса, по порядку, каждый раз, когда вы смотрите на диаграмму рассеяния:

  • Направление. Точки поднимаются (положительная связь) или падают (отрицательная) по мере движения вдоль горизонтальной оси? Здесь они поднимаются: тяжелее значит мощнее. Постройте вместо этого mpg против wt — и облако пойдёт вниз: тяжелее значит прожорливее.
  • Сила. Насколько плотно точки льнут к единому пути? Полоса толщиной с карандаш — сильная связь; рыхлые брызги — слабая. Это облако умеренно плотное.
  • Форма и неожиданности. Путь прямой или изогнутый? Есть ли кластеры или точки, далёкие от всего остального? В mtcars Maserati Bora заметно возвышается над стаей — 335 лошадиных сил при среднем весе. Одна такая точка может ощутимо утянуть подогнанную прямую, и именно поэтому вы смотрите до того, как подгонять.

Добавление линии тренда

Диаграмма рассеяния заявляет о связи; прямая через неё резюмирует это утверждение. Подгоните линейную модель и передайте её прямо в abline():

plot(mtcars$wt, mtcars$hp,
     pch = 19, col = "steelblue",
     xlab = "Weight (1000 lbs)", ylab = "Horsepower")

abline(lm(hp ~ wt, data = mtcars), col = "tomato", lwd = 2)

lm(hp ~ wt) подгоняет прямую наименьших квадратов — формула читается как «hp объясняется через wt», с переменной вертикальной оси перед ~, — а abline() рисует её поперёк графика. Прямая поднимается примерно на 46 лошадиных сил на тысячу фунтов. Что означает эта модель и как читать её сводку — предмет статьи о линейной регрессии.

Если вы не хотите предполагать прямую линию, lowess() рисует гладкую кривую, следующую за данными, куда бы те ни шли:

lines(lowess(mtcars$wt, mtcars$hp), col = "darkgreen", lwd = 2, lty = 2)

Когда кривая lowess и прямая примерно совпадают, линейное описание справедливо. Когда кривая уходит в сторону, связь нелинейна, и прямая исказила бы её.

Проверка чисел через cor()

График даёт форму; cor() даёт силу одним числом. Этот шаг даёт чисто текстовый вывод, так что запустите его здесь:

Вес и мощность коррелируют примерно на 0.66 — умеренно плотное восходящее облако, выраженное числом. Матрица добавляет, что mpg сильно отрицательно коррелирует с обоими (около −0.87 с весом). Соблюдайте, однако, порядок операций: сначала график, потом коэффициент. Одно значение r может скрыть изгиб или быть раздуто одним выбросом — о классических способах ввести в заблуждение см. корреляцию.

Матрица диаграмм рассеяния: pairs()

Когда числовых столбцов несколько, рисовать каждую пару вручную быстро надоедает. pairs() делает это одним вызовом:

pairs(mtcars[, c("mpg", "wt", "hp")],
      pch = 19, col = "steelblue")

Результат — сетка 3 × 3: имена переменных идут по диагонали, а каждая внедиагональная панель является диаграммой рассеяния одной пары — mpg против wt, mpg против hp, wt против hp, каждая появляется дважды с переставленными осями. Это самый быстрый способ провести первичный осмотр нового набора данных: один взгляд показывает, какие пары связаны, какие связи изгибаются и где прячутся выбросы. Сначала выберите столбцы, как здесь, — после шести-семи переменных панели ужимаются за пределы читаемости.

Версия на ggplot2

В ggplot2 диаграмма рассеяния плюс подогнанная линия — это два слоя:

library(ggplot2)

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point(color = "steelblue", size = 2) +
    geom_smooth(method = "lm", color = "tomato") +
    labs(title = "Horsepower vs. weight",
         x = "Weight (1000 lbs)", y = "Horsepower")

geom_smooth(method = "lm") — это abline(lm(...)) с бонусом: затенённой доверительной полосой вокруг линии. Оставьте method незаданным — и вместо этого подгонится кривая loess, аналог lowess() в ggplot2. Базовый R выигрывает по скорости набора для быстрого взгляда; ggplot2 выигрывает в момент, когда вам нужны точки, раскрашенные по группам, с автоматической легендой.

Что вы уносите с собой

  • plot(x, y) с двумя числовыми векторами — это диаграмма рассеяния; pch = 19 и подписанные оси делают её презентабельной.
  • Читайте направление, силу и форму — и высматривайте выбросы — до каких-либо вычислений.
  • abline(lm(y ~ x, data = df)) добавляет линию регрессии; lines(lowess(x, y)) добавляет кривую, не предполагающую прямизны.
  • cor() количественно выражает то, что показывает график; график удерживает число от лукавства.
  • pairs(df[, cols]) рисует сразу все попарные диаграммы рассеяния — самый быстрый осмотр нового набора данных.

Дальше: столбчатая диаграмма — оставляем числовые пары ради сравнения количеств по категориям.

Часто задаваемые вопросы

Как построить диаграмму рассеяния в R?

Вызовите plot(x, y) с двумя числовыми векторами, например plot(mtcars$wt, mtcars$hp). Каждое наблюдение становится одной точкой. Добавьте pch = 19 для закрашенных точек и main, xlab, ylab для подписей.

Как добавить линию регрессии на диаграмму рассеяния в R?

Подгоните модель и передайте её в abline(): abline(lm(hp ~ wt, data = mtcars)) рисует линию наименьших квадратов поверх существующего графика. Обратите внимание на порядок в формуле — переменная вертикальной оси идёт перед ~.

Как нарисовать сразу много пар переменных в R?

pairs(df) рисует матрицу диаграмм рассеяния: по небольшой панели на каждую пару столбцов. Сначала сделайте выборку — pairs(mtcars[, c("mpg", "wt", "hp")]), — потому что после шести-семи столбцов панели становятся слишком мелкими.

Что диаграмма рассеяния показывает такого, чего не показывает корреляция?

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

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ