Что показывает диаграмма рассеяния
Диаграмма рассеяния отображает связь между двумя числовыми переменными: каждое наблюдение становится точкой, позиция которой задаётся первым значением по горизонтальной оси и вторым по вертикальной. Если переменные движутся вместе, точки образуют узор; если нет — вы получаете бесформенное облако. Это стандартный первый взгляд перед подгонкой любой модели, и 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— и облако пойдёт вниз: тяжелее значит прожорливее. - Сила. Насколько плотно точки льнут к единому пути? Полоса толщиной с карандаш — сильная связь; рыхлые брызги — слабая. Это облако умеренно плотное.
- Форма и неожиданности. Путь прямой или изогнутый? Есть ли кластеры или точки, далёкие от всего остального? В
mtcarsMaserati 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() считают вторым.