Оценка ценности, которую персонализация приносит вашим игрокам.

Рекомендую читателям просмотреть первую часть этого блога; это сообщение находится здесь.

В последнем сообщении блога цель состояла в том, чтобы объяснить основные концепции вращающегося магазина, добавив при этом некоторые незначительные детали персонализации. Мы сделали быструю оценку, чтобы понять, как персонализация влияет на денежные потоки постоянно меняющихся магазинов. К сожалению, это вселило наивный оптимизм в отношении персонализации; этот пост направлен на то, чтобы углубиться в области, в которых предыдущий не оправдал ожиданий. Давайте начнем!

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

Пропускная способность

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

Пропускная способность = количество элементов * количество обновлений

Мы могли бы определить пропускную способность для любого периода времени, но пока мы сосредоточимся на годовой пропускной способности. В нашем предыдущем игрушечном примере годовая пропускная способность была бы 1 * 52 ; 52 шт. Эта пропускная способность может иметь широкий диапазон; например, во вращающемся магазине можно было бы показывать три вещи каждый день и более тысячи каждый год. Разные системы могут иметь одинаковую пропускную способность; Если бы мы предлагали игроку 13 предметов раз в квартал, он также увидел бы 52 предмета. Обратите внимание, что эти элементы не обязательно должны быть и часто не будут уникальными в течение этого периода времени. Хотя естественно вводить ограничения, которые не позволяют предлагать один и тот же продукт дважды в одной и той же ротации, это, скорее всего, не будет перенесено на более длительные сроки. В обоих приведенных выше примерах 52 элемента, вероятно, не будут 52 уникальными элементами, если мы не наложим дополнительные ограничения.

Структура магазина

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

Конечно, мы также можем персонализировать эту структуру; возможно, один игрок с большей вероятностью будет покупать контент, если он будет размещен вертикально, а не горизонтально, а другой - нет. Мы также могли бы изменить согласованность вращений - лучше ли, чтобы магазин всегда имел одну и ту же структуру, чтобы игроки были знакомы с ней, или случайный дизайн, который меняется при каждом повороте, будет более привлекательным? Хотя это может показаться основным сценарием для A / B-тестирования, не будем забегать вперед. выгоды от оптимизации самого содержания намного перевешивают структуру магазина. Хотя размещение и презентация значимы, основным мотиватором покупки является близость к предмету. Мы должны избегать оптимизации структуры магазина до тех пор, пока мы не будем обслуживать контент должным образом.

Масштаб каталога

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

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

Рост каталога

Если количество доступных элементов в магазине не является статическим, возникает другая трудность, особенно если рост количества новых элементов выше, чем сама пропускная способность. Одна из стратегий, которую игровая индустрия использует, чтобы гарантировать, что игроки не пропустят свежий, новый контент, - это гарантия доступности в течение установленного времени после выпуска. Обычно магазины достигают этого, добавляя заранее запланированную «избранную» зону, которая не уникальна для каждого игрока. Однако предположим, что падение содержания слишком велико. В этом случае необходимо принести жертву, либо уменьшив количество времени, в течение которого элемент отображается при выпуске, либо персонализировав эти избранные разделы. Согласно первому сценарию, у игрока, возможно, не было возможности войти в систему, прежде чем другие рекомендуемые продукты вступят во владение. В последнем случае стратегия гарантирует, что игрок не увидит часть предметов, но компромисс может стоить того, чтобы показывать более релевантные продукты в течение более длительного времени. В большинстве случаев рост каталога не будет опережать скорость ротации, но это все же важный аспект, который необходимо учесть.

Долгосрочные сценарии

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

  • Размер поворота - сколько элементов будет доступно в повороте?
  • Частота вращения - как часто будет меняться магазин?
  • Размер каталога - насколько велик каталог изначально?
  • Рост каталога - как размер каталога увеличивается со временем?
  • Распределение - каково основное распределение покупок?

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

Чтобы объяснить некоторые из основных частей:

  • Предустановленные значения для нашего сценария пытаются имитировать разумную реальную систему; частота ротации один раз в неделю (52), шесть предметов в каждой ротации, размер каталога - тысяча, рост каталога на два предмета в неделю и примерный список вероятностей покупок, которые следуют за распределением мощности - в среднем при 3% покупательной способности. Единственная сомнительная предустановка - это спред, который имитирует разнообразие пользователей в своих предпочтениях.
  • Функция add_items работает так, как и следовало ожидать; добавляет товары в каталог. Мы используем это для инициализации каталога, а также для его дальнейшего расширения. Инициализация немного наивна, она дублирует данный дистрибутив до тех пор, пока не достигнет правильного размера. Если размер каталога не является прямым кратным размеру распределения, то несколько элементов случайным образом выбираются из распределения, чтобы соответствовать этому критерию.
  • В add_items есть понимание списка, которое создает кортежи. Структура этих кортежей следующая (номер_элемента, популярная_преф, персональная_преф). Чтобы смоделировать личные предпочтения, мы умножаем число popular_pref на спред, чтобы получить диапазон чисел, близких к курсу покупки по умолчанию. Эта операция в некоторой степени произвольна, но ее легко гарантировать, что средний уровень покупок по элементам для пользователей остается неизменным; мы расширим его позже.
  • Функция «rank_items» сортирует элементы в каталоге; поддерживаются следующие методы:

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

