Почему все считают неправильно?

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

Проблема заключается в алгоритме подсчета активности пользователя - т.е. сколько он чего сделал в определенный промежуток времени. Все, как правило, поступают следующим образом: берется текущая дата, дата регистрации или начала активности пользователя, считается количество дней в этом промежутке и количество действий делится на количество дней, получаем результат - столько-то пунктов в день. Это обычное среднее арифметическое и в целом оно отражает верную картину, но не совсем.

Рассмотрим пример. Вот завел я себе твиттер, написал первый твитт и забыл о сайте на месяц, а потом вспомнил и стал активным пользователем. Рассчитанное среднее арифметическое упорно твердит мне, что я делаю 2 твитта в день, хотя на самом деле количество иногда достигает 10 или более. Понятно, что таким образом сглаживаются острые пиковые значения, но если я действительно оставляю каждый день 5 твиттов в течении недели, а потом опять замолкаю. Получается что в данный момент показатель неверен, как неверен и потом, когда я молчу. Я же тогда не пишу ничего, но показатель не на ноле.

Проблемы

Ясное дело, что посчитать среднее арифметическое до безобразия просто и даже работая с базой данных, приходится выполнять не так много запросов и вообще действий в программе, чтобы получить требуемое значение. Более сложный алгоритм работал бы медленнее. Не желание правильно считать терпимо для таких гигантов, как твиттер или другие социальные сети. Но минус в том, что с популярных сервисов все копируют не особо задумываясь, как улучшить копию. Это отдельная тема, почему там происходит.

Еще одной проблемой можно считать то, что для реализации более сложного алгоритма требуются хорошие познания в математике, если требуется решить задачу эффективно, что собственно удорожает разработку. Но я считаю эту проблему некритической, так как тут скорее важны объемы обрабатываемых данных. Потому что для среднего арифметического нам достаточно получить время первой активности и количество записей в БД за это время, т.е. всего 2 значения из БД и получить текущее время средствами языка программирования или самой БД. Итого выходит всего 3 значения, а если разрабатывать сложный алгоритм, нам нужно знать пики активности, спады и другие параметры, что замедлит работу. В этом заключается вторая проблема - неприменимость к существующим средствам хранения данных.

Решение

Есть более просто решение, которое не решит задачу полностью, но будет отражать более правильную картину. На каждом сервисе можно приблизительно посчитать среднее время реакции пользователей. Не знаю как правильно это назвать, но приведу пример для сравнения: ответ на форуме приходится ждать от нескольких часов до нескольких дней, в социальной сети чуть быстрее, в сервисах мгновенного обмена сообщениями - почти сразу же. Таким образом мы можем предположить, какое время отклика пользователя у нас на сайте. Зная это время мы можем рассчитать активность более точно.

На твиттере данные обновляются довольно часто, но у нас в условии изначально стояла задача - получить активность за день. Самый простой способ - взять текущий день, получить количество твиттов за этот день и вот вам активность, но она не будет отражать правды. Для такого случая одного дня не достаточно, нужно немного расширить временные границы. Узнать, до какой степени расширять диапазон, можно, основываясь на показателе времени отклика. Если у нас форум, то можно считать посты за последнюю неделю, если социальная сеть, то за несколько дней, если это сервис IM - то вообще за несколько часов или минут. Идея, я думаю, ясна.

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

Итог

Что в итоге? В итоге, с теми же малыми затратами на ресурсы мы получаем более точную информацию об активности пользователя. Если я 3 дня подряд писал по 10 твиттов, а потом замолк на неделю, то мой показатель активности постепенно упадет до 0 и это будет правдой, так как он будет показывать, что последние дни я ничего не пишу.

Если у вас возникли вопросы или есть чем поделиться, пишите в комментариях. Я с радостью пообщаюсь на эту тему.

На чытанне спатрэбілася 4 хвіліны Нататка змяшчае 667 слоў

Сябры, акрамя блога, я амаль што рэгулярна пішу адмысловую рассылку пра праграмванне і тэхналогіі, дзе раз на двы тыдні збіраю самыя цікавыя навіны тэхналогій і раблю агляд цікавых інструментаў, якія мне трапіліся. Таму хутчэй падпісвайцеся, каб не прапусціць штосці цікавае наступным разам!