У нас две новости: хорошая и плохая. Хорошая: скоро май, а после него лето. Плохая: часто бывает так, что доходы мобильного приложения, игры, или любого другого продукта падают в жаркие месяцы, и тому есть вполне разумное объяснение.
В данной статье мы поговорим о таком явлении, как сезонность в значениях ключевых показателей проекта, обсудим, как её найти и использовать себе во благо.
Что такое сезонность?
Сезонностью обычно называют любые периодические колебания временного ряда. Допустим, вы имеете данные по продажам продукта за каждый день в течение трёх лет. И наш опыт в аналитике приложений показывает, что в вашем временном ряде скорее всего есть сезонность, то есть можно выделить некоторую цикличность в поведении показателей.
Чаще всего, наиболее ярко выражена сезонность по дням недели и по месяцам. Рассмотрим каждую отдельно.
Недельная сезонность заключается в приростах или падениях, соответствующих разным дням недели. Она объясняется вполне логично: есть будние дни, а есть выходные. Из будних дней можно выделить понедельник (как правило, со знаком минус) — день затишья после шумных выходных и пятницу (как правило, со знаком плюс) — день, когда можно позволить себе немного больше, чем обычно. В выходные же себя иначе, в отличие от будних дней, ведут и график онлайна (потому что можно играть с самого утра, вместо того, чтоб идти в школу или на работу), и прочие метрики (допустим, ARPDAU — средний доход с активного пользователя в день).
Несколько примеров:
- во многих играх аудитория в выходной день больше, чем в будни;
- с другой же стороны, показатели дохода в среднем выше в будние дни и достигают максимума в пятницу (именно поэтому пятница — отличный день для проведения акций);
- особенно интересным кажется тот факт, что показатели удержания пользователей, зарегистрированных в пятницу, в среднем немного выше, чем у пользователей, зарегистрированных в другие дни. Вероятно, это можно объяснить чисто психологически: устанавливая приложение в пятницу, вы заранее увеличиваете себе шанс открыть его на следующий день, ведь это выходной.
Последний пример, к слову, демонстрирует важную мысль. Сезонность касается не только количественных метрик продукта (аудитория или доход), но и качественных показателей (retention, ARPU). То есть пользователи даже ведут себя в разные дни немного по-разному.
Месячная сезонность. Если агрегировать показатели по месяцам (от DAU перейти к MAU, а от ARPDAU к ARPU), то тоже можно заметить некоторые сезонные изменения:
- как мы говорили выше, во многих продуктах жаркие месяцы являются наоборот наиболее «холодными» по количеству аудитории, её интересу и деньгам;
- а вот холодные месяцы, наоборот, привлекают больше пользователей (условно говоря, на улице холодно, можно и дома посидеть, в игры поиграть);
- особенно ярко выражена сезонность в декабре — это, как правило, месяц всеобщего подъёма, притом как аудитории, так и денег, полученных с неё.
Впрочем, только лишь недельной или месячной сезонностью дело не ограничивается. Чуть ниже мы поговорим о том, как найти оптимальную продолжительность цикла, а пока — несколько нетривиальных примеров:
- в одной из игр мы видели, что оптимальная продолжительность цикла в поведении показателя ARPDAU — не 7 дней, а 14; мы объясняли это тем, что зарплату людям как раз платят раз в две недели;
- в некоторых продуктах, кстати, особенно заметны пики на тех числах месяца, которые делятся на пять (а это и есть дни зарплаты);
- также мы находили продукты, в которых оптимальные циклы составляли 3, 9, 11 дней — и во всех случаях это объяснялось внутренними ивентами в продукте (в частности, турнирами).
Ещё один вид классификации сезонности, о котором стоит упомянуть. Она бывает аддитивная (когда сезонные коэффициенты постоянны во времени) и мультипликативная (когда сезонные колебания со временем растут или падают). В нашей статье мы рассмотрели аддиктивную — по нашему опыту в devtodev, она встречается чаще.
Как найти сезонность?
Вашему вниманию подробное описание алгоритма расчёта сезонности (на примере нахождения сезонности по дням недели).
Чтобы вам было проще понимать процесс расчёта сезонности, мы подготовили файл, в котором проделаны все нижеследующие действия. Впрочем, если вы будете использовать этот файл, подставлять в него свои данные, рассчитывать сезонность и делать прогнозы, то мы тоже не будем против.
Очистка данных от выбросов
Предварительно исходные данные нужно очистить от выбросов — нетипично высоких или низких значений показателя, которые находятся за пределами ожидаемого диапазона. Часто на графике такие данные выглядят как значительные пики или наоборот падения практически до нуля, которые превосходят обычные значения в несколько раз.
Причиной выброса может быть пик продаж в праздный день, сбой в работе системы трекинга или любой другой разовый фактор, который так или иначе повлиял на метрику.
Почему нужно очищать данные от этих выбросов? Дело в том, что такие значения искажают результаты расчетов и могут привести к ошибкам в прогнозе. Некоторые статистические показатели такие как стандартное отклонение и среднее арифметическое, зависимы от выбросов и, включив их в расчет, можно сделать некорректные выводы.
Поэтому для очистки данных существует ряд подходов, которые позволяют оценить какое подозрительно высокое или низкое значение можно считать выбросом, а какое выбросом не является.
Подробнее на очистке от выбросов останавливаться не будем, т.к. наша основная задача сейчас — это расчет сезонности, но тем не менее, нужно всегда о ней помнить при анализе данных.
Расчет автокорреляции
Итак, второй этап расчетов, который применяется к уже очищенным данным, — это расчет лага автокорреляции.
Автокорреляция — это зависимость между значениями временного ряда, взятыми со сдвигом. Она используется для выявления тенденций и циклических колебаний данных во временном ряду.
Для ее расчета в Excel существует стандартная функция — КОРРЕЛ (CORREL), которая рассчитывает коэффициент автокорреляции между двумя диапазонами данных. Эти диапазоны и являются аргументами функции и смещены друг относительно друга: если мы ищем коэффициент автокорреляции 1-го порядка, то первый диапазон включает значения временного ряда начиная с первого, заканчивая предпоследним, второй диапазон содержит все значения, начиная со второго. Т.о. мы получаем два диапазона смещенные друг от друга на один день.
Для поиска коэффициента 2-го порядка, диапазоны должны быть смещены на 2 дня — первый не включает последние два значения временного ряда, второй не включает первые два.
Этим способом мы рассчитываем коэффициенты автокорреляции для 7 порядков и находим среди них максимальный. Он и будет показателем того, в какой день автокорреляция наиболее высокая.
Если максимальный коэффициент получился для автокорреляции первого порядка, то это значит, что данный ряд не содержит каких-либо тенденций и зависимостей.
А если этот коэффициент максимален для 7-го порядка, это значит, что ряд содержит циклические колебания с периодичностью в 7 дней.
Расчет коэффициентов линейного тренда
Далее построим тренд для нашего ряда, чтобы впоследствие по нему сделать прогноз и опредеить как будет дальше вести себя выбранный показатель.
Существует несколько видов тренда, которыми можно описать метрику (линейный, экспоненциальный, логарифмический, полиномиальный и т.д.), мы будем использовать линейный т.к. он наиболее прост для построения и восприятия, но в это же время хорошо показывает динамику метрики.
Линейный тренд строится по уравнению вида y = ax + b, где a и b — коэффициенты, а x — порядковый номер дня (в примере это колонка D). Т.о. для расчета уравнения, нужно вычислить два коэффициента.
Сделать это можно так же стандартной функцией Excel — ЛИНЕЙН (LINEST), аргументами которой являются два массива данных — исследуемая метрика и порядковые номера дней.
Используя эту формулу как функцию массива (Ctrl + Shift + Enter), мы получаем два коэффициента, которые затем подставим в уравнение.
Построение линии тренда
Для построения линии тренда используем рассчитанные ранее коэффициенты — a и b. Единственным изменяемым параметром уравнения будет х — порядковый номер дня. Благодаря этому, линия тренда может быть продлена на несколько дней вперед, в нашем примере это 7 дней (столбец I). Таким образом мы получаем дальнейшую динамику изменения метрики.
Расчет коэффициентов сезонности
Следующий шаг для построения прогноза по линейному тренду — расчет коэффициентов сезонности.
Для этого нужно определить отклонение значений метрики от линии тренда (столбец K), а затем найти среднее значение этих отклонений в зависимости от дня цикла. Эти средние значения и есть искомые коэффициенты.
Наложение сезонности на тренд и построение прогноза
Чтобы завершить прогноз, необходимо «наложить» на тренд сезонность.
Для этого нужно умножить каждое значение линии тренда на коэффициент сезонности соответствующего дня (столбец L).
Это приведет график линии тренда к привычному виду — с регулярными колебаниями в зависимости от дня недели.
А т.к. ранее мы продлили тренд на 7 дней за пределы имеющихся данных, эта сезонность распространится и на спрогнозированную часть линии тренда предоставив таким образом прогноз метрики на ближайшие 7 дней.
Зачем нужно знать сезонность
Во-первых, чтобы точнее прогнозировать свою выручку и принимать на основании этих более точных прогнозов более правильные решения. Допустим, не планировать массовую закупку трафика на август, а потерпеть до сентября. Вопрос планирования выручки вообще очень важен, и пожалуй в любой компании его решают. Сезонность — один из способов сделать свои прогнозы значительно точнее.
Во-вторых, сезонность можно использовать себе во благо. Если вы знаете, что в декабре у вас будет много пользователей и средний доход на пользователя будет высок, то есть смысл увеличить его, предложив этим ‘горячим’ пользователям холодного месяца более выгодные скидки.
Интересный вопрос: можно ли бороться с сезонностью? Допустим, вы знаете, что в июле ARPDAU у вас будет самым низким за год. Нужно ли пытаться повысить его и бомбить пользователей заманчивыми июльскими скидками?
Наш опыт говорит, что бороться с сезонностью бесполезно: если ваш клиент уехал в летний отпуск, то он и будет пребывать в этом отпуске, что бы вы ни сделали. Лучше сосредоточиться на том, чтобы мультиплицировать сезонность «хороших» месяцев, увеличивая и без того хороший доход, чем пытаться поднять из мёртвых доход «плохих» месяцев.
Несколько важных тезисов
И ещё раз о выбросах. Прежде чем рассчитать сезонность, убедитесь, что ваши данные очищены от выбросов. Любой скачок в исходных данных (а скачки часто обусловлены простой технической ошибкой) может существенно исказить ваши данные.
Допустим, в один из дней июля доход составил в сто раз больше, чем обычно в среднем. Если вы не очистите ряд от выбросов, то у вас может получиться, что июль — самый выгодный месяц, и на основании этого вы можете неверно запланировать общую скидку. А уже потом вы выясните, что в таблице в этот день просто сбилась разрядность, и на самом деле данные как раз вполне себе средние.
К слову, в нашем файле очистка от выбросов, разумеется, предусмотрена.
Сезонность зависит от множества факторов:
- жанр приложения (представьте, как удивились представители туристических сервисов, прочитав выше, что летом снижается выручка);
- страна, язык, вероисповедание (например, в Исландии летом в отпуска уезжают почти все, и даже к врачу попасть нереально);
- погода (жаркий май может оказаться лучше холодного июня);
- любые другие факторы.
И именно поэтому упомянутые нами выводы (об удачной пятнице, о неудачном лете) не могут быть применены ко всем продуктам сразу — это лишь наш опыт, основанный на анализе игр.
Лучше рассчитать свою сезонность самим и делать выводы на основании только ваших расчётов. А мы лишь можем помочь вам — скачивайте файл, рассчитывайте сезонность и принимайте более эффективные решения!
Материал написан аналитиками компании devtodev Василием Сабировым и Верой Карповой.