Русский
Русский
English
Статистика
Реклама

Прогноз нестационарногоряда,или как жить дата-сайентисту в 2020 году

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

Мы, в Dentsu Aegis Network, в том числе прогнозируем изменения в поведении людей в части потребления видеоконтента, это необходимо для эффективного размещения рекламы наших клиентов в разных медиа. О том, как мы прогнозируем телесмотрение и насколько хорошо у нас это получается в реалиях динамично меняющегося 2020 года, и пойдёт речь в этой статье.

Задача

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

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

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

Давайте рассмотрим нашу модель прогнозирования более подробно.

Для начала нам придётся ввести несколько специфических терминов из области медиа и рекламного рынка:

Целевая аудитория этоаудитория потенциальных потребителей,интересующая рекламодателя иимеющаяопределенныехарактеристики (как правило,речь идетосоциально-демографических характеристиках, таких как пол, возраст,доход ит.д., но также могут использоватьсяпсихографическиеи поведенческие характеристики, такие как приверженность брендам или потребление каких-либо продуктов).

Баинговаяаудиторияэтоаудитория,определяемаятелевизионнымканалом какее целеваяаудитория.То естьканал определяет свою ЦАи показывает контент, соответствующий этой ЦА.

TVRрекламного блокарейтинг рекламного блока, который вычисляется как отношениесуммыпосмотревшихтелезрителейиз определеннойЦАксумметелезрителейвсейЦА.

Affinityрекламного блокаотношения рейтинга рекламного блока,рассчитанногодля ЦА бренда, к рейтингублока,рассчитанногодлябаинговойаудитории канала(TVRЦА /TVR баинговойаудитории).

Данные

Для построения прогностической модели на входе мы имели следующие данные.

Исторические данные о телепросмотре. Мы покупаем данные компании Mediascope, которая измеряет аудиторию ТВ по всей России. Основа измерений панельное исследование. Данные о телепросмотре собираются среди респондентов, у которых установлены пиплметры (устройства, которые фиксируют информацию о просмотре ТВ) в специальный софт компании. В этих данных содержится поминутная информация о том, какой респондент, что и когда смотрел. Также есть описание самого респондента: пол, возраст, семейное положение, уровень дохода и т.д.

Сетка вещания стелевизионнымипередачами и рекламными блоками.Компания Национальный Рекламный Альянс (НРА) как основной продавец телерекламы предоставляет информацию об исторической и будущейтелевизионных сетках вещания. Основные данные, используемые в модели:дата и время начала и окончания передачи\рекламного блока,номер рекламного блока в передаче,название исловесное описание и категория передачи (новости, сериал ит.д.). Раз в неделю приходит уточнение сетки на следующую неделю.

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

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

В 2020 году измениласьгеография измерения телесмотрения в России. Если раньшемониторилосьтелесмотрение только в городах с населением от 100 тысяч человек(100+), то начиная с 2020 годав исследование былидобавлены и малые города, и населённые пункты с населением менее 100 тысяч человек(100-). Сложность заключается в том, что с точки зрения генеральной совокупностив небольших населенных пунктах (население менее 100 тысяч человек) проживает почти столько же россиян, что и в крупных городах (население более 100 тысяч человек). При этомпанелистовв небольших населенных пунктах в силу молодости панели пока меньше, чем в крупных городах.Этоприводитк тому, что веса респондентов из малых городов в среднембольше, чем у респондентов из крупных городов, что в свою очередь приводитк изменению распределенияTVR.

Сильное отклонение аффинитина телеканалах с небольшой аудиторией. На таких малых каналах среднийбаинговыйTVRблока составляет 0.10. С точки зрения бизнес-смысла нет особой разницы между целевымTVR0.05 и 0.15 (всё равно очень мало), ноаффинитиполучится 0.05 / 0.10 = 50% или 0.15 / 0.10 = 150%.То естьразница как будто бы огромная.

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

Корректировка сетки вещания в течение дня.

Много данных

Описание модели:

Так как мы за простоту, то самого начала было решено не использовать громоздкие решения, поэтому выбрали следующий стэк: MS SQL+Python+LightGBM(CPU) и всё, нет причин усложнять.

Данныемы решилипредставить в следующем виде: берем толькорекламныеблоки и считаем по нимTVR, отбрасывая все остальное,нерекламное, время. Сделано это по той причине, чтотелесмотрениево время передачи сильноотличается оттелесмотренияво время рекламы. Поэтому в использованиителесмотрениявне рекламного блока для нашей задачи нет необходимости (без дополнительных расчетов).

