Моделирование маркетинговых данных
Чистые объединённые таблицы
«Моделирование маркетинговых данных» — бесплатный урок Digital Marketing Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Digital Marketing Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Digital Marketing Academy содержит 4 уроков всего.
Зачем вообще моделировать
Необработанные таблицы коннекторов неаккуратны: в них непоследовательные названия столбцов, смешанные валюты, разная гранулярность и особенности отдельных платформ. Прямые запросы к таким таблицам приводят к неверным и невоспроизводимым числам.
Моделирование данных — это превращение необработанных строк в чистые, согласованные и готовые для бизнеса таблицы. Именно здесь ROAS, конверсия и выручка определяются один раз и правильно, чтобы все отчёты совпадали.
Звёздная схема
Основная аналитическая модель — звёздная схема: центральная таблица фактов с измеряемыми событиями, окружённая таблицами измерений, которые эти события описывают. Факты хранят числа — расходы, клики, выручку, — а измерения — контекст: кампанию, дату, канал и клиента.
Такая структура понятна маркетологам и эффективна для инструментов BI, которые объединяют одну таблицу фактов с несколькими измерениями, чтобы разбивать показатели по любому атрибуту.
dim_date
|
dim_channel -- fct_ad_spend -- dim_campaign
|
dim_account
fct_ad_spend (facts): impressions, clicks, cost, conversions
dims: who / what / when contextФакты и измерения
Таблица фактов длинная и аддитивная: одна строка на событие или на день и кампанию, с числовыми показателями, которые можно суммировать. Таблица измерений широкая и описательная: одна строка на кампанию или клиента, с атрибутами для фильтрации и группировки.
Проверка проста: если значение нужно просуммировать с помощью SUM, это факт; если по нему нужно выполнить GROUP BY, это измерение. Расходы — это факт, а название кампании — измерение.
fct_ad_spend dim_campaign
---------------- ----------------
date campaign_id (PK)
campaign_id (FK) campaign_name
cost <-SUM-> channel
clicks <-SUM-> objective
conversions start_dateГранулярность: первое решение
Гранулярность определяет, что представляет собой одна строка таблицы фактов. Объявить её заранее — самое важное решение при моделировании. Смешивание гранулярностей — например, строк за день с итогами за весь период — приводит к двойному подсчёту и искажает все последующие показатели.
Формулируйте гранулярность простыми словами: одна строка на кампанию в день. После этого каждый столбец должен быть достоверен на этом уровне, а каждая загрузка — ему соответствовать.
Declared grain: one row per campaign per day
-- enforce uniqueness on the grain
SELECT date, campaign_id, COUNT(*)
FROM fct_ad_spend
GROUP BY 1,2
HAVING COUNT(*) > 1; -- must return 0 rowsПромежуточные модели
До создания фактов и измерений создайте промежуточные модели: по одной на таблицу источника, с переименованием столбцов по стандарту, приведением типов и стандартизацией единиц измерения — например, центов в доллары и дат в UTC. Одна промежуточная модель соответствует одной необработанной таблице и ничему больше.
Промежуточный слой отвечает за очистку. Он изолирует особенности источников, поэтому последующим витринам не нужно знать, что Meta называет показатель расходами, а Google — стоимостью.
-- stg_google_ads__spend
SELECT
date AS spend_date,
campaign_id,
'google' AS channel,
cost_micros / 1000000 AS cost, -- micros -> dollars
clicks,
conversions
FROM raw.google_ads__campaign_stats;Объединение каналов
Каждая рекламная платформа формирует отчёты по-своему, но после промежуточной обработки у них появляется общая структура. Следующая модель объединяет их в один факт расходов по всем каналам — основу сводной отчётности.
Именно эта единая таблица делает возможным общий ROAS. Когда каждый канал приведён к одним и тем же столбцам, один запрос сразу суммирует расходы в Google, Meta и TikTok.
-- fct_ad_spend: union all channels
SELECT * FROM stg_google_ads__spend
UNION ALL
SELECT * FROM stg_meta_ads__spend
UNION ALL
SELECT * FROM stg_tiktok_ads__spend;
-- now: SUM(cost) GROUP BY channel worksСогласованные измерения
Для анализа по нескольким каналам измерения должны быть согласованы: одна общая таблица дат и одна общая таблица каналов, к которым каждая таблица фактов присоединяется одинаковым образом. Тогда выражение «выручка по месяцам и каналам» означает одно и то же, независимо от того, поступили ли данные из рекламы, электронной почты или интернета.
Именно согласованные измерения позволяют разместить расходы и выручку рядом на одном графике. Без них объединения смещаются, а итоги незаметно расходятся.
Conformed dims shared across facts:
dim_date -> joined by every fact on date
dim_channel -> 'google','meta','email','organic'
dim_campaign -> unified campaign keys
-> spend and revenue line up on the same axesАтрибуция в SQL
Атрибуция распределяет заслугу за конверсию между точками взаимодействия. Атрибуция по последнему клику проще всего: последний маркетинговый источник перед конверсией получает всю заслугу. Модели по первому клику, линейная и позиционная распределяют её иначе.
В хранилище атрибуция реализуется как модель, а не как закрытая логика платформы. Имея данные GA4 на уровне событий, Вы можете с помощью оконных функций расположить точки взаимодействия каждого пользователя по порядку и применить любое правило, а затем честно сравнить результаты разных моделей.
-- last non-direct click per conversion
WITH touches AS (
SELECT user_id, channel, event_time,
ROW_NUMBER() OVER (PARTITION BY user_id
ORDER BY event_time DESC) AS rn
FROM web_touchpoints
WHERE channel <> 'direct'
)
SELECT channel, COUNT(*) FROM touches WHERE rn=1
GROUP BY 1;Медленно изменяющиеся измерения
Атрибуты измерений меняются со временем: ответственный за бюджет кампании переводится на другую должность, а уровень клиента повышается. Медленно изменяющееся измерение типа 2 сохраняет историю, добавляя новую строку с датами действия вместо перезаписи существующей.
Это важно для точной отчётности на конкретный момент времени. Чтобы узнать, в каком сегменте находился клиент при конверсии, Вам нужна версия измерения, действовавшая тогда, а не сегодняшняя.
dim_customer (SCD Type 2)
cust_id tier valid_from valid_to is_current
101 free 2026-01-01 2026-04-01 false
101 pro 2026-04-01 9999-12-31 true
-- join on event_date BETWEEN valid_from AND valid_toПроверки и документация
Модели — это код, поэтому проверяйте их. Такие инструменты, как dbt, позволяют утверждать, что ключи уникальны и не пусты, значения каналов входят в допустимый набор, а связи между таблицами сохраняются.
Проверки обнаруживают изменения схемы и неверные объединения до того, как они попадут на панель. Вместе с автоматически создаваемой документацией и трассировкой происхождения данных они делают модель надёжной и понятной для новых участников, а не хрупкой закрытой системой.
# dbt schema test
models:
- name: fct_ad_spend
columns:
- name: campaign_id
tests: [not_null]
- name: channel
tests:
- accepted_values:
values: ['google','meta','tiktok']Витрины: последний слой
Верхний слой — это витрины: готовые для бизнеса таблицы, сформированные для конкретных аудиторий. Например, витрина marketing_performance уже объединяет расходы с выручкой и вычисляет ROAS для каждого канала и дня.
Инструменты BI читают данные только из витрин. Благодаря предварительному объединению и агрегированию на этом уровне панели остаются быстрыми и недорогими, а каждый аналитик использует одни и те же правильные определения.
-- marts.marketing_performance (1 row / day / channel)
SELECT s.spend_date, s.channel,
SUM(s.cost) AS spend,
SUM(r.revenue) AS revenue,
SAFE_DIVIDE(SUM(r.revenue), SUM(s.cost)) AS roas
FROM fct_ad_spend s
LEFT JOIN fct_revenue r USING (spend_date, channel)
GROUP BY 1,2;Быстрая проверка
Вы создаёте таблицу фактов для оценки эффективности рекламы и должны избежать двойного подсчёта. Что нужно объявить до определения любых столбцов?
Итоги
Моделирование превращает неструктурированные исходные таблицы в надёжные данные, готовые для бизнеса, с помощью слоёв: слой подготовки очищает и приводит к единому виду каждый источник, факты и согласованные измерения образуют звёздную схему, а витрины заранее объединяют всё необходимое для BI.
Сначала определите гранулярность, объединяйте каналы для сводных показателей, реализуйте атрибуцию и исторические данные типа 2 SCD в SQL и проверяйте каждую модель, чтобы неверные числа сразу выявлялись, а не попадали на панель мониторинга.
Часто задаваемые вопросы
Урок «Моделирование маркетинговых данных» бесплатный?
Да — полный текст урока «Моделирование маркетинговых данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Digital Marketing Academy, подпишись на CoddyKit PRO. Курс Digital Marketing Academy содержит 4 уроков всего.
Чему я научусь в уроке «Моделирование маркетинговых данных»?
Чистые объединённые таблицы Ты практикуешь Digital Marketing Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Digital Marketing Academy?
Предыдущий опыт не требуется. Digital Marketing Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Моделирование маркетинговых данных»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Digital Marketing Academy?
Да. Каждый урок Digital Marketing Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужно хранилище данных
- ETL и коннекторы
- Моделирование маркетинговых данных
- Дашборды, помогающие действовать