1. МИХАИЛ ДУБОВ
EMPATIKA LABS
АНАЛИЗ ДАННЫХ
В СРЕДЕ R
ОБОБЩЕНИЕ, СОПОСТАВЛЕНИЕ,
ВИЗУАЛИЗАЦИЯ ДАННЫХ
2. ИСТОРИЯ R
• R – диалект языка S.
• S был создан в 1976 г. в Bell Labs.
• 1991: система R создана статистиками Россом
Ихака и Робертом Джентельменом (университет
Окленда, Новая Зеландия).
• 2000: вышел R v1.0.0
• 2012: вышел R v2.15.1
3. АЛЬТЕРНАТИВЫ
• Дорогая лицензия
• Очень много
возможностей
• Библиотеки языка
Python
• В стадии развития
(текущая версия - 0.9)
4. ПРЕИМУЩЕСТВА R
+ R – свободный пакет.
+ Активный процесс разработки ядра, частые
релизы.
+ Сплоченное комьюнити, огромное количество
библиотек:
+ Около 4000 библиотек в CRAN.
- Ядро содержит только самую основную
функциональность, для многих часто возникающих задач
уже нужно устанавливать библиотеки.
+ Во многом чрезвычайно элегантный и
интуитивный синтаксис.
+ Код читаем ⇒ анализ данных воспроизводим!
+ Широкие возможности для работы с графикой.
5. НЕДОСТАТКИ R
- Все объекты хранятся в оперативной памяти –
невозможна работа напрямую с очень
большими данными
- Решается с помощью сторонней библиотеки Bigmemory
- Ограниченная поддержка 3D
- Неочевидные названия функций и правила
наименования переменных (примеры – позже…)
- К тому же, не самое высокое качество документации
6. R В ИНДУСТРИИ
«…there are at least 200 active R users at
Google, plus another 300+ occasional
users participating in Google's internal R
support list.»
Karl Millar, Senior Quantitative Software Engineer at Google
R используется в Google для:
• Параллельного статистического предсказывания на больших данных – для
повышения эффективности online-рекламы Google.
• Изучения эффективности поисковой рекламы в Google (так, с помощью R
было обнаружено, что поисковая реклама дает дополнительные 89% веб-
трафика).
8. ОРГАНИЗАЦИЯ РАБОТЫ С R
• Ядро R
• доступно с сайта CRAN (cran.r-project.org)
[CRAN = The Comprehensive R Archive Network]
• Сторонние библиотеки
• Библиотеки с CRAN (cran.r-project.org)
• Bioconductor project (bioconductor.org)
• Среды разработки
• R GUI (стандартная)
• R Studio (rstudio.com)
10. ТИПЫ ДАННЫХ
Типы данных Примеры значений
integer 0L, 1L
numeric 0, 1, 2.3, Inf, NaN
complex 3+4i
logical TRUE, FALSE, T, F
character "hi"
• Получение типа: class (x)
• Проверка на принадлежность к типу: is.[type] (x)
• Приведение к типу: as.[type] (x)
11. ОТСУТСТВУЮЩИЕ ЗНАЧЕНИЯ
• Зачастую не удается собрать все данные по
всем параметрам интересующих нас объектов.
• Отсутствующие (неизвестные) значения
наблюдений обозначаются в R как NA (“Not
available”).
• Проверка на NA: is.na (x)
• Избавление от NA: na.omit (data)
(в MATLAB – используются специальные функции вроде
nanmean, nanmax, nanmin)
12. БАЗОВЫЕ СТРУКТУРЫ ДАННЫХ
Структура данных Примеры
vector с(1L, 2L, 3L), 1:3, vector("integer", 3)
list list(1L, 2.3, "hi", F)
factor factor(c("Male", "Female", "Male", "Male"))
matrix matrix(1:6, nrow = 2, ncol = 3)
data.frame(
age = 18:23,
data.frame height = c(170, 171, NA, 176, 173, 180),
sex = factor(c("m", "f", "m", "m", "f", "m"))
)
• Оператор присванивания: data <- data.frame(…)
• Оператор = тоже есть (и семантически очень незначительно
отличается от <-)
13. DATA FRAME
• Объекты типа data.frame, как правило, содержат
анализируемые данные (наблюдения некоторых
переменных).
> data
data <- data.frame( age height sex
age = 18:23,
height = c(170, 171, NA, 1 18 170 m
176, 173, 180), 2 19 171 f
sex = factor(c("m", "f", "m", 3 20 NA m
"m", "f", "m"))
) 4 21 176 m
5 22 173 f
6 23 180 m
14. ОБОБЩЕНИЕ ДАННЫХ
> nrows(data)
[1] 6
> ncol(data)
[1] 3
> names(data)
[1] "age" "height" "sex"
> head(data, 3)
age height sex
1 18 170 m
2 19 171 f
3 20 NA m
15. ОБОБЩЕНИЕ ДАННЫХ
> summary(data)
age height sex
Min. :18.00 Min. :170 f:2
1st Qu.:19.25 1st Qu.:171 m:4
Median :20.50 Median :173
Mean :20.50 Mean :174
3rd Qu.:21.75 3rd Qu.:176
Max. :23.00 Max. :180
NA's :1
16. ВЫБОРКИ ДАННЫХ – СТРОКИ
> data[1,]
age height sex
1 18 170 m
> data[1:3,]
age height sex
1 18 170 m
2 19 171 f
3 20 NA m
> data[c(1,3),]
age height sex
1 18 170 m
3 20 NA m
17. ВЫБОРКИ ДАННЫХ – СТОЛБЦЫ
> data[, "height"]
[1] 170 171 NA 176 173 180
> data$height
[1] 170 171 NA 176 173 180
> mean(data$height) # !!!
[1] NA
> mean(na.omit(data$height))
[1] 174
> data$foo <- vector("integer", 6)
# new column added
22. ПРОСТЕЙШИЕ ГРАФИКИ
• plot() – 2D-график для пар точек (x; y)
• lines() – соединяет точки линиями (функция
чувствительна к NA!)
> plot(data$age, data$height, pch=19, xlab="Age", ylab="Height")
> lines(data[!is.na(data$height),]$age, na.omit(data$height),
pch=19)
23. ПРОСТЕЙШИЕ ГРАФИКИ
• Соединять точки линиями в данном примере смысла мало
(может быть несколько наблюдений с одним возрастом).
• Зато имеет смысл разбить наблюдения по полу:
> plot(data$height ~ data$age, pch=19, col=data$sex, xlab="Age",
ylab="Height") # alternative syntax
> legend(18, 179, legend=c("Male", "Female"), col=c("red",
"black"), pch=19)
26. ЛИНЕЙНАЯ РЕГРЕССИОННАЯ
МОДЕЛЬ
• lm() – для обычных линейных моделей (в т.ч. с
dummy-переменными)
• glm() – для более широкого класса моделей
(например, моделей бинарного выбора)
𝐻𝑒𝑖𝑔ℎ𝑡 𝑖 = 𝛼 + 𝛽 ∙ 𝐴𝑔𝑒 𝑖 + 𝜀 𝑖
> lm1 <- lm(height ~ age, data)
# lm1 is now a special object
> summary(lm1)
...
Сравните с MATLAB: b = regress(y, X)
# X is a n·p matrix
# b is a p·1 vector
27. ЛИНЕЙНАЯ РЕГРЕССИОННАЯ
МОДЕЛЬ
• abline() – рисует прямую по коэффициентам ее
уравнения:
> plot(data$height ~ data$age, pch=19, xlab="Age", ylab="Height")
> abline(c(lm1$coeff[1], lm1$coeff[2]), col="blue")
28. ДОБАВЛЕНИЕ DUMMY-VARIABLES
• Специально ничего делать не надо!
(data$sex имеет тип factor)
𝐻𝑒𝑖𝑔ℎ𝑡 𝑖 = 𝛽1 + 𝛽2 ∙ 𝐴𝑔𝑒 𝑖 + 𝛽3 ∙ 𝑓(𝑆𝑒𝑥 𝑖 ) + 𝜀 𝑖
> lm2 <- lm(height ~ age + sex, data)
30. ПРЕДСКАЗАНИЯ С ПОМОЩЬЮ
РЕГРЕССИЙ
data2 <- data.frame(
age = c(25L, 20L, 30L),
sex = factor(c("m", "f", "f"))
)
> data2$height.predicted <- predict(lm2, data2)
> data2
age sex height.predicted
1 25 m 182.4854
2 20 f 171.1748
3 30 f 187.6796
35. R – ФУНКЦИОНАЛЬНЫЙ ЯЗЫК
• Функции в R – “first-class objects”:
• могут храниться в переменных;
• могут передаваться в другие функции;
• в языке есть функции высшего порядка (например, lapply –
известная в других языках как map).
cm.to.foot <- function(x) { 0.0328 * x }
> data$height.foot <- lapply(data$height, cm.to.foot)
> data
age height sex height.foot
1 18 170 m 5.576
2 19 171 f 5.6088
3 20 NA m NA
4 21 176 m 5.7728
5 22 173 f 5.6744
6 23 180 m 5.904
36. R – ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ЯЗЫК
• ООП в R реализовано очень странно:
• В действительности, в языке уживаются сразу две
различные реализации ООП.
• Более распространенная из двух реализаций
ООП в R основана на:
• определении новых классов методом setClass();
• расширении уже существующих в языке generic-
функций для новых классов методом setMethod().
37. R – ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ЯЗЫК
setClass("polygon", representation(x = "numeric", y = "numeric"))
setMethod("plot", "polygon",
function(x, y, ...) {
plot(x@x, x@y, type = "n", ...)
xp <- c(x@x, x@x[1])
yp <- c(x@y, x@y[1])
lines(xp, yp)
})
> p <- new("polygon", x = c(1, 2, 3, 4),
y = c(1, 2, 3, 1))
> plot(p)
38. ИСПОЛЬЗОВАННЫЕ ИСТОЧНИКИ &
ДАЛЬНЕЙШЕЕ ЧТЕНИЕ
• Computing for data analysis (Roger
Peng, John Hopkins University)
www.youtube.com/playlist?list=PLw5h0DiJ-
9PBGsDZqUNoW61ApOvdBUYMV
• Data analysis in R (Jeff Leek, John
Hopkins University)
• MATLAB/R Reference (David Hiebeler)
[math.umaine.edu/~hiebeler/comp/
matlabR.pdf]