Имя: Пароль:
1C
1С v8
Медиана, 25 и 75 перцентили по таблице значений
0 ANL
 
28.09.18
09:43
Добрый день,

Кто-нибудь знает ответ, как в 1С посчитать по ТЗ, в которой содержатся стоимости и время получения этих стоимостей, медиану и перцентили?
Медиану еще как-то считали запросом, а перцентили (квартили) нет.
Все что нашел - советы "передать в ексель, посчитать, забрать результат" - но это я сам вряд ли реализую, только если у кого-то есть готовое решение.
Или все-таки средствами 1с можно реализовать?
1 Лодырь
 
28.09.18
09:46
Можно.
2 ANL
 
28.09.18
09:48
Если знаете, посоветуйте, где посмотреть реализацию?
3 МихаилМ
 
28.09.18
09:49
ищите в "анализ данных общая статистика"
4 Лодырь
 
28.09.18
09:51
(3) Это даст только медиану. Там вроде квантилей нет.
5 ANL
 
28.09.18
09:51
Смотрел, там медиана есть а перцентилей не нашел
6 Armando
 
28.09.18
09:53
В 1С есть объект Анализ данных. Посмотри, может он это умеет
7 Лодырь
 
28.09.18
09:54
Можете реализовать сами, путем соединения таблицы с самой собой и вычисления количества записей больше(меньше) по некому порядку. Ну а потом дело техники, отобрать нужные.
8 s03
 
28.09.18
09:56
(0) как вариант - загнать в Excel, там обработать имеющейся тама формулой и получить от туда результат.
Так однажды пришлось формулой расчета аннуитета пользоваться
9 ANL
 
28.09.18
10:01
(8) А есть пример как загнать/посчитать/получить результат? Чтобы просто формулу поменять и заработало :)
10 s03
 
28.09.18
10:03
(9) примера под руками сейчас нет, это лет 10 назад было ((( но как вставить формулу в Excel пример найти очень просто, расчет тама квантилей и/или перцентили тоже
11 Михаил Козлов
 
28.09.18
10:09
(4) Странно: медиана это 0,5-квантиль. Если можно медиану запросом, то почему бы нельзя любой квантиль?
12 МихаилМ
 
28.09.18
10:14
алгоритм :

1) сверните копию тз по группировкам , чтобы узнать кол-во элементов в группировке.

2) отсортируйте тз по полям группировкам
3)
в группированной тз добавьте колонки  начало группировки медиана и перцентили

5) расчет по группированной тз начала группировки в отсортированной тз  

6) расчет перцентилей.
13 ANL
 
28.09.18
10:22
(7) Вот так вот?

ВЫБРАТЬ ПЕРВЫЕ 1
    ДоляЦенОтносительноТекущей.Цена
ИЗ
    (ВЫБРАТЬ
        КоличествоЦенОтносительноТекущей.Цена КАК Цена,
        КоличествоЦенОтносительноТекущей.МеньшеИлиРавно / КоличествоЦенОтносительноТекущей.Всего КАК ПроцентМеньшеИлиРавно,
        КоличествоЦенОтносительноТекущей.Больше / КоличествоЦенОтносительноТекущей.Всего КАК ПроцентБольше
    ИЗ
        (ВЫБРАТЬ
            ТаблицаЦен.Цена КАК Цена,
            СУММА(ВЫБОР
                    КОГДА ТаблицаЦен.Цена <= ТаблицаЦенКопия.Цена
                        ТОГДА 1
                    ИНАЧЕ 0
                КОНЕЦ) КАК МеньшеИлиРавно,
            СУММА(ВЫБОР
                    КОГДА ТаблицаЦен.Цена > ТаблицаЦенКопия.Цена
                        ТОГДА 1
                    ИНАЧЕ 0
                КОНЕЦ) КАК Больше,
            СУММА(1) КАК Всего
        ИЗ
            РегистрСведений.ЦеныНаУслуги КАК ТаблицаЦен
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНаУслуги КАК ТаблицаЦенКопия
                ПО (ИСТИНА)
        
        СГРУППИРОВАТЬ ПО
            ТаблицаЦен.Цена) КАК КоличествоЦенОтносительноТекущей) КАК ДоляЦенОтносительноТекущей
