Расчет медианы и квартилей для дискретного ряда запросом

05.12.19

Разработка - Запросы

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

Что такое медиана и квартили?

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

Квартили — числовые значения признака, которые делят упорядоченную по возрастанию совокупность на четыре равных части. 
Раз квартили делят совокупность на четыре части, то квартилей бывает три варианта: первый (нижний), второй(средний), третий (верхний). Второй квартиль это и есть медиана.

Пример

Имеем числовой ряд [1,3,5,7,9,11,13]:

  • Медиана = 7 (делит исходный ряд пополам [1,3,5] + [9,11,13]);
  • Квартиль1 = 3 (делит ряд [1,3,5] пополам);
  • Квартиль2 = Медиана = 7;
  • Квартиль3 = 11 (делит ряд [9,11,13] пополам).

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

Зачем все это нужно?

Медиана

Такой показатель как "среднее" знаком всем и ни у кого не возникает вопросов о его необходимости. Проблема со средним в том, что оно хорошо описывает данные, если они распределены нормально. Иначе, как правило, разумнее использовать медиану. 

Самый простой пример: средняя зарплата в России. Показатель в некотором смысле отражает "среднюю температуру по больнице", так как на него оказывают сильное влияние выбросы — условно, слишком большие зарплаты олигархов. В то же время, медиана показывает такой размер зарплаты, который делит население пополам — половина получает меньше этой суммы, половина больше. В итоге, медиана почти в 1.5 раза меньше средних показателей зарплаты.

Более близкий пример к 1С: средний чек. Если хочется оценить динамику этого показателя, то лучше использовать медиану. Причина: на среднее сильно влияют выбросы — очень маленькие покупки или наоборот очень большие.

Квартили

Например, есть задача оценки адекватности закупочной цены на товар на текущий момент. 

Один из вариантов — посмотреть по каким ценам продавался этот товар ранее и исходя из наценки рассчитать целевую закупочную цену. Но смотреть на среднее, как было сказано выше, плохая затея. Можно, например, попытаться определить такую цену, что 75% товара продавалось по ней или выше — это и будет 1-й квартиль. Все это, правда, будет работать, если у нас достаточно наблюдений — например, товар продавался хотя бы раз 30, чтобы было на основе чего все рассчитывать.
Безусловно, все это не может быть единственным критерием для определения разумной закупочной цены и нужно использоваться что-то еще.

Формулы

В общем случае можно посчитать порядковый номер медианы и квартилей:

  • порядковый номер медианы = (n+1)/2;
  • порядковый номер квартиля = номер квартиля*(n+1)/4.

В нашем примере:

  • порядковый номер медианы = (7+1)/2 = 4;
  • порядковый номер первого квартиля = 1*(7+1)/4 = 2;
  • порядковый номер первого квартиля = 2*(7+1)/4 = 4;
  • порядковый номер первого квартиля = 3*(7+1)/4 = 6.

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

Так же в общем случае, не всегда есть порядковый номер: один и тот же признак может встречаться в выборке несколько раз и пронумеровать их можно будет только условно. Например, в статье //infostart.ru/public/539316/ рассматривается как раз такой вариант решения.

В общем случае, можно использовать понятие накопленной частоты для каждого уникального элемента ряда. Подробнее про теорию можно почитать, например, тут: https://studfile.net/preview/5316597/page:3/#9. Там же есть хорошие примеры расчета.

Запрос

Постарался прокомментрировать все действия в самом запросе

//готовим саму выборку данных
//Значение — значение признака
//Частота — сколько раз данный признак встречается в выборке
ВЫБРАТЬ
    Продажи.Номенклатура КАК Группировка,
    СУММА(Продажи.КоличествоОборот) КАК Частота,
    ВЫРАЗИТЬ(Продажи.СтоимостьОборот / Продажи.КоличествоОборот КАК ЧИСЛО(15, 0)) КАК Значение
ПОМЕСТИТЬ врВыборка
ИЗ
    (ВЫБРАТЬ
        ПродажиОбороты.Номенклатура КАК Номенклатура,
        ПродажиОбороты.Регистратор КАК Регистратор,
        ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
        ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот
    ИЗ
        РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты
    ГДЕ
        ПродажиОбороты.КоличествоОборот > 0
        И ПродажиОбороты.СтоимостьОборот > 0) КАК Продажи
 
