Как составить рейтинг пользователей

Алгоритм популярности пользователя на сайте — «Нестандартный подход к стандартным вещам»

Время на прочтение
3 мин

Количество просмотров 5.4K

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

Сначала я проведу линию для вас разных алгоритмов рейтинга:
I — Пользователи получают только “+”
Основные преимущества:

  • Нету заморочек.
  • Минимальные нагрузки на сайт и базу.

Недостатки:

  • один человек, один балл.
  • Личный авторитет на сайте/форуме ничего не стоит. Ты одна единица и все.

II — Пользователи получают “+” и “-“
Больших отличий мало от прошлой системы. Добавилось еще одно поле в базе.
Основные преимущества:

  • Нету заморочек.
  • Минимальные нагрузки на сайт и базу.

Недостатки:

  • один человек, один балл.
  • Личный авторитет на сайте/форуме ничего не стоит. Ты одна единица и все.

III — гипербола от @klim-danilovklim-danilov
Да, это довольно интересная идея но для оценки материала. Но не пользователей.
Основные преимущества:

  • «вес каждого плюса или минуса постоянно уменьшается в два раза, в порядке хронологии.
    То есть первый юзер ставит плюс весом в +50 балла, следующий ставит плюс весом в +25 балла, минус в -50 балла, минус в -25, минус в -12,5 баллов»

Недостатки:

  • Каждый последующий голос уже имеет меньший вес.
  • Система еще не закончена.

IV — среднее статистическое
Одна из самых распостраненных систем. В основе лежит общая сумма проголосовавших и общий бал деленный друг на друга.
Основные преимущества:

  • Система давно проверена и работает.
  • Не высокие затраты ресурсов.

Недостатки:

  • Пользователю дано право голосовать с минимума до максимума. А обычно по статистике пользователи ставят самый низкий балл или самый высокий.
  • Система для оценки исключительно материала.

V — плавающая система
В основе принципа лежит изменение кармы в сторону плюса или минуса.
Основные преимущества:

  • Пожалуй самая лучшая система для оценки пользователей/материала.
  • Не высокие затраты ресурсов.

Недостатки:

  • И снова. Твой авторитет на сайте/форуме в рейтенговой системе ничего не стоит.

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

В основе алгоритма лежит геометрическая фигура «прямоугольного треугольника».
Да порой в геометрии мы можем найти вполне необычные вещи.

Почему был избран именно треугольник?
Дело в том что высота треугольника может соответствовать рейтингу пользователя который ставит оценку.
Длина треугольнка рейтингу которому ставят оценку. А гипотенуза как раз та разнице между авторитетами пользователей.

Теперь приступим к самому интересному.

$a = 254; // Рейтинг пользователя голосующего
$b = 47;  // Рейтинг пользователя получающего голос

/* Установим стандартные цифры, которые можно встретить на любом форуме*/


if($b<=0){ $b=1; }
/* Проверяем наличие нуля и отрицательного числа в переменной $b */

###	Получаем квадрат стороны А * 2	###
$aInSquare = ($a * 2) * ($a * 2);

/* Сейчас вы спросите, а почему мы увеличиваем значение переменной в 2 раза?
Методом научного тыка, я увидел что когда у переменной $a число больше в 2 раза, то и результат получается более естественным */

###	Получаем квадрат стороны B	###
$bInSquare = $b * $b;


###Получаем квадрат стороны гипотенузы	###
$cInSquare = $bInSquare + $aInSquare;



###	Получаем длину гипотенузы###
$c = sqrt($cInSquare);


$result = (int) round($c / $b);
/* Делим полученный результат гипотенузы на содержимое стороны $b и сводим значение в целое с помощью округления и превращения числа в int */

if($result > $b / 2){ $result = (int) round($b / 2); }
/* Проверим чтоб пользователю не прилетело слишком много баллов. Если ему поставл очень авторитетный человек, то карма максимум возрастет на 50% */


