Cieľom projektu je navrhnúť a implementovať dimenzionálny model pre analýzu výkonnosti zamestnancov, správania zákazníkov a trendov v príjmoch spoločnosti na základe dostupných údajov z databázy Chinook. Tento model umožní sledovanie kľúčových metrík, ako sú celkové príjmy, počet zákazníkov a výkonnosť zamestnancov v rôznych časových obdobiach a geografických lokalitách.
Zdrojové dáta pochádzajú z databázy Chinook, ktorá simuluje reálne obchodné prostredie digitálnej hudobnej spoločnosti. Databáza obsahuje údaje o zákazníkoch, zamestnancoch, faktúrach, skladbách, albumoch a interpretoch. Tieto údaje sú vhodné na analýzu predaja, výkonnosti zamestnancov a správania zákazníkov.
Employee
- Obsahuje údaje o zamestnancoch spoločnosti.
- Hlavné stĺpce:
EmployeeId
,FirstName
,LastName
,Title
,HireDate
,ReportsTo
.
Customer
- Obsahuje informácie o zákazníkoch, ktorí si zakúpili produkty alebo služby.
- Hlavné stĺpce:
CustomerId
,FirstName
,LastName
,Country
,City
,SupportRepId
(odkaz na zamestnanca podpory).
Invoice
- Tabuľka faktúr obsahuje údaje o predaji produktov zákazníkom.
- Hlavné stĺpce:
InvoiceId
,CustomerId
,InvoiceDate
,BillingCountry
,Total
.
InvoiceLine
- Obsahuje detaily o jednotlivých položkách faktúry.
- Hlavné stĺpce:
InvoiceLineId
,InvoiceId
,TrackId
,UnitPrice
,Quantity
.
Track
- Obsahuje údaje o skladbách dostupných na predaj.
- Hlavné stĺpce:
TrackId
,Name
,AlbumId
,GenreId
,UnitPrice
.
Album
- Obsahuje údaje o albumoch, z ktorých pochádzajú jednotlivé skladby.
- Hlavné stĺpce:
AlbumId
,Title
,ArtistId
.
Artist
- Obsahuje údaje o interpretovi alebo skupine, ktorá nahrala albumy.
- Hlavné stĺpce:
ArtistId
,Name
.
Genre
- Obsahuje informácie o hudobných žánroch skladieb.
- Hlavné stĺpce:
GenreId
,Name
.
MediaType
- Obsahuje informácie o typoch médií, v ktorých sú skladby dostupné (napr. MP3, AAC).
- Hlavné stĺpce:
MediaTypeId
,Name
.
Playlist
- Obsahuje informácie o playlistoch, ktoré boli vytvorené zákazníkmi.
- Hlavné stĺpce:
PlaylistId
,Name
.
PlaylistTrack
- Obsahuje záznamy o skladbách priradených k playlistom.
- Hlavné stĺpce:
PlaylistId
,TrackId
.
Obrázok 1 Entitno-relačná schéma Chinook
Navrhnutý bol hviezdicový model (star schema) pre efektívnu analýzu, kde centrálny bod predstavuje faktová tabuľka Sales_Fact
, ktorá je prepojená s nasledujúcimi dimenziami:
Obsahuje hlavné transakčné údaje týkajúce sa predajov.
Sales_FactId
- Unikátny identifikátor riadku faktúryUnitPrice
- Cena za jednotkuQuantity
- Počet zakúpených položiekInvoiceId
- Identifikátor faktúryTrackId
- Identifikátor predanej skladbyDateId
- Identifikátor dátumu predajaEmployeeId
- Identifikátor zamestnanca, ktorý uskutočnil predajGenreId
- Identifikátor žánru skladbyPlaylistId
- Identifikátor playlistuArtistId
- Identifikátor umelcaAlbumId
- Identifikátor albumuInvoiceId
- Identifikátor faktúry v dimenzii
-
Employee_Dim (Zamestnanci)
- Obsahuje informácie o zamestnancoch vrátane ich osobných údajov a pracovných pozícií.
- Polia:
EmployeeId
,FirstName
,LastName
,Title
,BirthDate
,HireDate
,Address
,City
,State
,Country
,Phone
,Email
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
-
Customer_Dim (Zákazníci)
- Obsahuje informácie o zákazníkoch vrátane ich kontaktných údajov a polohy.
- Polia:
CustomerId
,FirstName
,LastName
,Company
,Address
,City
,State
,Country
,PostalCode
,Phone
,Fax
,Email
,SupportRepId
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
-
Track_Dim (Skladby)
- Obsahuje podrobnosti o predávaných skladbách.
- Polia:
TrackId
,Name
,Composer
,Milliseconds
,Bytes
,UnitPrice
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
-
Album_Dim (Albumy)
- Obsahuje podrobnosti o albumoch.
- Polia:
AlbumId
,Title
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
-
Artist_Dim (Umelci)
- Obsahuje podrobnosti o umelcoch.
- Polia:
ArtistId
,Name
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
-
Genre_Dim (Žánre)
- Obsahuje informácie o hudobných žánroch.
- Polia:
GenreId
,Name
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
-
MediaType_Dim (Typy médií)
- Obsahuje informácie o typoch médií (napr. MP3, WAV, AAC).
- Polia:
MediaTypeId
,Name
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
-
Invoice_Dim (Faktúry)
- Obsahuje informácie o faktúrach vrátane dátumu a miesta vystavenia.
- Polia:
InvoiceId
,CustomerId
,InvoiceDate
,BillingAddress
,BillingCity
,BillingState
,BillingCountry
,BillingPostalCode
,Total
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
-
Playlist_Dim (Playlisty)
- Obsahuje informácie o playlistoch.
- Polia:
PlaylistId
,Name
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
-
Date_Dim (Dátumy)
- Obsahuje informácie o dátumoch.
- Polia:
Dim_DateId
,Date
,Day
,Month
,Year
,Weekday
,Day_Week
,Week
,MonthString
- Typ SCD: SCD Typ 1 (Zmeny sa prepíšu)
Obrázok 2 Schéma hviezdy pre Chinook
ETL proces pozostával z troch hlavných fáz: extrahovanie
(Extract), transformácia
(Transform) a načítanie
(Load). Tento proces bol implementovaný v Snowflake s cieľom pripraviť zdrojové dáta zo staging vrstvy do viacdimenzionálneho modelu vhodného na analýzu a vizualizáciu.
Dáta zo zdrojového datasetu (formát .csv
) boli najprv nahraté do Snowflake prostredníctvom interného stage úložiska s názvom my_stage
. Stage v Snowflake slúži ako dočasné úložisko na import alebo export dát. Vytvorenie stage bolo zabezpečené príkazom:
CREATE OR REPLACE STAGE my_stage;
Do stage boli následne nahraté súbory obsahujúce údaje o umelcoch, albumoch, skladbách, zákazníkoch, zamestnancoch a faktúrach. Dáta boli importované do staging tabuliek pomocou príkazu COPY INTO
. Pre každú tabuľku sa použil podobný príkaz:
COPY INTO Artist_staging
FROM @my_stage/artist.csv
FILE_FORMAT = (TYPE = 'CSV' FIELD_OPTIONALLY_ENCLOSED_BY = '"' SKIP_HEADER = 1);
V prípade nekonzistentných záznamov bol použitý parameter ON_ERROR = 'CONTINUE'
, ktorý zabezpečil pokračovanie procesu bez prerušenia pri chybách.
V tejto fáze boli dáta zo staging tabuliek vyčistené, transformované a obohatené. Hlavným cieľom bolo pripraviť dimenzie a faktovú tabuľku, ktoré umožnia jednoduchú a efektívnu analýzu.
CREATE TABLE Artist_Dim AS
SELECT
ar.ArtistId,
ar.Name
FROM Artist_staging ar;
CREATE TABLE Album_Dim AS
SELECT
a.AlbumId,
a.Title,
a.ArtistId
FROM Album_staging a;
CREATE TABLE MediaType_Dim AS
SELECT
m.MediaTypeId,
m.Name
FROM MediaType_staging m;
CREATE TABLE Genre_Dim AS
SELECT
g.GenreId,
g.Name
FROM Genre_staging g;
CREATE TABLE Track_Dim AS
SELECT
t.TrackId,
t.Name,
t.Composer,
t.Milliseconds,
t.Bytes,
t.UnitPrice,
t.AlbumId,
t.MediaTypeId,
t.GenreId
FROM Track_staging t;
CREATE TABLE Playlist_Dim AS
SELECT
p.PlaylistId,
p.Name
FROM Playlist_staging p;
CREATE TABLE Employee_Dim AS
SELECT
e.EmployeeId,
e.FirstName,
e.LastName,
e.Title,
e.BirthDate,
e.HireDate,
e.Address,
e.City,
e.State,
e.Country,
e.Phone,
e.Email
FROM Employee_staging e;
CREATE TABLE Customer_Dim AS
SELECT
c.CustomerId,
c.FirstName,
c.LastName,
c.Company,
c.Address,
c.City,
c.State,
c.Country,
c.PostalCode,
c.Phone,
c.Fax,
c.Email,
c.SupportRepId
FROM Customer_staging c;
CREATE TABLE Date_Dim AS
SELECT DISTINCT
ROW_NUMBER() OVER (ORDER BY CAST(i.InvoiceDate AS DATE)) AS Dim_DateId,
CAST(i.InvoiceDate AS DATE) AS Date,
DATE_PART('day', i.InvoiceDate) AS Day,
DATE_PART('month', i.InvoiceDate) AS Month,
DATE_PART('year', i.InvoiceDate) AS Year,
CASE
WHEN DATE_PART('dow', i.InvoiceDate) = 0 THEN 'Sunday'
WHEN DATE_PART('dow', i.InvoiceDate) = 1 THEN 'Monday'
WHEN DATE_PART('dow', i.InvoiceDate) = 2 THEN 'Tuesday'
WHEN DATE_PART('dow', i.InvoiceDate) = 3 THEN 'Wednesday'
WHEN DATE_PART('dow', i.InvoiceDate) = 4 THEN 'Thursday'
WHEN DATE_PART('dow', i.InvoiceDate) = 5 THEN 'Friday'
WHEN DATE_PART('dow', i.InvoiceDate) = 6 THEN 'Saturday'
END AS Weekday,
DATE_PART('dow', i.InvoiceDate) + 1 AS Day_Week,
EXTRACT(WEEK FROM DATE_TRUNC('WEEK', i.InvoiceDate + INTERVAL '1 DAY')) AS Week,
CASE
WHEN DATE_PART('month', i.InvoiceDate) = 1 THEN 'January'
WHEN DATE_PART('month', i.InvoiceDate) = 2 THEN 'February'
WHEN DATE_PART('month', i.InvoiceDate) = 3 THEN 'March'
WHEN DATE_PART('month', i.InvoiceDate) = 4 THEN 'April'
WHEN DATE_PART('month', i.InvoiceDate) = 5 THEN 'May'
WHEN DATE_PART('month', i.InvoiceDate) = 6 THEN 'June'
WHEN DATE_PART('month', i.InvoiceDate) = 7 THEN 'July'
WHEN DATE_PART('month', i.InvoiceDate) = 8 THEN 'August'
WHEN DATE_PART('month', i.InvoiceDate) = 9 THEN 'September'
WHEN DATE_PART('month', i.InvoiceDate) = 10 THEN 'October'
WHEN DATE_PART('month', i.InvoiceDate) = 11 THEN 'November'
WHEN DATE_PART('month', i.InvoiceDate) = 12 THEN 'December'
END AS MonthString
FROM Invoice_staging i;
Po úspešnom vytvorení dimenzií a faktovej tabuľky boli dáta nahraté do finálnej štruktúry. Na záver boli staging tabuľky odstránené, aby sa optimalizovalo využitie úložiska:
DROP TABLE IF EXISTS Artist_staging;
DROP TABLE IF EXISTS Album_staging;
DROP TABLE IF EXISTS MediaType_staging;
DROP TABLE IF EXISTS Genre_staging;
DROP TABLE IF EXISTS Track_staging;
DROP TABLE IF EXISTS Playlist_staging;
DROP TABLE IF EXISTS PlaylistTrack_staging;
DROP TABLE IF EXISTS Employee_staging;
DROP TABLE IF EXISTS Customer_staging;
DROP TABLE IF EXISTS Invoice_staging;
DROP TABLE IF EXISTS InvoiceLine_staging;
ETL proces v Snowflake umožnil spracovanie pôvodných dát z .csv
formátu do viacdimenzionálneho modelu typu hviezda. Tento proces zahŕňal čistenie, obohacovanie a reorganizáciu údajov. Výsledný model umožňuje analýzu predajov, výkonnosti zamestnancov a správania zákazníkov, pričom poskytuje základ pre vizualizácie a reporty.
Navrhnuté vizualizácie odpovedajú na dôležité otázky a odhaľujú kľúčové metriky. Zobrazená vizualizácia dát je nižšie.
Obrázok 3 Vizualizácia dát v Snowflake
Táto vizualizácia zobrazuje celkové príjmy generované jednotlivými zamestnancami. Pomáha identifikovať najvýkonnejších zamestnancov.
SELECT
de.EmployeeId,
de.FirstName || ' ' || de.LastName AS EmployeeName,
SUM(sf.UnitPrice * sf.Quantity) AS TotalRevenue
FROM Sales_Fact sf
JOIN Employee_Dim de ON sf.EmployeeId = de.EmployeeId
GROUP BY de.EmployeeId, de.FirstName, de.LastName
ORDER BY TotalRevenue DESC;
Táto vizualizácia zobrazuje celkové výnosy generované jednotlivými albumami. Pomáha identifikovať najpredávanejšie albumy.
SELECT
a.AlbumId,
a.Title AS AlbumTitle,
SUM(sf.UnitPrice * sf.Quantity) AS TotalRevenue
FROM Sales_Fact sf
JOIN Album_Dim a ON sf.AlbumId = a.AlbumId
GROUP BY a.AlbumId, a.Title
ORDER BY TotalRevenue DESC;
Táto vizualizácia zobrazuje trend predaja v čase. Pomáha identifikovať sezónne trendy a výkyvy v predaji.
SELECT
dd.Date,
de.EmployeeId,
de.FirstName || ' ' || de.LastName AS EmployeeName,
SUM(sf.UnitPrice * sf.Quantity) AS TotalRevenue
FROM Sales_Fact sf
JOIN Date_Dim dd ON sf.DateId = dd.DateId
JOIN Employee_Dim de ON sf.EmployeeId = de.EmployeeId
GROUP BY dd.Date, de.EmployeeId, de.FirstName, de.LastName
ORDER BY dd.Date, de.EmployeeId;
Táto vizualizácia zobrazuje krajiny s najvyššími príjmami z predaja. Pomáha identifikovať najvýnosnejšie trhy.
SELECT
dc.Country,
SUM(sf.UnitPrice * sf.Quantity) AS TotalRevenue
FROM Sales_Fact sf
JOIN Customer_Dim dc ON sf.CustomerId = dc.CustomerId
GROUP BY dc.Country
ORDER BY TotalRevenue DESC;
Táto vizualizácia zobrazuje počet predaných skladieb podľa umelcov. Pomáha identifikovať najpopulárnejších umelcov.
SELECT
da.ArtistId,
da.Name AS ArtistName,
SUM(sf.Quantity) AS TotalSold
FROM Sales_Fact sf
JOIN Artist_Dim da ON sf.ArtistId = da.ArtistId
GROUP BY da.ArtistId, da.Name
ORDER BY TotalSold DESC;
Autor: Michal Bogdány