0Pricing
Digital Marketing Academy · Урок

Моделирование маркетинговых данных

Чистые объединённые таблицы

«Моделирование маркетинговых данных» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужно хранилище данных
  2. ETL и коннекторы
  3. Моделирование маркетинговых данных
  4. Дашборды, помогающие действовать
← Назад к Digital Marketing Academy