var_dump($result);
/* А в конце мы получим ответ 11, это число как раз адекватно поднимит карму пользователя. */
?>

Может кто-то спросит. А почему не использовал формулу $result = ($a * 2) / $b;?
Данная формула не адекватно работает когда $a меньше $b более чем в 2 раза.

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

Итог:

После тысячи тестов с $a = rand(0,99999); $b = rand(0,99999);
я пришел к паре багов:
1й — делить на 0.
Исправил if($b<=0){ $b=1; }

2й — когда получающий пользователь имеет 1 балл, и получает от пользователя с 1000, то его объем получающегося становится 2000
Исправил if($result > $b / 2){ $result = (int) round($b / 2); } Максимум можно увеличить на 50%.

Бенчмарк Code-Igniter не дал результатов нагрузки (0,0000).

Всем спасибо. Ищите вдохновление во всем что видите.

Сегментация аудитории позволяет выстроить персональную маркетинговую стратегию для каждой группы клиентов. Такой подход помогает повысить качество коммуникаций с аудиторией, а значит, увеличить KPI этих взаимодействий.

А чтобы определить, какая группа целевой аудитории наиболее выгодна для компании, составляют рейтинг сегментов.

Для чего нужен рейтинг сегментов

Рейтинг сегментов — это ранжирование выделенных групп аудитории с целью определить наиболее выгодный для бизнеса сегмент.

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

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

Читайте также

Как мы храним и анализируем результаты тестирования в Testers’ Book

Как сегментировать пользователей для построения рейтинга

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

Для составления рейтинга сегментов будет полезно знать, как именно покупатели выбирают товар и что влияет на принятие решения:

  • обстоятельства выбора (место, время, события);
  • мнение, к которому прислушиваются;
  • конкуренция;
  • заинтересованность в покупке.

Собрать эти данные можно по-разному:

  • отправить анкету в электронной рассылке;
  • провести интервью;
  • настроить всплывающие окна на сайте;
  • запустить чат-бота;
  • настроить формы регистрации;
  • записывать телефонные разговоры;
  • изучить данные из систем веб-аналитики: «Яндекс Метрики», Google Analytics;
  • собирать данные из соцсетей;
  • мониторить отзывы;
  • собирать данные из CRM;
  • анализировать поведение пользователей.

Проводим сегментацию с помощью известных методов. Мы рекомендуем следующие.

Метод Котлера

Филип Котлер предложил делить клиентов на группы по признакам: географическим, демографическим, психографическим и поведенческим.

сегментирование по котлеру

Клиентов сегментируют по всем или некоторым признакам. Дальше на сегменты настраивают рекламные предложения и почтовые рассылки, разрабатывают контент и способы общения.

Сегментация по типам активности

Сегментацию по активности делают в зависимости от того, как часто пользователи взаимодействуют с брендом. Активные подписчики регулярно просматривают письма, кликают по ссылкам и покупают товар. Неактивные не проявляют интерес к рассылке и рекламе либо проявляют редко.

С активными подписчиками бренд продолжает взаимодействовать: готовит акции и спецпредложения, отправляет письма, настраивает рекламу. Неактивных клиентов компания пробует перевести в активные: отправляет письма, настраивает ретаргетинг, предлагает скидки и предложения. Если перевести не удаётся, удаляет из базы.

Сегментация 5W

С помощью метода 5W подписчиков сегментируют в зависимости от того, какой товар им интересен. Для этого бренд отвечает на пять вопросов:

  1. What? (Что?) Какой товар/услугу продаём? Что хочет получить сам клиент?
  2. Who? (Кто?) Кто, какой человек будет покупать?
  3. Why? (Почему?) Почему клиент должен купить именно этот товар, какие проблемы поможет решить эта покупка?
  4. When? (Когда?) Когда клиент захочет купить товар?
  5. Where? (Где?) Где происходит покупка? Где клиент узнаёт о товаре?

