Как стать автором
Обновить

Кривая Безье на службе экономистов по труду

ПрограммированиеПрототипированиеУправление персоналомБизнес-моделиСофт
Из песочницы
(результирующее представление попытки разработки обоснования установленных окладов на предприятии)

Вместо аннотации


Если Вы хоть раз задумывались о необходимости обоснования размеров окладной части заработных плат работников предприятия, Вам требовалась наглядность и простота в принятии подобных решений, то Вы не одиноки и материал под катом для Вас. Здесь будет представлена скромная попытка реализации системы обоснования окладов на предприятии с применением современных механизмов комплексного оценивания для вывода бально-рейтинговой системы и кривых Безье, как основы приведения баллов к результирующим окладам.

Небольшой комплимент habr(у):
В научной статье в каком-то «приличном» журнале, где, в какой-то мере, требуется написание ритуальных частей статьи, мне бы пришлось весьма витиевато выкручивать актуальность статьи, подводить под это множественные литературные источники и заниматься порой ненужным публикационным графоманством. Habr стал мне отдушиной, позволяющей выразить мысли по делу и без лишних «поклонов» научному сообществу. При этом подчеркну, что в степени образованности коллектива на ресурсе не просто не стоит сомневаться, но порой приходится задуматься о собственном соответствии.

Краткая постановка проблемы


Структура общего вознаграждения современного предприятия разнообразна, в обобщённом виде может содержать различные компоненты (рис. 1). В данной публикации нас будет интересовать именно Базовая заработная плата. Можно также отметить, что в процессе работы по большей части рассматривались структуры, где превалирует повременная оплата труда.

1
Рисунок 1. Структура общего вознаграждения.

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

Чистая повременная оплата не является стимулирующим фактором, но при нарушении принципа справедливости и прозрачности может значительно влиять на снижение мотивации. Нарушение принципа справедливости выражается в следующем:

  1. Нормативные локальные акты по оплате являются формальными и не определяют реальное установление и изменение окладов.
  2. Тарифная сетка построена так, что специалист без категории может получать столько же, сколько и начальник отдела (размытость сетки).
  3. Группы должностей, объединенные в категории оплат, могут значительно отличаться по сложности выполняемых работ.
  4. Оклады зависят от того, в каком подразделении работает работник, а не от сложности его работы.

Также введём кое-какие дополнительные термины:

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

Иными словами:
— это разбиение всех должностей в компании по разрядам от высшего до низшего, каждому из которых присваивается определённый должностной оклад, или «вилка» оклада, определяющая минимальную и максимальную тарифную ставку для каждой должностной позиции.
Наше трудовое законодательство не требует штатного расписания и тарифной сетки для коммерческих структур, и то и другое нужно прежде всего самому работодателю как инструмент управления трудовыми ресурсами.

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

Привносим изменения


(разработка модели)
Обычно для реализации многофакторных моделей, от которых требуется, в конечном счёте, получить единственный численный результат, мной предпочитается метод комплексного оценивания, основанных на деревьях критериев, матрицах свёртки, системе приведения критериев к единой шкале.

Если очень коротко, то преимуществами таких построений являются возможности:

  • применения неограниченного числа факторов оценивания;
  • реализация нелинейности и изменчивости степени влияния факторов;
  • включения факторов различных типов (с физическими изменениями, экспертными оценками, таблицами соответствия и т.д.);
  • прогнозирования результатов и ожидание значения в определённом диапазоне.

Удобство применения таких механизмов удачно сочетается с многовариантностью получаемой оценки, поскольку даже в ограниченном числовом диапазоне 1-4, который принимает комплексная оценка, можно получить достаточное разнообразие.

2
Рисунок 2. Структурная схема получения грейдов и их перевода в оклады персонала.
Идея состояла в том, чтобы по нескольким критериям была произведена оценка «значимости» для бизнеса структурного подразделения и конкретной должности для этого подразделения.

В целом, по данной схеме требуется отметить:

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

При формировании оценки значимости отдела использовались следующие критерии:

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

В представленных критериях оценки всегда присутствуют 3 варианта для каждого критерия. Данные варианты расставлены «по убыванию» значимости от оценки 4 до оценки 1. Средний вариант соответствует оценке 2,5. Применяя данное приведение можно перевести все оценки в стандартной шкале комплексного оценивания 1-4 (здесь надо просто принять… так договорились).
Базовый вид древа оценки значимости должности сформировался следующим образом:

  1. Уровень должности: руководители, специалисты, исполнители;
  2. Виды задач: организационные, творческие, регламентированные;
  3. Связанность задач: с внешней средой, между подразделениями, внутри подразделения.

Пример того, выглядит модель комплексного оценивания, которую, к слову говоря, нам удалось «загнать» в Excel, т.е. сделать доступной, показывает, насколько просто провести процедуру оценки.

3
Рисунок 3. Общий вид модели комплексного оценивания «Ценность подразделения».
После составления модели каждому критерию для каждого подразделения (а для должностей, соответственно, своя модель) выставляется своя оценка, а система просто считает. Остаётся записать данные значения.

Как же в итоге выглядит «сводка» по грейдам?

5
Рисунок 4. Пример расчёта грейда вида «значимость отдела / значимость должности».

В данном случае оптимальным показалось перемножение «значимость отдела» и «значимость должности». Результат получился достаточно дифференцированным и мог бы быть использован для определения тарифной сетки.

Последний компонент


Как Вы помните, в соответствии с рисунком 2, требуется теперь перевести бально-рейтинговую оценку в оклад.

Изначально предполагалось, что это можно сделать с применением простой линейной функции. Для этих целей ЛПРу (лицу принимающему решения) предлагается просто обозначить минимальный и максимальный оклад на предприятии. Вполне простой и логичный ход, как казалось.

Первая и очевидная попытка — привязать линейной схемой. При указанных параметрах ЛПРом (руководитель одного из Университетов) получился такой результат, что руководитель структурного подразделения получив грейдовый балл 13, должен бы получать заработную плату выше 200 тыс (заведующий кафедрой).

5
Рисунок 5. Пример «обличения» грейдов к размерам оплаты труда с применением линейной шкалы приведения.

Потребность в реализации простой системы формирования нелинейного приведения "оклады/грейды" стала очевидной. При этом требовалось максимально упростить процесс «подбора» оптимального приведения.

Кривые Безье пришли на ум совершенно случайно. Поскольку крайние точки для кривой определяются автоматически (минимальный и максимальный грейд / минимальный и максимальный оклад), то ЛПРу останется просто смещать одну/две точки, чтобы получить нужный вид кривой.

8
Рисунок 6. Графический элемент управления «Кривая Безье», реализованный в Excel
Первоначально была предпринята попытка обойтись лишь квадратичным вариантом кривой, однако, после попыток построения, стало понятно, что обойтись лишь им не получится и требуется реализовать кубический вариант функции.

Чтобы в Excel сформировать кривую Безье требуется произвести следующие действия:

  • Обозначить крайние точки на графике по координатам X, Y: (1;1) и (4;4) — в рассматриваемом примере. Такие крайние координаты приняты для того, чтобы график выглядел наглядно. От него не требуется показывать реальную связь, а лишь показывать зависимость;
  • Обозначить координаты для смещаемых ЛПРом точек: одна точка для квадратичной кривой и две точки для кубической;
  • Задать шаг расчёта для кривой (в нашем примере — 0,5) и просчитать пары точек для кривой.

Пример:
Предположим обозначены крайние точки: (X1; Y1) — (1; 1), (X4; Y4) — (4; 4). Представим, что существуют 2 дополнительные смещаемые точки: (X2; Y2), (X3; Y3). При этом каждая координата находится в диапазон 1-4 и не входит за него.

Чтобы для квадратической кривой построить координату X для заданного шага интервала Ti можно применить формулу:

=СТЕПЕНЬ(Ti;2)*X1+2*(Ti)*Ti*X2+СТЕПЕНЬ(Ti;2)*X4,
где в качестве X1, X2, X4 нужно указывать ссылки на ячейки с координатами.

Аналогичным образом можно посчитать и для точки Y, подменив X координаты на Y-овые.

Что касается координат для кубической кривой, то здесь формула имеет вид:
=СТЕПЕНЬ(1-Ti;3)*X1+3*СТЕПЕНЬ(1-Ti;2)*Ti*X2+3*(1-Ti)*СТЕПЕНЬ(Ti;2)*X3+СТЕПЕНЬ(Ti;3)*X4

После построения кривых ЛПР получил визуальный инструмент управления. Однако, для применения кривых требуется реализовать процесс получения координаты Y по указываемой координате Y. Вот здесь была сама большая проблема. Однако, удалось реализовать код VBA, позволяющий совершать такие операции.

Для квадратической функции:

