Урок 3.4: Продвинутые вычисления

Урок 3.4: Продвинутые вычисления

Модуль 3: Расчетные меры и вычисления

Введение: Переход к сложной аналитической логике

Добро пожаловать в четвертый урок модуля "Расчетные меры и вычисления"! Мы уже освоили создание простых расчетных мер, условную логику и функции агрегации. Теперь пришло время объединить все эти знания и научиться создавать по-настоящему сложные вычисления, которые решают реальные бизнес-задачи.

Продвинутые вычисления в MDX — это комбинация всех изученных техник для создания комплексных аналитических показателей.ями и агрегациями. Именно такие вычисления превращают сырые данные в ценные бизнес-инсайты.

Теоретические основы продвинутых вычислений

Концепция многослойных вычислений

Продвинутые вычисления в MDX часто представляют собой многослойную структуру, где каждый слой добавляет свою логику:

  • Базовый слой — извлечение исходных данных из куба
  • Слой трансформации — преобразование данных (нормализация, очистка)
  • Слой вычислений — применение формул и алгоритмов
  • Слой агрегации — обобщение результатов
  • Слой презентации — форматирование для отображения

Каждый слой может использовать результаты предыдущего, создавая сложные цепочки вычислений.

Взвешенные вычисления

Взвешенные вычисления учитывают важность или вес каждого элемента в общем результате. В отличие от простого среднего арифметического, взвешенное среднее дает более точную картину, учитывая значимость каждого компонента.

Формула взвешенного среднего:

Augmented Backus-Naur Form
Weighted Average = Σ(Value × Weight) / Σ(Weight)

Копировать

В MDX это реализуется через комбинацию SUM и деления:

WITH MEMBER [Measures].[Weighted Average Price] AS
    SUM(
        [Product].[Product].Members,
        [Measures].[Internet Sales Amount]
    ) / 
    SUM(
        [Product].[Product].Members,
        [Measures].[Order Quantity]
    )

Коэффициенты и индексы

Коэффициенты позволяют сравнивать разнородные показатели, приводя их к единой шкале. Индексы показывают относительное изменение по сравнению с базовым периодом или значением.

Типы коэффициентов в бизнес-анализе:

  • Коэффициенты эффективности — соотношение результата к затратам
  • Коэффициенты интенсивности — показатели на единицу измерения
  • Коэффициенты структуры — доля в общем объеме
  • Коэффициенты динамики — темпы изменения

Нормализация и стандартизация данных

Нормализация приводит данные к единому масштабу, что критически важно при сравнении разнородных показателей:

Min-Max нормализация (приведение к диапазону 0-1):

Mathematica
Normalized = (Value - Min) / (Max - Min)

Копировать

Z-score стандартизация:

Augmented Backus-Naur Form
Standardized = (Value - Mean) / StdDev

Копировать

Реализация взвешенных средних

Базовое взвешенное среднее

Рассмотрим классический пример — расчет средневзвешенной цены продукта с учетом объемов продаж:

WITH 
MEMBER [Measures].[Total Revenue] AS
    SUM(
        [Product].[Product].Members,
        [Measures].[Internet Sales Amount]
    )

MEMBER [Measures].[Total Quantity] AS
    SUM(
        [Product].[Product].Members,
        [Measures].[Order Quantity]
    )

MEMBER [Measures].[Weighted Average Price] AS
    [Measures].[Total Revenue] / [Measures].[Total Quantity],
    FORMAT_STRING = "Currency"

Взвешенное среднее с условиями

Добавим условную логику для исключения выбросов:

WITH 
MEMBER [Measures].[Filtered Revenue] AS
    SUM(
        [Product].[Product].Members,
        IIF(
            [Measures].[Internet Sales Amount] / [Measures].[Order Quantity] < 10000,
            [Measures].[Internet Sales Amount],
            NULL
        )
    )

