Загрузка пакетов и данных

library(dplyr)
library(ggplot2)
library(ggthemes)
library(equatiomatic)
library(robumeta)
library(rmarkdown)

data1 <- read.csv("task1.csv", header = T, sep = ";")
data2 <- read.csv("task2.csv", header = T, sep = ",")

Задание 2.1

Первое задание это построить регрессионную модель зависимости курса рубля от стоимости барреля нефти. Для анализа предоставлен помесячный временной ряд стоимости нефти в долл. США и стоимость одного доллара в рублях с 1999 года по декабрь 2015 года.

Выбор оптимальной длины временого ряда

В этом блоке я выбираю временной период, на основе которого будет построеная регрессионная модель. Для начала стоит взглянуть на распределение переменных по годам. Регрессионная модель подразумевает, что данные изменяются. Хотя сейчас построение регрессий не требует нормального распределения, но распределение в принципе должно присутствовать.

На графиках ниже показано, что в некоторые года стоимость барреля нефти принимала практически одно и то же значение весь год и особого разброса данных не наблюдается. Для построения модели наиболее подходящими выглядят периоды годов 2007, 2008, 2009 и 2014.

Приведенные ниже графики свидетельствуют о том же явлении, что было описано выше - стоимость доллара принимает 1-2 значения в течение года, поэтому дисперсия очень мала. Наиболее подходящими выглядят 2014 и 2015 года.

Теперь посмотрим на графики взаимоотношений двух данных переменных.

Как видно ниже, до 2003 года не наблюдалось значительных линейных отношений между долларом и нефтью. С 2004 по 2013 можно наблюдать, что наблюдения выстраиваются в неку линию, но во многие года значения по оси У почти не меняются, поэтому наличие модели не было бы значительно лучше, чем ее отсутствие (вычисление простого среднего). В 2014 и 2015 году графики показывают линейность отношений между нефтью и долларом и необходимость регрессии, так как имеется наклон линии.

Опираясь на всё вышеизложенное, периодом для анализа мною выбраны 2014 и 2015 год. Для этого я создаю отдельный лист с данными.

y14 <- filter(data1, year==2014)
y15 <- filter(data1, year==2015)
data1_1<-rbind(y14, y15)

Построение модели зависимости курса доллара от стоимости нефти

В этом блоке я строю регрессионную модель отношений между курсом рубля и стоимостью нефти.

У нас будет линейная регрессия, предсказывающая стоимость одного доллара в рублях от стоимости барреля нефти.

model1 <- lm(ex_rate ~ price, data = data1_1)

Оценка качества модели

В этом блоке я оцениваю качество построенной модели.

Ниже представлены параметры модели. P-value для F-statistic говорит о значимости модели, так как значение меньше 0.05. Предиктор price (стоимость нефти) также статистически значимый. R-squared равен 0.96, что означает, что данная модель объясняет 96% дисперсии данных. Это очень высокий показатель, что говорит о высоком качестве модели.

summary(model1)
## 
## Call:
## lm(formula = ex_rate ~ price, data = data1_1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.7394 -1.5006 -0.0697  1.5988  5.9248 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 87.40660    1.60854   54.34   <2e-16 ***
## price       -0.49320    0.01999  -24.68   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.492 on 22 degrees of freedom
## Multiple R-squared:  0.9651, Adjusted R-squared:  0.9635 
## F-statistic: 608.9 on 1 and 22 DF,  p-value: < 2.2e-16

Уравнение и интерпретация

В этом блоке я показываю уравнение получившейся модели и интерпретирую коэффициенты.

Уравнение линейной регрессии имеет следующий вид: у=b0+b1*х+е, где у - это зависимая переменная, b0 - это точка пересечения линии с осью У при х=0 (так называемый intercept), b1 - это коэффициент наклона линии (он же slope), х - это независимая переменная и е - необъясненная дисперсия.

Таким образом, для нашей модели мы получаем следующее уравнение.

extract_eq(model1, wrap = TRUE, use_coefs=TRUE)

