Većina preporuka u web shopu nije preporuka.

To je polica s naslovom “Moglo bi vas zanimati” na kojoj završavaju proizvodi s najvećom zalihom, najvećom maržom ili najglasnijim category managerom. Ponekad pogodi. I pokvareni sat ponekad pokaže točno vrijeme, ali ga ne bih spojio na naplatu.

Ozbiljnije pitanje glasi:

Koji će proizvod ovaj kupac najvjerojatnije kupiti sljedeći, u kojem vremenskom prozoru i s kakvim učinkom na doprinosnu maržu?

Tu recommendations prestaju biti dekoracija, a CLTV prestaje biti naljepnica na segmentu “VIP”.

Što podaci stvarno trebaju sadržavati

Instacart Online Grocery Shopping Dataset sadrži više od 3 milijuna narudžbi preko 200.000 anonimnih korisnika. Za svakog korisnika objavljeno je između 4 i 100 narudžbi, redoslijed proizvoda, dan i sat kupnje te relativno vrijeme između narudžbi.

Instacart je dataset izričito objavio za probleme poput predviđanja ponovne kupnje, prve kupnje i sljedećeg proizvoda dodanog u košaricu. U tekstu također navodi da je na sličnim produkcijskim podacima koristio XGBoost, word2vec i Annoy za “buy again” sortiranje i preporuke.

Za osnovni model dovoljna je ova struktura:

stupacšto iz njega učimo
user_idčija je povijest kupnje
order_idkojoj narudžbi događaj pripada
order_numberredoslijed narudžbi korisnika
order_dowdan u tjednu
order_hour_of_daysat narudžbe
days_since_prior_orderrazmak od prethodne kupnje
product_idkupljeni proizvod
add_to_cart_orderpozicija dodavanja u košaricu
reorderedje li proizvod već bio kupljen
aisle_id, department_idhijerarhija kategorije

Vlastiti web shop treba dodati cijenu, COGS, popust, povrat, dostupnost, kanal i vrijeme prikaza preporuke. Bez toga možeš predviđati proizvod, ali teško možeš dokazati vrijednost.

Sljedeći proizvod je uvjetna vjerojatnost

Za korisnika u, proizvod p i njegovu povijest H_u, model procjenjuje:

P(Yu,p=1 Hu)

Y=1 znači da će proizvod biti kupljen u unaprijed definiranom prozoru, primjerice u sljedećoj narudžbi ili unutar 30 dana. H_u može sadržavati broj kupnji proizvoda, dane od zadnje kupnje, tipičan razmak ponovne kupnje, kategorije, sat i dan naručivanja.

“Sljedeća narudžba” i “sljedećih 30 dana” nisu ista meta. Prva zanemaruje koliko dugo treba čekati. Druga korisnika bez kupnje nakon 30 dana tretira kao negativan primjer. Model i poslovna odluka moraju koristiti istu definiciju.

Jednostavan baseline ne treba neuronsku mrežu. Za proizvod i segment stanja može se procijeniti:

ph = nhne

h je vremenski horizont. “Prihvatljiv slučaj” znači da korisnik ima dovoljno budućeg vremena u podacima da bismo vidjeli ishod. Ako u uzorak ubaciš korisnike promatrane samo dva dana, a meta je kupnja unutar 30 dana, stvorio si lažne negativne primjere.

Košarica otkriva veze, ali lift čuva obraz

Za proizvode koji se kupuju zajedno mogu se koristiti support, confidence i lift.

support(A B)=N(A B)N
confidence(A B)=support(A B)support(A)
lift(A B)=confidence(A B)support(B)

Ako je lift veći od 1, B se pojavljuje uz A češće nego što bismo očekivali prema osnovnoj učestalosti proizvoda B. To još uvijek nije uzročni učinak preporuke. Možda se proizvodi prirodno kupuju zajedno i bez ikakvog modula.

Zato “kupci koji su kupili A kupili su i B” nije dokaz da će prikazivanje B povećati prodaju. To je kandidat za test.

Model mora pogoditi listu, ne samo jedan proizvod

Web shop obično prikazuje K preporuka. Recall@K mjeri koliko smo stvarno kupljenih proizvoda uspjeli staviti u tih K mjesta:

RecallK = hKr

hK je broj pogođenih proizvoda među prvih K preporuka, a r broj proizvoda koje je korisnik stvarno kupio u ciljnom prozoru.

Precision@K okreće nazivnik:

PrecisionK = hKK

Recall nagrađuje pokrivanje stvarnih kupnji. Precision kažnjava zatrpavanje korisnika kandidatima. Ako korisnik kupi dva proizvoda, a model među prvih pet pogodi jedan, Recall@5 = 1/2, a Precision@5 = 1/5.