Лестница Бена Ханта

Сегментация по методу Бена Ханта позволяет бизнесу оценить, на каком этапе сейчас находится потенциальный покупатель и как с ним взаимодействовать. Если клиент на нижней ступени, создаются стратегии, цель которых — довести клиента до последней ступени и превратить его в покупателя.

Лестница Бена Ханта состоит из шести ступеней. Она показывает, как начинаются и развиваются отношения между брендом и клиентом.

Лестница Бена Ханта

Лестница Бена Ханта
  1. Первый этап. Клиент ещё не осознаёт, зачем ему покупать у бренда. На этом этапе нет смысла предлагать товар: прежде клиент должен осознать свою потребность. Чтобы подтолкнуть его к этому, бренд использует рекламу и полезный контент.
  2. Второй этап. Клиент осознал потребность купить товар, но не знает, как её закрыть. Бренд предлагает решение: публикует чек-листы, выкладывает курсы на ютьюбе, запускает обучающий марафон.
  3. Третий этап. Клиент видит решение и ищет лучший вариант: анализирует информацию в интернете, сравнивает варианты, изучает отзывы и контент, публикуемый брендом.
  4. Четвёртый этап. Клиент готов выбирать товар. На этом этапе бренд демонстрирует преимущества, которые получит клиент, если купит именно у него.
  5. Пятый этап. Клиент определился с товаром и ищет подходящее предложение. Бренд продолжает мотивировать клиента купить именно у него: делает выгодное предложение, предлагает скидку, дарит бонусы.

Сегментация реальных клиентов для более точного рейтинга

Чтобы построить сегменты, основанные не только на гипотезах — но и на пользователях, которые ещё не купили товар бренда, а только проявляют к нему интерес, — дополнительно сегментируют существующую клиентскую базу. Это позволит составить более точный рейтинг.

Здесь тоже прибегаем к популярным методам сегментации.

Деление по поведенческим признакам в момент покупки

Психологи определяют четыре типа покупателей:

  1. Экономные. Особенно чувствительны к цене: если продукт дороже, чем у конкурентов, они уйдут к другому продавцу.
  2. Умеренные. Этот тип покупателей выбирает оптимальное соотношение цены и качества. Предпочтение отдают качеству и сервису продукта. Цена на втором месте.
  3. Импульсивные. Такие покупатели хотят как можно скорее получить товар. На решение о покупке влияют эмоции.
  4. Премиум. Люди, которые покупают самые дорогие товары. Этот сегмент малочисленный, но он приносит наибольшую прибыль.

RFM-анализ

RFM-анализ сегментирует аудиторию по трём параметрам, описывающим активность клиентов:

  • Recency — время с момента последней покупки;
  • Frequency — частота покупок;
  • Monetary — сумма всех покупок.

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

Через RFM-анализ получают следующие сегменты:

  1. VIP. Это сегмент людей, которые покупают часто, а последнюю покупку сделали недавно. Для VIP-клиентов разрабатывают выгодные условия сотрудничества: закрытый клуб и мероприятия, скидки, бонусную программу, кешбэк.
  2. Новички. Совершили одну-две покупки, последняя произошла недавно. Новичков продолжают знакомить с брендом, товарной линейкой, системой лояльности, гарантиями и так далее.
  3. Развивающиеся. Купили у бренда несколько раз, и последняя покупка произошла недавно. Им предлагают программу лояльности и демонстрируют сопутствующие товары, склоняют их к повторным покупкам.
  4. Лояльные. Покупают много, и последняя покупка была недавно. Этот сегмент поддерживают в том состоянии, в котором он находится: проводят опросы, чтобы узнать, что улучшить, поддерживают интерес к бренду через контент, демонстрируют товары-новинки.
  5. Спящие. Купили не так давно, но не возвращаются за повторными покупками. Спящему сегменту рассказывают про выгоды, дарят персональные скидки и мотивируют купить.
  6. Потерянные лояльные. Покупали у бренда много и часто, но давно. Чтобы вернуть интерес, бренд отправляет сегменту информацию об акциях, спецпредложениях и бонусах.
  7. Потерянные. Это сегмент клиентов, которые покупали давно. Потерянных покупателей бренд возвращает с помощью акций и персональных предложений.
  8. Сомневающиеся. Группа клиентов, которые купили несколько раз, и последняя их покупка произошла относительно недавно. Чтобы повысить доверие, сомневающимся бренд предлагает персональные скидки.

