Upload
empatika
View
589
Download
0
Embed Size (px)
Citation preview
О Б О Б Щ Е Н И Е , С О П О С Т А В Л Е Н И Е ,
В И З У А Л И З А Ц И Я Д А Н Н Ы Х
АНАЛИЗ ДАННЫХ В СРЕДЕ R
М И Х А И Л Д У Б О В
E M P A T I K A L A B S
ИСТОРИЯ R
• R – диалект языка S.
• S был создан в 1976 г. в Bell Labs.
• 1991: система R создана статистиками Россом
Ихака и Робертом Джентельменом (университет
Окленда, Новая Зеландия).
• 2000: вышел R v1.0.0
• 2012: вышел R v2.15.1
АЛЬТЕРНАТИВЫ
• Дорогая лицензия
• Очень много
возможностей
• Библиотеки языка
Python
• В стадии развития
(текущая версия - 0.9)
ПРЕИМУЩЕСТВА R
+ R – свободный пакет.
+ Активный процесс разработки ядра, частые
релизы.
+ Сплоченное комьюнити, огромное количество
библиотек:
+ Около 4000 библиотек в CRAN.
- Ядро содержит только самую основную функциональность, для многих часто возникающих задач
уже нужно устанавливать библиотеки.
+ Во многом чрезвычайно элегантный и
интуитивный синтаксис.
+ Код читаем ⇒ анализ данных воспроизводим!
+ Широкие возможности для работы с графикой.
НЕДОСТАТКИ R
- Все объекты хранятся в оперативной памяти –
невозможна работа напрямую с очень
большими данными
- Решается с помощью сторонней библиотеки Bigmemory
- Ограниченная поддержка 3D
- Неочевидные названия функций и правила
наименования переменных (примеры – позже…)
- К тому же, не самое высокое качество документации
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% веб-
трафика).
R В ИНДУСТРИИ
http://www.facebook.com/notes/facebook-engineering/visualizing-friendships/469716398919
ОРГАНИЗАЦИЯ РАБОТЫ С 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)
ВВЕДЕНИЕ В ЯЗЫК R
ТИПЫ И БАЗОВЫЕ СТРУКТУРЫ ДАННЫХ
ТИПЫ ДАННЫХ
Типы данных Примеры значений
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)
ОТСУТСТВУЮЩИЕ ЗНАЧЕНИЯ
• Зачастую не удается собрать все данные по всем параметрам интересующих нас объектов.
• Отсутствующие (неизвестные) значения наблюдений обозначаются в R как NA (“Not available”).
• Проверка на NA: is.na (x)
• Избавление от NA: na.omit (data) (в MATLAB – используются специальные функции вроде nanmean, nanmax, nanmin)
БАЗОВЫЕ СТРУКТУРЫ ДАННЫХ
Структура данных Примеры
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
data.frame( age = 18:23, height = c(170, 171, NA, 176, 173, 180), sex = factor(c("m", "f", "m", "m", "f", "m")) )
• Оператор присванивания: data <- data.frame(…) • Оператор = тоже есть (и семантически очень незначительно
отличается от <-)
DATA FRAME
• Объекты типа data.frame, как правило, содержат
анализируемые данные (наблюдения некоторых
переменных).
data <- data.frame( age = 18:23, height = c(170, 171, NA, 176, 173, 180), sex = factor(c("m", "f", "m", "m", "f", "m")) )
age height sex
1 18 170 m
2 19 171 f
3 20 NA m
4 21 176 m
5 22 173 f
6 23 180 m
> data
ОБОБЩЕНИЕ ДАННЫХ
> 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
ОБОБЩЕНИЕ ДАННЫХ
> 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
ВЫБОРКИ ДАННЫХ – СТРОКИ
> 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
ВЫБОРКИ ДАННЫХ – СТОЛБЦЫ
> 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
ВЫБОРКИ ДАННЫХ & УСЛОВИЯ
> data[data$age > 20 & data$sex == "m", "height"] [1] 176 180 > all(data$age > 16) [1] TRUE > any(data$age > 60) [1] FALSE
ВЫГРУЗКА ДАННЫХ
> fileUrl <- "http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data" > download.file(fileUrl, destfile="./iris.csv"[, method="curl"])
• Пример: Iris Dataset (archive.ics.uci.edu/ml/datasets/Iris) • download.file() – выгрузка
• read.csv() – чтение данных в csv • Функция read.table – более
настраиваемая
> iris.data <- read.csv("./iris.csv") # iris.data is now a data frame > head(iris.data, 1) X5.1 X3.5 X1.4 X0.2 Iris.setosa 1 4.9 3.0 1.4 0.2 Iris-setosa > colnames(iris.data) <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
ВЫГРУЗКА ДАННЫХ
• Чтение Excel
• read.xlsx(), read.xlsx2() из пакета xlsx
• Чтение JSON
• fromJSON() из пакета RJSONIO
• Чтение текстов
• readLines()
ГРАФИКА В R
ВИЗУАЛИЗАЦИЯ ДАННЫХ
ПРОСТЕЙШИЕ ГРАФИКИ
• 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)
ПРОСТЕЙШИЕ ГРАФИКИ
• Соединять точки линиями в данном примере смысла мало (может быть несколько наблюдений с одним возрастом).
• Зато имеет смысл разбить наблюдения по полу:
> 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)
ПРОСТЕЙШИЕ ГРАФИКИ
• table() – возвращает частотность значений
• barplot() – гистограмма
> barplot(table(data$sex), names.arg=c("Female", "Male"))
ПРОДВИНУТЫЙ АНАЛИЗ ДАННЫХ В R
РЕГРЕССИОННЫЙ АНАЛИЗ, КЛАСТЕРИЗАЦИЯ
ЛИНЕЙНАЯ РЕГРЕССИОННАЯ МОДЕЛЬ
• lm() – для обычных линейных моделей (в т.ч. с
dummy-переменными)
• glm() – для более широкого класса моделей
(например, моделей бинарного выбора)
> lm1 <- lm(height ~ age, data) # lm1 is now a special object > summary(lm1) ...
𝐻𝑒𝑖𝑔ℎ𝑡𝑖 = 𝛼 + 𝛽 ∙ 𝐴𝑔𝑒𝑖 + 𝜀𝑖
b = regress(y, X) # X is a n·p matrix # b is a p·1 vector
Сравните с MATLAB:
ЛИНЕЙНАЯ РЕГРЕССИОННАЯ МОДЕЛЬ
> plot(data$height ~ data$age, pch=19, xlab="Age", ylab="Height") > abline(c(lm1$coeff[1], lm1$coeff[2]), col="blue")
• abline() – рисует прямую по коэффициентам ее
уравнения:
ДОБАВЛЕНИЕ DUMMY-VARIABLES
• Специально ничего делать не надо!
(data$sex имеет тип factor)
𝐻𝑒𝑖𝑔ℎ𝑡𝑖 = 𝛽1 + 𝛽2 ∙ 𝐴𝑔𝑒𝑖 + 𝛽3 ∙ 𝑓(𝑆𝑒𝑥𝑖) + 𝜀𝑖
> lm2 <- lm(height ~ age + sex, data)
ДОБАВЛЕНИЕ DUMMY-VARIABLES
> plot(data$height ~ data$age, pch=19, col=data$sex, xlab="Age", ylab="Height") > legend(18, 179, legend=c("Male", "Female"), col=c("red", "black"), pch=19) > abline(c(lm2$coeff[1], lm2$coeff[2]), col="black") > abline(c(lm2$coeff[1]+lm2$coeff[3], lm2$coeff[2]), col="reg")
ПРЕДСКАЗАНИЯ С ПОМОЩЬЮ РЕГРЕССИЙ
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
КЛАСТЕРИЗАЦИЯ ПО K-MEANS
> plot(iris.data$Petal.Length, iris.data$Sepal.Width, pch=19)
КЛАСТЕРИЗАЦИЯ ПО K-MEANS
> clustering <- kmeans(iris.data[, c("Sepal.Width", "Petal.Length")], centers = 3) # trial №1 > plot(iris.data$Petal.Length, iris.data$Sepal.Width, pch=19, col=clustering$cluster) > clustering <- kmeans(iris.data[, c("Sepal.Width", "Petal.Length")], centers = 3) # trial №2 > plot(iris.data$Petal.Length, iris.data$Sepal.Width, pch=19, col=clustering$cluster)
• k-means – недетерминированный алгоритм!
КЛАСТЕРИЗАЦИЯ ПО K-MEANS
> clustering <- kmeans(iris.data[, c("Sepal.Width", "Petal.Length")], centers = 3, nstart = 10) > plot(iris.data$Petal.Length, iris.data$Sepal.Width, pch=19, col=clustering$cluster)
• Параметр nstart позволяет запускать алгоритм несколько раз и считать «средние» кластеры
ПРОДВИНУТЫЙ R R К А К Ф У Н К Ц И О Н А Л Ь Н Ы Й & О Б Ъ Е К Т Н О -
О Р И Е Н Т И Р О ВА Н Н Ы Й Я З Ы К
R – ФУНКЦИОНАЛЬНЫЙ ЯЗЫК
• Функции в R – “first-class objects”: • могут храниться в переменных;
• могут передаваться в другие функции;
• в языке есть функции высшего порядка (например, lapply –известная в других языках как map).
> 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
cm.to.foot <- function(x) { 0.0328 * x }
R – ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ЯЗЫК
• ООП в R реализовано очень странно:
• В действительности, в языке уживаются сразу две
различные реализации ООП.
• Более распространенная из двух реализаций
ООП в R основана на:
• определении новых классов методом setClass();
• расширении уже существующих в языке generic-функций для новых классов методом setMethod().
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)
ИСПОЛЬЗОВАННЫЕ ИСТОЧНИКИ & ДАЛЬНЕЙШЕЕ ЧТЕНИЕ
• 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]