Kuidas koguda kasutajagruppe graafikute kujul Grafanas [+docker-pilt nÀidisega]

Kuidas koguda kasutajagruppe graafikute kujul Grafanas [+docker-pilt nÀidisega]

Kuidas me lahendasime kasutajate cohortide visualiseerimise ĂŒlesande Promopult teenuses Grafana abil.

Promopult on vĂ”imas teenus, millel on suur kasutajaskond. KĂŒmne aasta jooksul on sĂŒsteemi registreerimiste arv ĂŒletanud miljoni. Need, kes on selliste teenustega kokku puutunud, teavad, et see kasutajaskond pole kaugeltki ĂŒhtlane.

MĂ”ned registreerusid ja jĂ€id igaveseks unustusse. MĂ”ned unustasid oma parooli ja registreerusid paar korda kuue kuu jooksul taas. MĂ”ni toob raha kassasse, samas kui teised tulid tasuta tööriistu. Ja oleks hea, kui igaĂŒks sellest mingit kasu tooks.

Nii suurte andmehulkade puhul nagu meil on, pole mĂ”tet analĂŒĂŒsida ĂŒksikute kasutajate kĂ€itumist ja teha mikrootsuseid. Kuid trende kinni pĂŒĂŒda ja töötada suurte gruppidega on vĂ”imalik ja vajalik. Just seda me teeme.

KokkuvÔte

  1. Mis on cohortide analĂŒĂŒs ja milleks see vajalik on.
  2. Kuidas luua kogruppe registreerimiskuu pÔhjal SQL-is.
  3. Kuidas viia kogrupid ĂŒle Grafana.

Kui tead juba, mis on cohortide analĂŒĂŒs ja kuidas seda SQL-is teha, mine kohe viimasesse jaotisse.

1. Mis on cohortide analĂŒĂŒs ja milleks see vajalik on

Cohortide analĂŒĂŒs on meetod, mis pĂ”hineb erinevate kasutajate rĂŒhmade (cohortide) vĂ”rdlemisel. Enamasti moodustame me rĂŒhmad registreerimisnĂ€dala vĂ”i -kuu jĂ€rgi, mil kasutaja hakkas teenust kasutama. Selle alusel arvutatakse kasutaja eluiga, mis on juba nĂ€itaja, mille pĂ”hjal saab teha ĂŒsna keerukat analĂŒĂŒsi. NĂ€iteks, et mĂ”ista:

  • kuidas mĂ”jutab kaasamise kanal kasutaja eluiga;
  • kuidas mĂ”jutab mĂ”ne funktsiooni vĂ”i teenuse kasutamine eluiga;
  • kuidas mĂ”jutas funktsiooni X kĂ€ivitamine eluiga vĂ”rreldes eelmise aastaga.

2. Kuidas luua kogruppe SQL-is?

Artikli mahud ja mĂ”istlikud argumendid ei vĂ”imalda meil tuua siia meie reaalseid andmeid — testdumpis on statistika pooleteise aasta jooksul: 1200 kasutajat ja 53 000 tehingut. Et saaksite nende andetega mĂ€ngida, oleme ette valmistanud docker-pildi MySQL ja Grafana jaoks, milles saate kĂ”ike ise katsetada. Link GitHubi lehele leiab artikli lĂ”pust.

Siin nÀitame kogruppe loomist lihtsustatud nÀite abil.

Oletame, et meil on teenus. Selles registreeruvad kasutajad ja kulutavad raha teenustele. Aja jooksul kaotavad kasutajad huvi. Me tahame teada, kui kaua kasutajad pĂŒsivad ja kui palju neist loobub pĂ€rast 1. ja 2. kuu kasutamist teenusest.

Nendele kĂŒsimustele vastamiseks peame koostama kooti registreerimise kuu jĂ€rgi. Aktiviteeti mÔÔdame igakuistelt kuludelt. Kulude asemel vĂ”ivad olla tellimused, liikmemaksud vĂ”i muu ajaga seotud tegevus.

Algandmed

NĂ€ited on tehtud MySQL-is, kuid teiste andmebaasisĂŒsteemide vahel ei tohiks olla olulisi erinevusi.

Kasutajate tabel — users:

userId
RegistrationDate

1
2019-01-01

2
2019-02-01

3
2019-02-10

4
2019-03-01

Kulu tabel — billing:

userId
, samuti veel mustandina olev API
Sum

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

Valime kÔik kasutajate kanded ja registreerimise kuupÀeva:

SELECT 
  b.userId, 
  b.Date,
  u.RegistrationDate
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId

Tulemus:

userId
, samuti veel mustandina olev API
RegistrationDate

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

Kogume koote kuude kaupa, selleks muundame kÔik kuupÀevad kuudeks:

DATE_FORMAT(Date, '%Y-%m')

NĂŒĂŒd peame teadma, kui palju kuude jooksul kasutaja aktiivne oli — see on vahe kulutamiskuu ja registreerimise kuu vahel. MySQL-is on funktsioon PERIOD_DIFF() — kahe kuu vahe. Lisame PERIOD_DIFF() pĂ€ringusse:

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

userId
BillingMonth
RegistrationDate
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

Loeme igas kuus aktiveerunud kasutajad — grupeerime kirjed BillingMonth, RegistrationMonth ja MonthsDiff pĂ”hjal:

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

Tulemus:

UsersCount
BillingMonth
RegistrationMonth
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

Jaanuaris, veebruaris ja mĂ€rtsis ilmus igas kuus ĂŒks uus kasutaja — MonthsDiff = 0. Üks jaanuari kasutaja oli aktiivne ka veebruaris — RegistrationMonth = 2019-01, BillingMonth = 2019-02, samuti oli ĂŒks veebruari kasutaja aktiivne mĂ€rtsis.

Suurte andmehulkade puhul on mustrid loomulikult paremini nÀhtavad.

Kuidas kooted Grafanas kuvada

Kooted oskasime koostada, kuid kui kirjeid on palju, on neid raske analĂŒĂŒsida. Kirjed saab eksportida Excelisse ja luua ilusaid tabeleid, kuid see ei ole meie meetod!

Kooted saab esitada interaktiivse graafikuna. Grafana.

Selleks lisame veel ĂŒhe pĂ€ringu, et muuta andmed Grafana jaoks sobivaks:

VALI
  DATE_ADD(CONCAT(s.RegistrationMonth, '-01'), INTERVAL s.MonthsDiff MONTH) AS time_sec,
  SUM(s.Users) AS value,
  s.RegistrationMonth AS metric
FROM (
  ## vana pÀring, mis tagastab kogumid
  VALI 
    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

Ja eksportime andmed Grafanasse.

NĂ€ide graafikust demo:

Kuidas koguda kasutajagruppe graafikute kujul Grafanas [+docker-pilt nÀidisega]

KĂ€eotsaga katsuda:

GitHubi hoidla nĂ€itega — see on docker-pilt MySQL ja Grafana, mida saab oma arvutis kĂ€ivitada. Andmebaasis on juba poolteise aasta demonĂ€idised, jaanuar 2018 kuni juuli 2019.

Soovi korral saab sellesse pildisse laadida oma andmed.

P.S. Artiklid SQL-iga kogumite analĂŒĂŒsi kohta:

https://chartio.com/resources/tutorials/performing-cohort-analysis-using-mysql/

https://www.holistics.io/blog/calculate-cohort-retention-analysis-with-sql/

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster