В одном из предыдущих постов мы уже писали о центральном понятии в статистике — p-уровне значимости. И пока в научной среде не утихают споры об интерпретации p-value, значительная часть исследований проводится именно с использованием p-value для определения значимости полученных в исследовании различий. Сегодня же мы поговорим о самом творческом этапе обработки данных — как же значимые различия визуализировать.


Визуализация результатов — неотъемлемая часть проведенного исследования, например, публикация статьи или выступление с докладом и т.д. При этом корректное изображение полученных различий — вопрос не только эстетический (хотя, разумеется, эффектная визуализация как минимум привлечет внимание слушателей!), но и сугубо статистический. Мне всегда нравился подход, согласно которому график должен содержать в себе исчерпывающий отчет о проделанной работе: какие группы сравнивали, по какой переменной, были ли обнаружены статистически значимые различия и т.д.

Сравнение средних значений в R


Давайте остановимся на одном из самых популярных типов графиков — сравнение средних значений — и выясним, как их можно строить в R буквально в несколько строчек кода. Воспользуемся встроенными в R данными mtcars, предоставляющими информацию о различных технических характеристиках 32 автомобилей. Сравним средние значения расхода топлива у машин с автоматической и ручной коробкой передач.

mtcars$am  <- factor(mtcars$am, labels = c("Auto", "Manual")) # сделаем тип коробки передач фактором
t.test(mpg ~ am, mtcars)

Результаты t — теста:
t = -3.7671, df = 18.332, p-value = 0.001374
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -11.280194  -3.209684
sample estimates:
mean in group 0 mean in group 1 
       17.14737        24.39231 

Статистически значимые различия обнаружены, осталось визуализировать результат. Начнем с графика-чемпиона в категории “как не нужно отображать сравнения средних значений”.

Что, собственно говоря, здесь не так?


Даже если смириться с тем, что средние отображены столбиками, основной недостаток такого рода графика — отсутствие на нем мер изменчивости наших данных. Глядя на такой график, абсолютно не ясно, были ли получены значимые различия. И единственный вывод, который мы можем сделать: правый столбик выше левого!

Давайте улучшим исходный вариант следующим образом: отобразим средние значения точками и добавим доверительные интервалы:

library(ggplot2)
ggplot(mtcars, aes(am, mpg))+
  stat_summary(fun.data = mean_cl_boot, geom = "errorbar", width = 0.1, size = 1)+
  stat_summary(fun.y = mean, geom = "point", size = 6, shape = 22, fill = "white")+
  theme_bw()+
  xlab("Transmission type")+
  ylab("Miles / (US) gallon")



Так гораздо лучше! Во-первых, непересекающиеся доверительные интервалы подтверждают наш вывод о статистически значимых различиях. Во-вторых, для внимательного наблюдателя данный график также предоставляет дополнительную информацию о деталях наших данных: легко заметить, что доверительный интервал для среднего значения расхода топлива в группе с ручной коробкой передач значительно шире. В нашем случае это объясняется различным значением стандартного отклонения в группах (эту информацию в принципе невозможно получить, глядя на “столбчатый” график).

Дисперсионный анализ и сравнение нескольких групп


Рассмотрим теперь более интересный вариант с применением дисперсионного анализа и сравнением нескольких групп. Воспользуемся еще одними встроенными в R данными — ToothGrowth. Данные позволяют исследовать рост зубов у морских свинок в зависимости от дозировки витамина C и типа потребляемых продуктов. Применим дисперсионный анализ:

fit  <- aov(len ~ dose * supp, ToothGrowth)

Результаты анализа:
            Df Sum Sq Mean Sq F value   Pr(>F)    
dose         1 2224.3  2224.3 133.415  < 2e-16 ***
supp         1  205.3   205.3  12.317 0.000894 ***
dose:supp    1   88.9    88.9   5.333 0.024631 *  
Residuals   56  933.6    16.7   

Мы видим, что и влияние каждого фактора в отдельности, и их взаимодействие оказались значимыми. Это определенно тот случай, когда без визуализации сделать какие-то выводы весьма затруднительно.

ggplot(ToothGrowth, aes(factor(dose), len, col = supp))+
  stat_summary(fun.data = mean_cl_boot, geom = "errorbar", width = 0.1, size = 1, position = position_dodge(0.2))+
  stat_summary(fun.y = mean, geom = "point", size = 3, shape = 22, fill = "white", position = position_dodge(0.2))+
  theme_bw()+
  xlab("Dose in milligrams")+
  ylab("Tooth lenght")+
  scale_color_discrete(name = "Supplement type", labels = c("Orange juice", "Ascorbic acid"))


Теперь легко заметить увеличение среднего значения длины зубов при увеличении дозировки (значимый фактор дозировки). При этом влияние типа продуктов сходит на нет с увеличением дозировки (значимый фактор типа продукта и взаимодействие факторов).

Таким образом, нанесение доверительных интервалов на график не только позволяет нам оценить, насколько статистически значимы полученные различия, но также даёт возможность составить представление о характере изменчивости внутри сравниваемых групп. Ниже представлена небольшая памятка о соотношении дистанции между доверительными интервалами и приблизительным значением p-value.

