Язык R в помощь хабра-статисту

Четыре серьезных довода в пользу того, чтобы опробовать эту платформу с открытым исходным кодом для анализа данных

Вы наверняка слышали о R. Возможно, вы читали соответствующую статью Сэма Сиверта (Sam Siewert) под названием . Вы знаете, что R — это язык программирования и что он имеет определенное отношение к статистике, но подходит ли он вам?

Доводы в пользу R

R — язык, ориентированный на статистику. Его можно рассматривать в качестве конкурента для таких аналитических систем, как SAS Analytics, не говоря уже о таких более простых пакетах, как StatSoft STATISTICA или Minitab. Многие профессиональные статистики и методисты в правительственных организациях, в коммерческих компаниях и в фармацевтической отрасли решают свои задачи с помощью таких продуктов, как IBM SPSS или SAS, без написания какого-либо кода на языке R. Таким образом, в значительной степени решение об изучении и использовании R — это вопрос корпоративной культуры и профессиональных предпочтений применительно к рабочим инструментам. В своей статистической консультационной практике я использую несколько инструментов, однако большая часть того, что я делаю, сделана на R. Следующие примеры объясняют, почему дело обстоит именно таким образом.

  • R — это мощный скриптовый язык. Недавно меня попросили проанализировать результаты одного масштабного исследования. Исследователи просмотрели 1600 научных работ и закодировали их содержимое по нескольким критериям — количество критериев было действительно большим, особенно с учетом множественных вариаций и ветвлений. После переноса в электронную таблицу Microsoft® Excel® эти данные содержали более 8000 столбцов, большинство из которых были пустыми. Исследователи хотели подсчитывать общие количества по различным категориям и под разными заголовками. R является мощным скриптовым языком и поддерживает Perl-подобные регулярные выражения для обработки текста. Для обработки неупорядоченных данных требуются возможности языка программирования; продукты SAS и SPSS имеют скриптовые языки для задач, для решения которых недостаточно ниспадающего меню, однако R был создан именно как язык программирования и поэтому является более подходящим инструментом для этой цели.
  • R — лидер направления. Многие новые разработки в области статистики сначала появляются как пакеты для платформы R ("R-пакеты") и только потом приходят на коммерческие платформы. Недавно я получила данные медицинского исследования по повторным обращениям пациентов. По каждому пациенту в этих данных имелось количество элементов лечения, предложенных врачом, и количество элементов, которые реально запомнил пациент. Естественной моделью для этой ситуации является т. н. бета-биномиальное распределение . Оно известно с 1950-х годов, однако процедуры оценки, связывающие модель с интересующими нас ковариациями, появились лишь недавно. Такие данные обычно обрабатываются с помощью т.н. GEE-методов (Generalized Estimating Equations), однако эти методы являются асимптотическими и исходят из предположения, что выборка имеет большие размеры. Мне требовалась обобщенная линейная модель с бета-биномиальным распределением. Один из недавно появившихся R-пакетов осуществляет оценку согласно этой модели: пакет betabinom , автором которого является Бен Болкер (Ben Bolker). Инструмент SPSS не имеет таких возможностей.
  • Интеграция со средствами публикации документов. R органично интегрируется с системами публикации документов, что позволяет встраивать статистические результаты и графику из среды R в документы публикационного качества. Эта возможность не нужна абсолютно всем, однако если вы хотите написать книгу о своем анализе данных или просто не любите копировать свои результаты в документы текстового процессора, то самый короткий и самый элегантный маршрут состоит в использовании R и LaTeX.
  • Бесплатность Я — владелец небольшой компании, поэтому мне нравится, что R распространяется свободно. Даже для более крупного предприятия весьма неплохо, когда в случае привлечения нужного специалиста на временной основе оно способно немедленно предоставить такому специалисту рабочую станцию с передовым аналитическим программным обеспечением. При этом нет никакой необходимости волноваться о бюджете.

Что такое R и для чего он предназначен

140-символьное объяснение

R — это реализация языка S с открытым исходным кодом, представляющая собой среду программирования для анализа данных и для работы с графикой.

В качестве языка программирования R подобен многим другим языкам. Любой человек, который когда-либо писал программный код, найдет в R множество знакомых моментов. Отличительные особенности R лежат в статистической философии, которую он исповедует.

Статистическая революция: S и разведочный анализ данных

Компьютеры всегда были эффективным инструментом для вычислений — но лишь после того, как кто-то написал и отладил программу для выполнения нужного алгоритма. Однако в 1960-1970-х годах компьютеры были еще очень слабы в области отображения информации, особенно графической. Эти технические ограничения, наряду с тенденциями в статистической теории, привели к тому, что практика статистики, как и подготовка статистиков, ориентировались на построение моделей и на проверку гипотез. В этом мире исследователи предлагали гипотезы, тщательно продумывали эксперименты, настраивали модели и проводили испытания. Подобный подход реализован в программных средствах, подобных SPSS, которые базируются на электронных таблицах и управляются с помощью меню. Фактически первые версии программных продуктов SPSS и SAS Analytics состояли из подпрограмм, которые можно было вызвать из основной программы (на Fortran или на другом языке) с целью подгонки и проверки модели из имеющегося набора моделей.

В эту формализованную и перегруженную теорией среду Джон Тьюки (John Tukey) вбросил, как булыжник в стеклянную витрину, концепцию т. н. разведочного анализа данных (Exploratory Data Analysis, EDA). Сегодня трудно представить время, когда к анализу набора данных можно было приступать без использования ящичной диаграммы (box plot) для проверки на асимметрию и на выбросы или без проверки невязок линейной модели на нормальность с помощью квантильной диаграммы. Автором всех этих идей был Дж. Тьюки, и сегодня ни один вводный курс по статистике не обходится без них. Однако дело не всегда обстояло подобным образом.

Цитата из книги: Graphical Methods for Data Analysis (Графические методы анализа данных)

"В любом серьезном приложении на данные следует посмотреть несколькими способами, а затем построить несколько графиков и выполнить несколько исследований. Это позволит по результатам каждого очередного шага выбирать следующий шаг. Чтобы анализ данных был эффективным, он должен быть итеративным". — Джон Чамберс (John Chambers), см. раздел ).

EDA — это в большей степени подход, чем теория. Для успешного применения этого подхода необходимо соблюдать следующие эмпирические правила.

  • По возможности используйте графики для рассмотрения интересующих вас функций.
  • Всегда выполняйте анализ инкрементным образом. Испытайте одну модель; исходя из полученных результатов, настройте следующую модель.
  • Проверяйте допущения модели с помощью графиков. Обращайте внимание на выбросы, если они есть.
  • Используйте робастные методы с целью нейтрализации отклонений от допущений распределения.

Подход Дж. Тьюки породил волну новых графических методов и робастных оценок. Кроме того, этот подход инициировал разработку новой программной среды, ориентированной на разведочные методы.

Джон Чамберс вместе со своими коллегами из компании Bell Laboratories создал язык S в качестве платформы для статистического анализа, особенно той его разновидности, которую исповедовал Дж. Тьюки. Первая версия языка S, предназначенная для внутреннего использования в компании Bell, была разработана еще в 1976 г., однако лишь в 1988 году этот язык приобрел свою нынешнюю форму. К этому времени язык был доступен и пользователям за пределами Bell. В каждом своем аспекте язык S соответствует "новой модели" анализа данных.

  • S — это интерпретируемый язык, действующий в среде программирования. Синтаксис S во многом походит на синтаксис языка C, но без его сложностей. К примеру, S берет на себя заботу об управлении памятью и об объявлении переменных, поэтому у пользователя нет необходимости описывать и отлаживать подобные вещи. Более низкие накладные расходы на программирование позволяют быстро проводить несколько исследований с одним и тем же набором данных.
  • С самого начала язык S допускал создание высокоуровневых графических артефактов и позволял добавлять опции к любому открытому графическому окну. Этот язык позволяет с легкостью выделить интересные места, запросить их значения, добавить сглаживющие кривые к точечной диаграмме и т.д.
  • В 1992 г. в языке S была дополнительно реализована объектная ориентированность. В языке программирования объекты осуществляют структурирование данных и функций в соответствии с интуитивными представлениями пользователя. Человеческое мышление всегда является объектно-ориентированным, а статистические умозаключения – в особенности. Статистик работает с частотными таблицами, с временными рядами, с матрицами, с электронными таблицами, содержащими данные разных типов, с моделями и т.д. В каждом случае необработанные числа наделяются атрибутами и сопровождаются теми или иными ожиданиями. Например, временной ряд состоит из наблюдений и соответствующих моментов времени. Для каждого типа данных ожидаются стандартные статистические показатели и графики. В случае временных рядов можно сформировать график временного ряда и коррелограмму; для эмпирически подобранной модели можно графически изобразить приближения и остатки. Язык S позволяет создавать объекты для всех этих концепций; по мере необходимости вы сможете создавать новые классы объектов. Объекты облегчают переход от концептуализации проблемы к ее реализации в программном коде.

Язык с характером: S, S-Plus и проверка гипотез

В своем первоначальном виде язык S относился к EDA-методам Дж. Тьюки весьма серьезно – до такой степени, что на языке S было неудобно делать что-либо иное, помимо EDA. Это был язык с характером. Например, S имел ряд полезных внутренних функций, однако у него отсутствовали некоторые вполне очевидные возможности, наличия которых можно было бы ожидать у статистического программного обеспечения. Так, отсутствовала функция для выполнения t-теста для двух выборок и не поддерживалось настоящее тестирование для гипотез любого вида. Однако, несмотря на аргументацию Дж. Тьюки, тестирование гипотез зачастую бывает весьма полезным.

В 1988 г. компания из Сиэтла под названием Statistical Science приобрела лицензию на S и портировала улучшенную версию этого языка под названием S-Plus на платформу DOS, а затем и в среду Windows®. Обладая реальным представлением о том, что требуется ее клиентам, компания Statistical Science добавила в язык S-Plus функциональность классической статистики. Были добавлены функции для дисперсионного анализа (ANOVA), t -тест и другие модели. В соответствии с объектной ориентированностью языка S результат любой подобранной модели сам является объектом языка S. Вызовы соответствующей функции предоставляют приближения, остатки и p -значение при тестировании гипотезы. Объект модели может даже содержать промежуточные вычислительные шаги анализа, такие как QR-разложение матрицы плана (где Q – ортогональная матрица, а R — верхнетреугольная матрица).

Для каждой задачи имеется пакет на языке R! Сообщество сторонников открытого кода

Примерно в то же самое время, когда был выпущен язык S-Plus, Росс Айхэка (Ross Ihaka) и Роберт Джентлмен (Robert Gentleman) из Оклендского университета в Новой Зеландии решили попробовать свои силы в написании интерпретатора. В качестве своей модели они выбрали язык S. Проект конкретизировался и получил поддержку. Они дали своему проекту название R.

R — это реализация языка S с дополнительными моделями, разработанными в языке S-Plus. В некоторых случаях моделями в обоих языках занимались одни и те же люди. R — это проект с открытым исходным кодом, который доступен в соответствии с лицензией GNU. На этом фундаменте R продолжает развиваться, в значительной степени посредством добавления пакетов. R-пакет представляет собой коллекцию наборов данных, функций языка R, документации и динамически загружаемых элементов на языке C или Fortran. R-пакет может быть установлен как группа, которая будет доступна в рамках сеанса R. R-пакеты добавляют новую функциональность к языку R; посредством этих пакетов исследователи могут с легкостью обмениваться вычислительными методами со своими коллегами. Некоторые пакеты имеют ограниченную область применения, другие представляют целые области статистики, а некоторые отражают новейшие разработки. И действительно, многие новые разработки в области статистики сначала появляются как R-пакеты, и только потом реализуются в коммерческих программных продуктах.

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

Что происходит при использовании R

Прмечание: Эта статья не является обучающим руководством по R. Следующий пример – это не более чем попытка показать, как выглядит сеанс R.

Имеются двоичные дистрибутивы R для Windows, для Mac OS X и для нескольких вариантов Linux®. Кроме того, для тех, кому нравится компилировать самостоятельно, доступны и исходные коды.

В среде Windows® установщик добавляет пункт R в Меню Start (Пуск). Чтобы запустить R в среде Linux, откройте окно терминала и при появлении подсказки введите с клавиатуры букву R. Вы должны увидеть нечто похожее на .

Рисунок 1. Рабочее пространство R


Введите команду в строке приглашения, и R отреагирует соответствующим образом.

В реальной ситуации на этом этапе вы, вероятно, ввели бы данные в объект R из внешнего файла данных. R способен читать данные в различных форматах; однако в этом примере я использую набор данных michelson из пакета MASS. Этот пакет сопровождает этапную книгу Венаблса (Venables) и Рипли (Ripley) под названием Modern Applied Statistics with S-Plus (Современная прикладная статистика с использованием S-Plus) (см. раздел ). Набор данных michelson содержит результаты известных экспериментов Майкельсона–Морли по измерению скорости света.


Теперь посмотрим на данные (). Результаты показаны на .

Листинг 2. Ящичная диаграмма (box plot) на языке R
# Базовая ящичная диаграмма (boxplot) with(michelson, boxplot(Speed ~ Expt)) # Я могу добавить цвет и метки. Я также могу сохранить результаты в виде объекта. michelson.bp = with(michelson, boxplot(Speed ~ Expt, xlab="Experiment", las=1, ylab="Speed of Light - 299,000 m/s", main="Michelson-Morley Experiments", col="slateblue1")) # Текущая оценка скорости света в этом масштабе составляет 734,5 # Добавление горизонтальной линии с целью выделения этого значения. abline(h=734.5, lwd=2,col="purple") #Добавление современного значения скорости света

Складывается впечатление, что Майкельсон и Морли систематически завышали оценку скорости света. Кроме того, в результатах экспериментов наблюдается некоторая неоднородность.

Рисунок 3. Представление в виде ящичной диаграммы


Если меня удовлетворяют мои исследования, я могу сохранить все свои команды в виде одной функции языка R ().

Листинг 3. Простая функция на языке R
MyExample = function(){ library(MASS) data(michelson) michelson.bw = with(michelson, boxplot(Speed ~ Expt, xlab="Experiment", las=1, ylab="Speed of Light - 299,000 m/s", main="Michelsen-Morley Experiments", col="slateblue1")) abline(h=734.5, lwd=2,col="purple") }

Этот простой пример иллюстрирует несколько важных особенностей языка R.

Нуждается ли R в мощных аппаратных средствах?

Я выполняла этот пример на нетбуке Acer под управлением Crunchbang Linux. R не требует мощного компьютера для проведения анализа малого и среднего масштаба. На протяжении 20 лет про R говорили, что это медленный язык, поскольку он является интерпретируемым, и что объем данных, которые он способен проанализировать, ограничен памятью компьютера. Все это соответствует действительности, однако для современных компьютеров это, как правило, некритично, при условии, что приложение не является действительно огромным (т.е. не относится к категории Больших данных).

R остается актуальным и в 21 веке

Разведочный подход Дж. Тьюки к анализу данных стал нормой для учебного процесса. Он преподается в учебных заведениях и применяется специалистами по статистике. Язык R поддерживает этот подход, и это одно из объяснений того, почему он до сих пор сохраняет популярность. Объектная ориентация также помогает языку R оставаться актуальным, поскольку для анализа новых источников данных требуются новые структуры данных. В настоящее время платформа InfoSphere® Streams поддерживает анализ на языке R для данных, отличных от тех, на которые ориентировался Джон Чамберс.

Язык R и платформа InfoSphere Streams

InfoSphere Streams — это вычислительная платформа и интегрированная среда разработки для анализа данных, которые с высокой скоростью поступают из тысяч источников. Содержимое этих потоков данных обычно является неструктурированным или структурированным частично. Цель анализа состоит в выявлении изменяющихся закономерностей в данных и в принятии решений непосредственно на основе быстро меняющихся событий. Язык программирования для платформы InfoSphere Streams под названием SPL организует данные посредством парадигмы, которая отражает динамичную природу данных, а также необходимость быстрого анализа и реагирования.

Мы далеко ушли от электронных таблиц и обычных плоских файлов классического статистического анализа, однако язык R способен адаптироваться. В версии 3.1 приложения на SPL способны передавать данные в R и таким образом задействовать обширную библиотеку R-пакетов. InfoSphere Streams поддерживает аналитику на R посредством создания соответствующих R-объектов для получения информации, содержащейся в кортежах SPL (базовая структура данных в языке SPL). Это позволяет передавать данные InfoSphere Streams в среду R для последующего анализа, а полученные результаты возвращать обратно в SPL.

Для каких случаев R не годится

Справедливости ради следует отметить, что некоторые вещи R делает не очень хорошо или вообще не делает. Кроме того, R не в одинаковой степени подходит каждому пользователю.

  • R не является хранилищем данных. Самый легкий способ ввода данные в R состоит в том, чтобы ввести нужные данные в каком-либо другом месте, а затем импортировать их в среду R. В свое время имели место попытки добавить к среде R интерфейсную часть в виде электронной таблицы, однако они не завоевали популярности. Отсутствие функциональности электронной таблицы не только затрудняет ввод данных, но и осложняет визуальное рассмотрение данных в R (в отличие от SPSS или Excel).
  • R осложняет решение обычных задач. К примеру, при проведении медицинских исследований первый этап обработки данных состоит в вычислении сводной статистики по всем переменным и в составлении перечня отсутствующих ответов и пропущенных данных. В SPSS этот процесс реализуется буквально тремя щелчками мыши, однако R не имеет встроенной функции для вычисления этой вполне очевидной информации и ее последующего отображения в табличной форме. Нужный код достаточно легко написать самому, однако иногда хочется, чтобы такие вещи можно было делать щелчком мыши.
  • Процесс обучения языку R является нетривиальным. Новичок может открыть управляемую с помощью меню статистическую платформу и получить результат за всего за несколько минут. Не каждый хочет становиться программистом для того, чтобы быть аналитиком, а, возможно, не каждому это и нужно.
  • R имеет открытый исходный код. Сообщество R является многочисленным, зрелым и активным; вне всякого сомнения, R входит в число наиболее успешных проектов с открытым исходным кодом. Как я уже говорила, реализация языка R имеет возраст более 20 лет, а реализация языка S — еще больше. Это проверенная концепция и испытанный продукт. Однако, как и для любого другого продукта с открытым исходным кодом, надежность зависит от прозрачности. Мы верим в программный код, поскольку мы сами способны проверять его и поскольку другие люди способны проверять его и сообщать о выявляемых при этом ошибках. Иная ситуация имеет место в корпоративном проекте, который берет на себя обязанности по тестированию и валидации своего программного продукта. При этом в случае редко используемых R-пакетов у нас нет достаточных оснований предполагать, что эти пакеты действительно обеспечивают получение корректных результатов.

Заключение

Необходимо ли вам изучать язык R? Вполне возможно, что нет; необходимо — это слишком сильное утверждение. Но является ли R ценным инструментом для анализа данных? Несомненно. Этот язык специально разработан таким образом, чтобы отражать способы мышления и работы статистиков. R закрепляет хорошие привычки и улучшает анализ. По-моему, это хороший инструмент для такой работы.

Роберт И. Кабаков “R в действии. Анализ и визуализация данных в программе R” ДМК Пресс, 2014 год, 588 стр. (4,39 мб. pdf)

R язык программирования и программная среда для статистических аналитических вычислений и визуализации. В котором представлено огромное количество методов для анализа и обработки данных. Он годится для выполнения любых задач в этой области и работает со всеми основными операционными системами, с поддержкой тысяч специализированных модулей и утилит. Эта особенность R делает его использование незаменимым инструментом для поиска и извлечения статистических данных из большого объема разнообразной информации.

Представленная книга – это учебник языка R, где дается описание более девяти десятков часто используемых пакетов, для практического применения. В руководстве приводятся характерные примеры возможностей R для статистической обработки данных. Дается описание методов обработки информационных блоков с запутанными и неполными данными и данных, распределение которых отлично от нормального и с которое трудно выявлять обычными методами обработки. Кроме статистического анализа вы сможете строить красивые и сложные диаграммы для визуального представления данных. ISBN 978-5-947060-077-1

ЧАСТЬ I. Начало работы 27

Глава 1. Знакомство с R 30
1.1. Зачем использовать R? 32
1. 2. Получение и установка R 35
1.3. Работа в R 35
1.3.1. Начало работы 36
1.3.2. Как получить помощь 39
1.3.3. Рабочее пространство 40
1.3.4. Ввод и вывод 43
1.4. Пакеты 44
1.4.1. Что такое пакеты? 44
1.4.2. Установка пакета 46
1.4.3. Загрузка пакета 46
1.4.4. Получение информации о пакете 46
1.5. Пакетная обработка 47
1.6. Использование вывода в качестве ввода – повторное использование результатов 48
1.7. Работа с большими массивами данных 49
1.8. Учимся на примере 49
1.9. Резюме 51