\[ \begin{aligned} \operatorname{ex\_rate} &= 87.41 - 0.49(\operatorname{price}) + \epsilon \end{aligned} \]

В нашей модели ex_rate - это зависимая переменная, означающая курс доллара в рублях, а price - это независимая переменная - стоимость барреля нефти.

Коэффициенты уравнения обозначают следующее:

  • При нулевом эффекте стоимости нефти, курс доллара составляет 87.41
  • При возрастании стоимости нефти на одну единицу измерения, курс доллара в рублях падает на 0.49

В целом, уравнение говорит о негативном взаимоотношении курса доллара и стоимости нефти - чем дороже нефть, тем дешевле доллар.

Задание 2.2

Второе задание заключается в построении прогнозной модели прродажи нефтепродуктов на АЗС. Для анализа предоставлен помесячный временной ряд продаж АБ на АЗС с января 2012 года по июль 2016 года.

Построение прогноза продаж на 17 месяцев

В этом блоке я использую линейную модель для прогнозирования продаж нефтепродуктов с августа 2016 по декабрь 2017.

Для этого сначала разделим данные для модели и данные для прогноза.

data2_mod <- na.omit(data2)
data2_pred <- subset(data2, is.na(volume))

paged_table(data2_mod)
paged_table(data2_pred)

Дальше, я строю линейную регрессионную модель.

model2 <- lm(volume ~ month, data = data2_mod)

Затем, я делаю прогнозирование на 17 месяцев. Спрогнозированные значения в столбце volume_pred в таблице ниже.

data2_pred$volume_pred <- predict.lm(model2, data2_pred)

knitr :: kable(data2_pred)
year month volume volume_pred
56 2016 8 NA 668.2952
57 2016 9 NA 679.4775
58 2016 10 NA 690.6598
59 2016 11 NA 701.8422
60 2016 12 NA 713.0245
61 2017 1 NA 590.0188
62 2017 2 NA 601.2011
63 2017 3 NA 612.3835
64 2017 4 NA 623.5658
65 2017 5 NA 634.7481
66 2017 6 NA 645.9305
67 2017 7 NA 657.1128
68 2017 8 NA 668.2952
69 2017 9 NA 679.4775
70 2017 10 NA 690.6598
71 2017 11 NA 701.8422
72 2017 12 NA 713.0245

Выделение тренда и индекса сезонности

Для расчёта индекса сезонности для начала ищем среднее для каждого месяца.

data2_mod$avg_month <- group.mean(data2_mod$volume, data2_mod$month)

paged_table(data2_mod)

Затем считаем среднее за пятилетний период.

data2_mod$avg_year <- group.mean(data2_mod$avg_month, data2_mod$year)

paged_table(data2_mod)

Теперь мы можем вычислить индекс сезонности. Результаты в столбце ind_seas.

data2_mod$ind_seas <- data2_mod$avg_month/data2_mod$avg_year

paged_table(data2_mod)

График сезонности

Построим график с линией тренда

Оценка качества модели

В этом блоке я оцениваю качество построенной модели.

Ниже представлены параметры модели. P-value для F-statistic говорит о значимости модели, так как значение меньше 0.05. R-squared равен 0.45, что означает, что данная модель объясняет 45% дисперсии. Объяснена почти половина дисперсии, модель в целом неплохая, но её экспланаторная сила не очень большая.

summary(model2)
## 
## Call:
## lm(formula = volume ~ month, data = data2_mod)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -76.842 -26.704  -4.201  22.978 109.340 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  578.836     11.949  48.444  < 2e-16 ***
## month         11.182      1.693   6.606 1.94e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 42.77 on 53 degrees of freedom
## Multiple R-squared:  0.4515, Adjusted R-squared:  0.4412 
## F-statistic: 43.63 on 1 and 53 DF,  p-value: 1.944e-08

Уравнение модели

Уравнение построенной модели следующее:

extract_eq(model2, wrap = TRUE, use_coefs=TRUE)

\[ \begin{aligned} \operatorname{volume} &= 578.84 + 11.18(\operatorname{month}) + \epsilon \end{aligned} \]