Mám za sebou tři měsíce intenzivního vzdělávání v rámci Digitální akademie s Czechitas. Na jednu stranu to uteklo rychle, na druhou mám pocit, že lidi, které jsem během té doby poznala, znám už léta.

Celý kurz prý čítal 300 hodin výuky. Z mého pohledu to však byl spíše plus mínus 24/7 krát tři měsíce. Někdy se totiž nedařilo ani usnout (osvědčilo se šumění větru před usnutím) a když ano, tak se mi zdálo o SQL, for cyklech nebo regresi. Ale v nouzi najdeš přítele, takže jsme se s holkama semkly, párkrát se společně opily, vyrazily na hory a věřím, že i do budoucna si budeme pomáhat a sdílet svoje životní eskapády. Lektoři na nás byli hodní, ve firmách nás na stáži nadšeně vítali.

Už jsem skoro zapomněla jak jsem byla zvyklá trávit volný čas, běžecké boty zaprášené, fyzička mizerná, spoustu kamarádů jsem viděla naposledy před Vánoci. Bez notebooku na zádech mám pocit, že mi něco chybí.

Když se ohlédnu, můžu říct, že to byla slušná lekce, ale splnila svůj účel. Šla jsem do toho, protože jsem nevěděla, co se sebou, potřebovala jsem nakopnout. Digitální akademie mě tedy opravdu nakopla. Chvílemi to i celkem bolelo. Někdy i čtyřikrát týdně 3-8 hodin workshopů, lekcí, informací je v kombinaci s prací na plný úvazek slušná zátěž. Ale jinak bych to nechtěla. Jedině takhle se člověk do toho pořádně ponoří, zatne zuby a ví, že to bude trvat jen tři měsíce.

A v čem mě nakopla? Zjistila jsem, co jsem schopna zvládnout, že mi vědomosti i pět let po škole pořád dobře lezou do hlavy, že mě stále stejně baví se učit. Že svět IT mi není tak cizí, jak jsem myslela, a že se v něm můžu cítit dobře. Získala jsem nadhled na svými znalostmi a viděla tak, že je můžu uplatnit i jinde a jinak, než jsem si dovedla představit.

Takže teď jsem na novém začátku. Dala jsem výpověď v práci s dobrým platem, smlouvou na dobu neurčitou, pěti týdny dovolené a píchačkama. Symbolicky k tomu došlo den před ukončením Digitální akademie.

Věřím tomu, že člověk má v životě vyměřený čas, který je jen jeden. Proto považuji za důležité neustále se zamýšlet nad tím, jestli to, čím ten čas trávím, mi dává smysl. Nepochybuji o tom, že někdy nás věci nebaví, nebo trvají déle, než bychom si přáli, ale nakonec to vždycky musí dávat smysl vzhledem k času, který v životě máme. Proto jsem došla k tomu, že jistoty, které mi současná práce nabízí nevyvažují frustraci, kterou ve mě vyvolává a množství času, který v ní trávím.

Tak to vlastně celé začalo, když mi kamarádka v Brně jednou řekla: “Život mám jen jeden a je ho škoda na to, abych ho trávila něčím, co mě nebaví, aby mi vlastně protekl mezi prsty.”

Uvidíme, kam to celé povede, v tuhle chvíli jsem si hodně jistá tím, že to bude zábava.

Z veřejné správy do IT

V duchu hesla „Každý svého štěstí strůjcem“ jsem se po pěti letech ve veřejné správě rozhodla vzít to za jiný konec. Nejdřív jsem chtěla začít podnikat, ale nevymyslela jsem, v čem. Pak se objevila možnost přihlásit se Digitální akademie s Czechitas. Vůbec jsem nevěděla, co čekat, ale přišlo mi to jako dobrý způsob jak zjistit, co ve mě je, když stejně nevím, za jaký konec tu svojí kariéru vlastně chci vzít.
A tak se mi postupně otevřely brány informačních technologií, datové analýzy a byznysu.
Všechno začíná závěrečným projektem, kterým jsem Digitální akademii uzavřela. O svoje další projekty, úspěchy a neúspěchy se podělím v dalších článcích.

Z veřejné správy do IT