Глава 2. Создание набора данных 52
2.1. Что такое набор данных? 53
2.2. Структуры данных 54
2.2.1. Векторы 55
2.2.2. Матрицы 56
2.2.3. Массивы данных 58
2.2.4. Таблицы данных 59
2.2.5. Факторы 63
2.2.6. Списки 65
2.3. Ввод данных 67
2.3.1. Ввод данных с клавиатуры 68
2.3.2. Импорт данных из текстового файла с разделителями 69
2.3.3. Импорт данных из Excel 71
2.3.4. Импорт данных из XML-файлов 72
2.3.5. Извлечение данных из веб-страниц 72
2.3.6. Импорт данных из SPSS 72
2.3.7. Импорт данных из SAS 73
2.3.8. Импорт данных из Stata 73
2.3.9. Импорт данных из netCDF 74
2.3.10. Импорт данных из HDF5 74
2.3.11. Импорт данных из систем управления базами данных 75
2.3.12. Импорт данных при помощи Stat/Transfer 77
2.4. Аннотирование наборов данных 77
2.4.1. Подписи для переменных 78
2.4.2. Пояснение значений переменных 78
2.5. Полезные функции для работы с объектами 79
2.6. Резюме 80

Глава 3. Начало работы с диаграммами 81
3.1. Работа с диаграммами 82
3.2. Простой пример 84
3.3. Графические параметры 86
3.3.1. Символы и линии 87
3.3.2. Цвета 88
3.3.3. Характеристики текста 90
3.3.4. Размеры диаграммы и полей 93
3.4. Добавление текста, настройка параметров осей
и условных обозначений 95
3.4.1. Заголовки 95
3.4.2. Оси 96
3.4.3. Опорные линии 99
3.4.4. Легенда 100
3.4.5. Аннотации 102
3.5. Объединение диаграмм 105
3.5.1. Полный контроль над расположением диаграмм 110
3.9. Резюме 112

Глава 4. Основы управления данными 113
4.1. Рабочий пример 113
4.2. Создание новых переменных 116
4.3. Перекодировка переменных 117
4.4. Переименование переменных 119
4.5. Пропущенные значения 121
4.5.1. Перекодировка значений в отсутствующие 122
4.5.2. Исключение пропущенных значений из анализа 122
4.6. Календарные даты как данные 124
4.6.1. Преобразование дат в текстовые переменные 126
4.6.2. Получение дальнейшей информации 126
4.7. Преобразования данных из одного типа в другой 127
4.8. Сортировка данных 128
4.9. Объединение наборов данных 129
4.9.1. Добавление столбцов 129
4.9.2. Добавление строк 130
4.10. Разделение наборов данных на составляющие 130
4.10.1. Выбор переменных 130
4.10.2. Исключение переменных 131
4.10.3. Выбор наблюдений 132
4.10.4. Функция subset() 133
4.10.5. Случайные выборки 134
4.11. Использование команд для преобразования таблиц данных 135
4.12. Резюме 136

Глава 5. Более сложные способы управления данными 137
5.1. Задача по управлению данными, которую нужно решить 138
5.2. Числовые и текстовые функции 139
5.2.1. Математические функции 139
5.2.2. Статистические функции 140
5.2.3. Функции распределения 143
5.2.4. Текстовые функции 148
5.2.5. Другие полезные функции 149
5.2.6. Применение функций к матрицам и таблицам данных 151
5.3. Решение нашей задачи по управлению данными 152
5.4. Управление выполнением команд 157
5.4.1. Повторение и циклы 158
5.4.2. Выполнение при условии 159
5.5. Функции, написанные пользователем 160
5.6. Агрегирование и изменение структуры данных 163
5.6.1. Транспонирование 163
5.6.2. Агрегирование данных 164
5.6.3. Пакет reshape 165
5.7. Резюме 167

ЧАСТЬ II. Базовые методы 169

Глава 6. Базовые диаграммы 171
6.1. Столбчатые диаграммы 172
6.1.1. Простые столбчатые диаграммы 172
6.1.2. Столбчатые диаграммы: составные и с группировкой 174
6.1.3. Столбчатые диаграммы для средних значений 175
6.1.4. Оптимизация столбчатых диаграмм 177
6.1.5. Спинограммы 178
6.2. Круговые диаграммы 179
6.3. Гистограммы 182
6.4. Диаграммы ядерной оценки функции плотности 185
6.5. Диаграммы размахов 188
6.5.1. Использование диаграмм размахов для сравнения групп между собой 189
6.5.2. Скрипичные диаграммы 193
6.6. Точечные диаграммы 194
6.7. Резюме 197

Глава 7. Основные методы статистической обработки данных 198
7.1. Описательные статистики 199
7.1.1. Калейдоскоп методов 200
7.1.2. Вычисление описательных статистик для групп данных 204
7.1.3. Визуализация результатов 208
7.2. Таблицы частот и таблицы сопряженности 208
7.2.1. Создание таблиц частот 209
7.2.2. Тесты на независимость 216
7.2.3. Показатели взаимосвязи 218
7.2.4. Визуализация результатов 219
7.2.5. Преобразование таблиц в неструктурированные файлы 219
7.3. Корреляции 221
7.3.1. Типы корреляций 222
7.3.2. Проверка статистической значимости корреляций 225
7.3.3. Визуализация корреляций 228
7.4. Тесты Стьюдента 228
7.4.1. Тест Стьюдента для независимых выборок 229
7.4.2. Тест Стьюдента для зависимых выборок 230
7.4.3. Когда имеется больше двух групп 231
7.5. Непараметрические тесты межгрупповых различий 231
7.5.1. Сравнение двух групп 231
7.5.2. Сравнение более двух групп 233
7.6. Визуализация групповых различий 236
7.7. Резюме 236

ЧАСТЬ III. Методы обработки данных средней сложности 237

