Мой Телеграм
Давайте попробуем разобрать как на sql можно посчитать моду и медиану.
Мода
это значение, которое чаще других значений встречается в выборке. Выборка может быть одна или несколько мод. вообще на практике я редко встречал что бы на это значение как-то опирались. Мне кажется это больше теоретическая характеристика распределения. Но на собеседовании могут спросить про это, а иногда и попросить посчитать на обычном SQL
Предположим, есть некая таблица `users` и нам надо найти моду по столбцу `value`
Тут я предполагаю, что не на надо объяснять, что такое CTE и как оно работает пока просто приведу полный код, а потом распишу что там происходит
итак, `cte_1`, в нем сколько раз каждое значение встречается в колонке `value`
далее на основе `cte_1` строится `cte_2` где количество значений из `cte_1` ранжируется по убыванию. Тут стоит отметить что в выражении `over` не указано окно, а значит `rank()` будет выполнен по всему столбцу сразу
Ну и итоговый запрос просто отбирает из `cte_2` значение с наибольшим рангом. Стоит отметить, что если в выборке будет несколько значений которые встречаются одинаковой кол-во раз, то такой запрос выведет их все
Медиана
Теперь медиана, гораздо чаще встречающееся на практике чем мода. Про нее будут спрашивать на всех собесах в аналитику. Да и сам я, если доводиться вести собес обязательно спрошу, что это. Грубо говоря, медиана — это такое значение в выборке при котором половина выборки будет меньше этого числа, а половина больше этого числа, формально медиан может быть бесконечное множество если в выборке четное кол-во чисел
и так, код на sql по все той же таблице
что же тут происходит?
в `cte_1` мы нумеруем все строки упорядочив значения по возрастанию, а также считаем кол-во строк и кол-во строк + 1
Если рассматривать приведенную выше таблицу, то она будет выглядеть `cte_1` выглядит так
При построении `сte_2` мы просто делим `cnt` и `cnt_1` на 2. А в последнем финальном запросе мы выбираем среднее значение между `c1` и `c2`
и да, тут четное число в выборке поэтому медианой можно считать любое число от 1010 до 1015. это я к тому, что numpy выдаст медиану 1012,5
в этом ноутбуке можно поиграться со всем этим