.n Детерминированный факторный анализ 
.a Примеры использования функций детерминированного факторного анализа с детальными комментариями
.d 23333
.s
*Вычислительный блокнот детерминированного факторного анализа

Изложение предполагает, что читатель знаком с теорией детерминированного факторного анализа и его основными методами. В противном случае сначала рекомендуется ознакомиться с документом ''{*!dfa_dfa.pdf Теория*}'/. 

Существенно подробнее проблематика такого рода (и не только) вычислений изложена в книге !shurem/pk/kniga04.s. Там же имеется достаточно подробное обсуждение порядка использования этого инструмента для выявления неопределенностей в оценках финансовых коэффициентов. Материал большой и здесь ему не место.

Реализованные на данном сайте возможности позволяют произвольным образом структурировать результаты вычислений методами детерминированного факторного анализа в виде так называемых ``вычислительных блокнотов`/.

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

Рассмотрим порядок создания вычислительных блокнотов на нескольких простых примерах. Авторизованные пользователи могут детально изучить то, как составлен этот документ, просмотрев его Код, выбрав ссылку Код в самом низу статьи.

Использование данного вычислительного блокнота для вычислений с собственными данными возможно только при наличии у Вас статуса "Писатель" или выше. !shurem/pisatel.s
 
Если нужный статус уже есть, то:  
+ Откройте Код этого документа и скопируйте его в буфер обмена.
+ Создайте свой документ и скопируйте полученный Код в Содержание нового документа.
+ Внесите необходимые Вам правки в текст и исходные данные расчётов.
+ Сохраните документ и откройте его для просмотра. Вычисления будут выполнены и их результаты выведутся в документ.

Использование вычислительных блокнотов может быть полезно в тех случаях, когда необходимо выполнять массу однотипных вычислений с разными данными. В этом случае один раз создаём статью-шаблон. А потом только изменяем в нём исходные данные. Либо копируем его в другую статью, где подставляем нужные данные.

Чтобы никто Ваши данные не подсмотрел, при создании статьи задайте параметр: .d 00000. И тогда никто даже не догадается, что такая статья существует. Кстати, на сайте таких статей и сборников (книг) уже довольно много. И никто, кроме их создателя, о них ничего не знает. Кроме, разве что, администратора. Уж ему-то по определению всё доступно...

* Модель Прибыль = Выручка * Рентабельность_продаж

Рассмотрим простейшую 2х-факторную мультипликативную модель ''Прибыль = Выручка * Рентабельность_продаж'/

Введём обозначения:
vr - Выручка
rp - Рентабельность продаж

Исходные данные примера:

План vr:780612980 rp:0.673350554586
Факт vr:2507009504 rp:0.625679177322

Для того, чтобы различать значения Плана и Факта введём следующие переменные:
 ~vrp=780612980
 ~rpp=0.673350554586
 ~vrf=2507009504
 ~rpf=0.625679177322
~vrp=780612980
~rpp=0.673350554586
~vrf=2507009504
~rpf=0.625679177322

Рассчитаем общее изменение прибыли:
 ~x=vrf*rpf-vrp*rpp
~x=vrf*rpf-vrp*rpp
И выведем его с помощью поля переменных данных:
;Отменяем вычисление полей
!vp:0
Общее изменение прибыли = ''{*=x*}'/
;Включаем вычисление вычисление полей
!vp:1
Общее изменение прибыли = ''{*=x*}'/

**Интегральный метод

Для вычислений по 2х факторным моделям интегральным методом используются функции:
- axb(a0,b0,a1,b1) - модель a*b
- adb(a0,b0,a1,b1) - модель a/b
 
Им передаются 4 параметра:
;Сбрасываем счётчик нумератора первого уровня
!s1:0
+ a0 - Плановое значение 1-го фактора
+ b0 - Плановое значение 2-го фактора
+ a1 - Фактическое значение 1-го фактора
+ b1 - Фактическое значение 2-го фактора

С учётом введенных обозначений исходных данных расчётная формула должна быть записана в следующем виде:
 ~res=axb(vrp,rpp,vrf,rpf)
~res=axb(vrp,rpp,vrf,rpf)

Результатом выполнения функции axb является вектор с элементами a и b. Элемент с индексом a содержит рассчитанное значение вклада фактора a в общее изменение показателя, а элемент с индексом b - значение вклада фактора b. В наших обозначениях элемент с индексом a содержит значение вклада фактора vr, а элемент с индексом b - значение вклада фактора rp.

Для вывода результатов вводим следующий код:
;Отменяем вставку полей и заодно сбрасываем счётчик первого уровня
!vp:0 s1:0
Изменение за счёт фактора vr = {*=res('a')*}
Изменение за счёт фактора rp = {*=res('b')*}
Суммарное изменение = ''{*=res('a')+res('b')*}'/
На страницу будет выведено:
!vp:1
Изменение за счёт фактора vr = {*=res('a')*}
Изменение за счёт фактора rp = {*=res('b')*}
Суммарное изменение = ''{*=res('a')+res('b')*}'/

Можно видеть, что суммарное изменение по 2м факторам совпадает с общим изменением прибыли.

**Метод цепных подстановок

Для вычислений по 2х-факторной мультипликативной модели используется функция mcp2mm(a0,b0,a1,b1). Она должна получить 4 параметра.
+a0 - плановое значение 1-го фактора;
+b0 - плановое значение 2-го фактора;
+a1 - фактическое значение 1-го фактора;
+b1 - фактическое значение 2-го фактора.

Обозначения данных и переменных те же, что и в примере выполнения расчётов интегральным методом. Поэтому в нашем случае вызов функции mcp2mm() будет выглядеть так:
;С первой позиции строки оператор присваивания ~ срабатывает, а при любом отступе - нет и конструкция выводится как обычный текст
 ~res=mcp2mm(vrp,rpp,vrf,rpf)
~res=mcp2mm(vrp,rpp,vrf,rpf)

Результатом выполнения функции mcp2mm является вектор с элементами a и b. Элемент с индексом a содержит рассчитанное значение вклада фактора a в общее изменение показателя, а элемент с индексом b - значение вклада фактора b. В наших обозначениях элемент с индексом a содержит значение вклада фактора vr, а элемент с индексом b - значение вклада фактора rp.

Вывод результатов осуществляется точно также, как и в случае использования интегрального метода - с помощью полей переменных данных.
!vp:0
Изменение за счёт фактора vr = {*=res('a')*}
Изменение за счёт фактора rp = {*=res('b')*}
Суммарное изменение = ''{*=res('a')+res('b')*}'/
!vp:1
Изменение за счёт фактора vr = {*=res('a')*}
Изменение за счёт фактора rp = {*=res('b')*}
Суммарное изменение = ''{*=res('a')+res('b')*}'/

Можно видеть, что результаты расчётов, выполненных интегральным методом и методом цепных подстановок различаются.

Будут различаться и результаты расчётов при другом порядке факторов. Выполним функцию mcp2mm(), передав её параметры в другой последовательности:
 ~res=mcp2mm(rpp,vrp,rpf,vrf)
~res=mcp2mm(rpp,vrp,rpf,vrf)

Получим другой результат:
Изменение за счёт фактора rp = {*=res('a')*}
Изменение за счёт фактора vr = {*=res('b')*}
Суммарное изменение = ''{*=res('a')+res('b')*}'/

Метод цепных подстановок может быть использован для ''любого'/ типа моделей и любой их размерности, в том числе для любых расчётных формул, связывающих факторы. Соответствующий пример будет рассмотрен позже.

* Модель Прибыль = Оборотные_активы*Скорость_оборота*Рентабельность_продаж.

Рассмотрим теперь порядок оформления вычислений для 3х-факторных моделей на примере модели:

Прибыль = ОА * СО * РП  (1)
ОА — оборотные активы;
СО — скорость оборота;
РП — рентабельность продаж.

Соотношение (1) является тождеством, поскольку:
Скорость_оборота = Выручка/Оборотные_активы (2)
Рентабельность_продаж = Прибыль/Выручка (3)

Если подставить (2) и (3) в (1) и сократить подобные члены, то можно в этом убедиться.

Введём следующие обозначения факторов:
!s1:0
+oa — оборотные активы;
+so — скорость оборота;
+rp — рентабельность продаж по валовой прибыли.

Исходные данные:

''План'/:
oa:615434881
so:780612980/615434881=1.26839248814
rp:525626183/780612980=0.673350554586

''Факт'/:
oa:1602398617
so:2507009504/1602398617=1.56453548911
rp:1568583644/2507009504=0.625679177322

Также, как и для предыдущей модели, введём следующие обозначения переменных и присвоим им соответствующие значения:
 ~oap=615434881
 ~sop=1.26839248814
 ~rpp=0.673350554586
 ~oaf=1602398617
 ~sof=1.56453548911
 ~rpf=0.625679177322
~oap=615434881
~sop=1.26839248814
~rpp=0.673350554586
~oaf=1602398617
~sof=1.56453548911
~rpf=0.625679177322

**Интегральный метод

Для вычислений по 3х факторным моделям интегральным методом используются функции:
- axbxc(a0,b0,c0,a1,b1,c1) - модель a*b*c
- adbpc(a0,b0,c0,a1,b1,c1) - модель a/(b+c) 

Им передаются 6 параметров:
!s1:0
+ Плановое значение 1-го фактора (a0)
+ Плановое значение 2-го фактора (b0)
+ Плановое значение 3-го фактора (c0)
+ Фактическое значение 1-го фактора (a1)
+ Фактическое значение 2-го фактора (a2)
+ Фактическое значение 3-го фактора (c2)

С учётом введенных обозначений исходных данных расчётная формула должна быть записана в следующем виде:
 ~res=axbxc(oap,sop,rpp,oaf,sof,rpf)
~res=axbxc(oap,sop,rpp,oaf,sof,rpf)

Результатом выполнения функции axbxc является вектор с элементами a, b, c. Элемент с индексом a содержит рассчитанное значение вклада фактора a в общее изменение показателя,  элемент с индексом b - значение вклада фактора b, элемент с индексом c - значение вклада фактора c. В наших обозначениях элемент с индексом a содержит значение вклада фактора oa, элемент с индексом b - значение вклада фактора so, элемент с индексом с - значение вклада фактора rp.

Для вывода результатов вводим следующий код:
!vp:0
Изменение за счёт фактора oa = {*=res('a')*}
Изменение за счёт фактора so = {*=res('b')*}
Изменение за счёт фактора rp = {*=res('c')*}
Суммарное изменение = ''{*=res('a')+res('b')+res('c')*}'/

Будет выведено:
!vp:1
Изменение за счёт фактора oa = {*=res('a')*}
Изменение за счёт фактора so = {*=res('b')*}
Изменение за счёт фактора rp = {*=res('c')*}
Суммарное изменение = ''{*=res('a')+res('b')+res('c')*}'/

**Метод цепных подстановок

Для вычислений по 3х-факторной мультипликативной модели используется функция mcp3mm(a0,b0,c0,a1,b1,c1). Она должна получить 6 параметров.
!s1:0
+a0 - плановое значение 1-го фактора;
+b0 - плановое значение 2-го фактора;
+c0 - плановое значение 3-го фактора;
+a1 - фактическое значение 1-го фактора;
+b1 - фактическое значение 2-го фактора;
+c1 - фактическое значение 3-го фактора.

Обозначения данных и переменных те же, что и в примере выполнения расчётов интегральным методом. Поэтому в нашем случае вызов функции mcp3mm() будет выглядеть так:
 ~res=mcp3mm(oap,sop,rpp,oaf,sof,rpf)
~res=mcp3mm(oap,sop,rpp,oaf,sof,rpf)

Результатом выполнения функции mcp3mm является вектор с элементами a, b, c. Элемент с индексом a содержит рассчитанное значение вклада фактора a в общее изменение показателя, элемент с индексом b - значение вклада фактора b, элемент с индексом c - значение вклада фактора c. В наших обозначениях элемент с индексом a содержит значение вклада фактора oa, элемент с индексом b - значение вклада фактора so, элемент с индексом с - значение вклада фактора rp.

Для вывода результатов ещё более простой, чем поля возможностью - вычисляемыми словами. Вычисляемое слов должно начинаться с символа = и далее без пробелов должно быть записано выражение. Если выражение может быть вычислено, то результат вычислений заменяет такое "слово". Если вычисление невозможно, то "слово" остаётся без изменений. Введём следующий код:
;Отменяем режим "вычисления слов"
!vs:0
Изменение за счёт фактора oa = =res('a')
Изменение за счёт фактора so = =res('b')
Изменение за счёт фактора rp = =res('c')
Суммарное изменение = '' =res('a')+res('b')+res('c') '/

!vs:1
Изменение за счёт фактора oa = =res('a')
Изменение за счёт фактора so = =res('b')
Изменение за счёт фактора rp = =res('c')
Суммарное изменение = '' =res('a')+res('b')+res('c') '/

Можно видеть, что результаты расчётов, выполненных интегральным методом и методом цепных подстановок различаются.

При использовании метода цепных подстановок будут различаться и результаты расчётов при другом порядке факторов. 

*Расчёты по произвольным моделям

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

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

ПрибыльПродаж = В * РП — КР — УР

Где:
-В — выручка;
-РП — рентабельность продаж;
-КР — коммерческие расходы;
-УР — управленческие расходы.

Введём следующие обозначения факторов:
-vr — выручка от реализации;
-rp — рентабельность продаж по валовой прибыли;
-kr — коммерческие расходы;
-ur — управленческие расходы.

Для вычислений по произвольным моделям методом цепных подстановок используется встроенная функция mcp(model,plan,fakt), где
- model - число (номер модели) или формула;
- plan - вектор плановых значений факторов;
- fakt - вектор фактических значений факторов.

Если модель задана числом, то оно интерпретируется следующим образом:
-0 - аддитивная модель;
-1, 2 - мультипликативная модель;
-3 - кратная модель y=a/b;
-4 - кратная модель y=a/(b+c).

В качестве модели можно задать в одинарных или двойных кавычках произвольную расчётную формулу.

В рассматриваемом примере с учётом введенных обозначений расчётная формула будет выглядеть так: ''vr*rp-kr-ur'/

Для создания вектора плановых значений факторов можно ввести команду создания вектора с индексами vr, rp, kr, ur:
 ~p=massiv("vr:780612980 rp:0.673350554586 kr:309923956 ur:8147344")
~p=massiv("vr:780612980 rp:0.673350554586 kr:309923956 ur:8147344")

Точно также создаётся и вектор фактических значений:
 ~f=massiv("vr:2507009504 rp:0.625679177322 kr:639679363 ur:33278171")
~f=massiv("vr:2507009504 rp:0.625679177322 kr:639679363 ur:33278171")

В этих обозначениях вызов функции mcp() будет выглядеть так:
 ~r=mcp('vr*rp-kr-ur',p,f)
~r=mcp('vr*rp-kr-ur',p,f)

Результатом выполнения функции mcp() будет вектор вклада факторов в общее изменение показателя. Индексы элементов этого вектора будут совпадать с именами факторов. Простейшим способом вывода полученного вектора является использование функции vms(имя_вектора). В нашем случае надо с первой позиции новой строки ввести: @vms(r)
@vms(r)