MEMBER [Measures].[Filtered Quantity] AS
    SUM(
        [Product].[Product].Members,
        IIF(
            [Measures].[Internet Sales Amount] / [Measures].[Order Quantity] < 10000,
            [Measures].[Order Quantity],
            NULL
        )
    )

MEMBER [Measures].[Weighted Avg Without Outliers] AS
    [Measures].[Filtered Revenue] / [Measures].[Filtered Quantity],
    FORMAT_STRING = "Currency"

Создание комплексных индексов и коэффициентов

Индекс эффективности

Создадим комплексный индекс эффективности, учитывающий несколько факторов:

WITH 
-- Компонент 1: Эффективность продаж
MEMBER [Measures].[Sales Efficiency] AS
    [Measures].[Internet Sales Amount] / 
    CASE 
        WHEN [Measures].[Internet Order Count] = 0 THEN NULL
        ELSE [Measures].[Internet Order Count]
    END

-- Компонент 2: Маржинальность
MEMBER [Measures].[Margin Rate] AS
    ([Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost]) /
    CASE
        WHEN [Measures].[Internet Sales Amount] = 0 THEN NULL
        ELSE [Measures].[Internet Sales Amount]
    END

-- Компонент 3: Оборачиваемость
MEMBER [Measures].[Turnover Index] AS
    [Measures].[Internet Order Count] / 
    COUNT(NON EMPTY [Date].[Calendar].[Date].Members)

-- Комплексный индекс эффективности
MEMBER [Measures].[Performance Index] AS
    ([Measures].[Sales Efficiency] * 0.4 +
     [Measures].[Margin Rate] * 1000 * 0.4 +
     [Measures].[Turnover Index] * 100 * 0.2),
    FORMAT_STRING = "#,##0.00"

Коэффициент вариации

Коэффициент вариации показывает степень разброса данных относительно среднего:

WITH 
-- Среднее значение
MEMBER [Measures].[Avg Sales] AS
    AVG(
        [Date].[Calendar].[Month].Members,
        [Measures].[Internet Sales Amount]
    )

-- Расчет дисперсии вручную
MEMBER [Measures].[Variance] AS
    AVG(
        [Date].[Calendar].[Month].Members,
        ([Measures].[Internet Sales Amount] - [Measures].[Avg Sales]) * 
        ([Measures].[Internet Sales Amount] - [Measures].[Avg Sales])
    )

-- Стандартное отклонение
MEMBER [Measures].[StdDev] AS
    IIF(
        [Measures].[Variance] > 0,
        [Measures].[Variance] ^ 0.5,
        0
    )

-- Коэффициент вариации
MEMBER [Measures].[Coefficient of Variation] AS
    CASE
        WHEN [Measures].[Avg Sales] = 0 OR IsEmpty([Measures].[Avg Sales]) THEN NULL
        ELSE [Measures].[StdDev] / [Measures].[Avg Sales]
    END,
    FORMAT_STRING = "Percent"

Нормализация и ранговые вычисления

Min-Max нормализация

Приведение значений к диапазону от 0 до 1:

WITH 
-- Находим минимум и максимум
MEMBER [Measures].[Min Sales] AS
    MIN(
        [Product].[Category].Members,
        [Measures].[Internet Sales Amount]
    )

MEMBER [Measures].[Max Sales] AS
    MAX(
        [Product].[Category].Members,
        [Measures].[Internet Sales Amount]
    )

-- Нормализованное значение
MEMBER [Measures].[Normalized Sales] AS
    CASE
        WHEN [Measures].[Max Sales] = [Measures].[Min Sales] THEN 0.5
        ELSE 
            ([Measures].[Internet Sales Amount] - [Measures].[Min Sales]) / 
            ([Measures].[Max Sales] - [Measures].[Min Sales])
    END,
    FORMAT_STRING = "Percent"

Процентильный ранг

Вычисление позиции элемента относительно всего набора:

WITH 
-- Количество элементов с меньшим значением
MEMBER [Measures].[Lower Count] AS
    COUNT(
        [Product].[Product].Members,
        IIF(
            ([Measures].[Internet Sales Amount], [Product].[Product].CurrentMember) <
            [Measures].[Internet Sales Amount],
            1,
            NULL
        )
    )

-- Общее количество элементов
MEMBER [Measures].[Total Count] AS
    COUNT(NON EMPTY [Product].[Product].Members)

-- Процентильный ранг
MEMBER [Measures].[Percentile Rank] AS
    [Measures].[Lower Count] / [Measures].[Total Count],
    FORMAT_STRING = "Percent"

Комбинированные многоуровневые вычисления

Скоринговая модель

Создадим комплексную скоринговую модель для оценки клиентов:

WITH 
-- Критерий 1: Объем покупок (вес 40%)
MEMBER [Measures].[Volume Score] AS
    CASE
        WHEN [Measures].[Internet Sales Amount] > 50000 THEN 100
        WHEN [Measures].[Internet Sales Amount] > 20000 THEN 75
        WHEN [Measures].[Internet Sales Amount] > 5000 THEN 50
        WHEN [Measures].[Internet Sales Amount] > 0 THEN 25
        ELSE 0
    END * 0.4

-- Критерий 2: Частота покупок (вес 30%)
MEMBER [Measures].[Frequency Score] AS
    CASE
        WHEN [Measures].[Internet Order Count] > 20 THEN 100
        WHEN [Measures].[Internet Order Count] > 10 THEN 75
        WHEN [Measures].[Internet Order Count] > 5 THEN 50
        WHEN [Measures].[Internet Order Count] > 0 THEN 25
        ELSE 0
    END * 0.3

-- Критерий 3: Средний чек (вес 30%)
MEMBER [Measures].[Avg Check] AS
    IIF(
        [Measures].[Internet Order Count] = 0,
        0,
        [Measures].[Internet Sales Amount] / [Measures].[Internet Order Count]
    )

MEMBER [Measures].[Avg Check Score] AS
    CASE
        WHEN [Measures].[Avg Check] > 5000 THEN 100
        WHEN [Measures].[Avg Check] > 2000 THEN 75
        WHEN [Measures].[Avg Check] > 500 THEN 50
        WHEN [Measures].[Avg Check] > 0 THEN 25
        ELSE 0
    END * 0.3

-- Итоговый скоринг
MEMBER [Measures].[Total Score] AS
    [Measures].[Volume Score] + 
    [Measures].[Frequency Score] + 
    [Measures].[Avg Check Score],
    FORMAT_STRING = "#,##0.00"

-- Категория клиента
MEMBER [Measures].[Customer Category] AS
    CASE
        WHEN [Measures].[Total Score] >= 80 THEN "VIP"
        WHEN [Measures].[Total Score] >= 60 THEN "Gold"
        WHEN [Measures].[Total Score] >= 40 THEN "Silver"
        WHEN [Measures].[Total Score] > 0 THEN "Bronze"
        ELSE "Inactive"
    END

Практические упражнения

Упражнение 1: Комплексный анализ эффективности

-- Создаем систему KPI для оценки эффективности продуктовых категорий

WITH 
-- Базовые метрики
MEMBER [Measures].[Revenue] AS
    [Measures].[Internet Sales Amount],
    FORMAT_STRING = "Currency"

MEMBER [Measures].[Profit] AS
    [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost],
    FORMAT_STRING = "Currency"

MEMBER [Measures].[Margin %] AS
    IIF(
        [Measures].[Internet Sales Amount] = 0,
        NULL,
        [Measures].[Profit] / [Measures].[Internet Sales Amount]
    ),
    FORMAT_STRING = "Percent"