ГДЕ
    ДоляЦенОтносительноТекущей.ПроцентМеньшеИлиРавно <= 0.25

УПОРЯДОЧИТЬ ПО
    ДоляЦенОтносительноТекущей.ПроцентМеньшеИлиРавно УБЫВ
14 ANL
 
28.09.18
10:24
(13) Это 25 перцентиль
15 ANL
 
28.09.18
10:32
(12) У меня просто нету ни каких группировок. Просто цены
16 kittystark
 
28.09.18
10:38
а зачем тогда время в (0) упоминается ?
17 МихаилМ
 
28.09.18
10:39
(15)
время получения стоимостей для чего ?

значит у Вас одна группировка  отсортируйте ТЗ и найдите
нужные строки
18 ANL
 
28.09.18
10:44
(17) Прошу прощения, запутал вас временем. На самом деле можно считать что есть просто Цена. Тогда запрос как я написал в (13) подойдёт? Я просто с сортировкой не до конца понял как сделать.
19 kittystark
 
28.09.18
10:46
а что будет если некоторые значения цен не уникальны, а встречаются по несколько раз? вплоть до сотен или даже тысяч раз ?

может в запрос стоит добавить РАЗЛИЧНЫЕ ?
20 kittystark
 
28.09.18
10:48
или так и надо, чтоб с частотами/весом не равным единицы было?
21 МихаилМ
 
28.09.18
10:49
(18) нет. тк не правильное понимание перцентиля.

если запросом, то как в (12) + почитайте про нумерацию строк в запросе.
22 ANL
 
28.09.18
10:54
Добавлю информации о предметной области. В таблице хранятся минимальные цены на туры в отели (в рамках этой темы я рассматриваю задачу упрощенно для одного отеля). Соответственно сегодня минимальная цена на туры в этот отель 125 т.р., завтра тоже 125 т.р., послезавтра 127 т.р. Если далее я беру месяц/квартал/год и хочу получить ответ на вопрос: "Ниже какого значения цены цена на тур не опускается в 75% случаев?", то это будет 25 перцентиль по выборке отсортированной по возрастанию.
(19) Если удалить дубли, будет искажение ответа на вопрос, я думаю.
(21) Может мне тогда не перцентиль считать надо под эту задачу?
23 kittystark
 
28.09.18
12:52
вот набросал
Функция ПолучитьЗначенияКвантиля( ТЗ, НазваниеКолонкиЗначений, квантиль = 0.25 )
    Если НЕ ЗначениеЗаполнено(ТЗ) тогда
        сообщить("Передана пустая таблица значений!!!");
        Возврат Неопределено;
    КонецЕсли;
    
    Если НЕ ЗначениеЗаполнено( квантиль )
         ИЛИ квантиль < 0
         ИЛИ квантиль > 1
    Тогда
        сообщить("Значение квантиля должно быть от 0 до 1 !!!");
        Возврат Неопределено;
    КонецЕсли;
    
    КопияТЗ = ТЗ.Выгрузить();
    КопияТЗ.Сортировать(НазваниеКолонкиЗначений);
    Н = КопияТЗ.Количество()-1;
    
    Если квантиль = 1 тогда
         Возврат КопияТЗ[Н][НазваниеКолонкиЗначений];
    КонецЕсли;
    
    К = Цел( квантиль * (Н-1) );
    Если К + 1 < квантиль * Н тогда
        Возврат КопияТЗ[К+1][НазваниеКолонкиЗначений];
    КонецЕсли;
    
    Если К + 1 = квантиль * Н тогда
        Возврат (КопияТЗ[К][НазваниеКолонкиЗначений] + КопияТЗ[К+1][НазваниеКолонкиЗначений])/2;
    КонецЕсли;
    
    Если К + 1 > квантиль * Н тогда
        Возврат КопияТЗ[К][НазваниеКолонкиЗначений];
    КонецЕсли;
    
КонецФункции
24 ANL
 
28.09.18
13:06
Т.е. взять квантиль*Н -ую по возрастанию строку ТЗ? Теперь сам не пойму, что меня в начале поставило в тупик. Спасибо :)
Закон Брукера: Даже маленькая практика стоит большой теории.