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

Сезонностью обычно называют любые периодические колебания временного ряда. Допустим, у вас есть данные по продажам продукта за каждый день в течение трех лет. И наш опыт в аналитике приложений показывает, что в этом временном ряде, скорее всего, есть сезонность, то есть можно выделить некоторую цикличность в поведении показателей.
Чаще всего наиболее ярко сезонность выражена по дням недели и по месяцам. Рассмотрим каждую по отдельности.
Недельная сезонность заключается в приростах или падениях, соответствующих разным дням недели. Она объясняется вполне логично: есть будние дни, а есть выходные. Из будних дней можно выделить понедельник (как правило, со знаком минус) – день затишья после шумных выходных и пятницу (как правило, со знаком плюс) – день, когда можно позволить себе немного больше, чем обычно. В выходные же ведут себя иначе, в отличие от будних дней, и график онлайна (потому что можно играть с самого утра вместо того, чтобы идти в школу или на работу), и прочие метрики (допустим, ARPDAU – средний доход с активного пользователя в день).
Несколько примеров:
– во многих играх аудитория в выходной день больше, чем в будни;
– с другой стороны, показатели дохода в среднем выше в будние дни и достигают максимума в пятницу (именно поэтому пятница – отличный день для проведения акций);
– особенно интересным кажется результат нашего исследования: показатели удержания пользователей, зарегистрированных в пятницу, в среднем немного выше, чем у пользователей, зарегистрированных в другие дни. Вероятно, это можно объяснить чисто психологически: устанавливая приложение в пятницу, вы заранее увеличиваете себе шанс открыть его на следующий день, ведь это выходной.
Последний пример, к слову, демонстрирует важную мысль. Сезонность касается не только количественных метрик продукта (аудитория или доход), но и качественных показателей (Retention, ARPU). То есть пользователи даже ведут себя в разные дни по-разному.

Cкриншот отчета Main Metrics в devtodev. На нем видно, что и доход, и сессии имеют недельную сезонность, и особенно ярко выражена она у показателя дохода
Месячная сезонность
Если агрегировать показатели по месяцам (от DAU перейти к MAU, а от ARPDAU к ARPU), то тоже можно заметить некоторые сезонные изменения:
– как мы говорили выше, во многих продуктах жаркие месяцы являются, наоборот, наиболее «холодными» по количеству аудитории, ее интересу и деньгам;
– а вот холодные месяцы, наоборот, привлекают больше пользователей (условно говоря, на улице холодно, можно и дома посидеть, в игры поиграть);
– особенно ярко выражена сезонность в декабре – это, как правило, месяц всеобщего подъема, притом как аудитории, так и денег, с нее полученных.
Впрочем, только лишь недельной или месячной сезонностью дело не ограничивается. Чуть ниже мы поговорим о том, как найти оптимальную продолжительность цикла, а пока – несколько нетривиальных примеров:
– в одной из игр мы видели, что оптимальная продолжительность цикла в поведении показателя ARPDAU не 7 дней, а 14. Мы объяснили это тем, что зарплату людям платят как раз каждые две недели;
– в некоторых продуктах, кстати, особенно заметны пики на тех числах месяца, которые делятся на пять (а это и есть дни зарплаты);
– также мы находили продукты, в которых оптимальные циклы составляли 3, 9, 11 дней, и во всех случаях это объяснялось внутренними ивентами в продукте (в частности, турнирами).
Еще один вид классификации сезонности, о котором стоит упомянуть. Она бывает аддитивная (когда сезонные коэффициенты постоянны во времени) и мультипликативная (когда сезонные колебания со временем растут или падают). Мы рассмотрели аддитивную – по нашему опыту, она встречается чаще.

Отличия аддитивной и мультипликативной сезонности
Вашему вниманию предлагается подробное описание алгоритма расчета сезонности (на примере нахождения сезонности по дням недели).
Очистка данных от выбросов
Предварительно исходные данные нужно очистить от выбросов – нетипично высоких или низких значений показателя, которые находятся за пределами ожидаемого диапазона. Часто на графике такие данные выглядят как значительные пики или, наоборот, падения практически до нуля, которые в несколько раз превосходят обычные значения.
Причиной выброса может быть пик продаж в праздничный день, сбой в работе системы трекинга или любой другой разовый фактор, который так или иначе повлиял на метрику.
Почему нужно очищать данные от выбросов? Дело в том, что эти значения искажают результаты расчетов и могут привести к ошибкам в прогнозе. Некоторые статистические показатели, такие как стандартное отклонение и среднее арифметическое, зависимы от выбросов, и, включив их в расчет, можно сделать некорректные выводы.
Поэтому для очистки данных существует ряд подходов, которые позволяют оценить, какое подозрительно высокое или низкое значение можно считать выбросом, а какое таковым не является.
Подробнее на очистке от выбросов останавливаться мы не будем, ведь сейчас наша основная задача – это расчет сезонности. Тем не менее при анализе данных нужно всегда о ней помнить.
Расчет автокорреляции
Итак, второй этап расчетов, который применяется к уже очищенным данным, – это расчет лага автокорреляции.
Автокорреляция – это зависимость между значениями временного ряда, взятыми со сдвигом. Она используется для выявления тенденций и циклических колебаний данных во временном ряду.
Для ее расчета в Excel существует стандартная функция – КОРРЕЛ (CORREL), которая рассчитывает коэффициент автокорреляции между двумя диапазонами данных. Эти диапазоны и являются аргументами функции и смещены друг относительно друга: если мы ищем коэффициент автокорреляции 1-го порядка, то первый диапазон включает значения временного ряда, начиная с первого и заканчивая предпоследним, а второй диапазон содержит все значения, начиная со второго. Таким образом, мы получаем два диапазона, смещенные друг от друга на один день.
Для поиска коэффициента 2-го порядка диапазоны должны быть смещены на два дня – первый не включает последние два значения временного ряда, второй не включает первые два.
Этим способом мы рассчитываем коэффициенты автокорреляции для семи порядков и находим среди них максимальный. Он и будет показателем того, в какой день автокорреляция наиболее высокая.
Если максимальный коэффициент получился для автокорреляции первого порядка, то это значит, что данный ряд не содержит каких-либо тенденций и зависимостей.
А если этот коэффициент максимален для 7-го порядка, это значит, что ряд содержит циклические колебания с периодичностью в 7 дней.

