ProHoster > Blog > Adminisztráció > Felhasználói csoportok grafikonként történő gyűjtése a Grafana alkalmazásban [+ docker kép példával]
Felhasználói csoportok grafikonként történő gyűjtése a Grafana alkalmazásban [+ docker kép példával]
Hogyan oldottuk meg a felhasználói csoportok megjelenítésének problémáját a Promopult szolgáltatásban a Grafana segítségével.
népszerűsít - hatékony szolgáltatás nagyszámú felhasználóval. A 10 éves működés alatt a regisztrációk száma a rendszerben meghaladta az egymilliót. Azok, akik találkoztak hasonló szolgáltatásokkal, tudják, hogy ez a felhasználói kör korántsem homogén.
Valaki jelentkezett és örökre „elaludt”. Valaki elfelejtette a jelszavát, és hat hónap alatt még néhányszor regisztrált. Valaki pénzt hoz a pénztárba, valaki pedig ingyen jött eszközök. És jó lenne mindenkitől némi haszonra szert tenni.
Ilyen nagy adathalmazokon, mint amilyen a miénk, értelmetlen az egyes felhasználók viselkedésének elemzése és mikrodöntések meghozatala. De a trendek megragadása és a nagy csoportokkal való munka lehetséges és szükséges. Pontosan ezt csináljuk.
összefoglalás
Mi az a kohorszelemzés, és miért van rá szükség?
Hogyan készítsünk kohorszokat a felhasználói regisztráció hónapja szerint az SQL-ben.
Ha már tudja, mi az a kohorszelemzés, és hogyan kell ezt megtenni SQL-ben, ugorjon közvetlenül az utolsó részre.
1. Mi az a kohorszelemzés, és miért van rá szükség?
A kohorszelemzés a felhasználók különböző csoportjainak (kohorszainak) összehasonlításán alapuló módszer. Csoportjaink leggyakrabban azon hét vagy hónap alapján jönnek létre, amikor a felhasználó elkezdte használni a szolgáltatást. Innen számítják ki a felhasználó élettartamát, és ez egy olyan mutató, amely alapján meglehetősen összetett elemzés végezhető el. Például értsd meg:
hogyan befolyásolja az akvizíciós csatorna a felhasználó élettartamát;
hogyan befolyásolja bármely funkció vagy szolgáltatás használata az élettartamot;
Hogyan befolyásolta az X funkció elindítása az élettartamot a tavalyi évhez képest.
2. Hogyan készítsünk kohorszokat SQL-ben?
A cikk mérete és a józan ész nem teszi lehetővé, hogy valós adatainkat itt közöljük - a teszt dumpban, másfél év statisztikája: 1200 felhasználó és 53 ezer tranzakció. Hogy játszhasson ezekkel az adatokkal, elkészítettünk egy docker image-et MySQL-lel és Grafana-val, amelyben mindezt Ön is megtapasztalhatja. Link a GitHubhoz a cikk végén.
És itt bemutatjuk a kohorszok létrehozását egy egyszerűsített példán keresztül.
Tegyük fel, hogy van szolgáltatásunk. A felhasználók ott regisztrálnak, és pénzt költenek a szolgáltatásokra. Idővel a felhasználók kiesnek. Szeretnénk utánajárni, hogy a felhasználók mennyi ideig élnek, és hányan esnek ki a szolgáltatás használatának 1. és 2. hónapja után.
E kérdések megválaszolásához kohorszokat kell felépíteni a regisztráció hónapja alapján. Az aktivitást minden hónapban a kiadásokkal mérjük. A költségek helyett megrendelések, előfizetési díjak, vagy bármilyen más időalapú tevékenység jöhet szóba.
Nyers adatok
A példák MySQL-ben készültek, de más DBMS-ek esetében nem lehetnek jelentős eltérések.
Felhasználói táblázat – felhasználók:
Felhasználói azonosító
Regisztráció dátuma
1
2019-01-01
2
2019-02-01
3
2019-02-10
4
2019-03-01
Költségtábla - számlázás:
Felhasználói azonosító
találka
Összeg
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
Válassza ki az összes felhasználói leírást és a regisztráció dátumát:
SELECT
b.userId,
b.Date,
u.RegistrationDate
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
A kohorszokat hónapok szerint építjük fel; ehhez az összes dátumot hónapra konvertáljuk:
DATE_FORMAT(Date, '%Y-%m')
Most tudnunk kell, hány hónapig volt aktív a felhasználó - ez a különbség a terhelés és a regisztráció hónapja között. A MySQL-nek van egy PERIOD_DIFF() függvénye – ez a különbség két hónap között. PERIOD_DIFF() hozzáadása a kéréshez:
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
Felhasználói azonosító
Számlázási hónap
Regisztráció dátuma
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
Minden hónapban számoljuk az aktivált felhasználókat - a rekordokat BillingMonth, RegistrationMonth és MonthsDiff szerint csoportosítjuk:
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
Eredmény:
UsersCount
Számlázási hónap
Regisztráció hónapja
MonthsDiff
1
2019-01
2019-01
0
1
2019-02
2019-01
1
2
2019-02
2019-02
0
1
2019-03
2019-02
1
1
2019-03
2019-03
0
Januárban, februárban és márciusban egy-egy új felhasználó jelent meg - MonthsDiff = 0. Egy januári felhasználó volt aktív februárban - Regisztrációs hónap = 2019-01, BillingMonth = 2019-02, és egy februári felhasználó volt aktív márciusban.
Természetesen a minták jobban láthatóak egy nagy adathalmazban.
A kohorszok átvitele a Grafanába
Megtanultuk, hogyan kell kohorszokat alkotni, de ha sok a rekord, már nem könnyű elemezni őket. A rekordokat Excelbe exportálhatjuk és gyönyörű táblázatokká formázhatjuk, de ez nem a mi módszerünk!
A kohorszok interaktív grafikonként jeleníthetők meg grafana.
Ehhez hozzáadunk egy másik lekérdezést, hogy az adatokat a Grafana számára megfelelő formátumba konvertáljuk:
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 adattár példával egy MySQL-t és Grafana-t tartalmazó docker-képfájl, amelyet a számítógépén futtathat. Az adatbázis már másfél év demó adatait tartalmazza, 2018 januárjától 2019 júliusáig.