Популярные - отсортируйте товары на основе их общей вероятности покупки.

Личные - отсортируйте товары в зависимости от вероятности покупки.

  • Функция rotate_simulation запускает годичное моделирование витрины для отдельного человека. Каждая ротация определяет, купил ли человек предмет, при необходимости удаляет его из каталога и добавляет новые предметы. Важнейшей частью здесь является моделирование решения о покупке, и мы ссылаемся на предпочтения человека, чтобы определить это.
  • Было бы неплохо переписать это как класс RotatingStore. :)

При запуске значений по умолчанию для 10 000 человек результаты будут следующими:

Количество проданных предметов по случайной стратегии ~ 9, популярным ~ 37 и личным ~ 67. Самая важная вещь, на которую стоит обратить внимание, - это насколько плохо случайные ярмарки стратегий - с учетом этого базового распределения общая эвристика популярности, вероятно, увеличит количество проданных товаров в 4 раза. Из-за низкой производительности мы будем игнорировать случайный метод с этого момента; рейтинг популярности должен быть относительно простой модификацией, которую в любом случае можно добавить. Теперь мы переключаем наше внимание на популярное и личное, что по умолчанию составляет 82%. Давайте посмотрим, как изменения в сценарии по умолчанию влияют на соотношение между этими двумя числами.

Переменные каталога

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

Переменные вращения

По мере увеличения частоты вращения ценность персонализации уменьшается.

По мере увеличения размера поворота ценность персонализации уменьшается.

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

Распределения

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

Для приведенных выше распределений подъем по сценарию по умолчанию составляет 140% для равномерного, 130% для линейного и 72% для плато. Распределение мощности (82%) теперь кажется неудовлетворительным, и мы можем сделать вывод, что этот выбор в наших симуляциях не увеличивал числа для персонализации.

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

Скорость покупки

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

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

Распространять

Все варианты выбора для нашей симуляции кажутся относительно простыми до тех пор, пока мы не дойдем до подозрительной переменной спреда. Как упоминалось ранее, здесь используется функция распространения, чтобы оценить, насколько разные предпочтения от одного пользователя к другому. Если спред равен нулю, то в любом человеке нет ничего особенного; их предпочтения повторяют предпочтения толпы. Если спред равен 1, пользователь имеет предпочтение от 0x до 2x, чем у населения. Если спред равен 0,5, пользователь имеет предпочтение от 0,5x до 1,5x. Вот как эта переменная распространения влияет на персонализацию:

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

Возникает вопрос: насколько реалистичен разброс, который мы выбираем для моделирования? Это кажется довольно оптимистичным, но также может быть пессимистичным. Например, представьте, что в нашем магазине 32 товара, все с одинаковой вероятностью покупки на уровне популяции, за исключением того, что каждому пользователю нужен только один из этих товаров и ни один из остальных. Распределение населения - это максимальная энтропия, в то время как распределение каждого человека имеет минимальную энтропию. В этом сценарии разброс намного больше, чем все, что мы моделировали, и реализация какой-либо формы персонализации имеет решающее значение. Но действительно ли это реальный сценарий? Возможно, вы заметили, что этот случай относится к спортивной лиге, такой как НФЛ, где контент привязан к отдельным командам (одной из 32) или игрокам; в этих сценариях поляризованные предпочтения фанатов являются обычным явлением. Контент в видеоиграх часто привязан к определенным персонажам, классам или оружию, и возникает тот же эффект.

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

Точность прогнозов

Хотя мы могли бы и дальше сосредоточиться на одной переменной спреда, на самом деле нам нужен более общий подход к пониманию дисперсии игроков. Эта простая модификация, скорее всего, неверна, и вместо этого нам нужно точно предсказать модели покупок того или иного игрока; это имеет первостепенное значение для реальных систем. Опять же, если фактическое распределение предпочтений от одного игрока к другому велико, персонализация имеет большое значение. Тем не менее, это не будет иметь большого значения, если мы не сможем делать точные прогнозы. Если у нас миллионы пользователей, получить правильный показатель популярности несложно; просто усредните процент покупок по всем элементам и отсортируйте их универсально, удалив определенные элементы, уже принадлежащие отдельным пользователям. Тем не менее, получить вероятности для конкретного игрока сложнее, особенно если у нас есть ограниченные данные о них. Мы снова проявили наивность в этом моделировании, предполагая, что мы безошибочно предсказали предпочтения каждого человека. В действительности, даже с лучшими моделями, мы собираемся получить только от 50% до 80% этой дополнительной стоимости.

Резюме

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

Вот некоторые из них:

  • Сохранение «свежести» - если персонализация продолжает показывать одни и те же данные для каждого пользователя в течение нескольких ротаций, плохо ли это «устаревание»? Если да, то как мы можем это решить?
  • Цены на товары - если наш каталог состоит из товаров с различной стоимостью, как это повлияет на наш выбор?
  • Объем модели - если мы сможем создавать точные модели на основе исторических данных и применять эти модели для будущих рекомендаций, получим ли мы те же результаты? Почему или почему нет?

Увидимся в следующей ротации.