38
ОБОБЩЕНИЕ, СОПОСТАВЛЕНИЕ, ВИЗУАЛИЗАЦИЯ ДАННЫХ АНАЛИЗ ДАННЫХ В СРЕДЕ R МИХАИЛ ДУБОВ EMPATIKA LABS

Data analysis in R

Embed Size (px)

Citation preview

Page 1: Data analysis in R

О Б О Б Щ Е Н И Е , С О П О С Т А В Л Е Н И Е ,

В И З У А Л И З А Ц И Я Д А Н Н Ы Х

АНАЛИЗ ДАННЫХ В СРЕДЕ R

М И Х А И Л Д У Б О В

E M P A T I K A L A B S

Page 2: Data analysis in R

ИСТОРИЯ R

• R – диалект языка S.

• S был создан в 1976 г. в Bell Labs.

• 1991: система R создана статистиками Россом

Ихака и Робертом Джентельменом (университет

Окленда, Новая Зеландия).

• 2000: вышел R v1.0.0

• 2012: вышел R v2.15.1

Page 3: Data analysis in R

АЛЬТЕРНАТИВЫ

• Дорогая лицензия

• Очень много

возможностей

• Библиотеки языка

Python

• В стадии развития

(текущая версия - 0.9)

Page 4: Data analysis in R

ПРЕИМУЩЕСТВА R

+ R – свободный пакет.

+ Активный процесс разработки ядра, частые

релизы.

+ Сплоченное комьюнити, огромное количество

библиотек:

+ Около 4000 библиотек в CRAN.

- Ядро содержит только самую основную функциональность, для многих часто возникающих задач

уже нужно устанавливать библиотеки.

+ Во многом чрезвычайно элегантный и

интуитивный синтаксис.

+ Код читаем ⇒ анализ данных воспроизводим!

+ Широкие возможности для работы с графикой.

Page 5: Data analysis in R

НЕДОСТАТКИ R

- Все объекты хранятся в оперативной памяти –

невозможна работа напрямую с очень

большими данными

- Решается с помощью сторонней библиотеки Bigmemory

- Ограниченная поддержка 3D

- Неочевидные названия функций и правила

наименования переменных (примеры – позже…)

- К тому же, не самое высокое качество документации

Page 6: Data analysis in R

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% веб-

трафика).

Page 8: Data analysis in R

ОРГАНИЗАЦИЯ РАБОТЫ С 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)

Page 9: Data analysis in R

ВВЕДЕНИЕ В ЯЗЫК R

ТИПЫ И БАЗОВЫЕ СТРУКТУРЫ ДАННЫХ

Page 10: Data analysis in 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)

Page 11: Data analysis in R

ОТСУТСТВУЮЩИЕ ЗНАЧЕНИЯ

• Зачастую не удается собрать все данные по всем параметрам интересующих нас объектов.

• Отсутствующие (неизвестные) значения наблюдений обозначаются в R как NA (“Not available”).

• Проверка на NA: is.na (x)

• Избавление от NA: na.omit (data) (в MATLAB – используются специальные функции вроде nanmean, nanmax, nanmin)

Page 12: Data analysis in R

БАЗОВЫЕ СТРУКТУРЫ ДАННЫХ

Структура данных Примеры

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(…) • Оператор = тоже есть (и семантически очень незначительно

отличается от <-)

Page 13: Data analysis in R

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

Page 14: Data analysis in R

ОБОБЩЕНИЕ ДАННЫХ

> 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

Page 15: Data analysis in R

ОБОБЩЕНИЕ ДАННЫХ

> 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

Page 16: Data analysis in R

ВЫБОРКИ ДАННЫХ – СТРОКИ

> 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

Page 17: Data analysis in R

ВЫБОРКИ ДАННЫХ – СТОЛБЦЫ

> 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

Page 18: Data analysis in R

ВЫБОРКИ ДАННЫХ & УСЛОВИЯ