Závěrečný projekt Digitální akademie s Czechitas (za podpory Google.org)

Analýza obsahu reklamních kampaní na facebooku se zaměřením na jednotlivé skupiny uživatelů

Mentor: Jan Černý, Databreakers s.r.o

V rámci svého závěrečného projektu Digitální akademie jsem se chtěla zaměřit na data ze sociálních sítí, protože jde o v dnešní době klíčové médium, které ovlivňuje myšlení i konání obrovského množství lidí. Díky stáži a menotringu ve firmě Databreakers s.r.o jsem měla možnost dozvědět se hodně o tom, jak reklama na Facebooku funguje a také získat data z reklamy na Facebooku pro tuto analýzu.

Na základě těchto dat bylo mým cílem zjistit, na jaké skupiny uživatelů Facebooku reklama úspěšně působí. To jsem analyzovala na tzv. breakdownech – skupinách uživatelů dle pohlaví, věku, regionu či použitého zařízení.

Výsledek analýzy může být využit jako nástroj pro klienty, kteří budou moci díky interaktivním reportům vidět, jak jejich kampaň působí na které skupiny uživatelů. Protože Facebook Business Manager nenabízí v oblasti cílení mnoho informací v nepříliš uživatelsky přátelském prostředí, mohou data z Facebook Ads Insights API přinést lepší využití.

Pro provádění analýzy mi bylo umožněno využít prostor na serveru Databreakers pro optimalizaci procesů. Následně jsem data zpracovávala pomocí MySQL a k vizualizaci jsem využila PowerBI.

Postup

V první řadě bylo třeba se zorientovat ve věcném obsahu analýzy. K tomu mi pomohla vstřícná spolupráce mentora Honzy Černého a dalších kolegů z Databreakers s.r.o, kteří mi poskytli náhled do toho, jak kampaně na Facebooku fungují, jaká je jejich struktura, jaké metriky pro vyhodnocování jsou klíčové, apod.

Postup realizace projektu naznačuje schéma níže. Jednotlivé kroky jsou poslány níže v textu. Nejdříve jsem analýzu provedla na menším vzorku dat. To bylo praktické na přípravu a kontrolu jednotlivých dotazů. Bohužel ale na takovém vzorku nebylo možné provést obecný pohled na data podle jednotlivých skupin uživatelů. Proto jsem následně celý proces provedla na datech čítajících přes deset milionů řádků. Tyto operace jsem již nemohla provádět na svém počítači, proto jsem využila serveru Databreakers, kam mi bylo umožněno se připojit.

Data jsem získala díky Databreakers s.r.o. Obsahují záznamy za reklamní kampaně zákazníků firmy. Data tvoří tabulky ve struktuře jak je vidět na diagramu níže. V této analýze jsem využila tři z nich, ze kterých je vytvořen datový model. Další tabulky můžou sloužit pro podrobnější analýzu podoby postů, konkrétní zaměření na zákazníky a sady reklam. Vzhledem k omezeném času pro analýzu to jsou ale podněty do budoucna. Tabulky jsem dostala samostatně, ale měla jsem k dispozici informace o primárních a cizích klíčích a stručný popis obsahu sloupců.

Další tabulky pro možné rozšíření analýzy:

  • Posts – detailní informace o podobě postů,
  • Ad_sets – informace o sadách reklam a jejich zacílení,
  • Scheduler_items – kódy a názvy kampaní
  • Accounts – identifikace zákazníků

Spojením tabulek pomocí MySQL jsem vytvořila datový model (viz níže):

    CREATE TABLE tab_promotervse AS
SELECT pta.kampan,
       pta.post_id,
       m.fb_api_metric,
       m.breakdown_type,
       m.breakdown,
       sum(i.value) AS sum_value
FROM insights i
LEFT JOIN metrics m ON m.id = i.metric_id
LEFT JOIN posts_to_ads pta ON pta.reklama_id_pta = i.reklama_id_i
WHERE m.fb_api_metric IN ('clicks',
                          'impressions')
  AND breakdown_type <> ''
  AND breakdown <> 'Unknown'
  AND post_id <> 0
  AND kampan <> 0