Глава 8. Регрессия 239
8.1. Многоликая регрессия 241
8.1.1. Ситуации, в которых используется МНК-регрессия 242
8.1.2. Что вам нужно знать 244
8.2. МНК-регрессия 244
8.2.1. Подгонка регрессионных моделей при помощи команды lm() 245
8.2.2. Простая линейная регрессия 247
8.2.3. Полиномиальная регрессия 250
8.2.4. Множественная линейная регрессия 253
8.2.5. Множественная линейная регрессия со взаимодействиями 257
8.3. Диагностика регрессионных моделей 259
8.3.1. Стандартный подход 260
8.3.2. Усовершенствованный подход 264
8.3.3. Общая проверка выполнения требований, предъявляемых к линейным моделям 272
8.3.4. Мультиколлинеарность 273
8.4. Необычные наблюдения 274
8.4.1. Выбросы 275
8.4.2. Точки высокой напряженности 275
8.4.3. Влиятельные наблюдения 277
8.5. Способы корректировки 281
8.5.1. Удаление наблюдений 281
8.5.2. Преобразование переменных 281
8.5.3. Добавление или удаление переменных 284
8.5.4. Попытка применить другой подход 284
8.6. Выбор «лучшей» регрессионной модели 285
8.6.1. Сравнение моделей 285
8.6.2. Выбор переменных 286
8.7. Продолжение анализа 291
8.7.1. Кросс-валидация 292
8.7.2. Относительная важность 294
8.8. Резюме 298

Глава 9. Дисперсионный анализ 299
9.1. Ускоренный курс терминологии 300
9.2. Подгонка ANOVA-моделей 304
9.2.1. Функция aov() 304
9.2.2. Порядок членов в формуле 305
9.3. Однофакторный дисперсионный анализ 307
9.3.1. Множественные сравнения 308
9.3.2. Проверка справедливости допущений, лежащих
в основе теста 312
9.4. Однофакторный ковариационный анализ 314
9.4.1. Проверка допущений, лежащих в основе теста 316
9.4.2. Визуализация результатов 317
9.5. Двухфакторный дисперсионный анализ 318
9.6. Дисперсионный анализ для повторных измерений 323
9.7. Многомерный дисперсионный анализ 326
9.7.1. Проверка предположений, лежащих в основе теста 328
9.7.2. Устойчивый многомерный дисперсионный анализ 330
9.8. Дисперсионный анализ как регрессия 331
9.9. Резюме 333

Глава 10. Анализ мощности 335
10.1. Краткий обзор процедуры проверки гипотез 336
10.2. Проведение анализа мощности при помощи пакета pwr 339
10.2.1. Тесты Стьюдента 340
10.2.2. Дисперсионный анализ 342
10.2.3. Корреляции 343
10.2.4. Линейные модели 344
10.2.5. Сравнение пропорций 345
10.2.6. Тесты хи-квадрат 346
10.2.7. Выбор подходящего размера эффекта в незнакомых ситуациях 348
10.3. Графический анализ мощности 350
10.4. Другие пакеты 352
10.5. Резюме 354

Глава 11. Диаграммы средней сложности 356
11.1. Диаграммы рассеяния 357
11.1.1. Матрицы диаграмм рассеяния 361
11.1.2. Диаграммы рассеяния высокой плотности 367
11.1.3. Трехмерные диаграммы рассеяния 370
11.1.4. Пузырьковые диаграммы 375
11.2. Линейные графики 377
11.3. Кореллограммы 382
11.4. Мозаичные диаграммы 388
11.5. Резюме 391

Глава 12. Статистика повторных выборок и бутстреп-анализ 392
12.1. Перестановочные тесты 393
12.2. Перестановочные тесты в пакете coin 395
12.2.1. Тесты на независимость для двух и k выборок 397
12.2.2. Независимость в таблицах сопряженности 399
12.2.3. Независимость между числовыми переменными 400
12.2.4. Тесты для двух и k зависимых выборок 400
12.2.5. Дополнительная информация 401
12.3. Перестановочные тесты, реализованные в пакете lmPerm 401
12.3.1. Простая и полиномиальная регрессия 402
12.3.2. Множественная регрессия 403
12.3.3. Однофакторные дисперсионный и ковариационный анализы 404
12.3.4. Двухфакторный дисперсионный анализ 405
12.4. Дополнительные замечания о перестановочных тестах 407
12.5. Бутстреп-анализ 408
12.6. Бутстреп-анализ при помощи пакета boot 409
12.6.1. Бутстреп-анализ для одной статистики 411
12.6.2. Бутстреп-анализ для нескольких статистик 413
12.7. Резюме 416

ЧАСТЬ IV. Продвинутые методы 417

Глава 13. Обобщенные линейные модели 419
13.1. Обобщенные линейные модели и функция glm() 420
13.1.1. Функция glm() 421
13.1.2. Вспомогательные функции 423
13.1.3. Соответствие модели данным и регрессионная диагностика 424
13.2. Логистическая регрессия 425
13.2.1. Интерпретация параметров модели 428
13.2.2. Оценка влияния независимых переменных на вероятность исхода 430
13.2.3. Избыточная дисперсия 431
13.2.4. Дополнительные методы 432
13.3. Пуассоновская регрессия 433
13.3.1. Интерпретация параметров модели 436
13.3.2. Избыточная дисперсия 437
13.3.3. Дополнительные методы 439
13.4. Резюме 442

