Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Медиана, 25 и 75 перцентили по таблице значений

Медиана, 25 и 75 перцентили по таблице значений
Я
   ANL
 
28.09.18 - 09:43
Добрый день,

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

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует