Modelace výstupních dat RFM segmentace
V tomto příspěvku bych ráda představila můj závěrečný projekt vypracovaný v rámci kurzu Digitální akademie (DA). Mým tématem je modelace výstupních dat pro automatizované řešení zákaznické RFM segmentace. Toto téma mi přidělil můj mentor Lukáš Vožda z agentury Proficio. Byla jsem ráda, že můžu pracovat na něčem reálném, co by třeba mohlo najít využití jako interní nástroj v marketingové agentuře.
Jsem si vědoma toho, že RFM segmentace není nic objevného a její automatizace a vizualizace výstupu je jako „vynalézat“ znova kolo. Proč? Protože RFM segmentace je levný marketingový nástroj, se kterým se dá udělat za málo peněz hodně muziky. Pokud máte přístup k SPSS® Modeler od IBM, naklikáte si tam RFM analýzu i následnou 3D modelaci během půl hodiny. Vyzkoušela jsem si to v rámci trial verze a když jsem konečně přišla na to, jak udělat správný set-up a jak si vytvořit RFM analysis node, došlo mi, že tohle by nám jako studentkám DA asi moc nedalo. Záměrem bylo zkusit to trochu jinak a hlavně si vyzkoušet, co je vlastně všechno potřeba obsáhnout, pokud bychom chtěly zhotovit něco uživatelsky přínosného a přitom jednoduchého. I když se moje kontribuce v rámci tohoto “projektu” smrkskla na pochopení tématu, rešerše a kódu modelace, kterou jsem si vytvořila v rámci Plotly, musela jsem toho hodně projít a zkusit, abych toho 80% zahodila (sety dvoj-dimenzionálních heatmap, hnusný výsledek z SPSS Modeleru, vykreslování v Jupyter NB a další). Dalším krokem bylo postup přesně vysvětlit programátorce Lucce a sledovat a rozumět tvorbě kódu, abychom se dobraly toho, co je potřeba.
Na tomto tématu spolupracuji s kolegyní Luckou z DA, která vypracovala automatizované řešení v pythonu, jímž se vypočítá RFM skóring. Další částí, na které pracuje, je uživatelské rozhraní (v Djangu) pro nahrání vstupního souboru a zobrazení modelace výstupních dat.
Cíl projektu
• nastudovat principy RFM analýzy a způsob možného vypracování segmentace a vizualizace. Podkladovými daty pro RFM segmentaci byla data ve formátu .csv (může být i excel)
• navrhnout modelaci výstupních dat pro automatizované řešení RFM segmentace na základě RFM skóre
• integrace vizualizačního modelu do UI ve spolupráci s kolegyní Luckou, která uživatelské rozhraní navrhuje
Úvod do tématu RFM segmentace
RFM analýza je jednoduchý nástroj pro segmentaci v rámci zákaznického managementu (CRM). RFM segmentace je postup, který označkuje zákazníky ve třech dimenzích: podle času, který uplynul od posledního nákupu (recency), dle četnosti nákupů (frequency) a podle celkové či průměrné peněžní hodnoty všech nákupů daného zákazníka (monetary). Je nutno podotknout, že každá dimenze má jinou důležitost a měla by tedy existovat možnost přiřadit všem třem dimenzím váhu podle jejich důležitosti — recency by měla být nejdůležitější dimenzí, protože je velká šance opakovaného nákupu u toho, kdo nakoupil nedávno; na dalším místě by měla stát frequency, protože s opakovaným nákupem se zvyšuje šance na retenci daného zákazníka; monetary je tím pádem poslední. Jelikož hodnota jednorázové útraty sama o sobě o ničem nevypovídá, doporučuje se v rámci této metriky hodnota průměrná.
Naprosto výstižně a pochopitelně popsal samotné počty na svém blogu Petr Šimeček z Kebooly: „Jestliže máme v každé kategorii například 5 skupin [ což dle zadání mentora máme], pak každému zákazníkovi můžeme přiřadit skóre od 1,1,1 do 5,5,5. Zákazník, který bude v kategorii Recency v segmentu 4, u Frequency v segmentu 2 a v Monetary 3, dostane skóre 4+2+3 = 9. Abychom neměli tisíce zákazníků oskórovaných pouze 125 hodnotami (počty kombinací při 5ti segmentech na každou kategorii), použijeme pro skórování ještě “váhy”. Váha bude jiná podle toho, zda je zákazník na spodní nebo horní hranici segmentu.“
Vzorec pro výpočet RFM skóre by pak vypadal následovně:
RFM skóre = (hodnota R x váha R) + (hodnota F x váha F) + (hodnota M x váha M)
Pro zhotovení RFM segmentace není nutné mít žádná složitá data. V podstatě si vystačíme s datem nákupu pro dimenzi recency (R), s hodnotou objednávky pro monetary (M) a s unikátním identifikátorem zákazníka pro frequency (F) v daném čase.
POZOR! Zákaznická segmentace na základě RFM je sice jednoduchým nástrojem pro marketing, ale má taky svá úskalí. Nelze ji bezmyšlenkovitě uplatňovat na jakákoliv data, např. z celého e-shopu, který má velkou škálu heterogenních produktů. V takovém případě je nutné se zaměřit na jednotlivé sekce nebo oddělení a zamyslet se nad tím, než se vůbec vstupní data připraví.
Jak a čím na to?
K propočtu RFM skóringu bylo na radu mentora použito dělení dat do kvantilů a pro výpočet 5 intervalů jednotlivých dimenzí pak Jenksův algoritmus.
Výpočet RFM skóringu má ale jedno úskalí — když má vstupní dataset desetitisíce řádků s unikátními identifikátory zákazníků, kde nelze vymyslet nic na jejich agregaci, je velká šance že pokud dimenzím nepřiřadíme žádnou váhu nebo přiřadíme všem stejnou, skončíme s velkými skupinami zákazníků se stejným skóre. Tady se nabízí dvě možnosti: 1. ke slovu může přijít ke slovu shluk do skupin pomocí K-means algoritmu, který ve spojení s RFM segmentaci popsal(a) Birant(2011) v této studii nebo 2. se nad tím zamyslíte a budete trpělivě testovat a hodnotit výsledky, jak to navrhnul Petr.
Provedení vizualizace
Ideálním tvarem pro provedení vizualizace je vynesení dat všech tří dimenzí na kostku nebo kvádr v závisloti na počtu segmentů pro jednotlivé dimenze, kdy každá dimenze tvoří jednu hranu. Vytvořit si 3D scatter plot v Plotly bylo omezeno ve verzi, která je dostupná zdarma, pouze pro data do 5tisíc řádků. Kód v pythonu jsem upravila tak, aby byl schopný projet data i nezávisle na Plotly účtu a pro neomezené množství řádků, ne jen 5 tisíc.
Můj kód pro off-line Plotly rendering je dostupný zde. Modelace hodnot RFM skoringu přes 3D scatter graf je spíš jen test pro orientaci, jak je která hodnota RFM skoringu na škále zastoupena.
Bohužel jsem až příliš pozdě přišla na to, že labels jednotlivých klusterů, které dopočítává K-means, je lepší při závěrečné modelaci nasazovat na normalizovaná (bezrozměrná) data a tak je výsledek vlastně zavádějící a ne zcela správný, což je vidět i na modelaci samotné.
Kód pro offline rendering této modelace pro neomezený počet řádků je zde. V této modelaci by mělo už být ideálně TO, na co by se měl markeťák zaměřit. Barevné odlišení jednotlivých shluků by mělo napomoct v orientaci při stanovení hranic jednotlivých segmentů, což je Achilova pata RFM segmentace. Je pak samozřejmě na individuální interpretaci, co udělat s odlehlými hodnotami, které v normálních datech vždycky jsou.
Praktické využití výstupů a závěr
Využití výstupu RFM segmentace je samo o sobě dost omezené. Pokud se ale propojí tento skóring třeba s demografickými daty, je těch možností hned více.