Глава 14. Главные компоненты и факторный анализ 443
14.1. Выполнение анализа главных компонент и факторного анализа в R 446
14.2. Главные компоненты 447
14.2.1. Выбор необходимого числа компонент 449
14.2.2. Выделение главных компонент 451
14.2.3. Вращение главных компонент 455
14.2.4. Вычисление значений главных компонент 456
14.3. Разведочный факторный анализ 459
14.3.1. Определение числа извлекаемых факторов 460
14.3.2. Выделение общих факторов 462
14.3.3. Вращение факторов 463
14.3.4. Значения факторов 467
14.3.5. Другие пакеты для проведения факторного анализа 468
14.4. Другие модели для латентных переменных 468
14.5. Резюме 470

Глава 15. Продвинутые методы работы с пропущенными данными 472
15.1. Этапы работы с пропущенными данными 474
15.2. Обнаружение пропущенных значений 476
15.3. Исследование структуры пропущенных данных 477
15.3.1. Представление пропущенных значений в виде таблицы 478
15.3.2. Визуальное исследование структуры пропущенных данных 479
15.3.3. Использование корреляции для исследования
пропущенных значений 482
15.4. Выявление источников пропущенных данных и эффекта от них 484
15.5. Рациональный подход 486
15.6. Анализ полных строк (построчное удаление) 487
15.7. Метод множественного восстановления пропущенных данных 489
15.8. Другие подходы к пропущенным данным 495
15.8.1. Попарное удаление 496
15.8.2. Простое (нестохастическое) восстановление данных 496
15.9. Резюме 497

Глава 16. Продвинутые графические методы 499
16.1. Четыре графические системы R 500
16.2. Пакет lattice 501
16.2.1. Условные переменные 507
16.2.2. Функции для изменения формата ячеек 509
16.2.3. Группировка переменных 512
16.2.4. Графические параметры 518
16.2.5. Расположение диаграмм на странице 519
16.3. Пакет ggplot2 520
16.4. Интерактивная графика 526
16.4.1. Взаимодействие с диаграммами: идентификация точек 527
16.4.2. Пакет playwith 527
16.4.3. Пакет latticist 529
16.4.4. Создание интерактивной графики при помощи пакета iplots 530
16.4.5. Пакет rggobi 532
16.5. Резюме 533
Послесловие: В погоне за кроликом 535

Приложение A.
Графические пользовательские интерфейсы 539

Приложение B.
Настройка начальной конфигурации программы 543

Приложение C.
Экспорт данных из R 545
C.1. Текстовый файл с разделителями 545
C.2. Таблица Excel 545
C.3. Другие статистические программы 546

Приложение D.
Сохранение результатов в пригодном для публикации качестве 547
D.1. Подготовка отчета типографского качества
при помощи пакета Sweave (R + LaTeX) 548
D.2. Объединение сил с OpenOffice при помощи пакета odfWeave 554
D.3. Комментарии 557

Приложение E.
Матричная алгебра в R 558

Приложение F.
Пакеты, упомянутые в этой книге 561

Приложение G.
Работа с большими наборами данных 570
G.1. Эффективное программирование 571
G.2. Хранение данных вне оперативной памяти 572
G.3. Аналитические пакеты для больших объемов данных 573

Приложение H.
Обновление версии R 574
Список литературы 576
Указатель пакетов и функций 581

Скачать книгу бесплатно 4,39 мб. pdf

R язык программирования. Видео

На написание данной статьи меня сподвиг следующий топик: . Дело в том, что после ознакомления с языком R я крайне искоса смотрю на любые попытки, что-то посчитать в экселе. Но надо признать, что и с R я познакомился лишь неделю назад.

Цель: Собрать средствами языка R данные с любимого HabraHabr"а и провести, собственно то, для чего и был создан язык R, а именно: статистический анализ.

Итак, прочтя этот топик вы узнаете:

  • Как можно использовать R для извлечения данных из Web ресурсов
  • Как преобразовывать данные для последующего анализа
  • Какие ресурсы крайне рекомендуются к прочтению всем желающим познакомиться с R поближе

Ожидается, что читатель достаточно самостоятелен, чтобы самому ознакомиться с основными конструкциями языка. Для этого как никак лучше подойдут ссылки в конце статьи.

Подготовка

Нам понадобятся следующие ресурсы:

После установки вы должны увидеть что-то типа этого:

В правой нижней панели на вкладке Packages вы можете найти список установленных пакетов. Нам понадобится дополнительно установить следующие:

  • Rcurl - для работы с сетью. Все кто работал с CURL сразу поймет все открывающиеся возможности.
  • XML - пакет для работы с DOM деревом XML документа. Нам понадобится функционал нахождения элементов по xpath
Жмите «Install Packages», выбирайте нужные, а затем выделите их галочкой, чтобы они загрузились в текущее окружение.

Получаем данные

Чтобы получить DOM объект документа полученного из интернета достаточно выполнить следующие строчки:
url<-"http://сайт/feed/posts/habred/page10/" cookie<-"Мои сверхсекретные печеньки" html<-getURL(url, cookie=cookie) doc<-htmlParse(html)
Обратите внимание на передаваемые cookie. Если вы захотите повторить эксперемент, то вам надо будет подставить свои cookie, которые получает ваш браузер после авторизации на сайте. Далее нам надо получить интересующие нас данные, а именно:
  • Когда запись была опубликована
  • Сколько было просмотров
  • Сколько человек занесло запись в избранные
  • Сколько было нажатий на +1 и -1 (суммарно)
  • Сколько было +1 нажатий
  • Сколько -1
  • Текущий рейтинг
  • Количество комментариев
