Детерминированный факторный анализ — это метод исследования влияния факторов на результативный показатель.
Предполагается, что связь факторов с результативным показателем носит функциональный характер, которая выражена математической формулой.
Например, выручку логистической компании можно представить так:
Это мультипликативный вариант модели.
Мы хотим проследить изменение выручки за период: за счет чего изменилась выручка в рублях в отчетном месяце по отношению к предыдущему.
В отчетном месяце:
[B] выручка — 250 руб, [?1] цена — 50 руб/шт, [?1] объем — 5 шт;
в предыдущем месяце:
[A] выручка — 120 руб, [?0] цена — 40 руб/шт, [?0] объем — 3 шт.
Выручка увеличилась на 130 рублей за счет увеличение цены на 10 руб/шт (+25%) и увеличение объема на 2 шт (+66%).
Влияние этих изменений на выручку можно посчитать следующим образом:
Влияние цены: разница цены, умноженная на текущий объем = (50 — 40) * 5 = 50 руб.
Влияние объема = 130 — 50 = 80 руб.
Или посчитаем сначала изменение объема,
Влияние объема: разница объема, умноженная на текущую цену = (5 — 3) * 50 = 100 руб.
Влияние цены = 130 — 100 = 30 руб.
Размер влияния факторов в зависимости от порядка расчета отличается, поэтому этот метод называется цепным (первый вариант — индекс Пааше, второй — Ласпейреса).
Проблему дисбаланса легче проследить на экстремальных задачах:
Например, цена и объем изменились симметрично:
Цена: 10 руб/шт +10% >> 11 руб/шт.
Объем: 10 шт +10% >> 11 шт.
Выручка: 100 руб +21% >> 121 руб.
Логично предполагать, что и изменения цены и объема одинаково повлияли на размер выручки. Посчитаем цепным методом. Влияние объема: (11 — 10) * 10 = 10 руб, влияние цены = 21 — 10 = 11 руб. При одинаковом изменении цены иобъема, влияние цены на изменение выручки на 10% больше, чем влияние объема.
Цена: 10 руб/шт >> 11 руб/шт.
Объем: 10 шт >> 10 000 шт.
Выручка: 100 руб >> 110 000
Влияние цены: (11 — 10) * 10 000 = 10 000 руб — первым способом и (11 — 10) * 10 = 10 руб — вторым.
Влияние объема: (10 000 — 10) * 10 = 99 900 руб — первым способом и (10 000 — 10) * 11 = 109 890 руб — вторым.
Для цены размер влияния на выручку в рублях уже отличается на порядки.
Также при добавления новых показателей в модель, все совместные эффекты влияния будут добавлятся к первому показателю, чтобы этого избежать будем использовать интегральный способ.
Данное изменение можно изобразить прямоугольником:
![](https://habrastorage.org/getpro/habr/upload_files/271/838/d18/271838d188623178ad75306a0fff4bcb.png)
?0=?0∙?0,
?1=(?1−?0)∙?0,
?2=?0∙(?1−?0),
?3=(?1−?0)∙(?1−?0),
?4=?0+?1+?2+?3=?1∙?1
![](https://habrastorage.org/getpro/habr/upload_files/459/32c/a14/45932ca14d496f2eab47893ae145b4df.png)
Изменение выручки:
?4 — ?0 = ?1+?2+?3
Изменение выручки за счет цены:
?1+?3/2
Изменение выручки за счет объема:
?2+?3/2
Изменение выручки: (250 — 120) = 130
Изменение выручки за счет цены: (50 — 40) * 3 + [(50 — 40) * (5 — 3)]/2 = 30 + [10 * 2]/2 = 40
Изменение выручки за счет объема: 40 * (5 — 3) + [(50 — 40) * (5 — 3)]/2 = 80 + [10 * 2]/2 = 90
Проверим: 130 = 40 + 90 (верно).
Выручка в предыдущем месяце составляла 120 руб. Уменьшение цены на 10 руб/шт увеличило выручку на 40 рублей, при этом увеличение объема на 2 шт. увеличило выручку на 90 руб. Выручка в текущем месяце – 250 руб.
Для двумерного случая можно использовать данные формулы, но с увеличением размерности модели, подобрать формулы становится проблематично. Автоматизируем данный процесс.
Допустим, что наша модель усложнилась и теперь:
В отчетном месяце:
[B] выручка — 250 руб, [?1] цена — 5 руб/кг, [?1] объем — 5 шт, [?1] вес — 10 кг/шт;
в предыдущем месяце:
[A] выручка — 96 руб, [?0] цена — 4 руб/шт, [?0] объем — 3 шт [?2] вес — 8 кг/шт.
![](https://habrastorage.org/getpro/habr/upload_files/7a2/a49/05e/7a2a4905e0dc9561561ce863e5ae2871.png)
Так как система имеет два состояния A и B, то фигуру необходимо разбить на 2? частей, где ? – количество измерений.
Так для 3 измерений необходимо 23 = 8 частей.
Изменение выручки за счет цены-и-объема необходимо поделить пополам,
также необходимо поделить пополам изменение выручки за счет цены-и-веса и веса-и-объема.
![](https://habrastorage.org/getpro/habr/upload_files/ee2/d5b/db5/ee2d5bdb5a5387a0496c8094656cae96.png)
Изменение выручки за счет цены-веса-и-объема необходимо разделить на 3 части:
![](https://habrastorage.org/getpro/habr/upload_files/5fa/d88/749/5fad887496d173168f0f7906c8b6a2ef.png)
Составим таблицу, ? — цена, ? — вес, ? — объем:
![](https://habrastorage.org/getpro/habr/upload_files/3b3/f63/304/3b3f633042b53b328561d74796f2af3f.png)
Где Δ?=(?1−?0),
Δ?=(?1−?0),
Δ?=(?1−?0),
1 – наличие Δ.
Дельта (Δ) показывает за счет какого фактора происходит изменение.
Кол-во Δ в строке показывает на сколько частей необходимо делить фигуру, для этого необходимо вывести дополнительный столбец с количеством Δ (?Δ).
![](https://habrastorage.org/getpro/habr/upload_files/b96/3cb/a6f/b963cba6ff2e9df4d615317d6da50bd2.png)
Суммы по столбцу ??, ??, ?? – это значение влияния фактора.
В итоге: A → ?0+??+??+?? = B
Для нашего примера:
Выручка в предыдущем месяце составляла 120 руб. Увеличение цены на 1 руб/кг увеличило выручку на 36,3 руб, при этом увеличение веса на 2 кг/шт. увеличило выручку на 36,3 руб., также увеличение объема на 2 шт. увеличило выручку на 81,3 руб. Выручка в текущем месяце – 250 руб.
Теперь код:
import numpy as np from typing import * from itertools import * def factors_product(beg: List, end: List) -> List: beg = np.array(beg) end = np.array(end) # (1) генерируем матрицу наличия Δ, (0, 0, 0) нам не нужна sep = np.array(list(product([0, 1], repeat=len(beg))))[1:] # (2) рассчитываем матрицу отклонений факторов + матрица начальных значений delta = sep * (end-beg) + beg * (1-sep) # (3) найдем ?Δ k = sep.sum(1) # (4) найдем произведение состояния факторов / ?Δ m = (sep * (end-beg) + beg * (1-sep)).prod(1) / k # (4) поместим m на соответствующие факторы и посчитаем суммы влияния result = (sep.T * m).sum(1) return result
Или return в одну строку:
def factors_product(beg: List, end: List) -> List: beg = np.array(beg) end = np.array(end) sep = np.array(list(product([0, 1], repeat=len(beg))))[1:] return (sep.T*((sep*(end-beg)+beg*(1-sep)).prod(1)/sep.sum(1))).sum(1)
# проверим нашу задачу # установим библиотеку !pip install detfa from detfa import factors_product print(factors_product([4,3,8], [5,5,10])) >> [36.33333333 81.33333333 36.33333333]
ссылка на оригинал статьи https://habr.com/ru/articles/593535/
Добавить комментарий