Доброго времени суток, Посетитель!
|
|
|
|
|
|
|
|
|
вид форума:
|
|
автор: Гость (27.11.2006 в 12:47) |
|
| Если уже есть такая информация на форуме, извиняйте.
Я перевернул много информации по этому вопросу, но так и не нашел нужного мне ответа. И почему только сами разработчики не включили эти функции в Access? Сам я по части программирования - чайник.
Суть вот в чем. Хотелось бы, чтобы значения медианы можно было бы получить также просто, как и среднее (или минимальное, или максимальное...) значение, используя функцию вычисления медианы как статистическую функцию в групповых операциях.
Например есть таблица "Люди" с полями: Имя, Пол, Возраст. Если захотеть вычислить минимальные значения возраста по полу, то достаточно написать следующий запрос:
SELECT Люди.Пол, Min(Люди.Возраст) AS [Min-Возраст]
FROM Люди
GROUP BY Люди.Пол;
А если захотеть вычислить медианное значение возраста по полу, то тут и возникают проблемы с нехваткой навыков программирования.
ПОМОГИТЕ
Задача: создать функцию Median, которая вычисляла бы медиану и чтобы ее можно было бы легко использовать в групповых операциях аналогично функции Min вышеуказанного примера. | |
|
| |
|
|
автор: Altu (27.11.2006 в 13:26) |
|
| что-то я не нашел | |
|
| |
|
6 Кб. |
|
| книжки или страницы или главы на странице?
имелось в виду см. аттачмент
Вычисление медианы по числовому полю стр. 280 | |
|
| |
|
автор: Altu (27.11.2006 в 14:07) |
|
| Хорошо бы еще эту книгу найти | |
|
| |
|
|
|
|
| Ну могу попытаться написать совю функцию типа dcount...
т.е. Функции Вы передаете три параметра
1. имя сохраненного запрос или таблицы
2. имя поля по которому нужно посчитать медиану
3. строку условия.
Эта функция вернет медиану
Не уверен в 100% успехе, но готов попробовать....
Вот только как она в запросе будет работать... не знаю | |
|
| |
|
автор: Altu (27.11.2006 в 13:41) |
|
| Спасибо за предложение, конечно. Но мне нужно, чтобы медиана считалась как групповая операция, аналогично групповой операции Min или Avg.
Так как в твоем случае, если я правильно понимаю, медиана будет вычислятся по записям, отобранным согласно строке условия, а мне нужно, чтобы медиана считалась согласно полученным группам. | |
|
| |
|
автор: Altu (27.11.2006 в 14:12) |
|
| Да и вообще реально ли сделать функцию вычисления медиана, чтобы она работала как групповая операция и вычисляла медиану для групп, заданных Group by - как это делают функции Min, Max, Avg, StDev...?
Кто что по этому поводу знает или думает? | |
|
| |
|
13 Кб. |
|
| см. приложение.
Запускать "запрос1" | |
|
| |
|
автор: Аноним (27.11.2006 в 14:50) |
|
| Вот спасибо. Премного благодарен.
А правильно ли я понимаю, что если мне нужно будет вычислить медиану не только по полу, но и еще по каким-либо признакам. Например по полу и по имени. То я в таблице добавляю поле "Имя". В q1 также включаю его в группу. В запросе1 также вывожу его и в выражении условием отбора пишу Dmedian("age";"[tblTest]";"[sex]&[имя]='" & [sex] & [имя] & "'").
Аналогично, если группировка будет по трем и более полям. | |
|
| |
|
|
|
| не совсем так, условие должно выглядеть так:
Dmedian("age";"[tblTest]";"[sex]='" & [sex] & "' and [имя] = '" & [имя] & "'")
|
если поле числовое, то кавычки не нужны | |
|
| |
|
|
|
| Сразу вопрос ко всем, может на сайт кинуть? нужна вообще такая функция?
И вопрос к Altu: не могли бы немного просветить, а что показывает медиана? ее смысл? т.е. меня научили медиану вычислять, но что мне может показать ее значение, я так и не понял... | |
|
| |
|
|
|
| Сразу вопрос ко всем, может на сайт кинуть? нужна вообще такая функция?
И вопрос к Altu: не могли бы немного просветить, а что показывает медиана? ее смысл? т.е. меня научили медиану вычислять, но что мне может показать ее значение, я так и не понял... | |
|
| |
|
автор: Altu (27.11.2006 в 17:16) |
|
| По поводу необходимости такой функции: мое мнение - на сайт скинуть можно.
Суть медианы состоит в следующем. Предположим, есть числовой ряд значений. Медиана разбивает числовой ряд значений на две части таким образом, что половина значений числового ряда меньше медианы, а другая половина - больше. Ее применяют в статистических расчетах, в тех случаях когда среднее арифметическое не будет являтся достаточно точным описанием среднестатистического значения. Поясняю: среднее арифметическое значение хорошо в случае однородности числового ряда, но в других случаях оно не является идеальным критерием оценки среднестатистического значения, так как оно в значительной мере подвержено влиянию максимумов и минимумов.
Например: есть числовой ряд: 1 2 3 1000 10000
Медиана равна 3, а среднее арифметическое равно 2201.
Если бы ряд был однороден (1 2 3 4 5), то медиана и ср.ар были бы равны.
Таким образом медиана часто используется для определения среднестатистического значения по причине своей относительной стабильности.
Конкретный пример:
ВЫ - работодатель и хотите взять на работу мерчендайзера, но не знаете сколько ему платить. Вы обращаетесь за помощью к Кадровому агентству, которое для Вас проводит обзор заработных плат в городе и определяет среднестатистическую зарплату мерчендайзера.
В городе всего 5 предприятий, где работают мерчендайзеры.
На 1 предприятии мерчендайзерам платят 5000 рублей, на 2 - 5000, на 3 - 6000, на 4 - 6000, а на 5 работает всего один уникум, которому платят 30000.
Если Кадровое агенство будет определять зарплату по среднему арифметическому значению, то по такому варианту примерная зарплата мерчендайзера в городе будет равна 10400 рублей (5000+5000+6000+6000+30000=10400).
А если Кадровое агенство посчитает по медиане, то получит среднестатистическую зарплату мерчендайзера - 6000.
Очевидно, что наиболее ближе к действительности, что среднестатистическая зарплата мерчендайзера равна 6000. Это и есть стоимость профессии на рынке труда города, а не 10400.
Понятно, что для работодателя предпочтительнее, если Кадровое агенство даст ему информацию, что мерчендайзер в городе получает примерно 6000.
Наряду с медианой используются квартильные, децильные и процентильные значения.
Первый квартиль отделяет первую четверть расположенных в возрастающем порядке значений числового ряда.
Третий квартиль отделяет последнюю четверть расположенных в возрастающем порядке значений числового ряда.
Второй квартиль = медиана.
Нижний дециль - это параметр, отделяющий 10% наименьших значений числового ряда.
Верхний дециль отделяет 10% наибольших значений числового ряда.
Таким образом, дециль «обрезает» верхние и нижние 10% статистического материала, отображая нижние и верхние пределы точнее, чем непосредственно «минимум» или
«максимум», которые могут быть как чрезвычайно низки, так и предельно высоки.
Данные в квартилях считаются статистически надежными, так как они представляют собой средние 50% статистического материала (т.е., 50% значений между первым и третьим
квартилем).
С процентилями аналогично. Например третий процентиль отделяет 3% наименьших значений числового ряда, а 98 процентиль - 2% наибольших значений числового ряда.
10 процентиль = нижнему децилю.
25 процентиль = первому квартилю.
50 процентиль = второму квартилю = медиане.
Не знаю понятно объяснил или нет?
Хорошо бы сделать функцию, вычисляющую заданный процентиль, аналогично DMedian. Только добавить четвертый параметр, указывающий, какой процентиль нужно посчитать. | |
|
| |
|
автор: Altu (27.11.2006 в 17:18) |
|
| По поводу необходимости такой функции: мое мнение - на сайт скинуть можно.
Суть медианы состоит в следующем. Предположим, есть числовой ряд значений. Медиана разбивает числовой ряд значений на две части таким образом, что половина значений числового ряда меньше медианы, а другая половина - больше. Ее применяют в статистических расчетах, в тех случаях когда среднее арифметическое не будет являтся достаточно точным описанием среднестатистического значения. Поясняю: среднее арифметическое значение хорошо в случае однородности числового ряда, но в других случаях оно не является идеальным критерием оценки среднестатистического значения, так как оно в значительной мере подвержено влиянию максимумов и минимумов.
Например: есть числовой ряд: 1 2 3 1000 10000
Медиана равна 3, а среднее арифметическое равно 2201.
Если бы ряд был однороден (1 2 3 4 5), то медиана и ср.ар были бы равны.
Таким образом медиана часто используется для определения среднестатистического значения по причине своей относительной стабильности.
Конкретный пример:
ВЫ - работодатель и хотите взять на работу мерчендайзера, но не знаете сколько ему платить. Вы обращаетесь за помощью к Кадровому агентству, которое для Вас проводит обзор заработных плат в городе и определяет среднестатистическую зарплату мерчендайзера.
В городе всего 5 предприятий, где работают мерчендайзеры.
На 1 предприятии мерчендайзерам платят 5000 рублей, на 2 - 5000, на 3 - 6000, на 4 - 6000, а на 5 работает всего один уникум, которому платят 30000.
Если Кадровое агенство будет определять зарплату по среднему арифметическому значению, то по такому варианту примерная зарплата мерчендайзера в городе будет равна 10400 рублей (5000+5000+6000+6000+30000=10400).
А если Кадровое агенство посчитает по медиане, то получит среднестатистическую зарплату мерчендайзера - 6000.
Очевидно, что наиболее ближе к действительности, что среднестатистическая зарплата мерчендайзера равна 6000. Это и есть стоимость профессии на рынке труда города, а не 10400.
Понятно, что для работодателя предпочтительнее, если Кадровое агенство даст ему информацию, что мерчендайзер в городе получает примерно 6000.
Наряду с медианой используются квартильные, децильные и процентильные значения.
Первый квартиль отделяет первую четверть расположенных в возрастающем порядке значений числового ряда.
Третий квартиль отделяет последнюю четверть расположенных в возрастающем порядке значений числового ряда.
Второй квартиль = медиана.
Нижний дециль - это параметр, отделяющий 10% наименьших значений числового ряда.
Верхний дециль отделяет 10% наибольших значений числового ряда.
Таким образом, дециль «обрезает» верхние и нижние 10% статистического материала, отображая нижние и верхние пределы точнее, чем непосредственно «минимум» или
«максимум», которые могут быть как чрезвычайно низки, так и предельно высоки.
Данные в квартилях считаются статистически надежными, так как они представляют собой средние 50% статистического материала (т.е., 50% значений между первым и третьим
квартилем).
С процентилями аналогично. Например третий процентиль отделяет 3% наименьших значений числового ряда, а 98 процентиль - 2% наибольших значений числового ряда.
10 процентиль = нижнему децилю.
25 процентиль = первому квартилю.
50 процентиль = второму квартилю = медиане.
Не знаю понятно объяснил или нет?
Хорошо бы сделать функцию, вычисляющую заданный процентиль, аналогично DMedian. Только добавить четвертый параметр, указывающий, какой процентиль нужно посчитать и выложить на сайт. | |
|
| |
|
|
|
| Спасибо. Пример про медиану очень наглядный, я все понял.
Хорошо бы сделать функцию, вычисляющую заданный процентиль, аналогично DMedian.
|
Eсли медиана это более или менее близко к народу, и есть вероятность что кому-то потребуется, то все остальное уже такая специфика, что только под заказ... | |
|
| |
|
|
|
| http://hiprog.com/index.php?option=com_content&task=view&id=251661556&Itemid=35
я кстати ее немного подправил... | |
|
| |
|
|
|
| в запросе имена поля и таблицы лучше взять в квадратные скобки (на всякий случай) | |
|
| |
|
|
|
| Я имитировал поведение DMax, там определение, нужны [ ] или нет, определяет пользователь....
Кстати :
http://www.sql.ru/forum/actualthread.aspx?tid=129001
Жаль что у меня нет этого Гетца.... | |
|
| |
|
автор: Altu (27.11.2006 в 17:54) |
|
| В любом случае спасибо. Твоя функция очень помогла. А с процентилями я может теперь и сам разберусь, как их в Access посчитать.
Често говоря не ожидал, что мне кто-то сможет помочь. Тем более в течении одного дня.
РЕСПЕКТ 2osmor - очень грамотно сделанная функция.
P.s. А на других сайтах никто мне на этот вопрос не ответил. Ограничиваются только определением медианы и предложением писать функцию ручками, а как ее писать, кто бы показал. Так и я любому мог бы посоветовать. А вот у вас на сайте за полдня ответ на вопрос дали. Еще раз СПАСИБО! | |
|
| |
|
|
|
| Пожалуйста.
просто так получилось что было немного времени, и было интересно решить. | |
|
| |
|
автор: Altu (28.11.2006 в 13:45) 14 Кб. |
|
| Ошибся. Правильно называть не процентиль, а персентиль.
2Osmor
Я на основе твоей функции сделал функцию DPersent, которая вычисляет и медиану, и квартили, и децили, короче - любую персентиль от 0 до 100.
Просто добавил еще один параметр - значение персентили (если его не вводить, то функция по умолчанию будет считать минимум) и слегка модифицировал алгоритм.
| |
|
| |
|
автор: Altu (28.11.2006 в 14:03) |
|
| Можно обойтись и без промежуточного запроса q1.
Тогда основной запрос будет выглядеть так:
SELECT tblTest.Sex, tblTest.Name, DPersent("age","[tblTest]","[sex]='" & [sex] & "' and [Name] = '" & [Name] & "'") AS Минимум, DPersent("age","[tblTest]","[sex]='" & [sex] & "' and [Name] = '" & [Name] & "'",10) AS [Нижний дециль], DPersent("age","[tblTest]","[sex]='" & [sex] & "' and [Name] = '" & [Name] & "'",25) AS [Первый квартиль], DPersent("age","[tblTest]","[sex]='" & [sex] & "' and [Name] = '" & [Name] & "'",50) AS [Медиана (второй квартиль)], DPersent("age","[tblTest]","[sex]='" & [sex] & "' and [Name] = '" & [Name] & "'",75) AS [Третий квартиль], DPersent("age","[tblTest]","[sex]='" & [sex] & "' and [Name] = '" & [Name] & "'",90) AS [Верхний дециль], DPersent("age","[tblTest]","[sex]='" & [sex] & "' and [Name] = '" & [Name] & "'",100) AS Максимум, DPersent("age","[tblTest]","[sex]='" & [sex] & "' and [Name] = '" & [Name] & "'",63) AS [Произвольная персентиль (например, 63)]
FROM tblTest
GROUP BY tblTest.Sex, tblTest.Name; | |
|
| |
|
|
|
| я знаю что можно, сделал 1-й запрос:
а) что бы было понятнее
б) в таком случае фунцкия вызывается только для уникальных значенией группировочных полей, а в случае с одинм запросм будет вызываться для ВСЕХ записей таблицы... что не рационально.
http://hiprog.com/index.php?option=com_content&task=view&id=251661557&Itemid=35
почитайте, я там ничего не напутал со склонениями | |
|
| |
|
автор: Altu (28.11.2006 в 16:26) |
|
| Ну не загордиться бы :)
Вроде со склонениями все ОК. Только в инструкции Select Case...End Select вместо "Dmedian" по логике должно быть "DPersent". Ну это мелочи.
P.s. А все же зря ты себя из авторства убрал. Я честно - один бы не сделал. | |
|
| |
|
|
|
| "Ну не загордиться бы :)" - а почему нет? вполне достойно гордости.
Для меня например вся эта статистика темный лес, и сам бы я такую функцию не написал (хотя бы потому, что лень разбираться в персентилях, квартилях и т.п.), а так если кому понадобится - так вот же она, бери и юзай. "Спасибо Altu". Почему же не погордиться | |
|
| |
|
автор: Altu (28.11.2006 в 17:24) |
|
| Даже обидно.
Вроде все хорошо, но на больших объемах данных тормозит сильно.
Да разве можно назвать большим объемом данных это:
Расчет производится для 50 групп. Размер каждой группы около 10 записей.
Всего-то около 500 записей. А выполняется почти 5 секунд.
Как бы ускорить.
Вроде бы переменные явно задал.
Индексы в таблицах тоже заданы. | |
|
| |
|
автор: Altu (28.11.2006 в 17:27) |
|
| И как избавиться от постоянного пересчета значений при прокрутке вверх-вниз? | |
|
| |
|
|
|
| Один запрос используешь или 2?
Гнать результат во временную таблицу. | |
|
| |
|
автор: Altu (28.11.2006 в 17:54) |
|
| Дело в том, что я рассчитывал значения на основе данных из запроса (назовем его запросом-источником), который в свою очередь формируется из нескольких других запросов.
Как только я из этого запроса-источника сделал таблицу, функция заработала в несколько раз быстрее. Можно сказать, даже быстро. По крайней мере почти незаметно.
Но это и понятно. Но я бы не хотел работать через временную таблицу. Так как у меня есть куча отчетов, завязанных на тот запрос-источник. Если работать через временную таблицу, то нужно будет каждый раз при изменении данных эту временную таблицу обновлять.
Если бы можно было как-то ускорить, то я бы лучше работал через запрос.
Хотя, если ускорить не удастся, придется работать через временную таблицу. | |
|
| |
|
|
|
| я о другом, функция вызывается в запросе с Group by или в отдельном запросе? | |
|
| |
|
|
|
| Я пробовал и так и так. Ничего не меняется. Тормозит примерно одинаково.
Но как только запрос, из которого выбираю поле для расчета функции перевожу во временную таблицу и расчет функции делаю уже по полю полученной таблицы, то все работает быстро - ведь данные для расчета функции беруться, что называется, готовыми.
Наверно, все же придеться работать через временную таблицу. Потому что если расчет функции делать через запрос, то сначала должен отработать этот запрос (а он у меня построен на основе еще трех запросов , которые также должны сначала отработать) и только потом вычисляется функция. И если принять во внимание, что расчет проводится по 50 группам, то вся вышеописанная последовательность при выполнении rst.Open должна отработать тоже 50 раз. Отсюда и низкое быстродействие. И кроме временной таблицы, наверно, ничего здесь не поможет. | |
|
| |
|
автор: Altu (28.11.2006 в 15:12) |
|
| Правда на больших объемах данных тормозит конкретно. | |
|
| |
|
|
|
| http://www.sql.ru/forum/actualthread.aspx?tid=48847&hl=%ec%e5%e4%e8%e0%ed%e0 | |
|
| |
|
автор: Altu (28.11.2006 в 16:37) |
|
| Интересные варианты :)
Но то ли я что-то не понимаю, то ли... | |
|
| |
|
|
|
| просто взял и сохранил пред. мээседж к себе на комп.
спасибо за объяснение
ПыСы как же трудно пытаться заниматься маркетингом, не имея хорошей теорет. базы по статистике | |
|
| |
|
автор: Altu (27.11.2006 в 14:20) |
|
| Я сам из этой ситуации выкручивался так.
Создавал перекрестный запрос с учетом групп, которые мне нужны, экспортировал полученную таблицу в Excell, там применял функцию медианы, импортировал таблицу обратно и связывал ее с запросом по групповым полям , который считает мин и максимумы для групп и добавлял поле со значением медианы из импортированной таблицы.
Таким образом и получал значения мин, макс и медианы для нужных мне групп.
Но ведь это коряво как-то. Хотелось, чтобы все работало без всякого экспорта/импорта. | |
|
| |
|
|
|
| Здравствуйте.
Хочу уточнить насчет медианы точки зрения теории измерений и статистики.
Допустим, фирма проводит семинар, участники которого заполняют анкеты, среди прочего ставят баллы (оценку) фирме-организатору. Сразу уточню, что сказанное далее относится и к оценкам учащихся.
Пусть возможные оценки - от 0 до 10-ти. Это цифры, но НЕ числа, - человеку сложно дать точную числовую оценку, гораздо проще сказать "это лучше, это - хуже".
Далее, одному из участников семинара неправильно написали фамилию на бейдже. Семинар прекрасный, но этот человек ставит оценку "3" из 10-ти.
Если мы используем среднее арифметическое, то предполагаем, что "3" ровно в 3.33... раза меньше "10", а на самом деле участник просто обиделся.
Если же используем медиану, являющуюся серединой списка оценок, отсортированных по неубыванию, одно-два значения, резко отличающихся от большинства, не испортят общую картину.
М.б. я написал немного хаотично. Пример мой собственный, а вот теоретические основы взяты из трудов проф. Орлова (orlovs.pp.ru). | |
|
| |
|
|
|
| Да, забыл принципиальный момент.
В целом мое сообщение мало отличается по смыслу от предыдущего комментария, но:
Согласно теории измерений, для анализа оценок, поставленных на основе системы баллов, а также зарплат и др., среднее арифметическое не просто плохо, его НЕЛЬЗЯ использовать. | |
|
| |
|
|
|
| Спасибо. Вообще я тут почитал этот пост внимательно и подумал ...было бы не плохо написать статейку о практическом применении статистики в ACCESS. В которой можно было бы "на пальцах" (ну что бы даже программисты поняли ), объястить СУТЬ основных статистических показателей.
Скажу за себя, я в иституте вычислял среднеквадратичное отклонение и прочие показатели на основании данных "полученных экспериментальным путем", но то ли забыл, то ли никогда не знал - "а нафига оно надо? Что показывает? Какой вывод можно сделать?"
Вот с медианой и квартильей, вроде более или менее понятно, (благодаря объяснениям Altu и Nikolai_Syn), но еще осталось СТОЛЬКО загадочных терминов... | |
|
| |
HiProg.com - Технологии программирования
|