Почему все-таки R?


На сегодняшний день существует множество инструментов для анализа данных и визуализации результатов, некоторые из них позволяют применять довольно широкий спектр статистических методов, не имея никакого опыта программирования (например, SPSS). Также весьма распространен для анализа данных язык программирования Python.

Если вы начинаете осваивать анализ данных:


  1. R очень простой и интуитивно понятный язык программирования. Изучив азы работы в R, вы значительно упростите и ускорите решение ваших задач.
  2. Работа в R дает ценный опыт и помогает при изучении более сложных языков программирования.
  3. Разумеется визуализация! Мы рассмотрели в этой статье только самый базовый вариант графиков, но даже он смотрится в разы симпатичнее, чем визуализация в программах для анализа данных с графическим интерфейсом.

Если вы уже имеете опыт анализа данных:


  1. В R тысячи пакетов и библиотек, предоставляющих возможность применять, пожалуй, абсолютно любые статистические методы. Реализовать регрессионный анализ со случайными эффектами в R позволит специальная библиотека lme4. С помощью языка Python, например, это сделать значительно сложнее!
  2. В R множество библиотек, которые написаны непосредственно исследователями и учеными для решения весьма узкоспециализированных задач из различных научных областей. Например, bioconductor — предоставляет инструменты для анализа данных в биоинформатике. Библиотека grt поможет обрабатывать экспериментальные данные в области вычислительных моделей в когнитивной науке! Специальные библиотеки помогут обработать результаты EEG, FMRI или исследования, фиксирующего движение глаз человека при помощи айтрекера.
  3. И, в завершении, R позволяет быстро решать широчайший спектр задач в интерактивном режиме.

Онлайн-курс по R на русском языке: три недели анализа данных


Не так давно на платформе Stepic завершился онлайн-курс по введению в статистику, посвященный базовыми методами анализа данных. В нашем новом трехнедельном онлайн-курсе от Института биоинформатики слушатели познакомятся с основами программирования на языке R.

На первой неделе мы научимся манипулировать с данными и познакомимся с базовым синтаксисом языка. Вторая и третья недели курса посвящены применению основных статистических тестов и визуализации результатов. Курс на русском языке и абсолютно бесплатный для всех желающих! Записаться: Анализ данных в R

Программа курса


Неделя 1
  1. Переменные
  2. Работа с data frame
  3. Описательные статистики
  4. Описательные статистики. Графики
  5. Сохранение результатов

Неделя 2
  1. Анализ номинативных данных
  2. Сравнение двух групп
  3. Применение дисперсионного анализа
  4. Создание собственных функций

Неделя 3
  1. Корреляция и простая линейная регрессия
  2. Множественная линейная регрессия
  3. Диагностика модели
  4. Биномиальная регрессия
  5. Экспорт результатов анализа из R

До встречи на курсе!

Комментарии (9)


  1. Zveroloff
    23.06.2015 22:41
    +2

    И снова mtcars :) После изучения n статей по анализу данных в R несколько надоел этот датасет.


  1. Dreamastiy
    24.06.2015 14:49

    Понравилось, но выражу свое мнение.

    Мне кажется график «памятка о соотношении дистанции между доверительными интервалами и приблизительным значением p-value» не очень удачный пример визуализации.
    Если я правильно понял, то на верхней части графика приведена плотность вероятности самой величины, а на нижнем доверительные интервалы ее среднего значения. Верхняя часть графика практически не ассоциируется с p-value = 0,0001.

    В R тысячи пакетов и библиотек, предоставляющих возможность применять, пожалуй, абсолютно любые статистические методы. Реализовать регрессионный анализ со случайными эффектами в R позволит специальная библиотека lme4. С помощью языка Python, например, это сделать значительно сложнее!

    Хотелось бы больше конкретных примеров — в рунете с этим напряг.


    1. Anatoliy_Karpov Автор
      24.06.2015 15:46

      Привет! А что значит не ассоциируется, значимые различия не обязательно должны сопровождаться очень большой разностью между самими средними значениями.


      1. Dreamastiy
        24.06.2015 16:20

        Согласен.
        Я немного не об этом. Правильно ли я понял, что этот график сделан уже не по ToothGrowth, а по какой-то другим данным (возможно искусственным) с большим количеством измерений?

        Если так, то ширина доверительно интервала среднего значения на нижней части графика сильно зависит от количества наблюдений, при этом вид графика плотности вероятности может практически не измениться. Т.е. p-value сильно зависит от количества измерений, которое верхний график никак не отображает. И в итоге получается та же история, что и с «графиком-чемпионом».


    1. Anatoliy_Karpov Автор
      24.06.2015 16:14

      При этом в примере с p < 0.05 все-таки заметно, что выборки скорее всего из разных распределений!)


      1. Dreamastiy
        24.06.2015 16:30

        Все опять таки зависит от количества измерений.


      1. Anatoliy_Karpov Автор
        24.06.2015 16:35

        Понял Вас, да тут с вами согласен, сам по себе верхний график с плотностью распределения — скорее просто эстетический. А вот уже нижний с доверительным интервалами показывает значимость различий.