Digital Marketing Academy · Lekcja

Modelowanie danych marketingowych

Czyste, połączone tabele

Lekcja 3 z 413 kroki

Modelowanie danych marketingowych to bezpłatna lekcja Digital Marketing Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Digital Marketing Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Digital Marketing Academy zawiera 4 lekcji w sumie.

Po co w ogóle modelować dane

Surowe tabele konektorów są nieuporządkowane: mają niespójne nazwy kolumn, mieszane waluty, różny poziom szczegółowości i specyfikę poszczególnych platform. Bezpośrednie odpytywanie takich tabel prowadzi do nieprawidłowych i niemożliwych do odtworzenia wyników.

Modelowanie danych to dyscyplina polegająca na przekształcaniu surowych wierszy w czyste, spójne i gotowe do użycia przez biznes tabele. To tutaj ROAS, konwersja i przychód są definiowane raz i poprawnie, dzięki czemu każdy raport pokazuje te same wartości.

Schemat gwiazdy

Dominującym modelem analitycznym jest schemat gwiazdy: centralna tabela faktów zawierająca mierzalne zdarzenia, otoczona tabelami wymiarów, które je opisują. Fakty przechowują liczby (wydatki, kliknięcia, przychody), a wymiary — kontekst (kampania, data, kanał, klient).

Taki układ jest intuicyjny dla marketerów i wydajny dla narzędzi BI, które łączą jedną tabelę faktów z kilkoma wymiarami, aby analizować metryki według dowolnego atrybutu.

        dim_date
           |
dim_channel -- fct_ad_spend -- dim_campaign
           |
        dim_account

fct_ad_spend (facts): impressions, clicks, cost, conversions
dims: who / what / when context

Tabele faktów a wymiary

Tabela faktów jest długa i addytywna: zawiera jeden wiersz na zdarzenie lub na dzień i kampanię, wraz z liczbowymi miarami, które można sumować. Tabela wymiarów jest szeroka i opisowa: zawiera jeden wiersz na kampanię lub klienta oraz atrybuty, według których można filtrować i grupować dane.

Prosta zasada jest następująca: jeśli daną wartość można zsumować za pomocą SUM, jest faktem; jeśli można według niej grupować za pomocą GROUP BY, jest wymiarem. Wydatki są faktem, a nazwa kampanii — wymiarem.

fct_ad_spend         dim_campaign
----------------     ----------------
date                 campaign_id (PK)
campaign_id (FK)     campaign_name
cost      <-SUM->     channel
clicks    <-SUM->     objective
conversions          start_date

Ziarnistość: pierwsza decyzja

Ziarnistość określa, co reprezentuje jeden wiersz tabeli faktów. Zadeklarowanie jej w pierwszej kolejności jest najważniejszą decyzją w modelowaniu danych. Mieszanie poziomów szczegółowości — na przykład wierszy dziennych z sumami narastającymi — prowadzi do podwójnego zliczania i zniekształca każdą kolejną metrykę.

Należy opisać ziarnistość prostym językiem: jeden wiersz na kampanię na dzień. Każda kolumna musi być wtedy prawdziwa na tym poziomie szczegółowości, a każde ładowanie musi go respektować.

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

Modele stagingowe

Przed utworzeniem faktów i wymiarów należy zbudować modele stagingowe: po jednym dla każdej tabeli źródłowej, zmieniając nazwy kolumn na standardowe, rzutując typy i ujednolicając jednostki (centy na dolary, daty w UTC). Jeden model stagingowy odwzorowuje jedną tabelę surową — i nic więcej.

Staging jest warstwą oczyszczania danych. Izoluje specyfikę źródeł, dzięki czemu modele warstwy biznesowej nie muszą wiedzieć, że Meta nazywa tę wartość wydatkami, a Google — kosztem.

-- 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;

Łączenie kanałów

Każda platforma reklamowa raportuje dane w inny sposób, ale po przejściu przez staging mają one wspólny kształt. Następny model łączy je w jedną tabelę faktów dotyczących wydatków we wszystkich kanałach — podstawę zagregowanego raportowania.

To właśnie ta jedna tabela umożliwia obliczanie całkowitego ROAS. Ponieważ każdy kanał ma te same kolumny, jedno zapytanie może jednocześnie zsumować wydatki w Google, Meta i 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

Ujednolicone wymiary

W analizie obejmującej wiele kanałów wymiary muszą być ujednolicone: wspólne dim_date i dim_channel, z którymi każda tabela faktów łączy się w identyczny sposób. Wtedy „przychód według miesiąca i kanału” oznacza to samo niezależnie od tego, czy źródłem są reklamy, e-mail czy witryna.

