diff --git a/ProductDemandForecast/Code/ProductDemandForecast-hts.ipynb b/ProductDemandForecast/Code/ProductDemandForecast-hts.ipynb new file mode 100644 index 0000000..a79ebbb --- /dev/null +++ b/ProductDemandForecast/Code/ProductDemandForecast-hts.ipynb @@ -0,0 +1,1638 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "title: \"Product Demand Forecast (hts)\"\n", + "author: \"Fang Zhou, Data Scientist, Microsoft\"\n", + "output: \n", + " rmarkdown::html_vignette:\n", + " toc: true\n", + "\n", + "vignette: >\n", + " %\\VignetteIndexEntry{Vignette Title}\n", + " %\\VignetteEngine{knitr::rmarkdown}\n", + " %\\VignetteEncoding{UTF-8}\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "attributes": { + "classes": [], + "echo": "FALSE", + "id": "" + }, + "collapsed": true + }, + "outputs": [], + "source": [ + "\n", + "knitr::opts_chunk$set(fig.width = 6,\n", + " fig.height = 4,\n", + " fig.align ='center',\n", + " dev = \"png\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction\n", + "\n", + "In this documentation, we are trying to build a quartly by category demand forecast model on product booking quantity data using the package 'hts'. We implement the advanced analytics process with R in the principle of step-by-step. \n", + "\n", + "## Product booking quantity data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "attributes": { + "classes": [], + "id": "", + "message": "FALSE" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "Attaching package: 'dplyr'\n", + "\n", + "The following objects are masked from 'package:stats':\n", + "\n", + " filter, lag\n", + "\n", + "The following objects are masked from 'package:base':\n", + "\n", + " intersect, setdiff, setequal, union\n", + "\n", + "\n", + "Attaching package: 'zoo'\n", + "\n", + "The following objects are masked from 'package:base':\n", + "\n", + " as.Date, as.Date.numeric\n", + "\n", + "Warning message in as.POSIXlt.POSIXct(Sys.time()):\n", + "\"unable to identify current timezone 'C':\n", + "please set environment variable 'TZ'\"Loading required package: SparseM\n", + "\n", + "Attaching package: 'SparseM'\n", + "\n", + "The following object is masked from 'package:base':\n", + "\n", + " backsolve\n", + "\n", + "Loading required package: Matrix\n", + "Loading required package: matrixcalc\n", + "Loading required package: fma\n", + "Loading required package: expsmooth\n", + "Loading required package: lmtest\n", + "Loading required package: tseries\n" + ] + } + ], + "source": [ + "## Load the required packages into the R session.\n", + "\n", + "library(dplyr) # Missing value treatment with Filter.\n", + "library(zoo) # Missing value treatment with locf method.\n", + "library(forecast) # Time Series forecasting.\n", + "library(hts) # Hierarchical time series forecasting.\n", + "library(fpp) # Time Series cross validation.\n", + "library(foreach) # Run for loop in parallel." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's load the data and take a brief glimpse of it." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "attributes": { + "classes": [], + "id": "", + "message": "FALSE" + }, + "collapsed": true + }, + "outputs": [], + "source": [ + "## Set directory\n", + "\n", + "setwd(\"C:/Demo/ProductDemandForecast\")\n", + "\n", + "wd <- getwd()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "attributes": { + "classes": [], + "error": "FALSE", + "id": "", + "message": "FALSE,", + "warning": "FALSE," + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\t
  1. 56
  2. \n", + "\t
  3. 10
  4. \n", + "
\n" + ], + "text/latex": [ + "\\begin{enumerate*}\n", + "\\item 56\n", + "\\item 10\n", + "\\end{enumerate*}\n" + ], + "text/markdown": [ + "1. 56\n", + "2. 10\n", + "\n", + "\n" + ], + "text/plain": [ + "[1] 56 10" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'data.frame':\t56 obs. of 10 variables:\n", + " $ Year : int 1998 1998 1998 1998 1999 1999 1999 1999 2000 2000 ...\n", + " $ Quarter : Factor w/ 4 levels \"Q1\",\"Q2\",\"Q3\",..: 1 2 3 4 1 2 3 4 1 2 ...\n", + " $ Product.1: int 7320 6117 6282 6368 6602 5651 5710 6509 6589 5392 ...\n", + " $ Product.2: int 21782 16881 13495 15963 22718 14775 14634 15669 20474 14522 ...\n", + " $ Product.3: int 4865 4100 4418 5157 5550 3902 3970 3825 5706 4228 ...\n", + " $ Product.4: int 14054 8237 6731 7675 13581 7883 6516 6834 12561 7801 ...\n", + " $ Product.5: int 9055 5616 8298 6674 9168 7351 8322 7017 8706 7045 ...\n", + " $ Product.6: int 8016 8461 13175 9092 10224 9672 14376 10620 9668 8885 ...\n", + " $ Product.7: int 9178 6362 7965 6864 8908 7690 7998 7068 10484 7377 ...\n", + " $ Product.8: int 10232 9540 12385 13098 10140 9948 10653 10781 11462 9217 ...\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "
YearQuarterProduct.1Product.2Product.3Product.4Product.5Product.6Product.7Product.8
1998 Q1 7320 217824865 140549055 80169178 10232
1998 Q2 6117 168814100 82375616 84616362 9540
1998 Q3 6282 134954418 67318298 131757965 12385
1998 Q4 6368 159635157 76756674 90926864 13098
1999 Q1 6602 227185550 135819168 102248908 10140
1999 Q2 5651 147753902 78837351 96727690 9948
\n" + ], + "text/latex": [ + "\\begin{tabular}{r|llllllllll}\n", + " Year & Quarter & Product.1 & Product.2 & Product.3 & Product.4 & Product.5 & Product.6 & Product.7 & Product.8\\\\\n", + "\\hline\n", + "\t 1998 & Q1 & 7320 & 21782 & 4865 & 14054 & 9055 & 8016 & 9178 & 10232\\\\\n", + "\t 1998 & Q2 & 6117 & 16881 & 4100 & 8237 & 5616 & 8461 & 6362 & 9540\\\\\n", + "\t 1998 & Q3 & 6282 & 13495 & 4418 & 6731 & 8298 & 13175 & 7965 & 12385\\\\\n", + "\t 1998 & Q4 & 6368 & 15963 & 5157 & 7675 & 6674 & 9092 & 6864 & 13098\\\\\n", + "\t 1999 & Q1 & 6602 & 22718 & 5550 & 13581 & 9168 & 10224 & 8908 & 10140\\\\\n", + "\t 1999 & Q2 & 5651 & 14775 & 3902 & 7883 & 7351 & 9672 & 7690 & 9948\\\\\n", + "\\end{tabular}\n" + ], + "text/markdown": [ + "\n", + "Year | Quarter | Product.1 | Product.2 | Product.3 | Product.4 | Product.5 | Product.6 | Product.7 | Product.8 | \n", + "|---|---|---|---|---|---|\n", + "| 1998 | Q1 | 7320 | 21782 | 4865 | 14054 | 9055 | 8016 | 9178 | 10232 | \n", + "| 1998 | Q2 | 6117 | 16881 | 4100 | 8237 | 5616 | 8461 | 6362 | 9540 | \n", + "| 1998 | Q3 | 6282 | 13495 | 4418 | 6731 | 8298 | 13175 | 7965 | 12385 | \n", + "| 1998 | Q4 | 6368 | 15963 | 5157 | 7675 | 6674 | 9092 | 6864 | 13098 | \n", + "| 1999 | Q1 | 6602 | 22718 | 5550 | 13581 | 9168 | 10224 | 8908 | 10140 | \n", + "| 1999 | Q2 | 5651 | 14775 | 3902 | 7883 | 7351 | 9672 | 7690 | 9948 | \n", + "\n", + "\n" + ], + "text/plain": [ + " Year Quarter Product.1 Product.2 Product.3 Product.4 Product.5 Product.6\n", + "1 1998 Q1 7320 21782 4865 14054 9055 8016 \n", + "2 1998 Q2 6117 16881 4100 8237 5616 8461 \n", + "3 1998 Q3 6282 13495 4418 6731 8298 13175 \n", + "4 1998 Q4 6368 15963 5157 7675 6674 9092 \n", + "5 1999 Q1 6602 22718 5550 13581 9168 10224 \n", + "6 1999 Q2 5651 14775 3902 7883 7351 9672 \n", + " Product.7 Product.8\n", + "1 9178 10232 \n", + "2 6362 9540 \n", + "3 7965 12385 \n", + "4 6864 13098 \n", + "5 8908 10140 \n", + "6 7690 9948 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "## Read data\n", + "\n", + "dspath <- file.path(wd, \"Data\", \"productQuantity.csv\")\n", + "\n", + "data <- read.table(dspath, header=TRUE, sep=\",\")\n", + "\n", + "dim(data) # 56 11\n", + "\n", + "str(data)\n", + "\n", + "head(data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Handling missing value\n", + "\n", + "To clean the data, we remove some of columns with too many NAs (>10%) and replace other missing values with last-observation-carried-forward method." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "attributes": { + "classes": [], + "error": "FALSE", + "id": "", + "message": "FALSE,", + "warning": "FALSE," + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\t
  1. 56
  2. \n", + "\t
  3. 10
  4. \n", + "
\n" + ], + "text/latex": [ + "\\begin{enumerate*}\n", + "\\item 56\n", + "\\item 10\n", + "\\end{enumerate*}\n" + ], + "text/markdown": [ + "1. 56\n", + "2. 10\n", + "\n", + "\n" + ], + "text/plain": [ + "[1] 56 10" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
    \n", + "\t
  1. 56
  2. \n", + "\t
  3. 10
  4. \n", + "
\n" + ], + "text/latex": [ + "\\begin{enumerate*}\n", + "\\item 56\n", + "\\item 10\n", + "\\end{enumerate*}\n" + ], + "text/markdown": [ + "1. 56\n", + "2. 10\n", + "\n", + "\n" + ], + "text/plain": [ + "[1] 56 10" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
    \n", + "\t
  1. 56
  2. \n", + "\t
  3. 10
  4. \n", + "
\n" + ], + "text/latex": [ + "\\begin{enumerate*}\n", + "\\item 56\n", + "\\item 10\n", + "\\end{enumerate*}\n" + ], + "text/markdown": [ + "1. 56\n", + "2. 10\n", + "\n", + "\n" + ], + "text/plain": [ + "[1] 56 10" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "
YearQuarterProduct.1Product.2Product.3Product.4Product.5Product.6Product.7Product.8
1998 Q1 7320 217824865 140549055 80169178 10232
1998 Q2 6117 168814100 82375616 84616362 9540
1998 Q3 6282 134954418 67318298 131757965 12385
1998 Q4 6368 159635157 76756674 90926864 13098
1999 Q1 6602 227185550 135819168 102248908 10140
1999 Q2 5651 147753902 78837351 96727690 9948
\n" + ], + "text/latex": [ + "\\begin{tabular}{r|llllllllll}\n", + " Year & Quarter & Product.1 & Product.2 & Product.3 & Product.4 & Product.5 & Product.6 & Product.7 & Product.8\\\\\n", + "\\hline\n", + "\t 1998 & Q1 & 7320 & 21782 & 4865 & 14054 & 9055 & 8016 & 9178 & 10232\\\\\n", + "\t 1998 & Q2 & 6117 & 16881 & 4100 & 8237 & 5616 & 8461 & 6362 & 9540\\\\\n", + "\t 1998 & Q3 & 6282 & 13495 & 4418 & 6731 & 8298 & 13175 & 7965 & 12385\\\\\n", + "\t 1998 & Q4 & 6368 & 15963 & 5157 & 7675 & 6674 & 9092 & 6864 & 13098\\\\\n", + "\t 1999 & Q1 & 6602 & 22718 & 5550 & 13581 & 9168 & 10224 & 8908 & 10140\\\\\n", + "\t 1999 & Q2 & 5651 & 14775 & 3902 & 7883 & 7351 & 9672 & 7690 & 9948\\\\\n", + "\\end{tabular}\n" + ], + "text/markdown": [ + "\n", + "Year | Quarter | Product.1 | Product.2 | Product.3 | Product.4 | Product.5 | Product.6 | Product.7 | Product.8 | \n", + "|---|---|---|---|---|---|\n", + "| 1998 | Q1 | 7320 | 21782 | 4865 | 14054 | 9055 | 8016 | 9178 | 10232 | \n", + "| 1998 | Q2 | 6117 | 16881 | 4100 | 8237 | 5616 | 8461 | 6362 | 9540 | \n", + "| 1998 | Q3 | 6282 | 13495 | 4418 | 6731 | 8298 | 13175 | 7965 | 12385 | \n", + "| 1998 | Q4 | 6368 | 15963 | 5157 | 7675 | 6674 | 9092 | 6864 | 13098 | \n", + "| 1999 | Q1 | 6602 | 22718 | 5550 | 13581 | 9168 | 10224 | 8908 | 10140 | \n", + "| 1999 | Q2 | 5651 | 14775 | 3902 | 7883 | 7351 | 9672 | 7690 | 9948 | \n", + "\n", + "\n" + ], + "text/plain": [ + " Year Quarter Product.1 Product.2 Product.3 Product.4 Product.5 Product.6\n", + "1 1998 Q1 7320 21782 4865 14054 9055 8016 \n", + "2 1998 Q2 6117 16881 4100 8237 5616 8461 \n", + "3 1998 Q3 6282 13495 4418 6731 8298 13175 \n", + "4 1998 Q4 6368 15963 5157 7675 6674 9092 \n", + "5 1999 Q1 6602 22718 5550 13581 9168 10224 \n", + "6 1999 Q2 5651 14775 3902 7883 7351 9672 \n", + " Product.7 Product.8\n", + "1 9178 10232 \n", + "2 6362 9540 \n", + "3 7965 12385 \n", + "4 6864 13098 \n", + "5 8908 10140 \n", + "6 7690 9948 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "## Clean missing value\n", + "\n", + "# Remove columns with only NA\n", + "\n", + "data <- Filter(function(x)!all(is.na(x)), data)\n", + "dim(data) # 56 10\n", + "\n", + "# Remove columns with too many NAs \n", + "\n", + "data <- Filter(function(x)!(sum(is.na(x))/length(x)) > 0.1, data)\n", + "dim(data) # 56 10\n", + "\n", + "# Remove rows with only missing values\n", + "\n", + "missingRows <- apply(data, 1, function(x) all(is.na(x)))\n", + "data <- data[!missingRows, ]\n", + "dim(data)\n", + "\n", + "# Replace NA values with last-observation-carried-forward method\n", + "\n", + "data[,3:10] <- lapply(data[,3:10], function(x) { \n", + " x <- na.locf(x)\n", + " x\n", + "})\n", + "\n", + "head(data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model building\n", + "\n", + "We aim to build a time series model to fit the whole product booking quantity data. \n", + "\n", + "### Hierachical time series model\n", + "\n", + "Hierarchical time series forecasting methods can be implemented in the hts package (Hyndman et al. 2014) for R (R Core Team 2013).\n", + "\n", + "We can use hts function to create a hierarchical time series. The required inputs are the bottom-level time series, and information about the hierarchical structure. Knowing from the product category dataset, we can try this hierarchical structure: the series for product 1 and 2 belong to category A, series for product 3-8 belong to the category B.\n", + "\n", + "Let's have a look at this 3-level hierarchical time series." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "
Product.1Product.2Product.3Product.4Product.5Product.6Product.7Product.8
7320 217824865 140549055 80169178 10232
6117 168814100 82375616 84616362 9540
6282 134954418 67318298 131757965 12385
6368 159635157 76756674 90926864 13098
6602 227185550 135819168 102248908 10140
5651 147753902 78837351 96727690 9948
\n" + ], + "text/latex": [ + "\\begin{tabular}{llllllll}\n", + " Product.1 & Product.2 & Product.3 & Product.4 & Product.5 & Product.6 & Product.7 & Product.8\\\\\n", + "\\hline\n", + "\t 7320 & 21782 & 4865 & 14054 & 9055 & 8016 & 9178 & 10232\\\\\n", + "\t 6117 & 16881 & 4100 & 8237 & 5616 & 8461 & 6362 & 9540\\\\\n", + "\t 6282 & 13495 & 4418 & 6731 & 8298 & 13175 & 7965 & 12385\\\\\n", + "\t 6368 & 15963 & 5157 & 7675 & 6674 & 9092 & 6864 & 13098\\\\\n", + "\t 6602 & 22718 & 5550 & 13581 & 9168 & 10224 & 8908 & 10140\\\\\n", + "\t 5651 & 14775 & 3902 & 7883 & 7351 & 9672 & 7690 & 9948\\\\\n", + "\\end{tabular}\n" + ], + "text/markdown": [ + "\n", + "Product.1 | Product.2 | Product.3 | Product.4 | Product.5 | Product.6 | Product.7 | Product.8 | \n", + "|---|---|---|---|---|---|\n", + "| 7320 | 21782 | 4865 | 14054 | 9055 | 8016 | 9178 | 10232 | \n", + "| 6117 | 16881 | 4100 | 8237 | 5616 | 8461 | 6362 | 9540 | \n", + "| 6282 | 13495 | 4418 | 6731 | 8298 | 13175 | 7965 | 12385 | \n", + "| 6368 | 15963 | 5157 | 7675 | 6674 | 9092 | 6864 | 13098 | \n", + "| 6602 | 22718 | 5550 | 13581 | 9168 | 10224 | 8908 | 10140 | \n", + "| 5651 | 14775 | 3902 | 7883 | 7351 | 9672 | 7690 | 9948 | \n", + "\n", + "\n" + ], + "text/plain": [ + " Product.1 Product.2 Product.3 Product.4 Product.5 Product.6 Product.7\n", + "[1,] 7320 21782 4865 14054 9055 8016 9178 \n", + "[2,] 6117 16881 4100 8237 5616 8461 6362 \n", + "[3,] 6282 13495 4418 6731 8298 13175 7965 \n", + "[4,] 6368 15963 5157 7675 6674 9092 6864 \n", + "[5,] 6602 22718 5550 13581 9168 10224 8908 \n", + "[6,] 5651 14775 3902 7883 7351 9672 7690 \n", + " Product.8\n", + "[1,] 10232 \n", + "[2,] 9540 \n", + "[3,] 12385 \n", + "[4,] 13098 \n", + "[5,] 10140 \n", + "[6,] 9948 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "## Hierarchical time series modeling \n", + "\n", + "# Construct time series matrix\n", + "\n", + "bts <- ts(data[, 3:10], frequency=4, start=c(1998, 1))\n", + "\n", + "head(bts)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Since argument characters are not specified, the default labelling system is used.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\t
$bts
\n", + "\t\t
\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "
Product.1Product.2Product.3Product.4Product.5Product.6Product.7Product.8
7320 217824865 140549055 8016 917810232
6117 168814100 82375616 8461 6362 9540
6282 134954418 67318298 13175 796512385
6368 159635157 76756674 9092 686413098
6602 227185550 135819168 10224 890810140
5651 147753902 78837351 9672 7690 9948
5710 146343970 65168322 14376 799810653
6509 156693825 68347017 10620 706810781
6589 204745706 125618706 96681048411462
5392 145224228 78017045 8885 7377 9217
7156 137614066 63938501 11980 696511586
8426 153784617 79766856 10241 836011005
6981 199605675 130007706 9460 7765 9842
6333 151524585 74787017 9804 719210412
6062 138064743 67548728 12406 7391 9946
6088 141255724 73148302 10667 732511901
5579 210475378 130459173 9915 900910786
5780 148353884 79046612 7600 7023 9888
5833 161984978 68087955 14730 782511221
5977 167485289 85218964 9950 731012892
6203 210105220 121939970 9952 811011205
5313 145274722 84607131 9448 717010420
5119 140954124 68868271 13691 702012189
5734 153094680 79387927 11110 712911835
6167 209574878 131869087 9279 966512619
5708 148134868 87236995 9161 7671 9040
5021 145904177 68078756 15078 739112017
5357 157734176 76358491 9616 788511291
5901 219535438 131299325 10281 892711040
4491 131463870 67446835 8853 6955 8741
5092 130254370 58208269 11874 786710523
5246 128354377 71116986 10990 6794 9051
6819 201395704 123979156 9528 801810885
5663 144335285 76007077 9417 8276 9769
4997 139124165 60497044 12744 7487 9546
5751 142944700 73938552 10930 7941 9989
6521 197744703 140718705 11103 999211372
4910 146824488 72867750 9958 8648 9675
4784 126514698 58008163 14211 765011555
5844 144755192 74727806 10207 793810270
6252 213005217 137688466 12449 859710963
5023 128744201 68446345 9091 6598 8786
5264 122165042 59117151 12049 791010870
4708 149385087 71608299 9095 7110 8281
5356 191484688 110177830 8918 8004 9417
4769 119674392 70545812 9174 6686 8082
4118 121994609 64607348 14094 6817 9758
5264 148664879 72166521 10465 7317 7991
6000 183144844 117917545 9350 8134 8657
4283 126534437 73196566 9266 7597 7583
5253 140234821 59907717 13311 625210167
5355 137854621 72457992 9915 6886 7722
6193 190215163 119106401 6335 7336 9915
5102 139894502 77697747 9348 6394 8055
5577 136274966 65747283 14285 726810919
5064 139514474 75717359 10112 7637 8726
\n", + "
\n", + "\t
$nodes
\n", + "\t\t
\n", + "\t
$`Level 1`
\n", + "\t\t
2
\n", + "\t
$`Level 2`
\n", + "\t\t
    \n", + "\t
  1. 2
  2. \n", + "\t
  3. 6
  4. \n", + "
\n", + "
\n", + "
\n", + "
\n", + "\t
$labels
\n", + "\t\t
\n", + "\t
$Total
\n", + "\t\t
'Total'
\n", + "\t
$Category
\n", + "\t\t
    \n", + "\t
  1. 'Category.A'
  2. \n", + "\t
  3. 'Category.B'
  4. \n", + "
\n", + "
\n", + "\t
$Product
\n", + "\t\t
    \n", + "\t
  1. 'Product.1'
  2. \n", + "\t
  3. 'Product.2'
  4. \n", + "\t
  5. 'Product.3'
  6. \n", + "\t
  7. 'Product.4'
  8. \n", + "\t
  9. 'Product.5'
  10. \n", + "\t
  11. 'Product.6'
  12. \n", + "\t
  13. 'Product.7'
  14. \n", + "\t
  15. 'Product.8'
  16. \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n" + ], + "text/latex": [ + "\\begin{description}\n", + "\\item[\\$bts] \\begin{tabular}{llllllll}\n", + " Product.1 & Product.2 & Product.3 & Product.4 & Product.5 & Product.6 & Product.7 & Product.8\\\\\n", + "\\hline\n", + "\t 7320 & 21782 & 4865 & 14054 & 9055 & 8016 & 9178 & 10232\\\\\n", + "\t 6117 & 16881 & 4100 & 8237 & 5616 & 8461 & 6362 & 9540\\\\\n", + "\t 6282 & 13495 & 4418 & 6731 & 8298 & 13175 & 7965 & 12385\\\\\n", + "\t 6368 & 15963 & 5157 & 7675 & 6674 & 9092 & 6864 & 13098\\\\\n", + "\t 6602 & 22718 & 5550 & 13581 & 9168 & 10224 & 8908 & 10140\\\\\n", + "\t 5651 & 14775 & 3902 & 7883 & 7351 & 9672 & 7690 & 9948\\\\\n", + "\t 5710 & 14634 & 3970 & 6516 & 8322 & 14376 & 7998 & 10653\\\\\n", + "\t 6509 & 15669 & 3825 & 6834 & 7017 & 10620 & 7068 & 10781\\\\\n", + "\t 6589 & 20474 & 5706 & 12561 & 8706 & 9668 & 10484 & 11462\\\\\n", + "\t 5392 & 14522 & 4228 & 7801 & 7045 & 8885 & 7377 & 9217\\\\\n", + "\t 7156 & 13761 & 4066 & 6393 & 8501 & 11980 & 6965 & 11586\\\\\n", + "\t 8426 & 15378 & 4617 & 7976 & 6856 & 10241 & 8360 & 11005\\\\\n", + "\t 6981 & 19960 & 5675 & 13000 & 7706 & 9460 & 7765 & 9842\\\\\n", + "\t 6333 & 15152 & 4585 & 7478 & 7017 & 9804 & 7192 & 10412\\\\\n", + "\t 6062 & 13806 & 4743 & 6754 & 8728 & 12406 & 7391 & 9946\\\\\n", + "\t 6088 & 14125 & 5724 & 7314 & 8302 & 10667 & 7325 & 11901\\\\\n", + "\t 5579 & 21047 & 5378 & 13045 & 9173 & 9915 & 9009 & 10786\\\\\n", + "\t 5780 & 14835 & 3884 & 7904 & 6612 & 7600 & 7023 & 9888\\\\\n", + "\t 5833 & 16198 & 4978 & 6808 & 7955 & 14730 & 7825 & 11221\\\\\n", + "\t 5977 & 16748 & 5289 & 8521 & 8964 & 9950 & 7310 & 12892\\\\\n", + "\t 6203 & 21010 & 5220 & 12193 & 9970 & 9952 & 8110 & 11205\\\\\n", + "\t 5313 & 14527 & 4722 & 8460 & 7131 & 9448 & 7170 & 10420\\\\\n", + "\t 5119 & 14095 & 4124 & 6886 & 8271 & 13691 & 7020 & 12189\\\\\n", + "\t 5734 & 15309 & 4680 & 7938 & 7927 & 11110 & 7129 & 11835\\\\\n", + "\t 6167 & 20957 & 4878 & 13186 & 9087 & 9279 & 9665 & 12619\\\\\n", + "\t 5708 & 14813 & 4868 & 8723 & 6995 & 9161 & 7671 & 9040\\\\\n", + "\t 5021 & 14590 & 4177 & 6807 & 8756 & 15078 & 7391 & 12017\\\\\n", + "\t 5357 & 15773 & 4176 & 7635 & 8491 & 9616 & 7885 & 11291\\\\\n", + "\t 5901 & 21953 & 5438 & 13129 & 9325 & 10281 & 8927 & 11040\\\\\n", + "\t 4491 & 13146 & 3870 & 6744 & 6835 & 8853 & 6955 & 8741\\\\\n", + "\t 5092 & 13025 & 4370 & 5820 & 8269 & 11874 & 7867 & 10523\\\\\n", + "\t 5246 & 12835 & 4377 & 7111 & 6986 & 10990 & 6794 & 9051\\\\\n", + "\t 6819 & 20139 & 5704 & 12397 & 9156 & 9528 & 8018 & 10885\\\\\n", + "\t 5663 & 14433 & 5285 & 7600 & 7077 & 9417 & 8276 & 9769\\\\\n", + "\t 4997 & 13912 & 4165 & 6049 & 7044 & 12744 & 7487 & 9546\\\\\n", + "\t 5751 & 14294 & 4700 & 7393 & 8552 & 10930 & 7941 & 9989\\\\\n", + "\t 6521 & 19774 & 4703 & 14071 & 8705 & 11103 & 9992 & 11372\\\\\n", + "\t 4910 & 14682 & 4488 & 7286 & 7750 & 9958 & 8648 & 9675\\\\\n", + "\t 4784 & 12651 & 4698 & 5800 & 8163 & 14211 & 7650 & 11555\\\\\n", + "\t 5844 & 14475 & 5192 & 7472 & 7806 & 10207 & 7938 & 10270\\\\\n", + "\t 6252 & 21300 & 5217 & 13768 & 8466 & 12449 & 8597 & 10963\\\\\n", + "\t 5023 & 12874 & 4201 & 6844 & 6345 & 9091 & 6598 & 8786\\\\\n", + "\t 5264 & 12216 & 5042 & 5911 & 7151 & 12049 & 7910 & 10870\\\\\n", + "\t 4708 & 14938 & 5087 & 7160 & 8299 & 9095 & 7110 & 8281\\\\\n", + "\t 5356 & 19148 & 4688 & 11017 & 7830 & 8918 & 8004 & 9417\\\\\n", + "\t 4769 & 11967 & 4392 & 7054 & 5812 & 9174 & 6686 & 8082\\\\\n", + "\t 4118 & 12199 & 4609 & 6460 & 7348 & 14094 & 6817 & 9758\\\\\n", + "\t 5264 & 14866 & 4879 & 7216 & 6521 & 10465 & 7317 & 7991\\\\\n", + "\t 6000 & 18314 & 4844 & 11791 & 7545 & 9350 & 8134 & 8657\\\\\n", + "\t 4283 & 12653 & 4437 & 7319 & 6566 & 9266 & 7597 & 7583\\\\\n", + "\t 5253 & 14023 & 4821 & 5990 & 7717 & 13311 & 6252 & 10167\\\\\n", + "\t 5355 & 13785 & 4621 & 7245 & 7992 & 9915 & 6886 & 7722\\\\\n", + "\t 6193 & 19021 & 5163 & 11910 & 6401 & 6335 & 7336 & 9915\\\\\n", + "\t 5102 & 13989 & 4502 & 7769 & 7747 & 9348 & 6394 & 8055\\\\\n", + "\t 5577 & 13627 & 4966 & 6574 & 7283 & 14285 & 7268 & 10919\\\\\n", + "\t 5064 & 13951 & 4474 & 7571 & 7359 & 10112 & 7637 & 8726\\\\\n", + "\\end{tabular}\n", + "\n", + "\\item[\\$nodes] \\begin{description}\n", + "\\item[\\$`Level 1`] 2\n", + "\\item[\\$`Level 2`] \\begin{enumerate*}\n", + "\\item 2\n", + "\\item 6\n", + "\\end{enumerate*}\n", + "\n", + "\\end{description}\n", + "\n", + "\\item[\\$labels] \\begin{description}\n", + "\\item[\\$Total] 'Total'\n", + "\\item[\\$Category] \\begin{enumerate*}\n", + "\\item 'Category.A'\n", + "\\item 'Category.B'\n", + "\\end{enumerate*}\n", + "\n", + "\\item[\\$Product] \\begin{enumerate*}\n", + "\\item 'Product.1'\n", + "\\item 'Product.2'\n", + "\\item 'Product.3'\n", + "\\item 'Product.4'\n", + "\\item 'Product.5'\n", + "\\item 'Product.6'\n", + "\\item 'Product.7'\n", + "\\item 'Product.8'\n", + "\\end{enumerate*}\n", + "\n", + "\\end{description}\n", + "\n", + "\\end{description}\n" + ], + "text/markdown": [ + "$bts\n", + ": \n", + "Product.1 | Product.2 | Product.3 | Product.4 | Product.5 | Product.6 | Product.7 | Product.8 | \n", + "|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n", + "| 7320 | 21782 | 4865 | 14054 | 9055 | 8016 | 9178 | 10232 | \n", + "| 6117 | 16881 | 4100 | 8237 | 5616 | 8461 | 6362 | 9540 | \n", + "| 6282 | 13495 | 4418 | 6731 | 8298 | 13175 | 7965 | 12385 | \n", + "| 6368 | 15963 | 5157 | 7675 | 6674 | 9092 | 6864 | 13098 | \n", + "| 6602 | 22718 | 5550 | 13581 | 9168 | 10224 | 8908 | 10140 | \n", + "| 5651 | 14775 | 3902 | 7883 | 7351 | 9672 | 7690 | 9948 | \n", + "| 5710 | 14634 | 3970 | 6516 | 8322 | 14376 | 7998 | 10653 | \n", + "| 6509 | 15669 | 3825 | 6834 | 7017 | 10620 | 7068 | 10781 | \n", + "| 6589 | 20474 | 5706 | 12561 | 8706 | 9668 | 10484 | 11462 | \n", + "| 5392 | 14522 | 4228 | 7801 | 7045 | 8885 | 7377 | 9217 | \n", + "| 7156 | 13761 | 4066 | 6393 | 8501 | 11980 | 6965 | 11586 | \n", + "| 8426 | 15378 | 4617 | 7976 | 6856 | 10241 | 8360 | 11005 | \n", + "| 6981 | 19960 | 5675 | 13000 | 7706 | 9460 | 7765 | 9842 | \n", + "| 6333 | 15152 | 4585 | 7478 | 7017 | 9804 | 7192 | 10412 | \n", + "| 6062 | 13806 | 4743 | 6754 | 8728 | 12406 | 7391 | 9946 | \n", + "| 6088 | 14125 | 5724 | 7314 | 8302 | 10667 | 7325 | 11901 | \n", + "| 5579 | 21047 | 5378 | 13045 | 9173 | 9915 | 9009 | 10786 | \n", + "| 5780 | 14835 | 3884 | 7904 | 6612 | 7600 | 7023 | 9888 | \n", + "| 5833 | 16198 | 4978 | 6808 | 7955 | 14730 | 7825 | 11221 | \n", + "| 5977 | 16748 | 5289 | 8521 | 8964 | 9950 | 7310 | 12892 | \n", + "| 6203 | 21010 | 5220 | 12193 | 9970 | 9952 | 8110 | 11205 | \n", + "| 5313 | 14527 | 4722 | 8460 | 7131 | 9448 | 7170 | 10420 | \n", + "| 5119 | 14095 | 4124 | 6886 | 8271 | 13691 | 7020 | 12189 | \n", + "| 5734 | 15309 | 4680 | 7938 | 7927 | 11110 | 7129 | 11835 | \n", + "| 6167 | 20957 | 4878 | 13186 | 9087 | 9279 | 9665 | 12619 | \n", + "| 5708 | 14813 | 4868 | 8723 | 6995 | 9161 | 7671 | 9040 | \n", + "| 5021 | 14590 | 4177 | 6807 | 8756 | 15078 | 7391 | 12017 | \n", + "| 5357 | 15773 | 4176 | 7635 | 8491 | 9616 | 7885 | 11291 | \n", + "| 5901 | 21953 | 5438 | 13129 | 9325 | 10281 | 8927 | 11040 | \n", + "| 4491 | 13146 | 3870 | 6744 | 6835 | 8853 | 6955 | 8741 | \n", + "| 5092 | 13025 | 4370 | 5820 | 8269 | 11874 | 7867 | 10523 | \n", + "| 5246 | 12835 | 4377 | 7111 | 6986 | 10990 | 6794 | 9051 | \n", + "| 6819 | 20139 | 5704 | 12397 | 9156 | 9528 | 8018 | 10885 | \n", + "| 5663 | 14433 | 5285 | 7600 | 7077 | 9417 | 8276 | 9769 | \n", + "| 4997 | 13912 | 4165 | 6049 | 7044 | 12744 | 7487 | 9546 | \n", + "| 5751 | 14294 | 4700 | 7393 | 8552 | 10930 | 7941 | 9989 | \n", + "| 6521 | 19774 | 4703 | 14071 | 8705 | 11103 | 9992 | 11372 | \n", + "| 4910 | 14682 | 4488 | 7286 | 7750 | 9958 | 8648 | 9675 | \n", + "| 4784 | 12651 | 4698 | 5800 | 8163 | 14211 | 7650 | 11555 | \n", + "| 5844 | 14475 | 5192 | 7472 | 7806 | 10207 | 7938 | 10270 | \n", + "| 6252 | 21300 | 5217 | 13768 | 8466 | 12449 | 8597 | 10963 | \n", + "| 5023 | 12874 | 4201 | 6844 | 6345 | 9091 | 6598 | 8786 | \n", + "| 5264 | 12216 | 5042 | 5911 | 7151 | 12049 | 7910 | 10870 | \n", + "| 4708 | 14938 | 5087 | 7160 | 8299 | 9095 | 7110 | 8281 | \n", + "| 5356 | 19148 | 4688 | 11017 | 7830 | 8918 | 8004 | 9417 | \n", + "| 4769 | 11967 | 4392 | 7054 | 5812 | 9174 | 6686 | 8082 | \n", + "| 4118 | 12199 | 4609 | 6460 | 7348 | 14094 | 6817 | 9758 | \n", + "| 5264 | 14866 | 4879 | 7216 | 6521 | 10465 | 7317 | 7991 | \n", + "| 6000 | 18314 | 4844 | 11791 | 7545 | 9350 | 8134 | 8657 | \n", + "| 4283 | 12653 | 4437 | 7319 | 6566 | 9266 | 7597 | 7583 | \n", + "| 5253 | 14023 | 4821 | 5990 | 7717 | 13311 | 6252 | 10167 | \n", + "| 5355 | 13785 | 4621 | 7245 | 7992 | 9915 | 6886 | 7722 | \n", + "| 6193 | 19021 | 5163 | 11910 | 6401 | 6335 | 7336 | 9915 | \n", + "| 5102 | 13989 | 4502 | 7769 | 7747 | 9348 | 6394 | 8055 | \n", + "| 5577 | 13627 | 4966 | 6574 | 7283 | 14285 | 7268 | 10919 | \n", + "| 5064 | 13951 | 4474 | 7571 | 7359 | 10112 | 7637 | 8726 | \n", + "\n", + "\n", + "\n", + "$nodes\n", + ": $`Level 1`\n", + ": 2\n", + "$`Level 2`\n", + ": 1. 2\n", + "2. 6\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "$labels\n", + ": $Total\n", + ": 'Total'\n", + "$Category\n", + ": 1. 'Category.A'\n", + "2. 'Category.B'\n", + "\n", + "\n", + "\n", + "$Product\n", + ": 1. 'Product.1'\n", + "2. 'Product.2'\n", + "3. 'Product.3'\n", + "4. 'Product.4'\n", + "5. 'Product.5'\n", + "6. 'Product.6'\n", + "7. 'Product.7'\n", + "8. 'Product.8'\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "$bts\n", + " Product.1 Product.2 Product.3 Product.4 Product.5 Product.6 Product.7\n", + "1998 Q1 7320 21782 4865 14054 9055 8016 9178\n", + "1998 Q2 6117 16881 4100 8237 5616 8461 6362\n", + "1998 Q3 6282 13495 4418 6731 8298 13175 7965\n", + "1998 Q4 6368 15963 5157 7675 6674 9092 6864\n", + "1999 Q1 6602 22718 5550 13581 9168 10224 8908\n", + "1999 Q2 5651 14775 3902 7883 7351 9672 7690\n", + "1999 Q3 5710 14634 3970 6516 8322 14376 7998\n", + "1999 Q4 6509 15669 3825 6834 7017 10620 7068\n", + "2000 Q1 6589 20474 5706 12561 8706 9668 10484\n", + "2000 Q2 5392 14522 4228 7801 7045 8885 7377\n", + "2000 Q3 7156 13761 4066 6393 8501 11980 6965\n", + "2000 Q4 8426 15378 4617 7976 6856 10241 8360\n", + "2001 Q1 6981 19960 5675 13000 7706 9460 7765\n", + "2001 Q2 6333 15152 4585 7478 7017 9804 7192\n", + "2001 Q3 6062 13806 4743 6754 8728 12406 7391\n", + "2001 Q4 6088 14125 5724 7314 8302 10667 7325\n", + "2002 Q1 5579 21047 5378 13045 9173 9915 9009\n", + "2002 Q2 5780 14835 3884 7904 6612 7600 7023\n", + "2002 Q3 5833 16198 4978 6808 7955 14730 7825\n", + "2002 Q4 5977 16748 5289 8521 8964 9950 7310\n", + "2003 Q1 6203 21010 5220 12193 9970 9952 8110\n", + "2003 Q2 5313 14527 4722 8460 7131 9448 7170\n", + "2003 Q3 5119 14095 4124 6886 8271 13691 7020\n", + "2003 Q4 5734 15309 4680 7938 7927 11110 7129\n", + "2004 Q1 6167 20957 4878 13186 9087 9279 9665\n", + "2004 Q2 5708 14813 4868 8723 6995 9161 7671\n", + "2004 Q3 5021 14590 4177 6807 8756 15078 7391\n", + "2004 Q4 5357 15773 4176 7635 8491 9616 7885\n", + "2005 Q1 5901 21953 5438 13129 9325 10281 8927\n", + "2005 Q2 4491 13146 3870 6744 6835 8853 6955\n", + "2005 Q3 5092 13025 4370 5820 8269 11874 7867\n", + "2005 Q4 5246 12835 4377 7111 6986 10990 6794\n", + "2006 Q1 6819 20139 5704 12397 9156 9528 8018\n", + "2006 Q2 5663 14433 5285 7600 7077 9417 8276\n", + "2006 Q3 4997 13912 4165 6049 7044 12744 7487\n", + "2006 Q4 5751 14294 4700 7393 8552 10930 7941\n", + "2007 Q1 6521 19774 4703 14071 8705 11103 9992\n", + "2007 Q2 4910 14682 4488 7286 7750 9958 8648\n", + "2007 Q3 4784 12651 4698 5800 8163 14211 7650\n", + "2007 Q4 5844 14475 5192 7472 7806 10207 7938\n", + "2008 Q1 6252 21300 5217 13768 8466 12449 8597\n", + "2008 Q2 5023 12874 4201 6844 6345 9091 6598\n", + "2008 Q3 5264 12216 5042 5911 7151 12049 7910\n", + "2008 Q4 4708 14938 5087 7160 8299 9095 7110\n", + "2009 Q1 5356 19148 4688 11017 7830 8918 8004\n", + "2009 Q2 4769 11967 4392 7054 5812 9174 6686\n", + "2009 Q3 4118 12199 4609 6460 7348 14094 6817\n", + "2009 Q4 5264 14866 4879 7216 6521 10465 7317\n", + "2010 Q1 6000 18314 4844 11791 7545 9350 8134\n", + "2010 Q2 4283 12653 4437 7319 6566 9266 7597\n", + "2010 Q3 5253 14023 4821 5990 7717 13311 6252\n", + "2010 Q4 5355 13785 4621 7245 7992 9915 6886\n", + "2011 Q1 6193 19021 5163 11910 6401 6335 7336\n", + "2011 Q2 5102 13989 4502 7769 7747 9348 6394\n", + "2011 Q3 5577 13627 4966 6574 7283 14285 7268\n", + "2011 Q4 5064 13951 4474 7571 7359 10112 7637\n", + " Product.8\n", + "1998 Q1 10232\n", + "1998 Q2 9540\n", + "1998 Q3 12385\n", + "1998 Q4 13098\n", + "1999 Q1 10140\n", + "1999 Q2 9948\n", + "1999 Q3 10653\n", + "1999 Q4 10781\n", + "2000 Q1 11462\n", + "2000 Q2 9217\n", + "2000 Q3 11586\n", + "2000 Q4 11005\n", + "2001 Q1 9842\n", + "2001 Q2 10412\n", + "2001 Q3 9946\n", + "2001 Q4 11901\n", + "2002 Q1 10786\n", + "2002 Q2 9888\n", + "2002 Q3 11221\n", + "2002 Q4 12892\n", + "2003 Q1 11205\n", + "2003 Q2 10420\n", + "2003 Q3 12189\n", + "2003 Q4 11835\n", + "2004 Q1 12619\n", + "2004 Q2 9040\n", + "2004 Q3 12017\n", + "2004 Q4 11291\n", + "2005 Q1 11040\n", + "2005 Q2 8741\n", + "2005 Q3 10523\n", + "2005 Q4 9051\n", + "2006 Q1 10885\n", + "2006 Q2 9769\n", + "2006 Q3 9546\n", + "2006 Q4 9989\n", + "2007 Q1 11372\n", + "2007 Q2 9675\n", + "2007 Q3 11555\n", + "2007 Q4 10270\n", + "2008 Q1 10963\n", + "2008 Q2 8786\n", + "2008 Q3 10870\n", + "2008 Q4 8281\n", + "2009 Q1 9417\n", + "2009 Q2 8082\n", + "2009 Q3 9758\n", + "2009 Q4 7991\n", + "2010 Q1 8657\n", + "2010 Q2 7583\n", + "2010 Q3 10167\n", + "2010 Q4 7722\n", + "2011 Q1 9915\n", + "2011 Q2 8055\n", + "2011 Q3 10919\n", + "2011 Q4 8726\n", + "\n", + "$nodes\n", + "$nodes$`Level 1`\n", + "[1] 2\n", + "\n", + "$nodes$`Level 2`\n", + "[1] 2 6\n", + "\n", + "\n", + "$labels\n", + "$labels$Total\n", + "[1] \"Total\"\n", + "\n", + "$labels$Category\n", + "[1] \"Category.A\" \"Category.B\"\n", + "\n", + "$labels$Product\n", + "[1] \"Product.1\" \"Product.2\" \"Product.3\" \"Product.4\" \"Product.5\" \"Product.6\"\n", + "[7] \"Product.7\" \"Product.8\"\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hierarchical Time Series \n", + "3 Levels \n", + "Number of nodes at each level: 1 2 8 \n", + "Total number of series: 11 \n", + "Number of observations per series: 56 \n", + "Top level series: \n", + " Qtr1 Qtr2 Qtr3 Qtr4\n", + "1998 84502 65314 72749 70891\n", + "1999 86891 66872 72179 68323\n", + "2000 85650 64467 70408 72859\n", + "2001 80389 67973 69836 71446\n", + "2002 83932 63526 75548 75651\n", + "2003 83863 67191 71395 71662\n", + "2004 85838 66979 73837 70224\n", + "2005 85994 59635 66840 63390\n", + "2006 82646 67520 65944 69550\n", + "2007 86241 67397 69512 69204\n", + "2008 87012 59762 66413 64678\n", + "2009 74378 57936 65403 64519\n", + "2010 74635 59704 67534 63521\n", + "2011 72274 62906 70499 64894\n" + ] + } + ], + "source": [ + "# Create 3-level hierarchical time series\n", + "\n", + "demandgts <- hts(bts, nodes=list(2, c(2, 6)))\n", + "\n", + "# Rename the nodes of the hierarchy\n", + "\n", + "demandgts$labels$`Level 1` <- c(\"Category.A\", \"Category.B\")\n", + "demandgts$labels$`Level 2` <- c(\"Product.1\", \"Product.2\", \"Product.3\", \"Product.4\", \n", + " \"Product.5\", \"Product.6\", \"Product.7\", \"Product.8\")\n", + "names(demandgts$labels) <- c(\"Total\", \"Category\", \"Product\")\n", + "\n", + "head(demandgts)\n", + "print(demandgts)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "
TotalCategory.ACategory.BProduct.1Product.2Product.3Product.4Product.5Product.6Product.7Product.8
8450229102554007320 217824865 140549055 80169178 10232
6531422998423166117 168814100 82375616 84616362 9540
7274919777529726282 134954418 67318298 131757965 12385
7089122331485606368 159635157 76756674 90926864 13098
8689129320575716602 227185550 135819168 102248908 10140
6687220426464465651 147753902 78837351 96727690 9948
\n" + ], + "text/latex": [ + "\\begin{tabular}{lllllllllll}\n", + " Total & Category.A & Category.B & Product.1 & Product.2 & Product.3 & Product.4 & Product.5 & Product.6 & Product.7 & Product.8\\\\\n", + "\\hline\n", + "\t 84502 & 29102 & 55400 & 7320 & 21782 & 4865 & 14054 & 9055 & 8016 & 9178 & 10232\\\\\n", + "\t 65314 & 22998 & 42316 & 6117 & 16881 & 4100 & 8237 & 5616 & 8461 & 6362 & 9540\\\\\n", + "\t 72749 & 19777 & 52972 & 6282 & 13495 & 4418 & 6731 & 8298 & 13175 & 7965 & 12385\\\\\n", + "\t 70891 & 22331 & 48560 & 6368 & 15963 & 5157 & 7675 & 6674 & 9092 & 6864 & 13098\\\\\n", + "\t 86891 & 29320 & 57571 & 6602 & 22718 & 5550 & 13581 & 9168 & 10224 & 8908 & 10140\\\\\n", + "\t 66872 & 20426 & 46446 & 5651 & 14775 & 3902 & 7883 & 7351 & 9672 & 7690 & 9948\\\\\n", + "\\end{tabular}\n" + ], + "text/markdown": [ + "\n", + "Total | Category.A | Category.B | Product.1 | Product.2 | Product.3 | Product.4 | Product.5 | Product.6 | Product.7 | Product.8 | \n", + "|---|---|---|---|---|---|\n", + "| 84502 | 29102 | 55400 | 7320 | 21782 | 4865 | 14054 | 9055 | 8016 | 9178 | 10232 | \n", + "| 65314 | 22998 | 42316 | 6117 | 16881 | 4100 | 8237 | 5616 | 8461 | 6362 | 9540 | \n", + "| 72749 | 19777 | 52972 | 6282 | 13495 | 4418 | 6731 | 8298 | 13175 | 7965 | 12385 | \n", + "| 70891 | 22331 | 48560 | 6368 | 15963 | 5157 | 7675 | 6674 | 9092 | 6864 | 13098 | \n", + "| 86891 | 29320 | 57571 | 6602 | 22718 | 5550 | 13581 | 9168 | 10224 | 8908 | 10140 | \n", + "| 66872 | 20426 | 46446 | 5651 | 14775 | 3902 | 7883 | 7351 | 9672 | 7690 | 9948 | \n", + "\n", + "\n" + ], + "text/plain": [ + " Total Category.A Category.B Product.1 Product.2 Product.3 Product.4\n", + "[1,] 84502 29102 55400 7320 21782 4865 14054 \n", + "[2,] 65314 22998 42316 6117 16881 4100 8237 \n", + "[3,] 72749 19777 52972 6282 13495 4418 6731 \n", + "[4,] 70891 22331 48560 6368 15963 5157 7675 \n", + "[5,] 86891 29320 57571 6602 22718 5550 13581 \n", + "[6,] 66872 20426 46446 5651 14775 3902 7883 \n", + " Product.5 Product.6 Product.7 Product.8\n", + "[1,] 9055 8016 9178 10232 \n", + "[2,] 5616 8461 6362 9540 \n", + "[3,] 8298 13175 7965 12385 \n", + "[4,] 6674 9092 6864 13098 \n", + "[5,] 9168 10224 8908 10140 \n", + "[6,] 7351 9672 7690 9948 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Aggregate the hierarchy time series\n", + "\n", + "alldemand <- aggts(demandgts) \n", + "\n", + "head(alldemand)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nClAkQhT4f9xeT1ky35u0AAAAAElFTkSuQmCC", + "text/plain": [ + "Plot with title \"Product\"" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(demandgts, levels=c(0, 1, 2))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Set up the training sample and testing sample\n", + "\n", + "traingts <- window(demandgts, start=c(1998, 1), end=c(2009, 4))\n", + "testgts <- window(demandgts, start=c(2010, 1), end=c(2011, 4))\n", + "\n", + "demandfcast <- forecast(object = traingts, \n", + " h = 8, \n", + " method = \"bu\", \n", + " fmethod = \"arima\",\n", + " keep.fitted = TRUE)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "
TotalCategory.ACategory.BProduct.1Product.2Product.3Product.4Product.5Product.6Product.7Product.8
80910.32 25503.27 55407.04 5664.790 19838.48 4517.327 12756.5308421.304 10418.5419269.589 10023.754
60955.16 17453.11 43502.04 4556.185 12896.93 4580.720 7140.0956485.093 9190.6377737.238 8368.259
65529.24 16506.67 49022.56 4515.956 11990.72 4599.585 6089.0737538.714 13150.7837595.421 10048.987
65158.95 19359.68 45799.27 5017.735 14341.94 4764.995 7330.3157478.676 10180.7827597.098 8447.406
79841.63 25218.80 54622.83 5390.090 19828.71 4715.358 13041.3238421.304 10051.8628528.523 9864.458
59045.18 16654.93 42390.25 4417.989 12236.94 4715.358 6991.2946485.093 9186.5726802.969 8208.963
65235.18 16124.68 49110.50 4377.760 11746.92 4715.358 6046.0437538.714 13381.2727539.418 9889.692
64429.14 19211.76 45217.38 4879.539 14332.22 4715.358 7237.6037478.676 10250.2357247.400 8288.111
\n" + ], + "text/latex": [ + "\\begin{tabular}{lllllllllll}\n", + " Total & Category.A & Category.B & Product.1 & Product.2 & Product.3 & Product.4 & Product.5 & Product.6 & Product.7 & Product.8\\\\\n", + "\\hline\n", + "\t 80910.32 & 25503.27 & 55407.04 & 5664.790 & 19838.48 & 4517.327 & 12756.530 & 8421.304 & 10418.541 & 9269.589 & 10023.754\\\\\n", + "\t 60955.16 & 17453.11 & 43502.04 & 4556.185 & 12896.93 & 4580.720 & 7140.095 & 6485.093 & 9190.637 & 7737.238 & 8368.259\\\\\n", + "\t 65529.24 & 16506.67 & 49022.56 & 4515.956 & 11990.72 & 4599.585 & 6089.073 & 7538.714 & 13150.783 & 7595.421 & 10048.987\\\\\n", + "\t 65158.95 & 19359.68 & 45799.27 & 5017.735 & 14341.94 & 4764.995 & 7330.315 & 7478.676 & 10180.782 & 7597.098 & 8447.406\\\\\n", + "\t 79841.63 & 25218.80 & 54622.83 & 5390.090 & 19828.71 & 4715.358 & 13041.323 & 8421.304 & 10051.862 & 8528.523 & 9864.458\\\\\n", + "\t 59045.18 & 16654.93 & 42390.25 & 4417.989 & 12236.94 & 4715.358 & 6991.294 & 6485.093 & 9186.572 & 6802.969 & 8208.963\\\\\n", + "\t 65235.18 & 16124.68 & 49110.50 & 4377.760 & 11746.92 & 4715.358 & 6046.043 & 7538.714 & 13381.272 & 7539.418 & 9889.692\\\\\n", + "\t 64429.14 & 19211.76 & 45217.38 & 4879.539 & 14332.22 & 4715.358 & 7237.603 & 7478.676 & 10250.235 & 7247.400 & 8288.111\\\\\n", + "\\end{tabular}\n" + ], + "text/markdown": [ + "\n", + "Total | Category.A | Category.B | Product.1 | Product.2 | Product.3 | Product.4 | Product.5 | Product.6 | Product.7 | Product.8 | \n", + "|---|---|---|---|---|---|---|---|\n", + "| 80910.32 | 25503.27 | 55407.04 | 5664.790 | 19838.48 | 4517.327 | 12756.530 | 8421.304 | 10418.541 | 9269.589 | 10023.754 | \n", + "| 60955.16 | 17453.11 | 43502.04 | 4556.185 | 12896.93 | 4580.720 | 7140.095 | 6485.093 | 9190.637 | 7737.238 | 8368.259 | \n", + "| 65529.24 | 16506.67 | 49022.56 | 4515.956 | 11990.72 | 4599.585 | 6089.073 | 7538.714 | 13150.783 | 7595.421 | 10048.987 | \n", + "| 65158.95 | 19359.68 | 45799.27 | 5017.735 | 14341.94 | 4764.995 | 7330.315 | 7478.676 | 10180.782 | 7597.098 | 8447.406 | \n", + "| 79841.63 | 25218.80 | 54622.83 | 5390.090 | 19828.71 | 4715.358 | 13041.323 | 8421.304 | 10051.862 | 8528.523 | 9864.458 | \n", + "| 59045.18 | 16654.93 | 42390.25 | 4417.989 | 12236.94 | 4715.358 | 6991.294 | 6485.093 | 9186.572 | 6802.969 | 8208.963 | \n", + "| 65235.18 | 16124.68 | 49110.50 | 4377.760 | 11746.92 | 4715.358 | 6046.043 | 7538.714 | 13381.272 | 7539.418 | 9889.692 | \n", + "| 64429.14 | 19211.76 | 45217.38 | 4879.539 | 14332.22 | 4715.358 | 7237.603 | 7478.676 | 10250.235 | 7247.400 | 8288.111 | \n", + "\n", + "\n" + ], + "text/plain": [ + " Total Category.A Category.B Product.1 Product.2 Product.3 Product.4\n", + "[1,] 80910.32 25503.27 55407.04 5664.790 19838.48 4517.327 12756.530\n", + "[2,] 60955.16 17453.11 43502.04 4556.185 12896.93 4580.720 7140.095\n", + "[3,] 65529.24 16506.67 49022.56 4515.956 11990.72 4599.585 6089.073\n", + "[4,] 65158.95 19359.68 45799.27 5017.735 14341.94 4764.995 7330.315\n", + "[5,] 79841.63 25218.80 54622.83 5390.090 19828.71 4715.358 13041.323\n", + "[6,] 59045.18 16654.93 42390.25 4417.989 12236.94 4715.358 6991.294\n", + "[7,] 65235.18 16124.68 49110.50 4377.760 11746.92 4715.358 6046.043\n", + "[8,] 64429.14 19211.76 45217.38 4879.539 14332.22 4715.358 7237.603\n", + " Product.5 Product.6 Product.7 Product.8\n", + "[1,] 8421.304 10418.541 9269.589 10023.754\n", + "[2,] 6485.093 9190.637 7737.238 8368.259\n", + "[3,] 7538.714 13150.783 7595.421 10048.987\n", + "[4,] 7478.676 10180.782 7597.098 8447.406\n", + "[5,] 8421.304 10051.862 8528.523 9864.458\n", + "[6,] 6485.093 9186.572 6802.969 8208.963\n", + "[7,] 7538.714 13381.272 7539.418 9889.692\n", + "[8,] 7478.676 10250.235 7247.400 8288.111" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Explore and visualize the forecasted hts\n", + "\n", + "aggts(demandfcast)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hierarchical Time Series \n", + "3 Levels \n", + "Number of nodes at each level: 1 2 8 \n", + "Total number of series: 11 \n", + "Number of observations in each historical series: 48 \n", + "Number of forecasts per series: 8 \n", + "Top level series of forecasts: \n", + " Qtr1 Qtr2 Qtr3 Qtr4\n", + "2010 80910.32 60955.16 65529.24 65158.95\n", + "2011 79841.63 59045.18 65235.18 64429.14\n", + "\n", + "Method: Bottom-up forecasts \n", + "Forecast method: Arima \n", + "In-sample error measures at the bottom level: \n", + " Product.1 Product.2 Product.3 Product.4 Product.5 Product.6\n", + "ME 1.8928374 -4.8896114 -1.2204182 -142.3460472 -14.0070931 228.3550637\n", + "RMSE 499.0780725 964.9571426 478.7228408 628.7161059 698.1542998 900.4151901\n", + "MAE 382.1519945 729.0429985 397.0558637 441.4047924 512.9018563 683.3038439\n", + "MAPE 6.5989311 4.7198640 8.5556556 5.2848997 6.7025632 6.1783808\n", + "MPE -0.6422800 -0.3170459 -1.0771666 -1.9827212 -0.6736957 1.7844811\n", + "MASE 0.6440435 0.7252355 0.8330373 0.8035503 0.7797554 0.5915236\n", + " Product.7 Product.8\n", + "ME -13.8547048 -8.7052069\n", + "RMSE 673.2750519 964.8422175\n", + "MAE 511.9939875 768.0957031\n", + "MAPE 6.5367455 7.4557366\n", + "MPE -0.6566870 -0.7626077\n", + "MASE 0.6766102 0.7945506\n" + ] + } + ], + "source": [ + "summary(demandfcast)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nImWVzDnSJaFI0fJBSol0uD9ZfC1qEwlPXrABWTNIjkiXpC6PKhMp6zZDkS5JZSKBnFUkLjaQ\nTSm9ep9TOJe/yeE4rUgckciW1PY8+Q3nSORwVPY4uYcikcNBkQiRoLLHYG8oEjkeJxWJiw1k\nW+rziMvf5ICcVaR3Io5I5MpIzZEaT2KKRC4BRSJEAIpEiABiy9+zTXh+Qg5P8eVvQi6BhEhH\n5dSNs7hWa2trbmXVkeXUjbO4Vmtra25l1ZHl1I2zuFZra2tuZdWR5dSNs7hWa2trbmXVkeXU\njbO4Vmtra25l1ZHl1I2zuFZra2tuZdWR5dSNs7hWa2trbmXVkeXUjbO4Vmtra25l1SHkmFAk\nQgSgSIQIQJEIEYAiESIARSJEAIpEiAAUiRABKBIhAlAkQgQ4m0jjLwU7X86Ht7VXaO70x0Tq\naG0NdRBk/Dstzpfz4W7mGVvaY17OJvTnrbamgiqIcxmReq4jUo/aTopUlmuLdNqGDqiXkyKV\n5eIiVTJpKARF2oymu5JI12qt0tyOIpVFObsX6Fp2azvl5XTo6lCkgqin+fwiOVrbKS9no7F/\n1HJxK6iCKOoDhvOLdK3W6s3tKFJBpj/TfI0HstdqrdncSaI6mltDHQg5PBSJEAEoEiECUCRC\nBKBIhAhAkQgRgCIRIgBFIkQAikSIABSJEAEoEiECUCRCBKBIhAhAkQgRgCIRIgBFIkQAikSI\nABSJEAEoEiECUCRCBKBIhAhAkQgRgCIRIgBFIkQAikSIABSJEAEoEiECUCRCBKBIhAhAkQgR\ngCIRIgBFIkQAikSIABSJEAEoEiECUCRCBKBIhAhAkQgRgCIRIgBFIkQAikSIABSJEAEoEiEC\nUCRCBKBIhAhAkQgRgCLVx3/fmubj79/qpp/f9qoMSYMiVcffTc/HL2Vbw+tUObxAtfGzaf79\n/PlX85eykSLVDi9QbXx/e9R1v779/Pz570fTfP/V9UNU1/340nz58d75+ebbr16uX9/7BG/V\n/vv40nz0RXzwqm4OT3ltfGmW2dG/vUHfRpF+9i8/u+HNl7dIvz/6KPB31yf59nfz32eu/5q/\n96v+VaFItaFGcR/Nj64fefqN3z8l+tl8f7/5+/2jec+npo9N80/3+2fzpXur+HOvyl8XilQb\n+nToxz9/zSJ9DIsQ70+fQ9Dv97aP4d20rXfopza7IttAkWrjQwntfnyMs6NepGE1b/rUud79\n+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\nm4ck9XY5ezSapA1LzgnJsMOsyyCSMp4+rAu2FLyMAn1ac/5ijndTpV0iPdxfe9MW+9tu6KGa\n3K1WI/Vpl3pCh2a4e53yPdzxRtYnt8K01pzP9o+xh4hwqc9wI2wzTJrSP3zTPN1sqxsBVD0i\n9f+prVv60Xwnca8QvTuI9m1QJagwPRp7ojnFeKo9bjCpvzEuh3WGDrZIU3Cn3NaNPm7FpVN8\naXQZz2rYuCDQqTPzseO4+pxy6LFzPrT7kjn10dYnZi+UGtkYMas/KrNMGuuj3SbniDcyp/Kh\nnZVF7G5a4V1qE1mZCLHbYkPCNxv6L4LrrVMCp2EByrfS+jmFNrvh9GD/YQswmqTseH56pBbw\nnAKWZThJ9EibVKtDz9wQOy6dFzzUJkwm2ged5zRjofOY5+xyj7ldy33hsazH20sI+kqfNuX0\n9ekUwYYa6JsfRsXUEXiJavNN6sZJ4Rh4ml3EcUnfN2A1i48qVu2UbzbMq3bztxyMIUmN1hwr\ndjP61R8yPIZO4hZJ2/7sS9eG/WmUGC/y/a523+UW7eznD7UCY0PGLukKOfqqKI9kOuWd8565\nrBgoAa1bo24ZkoyVzvF4nlmY1RnVSll4Ij5HzbX4cBx6lthSWy6cawaIZJxEI7q0xXZsnafZ\nQWpeteue/as2JKnDySPUt3rME/XO7RiQluho5Dlaqk5Wnsv7IYpX/elmo1zVmL50sdwB5wVi\nd90f1tdvZyvcGVp9ct4FNOqmE6cfezik0yPLpKhH7h3uhYklgjYWLR/WM7x2TOOW2n027elw\npEZK5GueoZBLNc+Rplf1YWur3qLVlS43Znd6PJwedePTlPFcPadF4nbe23WLSb1K/eMVvfS7\nr/O24xR6idWi99TFyvv4IyDqVH2l5OAB2mG9xjzke5LV+nvjXfsUOYhrV0SkKaxTauQaGg2T\n2vm7JJ+zYteQ56+jp/7Liq+eN3RrqnvV7vO177zLkKRMqIcFrIdnhFmwBiVPuvGG/g6NnsvF\n6rdO4cBTST0tdSgjQOA8t8sSwn3+kcBDIZxyOQn3LnbN56Uxa2vrW7hqVdQjebF3+u4yD3Uq\nZHyLw0w7VFNp33iB+tUb9wGMkTrOKJLZryIlVC7S56RfnWMsMcbYrPYRHJCUlJ6PjuRPNXxo\n1Uv7fDrSDx03XGw7/+gzgJNlLPk9qtH7tDnvPp/34ODZvAc+RRIHkrePeQ1J18g3vjyWncPn\n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", + "text/plain": [ + "Plot with title \"Product\"" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(demandfcast)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "
TotalCategory.ACategory.BProduct.1Product.2Product.3Product.4Product.5Product.6Product.7Product.8
ME-642.2230633 769.636570 -1411.8596334500.869555 268.767016 62.9927473 -57.9094758 -154.696664 -486.0854327 -601.7071073 -174.453701
RMSE4297.4666959 1762.617949 3417.5795191654.667459 1333.511536 265.5443482 637.9615525 923.545538 1410.7055499 824.2037457 733.337312
MAE3540.7892002 1301.541868 2479.5780546569.165681 1147.337404 248.6004751 512.4007731 663.302664 811.2695039 699.1071823 583.391671
MAPE 5.1052214 6.663495 5.2033361 10.476458 7.760610 5.1928806 5.6760678 9.321062 10.5272499 9.8886736 6.695530
MPE -0.7830154 4.126951 -2.9651999 8.881871 2.442825 1.0706089 0.5462723 -2.757447 -8.0096851 -8.6133027 -2.666663
MASE 1.0928975 1.050883 0.9203532 0.959219 1.141345 0.5215726 0.9327941 1.008407 0.7023011 0.9238839 0.603485
\n" + ], + "text/latex": [ + "\\begin{tabular}{r|lllllllllll}\n", + " & Total & Category.A & Category.B & Product.1 & Product.2 & Product.3 & Product.4 & Product.5 & Product.6 & Product.7 & Product.8\\\\\n", + "\\hline\n", + "\tME & -642.2230633 & 769.636570 & -1411.8596334 & 500.869555 & 268.767016 & 62.9927473 & -57.9094758 & -154.696664 & -486.0854327 & -601.7071073 & -174.453701 \\\\\n", + "\tRMSE & 4297.4666959 & 1762.617949 & 3417.5795191 & 654.667459 & 1333.511536 & 265.5443482 & 637.9615525 & 923.545538 & 1410.7055499 & 824.2037457 & 733.337312 \\\\\n", + "\tMAE & 3540.7892002 & 1301.541868 & 2479.5780546 & 569.165681 & 1147.337404 & 248.6004751 & 512.4007731 & 663.302664 & 811.2695039 & 699.1071823 & 583.391671 \\\\\n", + "\tMAPE & 5.1052214 & 6.663495 & 5.2033361 & 10.476458 & 7.760610 & 5.1928806 & 5.6760678 & 9.321062 & 10.5272499 & 9.8886736 & 6.695530 \\\\\n", + "\tMPE & -0.7830154 & 4.126951 & -2.9651999 & 8.881871 & 2.442825 & 1.0706089 & 0.5462723 & -2.757447 & -8.0096851 & -8.6133027 & -2.666663 \\\\\n", + "\tMASE & 1.0928975 & 1.050883 & 0.9203532 & 0.959219 & 1.141345 & 0.5215726 & 0.9327941 & 1.008407 & 0.7023011 & 0.9238839 & 0.603485 \\\\\n", + "\\end{tabular}\n" + ], + "text/markdown": [ + "\n", + "| | Total | Category.A | Category.B | Product.1 | Product.2 | Product.3 | Product.4 | Product.5 | Product.6 | Product.7 | Product.8 | \n", + "|---|---|---|---|---|---|\n", + "| ME | -642.2230633 | 769.636570 | -1411.8596334 | 500.869555 | 268.767016 | 62.9927473 | -57.9094758 | -154.696664 | -486.0854327 | -601.7071073 | -174.453701 | \n", + "| RMSE | 4297.4666959 | 1762.617949 | 3417.5795191 | 654.667459 | 1333.511536 | 265.5443482 | 637.9615525 | 923.545538 | 1410.7055499 | 824.2037457 | 733.337312 | \n", + "| MAE | 3540.7892002 | 1301.541868 | 2479.5780546 | 569.165681 | 1147.337404 | 248.6004751 | 512.4007731 | 663.302664 | 811.2695039 | 699.1071823 | 583.391671 | \n", + "| MAPE | 5.1052214 | 6.663495 | 5.2033361 | 10.476458 | 7.760610 | 5.1928806 | 5.6760678 | 9.321062 | 10.5272499 | 9.8886736 | 6.695530 | \n", + "| MPE | -0.7830154 | 4.126951 | -2.9651999 | 8.881871 | 2.442825 | 1.0706089 | 0.5462723 | -2.757447 | -8.0096851 | -8.6133027 | -2.666663 | \n", + "| MASE | 1.0928975 | 1.050883 | 0.9203532 | 0.959219 | 1.141345 | 0.5215726 | 0.9327941 | 1.008407 | 0.7023011 | 0.9238839 | 0.603485 | \n", + "\n", + "\n" + ], + "text/plain": [ + " Total Category.A Category.B Product.1 Product.2 Product.3 \n", + "ME -642.2230633 769.636570 -1411.8596334 500.869555 268.767016 62.9927473\n", + "RMSE 4297.4666959 1762.617949 3417.5795191 654.667459 1333.511536 265.5443482\n", + "MAE 3540.7892002 1301.541868 2479.5780546 569.165681 1147.337404 248.6004751\n", + "MAPE 5.1052214 6.663495 5.2033361 10.476458 7.760610 5.1928806\n", + "MPE -0.7830154 4.126951 -2.9651999 8.881871 2.442825 1.0706089\n", + "MASE 1.0928975 1.050883 0.9203532 0.959219 1.141345 0.5215726\n", + " Product.4 Product.5 Product.6 Product.7 Product.8 \n", + "ME -57.9094758 -154.696664 -486.0854327 -601.7071073 -174.453701\n", + "RMSE 637.9615525 923.545538 1410.7055499 824.2037457 733.337312\n", + "MAE 512.4007731 663.302664 811.2695039 699.1071823 583.391671\n", + "MAPE 5.6760678 9.321062 10.5272499 9.8886736 6.695530\n", + "MPE 0.5462723 -2.757447 -8.0096851 -8.6133027 -2.666663\n", + "MASE 0.9327941 1.008407 0.7023011 0.9238839 0.603485" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Calculate perforemance metrics\n", + "\n", + "accuracy.gts(demandfcast, testgts, levels=c(0, 1, 2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cross-validation for hierarchical time series\n", + "\n", + "Next, we use cross validation to compare performance of different forecast methods for hierarchical time series model." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "## Time series cross validation\n", + "\n", + "# Define function that runs hierarchical forecast on training data set\n", + "# and returns forecast on test data set\n", + "\n", + "forecast_hts <- function (traindata, testdata, htsmethod, tsmethod) {\n", + " \n", + " # Forecasting horizon\n", + " \n", + " horiz = dim(aggts(testdata))[1]\n", + "\n", + " # Run hierarchical forecast\n", + " \n", + " hts_fcast <- forecast(object = traindata, \n", + " h = horiz,\n", + " method = htsmethod,\n", + " fmethod = tsmethod,\n", + " keep.fitted = TRUE)\n", + " \n", + " # Return forecasted ts\n", + " \n", + " hts_fcast\n", + " \n", + " # Return evaluation metrics at the top level\n", + " #fcast_acc <- accuracy.gts(hts_fcast, test = testdata, levels = 0)\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning message:\n", + "\"executing %dopar% sequentially: no parallel backend registered\"Warning message in window.default(x, ...):\n", + "\"'end' value not changed\"Warning message in window.default(x, ...):\n", + "\"'end' value not changed\"" + ] + } + ], + "source": [ + "# Set parameters for cross validation\n", + "\n", + "k <- 48 \n", + "n <- dim(demandgts$bts)[1]\n", + "st <- tsp(demandgts$bts)[1]+(k-2)/4\n", + "\n", + "# Define parameter space for hts\n", + "\n", + "hts_method <- c(\"bu\", \"comb\", \"tdgsa\")\n", + "ts_method <- c(\"arima\", \"ets\", \"rw\")\n", + "\n", + "param_space <- expand.grid(hts_method, \n", + " ts_method, \n", + " stringsAsFactors = FALSE)\n", + "\n", + "colnames(param_space) <- c(\"hts_method\", \"ts_method\")\n", + "\n", + "# Define empty matric matrix\n", + "\n", + "mape11 <- mape12 <- mape13 <- mape21 <- mape22 <- mape23 <- mape31 <- mape32 <- mape33 <- matrix(NA,n-k,4)\n", + "\n", + "# Conduct time series cross validation for hts forecasting in parallel\n", + "\n", + "rxSetComputeContext(\"localpar\")\n", + "\n", + "tscv_time <- system.time({\n", + " \n", + "foreach(i=1:(n-k)) %dopar%\n", + "{\n", + " datashort <- window(demandgts, end=st + i/4)\n", + " datanext <- window(demandgts, start=st + (i+1)/4, end=st + (i+4)/4)\n", + " \n", + " # Run many distributed jobs\n", + " \n", + " rxResult <- rxExec(FUN=forecast_hts, \n", + " traindata=datashort, \n", + " testdata=datanext, \n", + " htsmethod=rxElemArg(param_space$hts_method), \n", + " tsmethod=rxElemArg(param_space$ts_method),\n", + " consoleOutput=TRUE,\n", + " packagesToLoad=c('hts'))\n", + " \n", + " horiz <- dim(datanext$bts)[1]\n", + " \n", + " mape11[i, 1:horiz] <- accuracy(aggts(rxResult[[1]]), aggts(datanext))[1, \"MAPE\"]\n", + " mape12[i, 1:horiz] <- accuracy(aggts(rxResult[[2]]), aggts(datanext))[1, \"MAPE\"]\n", + " mape13[i, 1:horiz] <- accuracy(aggts(rxResult[[3]]), aggts(datanext))[1, \"MAPE\"]\n", + " mape21[i, 1:horiz] <- accuracy(aggts(rxResult[[4]]), aggts(datanext))[1, \"MAPE\"]\n", + " mape22[i, 1:horiz] <- accuracy(aggts(rxResult[[5]]), aggts(datanext))[1, \"MAPE\"]\n", + " mape23[i, 1:horiz] <- accuracy(aggts(rxResult[[6]]), aggts(datanext))[1, \"MAPE\"]\n", + " mape31[i, 1:horiz] <- accuracy(aggts(rxResult[[7]]), aggts(datanext))[1, \"MAPE\"]\n", + " mape32[i, 1:horiz] <- accuracy(aggts(rxResult[[8]]), aggts(datanext))[1, \"MAPE\"]\n", + " mape33[i, 1:horiz] <- accuracy(aggts(rxResult[[9]]), aggts(datanext))[1, \"MAPE\"]\n", + "}\n", + " \n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nY3WCWsL18SEtvbXgdQMXtcToI0MKZmsBuSTjU0JaesZz99LMB+5ySVJcIb29ozOAdoZmN5+3\nyyVJMYU04mCaIGY87y2pfd4ulyRFFZJ1an13+XZmruSwXpSAiEKy3nCweDtsHkBdZCEtuJma\ndNAjspDsr46xURpviCgk52+BoxxMFlVI8rfAkQ5EYgpJ8RY40oETcYU0bdsy6cC5mEIaueuS\ncuBfVCFZp/ULSAcLiygk+/BO0kFYIguJdBCmyEKyvwLhiCgk3nCAcEUVEm84wKJOp1PXRTGF\nxBsOsKTT6evrqyuluEIClvP1dT9pQUjAKKdrQl/tsyRCAvqdrr5O11Wk9lkSIcGJr65loHCd\n7r66lYQEj3pXJ3zqaaK3lrabui7TnQgJ3nxZp6qbnOTUYvI9uPxkR0eEBAe+Gl+bF+tmE5W2\nWuYU0zVVX9ViX/uFhAQRSRO9PAXTree+ExJGG53HdbflqWsxaNDSwUxASHiSzUlGriMtPovR\nIaTlzVjYmTKWg2WuptNtq929iISC6UJIS1NvKfaTSodnI1/2FjPHo4aAkJb29pZi2fLXDAOz\nmObXD0BIC2vbUhxAKTdTl8lO1ulnIKQlBZDKjXgl5rbVTngHQ0dIfr0UM7DvUs3bav+/f//k\nt7m4nokiJNeGZjZf1fsu1R0tvJ2sesGlllLvRBGS3nvLaTO32i0bTJd/1mkyeieKkARmreKc\nqv1Iw6vvYRbT7l/jaxL6J4qQJtFtHHjZYhxTMDf/PkdJSDO52K52a+T8/IQYzFuvrsaPNr4m\n4Twxf//+JaR3yTdJt89lTrdVWE8FvffLd/ow1mky/p0rKv+yjjRIWs7ohTPBa85THW/do5Kt\ndkMSCkmWzvR1mn+3fZcty0eh1fGWQO/WDH9vE/W39dJPC0mSjmBTQKR5fJC/rco0Qprw2p+/\nqjNjbjOikiTXy8vbenl42vPoSKbxo42vdTGFNHLX5cxy3s5m5jwlyfXy669uXymNr2PWPfpr\nnb6IKiTrtH7B9HTGzm7cLYIluV7e+5obeRN+6njrHpXdvx0iCunrtrJ3nS9NSmcgm4VWWNJb\nH+peCgqujrf03K2YQjq/3r7OJ6PTac8mvNX7QF81o7wx3wg2D4moQqq+/OuoqJ5McLV08rs6\n0ePdJnrC6F8vT1JEId0KuvY0UEtwuXQTrE683KSwiYn3wDr9DFGF9FXGWku3gV/eiycxTTCz\nWW9iCum2HymBfmJqYqKY7/sUEYUU1R6X0Xl84OpEkqIKKaQ9LrI5yeetTiQpppD87nHxtcz1\neasTSYopJPVLLpS1k09bnUhSVCFZp6P4mqkAEYXUtlpOKQhDZCGRCsIUWUj2VyAcEYXEhmKE\nK6qQ2FCMUMUUEhuKEay4QgICRUiAACEBAoQECBASIEBIgAAhAQKEBAgQEiBASIAAIQEChAQI\nEBIgQEiAACEBAoQECBASIEBIgAAhAQKEBAgQEiBASIAAIQEChAQIEBIgQEiAACEBAv5D2q2M\n2eydDgH45jEkU/3g2lRyJ0MAC/EdUm7yoiyPudm5GAJYiO+QMlNczhdm5WIIYCG+QzLG+kfj\nYsvEIYCF+A5pew8pczEEsBCvIW2+d3vzcz5b5P1bGwgJkfEa0mOxzZiscDEEsBCf+5EOh91u\ns6k2OeS9HRESYsORDYAAIQEChAQIEBIgQEiAACEBAoQECBASIEBIgAAhAQKEBAgQEiBASIAA\nIQEChAQIEBIgQEiAACEBAoQECBASIEBIgAAhAQKEBAgQEiBASIAAIQEChAQIEBIgQEiAACEB\nAoQECBASIEBIgAAhAQKEBAgQEiBASIAAIQEChAQIEBIgQEiAACEBAoQECBASIEBIgAAhAQKE\nBAgQEiBASIAAIQEChAQIEBIgQEiAACEBAoQECBASIEBIgAAhAQKEBAgQEiBASIAAIQEChAQI\nEBIgQEiAACEBAoQECBASIEBIgAAhAQKEBAgQEiBASIAAIQEChAQIEBIgQEiAACEBAoQECBAS\nIEBIgAAhAQKEBAgQEiBASIAAIQEChAQIEBIgQEiAACEBAoQECBASIEBIgAAhAQKEBAgQEiBA\nSIAAIQEChAQIEBIgQEiAACEBAoQECBASIEBIgAAhAQJeQ/r93piLTf7raghgER5DKlbmae1k\nCGAhHkPKTfZzqM4d95nJXQwBLMRjSJk5PM4fTOZiCGAhHkMypusft+9YJg4BLIQ5EiDgdx1p\nf6zOsY6E1Pjc/L22lt1WhZMhgGX43Y+UV/uRss03+5GQFo5sAAQICRAgJECAkAABQgIECAkQ\nICRAgJAAAUICBAgJECAkQICQAAFCAgQICRAgJECAkAABQgIECAkQCDQkIDITXuX6cEIcO8mh\nkpyoWB8/Qop3qCQnKtbHj5DiHSrJiYr18SOkeIdKcqJiffwIKd6hkpyoWB8/Qop3qCQnKtbH\nj5DiHSrJiYr18SOkeIdKcqJiffwIKd6hkpyoWB8/Qop3qCQnKtbHj5DiHSrJiYr18SOkeIdK\ncqJiffw4NBsQICRAgJAAAUICBAgJECAkQICQAAFCAgQICRAgJECAkAABQgIECAkQICRAgJAA\nAUICBBYIaVcfM89Mlhc+hpr8B9JHDLRqTISzqWqO5G6iiq0x24P9HWcT9TKUw6eqLH9rtyua\nKP8hHeqPz7p6xFYehjq4e3by6oaz59PhbKqaIzmcqKy6Yevl7e6pag7lcKrO1Wb27aomyntI\nh6z2+Pya7HD53q/7oQ5m42CQ6y1vi8vsb3v/hrOpehnJ3UTll0Fy6+bdPVUvQ7mbqrON/aqQ\nTZTvkHZmXXt152Z/Pv0x3+6H2rkYpLK5DvMczdlUvYzkbqIyU9RGcvhUvQzlbqouE2C/KmQT\n5Tskk5e1V/fGHEtHv4GaQ+3MTj9IbcDHaA6nqjGS64ky2eOs84l6DuVwqo71X6+yifId0qGs\nv7pN81esu6E2Zr89r1fqB7opzPp+1uFUNUZyPFG59Yp2PFH2UA6nam2O9hTIJmqBrXa+Qmre\n7Oa6ArvuvPZMu2opwR7X1WvOGsnpRJ2XgqwXs9OJqg/lbqq+zU9JSHOH+jn/Ms9dLTUcs+fi\ngdupqo/kcKJ2m8xaeXA6Uc2hHE1VtQxHSPOGuiocbWovMuv3p9Opqo10+5ajiSrL7fPF7Hg2\naw915WCqVpcdB0mGlPkOydVQa/tJdzpV65aXl7NXd/HcBOD2qaoNdSMfalstE9s3K5uopUO6\nbjU5OtoU5C2k42p9tP7pcKoaI904e3W/bIp09VSVLRMhnyrzcP+ObKKWDum7+h2xN262OzVm\nfpe9FU5eCPvGerG7qWqO5G6i7rf8mP+5m6iXoVxN1WtIsolaOiSXRzY0hsovj1aRP7d4yRyb\n25ecTdXLSO4mqjrcoNg8V1wcH9lgD+Vuqi6SOLKhfE7H9evK5Tbp2lDF9YguB/O+rfV7zu1U\nvYzkbqJuB8BV0+D6qWoO5XCqyserQjtRi4dUVEffehtq5WI7sWm+vJ1NVftITiaqOi76dsvO\nn6q2oRxNVSMk1UQtEBKQHkICBAgJECAkQICQAAFCAgQICRAgJECAkAABQgIECAkQICRAgJAA\nAUICBAgJECAkQICQAAFCAgQICRAgJECAkAABQgIECAkQICRAgJAAAUICBAgJECAkQICQAAFC\nAgQICRAgJECAkAABQgpZ38d6u/sgc0zAsxEyQooGz0bIiCUaPFMhI6Ro8EyF7BxSbrLv6vxu\ndfucb2OKldlUkVmfcW5dfNzcfwbeEFLIjNlcOrkEsq6KWd+/mTdCsi/OLmcpyS9CCtk5jaLc\nmVVZ/pjsUB4y83P7prXYtz3307y4+hl4REghM+a3vCazMfvzuf1lnnP95iOk9eV7LxezduUZ\nj3fIrjlcF+LKlrPlraPXiwnJMx7vkA2HtDbb5z8IaTk83iEbCumYmdy6IiEth8c7ZM8o7itB\nGzuaR0evFxOSZzzeIXtGUdssd7/s0dHrxYTkGY93yKwo7B1F98tM+36k50/CGx7vkNlR7LLH\noQv3y6yQmhcTkmc83oAAIQEChAQIEBIgQEiAACEBAoQECBASIEBIgAAhAQKEBAgQEiBASIAA\nIQEChAQIEBIgQEiAACEBAoQECBASIEBIgAAhAQKEBAgQEiBASIAAIQEChAQIEBIgQEiAACEB\nAoQECPwf86XE8P+4QCcAAAAASUVORK5CYII=", + "text/plain": [ + "plot without title" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize overall mape vs horiz\n", + "\n", + "plot(1:4, colMeans(mape11,na.rm=TRUE), type=\"o\", col=2, \n", + " xlab=\"horizon\", ylab=\"Overall MAPE\", ylim=c(0, 25))\n", + "lines(1:4, colMeans(mape12,na.rm=TRUE), type=\"o\",col=3)\n", + "lines(1:4, colMeans(mape13,na.rm=TRUE), type=\"o\",col=4)\n", + "lines(1:4, colMeans(mape21,na.rm=TRUE), type=\"o\",col=5)\n", + "lines(1:4, colMeans(mape22,na.rm=TRUE), type=\"o\",col=6)\n", + "lines(1:4, colMeans(mape23,na.rm=TRUE), type=\"o\",col=7)\n", + "lines(1:4, colMeans(mape31,na.rm=TRUE), type=\"o\",col=8)\n", + "lines(1:4, colMeans(mape32,na.rm=TRUE), type=\"o\",col=9)\n", + "lines(1:4, colMeans(mape33,na.rm=TRUE), type=\"o\",col=10)\n", + "legend(\"topleft\", \n", + " legend=c(\"bu-ARIMA\", \"bu-ETS\", \"bu-RW\",\n", + " \"comb-ARIMA\", \"comb-ETS\", \"comb-RW\",\n", + " \"tdgsa-ARIMA\", \"tdgsa-ETS\", \"tdgsa-RW\"), \n", + " col=2:10, lty=1, cex=0.5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Show the run time of time series cross validation\n", + "\n", + "print(tscv_time)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Forecast the product demand of 2012 using the optimal parameters\n", + "\n", + "opt_fcast <- forecast(object = demandgts, \n", + " h = 4,\n", + " method = \"comb\",\n", + " fmethod = \"arima\",\n", + " keep.fitted = TRUE)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Explore and visualize the forecasted hts\n", + "\n", + "aggts(opt_fcast)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "summary(opt_fcast)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "attributes": { + "classes": [], + "error": "FALSE", + "id": "", + "message": "FALSE,", + "warning": "FALSE," + }, + "collapsed": true + }, + "outputs": [], + "source": [ + "plot(opt_fcast)" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "R", + "language": "R", + "name": "ir" + }, + "language_info": { + "codemirror_mode": "r", + "file_extension": ".r", + "mimetype": "text/x-r-source", + "name": "R", + "pygments_lexer": "r", + "version": "3.3.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}