Sei sulla pagina 1di 4

library(forecast)

# Step 1: Convert data to a time series object


# Step 2: Visualize the time series data
# Step 3: Divide the data to training and test period
# Step 4: Build time series model using training period
# Step 5: Forecast for test period
# Step 6: Model Evaluation: Compare forecasted with actual
# Step 7: Forecast for the future

################ Kings Data ##################

kingsdata = scan("data/kings.dat",skip=3)

# Step 1: COnvert to timeseries object


kingsts = ts(kingsdata)

# Step 2: visualization
plot(kingsts)

# Step 2: training test split


kings_tr = kingsdata[1:37] #training
kings_te = kingsdata[38:42] #test
kings_tr_ts = ts(kings_tr)

# Step 4: Build time series model


kings_arima = auto.arima(kings_tr_ts)
print(kings_arima)
# ARIMA (p,d,q)
# yt = 0.3226*y(t-1) + 53.5508
acf(kings_tr_ts) # p chosen from acf
pacf(kings_tr_ts) # q chosen from pacf

cor(kingsdata,kingsdata) # zero lag correlation


cor(kingsdata[2:42],kingsdata[1:41]) # 1 lag correlation
cor(kingsdata[3:42],kingsdata[1:40]) # 2 lag correlation

# Step 5: Forecast for test period


kings_arima_forecast = forecast(kings_arima,h=5)
plot(kings_arima_forecast)
# changing confidence level
kings_arima_forecast = forecast(kings_arima,h=5, level = 90)

# Step 6: Evaluate model: MAPE


# MAPE = mean(abs(actual - forecast)/actual)
mean(abs(kings_te - as.numeric(kings_arima_forecast$mean))/kings_te)
# 20% error

# Step 7: Forecast for future


kings_arima_all = auto.arima(kingsts)
# forecast for King 43 to King 46
kings_arima_future_forecast = forecast(kings_arima_all,h=4)
plot(kings_arima_future_forecast)

########### Nybirths ################################


# estimated number of births per month from Jan 1946 to Dec 1959
nybirths = scan("data/nybirths.dat")

# Step 1: time series object


nybirths_ts = ts(nybirths, frequency = 12, start = c(1946,1))

# Step 2: Visualization
plot(nybirths_ts)
# births have been increasing with a seasonal pattern

# Step 3: training test split


nybirths_tr = nybirths[1:144] # 1946 to 1957 for training
nybirths_te = nybirths[145:168] # 1958 and 1959 for test
nybirths_tr_ts = ts(nybirths_tr,frequency = 12, start = c(1946,1))
plot(nybirths_tr_ts)

# Step 4: Time series model building


nybirth_tr_arima = auto.arima(nybirths_tr_ts)
print(nybirth_tr_arima)
acf(nybirths_tr_ts)

# Step 5: Forecast for test duration


nybirth_te_forecast_arima = forecast(nybirth_tr_arima,h=24)
plot(nybirth_te_forecast_arima)

# Step 6: Model evaluation


mean(abs(nybirths_te - as.numeric(nybirth_te_forecast_arima$mean))/nybirths_te)
# 4.74% error
plot(nybirths_te,type='l',ylim = c(25,31))
lines(as.numeric(nybirth_te_forecast_arima$mean),lty = 2)

# Step 7: Future forecast


nybirth_arima_all = auto.arima(nybirths_ts)
nybirth_arima_future_forecast = forecast(nybirth_arima_all,h=12)
plot(nybirth_arima_future_forecast)

### Sales data


# monthly sales data from Jan 2010
salesdata = scan("data/fancy.dat")
# 6 years for training, 1 year for test

# Step 1:
sales_ts = ts(salesdata,frequency = 12, start=c(2010,1))

# Step 2
plot(sales_ts)

# Step 3:
sales_tr = salesdata[1:72]
sales_te = salesdata[73:84]
sales_tr_ts = ts(sales_tr,frequency = 12, start=c(2010,1))

