Anscombe’s quartet
Квартет Энскомба (Anscombe’s quartet)
Квартет Энскомба представляет собой 4 набора данных с одинаковыми описательными статистиками (среднее, дисперсия, коэффициент корреляции), но с очень разными распределениями данных. Каждый набор содержит 11 значений (x, y). Francis Anscombe предложил эти наборы данных в 1973 году [1] в качестве иллюстрации важности полагаться не только на описательные статистики, но и визуализацию данных.
Этот набор данных встроен в R (вызвать можно просто набрав anscombe в консоли).
anscombe x1 x2 x3 x4 y1 y2 y3 y4
1 10 10 10 8 8.04 9.14 7.46 6.58
2 8 8 8 8 6.95 8.14 6.77 5.76
3 13 13 13 8 7.58 8.74 12.74 7.71
4 9 9 9 8 8.81 8.77 7.11 8.84
5 11 11 11 8 8.33 9.26 7.81 8.47
6 14 14 14 8 9.96 8.10 8.84 7.04
7 6 6 6 8 7.24 6.13 6.08 5.25
8 4 4 4 19 4.26 3.10 5.39 12.50
9 12 12 12 8 10.84 9.13 8.15 5.56
10 7 7 7 8 4.82 7.26 6.42 7.91
11 5 5 5 8 5.68 4.74 5.73 6.89
Давайте попробуем посчитать описательные статистики самостоятельно.
# посчитаем среднее
apply(anscombe, 2, mean) x1 x2 x3 x4 y1 y2 y3 y4
9.000000 9.000000 9.000000 9.000000 7.500909 7.500909 7.500000 7.500909
# дисперсию
apply(anscombe, 2, var) x1 x2 x3 x4 y1 y2 y3 y4
11.000000 11.000000 11.000000 11.000000 4.127269 4.127629 4.122620 4.123249
# коэффициент корреляции, привожу два варианта как посчитать, интересно, какой кажется проще
map2_dbl(anscombe %>% select(x1:x4), anscombe %>% select(y1:y4), ~cor(.x, .y)) x1 x2 x3 x4
0.8164205 0.8162365 0.8162867 0.8165214
map2_dbl(anscombe[1:4], anscombe[5:8], ~cor(.x, .y)) x1 x2 x3 x4
0.8164205 0.8162365 0.8162867 0.8165214
# еще простой способ отразить большинство описательных статистик - просто вызвать функцию summary
summary(anscombe) x1 x2 x3 x4 y1
Min. : 4.0 Min. : 4.0 Min. : 4.0 Min. : 8 Min. : 4.260
1st Qu.: 6.5 1st Qu.: 6.5 1st Qu.: 6.5 1st Qu.: 8 1st Qu.: 6.315
Median : 9.0 Median : 9.0 Median : 9.0 Median : 8 Median : 7.580
Mean : 9.0 Mean : 9.0 Mean : 9.0 Mean : 9 Mean : 7.501
3rd Qu.:11.5 3rd Qu.:11.5 3rd Qu.:11.5 3rd Qu.: 8 3rd Qu.: 8.570
Max. :14.0 Max. :14.0 Max. :14.0 Max. :19 Max. :10.840
y2 y3 y4
Min. :3.100 Min. : 5.39 Min. : 5.250
1st Qu.:6.695 1st Qu.: 6.25 1st Qu.: 6.170
Median :8.140 Median : 7.11 Median : 7.040
Mean :7.501 Mean : 7.50 Mean : 7.501
3rd Qu.:8.950 3rd Qu.: 7.98 3rd Qu.: 8.190
Max. :9.260 Max. :12.74 Max. :12.500
Можно увидеть, что описательные статистики совпадают. Что насчет распределения данных?
Построим графики распределения значений
Show the code
# отрисовываем графики по очереди
p1 <- ggplot(anscombe, aes(x1,y1))+
geom_point(size = 3.5, fill = 'darkorange', color= 'orangered',
alpha = 0.8, shape = 21)+
labs(
title = "Dataset 1" ) +
geom_smooth(se = FALSE, method = "lm", formula = "y ~ x", size = 0.8, alpha = 0.9)+
theme_bw()
p2 <- ggplot(anscombe, aes(x2,y2))+
geom_point(size = 3.5, fill = 'darkorange', color= 'orangered',
alpha = 0.8, shape = 21)+
labs(title = "Dataset 2" ) +
geom_smooth(se = FALSE, method = "lm", formula = "y ~ x",
size = 0.8, alpha = 0.9)+
theme_bw()
p3 <- ggplot(anscombe, aes(x3,y3))+
geom_point(size = 3.5, fill = 'darkorange', color= 'orangered',
alpha = 0.8, shape = 21)+
labs(title = "Dataset 3" ) +
geom_smooth(se = FALSE, method = "lm", formula = "y ~ x",
size = 0.8, alpha = 0.9)+
theme_bw()
p4 <- ggplot(anscombe, aes(x4,y4))+
geom_point(size = 3.5, fill = 'darkorange', color= 'orangered',
alpha = 0.8, shape = 21)+
labs(title = "Dataset 4" ) +
geom_smooth(se = FALSE, method = "lm", formula = "y ~ x",
size = 0.8, alpha = 0.9)+
theme_bw()
# объединяем их в один плот с помощью библиотеки `patchwork`
(p1 | p2) / (p3 | p4)Итак, как и ожидалось, распределения данных оказались совершенно разными. Подчеркну еще раз важность визуализации данных перед началом анализа. Не стоит опираться только на средние, медианы, дисперсию, поскольку эта информация должна дополняться визуальным представлением данных, даже хотя бы для себя.
Еще вот такой пример обманчивых описательных статистик:
Кроме того, рекомендую строить диаграммы рассеяния (scatter plot) как в коде, приведенном выше, а не опираться только на боксплоты (boxplot), к примеру. Боксплоты сокращают информацию о данных, хотя и являются стандартом на конференциях и в публикациях. Про это можно почитать здесь. Думаю, для публикации неплохим вариантом могут быть violin plots или боксплоты с полупрозрачными точками, отрисованные с помощью geom_jitter. Правда, это лучше сработает, если точек не больше ~30, на мой взгляд, иначе график будет сильно рябить.
О корректной, не вводящей в заблуждение читателя визуализации данных написано уже немало статей и книг, пока что приведу несколько ссылок для самостоятельного ознакомления:
https://www.youtube.com/watch?v=4MfUCX_KpdE лекция Дженни Брайан (Jenny Bryan) о предобработке данных перед построением графиков
https://clauswilke.com/dataviz/ книга по визуализации данных, доступна онлайн
https://socviz.co/index.html еще одна книга по визуализации данных, доступна онлайн
https://www.toptal.com/designers/ux/data-visualization-mistakes статья про самые распространенные ошибки при построении графиков
https://colorbrewer2.org/#type=sequential&scheme=YlGnBu&n=3 сайт с хорошими сочетаниями цветов для отрисовки графиков
Список источников
- Anscombe, F. J. (1973). “Graphs in Statistical Analysis”. American Statistician. 27 (1): 17–21. doi:10.1080/00031305.1973.10478966
- https://en.wikipedia.org/wiki/Anscombe%27s_quartet
Подписывайтесь на телеграм-канал, будет много интересного