Подробнее о проведении RFM-анализа можно узнать у нас в блоге.

LTV

Метод основан на маркетинговой метрике LTV.

Через LTV отображают прибыль, которую приносит клиент бренду за всё время, что покупает у него товар, прогнозируют возможную прибыль и оценивают, как бизнес может развиваться, если получит эту прибыль

Используя метод LTV, клиентов делят на три группы:

  • эконом,
  • стандарт,
  • VIP.

Приоритет отдаётся сегменту VIP. Для него создают самые выгодные условия, чтобы клиенты продолжали покупать у бренда. Остальные сегменты стараются перевести в VIP через программу лояльности, скидки, акции и бонусы.

Как составить рейтинг сегментов: основные стратегии

Разберём способы построения таких рейтингов.

Рейтинг сегментов по активностям

Этот рейтинг помогает понять, какие клиенты и в какой степени вовлечены в маркетинговые кампании, а какие не проявляют к ним интереса.

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

Но к этому моменту сформировали 16 сегментов, чтобы проверить отношение текущего сегмента — клиентов, оформивших подписку в подарок, — к остальным по активностям в рассылках:

  1. Подписчики с регистрацией на сайте.
  2. Подписчики с формы подписки 1.
  3. Подписчики с формы подписки 2.
  4. Подписчики после онлайн-диагностики кожи № 1.
  5. Подписчики после онлайн-диагностики кожи № 2.
  6. Подписчики после онлайн-диагностики кожи № 3.
  7. Подписчики после онлайн-диагностики кожи № 4.
  8. Подписчики после онлайн-диагностики кожи № 5.
  9. Подписчики от партнёра 1.
  10. Подписчики от партнёра 2.
  11. Подписчики от партнёра 3.
  12. Подписчики с регистрацией на реферальной маркетинговой платформе.
  13. Подписчики с отдельной рекламной кампании.
  14. Подписчики из соцсетей.
  15. Подписчики с регистрацией при заказе.
  16. Прочие подписчики.

рейтинг сегментов распределение подписчиков по сегментам

Основная часть подписчиков были из сегментов «Подписчики с регистрацией на сайте» (38,6%) и «Прочие подписчики» (24,7%).

Для проверки гипотезы, что стоит приоритизировать в кампаниях эти сегменты, сравнивали три показателя активности:

  • OR,
  • CTR,
  • отписки.

Эти показатели проанализировали в массовых рассылках. Получили такие результаты:

рейтинг сегментов, распределение по проморассылкам

То же самое сделали и с триггерными письмами — теми, которые подписчики получают в ответ на какое-либо действие: купил товар; положил в корзину, но не оформил заказ; просмотрел некоторые товары, но не заказал.

рейтинг сегментов распределение по триггерным рассылкам

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

Использование такого метода позволило выявить наиболее востребованные сегменты и опровергнуть изначальную гипотезу.

Рейтинг на основе аналитики целевого сегмента

Важно не только правильно сегментировать базу, но и активно работать с полученными сегментами через персональные коммуникации. В этом нам помогает аналитика целевого сегмента.

На одном из наших проектов основная коммуникация происходит с целевым сегментом активных пользователей. Поэтому нам особенно интересна динамика развития этого сегмента.

