Kluczowym problemem oceny programów referralowych jest endogeniczność samo-selekcji: użytkownicy z wysokim zaangażowaniem już mają wyższą LTV i częściej zapraszają przyjaciół, tworząc iluzję wysokiej skuteczności kanału. Do poprawnej oceny stosujemy metody wnioskowania przyczynowego: Propensity Score Matching (PSM) do eliminacji biasu na podstawie obserwowanych cech, lub Instrumental Variables (IV), jeśli istnieje losowy instrument (na przykład losowe wyświetlanie banera).
Aby uwzględnić opóźnienia czasowe między wysłaniem zaproszenia a konwersją refa, używamy Survival Analysis (model Kaplana-Meiera lub Cox Proportional Hazards) zamiast prostego analizy kohortowej. Dzięki temu możemy poprawnie przetwarzać dane cenzurowane (right-censoring), gdy część użytkowników jeszcze nie zakończyła cyklu życia. LTV obliczamy poprzez całkowanie krzywej retencji z dyskontowaniem lub za pomocą metody BTYD (Pareto/NBD) do prognozowania przyszłych transakcji.
Kontekst: W mobilnej aplikacji dostarczającej jedzenie uruchomiono program referralowy z dwustronnymi bonusami. Po kwartale raport w Tableau pokazał, że użytkownicy, którzy aktywowali link referralowy, mają LTV o 40% wyższe niż średnia na platformie. Menedżer produktu żądał zwiększenia budżetu, ale zespół analityczny podejrzewał, że różnica wynika nie z programu, a z podstawowych cech super-użytkowników.
Problem: Niemożliwe było oddzielenie prawdziwego inkrementalnego efektu od korelacji z zaangażowaniem. Zastosowanie prostych zapytań SQL do porównania grup dawało stronniczą ocenę z powodu confounderów (częstotliwość zamówień, czas spędzony w produkcie). Bez poprawnej oceny biznes ryzykował przepłacenie za kanał z negatywną lub bliską zeru marżą.
Rozwiązanie 1: Bezpośrednie porównanie kohort przez SQL
Porównaliśmy kohortę "Zaproszeni" (treatment) i "Nie zaproszeni" (control) za pomocą agregacji w BigQuery, obliczając ARPU i retencję na 90. dzień.
Zalety: Natychmiastowa realizacja, zrozumiała wizualizacja dla interesariuszy, niskie wymagania dotyczące zasobów.
Wady: Krytyczny błąd samo-selekcji (self-selection bias) i błąd przeżycia. Użytkownicy, którzy i tak planowali pozostać w produkcie, częściej korzystają z referralek. Wynik jest zawyżony i nieprzydatny do podejmowania decyzji.
Rozwiązanie 2: Propensity Score Matching na danych historycznych
W Pythonie (scikit-learn) zbudowaliśmy model regresji logistycznej do oceny propensity score — prawdopodobieństwa uczestnictwa w programie na podstawie cech pre-treatment (wiek konta, historia zamówień, średni koszyk). Następnie zastosowaliśmy Nearest Neighbors do dopasowania par 1:1 i porównaliśmy LTV tylko w porównywalnych podgrupach.
Zalety: Eliminuje bias na podstawie obserwowanych zmiennych (observable confounders), działa na danych retrospektywnych bez potrzeby eksperymentu. Pozwala na szybkie uzyskanie oceny ATT (Average Treatment Effect on the Treated).
Wady: Nie eliminuje nieobserwowanych cech (unobserved confounders), takich jak ekstrawersja czy kapitał społeczny. W przypadku niezrównoważonych danych (mało zapraszających) mogą wystąpić problemy z ogólnym wsparciem (common support), a część próbki jest odrzucana, co zmniejsza moc.
Rozwiązanie 3: Instrumentalne zmienne i Survival Analysis
Znaleźliśmy naturalny eksperyment: 50% użytkowników losowo widziało baner programu referralowego na głównym ekranie (instrument Z), co wpływało na prawdopodobieństwo uczestnictwa (X), ale nie na LTV bezpośrednio (Y). Oceniliśmy efekt za pomocą 2SLS (Two-Stage Least Squares) w bibliotece linearmodels dla Pythona, uzyskując LATE (Local Average Treatment Effect). Aby uwzględnić opóźnienia, zastosowaliśmy Survival Analysis: zbudowaliśmy model ryzyk (hazard function) czasu do pierwszego zamówienia refa i skorygowaliśmy LTV na prawdopodobieństwo konwersji w każdym momencie czasu.
Zalety: Metoda IV eliminuje zarówno obserwowane, jak i nieobserwowane confoundery, dając ocenę przyczynowo-skutkową. Analiza przeżycia poprawnie przetwarza niekompletne dane i pozwala modelować dynamikę czasową.
Wady: Wymaga ważnego instrumentu (trafność i egzogeniczność), co jest trudno udowodnić. Zmniejszona moc statystyczna ocen IV (szerokie przedziały ufności). Interpretacja LATE różni się od ATE (średni efekt tylko dla "compliers").
Wybrane rozwiązanie:
Wybrano podejście hybrydowe: wykorzystano randomizację banera do oszacowania czystego efektu uczestnictwa, a następnie zastosowano nieliniowy model Survival Analysis (Cox z zmiennymi czasowymi) do obliczenia oczekiwanej LTV z uwzględnieniem czasu konwersji refów. Umożliwiło to oddzielenie efektu programu od efektu samo-selekcji.
Wynik:
Prawdziwy inkrementalny efekt wyniósł +12% do LTV dla grupy compliers, a nie +40% jak w pierwotnym raporcie. Analiza opóźnień pokazała, że 85% konwersji refów ma miejsce w ciągu pierwszych 14 dni po kliknięciu, co pozwoliło skrócić horyzont oceny efektywności z 90 do 30 dni. Biznes zrewidował ekonomię jednostkową, obniżając koszt pozyskania (CAC) o 18% przez rezygnację z długiego oczekiwania na retencję.
Pytanie 1: Jak sprawdzić założenie SUTVA (brak interakcji między jednostkami) w programie referralowym, gdzie istnieją efekty sieciowe między zapraszającymi?
SUTVA jest naruszona, jeśli gęstość zaproszeń w kręgu społecznym wpływa na prawdopodobieństwo konwersji (np. przesycenie lub efekt wirusowy). Aby to sprawdzić, używamy klasteryzacji: dzielimy użytkowników na klastry geograficzne lub segmenty według grafów społecznych przez Graph Analysis (NetworkX).
Następnie stosujemy Difference-in-Differences, porównując klastry o wysokiej i niskiej penetracji linków referralowych. Jeśli efekt w gęstych klastrach znacznie się różni (niżej z powodu przesycenia lub wyżej z powodu dowodu społecznego), SUTVA jest naruszona i należy zastosować modele z interakcjami międzygrupowymi (spatial models) lub ograniczyć analizę do izolowanych segmentów.
Pytanie 2: Dlaczego nie można stosować zwykłej regresji liniowej (OLS) do prognozowania LTV w warunkach danych cenzurowanych, gdy część użytkowników jeszcze nie zrezygnowała?
OLS ignoruje fakt cenzurowania (right-censoring), traktując obecne LTV jako finalne, co prowadzi do systematycznego zaniżenia ocen dla "młodych" użytkowników. Zamiast tego stosujemy Survival Analysis do oceny krzywej retencji ( S(t) ), a następnie całkujemy ją, aby uzyskać oczekiwaną długość życia.
Alternatywnie używamy probabilistycznych modeli powtarzalnych zakupów (BTYD), takich jak Pareto/NBD czy Gamma-Gamma, zaimplementowanych w bibliotece lifetimes dla Pythona. Modele te uwzględniają jeszcze niewidoczne transakcje przez probabilistyczne rozkłady częstotliwości i czasu między zakupami, dając nieobciążoną ocenę przyszłej LTV nawet dla aktywnych użytkowników.
Pytanie 3: Jak odróżnić inkrementalne zaproszenia (zaproszenia, które miały miejsce tylko dzięki programowi) od organicznych zaproszeń (które miałyby miejsce również bez stymulacji) podczas oceny efektu?
Używamy ram Principal Stratification, dzieląc populację na cztery grupy (strata): Always-takers (zaprosili by zawsze), Compliers (zaprosili tylko dzięki programowi), Never-takers i Defiers. Poprzez analizę IV z binarnym instrumentem (na przykład widział/nie widział banera) oceniamy LATE — efekt dla Compliers.
Dla bardziej szczegółowej segmentacji stosujemy metody Causal Machine Learning (EconML, CausalML w Pythonie), takie jak Causal Forest czy Meta-learners (S-Learner, T-Learner), aby ocenić Conditional Average Treatment Effect (CATE) dla różnych segmentów. Pozwala to zrozumieć, dla których użytkowników (na przykład niski/wysoki koszyk) program generuje inkrementalne zaproszenia, a dla których tylko rejestruje organiczne dzielenie się.