В нашем примере наибольший коэффициент проявляется как раз для автокорреляции 7-го порядка. Это говорит о том, что в данном временном ряду присутствует недельная сезонность
Расчет коэффициентов линейного тренда
Далее построим тренд для нашего ряда, чтобы впоследствии сделать по нему прогноз и определить, как будет дальше себя вести выбранный показатель.
Существует несколько видов тренда, которыми можно описать метрику (линейный, экспоненциальный, логарифмический, полиномиальный и т. д.). Мы будем использовать линейный, так как он наиболее прост для построения и восприятия, но в то же время хорошо показывает динамику метрики.
Линейный тренд строится по уравнению вида y = ax + b, где a и b – коэффициенты, а x – порядковый номер дня. Для расчета уравнения нужно вычислить два коэффициента.
Сделать это можно также стандартной функцией Excel – ЛИНЕЙН (LINEST), аргументами которой являются два массива данных: исследуемая метрика и порядковые номера дней.
Используя эту формулу как функцию массива (Ctrl + Shift + Enter), мы получаем два коэффициента, которые затем подставим в уравнение.
Линейный тренд годится в большинстве случаев, особенно если в данных нет заметных регулярно повторяемых выбросов.
Построение линии тренда
Для построения линии тренда используем рассчитанные ранее коэффициенты – a и b. Единственным изменяемым параметром уравнения будет х – порядковый номер дня. Благодаря этому линия тренда может быть продлена на несколько дней вперед, в нашем примере это семь дней (столбец I). Так мы получаем дальнейшую динамику изменения метрики.
Расчет коэффициентов сезонности
Следующий шаг для построения прогноза по линейному тренду – расчет коэффициентов сезонности.
Для этого нужно определить отклонение значений метрики от линии тренда (столбец K), а затем найти среднее значение этих отклонений в зависимости от дня цикла. Эти средние значения и есть искомые коэффициенты.
Наложение сезонности на тренд и построение прогноза
Чтобы завершить прогноз, необходимо «наложить» на тренд сезонность.
Для этого нужно умножить каждое значение линии тренда на коэффициент сезонности соответствующего дня (столбец L).
Это приведет график линии тренда к привычному виду – с регулярными колебаниями в зависимости от дня недели.
А так как ранее мы продлили тренд на семь дней за пределы имеющихся данных, эта сезонность распространится и на спрогнозированную часть линии тренда, предоставив таким образом прогноз метрики на ближайшие семь дней.

График из расчетного файла: ярко выражена недельная сезонность на фоне падающего линейного тренда
Зачем нужно знать сезонность
Во-первых, чтобы точнее прогнозировать свою выручку и принимать на основании этих прогнозов более правильные решения. Допустим, не планировать массовую закупку трафика на август, а потерпеть до сентября. Вопрос планирования выручки вообще очень важен, и, пожалуй, в любой компании его решают. Сезонность – один из способов сделать свои прогнозы значительно точнее.
Во-вторых, сезонность можно использовать себе во благо. Если вы знаете, что в декабре у вас будет много пользователей и средний доход на пользователя будет высок, то есть смысл увеличить его, предложив этим «горячим» пользователям холодного месяца более выгодные скидки и запланировав на этот период внутриигровые активности.
Интересный вопрос: можно ли бороться с сезонностью? Допустим, вы знаете, что в июле ARPDAU у вас будет самым низким за год. Нужно ли пытаться повысить его и бомбить пользователей заманчивыми июльскими скидками?
Наш опыт говорит, что бороться с сезонностью бесполезно: если ваш клиент уехал в летний отпуск, то он и будет пребывать в этом отпуске, что бы вы ни делали. Лучше сосредоточиться на том, чтобы мультиплицировать сезонность «хороших» месяцев, увеличивая и без того хороший доход, чем пытаться поднять из мертвых доход «плохих». Еще один вариант: на время сезонного спада увеличивать аудиторию стран, где сезонность ведет себя обратным образом, диверсифицируя таким образом свой доход.