СГРУППИРОВАТЬ ПО
    Продажи.Номенклатура,
    ВЫРАЗИТЬ(Продажи.СтоимостьОборот / Продажи.КоличествоОборот КАК ЧИСЛО(15, 0))
;
 
////////////////////////////////////////////////////////////////////////////////
//рассчитываем порядковые номера квартилей и медианы, отдельно целые части, отдельно дробные
//попутно рассчитываем средние, минимальные и максимальные значения
ВЫБРАТЬ
    врВыборка.Группировка,
    СУММА(врВыборка.Частота) КАК РазмерВыборки,
    ВЫРАЗИТЬ(СУММА(врВыборка.Частота * врВыборка.Значение) / СУММА(врВыборка.Частота) КАК ЧИСЛО(15, 2)) КАК СреднееЗначениеПоВыборке,
    МИНИМУМ(врВыборка.Значение) КАК МинимальноеЗначениеПоВыборке,
    МАКСИМУМ(врВыборка.Значение) КАК МаксимальноеЗначениеПоВыборке,
    ВЫРАЗИТЬ((СУММА(врВыборка.Частота) + 1) / 2 - 0.5 КАК ЧИСЛО(15, 0)) КАК ПорядковыйНомерМедианы,
    (СУММА(врВыборка.Частота) + 1) / 2 - (ВЫРАЗИТЬ((СУММА(врВыборка.Частота) + 1) / 2 - 0.5 КАК ЧИСЛО(15, 0))) КАК СмещениеМедианыВправо,
    ВЫРАЗИТЬ(1 * (СУММА(врВыборка.Частота) + 1) / 4 - 0.5 КАК ЧИСЛО(15, 0)) КАК ПорядковыйНомерКвартиля1,
    1 * (СУММА(врВыборка.Частота) + 1) / 4 - (ВЫРАЗИТЬ(1 * (СУММА(врВыборка.Частота) + 1) / 4 - 0.5 КАК ЧИСЛО(15, 0))) КАК СмещениеКвартиля1Вправо,
    ВЫРАЗИТЬ(3 * (СУММА(врВыборка.Частота) + 1) / 4 - 0.5 КАК ЧИСЛО(15, 0)) КАК ПорядковыйНомерКвартиля3,
    3 * (СУММА(врВыборка.Частота) + 1) / 4 - (ВЫРАЗИТЬ(3 * (СУММА(врВыборка.Частота) + 1) / 4 - 0.5 КАК ЧИСЛО(15, 0))) КАК СмещениеКвартиля3Вправо
ПОМЕСТИТЬ врСвойстваВыборки
ИЗ
    врВыборка КАК врВыборка
 
СГРУППИРОВАТЬ ПО
    врВыборка.Группировка
;
 
////////////////////////////////////////////////////////////////////////////////
//рассчитываем порядковые номера для каждого признака
//при этом т.к. признак может повторяться, то рассчитываем и первые (левый) номер для данном значения признака и последний (правый)
//по сути это и есть накопленная частота
ВЫБРАТЬ
    врВыборка.Группировка,
    врВыборка.Частота,
    врВыборка.Значение,
    СУММА(врВыборкаВспомогательная.Частота) КАК НакопленнаяЧастотаПравогоЭлемента,
    СУММА(ВЫБОР
            КОГДА врВыборкаВспомогательная.Значение = врВыборка.Значение
                ТОГДА 0
            ИНАЧЕ врВыборкаВспомогательная.Частота
        КОНЕЦ) + 1 КАК НакопленнаяЧастотаЛевогоЭлемента
ПОМЕСТИТЬ врВыборкаСНакопленнойЧастотой
ИЗ
    врВыборка КАК врВыборка
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ врВыборка КАК врВыборкаВспомогательная
        ПО врВыборка.Группировка = врВыборкаВспомогательная.Группировка
            И врВыборка.Значение >= врВыборкаВспомогательная.Значение
 
СГРУППИРОВАТЬ ПО
    врВыборка.Группировка,
    врВыборка.Частота,
    врВыборка.Значение
;
 