Не в даваясь особо в подробности приведу сразу код:
published<-xpathSApply(doc, "//div[@class="published"]", xmlValue) pageviews<-xpathSApply(doc, "//div[@class="pageviews"]", xmlValue) favs<-xpathSApply(doc, "//div[@class="favs_count"]", xmlValue) scoredetailes<-xpathSApply(doc, "//span[@class="score"]", xmlGetAttr, "title") scores<-xpathSApply(doc, "//span[@class="score"]", xmlValue) comments<-xpathSApply(doc, "//span[@class="all"]", xmlValue) hrefs<-xpathSApply(doc, "//a[@class="post_title"]", xmlGetAttr, "href")
Здесь мы использовали поиск элементов и атрибутов с помощью xpath.
Далее крайне рекомендуется сформировать из полученных данных data.frame - это аналог таблиц базы данных. Можно будет делать запросы разного уровня сложности. Иногда диву даешься, как элегантно можно сделать в R ту или иную вещь.
posts<-data.frame(hrefs, published, scoredetailes, scores, pageviews, favs, comments)
После формирования data.frame необходимо будет подправить полученные данные: преобразовать строчки в числа, получить реальную дату в нормальном формате и т.д. Делаем это таким образом:

Posts$comments<-as.numeric(as.character(posts$comments)) posts$scores<-as.numeric(as.character(posts$scores)) posts$favs<-as.numeric(as.character(posts$favs)) posts$pageviews<-as.numeric(as.character(posts$pageviews)) posts$published<-sub(" декабря в ","/12/2012 ",as.character(posts$published)) posts$published<-sub(" ноября в ","/11/2012 ",posts$published) posts$published<-sub(" октября в ","/10/2012 ",posts$published) posts$published<-sub(" сентября в ","/09/2012 ",posts$published) posts$published<-sub("^ ","",posts$published) posts$publishedDate<-as.Date(posts$published, format="%d/%m/%Y %H:%M")

Так же полезно добавить дополнительные поля, которые вычисляются из уже полученных:
scoressplitted<-sapply(strsplit(as.character(posts$scoredetailes), "\\D+", perl=TRUE),unlist) if(class(scoressplitted)=="matrix" && dim(scoressplitted)==4) { scoressplitted<-t(scoressplitted) posts$actions<-as.numeric(as.character(scoressplitted[,1])) posts$plusactions<-as.numeric(as.character(scoressplitted[,2])) posts$minusactions<-as.numeric(as.character(scoressplitted[,3])) } posts$weekDay<-format(posts$publishedDate, "%A")
Здесь мы всем известные сообщения вида «Всего 35: 29 и ↓6» преобразовали в массив данных по тому, сколько вообще было произведено действий, сколько было плюсов и сколько было минусов.

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

Но внимательный читатель уже заметил, что таким образом, мы получили данные лишь для одной страницы, чтобы получить для целого ряда. Чтобы получить данные для целого списка страниц была написана следующая функция:

GetPostsForPages<-function(pages, cookie, sleep=0) { urls<-paste("http://сайт/feed/posts/habred/page", pages, "/", sep="") ret<-data.frame() for(url in urls) { ret<-rbind(ret, getPosts(url, cookie)) Sys.sleep(sleep) } return(ret) }
Здесь мы используем системную функцию Sys.sleep, чтобы не устроить случайно хабраэффект самом хабру:)
Данную функцию предлагается использовать следующим образом:
posts<-getPostsForPages(10:100, cookie,5)
Таким образом мы скачиваем все страницы с 10 по 100 с паузой в 5 секунд. Страницы до 10 нам не интересны, так как оценки там еще не видны. После нескольких минут ожидания все наши данные находятся в переменной posts. Рекомендую их тут же сохранить, чтобы каждый раз не беспокоить хабр! Делается это таким образом:
write.csv(posts, file="posts.csv")
А считываем следующим образом:
posts<-read.csv("posts.csv")

Ура! Мы научились получать статистические данные с хабра и сохранять их локально для следующего анализа!

Анализ данных

Этот раздел я оставлю недосказанным. Предлагаю читателю самому поиграться с данными и получить свои долеко идущие выводы. К примеру, попробуйте проанализировать зависимость настроения плюсующих и минусующих в зависимости от дня недели. Приведу лишь 2 интересных вывода, которые я сделал.
Пользователи хабра значительно охотнее плюсуют, чем минусуют.
Это видно по следующему графику. Заметьте, на сколько «облако» минусов равномернее и шире, чем разброс плюсов. Корреляция плюсов от количества просмотров значительно сильнее, чем для минусов. Другими словами: плюсуем не думая, а минусуем за дело!
(Прошу прощения за надписи на графиках: пока не разобрался, как выводить их правильно на русском языке)


Действительно есть несколько классов постов
Это утверждение в упомянутом посте использовалось как данность, но я хотел убедиться в этом в действительности. Для этого достаточно посчитать среднюю долю плюсов к общему количеству действий, тоже самое для минусов и разделить второе на первое. Если бы все было однородно, то множество локальных пиков на гистограмме мы не должны наблюдать, однако они там есть.



Как вы можете заметить, есть выраженные пики в районе 0.1, 0.2 и 0.25. Предлагаю читателю самому найти и «назвать» эти классы.
Хочу заметить, что R богата алгоритмами для кластеризации данных, для аппроксимации, для проверки гипотез и т.п.

Полезные ресурсы

Если вы действительно хотите погрузиться в мир R, то рекомендую следующие ссылки. Пожалуйста, поделитесь в комментариях вашими интересными блогами и сайтами на тему R. Есть кто-нибудь пишущий об R на русском?