Anscombe’s quartet

statistics
Author

Elena U

Published

October 19, 2022

Квартет Энскомба (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()
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
Show the code
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, на мой взгляд, иначе график будет сильно рябить.

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

  • Лекция Дженни Брайан (Jenny Bryan) о предобработке данных перед построением графиков

  • Книга по визуализации данных, доступна онлайн

  • Еще одна книга по визуализации данных, доступна онлайн

  • Статья про самые распространенные ошибки при построении графиков

  • Сайт colorbrewer с хорошими сочетаниями цветов для отрисовки графиков

Список источников

  1. Anscombe, F. J. (1973). “Graphs in Statistical Analysis”. American Statistician. 27 (1): 17–21. doi:10.1080/00031305.1973.10478966
  2. https://en.wikipedia.org/wiki/Anscombe%27s_quartet

Подписывайтесь на телеграм-канал, будет много интересного