////////////////////////////////////////////////////////////////////////////////
//следующие два запроса выполняют сам расчет, их стоит рассматривать как одно целое
//разделены они для наглядности и простоты отладки
ВЫБРАТЬ
    врВыборкаСНакопленнойЧастотой.Группировка,
    врВыборкаСНакопленнойЧастотой.Частота,
    врВыборкаСНакопленнойЧастотой.Значение,
    ВЫБОР
        КОГДА врСвойстваВыборки.ПорядковыйНомерМедианы >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерМедианы <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА врВыборкаСНакопленнойЧастотой.Значение
        ИНАЧЕ 0
    КОНЕЦ КАК МедианаЦелаяЦасть,
    ВЫБОР
        КОГДА врСвойстваВыборки.ПорядковыйНомерМедианы >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерМедианы <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерМедианы + 1 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерМедианы + 1 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА 0
        КОГДА врСвойстваВыборки.ПорядковыйНомерМедианы + 1 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерМедианы + 1 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА врВыборкаСНакопленнойЧастотой.Значение
        КОГДА врСвойстваВыборки.ПорядковыйНомерМедианы >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерМедианы <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА -врВыборкаСНакопленнойЧастотой.Значение
        ИНАЧЕ 0
    КОНЕЦ * врСвойстваВыборки.СмещениеМедианыВправо КАК МедианаДробнаяЧасть,
    ВЫБОР
        КОГДА врСвойстваВыборки.ПорядковыйНомерКвартиля1 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля1 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА врВыборкаСНакопленнойЧастотой.Значение
        ИНАЧЕ 0
    КОНЕЦ КАК Квартиль1ЦелаяЦасть,
    ВЫБОР
        КОГДА врСвойстваВыборки.ПорядковыйНомерКвартиля1 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля1 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля1 + 1 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля1 + 1 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА 0
        КОГДА врСвойстваВыборки.ПорядковыйНомерКвартиля1 + 1 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля1 + 1 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА врВыборкаСНакопленнойЧастотой.Значение
        КОГДА врСвойстваВыборки.ПорядковыйНомерКвартиля1 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля1 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА -врВыборкаСНакопленнойЧастотой.Значение
        ИНАЧЕ 0
    КОНЕЦ * врСвойстваВыборки.СмещениеКвартиля1Вправо КАК Квартиль1ДробнаяЧасть,
    ВЫБОР
        КОГДА врСвойстваВыборки.ПорядковыйНомерКвартиля3 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля3 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА врВыборкаСНакопленнойЧастотой.Значение
        ИНАЧЕ 0
    КОНЕЦ КАК Квартиль3ЦелаяЦасть,
    ВЫБОР
        КОГДА врСвойстваВыборки.ПорядковыйНомерКвартиля3 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля3 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля3 + 1 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля3 + 1 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА 0
        КОГДА врСвойстваВыборки.ПорядковыйНомерКвартиля3 + 1 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля3 + 1 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА врВыборкаСНакопленнойЧастотой.Значение
        КОГДА врСвойстваВыборки.ПорядковыйНомерКвартиля3 >= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента
                И врСвойстваВыборки.ПорядковыйНомерКвартиля3 <= врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента
            ТОГДА -врВыборкаСНакопленнойЧастотой.Значение
        ИНАЧЕ 0
    КОНЕЦ * врСвойстваВыборки.СмещениеКвартиля3Вправо КАК Квартиль3ДробнаяЧасть,
    врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаПравогоЭлемента,
    врВыборкаСНакопленнойЧастотой.НакопленнаяЧастотаЛевогоЭлемента,
    врСвойстваВыборки.РазмерВыборки,
    врСвойстваВыборки.СреднееЗначениеПоВыборке,
    врСвойстваВыборки.МинимальноеЗначениеПоВыборке,
    врСвойстваВыборки.МаксимальноеЗначениеПоВыборке,
    врСвойстваВыборки.ПорядковыйНомерМедианы,
    врСвойстваВыборки.СмещениеМедианыВправо,
    врСвойстваВыборки.ПорядковыйНомерКвартиля1,
    врСвойстваВыборки.СмещениеКвартиля1Вправо,
    врСвойстваВыборки.ПорядковыйНомерКвартиля3,
    врСвойстваВыборки.СмещениеКвартиля3Вправо
ПОМЕСТИТЬ врИтоговаяТаблица
ИЗ
    врВыборкаСНакопленнойЧастотой КАК врВыборкаСНакопленнойЧастотой
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ врСвойстваВыборки КАК врСвойстваВыборки
        ПО врВыборкаСНакопленнойЧастотой.Группировка = врСвойстваВыборки.Группировка
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    врИтоговаяТаблица.Группировка,
    врИтоговаяТаблица.РазмерВыборки,
    врИтоговаяТаблица.СреднееЗначениеПоВыборке,
    врИтоговаяТаблица.МинимальноеЗначениеПоВыборке,
    врИтоговаяТаблица.МаксимальноеЗначениеПоВыборке,
    СУММА(врИтоговаяТаблица.МедианаЦелаяЦасть) + СУММА(врИтоговаяТаблица.МедианаДробнаяЧасть) КАК Медиана,
    СУММА(врИтоговаяТаблица.Квартиль1ЦелаяЦасть) + СУММА(врИтоговаяТаблица.Квартиль1ДробнаяЧасть) КАК Квартиль1,
    СУММА(врИтоговаяТаблица.Квартиль3ЦелаяЦасть) + СУММА(врИтоговаяТаблица.Квартиль3ДробнаяЧасть) КАК Квартиль3
ИЗ
    врИтоговаяТаблица КАК врИтоговаяТаблица
 
СГРУППИРОВАТЬ ПО
    врИтоговаяТаблица.Группировка,
    врИтоговаяТаблица.РазмерВыборки,
    врИтоговаяТаблица.СреднееЗначениеПоВыборке,
    врИтоговаяТаблица.МинимальноеЗначениеПоВыборке,
    врИтоговаяТаблица.МаксимальноеЗначениеПоВыборке

Квантили

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

Ссылки

Немного теории (кривой сайт, но все понятно написано и хорошие примеры): https://studfile.net/preview/5316597/page:3/#9

Похожая разработка (но требующая уникальности): //infostart.ru/public/539316/

Видео-курс "Основы статистики": https://stepik.org/course/76/

медиана квартиль квантиль перцентиль статистические показатели

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169353    937    403    

905

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11408    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6349    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

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

16.08.2024    9080    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2732    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10226    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3628    andrey_sag    10    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 22.11.19 17:38 Сейчас в теме
решения интересные, но смущает монстроидальность.
в 1С83+ есть мощные средства работы со статистикой "АнализДанных" и т.п.
по крайней мере медианы через них можно вычислять намного проще.

теорию вероятностей преподают в уважающих себя технических вузах и по
видо-курсу ее изучить маловероятно.
Решение задачек по ТВ и комбинаторике очень увлекательное занятие, а когда наступит эра
квантовых компьютеров, то эти навыки будут необходимы чтобы остаться востребованным программистом.
wowik; bahtiyar_sharipov; trickster; +3 Ответить
3. starik-2005 3097 22.11.19 21:00 Сейчас в теме
(1)
теорию вероятностей преподают в
А при чем тут тервер? Здесь социальная статистика - не более...
relines; rpashkovsky; +2 Ответить
2. MarryJane 31 22.11.19 17:50 Сейчас в теме
Спасибо возьмем на заметку
4. user604727 25.11.19 09:21 Сейчас в теме
Это очень важно, но для моих клиентов из числа бухгалтеров была бы очень полезна также возможность рассчитывать в запросе тангенсы и арктангенсы, а также интегралы и ранги матриц.
uzhelas; KazanKokos; user774630; wowik; EMelihoff; +5 2 Ответить
5. MikhailDr 26.11.19 07:48 Сейчас в теме
Было бы неплохо в конце статьи привести примеры использования данного инструмента. В таком случае выше вероятность, что прочитавший потом вернется сюда за решением своей проблемы.
6. relines 43 26.11.19 14:48 Сейчас в теме
(5) Спасибо за замечание. В ближайшее время постараюсь привести примеры, для чего это можно использовать в реальной жизни. Так же, возможно, по мере развития этого механизма у нас, буду добавлять дополнительные показатели для расчета.
7. Evgeniy 106 25.02.22 20:46 Сейчас в теме
(6) решение конечно громоздкое, но для вычисления квартилей не нашел другого варианта.
за что автору спасибо большое.

Вычисление "медианы" имеется в функционале "АнализДанных", а вот вычисление квартилей не нашел

Так же мне нужно вычислить Перцентиль, можете помочь с запросом по аналогии?
8. demka123 16.12.22 14:35 Сейчас в теме
По-моему у вас ошибка в запросе временной таблицы врСвойстваВыборки
по формуле вот здесь https://studfile.net/preview/5316597/page:3/#9 третий квантиль считается вот так
(3*n+1)/4
у вас же написано
3*(n+1)/4
Оставьте свое сообщение