Подготовлено в рамках курса “Анализ данных в бизнесе”, МГУ им. М.В. Ломоносова.
Авторы: Мирзоян А.Г., Щукина П.О.
Создавать объекты в RStudio можно через «<-», которое можно задать комбинацией клавиш Alt + «-» (минус). Через «#» (хэштег) можно оставлять комментарии в коде для удобства пользователя.
2+3 #сложение
## [1] 5
2-3 #вычитание
## [1] -1
2/3 #деление
## [1] 0.6666667
2*3 #умножение
## [1] 6
2**3 #возведение в степень
## [1] 8
3 %% 2 #остаток от деления 3 на 2
## [1] 1
Можно создавать объекты под буквами (словами) английского алфавита, чтобы информация хранилась в виде объекта. Мы сможем обращаться к данному объекту при выполнении операций. На примере ниже мы задали числа 2 и 3 в виде объектов a и b соответственно. И теперь можем производить операции с объектами.
a <- 2
b <- 3
a+b #сложение
## [1] 5
a-b #вычитание
## [1] -1
a/b #деление
## [1] 0.6666667
a*b #умножение
## [1] 6
a**b #возведение в степень
## [1] 8
b %% a #остаток от деления
## [1] 1
Объекты a и b представляют собой вектора, состоящие из одного числа. Однако, вектор может состоять из нескольких чисел. Задать можно через функцию с(), сокращение от concatenate. Объекты c и d ниже выступают векторами. Используя функции class и str можно узнать тип данных. Результаты функции - numeric, что свидетельствует о том, что объекты c и d - числовые.
c <- c(1,2,4,5,6)
d <- c(7,8,9,10,11)
class(c) ; class(d)
## [1] "numeric"
## [1] "numeric"
str(c) ; str(d)
## num [1:5] 1 2 4 5 6
## num [1:5] 7 8 9 10 11
Если значения внутри вектора задавать через ““, то это будет воспринято программой как текст. Вектора с и с1 по сущности имеют одни и те же значения, однако в с1 указаны кавычки. Результаты функции для выдачи типа данных - character, что свидетельствует о текстовом формате.
c1 <- c("1", "2", "4", "5", "6")
class(c1)
## [1] "character"
str(c1)
## chr [1:5] "1" "2" "4" "5" "6"
Если вектора одинакого размера, то можно выполнять операции с векторами. Проверить размер можно через функцию length. Арифметические действия будут происходить поэлементно. Так, например, 1 возведется в степень 7, а 2 - в степень 8.
length(c)
## [1] 5
length(d)
## [1] 5
c+d #сложение
## [1] 8 10 13 15 17
c-d #вычитание
## [1] -6 -6 -5 -5 -5
c/d #деление
## [1] 0.1428571 0.2500000 0.4444444 0.5000000 0.5454545
c*d #умножение
## [1] 7 16 36 50 66
c**d #возведение в степень
## [1] 1 256 262144 9765625 362797056
Для того, чтобы обратиться к элементу внутри вектора, нужно написать [] и внутри квадратных скобок написать номер элемента. Нумерация элементов внутри вектора ведется с 1. Число, написанное внутри квадратных скобок, называется индексом. В случае, если какого-то индекса нет, то результат выдачи будет NA, от англ. not available, что будет означать, что данного объекта нет в числе объектов вектора.
c
## [1] 1 2 4 5 6
c[1]
## [1] 1
c[5]
## [1] 6
c[10]
## [1] NA
К векторам можно применять функции суммы (sum), подсчета среднего (mean), стандартного отклонения (sd), медианы (median). Вычисление ведется по всем объектам внутри векторов.
sum(c)
## [1] 18
mean(c)
## [1] 3.6
sd(c)
## [1] 2.073644
median(c)
## [1] 4
Распространенный тип представления данных - табличный, где по столбцам представлены переменные, принимающие определенные значения. Создание таблицы данных происходит через функцию data.frame. Размерность таблицы данных можно понять через функцию dim, которая выдает два числа. Первое число - количество строчек в таблице (в данном случае - 5), второе число - количество столбцов в таблице (в данном случае - 2). Тип данных другой - data.frame. Через функцию colnames можно узнать названия столбцов.
data1 <- data.frame(c = c, d = d) #в столбец с записываем вектор с, а в столбец d - вектор d
dim(data1)
## [1] 5 2
class(data1)
## [1] "data.frame"
str(data1)
## 'data.frame': 5 obs. of 2 variables:
## $ c: num 1 2 4 5 6
## $ d: num 7 8 9 10 11
colnames(data1)
## [1] "c" "d"
Обращаться к объектам внутри таблицы данных можно также через []. Однако, так как таблица данных - двумерна (есть и столбцы, и строчки), то нужно указывать конкрентно к чему мы обращаемся (столбец, строчка, ячейка). Примеры приведены ниже.
#[строка,столбец]
data1[1,] #1-ая строчка
## c d
## 1 1 7
data1[,2] #2-ой столбец
## [1] 7 8 9 10 11
data1[2,2] #2-ая строчка, 2-ой столбец
## [1] 8
data1[c(1,3),] #вывод первой и третьей строчки, всех столбцов
## c d
## 1 1 7
## 3 4 9
Альтернативным способом обращения к данным служит обращение через $.
data1$d #2-ой столбец
## [1] 7 8 9 10 11
data1$d[2] #2-ая строчка, 2-ой столбец
## [1] 8
Также может понадобиться вывести те значения, которые больше какого-то значения. Соответственно, нужно профильтровать таблицу. В операции ниже мы выводим только те строчки, где значения в столбце c больше 3. То есть это строчки - 3, 4 и 5.
data1[data1$c > 3, ]
## c d
## 3 4 9
## 4 5 10
## 5 6 11
Создание нового столбца. Предположим, что в data1 мы хотим создать столбец e, который будет выступать суммой столбцов c и d. Создание нового столбца возможно через $.
data1$e <- data1$c + data1$d
data1
## c d e
## 1 1 7 8
## 2 2 8 10
## 3 4 9 13
## 4 5 10 15
## 5 6 11 17
Подгрузим таблицу данных mtcars, датасет со сравнением 32 автомобилей по 10 параметрам. Данная таблица данных является встроенной, поэтому мы можем написать ?mtcars и таким образом узнать переменные в датасете. Просмотреть датасет в соседней вкладке можно через функцию View. Просмотр первых строчек таблицы осуществляется через функцию head. Просмотр последних строчек таблицы осуществляется через функцию tail.
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
#View(mtcars)
summary(mtcars)
## mpg cyl disp hp
## Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0
## 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5
## Median :19.20 Median :6.000 Median :196.3 Median :123.0
## Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0
## Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0
## drat wt qsec vs
## Min. :2.760 Min. :1.513 Min. :14.50 Min. :0.0000
## 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 1st Qu.:0.0000
## Median :3.695 Median :3.325 Median :17.71 Median :0.0000
## Mean :3.597 Mean :3.217 Mean :17.85 Mean :0.4375
## 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 3rd Qu.:1.0000
## Max. :4.930 Max. :5.424 Max. :22.90 Max. :1.0000
## am gear carb
## Min. :0.0000 Min. :3.000 Min. :1.000
## 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000
## Median :0.0000 Median :4.000 Median :2.000
## Mean :0.4062 Mean :3.688 Mean :2.812
## 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :1.0000 Max. :5.000 Max. :8.000
Пример выбора определенных столбцов в датасете:
mtcars[, c("mpg", "hp")]
## mpg hp
## Mazda RX4 21.0 110
## Mazda RX4 Wag 21.0 110
## Datsun 710 22.8 93
## Hornet 4 Drive 21.4 110
## Hornet Sportabout 18.7 175
## Valiant 18.1 105
## Duster 360 14.3 245
## Merc 240D 24.4 62
## Merc 230 22.8 95
## Merc 280 19.2 123
## Merc 280C 17.8 123
## Merc 450SE 16.4 180
## Merc 450SL 17.3 180
## Merc 450SLC 15.2 180
## Cadillac Fleetwood 10.4 205
## Lincoln Continental 10.4 215
## Chrysler Imperial 14.7 230
## Fiat 128 32.4 66
## Honda Civic 30.4 52
## Toyota Corolla 33.9 65
## Toyota Corona 21.5 97
## Dodge Challenger 15.5 150
## AMC Javelin 15.2 150
## Camaro Z28 13.3 245
## Pontiac Firebird 19.2 175
## Fiat X1-9 27.3 66
## Porsche 914-2 26.0 91
## Lotus Europa 30.4 113
## Ford Pantera L 15.8 264
## Ferrari Dino 19.7 175
## Maserati Bora 15.0 335
## Volvo 142E 21.4 109
Фильтрация строк по критериям. Выведет только те автомобили, у которых расход топлива меньше 20 миль на галлон.
subset(mtcars, mpg > 20)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
Сортировка данных по столбцу. Сортирует данные по расходу топлива (столбец mpg).
mtcars_sorted <- mtcars[order(mtcars$mpg), ]
Для работы с таблицей данных mtcars в R с использованием функций пакета dplyr, сначала убедитесь, что пакет установлен и подключен. Если нет, установите его с помощью install.packages(“dplyr”) и затем подключите его с помощью library(dplyr). Можно отфильтровать строки - выберем автомобили с расходом бензина более 25 миль на галлон и 6 цилиндров:
library(dplyr)
##
## Присоединяю пакет: 'dplyr'
## Следующие объекты скрыты от 'package:stats':
##
## filter, lag
## Следующие объекты скрыты от 'package:base':
##
## intersect, setdiff, setequal, union
filtered_cars <- mtcars %>%
filter(mtcars$mpg > 25, mtcars$cyl == 6)
filtered_cars
## [1] mpg cyl disp hp drat wt qsec vs am gear carb
## <0 строк> (или 'row.names' нулевой длины)
Выбрать столбцы - выберем только столбцы с расходом топлива (mpg), количество цилиндров (cyl) и мощностью (hp):
selected_columns <- mtcars %>%
select(mpg, cyl, hp)
head(selected_columns)
## mpg cyl hp
## Mazda RX4 21.0 6 110
## Mazda RX4 Wag 21.0 6 110
## Datsun 710 22.8 4 93
## Hornet 4 Drive 21.4 6 110
## Hornet Sportabout 18.7 8 175
## Valiant 18.1 6 105
Удаление столбцов - удалим столбец carb из данных
mtcars_without_carb <- mtcars %>%
select(-carb)
Группировка и подсчет среднего - подсчитаем средний расход топлива для каждого количества цилиндров:
average_mpg_by_cyl <- mtcars %>%
group_by(cyl) %>%
summarise(average_mpg = mean(mpg))
average_mpg_by_cyl
## # A tibble: 3 × 2
## cyl average_mpg
## <dbl> <dbl>
## 1 4 26.7
## 2 6 19.7
## 3 8 15.1
Сортировка - упорядочим таблицу по столбцу mpg в убывающем порядке:
sorted_cars <- mtcars %>%
arrange(desc(mpg))
head(sorted_cars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Добавление столбца - добавим новый столбец, который будет содержать отношение мощности к весу:
mtcars_with_power_to_weight <- mtcars %>%
mutate(power_to_weight = hp / wt)
head(mtcars_with_power_to_weight)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
## power_to_weight
## Mazda RX4 41.98473
## Mazda RX4 Wag 38.26087
## Datsun 710 40.08621
## Hornet 4 Drive 34.21462
## Hornet Sportabout 50.87209
## Valiant 30.34682
Суммирование - подсчитаем общее количество автомобилей и средние значения для сгруппированных данных:
summary_by_gear <- mtcars %>%
group_by(gear) %>%
summarise(count = n(),
average_mpg = mean(mpg),
average_hp = mean(hp))
head(summary_by_gear)
## # A tibble: 3 × 4
## gear count average_mpg average_hp
## <dbl> <int> <dbl> <dbl>
## 1 3 15 16.1 176.
## 2 4 12 24.5 89.5
## 3 5 5 21.4 196.
Чтобы создать графики с использованием пакета ggplot2 на основе данных mtcars в R, сначала нужно убедиться, что пакет ggplot2 установлен и загружен в вашу R-сессию. Если нет, установите его с помощью install.packages(“ggplot2”) и затем подключите его с помощью library(ggplot2).
Диаграмма рассеяния - для визуализации взаимосвязи между расходом топлива (mpg) и мощностью (hp):
library(ggplot2)
## Warning: пакет 'ggplot2' был собран под R версии 4.3.3
library(viridis)
## Загрузка требуемого пакета: viridisLite
ggplot(mtcars, aes(x = mpg, y = hp, size = factor(cyl), color = factor(cyl))) +
geom_point() +
labs(title = "Расход топлива vs Мощность",
x = "Расход топлива (mpg)",
y = "Мощность (hp)") + theme_classic() + scale_color_viridis_d()
## Warning: Using size for a discrete variable is not advised.
Гистограмма - чтобы показать распределение веса автомобилей (wt):
ggplot(mtcars, aes(x = wt)) +
geom_histogram(binwidth = 0.25, fill = "darkblue", color = "black") +
labs(title = "Распределение веса автомобилей",
x = "Вес (1000 lbs)",
y = "Количество автомобилей") + theme_classic()
Ящик с усами (boxplot) - для сравнения расхода топлива в зависимости от количества цилиндров (cyl):
ggplot(mtcars, aes(x = factor(cyl), y = mpg, fill = factor(cyl))) +
geom_boxplot() +
labs(title = "Расход топлива в зависимости от количества цилиндров",
x = "Количество цилиндров",
y = "Расход топлива (mpg)") + theme_classic() + scale_fill_viridis_d()
Столбчатая диаграмма - чтобы показать тенденцию веса автомобилей (упорядоченных по возрастанию мощности):
ggplot(mtcars, aes(x = reorder(row.names(mtcars), hp), y = wt)) +
geom_col(fill = "slateblue") +
labs(title = "Тенденция веса автомобилей",
x = "Название автомобиля",
y = "Вес (1000 lbs)") + theme_classic() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
Диаграмма с группировкой - чтобы сравнить расход топлива и мощность для разного количества передач (gear):
ggplot(mtcars, aes(x = mpg, y = hp, color = factor(gear))) +
geom_point() +
labs(title = "Расход топлива и мощность по количеству передач",
x = "Расход топлива (mpg)",
y = "Мощность (hp)",
color = "Количество передач") + theme_classic() + scale_color_viridis_d()
Сглаженная линейная регрессия - для анализа взаимосвязи между mpg и hp с линией тренда:
ggplot(mtcars, aes(x = mpg, y = hp)) +
geom_point(color = "darkred") +
geom_smooth(method = lm) +
labs(title = "Линейная регрессия: Расход топлива vs Мощность",
x = "Расход топлива (mpg)",
y = "Мощность (hp)") + theme_classic()
## `geom_smooth()` using formula = 'y ~ x'