-- Взвешенная средняя цена
MEMBER [Measures].[Weighted Avg Price] AS
    IIF(
        SUM(
            Descendants(
                [Product].[Product Categories].CurrentMember,
                [Product].[Product Categories].[Product]
            ),
            [Measures].[Order Quantity]
        ) = 0,
        NULL,
        SUM(
            Descendants(
                [Product].[Product Categories].CurrentMember,
                [Product].[Product Categories].[Product]
            ),
            [Measures].[Internet Sales Amount]
        ) / 
        SUM(
            Descendants(
                [Product].[Product Categories].CurrentMember,
                [Product].[Product Categories].[Product]
            ),
            [Measures].[Order Quantity]
        )
    ),
    FORMAT_STRING = "Currency"

-- Индекс эффективности (комбинированный показатель)
MEMBER [Measures].[Efficiency Index] AS
    (
        -- Нормализованная маржинальность (вес 40%)
        IIF([Measures].[Margin %] IS NULL, 0, [Measures].[Margin %] * 100) * 0.4 +
        
        -- Нормализованный объем продаж (вес 30%)
        ([Measures].[Revenue] / 
         MAX([Product].[Category].Members, [Measures].[Internet Sales Amount])) * 100 * 0.3 +
        
        -- Нормализованная оборачиваемость (вес 30%)
        (COUNT(
            NON EMPTY CrossJoin(
                Descendants(
                    [Product].[Product Categories].CurrentMember,
                    [Product].[Product Categories].[Product]
                ),
                [Customer].[Customer].Members
            )
        ) / 1000) * 0.3
    ),
    FORMAT_STRING = "#,##0.00"

SELECT 
    {[Measures].[Revenue],
     [Measures].[Profit],
     [Measures].[Margin %],
     [Measures].[Weighted Avg Price],
     [Measures].[Efficiency Index]} ON COLUMNS,
    NON EMPTY [Product].[Category].Members ON ROWS
FROM [Adventure Works]
WHERE [Date].[Calendar Year].&[2013]

Упражнение 2: Статистический анализ с нормализацией

-- Статистический профиль с нормализацией

WITH 
-- Базовая статистика
MEMBER [Measures].[Mean] AS
    AVG(
        [Date].[Calendar].[Month].Members,
        [Measures].[Internet Sales Amount]
    ),
    FORMAT_STRING = "Currency"

-- Медиана (упрощенный расчет через среднее между средними элементами)
MEMBER [Measures].[Median(
                COUNT(
                    [Date].[Calendar].[Month].Members,
                    IIF([Measures].[Internet Sales Amount] > [Measures].[Mean], 1, NULL)
                ) >= COUNT(NON EMPTY [Date].[Calendar].[Month].Members) / 2,
                [Measures].[Internet Sales Amount],
                NULL
            )
        ) +
        MAX(
            [Date].[Calendar].[Month].Members,
            IIF(
                COUNT(
                    [Date].[Calendar].[Month].Members,
                    IIF([Measures].[Internet Sales Amount] <= [Measures].[Mean], 1, NULL)
                ) >= COUNT(NON EMPTY [Date].[Calendar].[Month].Members) / 2,
                [Measures].[Internet Sales Amount],
                NULL
            )
        )
    ) / 2,
    FORMAT_STRING = "Currency"

-- Min-Max нормализация текущего значения
MEMBER [Measures].[Current Normalized] AS
    CASE
        WHEN MAX([Date].[Calendar].[Month].Members, [Measures].[Internet Sales Amount]) = 
             MIN([Date].[Calendar].[Month].Members, [Measures].[Internet Sales Amount])
        THEN 0.5
        ELSE
            ([Measures].[Internet Sales Amount] - 
             MIN([Date].[Calendar].[Month].Members, [Measures].[Internet Sales Amount])) /
            (MAX([Date].[Calendar].[Month].Members, [Measures].[Internet Sales Amount]) -
             MIN([Date].[Calendar].[Month].Members, [Measures].[Internet Sales Amount]))
    END,
    FORMAT_STRING = "Percent"

