ProHoster > Блог > Administracija > Kako prikupiti korisničke kohorte kao grafikone u Grafani [+ docker slika s primjerom]
Kako prikupiti korisničke kohorte kao grafikone u Grafani [+ docker slika s primjerom]
Kako smo pomoću Grafane riješili problem vizualizacije korisničkih kohorti u Promopult servisu.
promovirati - moćan servis sa velikim brojem korisnika. Za 10 godina rada, broj registracija u sistemu je premašio milion. Oni koji su se susreli sa sličnim uslugama znaju da je ovaj niz korisnika daleko od homogenosti.
Neko se prijavio i "zaspao" zauvijek. Neko je zaboravio lozinku i registrovao se još par puta tokom šest meseci. Neko donosi novac na kasu, a neko je došao po gratis instrumenti. I bilo bi lijepo dobiti neki profit od svih.
Na ovako velikim skupovima podataka kao što je naš, analiza ponašanja pojedinog korisnika i donošenje mikro odluka je besmisleno. Ali uočavanje trendova i rad sa velikim grupama je moguće i neophodno. Što je upravo ono što mi radimo.
Rezime
Šta je kohortna analiza i zašto je potrebna?
Kako napraviti kohorte po mjesecima registracije korisnika u SQL-u.
Ako već znate šta je kohortna analiza i kako to učiniti u SQL-u, pređite direktno na posljednji odjeljak.
1. Šta je kohortna analiza i zašto je potrebna?
Kohortna analiza je metoda zasnovana na poređenju različitih grupa (kohorti) korisnika. Najčešće se naše grupe formiraju po sedmici ili mjesecu u kojem je korisnik počeo koristiti uslugu. Odavde se računa životni vijek korisnika, a to je pokazatelj na osnovu kojeg se može izvršiti prilično složena analiza. Na primjer, razumjeti:
kako kanal akvizicije utječe na životni vijek korisnika;
kako upotreba bilo koje funkcije ili usluge utiče na životni vijek;
Kako je lansiranje funkcije X utjecalo na vijek trajanja u odnosu na prošlu godinu.
2. Kako napraviti kohorte u SQL-u?
Veličina članka i zdrav razum nam ne dozvoljavaju da ovdje iznesemo naše stvarne podatke - u test dumpu, statistika za godinu i po dana: 1200 korisnika i 53 transakcija. Kako biste se mogli poigrati ovim podacima, pripremili smo docker image sa MySQL-om i Grafanom u kojem sve to možete iskusiti i sami. Link na GitHub na kraju članka.
I ovdje ćemo pokazati stvaranje kohorti na pojednostavljenom primjeru.
Pretpostavimo da imamo uslugu. Korisnici se tamo registruju i troše novac na usluge. S vremenom korisnici odustaju. Želimo da saznamo koliko dugo korisnici žive, a koliko ih otpadne nakon 1. i 2. mjeseca korištenja usluge.
Da bismo odgovorili na ova pitanja, moramo konstruirati kohorte na osnovu mjeseca registracije. Aktivnost ćemo mjeriti po troškovima u svakom mjesecu. Umjesto troškova, mogu postojati narudžbe, pretplate ili bilo koja druga aktivnost zasnovana na vremenu.
Sirovi podaci
Primeri su rađeni u MySQL-u, ali za druge DBMS ne bi trebalo biti značajnih razlika.
Tabela korisnika - korisnici:
Korisnički broj
Datum registracije
1
2019-01-01
2
2019-02-01
3
2019-02-10
4
2019-03-01
Tabela troškova - naplata:
Korisnički broj
Datum
Suma
1
2019-01-02
11
1
2019-02-22
11
2
2019-02-12
12
3
2019-02-11
13
3
2019-03-11
13
4
2019-03-01
14
4
2019-03-02
14
Odaberite sve korisničke otpise i datum registracije:
SELECT
b.userId,
b.Date,
u.RegistrationDate
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
Rezultat:
Korisnički broj
Datum
Datum registracije
1
2019-01-02
2019-01-02
1
2019-02-22
2019-01-02
2
2019-02-12
2019-02-01
3
2019-02-11
2019-02-10
3
2019-03-11
2019-02-10
4
2019-03-01
2019-03-01
4
2019-03-02
2019-03-01
Gradimo kohorte po mjesecima; da bismo to učinili, pretvaramo sve datume u mjesece:
DATE_FORMAT(Date, '%Y-%m')
Sada moramo znati koliko mjeseci je korisnik bio aktivan - to je razlika između mjeseca zaduženja i mjeseca registracije. MySQL ima funkciju PERIOD_DIFF() - razlika između dva mjeseca. Dodajte PERIOD_DIFF() zahtjevu:
SELECT
b.userId,
DATE_FORMAT(b.Date, '%Y-%m') AS BillingMonth,
DATE_FORMAT(u.RegistrationDate, '%Y-%m') AS RegistrationMonth,
PERIOD_DIFF(DATE_FORMAT(b.Date, '%Y%m'), DATE_FORMAT(u.RegistrationDate, '%Y%m')) AS MonthsDiff
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
Korisnički broj
BillingMonth
Datum registracije
MonthsDiff
1
2019-01
2019-01
0
1
2019-02
2019-01
1
2
2019-02
2019-02
0
3
2019-02
2019-02
0
3
2019-03
2019-02
1
4
2019-03
2019-03
0
4
2019-03
2019-03
0
Brojimo aktivirane korisnike u svakom mjesecu - grupiramo zapise po BillingMonth, RegistrationMonth i MonthsDiff:
SELECT
COUNT(DISTINCT(b.userId)) AS UsersCount,
DATE_FORMAT(b.Date, '%Y-%m') AS BillingMonth,
DATE_FORMAT(u.RegistrationDate, '%Y-%m') AS RegistrationMonth,
PERIOD_DIFF(DATE_FORMAT(b.Date, '%Y%m'), DATE_FORMAT(u.RegistrationDate, '%Y%m')) AS MonthsDiff
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
GROUP BY BillingMonth, RegistrationMonth, MonthsDiff
U januaru, februaru i martu pojavio se po jedan novi korisnik - MonthsDiff = 0. Jedan januarski korisnik je bio aktivan u februaru - RegistrationMonth = 2019-01, BillingMonth = 2019-02, a jedan februarski korisnik je bio aktivan u martu.
Naravno, obrasci su bolje vidljivi u velikom skupu podataka.
Kako prenijeti kohorte u Grafanu
Naučili smo kako da formiramo kohorte, ali kada ima puno zapisa, više ih nije lako analizirati. Zapisi se mogu izvesti u Excel i formirati u prekrasne tabele, ali to nije naš metod!
Kohorte se mogu prikazati kao interaktivni grafikon u grafana.
Da bismo to učinili, dodajemo još jedan upit za pretvaranje podataka u format prikladan za Grafanu:
SELECT
DATE_ADD(CONCAT(s.RegistrationMonth, '-01'), INTERVAL s.MonthsDiff MONTH) AS time_sec,
SUM(s.Users) AS value,
s.RegistrationMonth AS metric
FROM (
## старый запрос, возвращающий когорты
SELECT
COUNT(DISTINCT(b.userId)) AS Users,
DATE_FORMAT(b.Date, '%Y-%m') AS BillingMonth,
DATE_FORMAT(u.RegistrationDate, '%Y-%m') AS RegistrationMonth,
PERIOD_DIFF(DATE_FORMAT(b.Date, '%Y%m'), DATE_FORMAT(u.RegistrationDate, '%Y%m')) AS MonthsDiff
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
WHERE
u.RegistrationDate BETWEEN '2018-01-01' AND CURRENT_DATE
GROUP BY
BillingMonth, RegistrationMonth, MonthsDiff
) AS s
GROUP BY
time_sec, metric
GitHub spremište sa primjerom je docker slika sa MySQL i Grafanom koju možete pokrenuti na svom računaru. Baza podataka već sadrži demo podatke za godinu i po dana, od januara 2018. do jula 2019. godine.
Ako želite, možete učitati svoje podatke u ovu sliku.