> data[data$age > 20 & data$sex == "m", "height"] [1] 176 180 > all(data$age > 16) [1] TRUE > any(data$age > 60) [1] FALSE

Page 19: Data analysis in R

ВЫГРУЗКА ДАННЫХ

> 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")

Page 20: Data analysis in R

ВЫГРУЗКА ДАННЫХ

• Чтение Excel

• read.xlsx(), read.xlsx2() из пакета xlsx

• Чтение JSON

• fromJSON() из пакета RJSONIO

• Чтение текстов

• readLines()

Page 21: Data analysis in R

ГРАФИКА В R

ВИЗУАЛИЗАЦИЯ ДАННЫХ

Page 22: Data analysis in 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)

Page 23: Data analysis in R

ПРОСТЕЙШИЕ ГРАФИКИ

• Соединять точки линиями в данном примере смысла мало (может быть несколько наблюдений с одним возрастом).

• Зато имеет смысл разбить наблюдения по полу:

> 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)

Page 24: Data analysis in R

ПРОСТЕЙШИЕ ГРАФИКИ

• table() – возвращает частотность значений

• barplot() – гистограмма

> barplot(table(data$sex), names.arg=c("Female", "Male"))

Page 25: Data analysis in R

ПРОДВИНУТЫЙ АНАЛИЗ ДАННЫХ В R

РЕГРЕССИОННЫЙ АНАЛИЗ, КЛАСТЕРИЗАЦИЯ

Page 26: Data analysis in 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:

Page 27: Data analysis in R

ЛИНЕЙНАЯ РЕГРЕССИОННАЯ МОДЕЛЬ

> plot(data$height ~ data$age, pch=19, xlab="Age", ylab="Height") > abline(c(lm1$coeff[1], lm1$coeff[2]), col="blue")

• abline() – рисует прямую по коэффициентам ее

уравнения:

Page 28: Data analysis in R

ДОБАВЛЕНИЕ DUMMY-VARIABLES

• Специально ничего делать не надо!

(data$sex имеет тип factor)

𝐻𝑒𝑖𝑔ℎ𝑡𝑖 = 𝛽1 + 𝛽2 ∙ 𝐴𝑔𝑒𝑖 + 𝛽3 ∙ 𝑓(𝑆𝑒𝑥𝑖) + 𝜀𝑖

> lm2 <- lm(height ~ age + sex, data)

Page 29: Data analysis in R

ДОБАВЛЕНИЕ 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")

Page 30: Data analysis in R

ПРЕДСКАЗАНИЯ С ПОМОЩЬЮ РЕГРЕССИЙ

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

Page 31: Data analysis in R

КЛАСТЕРИЗАЦИЯ ПО K-MEANS

> plot(iris.data$Petal.Length, iris.data$Sepal.Width, pch=19)

Page 32: Data analysis in R

КЛАСТЕРИЗАЦИЯ ПО 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 – недетерминированный алгоритм!

Page 33: Data analysis in R

КЛАСТЕРИЗАЦИЯ ПО 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 позволяет запускать алгоритм несколько раз и считать «средние» кластеры

Page 34: Data analysis in R

ПРОДВИНУТЫЙ R R К А К Ф У Н К Ц И О Н А Л Ь Н Ы Й & О Б Ъ Е К Т Н О -

О Р И Е Н Т И Р О ВА Н Н Ы Й Я З Ы К

Page 35: Data analysis in 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 }

Page 36: Data analysis in R

R – ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ЯЗЫК

• ООП в R реализовано очень странно:

• В действительности, в языке уживаются сразу две

различные реализации ООП.

• Более распространенная из двух реализаций

ООП в R основана на:

• определении новых классов методом setClass();

• расширении уже существующих в языке generic-функций для новых классов методом setMethod().

Page 37: Data analysis in R

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)

Page 38: Data analysis in R

ИСПОЛЬЗОВАННЫЕ ИСТОЧНИКИ & ДАЛЬНЕЙШЕЕ ЧТЕНИЕ

• 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]