Ujednolicone wymiary pozwalają umieścić wydatki i przychody obok siebie na jednym wykresie. Bez nich złączenia nie pasują do siebie, a sumy po cichu przestają być zgodne.

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

Atrybucja w SQL

Atrybucja przypisuje punktom styku zasługę za konwersję. Atrybucja ostatniego kliknięcia jest najprostsza: ostatnie źródło marketingowe przed konwersją otrzymuje pełną zasługę. Modele pierwszego kliknięcia, liniowy i pozycyjny rozdzielają tę zasługę w inny sposób.

W hurtowni danych atrybucję implementuje się jako model, a nie jako czarną skrzynkę platformy. Korzystając z danych o zdarzeniach GA4, można uporządkować punkty styku dla każdego użytkownika za pomocą funkcji okienkowych, zastosować dowolną regułę, a następnie rzetelnie porównać wyniki różnych modeli.

-- 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;

Wolno zmieniające się wymiary

Atrybuty wymiarów zmieniają się z czasem: zmienia się osoba odpowiedzialna za budżet kampanii, a poziom klienta zostaje podniesiony. Wolno zmieniający się wymiar typu 2 zachowuje historię, dodając nowy wiersz z datami obowiązywania zamiast nadpisywać poprzedni.

Ma to znaczenie dla poprawnego raportowania w określonym momencie. Aby wiedzieć, w jakim segmencie znajdował się klient w chwili konwersji, potrzebna jest wersja wymiaru obowiązująca w tamtym czasie, a nie wersja dzisiejsza.

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

Testowanie i dokumentacja

Modele są kodem, dlatego należy je testować. Narzędzia takie jak dbt pozwalają sprawdzać, czy klucze są unikatowe i niepuste, czy wartości kanałów należą do dozwolonego zbioru oraz czy relacje między tabelami są poprawne.

Testy wykrywają dryf schematu i nieprawidłowe złączenia, zanim problemy dotrą do pulpitu. W połączeniu z automatycznie generowaną dokumentacją i informacjami o pochodzeniu danych sprawiają, że model jest godny zaufania i łatwy do wdrożenia, zamiast pozostawać podatną na awarie czarną skrzynką.

# dbt schema test
models:
  - name: fct_ad_spend
    columns:
      - name: campaign_id
        tests: [not_null]
      - name: channel
        tests:
          - accepted_values:
              values: ['google','meta','tiktok']

Marty: warstwa końcowa

Najwyższą warstwę stanowią marty: gotowe dla biznesu tabele dostosowane do konkretnych odbiorców, takie jak mart marketing_performance, który już łączy wydatki z przychodami i oblicza ROAS dla każdego kanału i dnia.

Narzędzia BI odczytują dane wyłącznie z martów. Dzięki wcześniejszemu łączeniu i agregowaniu danych w tej warstwie pulpity pozostają szybkie i tanie, a każdy analityk korzysta z tych samych poprawnych definicji.

-- 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;

Szybkie sprawdzenie

Budują Państwo tabelę faktów dotyczących skuteczności reklam i muszą uniknąć podwójnego zliczania. Co należy zadeklarować jako najważniejszą rzecz przed zapisaniem jakichkolwiek kolumn?

Podsumowanie

Modelowanie przekształca nieuporządkowane surowe tabele w wiarygodne dane gotowe do wykorzystania w biznesie, korzystając z warstw: staging oczyszcza i ujednolica każde źródło, tabele faktów i ujednolicone wymiary tworzą schemat gwiazdy, a marty wykonują wstępne złączenia na potrzeby BI.

Najpierw należy określić ziarno danych, łączyć kanały za pomocą UNION, aby uzyskać zagregowane metryki, implementować atrybucję i historię SCD Type 2 w SQL oraz testować każdy model, tak aby błędne liczby były wyraźnie sygnalizowane, zamiast trafiać do dashboardu.

Bezpłatny start

Ucz się Digital Marketing Academy dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
63
Lekcje
239

Często zadawane pytania

Czy lekcja „Modelowanie danych marketingowych” jest bezpłatna?

Tak — pełny tekst „Modelowanie danych marketingowych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Digital Marketing Academy, przejdź na CoddyKit PRO. Kurs Digital Marketing Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Modelowanie danych marketingowych”?

Czyste, połączone tabele Ćwiczysz Digital Marketing Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Digital Marketing Academy?

Nie wymagamy żadnego doświadczenia. Digital Marketing Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Modelowanie danych marketingowych”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Digital Marketing Academy?

Tak. Każda lekcja Digital Marketing Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dlaczego hurtownia danych
  2. ETL i konektory
  3. Modelowanie danych marketingowych
  4. Pulpity nawigacyjne wspierające działania
← Powrót do Digital Marketing Academy