- PVSM.RU - https://www.pvsm.ru -
Однажды мы решили посмотреть, какие сезонные интересы есть у пользователей 2ГИС в разных городах. Всплески интереса к цветам, новогодним подаркам и шинам — вполне ожидаемы. Мы решили ими не ограничиваться и пойти дальше, проверив все сферы деятельности во всех 113 городах присутствия.
В этой статье я расскажу, как мы искали сезонности и какие особенности поведения пользователей в них обнаружили.
Потребности пользователей 2ГИС меняются в течение года: товары народного потребления, сферы услуг, строительство, государственные службы. Знания о сезонностях полезны по нескольким причинам:
Прежде чем рассказывать о том, как мы обрабатываем трафик, стоит уточнить, что мы его делим на несколько видов.
Рекавери — вид трафика, при котором пользователь точно знает компанию, в которую хочет обратиться. Ему надо уточнить адрес, расписание работы или найти вход. В этом случае поиск происходит по названию фирмы, номеру телефона и прочим атрибутам самой компании.
Дискавери-трафик — это когда пользователь формулирует запрос в более общих терминах: «мягкая мебель», «поесть на Ленина», «бани». То есть пользователь исследует варианты и предложения рынка, зачастую обзванивая организации или заходя на их сайты.
Гео-трафик возникает в том случае, когда пользователь работает с картой. Например, ищет ближайшие к дому аптеки или СТО.
Все пользовательские запросы и все последующие за ними действия размечаются по трафику. Для поиска сезонностей в анализ взяли дискавери + гео-трафик. Так как они, во-первых, соответствуют проявлению пользовательских интересов, во-вторых, ими можно управлять. Управлять рекавери-трафиком нельзя.
График 1: Вы видите сезонность?
Перед тем, как приступить к поиску сезонности, нужно учесть изменения объёма трафика на разных типах устройств. Мы учитывали, что аудитории WinPhone и ПК-версий непрерывно падают. Тогда как онлайн, Android, iOS — перманентно растут.
Критерии определения сезонности разработаны для стационарных рядов. Нужно проверить гипотезу о том, что ряд содержит тренд. Будем рассматривать временной ряд как случайный процесс. Тогда элементы ряда представляют собой реализации некоторой случайной величины.
Можем проверить гипотезу о том, что все выборочные значения принадлежат к одной генеральной совокупности со средним m. Тогда основная гипотеза имеет вид:
против конкурирующей гипотезы о наличии тренда
$inline$H_1: ∣m_{i+1}−m_i∣ > 0, i=1,2,...,N−1$inline$
где N — это количество элементов в ряде.
Для того, чтобы проверить гипотезу, нужно воспользоваться одним из критериев значимости тренда. На основе проведённых исследований выбрали критерий инверсий [1].
Если гипотеза не отвергается, то необходимо убрать тренд из данных. Предполагаем, что в наших данных может быть только линейный тренд. Эх, был бы он экспоненциальный! Также будем предполагать, что у нас может быть не более одной точки перегиба.
График 2: Временной ряд (из графика 1) и его тренд
Мы наметили границы исследования и взялись за проверку гипотез. Конечно же, без граблей и открытий не обошлось: так как задача не ограничивалась популярными услугами в городах-миллионниках, мы собрали список частных случаев, на которые стоит обращать внимание.
График 3: Ряд без тренда
После вычитания из временных рядов соответствующих им трендов можно переходить к задаче поиска сезонностей. Она состоит из двух подзадач:
Готовые функции поиска корреляций есть как в R, так и в Python. Мы использовали корреляцию Пирсона. При работе с векторами пользовательских интересов надо иметь в виду следующее:
Ищем корреляцию двух векторов: X: [0; N-365], Y: [366; N]. Где N — длина ряда.
График 4: Обнаружение корреляции
Сам факт наличия сезонности не несет в себе практической ценности. Надо понимать, какое внимание к сфере деятельности будет в следующем месяце: повышенное, пониженное или обычное.
В качестве конечного результата была выбрана мультипликативная шкала. Где единица — это «нормальный» уровень пользовательского интереса к сфере деятельности. Значение отличное от единицы характеризует кратное увеличение или спад интереса.
В нашем случае [пока] достаточно временного масштаба продолжительностью в месяц. Для определения уровня 1 использовали медиану помесячного внимания пользователей. Далее вычисляли кратное отклонение от этой медианы.
График 5: Годовая сезонность
Пора раскрыть тайну, какие данные показывают графики статьи. На этом и всех предыдущих графиках — клики в музеи Санкт-Петербурга. Как видно из последнего графика, музеи популярны в январские праздники, когда много выходных, и летом.
… взять и скормить алгоритму не интересы пользователей, а, например, продажи?
Алгоритм действий такой же:
Реклама в 2ГИС продаётся помесячно, поэтому за масштаб взяли месяц, но пользовательскую сезонность анализировали с точностью до дня. Для обратной совместимости адаптировали алгоритмы, чтобы они работали с произвольными рядами, где по оси X — порядковый номер точки, а по оси Y некое value (на этом уровне семантика value не имеет значения).
Точка отсчёта ряда продаж (начало координат), как правило, не совпадает с точкой отсчёта пользовательской сезонности. Ведь сначала город набирает аудиторию, и лишь затем появляется реклама. На этом этапе не стоит совмещать результаты двух сезонностей.
Так как продажи помесячные, то и точек в рядах у нас существенно меньше. В этом случае корреляцию надо считать в 12 точек вместо 365.
График 6: Сезонность продаж
В качестве завершающего этапа мы решили наложить сезонность продаж на пользовательскую сезонность. Теперь видно, где мы продаём рекламу позже, чем надо, и отстаём от пользовательского спроса.
Так, например, пользователи проявляют интерес по закупу бетона в Нижнем Новгороде в период с апреля по октябрь. Тогда как компании занимаются продвижением всего лишь с мая по сентябрь.
График 7: Пересечение пользовательской сезонности и сезонности продаж (зеленый — пользовательская, голубой — продажи, красный — совпадение)
Всё выше описанное реализовано в MS SQL Server 2016. Для поиска линейной регрессии и корреляции используется R, который входит в состав сервера, начиная с версии 2016. И поскольку у нас Data Warehouse и аналитика пользовательской статистики уже на SQL Server, оказалось очень удобным использовать R для математических расчётов.
Пример использования R из TSQL:
INSERT INTO #tmp
EXEC sp_execute_external_script
@language = N'R',
@script = @R,
@input_data_1 = N'SELECT DataId, Number, Value FROM #data ORDER BY 1, 2'
Где:
В нашем случае оказалось, что существенную часть времени выполнения sp_execute_external_script занимает непосредственно обращение к R Services. Сам R-код отрабатывал быстро.
Напомню, мы хотели посчитать тренды и сезонности для всех городов покрытия 2ГИС и всех сфер деятельности. Поэтому решили передавать в InputDataSet не один ряд (Number, Value), а сразу несколько, сгруппированных по DataId. А цикл по DataId организовали внутри R. Тем самым существенно сэкономили на вызове службы R Services.
Вы дочитали статью до конца, это похвально. Чтобы развлечь вас перед итогами, делимся интересными фактами, выявленными в ходе анализа сезонности.
Автомобилисты знают из личного опыта, что сезон поиска шин и шиномонтажа — весна и осень. Но, если быть точным, сезон в разных городах может сильно отличаться. Поэтому при формировании подборок и дашбордов (стартовых экранов в продуктах) важно учитывать сезонность в каждом конкретном городе.
График 8: Сезонности шин в Краснодаре, Новосибирске и Норильске
Сезонности могут отличаться даже внутри одной сферы деятельности — на разных типах устройств. Например, «новогодние подарки» на большом экране начинают искать в октябре. Тогда как в мобильных версиях поиск стартует на месяц позже и пик приходится ближе к Новому году.
График 9: Поиск новогодних подарков в онлайне и мобильной версии 2ГИС
В процессе работы над сезонностями обнаружили сферу деятельности, интерес к которой проявляется раз в три месяца. Причём это справедливо для разных городов России.
Попробуйте угадать, что это за сфера деятельности.
График 10
Собираетесь искать корреляции в данных? Не забудьте эти данные подготовить: обработать пропуски, очистить от трендов и выбросов. Имейте в виду, что подготовка займет бОльшую часть времени.
На этапе работы с рядами максимально абстрагируйтесь от семантики: работайте с value и порядковым номером точки, тогда код будет проще переиспользовать. Очень сильно поможет визуализация на каждом этапе обработки.
PS: задача поиска трендов и сезонностей делалась в рамках другой задачи — прогнозирования изменения пользовательского внимания после приобретения рекламы в 2ГИС. Готов рассказать, как мы делали прогноз, если вам будет интересно.
Автор: Shirshakov
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/282831
Ссылки в тексте:
[1] критерий инверсий: https://ami.nstu.ru/~headrd/seminar/publik_html/Veretelnikova_Lemeshko_OIiMM_2016.pdf
[2] Источник: https://habr.com/post/414041/?utm_campaign=414041
Нажмите здесь для печати.