Рассчитать распределение значений в Rails / MySQL - PullRequest
0 голосов
/ 30 июля 2011

Как лучше всего рассчитать распределение значений по строкам в MYSQL (или, возможно, какое-то вычисленное значение в ruby).

Примером может служить длина сообщений, отправляемых через сайт. Таким образом, мы можем просмотреть все сообщения и увидеть, что это было длиной 100 символов, 1000 и т. Д.

Затем для данного сообщения я хочу вернуться с%, например, «это сообщение попадает в 90-процентиль по длине» по сравнению с другими сообщениями.

Предостережения

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

Может быть, какой-нибудь пакет статистики / гем в ruby ​​или какие-нибудь хорошие примеры этого есть? Спасибо!

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

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

Таким образом, можно сказать 95 процентиль и т. Д.

Выезд:

Нормальное распределение: http://www.regentsprep.org/Regents/math/algtrig/ATS2/NormalLesson.htm

0 голосов
/ 30 июля 2011

Проблема с вычислением стандартного отклонения и среднего значения ваших данных и выполнением обратного нормального поиска заключается в том, что вы делаете ОЧЕНЬ ограничительное предположение. Что делать, если ваши данные не являются нормальными? Во многих ситуациях это довольно плохое предположение.

В идеале вы хотите ответить на этот вопрос непараметрически , то есть без необходимости полагаться на некоторые предположения о распределении. Один из способов сделать это - использовать представление MySQL:

http://www.mysqltutorial.org/mysql-views-tutorial.aspx

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

Если представление MySQL слишком медленное при расчете, вы также можете попробовать вставить следующую логику в запись на вашем уровне доступа к данным:

  1. Создайте в таблице свой собственный столбец "# длина сообщения меньше или равна мне".
  2. При добавлении новой строки заполните столбец "# длина сообщения меньше или равна мне" для этой строки, используя подходящее прямое выражение подсчета SQL.
  3. Также при вставке новой строки, выполните итерацию по всем другим строкам в этой таблице и увеличьте это «# длина сообщения меньше или равна мне» для всех строк, где длина сообщения больше, чем длина сообщения новой строки.

Поскольку ваша задача хорошо линейна в ранжировании, мы можем избежать уменьшения сложности O (n ^ 2) до O (n), используя последний подход. Надеюсь, это поможет.

Кроме того, если вы заинтересованы в выполнении каких-либо других манипуляций, кроме процентилей, посетите этот блог для получения информации о нормализации, масштабировании, ранжировании и т. Д. Он включает в себя хорошую графику того, что происходит с вашими данными, хотя и написано для :

http://www.redowlconsulting.com/Blog/post/2011/07/28/StatisticalTricksForLists.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...