Podjelu za trening i test treba napraviti po vremenu. Model trenira na prošlosti i predviđa budućnost. Nasumično miješanje redaka može pustiti kasniju narudžbu istog korisnika u trening dok raniju pokušavamo predvidjeti. To nije predikcija. To je curenje s boljim marketingom.

CLTV je buduća marža, ne povijesni promet

Za konačni horizont H, očekivani CLTV može se zapisati kao diskontirana očekivana doprinosna marža umanjena za trošak korisnika:

CLTVH(u)=t=1HE[Mu,t](1+r)t-E[Cu]

M_{u,t} je doprinosna marža korisnika u razdoblju t, r diskontna stopa po razdoblju, a C_u očekivani budući trošak zadržavanja i posluživanja. Horizont, stopa i uključeni troškovi moraju biti navedeni.

Ovo je definicija financijskog cilja, ne tvrdnja da možemo savršeno vidjeti budućnost. Za kupce bez ugovornog churn događaja treba procijeniti hoće li ostati aktivni, koliko će transakcija napraviti i koliku će vrijednost imati transakcija. Pareto/NBD i srodni modeli jedan su provjeren pristup za broj budućih transakcija, ali nisu obavezni za prvi korak.

Najjednostavniji pošteni početak je ostvarena doprinosna marža u 90, 180 i 365 dana po akvizicijskoj kohorti.

Kumulativna marža po korisniku — primjer A/B mjerenja preporuka
line chart with 4 labels and 2 series 0 50 100 Kontrola (€), 1 mjesec: 12 Kontrola (€), 3 mjeseca: 32 Kontrola (€), 6 mjeseci: 54 Kontrola (€), 12 mjeseci: 86 Preporuke (€), 1 mjesec: 12.5 Preporuke (€), 3 mjeseca: 34 Preporuke (€), 6 mjeseci: 61 Preporuke (€), 12 mjeseci: 102 1 mjesec 3 mjeseca 6 mjeseci 12 mjeseci Kontrola (€) Preporuke (€)

Vrijednosti su radni primjer, ne Instacartov rezultat. Graf namjerno prati kumulativnu doprinosnu maržu, a ne klikove na preporuke. U ovom primjeru razlika nakon 12 mjeseci iznosi 16 eura po korisniku. Tek randomizacija može podržati tvrdnju da su preporuke uzrokovale razliku.

Offline pobjeda može biti online poraz

Model s boljim Recall@K može u produkciji zaraditi manje. Može preporučivati proizvode koji su već na korisnikovom popisu, proizvode bez zalihe ili artikle s niskom maržom i visokom stopom povrata.

Zato online test treba imati barem tri sloja mjerenja: ponašanje, narudžbu i ekonomiku. Klik na preporuku je dijagnostika. Inkrementalna kupnja i marža su ishod.

Tretman vidi personalizirane preporuke. Kontrola vidi postojeći modul ili ništa, ovisno o pitanju koje testiramo. Primarni KPI može biti doprinosna marža po korisniku kroz 30 ili 90 dana. Guardrail metrike uključuju povrate, otkazivanja, vrijeme učitavanja i udio proizvoda bez zalihe.

Ako istog korisnika prebacuješ između varijanti pri svakom posjetu, tretmani se miješaju. Randomizacija po korisniku obično je čišća za dugoročan CLTV test.

Sustav koji bih stvarno napravio

Počeo bih s tri kandidata: proizvodi za ponovnu kupnju, proizvodi koji se često kupuju uz trenutačnu košaricu i popularni proizvodi unutar korisnikove kategorije. Zatim bih uklonio artikle bez zalihe, već kupljene trajne proizvode i ono što nema smisla zbog veličine ili kompatibilnosti.

Tek nakon toga model za rangiranje. Ulazne značajke trebaju imati poslovno značenje: frequency, recency, tipičan interval kupnje, afinitet prema kategoriji, trenutnu košaricu, cijenu i dostupnost. Rezultat modela nije konačni redoslijed ako ignorira maržu i ograničenja.

Ne bih u jedan proizvoljni score zbrojio vjerojatnost kupnje, maržu i popularnost s težinama koje smo izmislili u petak popodne. Ako želimo optimizirati očekivanu kratkoročnu maržu, cilj može biti:

E[CMu,p] = P(Yu,p=1 Hu)× CMp

To je jasno, ali i dalje pretpostavlja da prikaz preporuke ne mijenja druge kupnje. Za stvarni inkrementalni učinak treba eksperiment ili causal model.

Preporuka je dobra tek kada pogodi relevantan proizvod, stigne u pravo vrijeme, ne pojede postojeću kupnju i ostavi više buduće marže nego kontrola.

Sve ostalo je samo još jedna polica.

Izvori i provjera