В ноябре — декабре 2020-го мы обнаружили, что сегмент активных пользователей упал примерно на 15% по сравнению с прошлым годом. Решили провести дополнительную аналитику, чтобы выяснить реальные причины оттока из сегмента.

В сегмент активных попадают подписчики email-канала с валидными адресами, которые подходят под одно из условий:

  • подписчик — активный читатель рассылок в течение N дней;
  • новый подписчик, зарегистрировавшийся в течение N дней.

Мы проанализировали каждый профиль, изучили, кто был в сегменте активных пользователей в прошлом году и где оказался на текущий момент, и оказалось, что только 52% остаются активными в течение года. Это значит, что реальный отток больше, чем первоначальные 15%, когда учитывался приток новых пользователей, и это нивелировало падение.

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

Например, пользователей, которые больше не подписчики канала, можно реактивировать через другие доступные каналы коммуникации: пуши, смс, таргетированную рекламу и другие.

Отдельно выделили подписчиков, которые пока находятся в сегменте активных, но есть риск, что уйдут.

Активным сегмент становится при двух условиях:

  • совершил первое взаимодействие с брендом в последние N дней;
  • читал рассылки в течение N дней.

Проверили сегмент по первому условию и поняли, что примерно 35% подписались и ни разу не открывали рассылку.

У этих 35% посмотрели распределение первого действия в промежутках: оказалось, что у 45% осталось не так много времени, чтобы открыть рассылку. Если они не откроют хотя бы одну рассылку, то покинут сегмент.

Поэтому этой части клиентов надо уделить внимание.

Для таких клиентов необходимо проработать механику удержания, пока мы полностью их не потеряли.

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

Вывод: для чего нужен рейтинг сегментов

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

При этом важно найти баланс: работать не только с приоритетным сегментом. Со временем он может утратить важность. А другие сегменты, если им не уделять внимания, не заменят приоритетный. Лучше работать с несколькими сегментами одновременно и для каждого создавать маркетинговую стратегию.


У нас есть телеграм-канал, в котором пересказываем интересные материалы про онлайн-маркетинг в формате постов-трёхминуток — подписывайтесь на «Маркетинг за три минуты». А если хотите поболтать и поделиться мыслями, приходите в CRM-Chat.

На соревнованиях часто определяют места участников, исходя из суммы баллов за выступление. Бывает так, что разные участники набирают одинаковое количество баллов. В такой ситуации на одном месте оказывается несколько человек. В этом задании научимся определять места SQL запросом.

Проанализируем покупки клиентов. Для каждого товара найдем самую дешевую цену, по которой он продавался:

SELECT pi.product_id,
       min (pi.price) AS min_price
  FROM purchase_item pi
 GROUP BY pi.product_id
 ORDER BY min_price

Обрати внимание на строки 5 и 6. Товары продавались по одной цене.

Попробуем ввести рейтинг самых дешевых товаров. Воспользуемся функцией row_number() для проставления номеров в рейтинге:

SELECT pi.product_id,
       row_number () over (order by min (pi.price)) AS position,
       min (pi.price) AS min_price
  FROM purchase_item pi
 GROUP BY pi.product_id
 ORDER BY min_price

Смотрим на строки 5 и 6

Так дело не пойдет. Чем продукт 2 хуже продукта 3? У них должно быть одинаковое место в рейтинге.

В SQL есть специальная функция ранжирования, которая проставит одинаковое место (ранг) для продуктов с одинаковой стоимостью. Она называется rank.

Заменим row_number() на rank() и посмотрим на результат:

SELECT pi.product_id,
       rank () over (order by min (pi.price)) AS position,
       min (pi.price) AS min_price
  FROM purchase_item pi
 GROUP BY pi.product_id
 ORDER BY min_price

Продукты 2 и 3 теперь занимают одинаковую позицию в рейтинге.

