Part A: Construct a time series plot. What type of pattern exists in
the data?
Step 1: Install and load packages
# install.packages("dplyr")
# install.packages("zoo")
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(zoo)
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
Step 2: Import the data
df <- data.frame(month=c(1,2,3,4,5,6,7,8,9,10,11,12),
values=c(240,352,230,260,280,322,220,310,240,310,240,230))
Step 3: Descrpitive statistics
summary(df)
## month values
## Min. : 1.00 Min. :220.0
## 1st Qu.: 3.75 1st Qu.:237.5
## Median : 6.50 Median :250.0
## Mean : 6.50 Mean :269.5
## 3rd Qu.: 9.25 3rd Qu.:310.0
## Max. :12.00 Max. :352.0
Interpretation: the average value of a contract over a 12 month period is 269.5 million
Step 4: Create time series plot
plot(df$month, df$values, type = "o", col = "blue", xlab = "Month", ylab = "Values (In Millions)",
main = "Alabama Building Contracts Plot")

Interpretation: the time series plot exhibits a horizontal pattern as it is steady on the mean of 269.5
Part B: Compare the three-month moving average approach with the
exponential smoothing forecast using alpha = 0.2. Which provides more
accurate forecasts based on MSE?
Step 1: Manually calculate the Thee-Month Moving Average
df$avg_value3 <- c(NA, NA, NA,
(df$values[1] + df$values[2] + df$values[3]) / 3,
(df$values[2] + df$values[3] + df$values[4]) / 3,
(df$values[3] + df$values[4] + df$values[5]) / 3,
(df$values[4] + df$values[5] + df$values[6]) / 3,
(df$values[5] + df$values[6] + df$values[7]) / 3,
(df$values[6] + df$values[7] + df$values[8]) / 3,
(df$values[7] + df$values[8] + df$values[9]) / 3,
(df$values[8] + df$values[9] + df$values[3]) / 3,
(df$values[9] + df$values[10] + df$values[11]) / 3
)
Step 2: Calculate the Squared errors (only for months where moving
average is behavioral)
df <- df %>%
mutate(
squared_error = ifelse(is.na(avg_value3), NA, (values - avg_value3)^2)
)
Step 3: Compute MSE (exluding the initial months with NA)
mse <- mean(df$squared_error, na.rm = TRUE)
mse #Output the MSE ~ 1842.91
## [1] 1842.914
Step 4: Calculate MSE using Exponential Smoothing
alpha <- 0.2
exp_smooth <- rep(NA, length(df$values))
exp_smooth[1] <- df$values[1] #starting point
for(i in 2: length(df$values)) {
exp_smooth[i] <- alpha * df$values[i-1] + (1 - alpha) * exp_smooth[i-1]
}
mse_exp_smooth <- mean((df$values[2:12] - exp_smooth[2:10])^2)
## Warning in df$values[2:12] - exp_smooth[2:10]: longer object length is not a
## multiple of shorter object length
mse_exp_smooth # Output the MSE ~ 2450.841
## [1] 2450.841
Step 5: Comparison of both methods
better_method <- ifelse(mse < mse_exp_smooth, "Three-Month Moving Average", "Exponential
Smoothing")
Step 6: Results of Comparison
list(
MSE_Moving_Average = mse,
MSE_Exponential_Smoothing = mse_exp_smooth,
Better_Method = better_method
)
## $MSE_Moving_Average
## [1] 1842.914
##
## $MSE_Exponential_Smoothing
## [1] 2450.841
##
## $Better_Method
## [1] "Three-Month Moving Average"
Interpretatiopn: As the code displays, the three-month moving average is the more accurate forecast based on MSE. The three-month moving average has a lower mean squared error (MSE), which is the main goal of this model: we want to minimize error to have a more accurate forecast, which the three-month moving average does better than the exponential smoothing forecast