Создадим OLAP-куб с продажами нескольких видов товара в ряде магазинов с известными местами расположения по месяцам и кварталам 2019 года. Данные по выручке от продаж товара генерируем случайным образом. Этот пример взят с сайта dzone.com.
Таблицы измерений для гиперкуба:
| key | name | country |
|---|---|---|
| CA | Калифорния | США |
| NY | Нью Йорк | США |
| WA | Вашингтон | США |
| ON | Онтарио | Канада |
| QU | Квебек | Канада |
| key | desc | quarter |
|---|---|---|
| 1 | Янв | Q1 |
| 2 | Фев | Q1 |
| 3 | Март | Q1 |
| 4 | Апр | Q2 |
| 5 | Май | Q2 |
| 6 | Июнь | Q2 |
| 7 | Июль | Q3 |
| 8 | Авг | Q3 |
| 9 | Сен | Q3 |
| 10 | Окт | Q4 |
| 11 | Ноя | Q4 |
| 12 | Дек | Q4 |
| key | price |
|---|---|
| Принтер | 225 |
| Планшет | 570 |
| Ноутбук | 1120 |
Первые строки таблицы фактов: выручка (столбец amount) по периодам времени, локациям и товарам. Всего в таблице 500 строк и 7 столбцов.
| month | quarter | year | loc | prod | unit | amount |
|---|---|---|---|---|---|---|
| 1 | Q1 | 2018 | NY | Ноутбук | 1 | 225 |
| 1 | Q1 | 2018 | ON | Планшет | 2 | 1140 |
| 1 | Q1 | 2018 | ON | Ноутбук | 2 | 450 |
| 1 | Q1 | 2018 | QU | Планшет | 1 | 570 |
| 1 | Q1 | 2018 | NY | Принтер | 1 | 1120 |
| 1 | Q1 | 2018 | CA | Принтер | 1 | 1120 |
Построим гиперкуб и рассчитаем сводную таблицу: продажи ноутбуков по кварталам и локациям.
# Строим куб -------------------------------------------------------------------
# агрегируем выручку по измерениям, для времени используем кварталы (quarter)
revenue_cube <- tapply(sales_fact$amount, sales_fact[, c('prod', 'quarter',
'year', 'loc')],
FUN = function(x){return(sum(x))})
# Pivot - Сводная таблица ------------------------------------------------------
# продажи ноутбуков по кварталам 2018 и локациям
tbl <- apply(revenue_cube['Ноутбук', , '2018', ], c('quarter', 'loc'),
FUN = function(x) {return(sum(x, na.rm = TRUE))})
# отображение таблицы
kable(tbl)
| CA | NY | ON | QU | WA | |
|---|---|---|---|---|---|
| Q1 | 2250 | 900 | 1125 | 225 | 0 |
| Q2 | 1350 | 450 | 225 | 450 | 450 |
| Q3 | 1125 | 1800 | 900 | 675 | 2025 |
| Q4 | 1350 | 900 | 1575 | 1125 | 675 |
Теперь просуммируем продажи ноутбуков по годам и локациям.
# продажи ноутбуков по годам и локациям
tbl <- apply(revenue_cube['Ноутбук', , , ], c('year', 'loc'),
FUN = function(x) {return(sum(x, na.rm = TRUE))})
# отображение таблицы
kable(tbl)
| CA | NY | ON | QU | WA | |
|---|---|---|---|---|---|
| 2018 | 6075 | 4050 | 3825 | 2475 | 3150 |
| 2019 | 8100 | 6300 | 2925 | 2025 | 3600 |
Построим по последней сводной таблице график.
barplot(as.matrix(tbl), beside = T, col = c('aquamarine3', 'coral'),
main = 'Продажи ноутбуков по локациям')
legend('topright', fill = c('aquamarine3', 'coral'), legend = c(2018, 2019))