Обрати внимание, что после 5 позиции в рейтинге сразу идет 7-я, т.к. на пятом месте располагаются два товара.

Предлагаю такую структуру данных:

Для метрик:

Создать таблицу с метриками:

+----------+----------+-----+----------+
| users_id | metric_x | ... | metric_y |
+----------+----------+-----+----------+
|        1 |       10 | ... |      310 |
|        2 |       34 | ... |      103 |
+----------+----------+-----+----------+

Либо в более нормализованном виде (но за 1 запрос будет уже не строка, а список):

+----------+------------+----------+
| users_id |       name |    value |
+----------+------------+----------+
|        1 |          1 |       10 |
|        1 |          2 |      310 |
|        2 |          1 |       34 |
|        2 |          2 |      103 |
+----------+------------+----------+

Для достижений:

Ссылка на пользователя и на достижение (можно в список достижений уже поместить фото, описание, и если достижений не много можно хранить их в массиве)

+----------+-----------------+
| users_id |  achievement_id |
+----------+-----------------+
|        1 |               1 |
|        1 |               2 |
|        2 |               1 |
|        3 |               8 |
+----------+-----------------+

Таблица с достижениями (многоточие означают информацию о достижении):

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

+----+-----+------------+-------+
| id | ... |  metric_id | value |
+----+-----+------------+-------+
|  1 | ... |          1 |   300 |
|  2 | ... |          2 |   200 |
|  3 | ... |          1 |    50 |
+----+-----+------------+-------+

И тригеры которые будут вызываться при нужных действиях:

И пример псевдокода (использую нормализованную таблицу для метрик):

public function trigger_update($user_id, $metric_id, $metric_value, $achievement) { 
    $sql = "UPDATE metric SET value = value + {$metric_value} 
            WHERE users_id = {$user_id} AND name = {$metric_id}";

    // выполнения запроса и получения элемента 
    $metic_value = sql_query($sql).commit();

    $sql = "SELECT * FROM achievement WHERE id = {$achievement} AND metric_id = {$metric_id} AND value >= ${value}";
    if (sql_query($sql).commit() !== Null){          

        $sql = "INSERT INTO users_achievement (users_id, achievement_id) VALUES ({$user_id}, {$achievement});"

        // и да, нужен индекс что-бы записи были уникальны 
        // и тут нужны обработка исключений или select что-бы нормально реагировать на то что у человека уже есть данное достижение. 
        sql_query($sql).commit();
        push_user($user_id, $metric_value);  // и метод уведомления
    }
}

p.s.

И достижения можно хранить в массиве и их условие, и не использовать для этих целей базу, из плюсов нет лишних запросов в БД, из минусов нет возможности быстро их менять.

6 апреля 2011 г.

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

Расчет рейтинга

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

Приращение рейтинга пользователя при голосовании за него (“+”) складывается из двух составляющих:

  • часть, которая зависит от Рейтинга этого пользователя
  • часть, которая зависит от Силы голосующего пользователя

Ниже я поясню, как рассчитываются эти части, а пока выберем параметр maxDeltaValue, значение которого является максимальным приращением рейтинга пользователя.

Примем, что первая часть приращения будет составлять 20% от максимального, а вторая — 80%. Т.е. основной вклад в приращение вносит именно Сила голоса голосующего пользователя.

В итоге имеем:
dРейтинг_а = f_1(Рейтинг_а) + f_2(Сила_б) <= maxDeltaValue

f_1 и f_2 — это некоторые функции, по которым рассчитываются составляющие приращения, зависящие от Рейтинга пользователя, за которого голосуют и Силы того, кто голосует соответственно.

Первая часть приращения

В этой части нужно выбрать убывающую функцию, чтобы значение данного приращения уменьшалось с ростом рейтинга пользователя. Это сделано, чтобы поддерживать новичков и рейтинги старичков не взлетали до небес (с этой точки зрения). Я выбрал экспонентциальную зависимость:
f_1® = a * exp(-b*R)