GROUP BY pta.kampan,
         pta.post_id,
         m.id,
         m.breakdown_type,
         m.breakdown;

Vzhledem velké náročnosti dotazování na tak velká data, jsem pro snazší práci s jednotlivými dotazy vytvářela nové tabulky. Bylo by možné vše tvořit pomocí tzv. pohledů nebo vše seskupit do jednoho dotazu, ale při takto objemných datech bylo třeba šetřit paměť a urychlit jednotlivé kroky. Významnou roli při urychlení provádění dotazů hrají také indexy a primární a cizí klíče. Prvním dotazem jsem vytvořila první tabulku tab_promotervse. Přímo v tomto dotazu jsem již rovnou provedla i omezení na metriky impresí (shlédnutí reklamy) a kliků, odstranění prázdných řádků a řádků, kde je breakdown uveden jako “Unknown”. Imprese a kliky jsem vybrala, protože jde o přehledný způsob analýzy online reklamy, je možné tak dopočítat CTR (click through rate) poměrem mezi kliky a impresemi – tzv. proklikovost.

V dalším kroku bylo třeba vytvořit nové breakdowny s kategoriemi uživatelů dle věku a pohlaví zvlášť, protože přímo z API se data stáhla v členění do skupin podle věku i pohlaví společně (například “18-24,female”). Za tímto účelem bylo třeba vytvořit další tabulku tab_promoterctr, v rámci které se do předchozí tabulky vkládají řádky s hodnotami za jednotlivé kategorie věku a obě pohlaví zvlášť.

    CREATE TABLE tab_promoterctr AS
SELECT *
FROM tab_promotervse
UNION
SELECT kampan,post_id,fb_api_metric,
       'gender' AS breakdown_type,
       'female' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%female%'
GROUP BY kampan,
         post_id,
         fb_api_metric
UNION
SELECT kampan,post_id,fb_api_metric,
       'gender' AS breakdown_type,
       'male' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%,male%'
GROUP BY kampan,
         post_id,
         fb_api_metric
UNION
SELECT kampan,post_id,fb_api_metric,
       'gender' AS breakdown_type,
       'unknown' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%,unknown%'
  AND breakdown_type = 'age,gender'
GROUP BY kampan,
         post_id,
         fb_api_metric
UNION
SELECT kampan,post_id,fb_api_metric,
       'age' AS breakdown_type,
       '13-17' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%13-17%'
GROUP BY kampan,
         post_id,
         fb_api_metric
UNION
SELECT kampan,post_id,fb_api_metric,
       'age' AS breakdown_type,
       '18-24' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%18-24%'
GROUP BY kampan,
         post_id,
         fb_api_metric
UNION
SELECT kampan,post_id,fb_api_metric,
       'age' AS breakdown_type,
       '25-34' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%25-34%'
GROUP BY kampan,
         post_id,
         fb_api_metric
UNION
SELECT kampan,post_id,fb_api_metric,
       'age' AS breakdown_type,
       '35-44' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%35-44%'
GROUP BY kampan,
         post_id,
         fb_api_metric
UNION
SELECT kampan,post_id,fb_api_metric,
       'age' AS breakdown_type,
       '45-54' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%45-54%'
GROUP BY kampan,
         post_id,
         fb_api_metric
UNION
SELECT kampan,post_id,fb_api_metric,
       'age' AS breakdown_type,
       '55-64' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%55-64%'
GROUP BY kampan,
         post_id,
         fb_api_metric
UNION
SELECT kampan,post_id,fb_api_metric,
       'age' AS breakdown_type,
       '65+' AS breakdown,
       sum(sum_value)
FROM tab_promotervse
WHERE breakdown LIKE '%65+%'
GROUP BY kampan,
         post_id,
         fb_api_metric ;

Cílem analýzy bylo zjistit obecné trendy v datech v pohledu na jednotlivé skupiny uživatelů a zároveň možnost využití pro jednotlivé zákazníky. Proto, aby bylo možné s daty dále pracovat a vizualizovat je, je třeba vytvořit další tabulky. Analýza je provedena ve třech pohledech na data v různé podrobnosti – z pohledu pouze na skupiny uživatelů, na jednotlivé kampaně a jednotlivé posty v rámci kampaní.

Tvořené tabulky mají ke každému řádku přiřazeny sloupce s impresemi, kliky a CTR. Přičemž CTR je třeba dopočítat podílem kliků vůči impresím. Vzhledem k omezené možnosti agregace v případě podrobnějších dat u poměrové metriky CTR jsem u tabulek v podrobnějším pohledu na kampaně a posty zvolila výpočet CTR jako metriku v PowerBI, kde je výpočet dynamický.

Pro obecnější analýzu rozptylů jednotlivých skupin uživatelů jsou data agregována podle breakdownů. V případě tohoto dotazu jsem vytvořila tabulku promoter_breakdownCI se skupinami uživatelů a hodnotami impresí a kliků a CTR.

        CREATE TABLE promoter_breakdownCI AS
SELECT ctr1.breakdown_type,
       ctr1.breakdown,
       sum(ctr1.sum_value) AS impression,
       sum(ctr2.sum_value) AS clicks,
       sum(ctr2.sum_value)/sum(ctr1.sum_value) AS CTR
FROM tab_promoterctr AS ctr1
JOIN tab_promoterctr AS ctr2 ON ctr1.post_id = ctr2.post_id
AND ctr1.kampan = ctr2.kampan
AND ctr1.breakdown_type = ctr2.breakdown_type
AND ctr1.breakdown = ctr2.breakdown
AND ctr2.fb_api_metric = 'clicks'
WHERE ctr1.fb_api_metric = 'impressions'
GROUP BY ctr1.breakdown_type,
         ctr1.breakdown;

S daty v podrobnosti dle kampaní lze dále pracovat v detailu zaměřeném na úspěšnost jednotlivých kampaní, což je využitelné pro klienty i pro zpřesňování. Takto vznikla tabulka promoter_kampanCI.

    CREATE TABLE promoter_kampanCI AS
SELECT ctr1.kampan,
       ctr1.breakdown_type,
       ctr1.breakdown,
       sum(ctr1.sum_value) AS impression,
       sum(ctr2.sum_value) AS clicks
FROM tab_promoterctr AS ctr1
JOIN tab_promoterctr AS ctr2 ON ctr1.post_id = ctr2.post_id
AND ctr1.kampan = ctr2.kampan
AND ctr1.breakdown_type = ctr2.breakdown_type
AND ctr1.breakdown = ctr2.breakdown
AND ctr2.fb_api_metric = 'clicks'
WHERE ctr1.fb_api_metric = 'impressions'
GROUP BY ctr1.kampan,
         ctr1.breakdown_type,
         ctr1.breakdown;

A pro detailní pohled na úspěšnost jednotlivých postů v rámci kampaní je vhodná třetí tabulka s informacemi seskupenými podle postů – tabulka promoter_postCI.

CREATE TABLE promoter_postCI AS
SELECT ctr1.kampan,
       ctr1.post_id,
       ctr1.breakdown_type,
       ctr1.breakdown,
       sum(ctr1.sum_value) AS impression,
       sum(ctr2.sum_value) AS clicks
FROM tab_promoterctr AS ctr1
JOIN tab_promoterctr AS ctr2 ON ctr1.post_id = ctr2.post_id
AND ctr1.kampan = ctr2.kampan
AND ctr1.breakdown_type = ctr2.breakdown_type
AND ctr1.breakdown = ctr2.breakdown
AND ctr2.fb_api_metric = 'clicks'
WHERE ctr1.fb_api_metric = 'impressions'
GROUP BY ctr1.kampan,
         ctr1.post_id,
         ctr1.breakdown_type,
         ctr1.breakdown;

Kompaktní tabulky jsem se rozhodla vizualizovat v PowerBI. Pro získání přehledu o rozdělení dat v rámci jednotlivých kampaní i v jejich kombinacích je tento nástroj velmi praktický.

Výsledky

Vytvořila jsem report, který umožňuje analýzu dle tří úrovní obecnosti – na úrovni breakdownů, kampaní a postů. V reportu je v grafu zároveň vidět hodnota CTR dle jednotlivých breakdownů a zároveň podíl počtu impresí na celku tzv. support. Samotná metrika proklikovosti má totiž omezenou vypovídací schopnost, pokud k ní nemáme informaci o tom, jaké množství shlédnutí ji podporuje. I menší hodnota CTR za jednu skupinu uživatelů tedy může mít větší význam oproti jiné skupině, která má vyšší CTR, ale podporuje ji jen pár shlédnutí. Hodnoty impresí jsou normalizované vůči celku, aby bylo možné srovnání. Pro podrobnější pohled je v zobrazen také sloupec v tabulce s konkrétními hodnotami. Ponechala jsem pouze kódy kampaní bez uvedení jejich názvu a jména zákazníka důvodu ochrany citlivých dat. Ze stejného důvodu byly také u postů přečíslovány jejich kódy.

Náhled reportu je možné vidět na obrázku níže:

Z obecného hlediska je na úrovni agregovaných dat ze všech kampaní zajímavé rozdělení hodnot dle věkových skupin a dle použitého zařízení. Z věkových skupin jsou nejúspěšnější uživatelé mezi 18 a 34 lety, protože, ačkoli jejich CTR není celkově nejvyšší, je reprezentováno silným supportem impresí. To potvrzuje i pohled dle jednotlivých kampaní. Podrobnější pohled na věkové skupiny pak nabízí původní typ breakdownu „age,gendder“, kde jsou věkové skupiny rozlišeny navíc dle pohlaví. Samotná data za pohlaví nejsou tolik významná.

V případě použitého zařízení není překvapením, že nejvyšší support mají smartphony na platformě Android. Zařízení „Desktop“ tedy osobní počítač má dle očekávání také vysoké počty impresí, obě tato zařízení mají ale nižší proklikovost. Nejvyšší CTR má často Ipod, ovšem ten je podpořen naprosto minimálním počtem impresí, takže není třeba jej považovat za významný. Zajímavé jsou ale zařízení Iphone a Ipad, které nemají tak vysoký počet impresí, ale zároveň mají poměrně vyšší CTR.

Kromě výše uvedeného celkového pohledu na data z kampaní nabízí tento report řadu pohledů na data, které v rozhraní Facebook Business Manager nejsou k dispozici. Přímo v rozhraní je možné si zobrazit metriky na úrovni kampaní, sad reklam a jednotlivých reklam, není ale možné si zobrazit úspěšnost samotných postů, přičemž na jednom postu může být navázáno víc reklam. Zobrazení CTR je pak standardně možné pouze celkově, není možné vidět vliv na jednotlivé cílové skupiny. Z hlediska typů cílových skupin nabízí výše uvedený report navíc rozdělení dle regionů, detail všech použitých zařízení a oddělené cílové skupiny samostatně dle pohlaví a věku. Oproti rozhraní je pak zde možné zvolit libovolnou kombinaci skupin. Pro detekci anomalit – specifického účinku obsahu na konkrétní cílové skupiny – je vytvořený report praktičtější a uživatelsky přátelštější než rozhraní Facebook Business Manager.

Závěr

Díky tomuto projektu jsem si vyzkoušela práci s Velkými daty, která jsou složitá a je třeba je vyčistit. Ověřila jsem si jak je SQL mocný nástroj. Vytvořila si tento web a mohla zde publikovat interaktivní report z PowerBI.

Ponaučení zní – dvakrát přemýšlej, než spustíš dotaz. A ještě si ho raději šestkrát přečti.

Ve světě sociálních sítí je stále nerozluštěná otázka toho, jaký obsah v jaké míře koho zajímá. Analyzování metrik ve vazbě na cílové skupiny uživatelů má tak velký potenciál. Výše popsaná analýza představuje jen úvodní fázi rozsáhlejšího procesu. V první řadě bude třeba vytvořit podobný pohled na skupiny uživatelů s dalšími metrikami (například cena za klik, cena za konverzi). Dalšími kroky bude automatizované napojení na API a nastavení dynamických přehledů úspěchu různých cílových skupin.

Pokud se podaří pokročit v této práci dále, výsledky budu průběžně publikovat.

Závěrečný projekt Digitální akademie s Czechitas (za podpory Google.org)