# Step 4
sales_arima = auto.arima(sales_tr_ts)

# Step 5
sales_arima_forecast = forecast(sales_arima,h=12)

# Step 6
# 88% MAPE!!!!!!!!!!!!!!!!
mean(abs(sales_te - as.numeric(sales_arima_forecast$mean))/sales_te)
plot(sales_te,type='l')
lines(as.numeric(sales_arima_forecast$mean),lty = 2)
###### data transformation
# transforming the data to log with exp base scale
sales_tr_log = log(sales_tr)
plot(sales_tr,type='l')
plot(sales_tr_log,type='l')

sales_tr_log_ts = ts(sales_tr_log,frequency = 12, start=c(2010,1))


sales_log_arima = auto.arima(sales_tr_log_ts)
sales_log_arima_forecast = forecast(sales_log_arima,h=12)
# reversing the log operation using exp function
sales_arima_origscale_forecast = as.numeric(exp(sales_log_arima_forecast$mean))
mean(abs(sales_te - sales_arima_origscale_forecast)/sales_te) #11% MAPE
plot(sales_te,type='l')
lines(sales_arima_origscale_forecast,lty = 2)

# future forecast using full data


sales_log = log(salesdata)
sales_log_ts = ts(sales_log,frequency = 12, start=c(2010,1))
plot(sales_log_ts)

sales_log_all_arima = auto.arima(sales_log_ts)
sales_log_all_arima_forecast = forecast(sales_log_all_arima,h=24)
plot(sales_log_all_arima_forecast)
sales_origscale_all_arima_forecast =
exp(as.numeric(sales_log_all_arima_forecast$mean))

act_fore_merge = c(salesdata,sales_origscale_all_arima_forecast)
act_fore_merge_ts = ts(act_fore_merge,frequency = 12, start=c(2010,1))
plot(act_fore_merge_ts)

########## decomposition

sales_decomposed = decompose(sales_ts)
plot(sales_decomposed)

sales_log_decomposed = decompose(sales_log_ts)
plot(sales_log_decomposed)

nybirth_decomposed = decompose(nybirths_ts)
plot(nybirth_decomposed)

########## Holt-Winters ##################

### nybirths
# Step 4: Time series model building
# nybirth_tr_arima = auto.arima(nybirths_tr_ts)
nybirth_tr_holtwinters = HoltWinters(nybirths_tr_ts)

# Step 5: Forecast for test duration


nybirth_te_forecast_hw = forecast(nybirth_tr_holtwinters,h=24)
plot(nybirth_te_forecast_hw)

# Step 6: Model evaluation


# 4.75% MAPE for ARIMA
mean(abs(nybirths_te - as.numeric(nybirth_te_forecast_arima$mean))/nybirths_te)
# 4.67% MAPE for ARIMA
mean(abs(nybirths_te - as.numeric(nybirth_te_forecast_hw$mean))/nybirths_te)

### sales data


sales_log_hw = HoltWinters(sales_tr_log_ts)
sales_log_hw_forecast = forecast(sales_log_hw,h=12)
# reversing the log operation using exp function
sales_hw_origscale_forecast = as.numeric(exp(sales_log_hw_forecast$mean))
mean(abs(sales_te - sales_hw_origscale_forecast)/sales_te) #25% MAPE

plot(sales_te,type='l')
lines(sales_arima_origscale_forecast,lty = 2,col = "red")
lines(sales_hw_origscale_forecast, lty=2, col = "blue")

# multiplicative holt winters model


sales_log_hwmult = HoltWinters(sales_tr_log_ts,seasonal = "multiplicative")
sales_log_hwmult_forecast = forecast(sales_log_hwmult,h=12)
sales_hwmult_origscale_forecast = as.numeric(exp(sales_log_hwmult_forecast$mean))
mean(abs(sales_te - sales_hwmult_origscale_forecast)/sales_te) #20% MAPE

Potrebbero piacerti anche