Function Безье_поиск_Y_по_X_по_квадратичному( _
        X As Double, _
        X1 As Double, _
        X2 As Double, _
        X3 As Double, _
        Y1 As Double, _
        Y2 As Double, _
        Y3 As Double) As Double
        
    Dim aX, bX, cX, aY, bY, cY, Temp, dis, X_1, X_2, X_f, Y_f As Double
        
    aX = X1 - 2 * X2 + X3
    bX = -2 * X1 + 2 * X2
    cX = X1 - X
    
    aY = Y1 - 2 * Y2 + Y3
    bY = -2 * Y1 + 2 * Y2
    cY = Y1
        
    dis = bX * bX - 4 * aX * cX
    
    If aX <> 0 Then
        X_1 = (-bX + (dis ^ (1 / 2))) / (2 * aX)
        X_2 = (-bX - (dis ^ (1 / 2))) / (2 * aX)
    Else
        X_1 = -cX / bX
    End If
        
    If Not IsEmpty(X_1) Then If ((CDbl(CStr(X_1)) >= 0) And (CDbl(CStr(X_1)) <= 1)) Then X_f = X_1
    If Not IsEmpty(X_2) Then If ((CDbl(CStr(X_2)) >= 0) And (CDbl(CStr(X_2)) <= 1)) Then X_f = X_2
    
    Y_f = ((1 - X_f) ^ 2) * Y1 + 2 * (1 - X_f) * X_f * Y2 + (X_f ^ 2) * Y3
    '=СТЕПЕНЬ(1-R[-1]C[-1];2)*R58C2+2*(1-R[-1]C[-1])*R[-1]C[-1]*R58C3+СТЕПЕНЬ(R[-1]C[-1];2)*R58C5
    a = a
    Безье_поиск_Y_по_X_по_квадратичному = Y_f

End Function

Для кубической функции:

Function Безье_поиск_Y_по_X_по_кубическому( _
        X As Double, _
        X1 As Double, _
        X2 As Double, _
        X3 As Double, _
        X4 As Double, _
        Y1 As Double, _
        Y2 As Double, _
        Y3 As Double, _
        Y4 As Double) As Double

    Dim myPi, aX, bX, cX, dX, aY, bY, cY, dY, Q, P, S, Temp, fi, dis, X_1, X_2, X_3, X_f, Y_f As Double
    'Exit Function
    'If X1 = 1.5 Or X = 0 Or X1 = 0 Or X2 = 0 Or X3 = 0 Or X4 = 0 Then Exit Function

    'Application.Volatile True
    
    myPi = WorksheetFunction.Acos(-1)
    
    aX = -X1 + (3 * X2) - (3 * X3) + X4
    bX = 3 * X1 - 6 * X2 + 3 * X3
    cX = -3 * X1 + 3 * X2
    dX = X1 - X
    
    aY = -Y1 + 3 * Y2 - 3 * Y3 + Y4
    bY = 3 * Y1 - 6 * Y2 + 3 * Y3
    cY = -3 * Y1 + 3 * Y2
    dY = Y1
    
    If aX < 0.000001 And aX > -0.000001 Then _
        aX = 0
    If CDbl(CStr(aX)) <> 0 Then
        Temp = aX
        aX = aX / Temp
        bX = bX / Temp
        cX = cX / Temp
        dX = dX / Temp
        
        Q = (bX ^ 2 - 3 * cX) / 9
        P = (2 * (bX ^ 3) - 9 * bX * cX + 27 * dX) / 54
        S = Q ^ 3 - P ^ 2
        
        'X1 = -1
        'X2 = -1
        'X3 = -1
        T = T
        If S < 0.00000001 And S > -0.00000001 Then _
        S = 0
        If P < 0.00000001 And P > -0.00000001 Then _
        P = 0
        If Q < 0.00000001 And Q > -0.000000001 Then _
        Q = 0
        
        If S > 0 Then
            fi = (1 / 3) * WorksheetFunction.Acos(P / ((Q ^ 3) ^ (1 / 2)))
            X_1 = -2 * (Q ^ (1 / 2)) * Cos(fi) - bX / 3
            X_2 = -2 * (Q ^ (1 / 2)) * Cos(fi + 2 * myPi / 3) - bX / 3
            X_3 = -2 * (Q ^ (1 / 2)) * Cos(fi - 2 * myPi / 3) - bX / 3
        ElseIf S = 0 Then
            fi = 0
            X_1 = -2 * (P ^ (1 / 3)) - bX / 3
            X_2 = (P ^ (1 / 3)) - bX / 3
        Else
            If Q > 0 Then
                fi = (1 / 3) * WorksheetFunction.Acosh(Abs(P) / ((Q ^ 3) ^ (1 / 2)))
                X_1 = -2 * Sgn(P) * (Q ^ (1 / 2)) * WorksheetFunction.Cosh(fi) - bX / 3
            ElseIf Q = 0 Then
                fi = 0
                
                T = (dX - (bX ^ 3) / 27)
                X_1 = -((Abs(T) ^ (1 / 3)) * (2 * (T < 0) + 1)) - bX / 3
                
                
                'T = (dX - (bX ^ 3) / 27)
                'T = (Abs(T) ^ (1 / 3)) * ((T < 0) + 1)
                'X_1 = -T - bX / 3
            Else
                fi = (1 / 3) * WorksheetFunction.Asinh(Abs(P) / ((Abs(Q) ^ 3) ^ (1 / 2)))
                X_1 = -2 * Sgn(P) * (Abs(Q) ^ (1 / 2)) * WorksheetFunction.Sinh(fi) - bX / 3
            End If
        End If
    
        If Not IsEmpty(X_1) Then If ((CDbl(CStr(X_1)) >= 0) And (CDbl(CStr(X_1)) <= 1)) Then X_f = X_1
        If Not IsEmpty(X_2) Then If ((CDbl(CStr(X_2)) >= 0) And (CDbl(CStr(X_2)) <= 1)) Then X_f = X_2
        If Not IsEmpty(X_3) Then If ((CDbl(CStr(X_3)) >= 0) And (CDbl(CStr(X_3)) <= 1)) Then X_f = X_3
        a = a
    Else
            dis = cX * cX - 4 * bX * dX
        If bX < 0.000001 And bX > -0.000001 Then _
        bX = 0
        If bX <> 0 Then
            X_1 = (-cX + (dis ^ (1 / 2))) / (2 * bX)
            X_2 = (-cX - (dis ^ (1 / 2))) / (2 * bX)
        Else
            X_1 = -dX / cX
        End If
    If Not IsEmpty(X_1) Then If ((CDbl(CStr(X_1)) >= 0) And (CDbl(CStr(X_1)) <= 1)) Then X_f = X_1
    If Not IsEmpty(X_2) Then If ((CDbl(CStr(X_2)) >= 0) And (CDbl(CStr(X_2)) <= 1)) Then X_f = X_2
    End If
    a = a
    
    Y_f = ((1 - X_f) ^ 3) * Y1 + 3 * ((1 - X_f) ^ 2) * X_f * Y2 + 3 * (1 - X_f) * (X_f ^ 2) * Y3 + (X_f ^ 3) * Y4
    
    'Debug.Print (Y_f)
    
    
    Безье_поиск_Y_по_X_по_кубическому = Y_f