-- Позиция относительно среднего
MEMBER [Measures].[Position vs Mean] AS
    CASE
        WHEN [Measures].[Internet Sales Amount] > [Measures].[Mean] * 1.2 THEN "Significantly Above"
        WHEN [Measures].[Internet Sales Amount] > [Measures].[Mean] THEN "Above Average"
        WHEN [Measures].[Internet Sales Amount] > [Measures].[Mean] * 0.8 THEN "Near Average"
        WHEN [Measures].[Internet Sales Amount] > 0 THEN "Below Average"
        ELSE "No Data"
    END

SELECT 
    {[Measures].[Internet Sales Amount],
     [Measures].[Mean],
     [Measures].[Median Approx],
     [Measures].[Current Normalized],
     [Measures].[Position vs Mean]} ON COLUMNS,
    NON EMPTY [Product].[Category].Members ON ROWS
FROM [Adventure Works]
WHERE ([Date].[Calendar Year].&[2013], [Customer].[Country].[United States])

Оптимизация сложных вычислений

Декомпозиция вычислений

Разбивайте сложные формулы на промежуточные шаги:

-- Вместо одной сложной формулы

MEMBER [Measures].[Complex] AS
    (SUM(...) * AVG(...)) / (MAX(...) - MIN(...)) * IIF(...)

-- Используйте промежуточные меры

MEMBER [Measures].[Step1] AS SUM(...)
MEMBER [Measures].[Step2] AS AVG(...)
MEMBER [Measures].[Step3] AS MAX(...) - MIN(...)
MEMBER [Measures].[Complex] AS
    ([Measures].[Step1] * [Measures].[Step2]) / [Measures].[Step3] * IIF(...)

Избегание повторных вычислений

Сохраняйте результаты часто используемых вычислений:

WITH 
-- Вычисляем один раз
MEMBER [Measures].[Category Total] AS
    SUM([Product].[Category].Members, [Measures].[Internet Sales Amount])

-- Используем многократно
MEMBER [Measures].[Percent of Total] AS
    [Measures].[Internet Sales Amount] / [Measures].[Category Total]

Заключение

В этом уроке мы изучили продвинутые техники вычислений в MDX, объединив все ранее полученные знания. Мы освоили:

  • Создание взвешенных средних и их применение в анализе
  • Разработку комплексных индексов и коэффициентов
  • Нормализацию данных для сравнительного анализа
  • Построение многоуровневых скоринговых моделей
  • Комбинирование условной логики, агрегаций и навигации
  • Оптимизацию сложных вычислений

Продвинутые вычисления — это искусство комбинирования базовых техник MDX для решения сложных аналитических задач. Владение этими техниками позволяет создавать sophisticated KPI и метрики, которые дают глубокое понимание бизнес-процессов.

В следующем уроке мы изучим специфическую, но крайне важную тему — расчет процентов от общей суммы, что является фундаментальным паттерном в бизнес-аналитике.

Домашнее задание

Задание 1: Индекс лояльности

Создайте комплексный индекс лояльности клиентов, учитывающий: частоту покупок, средний чек, давность последней покупки и общий объем покупок.

Задание 2: Взвешенная рентабельность

Разработайте систему расчета взвешенной рентабельности продуктов с учетом объемов продаж и сезонности.

Задание 3: Нормализованный рейтинг

Создайте нормализованный рейтинг регионов по нескольким показателям с возможностью настройки весов.

Контрольные вопросы

  1. Что такое взвешенное среднее и когда его следует использовать вместо обычного?
  2. Как правильно нормализовать данные методом Min-Max?
  3. Какие компоненты должен включать комплексный индекс эффективности?
  4. Почему важна декомпозиция сложных вычислений?
  5. Как комбинировать условную логику с агрегациями в сложных формулах?
  6. менимы к сложным вычислениям?

Модуль 3: Расчетные меры и вычисления • Урок 3.4

Следующий урок!
Прошлый урок