Основная информация

Подготовлено в рамках курса “Анализ данных в бизнесе”, МГУ им. М.В. Ломоносова.

Авторы: Мирзоян А.Г., Щукина П.О.

1. Создание объектов и операции с ними

Создавать объекты в 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

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

1.2. Таблица данных (data.frame)

Распространенный тип представления данных - табличный, где по столбцам представлены переменные, принимающие определенные значения. Создание таблицы данных происходит через функцию 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

2. Операции с конкретной таблицей данных

Подгрузим таблицу данных 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), ]

2.1. Использование пакета dplyr

Для работы с таблицей данных 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.

3. Построение графиков с использованием ggplot2

Чтобы создать графики с использованием пакета 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'