F_1®

Указанная функция будет стремиться к 0 с ростом значения рейтинга. Максимальное значение функции будет достигаться в точке с нулевым рейтингом в диапазоне рейтингов от 0 до бесконечности. Это значение равно параметру a указанной функции. Коэффициент b отвечает за скорость убывания функции, его можно выбрать любым (я выбрал b=0.005 для большей плавности).
Т.к. мы предположили, что первая часть приращение вносит вклад в общее приращение до 20%, сл. параметр a = 0.2 * maxDeltaValue.

// Приращение за счет рейтинга пользователя:
function f_1($rating)
{
global $maxRatingValue;$a = 0.2 * $maxRatingValue;
$b = 0.005;

return ($a * exp(-$b*$rating));
}

Вторая часть приращения

Здесь я использую возрастающую функцию. В данном случае — логарифм (натуральный). Сначала хотел использовать функцию, имеющую асимптоту.
Параметром функции является Сила пользователя (сила его голоса), которая, в моем случае, не является отдельной величиной, а выражается через рейтинг.

Сила также выражается логарифмической зависимостью, причем график функции такого логарифма должен проходить через точки:

  • (0;1) — при нулевом рейтинге (новый пользователь) Сила голоса равна 1.
  • (-N; 0), где -N — это значение рейтинга, при котором пользователь фактически теряет Силу голоса.

Потеря силы голоса

Решив простую систему уравнений можно получить функцию логарифма.
S® = log(((b - 1) / N) * R + b)

Значение Силы будет зависеть от основания логарифма и параметра b, который также зависит от основания. Если брать десятичный логарифм, то b = 10. При натуральном логарифме — b равно экспоненте. N – абсолютное значение рейтинга, когда пользователь теряет Силу.
В своей задаче я выбрал десятичный логарифм и N = 10.

function getSkill($rating)
{
$b = 10;
$N = 10;return(log10((($b - 1) / $N) * $rating + $b));
}

Вернемся к расчету второй части приращения:
f_2(S) = log(a*S + b)

Будем считать, что Сила пользователя изменяется от 0 до максимум 6 (значения больше 6 не рассматриваем). Сначала получим общую функцию логарифма, график которого проходит через точки (0;0) и (2; locMax), где locMax – некоторое условно максимальное значение.

f_2(S) = ln(((exp(locMax) - 1) / 2) * S + 1)

F_2(S)

Однако необходимо выполнить условие, что значение этой функции не будет превышать 80% от maxDeltaValue. Поэтому, точку (2; locMax) нельзя брать как максимальную. Поэтому найдем значение этой функции в точке с Силой равной 6 (как было предположено ранее, это максимальное значение Силы). В этой точке и примем максимум.
В итоге получаем следующую формулу:
f_2(S) = ln(((exp(0.8 * maxDeltaValue) - 5) / 6) * S + 1)

Силу пользователя можно получить из его рейтинга с помощью указанной выше функции getSkill().

// Приращение за счет Силы голосующего:
function f_2($rating)
{
global $maxRatingValue;$a = 0.8 * $maxRatingValue;

return (log(((exp($a) - 5) / 6) * getSkill($rating) + 1));
}

Итог

Итоговое приращение рейтинга пользователя равно сумме указанных выше двух частей. Стоит отметить, что эти части являются абсолютными значениями, то есть рассмотрено голосование в сторону “+”. Думаю, понятно, как это будет работать при голосовании в “-“.

Угасание рейтинга

Многими была предложена идея угасания рейтинга с течением времени. Я предлагаю ввести множество «несгораемых» значений рейтинга, достигнув которые, нельзя будет потерять со временем. «Сбить» с них можно будет уменьшением рейтинга другими пользователями.
Угасание рейтинга

Падение значения рейтинга со временем будет идти по экспонентам с различными скоростями угасания.

Добавить комментарий