Загрузка пакетов и данных
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 = ",")
Первое задание это построить регрессионную модель зависимости курса рубля от стоимости барреля нефти. Для анализа предоставлен помесячный временной ряд стоимости нефти в долл. США и стоимость одного доллара в рублях с 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 - это независимая переменная - стоимость барреля нефти.
Коэффициенты уравнения обозначают следующее:
В целом, уравнение говорит о негативном взаимоотношении курса доллара и стоимости нефти - чем дороже нефть, тем дешевле доллар.
Второе задание заключается в построении прогнозной модели прродажи нефтепродуктов на АЗС. Для анализа предоставлен помесячный временной ряд продаж АБ на АЗС с января 2012 года по июль 2016 года.
В этом блоке я использую линейную модель для прогнозирования продаж нефтепродуктов с августа 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} \]