Создадим 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))