End Function

В процессе работы делались попытки найти готовый вариант в сети и переработать, но не случилось. Также случайно обнаружилось, что VBA не умеет корректно извлекать корень нечётной степени из отрицательного числа. Только определённая комбинация позволила исправить ситуацию:

T = (dX - (bX ^ 3) / 27)
X_1 = -((Abs(T) ^ (1 / 3)) * (2 * (T < 0) + 1)) - bX / 3

*-возможно в коде остался где-то ещё момент, связанный с таким вычислением. Баг обнаружился в процессе написания статьи )

Результирующие построения


Итак, сравним результаты (построено в соответствии с видом кривых на рисунке 6 (правый график)):

9
Рисунок 7. Сравнение приведений грейдов к реальным окладам (отражение гибкости системы)

Из рисунка видно, что кубическая функция позволяет ещё сильнее «выгнуть» зависимость бально-рейтинговой оценки и реального оклада (управленца, к сожалению, удовлетворил именно этот вариант).

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

Надеюсь, что она не «ляжет на полку», а кому-то окажется нужной.
Теги:Управление персоналомсистемы оплаты трудаметоды комплексного оцениваниясистемы поддержки принятия решениймоделированиеVBAБезье
Хабы: Программирование Прототипирование Управление персоналом Бизнес-модели Софт
Всего голосов 9: ↑8 и ↓1 +7
Просмотры2.8K

Похожие публикации

Enterprise архитектор (разработка системы мониторинга)
от 270 000 до 300 000 ₽Ростелеком-ЦОДМоскваМожно удаленно
Геймдизайнер
от 100 000 до 200 000 ₽ReleaseBandМожно удаленно
Solution архитектор (разработка системы мониторинга)
от 250 000 до 280 000 ₽Ростелеком-ЦОДМосква
Golang/Node.js программист с опытом в крипто-роботах
от 2 500 до 4 000 $Quant Trading SystemsМожно удаленно
Senior SAP HR PY
от 270 000 до 350 000 ₽ГК МегаполисМожно удаленно

Лучшие публикации за сутки