Поведение телезрителей постоянно меняется, также панель измерения телесмотрения компанииMediascope изменяется два раза в год.После проведения отдельных исследований решили ограничить горизонт обучения последними 6 месяцами. Конечно, для расчета годовых сезонок используются данные за 4 года, но для сезонки достаточно использовать месячныеагрегаты, которые рассчитываются быстро,занимают мало места (12*4*[количество аудиторий=130]*[количествоТВ-каналов=24]= 150тыс. точек) и требуют пересчета только раз вмесяц.

Витоге используемые данные здорово уменьшились. Так как в день в среднем 40 блоков на канал, вместо поминутноготелесмотрения(60мин*24ч=1440),то естьв 36 раз меньше.Плюс, горизонт обучения всего 6 месяцев (не год и не два).

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

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

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

Мынагенерилимножество идей. Что-то сработало, что-то было мимо. Вот основные фичи, которые так и не оправдали наших надежд:

Избавление от корреляциифичей:PCAи ручноеизбавление.

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

Anomalydetection. Удаление аномально высоких\низких TVR во временном ряде.Также пробовалиisolationforest-тоже не помог.

Сезонкидля каждогоТВ-канала.

Финальный наборфичей:
Общиефичи: длительность передачи, длительность блока, описание передачи,ТВ-канал, день недели, день месяца, время с точностьюдо30 минут, как давно существует передача (например, Поле чудес), праздничные дни. Здесь много категориальных переменных, поэтому использовалидля нихобычные техники обработки.

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

1. Получение тренда

a. Сначаластроим линейную регрессию сdummyмесяцев+ фича с количеством уникальныхреспондентов100-, которые были заявлены в базе в течение соответствующего месяца, помноженная на dummy месяца.

b. Из полученной модели выделяем все остатки получаем ряд, в которомнет сезонки.

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

2. Используя полученный в п.1 тренд +dummyмесяцев + фича с количеством уникальныхреспондентов100- (которые были заявлены в базе в течение соответствующего месяца), помноженная наdummy месяца, строим линейную регрессию.

3. Коэффициенты приdummyмесяцев используем в качестве значений сезонки: собираем в единый ряд. Получаем чистую сезонку, без100-, и используем как единую фичу.

4. Используя тренд из п.3 + чистую сезонку + количествореспондентов100-, помноженное на чистую сезонку, строим линейную регрессию. Получаем веса регрессоров.

5. Конечный ряд сезонки (прогнозный!) равен сумме: чистая сезонка + количествореспондентов 100-, помноженное на чистую сезонку и взятое с весами из линейной регрессии.

COVID-19.

1. Беремпонедельное отношениесуммывременителепросмотра блоков респондентамик количеству блоков.

2. Разбиваемполученныйвременной ряд на стадии самоизоляции:

a. 2020-03-05 - первое заражение России

b. 2020-03-25 - обращение президента

c. 2020-03-28 как будто выходные

d. 2020-04-06 - строго сидим дома

e. 2020-06-01 - снятие самоизоляции для некоторых категорий граждан

f. 2020-06-14 - полное снятие ограничений

3. Прогнозируемвременной ряд из п.1линейной регрессией от одногорегрессора- стадиисамоизоляции.Этот прогноз используем как конечную фичу.

Такой подходдал нам следующее:

Здорово описал уже произошедшие изменения,

Но ине позволил модели сильнооверфититьсяна этих знаниях,

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

Да, в этих данных сидит много лишней информации (например, сезонка). В идеале нужно избавиться отэтогошума, но пока дажетакойподход здорово уточнил модель. Можете сравнить качество до и после в boxplot (ниже) от 2 и 4 сентября.

Клиппированиепоаффинити.

1. Берем 95 квантильисторическогофактическогоаффинити (целевой аудитории к баинговой)для каждого каналав каждой аудитории. Считаем, чтоэто максимальныезначенияаффинити.

2. Производим обратное преобразование:фиксируяпрогнозныйTVRблокадлябаинговойаудиториии максимальныйаффинитиканала (из п.1),рассчитываем максимально возможныйTVR блока целевой аудитории.

3. Если прогнозныйTVRблокавыше максимально возможного в этой аудитории, то приравнять максимально возможному.

ЗаменаTVRнаlog(TVR+1). В качестве целевой прогнозируем неTVR, а его логарифм.Послепостроения модели иполучения прогнозныхзначенийобратно переводимвабсолютное значение.

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

https://download.dentsuaegis.ru/index.php/s/emtvlKKdPkUCdvn

Техническиесложностии их решение