Pak už vzniká podklad třeba pro predikce a větší marketingové rošády. I toto je důvod, proč jsem ustoupila od interpretace dat, se kterými jsme pracovaly. Poměrně dlouhou dobu jsme navíc měly k dispozici pouze datový sample, kde byly slitá data ze tří různých e-shopu dohromady — výpovědní hodnota by byla v tomto případě opravdu minimální. Samotný RFM skóring bez dalších dat a znalostí zákazníka, jenž v našem případě byl zcela anonymní, je jen 1 dílkem skládačky, kterou je nutné dále doplnit. Pro predikce a doporučení by bylo vhodné doplnění o demografická data o jednotlivých zákaznících.
Obecné doporučení pro zapojování RFM segmentace např. do marketingové strategie a jejího vyhodnocování— hranice segmentů doporučené algoritmem jsou pořád jen roboticky určené, pokud nemáte dostatek dalších informací a detailnějších dat, testování se stejně nevyhnete. Je ale určitě vhodné nastavení počtu segmentů promyslet a veškeré výstupy pečlivě vyhodnotit.
Použité nástroje
DataGrip — pro průzkum a ošahání vstupního datasetu
Jupyter NB — pro další průzkum datasetu a testování vizualizací přes pandas
Plotly — pro modelaci vizualizace a získání jejího kódu pro úpravu dle potřeby
Přínos a závěry
Zjistila jsem, jaké mám rezervy a kolik se toho chci dozvědět hlavně z oblasti statistiky a datově-analytické matematiky. To je podle mě základ, který musí každý analytik aspoň do určité míry obsáhnout, pokud chce rozumět tomu, co vlastně může měřit a jak a pokud chce mít oporu pro datové bádání.
Dalším přínosem — a pro mě asi hlavním- byla možnost vyzkoušet si aspoň přičuchnout k tomu, jaké to je pracovat na nějakém takovém projektu společně a něco vytvářet, i když je to jen cvičně. Přestože jde o znovu-vynalézání kola, pro tréninkové účely je to ideální, protože už to někdo před vámi řešil. Došlo mi, že je nutné udělat hodně rešerší a projít dost materiálů, když nevíte na začátku o daném tématu nic. Náš projekt sice není ještě hotový a dokonalý, ale snad brzy bude.
V neposlední řadě jsem byla nadšena z toho, že i když jsem s pythonem začala od nuly před třemi měsíci, existuje služba jako je plotly, ve které si můžu vymodelovat jakýkoliv graf a vyexportovat si ho do požadovaného jazyka nebo formátu. Tím pádem jsem byla schopná něco samostatně vytvořit.
Plán do budoucna
• Společně s Luckou dokončit a rozběhnout jednoduchou funkční apku, která bude uživatelsky nenáročná a bude provádět RFM segmentaci na základě zvoleného počtu segmentů a jejich váhy zadané uživatelem, a doporučovat shluky přes K-means algoritmus, pokud si to uživatel bude přát.
• Kvůli výše uvedenému zvážit výhodnost normalizace vstupních dat a shlukování do skupin přímo z raw dat.
• Prozkoumat možnosti toho, jak do automatizovaného řešení dostat to, aby aplikace nabízela odhad počtu segmentů, do kterých pak K-means zákazníky na základě RFM skóre rozdělí.
Je to možné tak, že se provede shluková analýza pro 1:n skupin, kde se bude na základě odchylek zkoumat jejich nejmenší suma, což je vlastně doporučený počet segmentů pro shluknutí. Pro tento účel se hodí tzv. „Elbow method“, která spočívá v spuštění K-means na množině dat pro rozsah hodnot K (např. K od 1 do 10) a pro každou hodnotu K vypočítat součet čtvercových chyb — Sum of Squared Errors (SSE). Pak se vykreslí čárový graf SSE pro každou hodnotu K. Pokud čárový graf vypadá jako rameno, pak “loket” na rameni je hodnota K, tedy číslo, které se nejlépe hodí pro počet shluků. Chceme malou hodnotu SSE, ale SSE má tendenci k poklesu na 0, když se zvyšujeme K (SSE je 0, když K je roven počtu datových bodů v data setu, protože pak každý datový bod je jeho vlastní shluk a mezi ním a středem jeho shluku není žádná chyba). Naším cílem je zvolit malou hodnotu K, která má stále nízkou SSE a „loket“ obvykle reprezentuje, odkud začíná klesající výnos zvýšením K.

Kdybychom s Luckou vyřešily, jak by bylo možné vyjádařit, že křivka grafu v této metodě nemá žádný jasný “loketní” zlom a její pokles je příliš pozvolný, mohly bychom uživateli hned na začátku doporučit, že jeho data nejsou vhodné pro shluk přes K-means metodu a bude muset určení hranic zákaznických segmentů rešit jinak.
Zdroje a reference:
http://cdn.intechopen.com/pdfs/13162.pdf
https://cs.wikipedia.org/wiki/K-means
https://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization
https://images.plot.ly/plotly-documentation/images/python_cheat_sheet.pdf
https://padak.keboola.com/rfm-segmentace-a7dd3f543693