Для нас как MachineLearningEngineerотдельнымчеледжембыло написать код на уровнеdeveloper. БудучиMLEngineerот насизначальноожидается знание основ ООП иCleanCodeParadigm, однако даже на уровнеразработчикабывает качественный код и не очень.Мы решили отнестись серьезно к написанию кода и часто консультировались с нашими архитекторами иData Engineerами. Хотелось бы отдельно поделиться сдвумярешениями, которыездорово ускорили работу кода:кастомнаязапись данных наMS SQL serverи непрерывная работа скрипта.

Во-первых, запись данныхнаMS SQL. Методы записиреализованы в большом количествебиблиотек. Один лишьSQLAlchemy имеет три варианта записи. Однаков результате тестирования,оказалось, что все они работают очень медленнои здорово тормозят весь код(возможно, это только сMS SQL так?).Но главное:заливка падала сdeadlockом, когда пыталисьлить данные в конечную таблицуасинхроннымитрэдами.Как следствие, пришлось по крупицам узнавать хитрости и в итоге написатьсобственныйметод записи, который использует классическуюлибуpyodbc.Метод состоит из треххитростей:

1. Создаемвременнуютаблицубез индексов (это важно) ильемтудаданные параллельнымитрэдами.Так как нет индексов иconstraints, параллельное записывание не падаетс ошибкойraceconditionилиdeadlock.

2. Запись реализовать не построчно, абакетами. Оказалось, что есть существенная разница в скорости между этими двумя конструкциями:

a. Insert into table(col1,col2) values (1,1);

Insert into table(col1,col2) values (1,2);

b. Insert into table(col1,col2) values

(1,1),

(1,2);

Оказывается,варианта) пишет построчнокак2 отдельныетранзакции, тогда как вариант б) выполняется как одна транзакция,бакетами. Но таких строк может быть до 1000 вбакете.

3. Для заливки\обновленияданных из временной таблицы в конечную использоватьmergetablesссоответствующимииндексами вtargettable (ускорение за счет использования индексов вtargettable).

В итогескорость записиувеличивается во много раз.От 2 до 10 раз - смотря с каким методом записи сравнивать.Можетепотеститьсами, но чувствую, у вас здесь будет много сомнений - готов обсудить вкомментах.И повторюсь, что, скорее всего, это работает эффективнее только сMS SQL.

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

  1. Обучаем модель раз в день, пересчитав всефичи, пишем\перезаписываемпрогноз на два месяца вперед. Далее храним (точнее, не выгружаем) модель и ее окружение в памяти.

  2. Раз в час проверяем наличие новых блоков и строим по ним прогнозпообученной моделиизп.1.

Контролькачества модели

Телесмотрение меняется ежедневно и зависит от множества факторов, в том числе и ненаблюдаемых в данных. Поэтому требуется постоянно держать руку на пульсе. То есть нужна отчетность на ежедневной основе. Для этого мы раз в неделю сохраняемпрогнозына два месяца впередв отдельную таблицу. Далее ежедневно подгружаем фактическоетелесмотрениеи считаем ошибку.Отчетность смотрим вtableau.Данные и отчет, конечно, собираются автоматически, но на результатысмотримпокаглазами, до автоматизации анализа ошибок руки не дошли.В качестве метрики ошибки выбрали формулуavg[(factpredict) / (fact+predict+epsilon)].Затем смотримboxplotи просто почасовое среднееэтой ошибки.Причин такогоподходамножество. Вотосновные:

РаспределенияTVRсильно отличаются в каждом канале.Поэтому метрики типаR_squaredне подходят там используется единая дисперсия.

Внутриканала выходные\рабочиеи день\ночьимеют сильноразное распределение

Гетероскедастичностьпрогноза- увеличение дисперсии ошибки с увеличением значенияTVR.

Желание отличатьперепрогнозотнедопрогнозабезопаснеенедопрогнозить, чемперепрогнозить.

Эволюция развития качества прогноза.

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

Почасовая проверка качества:

Направления развитиямодели

Особые выпуски (финалы,особыечемпионатыит.д.).

КонкуренцияТВ-каналов: если на одном из ТВ-каналов транслируетсяпопулярная программа, то остальные ТВ-каналы проседают (в разной степени).

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

Ночное время- см.предыдущийпункт.

Источник: habr.com
К списку статей
Опубликовано: 01.10.2020 12:15:50
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Блог компании dentsu aegis network

Data engineering

Data mining

Машинное обучение

Tv

Covid-19

Нестандартные решения

Нестационарный процесс

Маркетинг

Реклама

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru