Hur man samlar anvÀndargrupper som diagram i Grafana [+docker-bild med exempel]

Hur man samlar anvÀndargrupper som diagram i Grafana [+docker-bild med exempel]

Hur vi löste visualiseringen av anvÀndarkohorter i Promopult-tjÀnsten med hjÀlp av Grafana.

Promopult – en kraftfull tjĂ€nst med ett stort antal anvĂ€ndare. Under 10 Ă„rs tid har antalet registreringar i systemet överstigit en miljon. De som har stött pĂ„ liknande tjĂ€nster vet att denna stora anvĂ€ndarbas Ă€r lĂ„ngt ifrĂ„n homogen.

Vissa registrerade sig och "somnade" för alltid. Andra glömde sitt lösenord och registrerade sig nÄgra gÄnger under ett halvÄr. En del bidrar med pengar, medan andra kommer för gratistjÀnster. verktyg. Och det vore bra att fÄ nÄgon form av vinst frÄn var och en.

PĂ„ sĂ„ stora datamĂ€ngder som vi har blir det meningslöst att analysera beteendet hos enskilda anvĂ€ndare och fatta mikrobeslut. Men att fĂ„nga trender och arbeta med stora grupper – det kan och bör vi göra. Vilket Ă€r precis vad vi gör.

Sammanfattning

  1. Vad Àr kohortanalys och varför behövs den?
  2. Hur man skapar kohorter baserat pÄ registreringsmÄnaden av anvÀndare i SQL.
  3. Hur man för över kohorter till Grafana.

Om du redan vet vad kohortanalys Àr och hur man gör det i SQL, kan du gÄ direkt till den sista sektionen.

1. Vad Àr kohortanalys och varför behövs den?

Kohortanalys Àr en metod baserad pÄ att jÀmföra olika grupper (kohorter) av anvÀndare. Oftast bildas vÄra grupper utifrÄn den vecka eller mÄnad dÄ anvÀndaren började anvÀnda tjÀnsten. DÀrifrÄn berÀknas anvÀndarens livslÀngd, vilket Àr en indikator som man kan utföra ganska komplex analys baserat pÄ. Till exempel förstÄ:

  • hur kanalen för anvĂ€ndarförvĂ€rv pĂ„verkar anvĂ€ndarens livslĂ€ngd;
  • hur anvĂ€ndningen av en viss funktion eller tjĂ€nst pĂ„verkar livslĂ€ngden;
  • hur lanseringen av funktion X pĂ„verkade livslĂ€ngden jĂ€mfört med förra Ă„ret.

2. Hur gör man kohorter i SQL?

Artikeln och sunt förnuft tillĂ„ter oss inte att presentera vĂ„ra verkliga data hĂ€r – i testdumpen finns statistik för ett och ett halvt Ă„r: 1200 anvĂ€ndare och 53 000 transaktioner. För att du ska kunna experimentera med dessa data har vi förberett en Docker-image med MySQL och Grafana dĂ€r du sjĂ€lv kan utforska allt detta. LĂ€nken till GitHub finns i slutet av artikeln.

HÀr kommer vi att visa hur man skapar kohorter med ett förenklat exempel.

Anta att vi har en tjÀnst. AnvÀndare registrerar sig och spenderar pengar pÄ tjÀnster. Med tiden slutar anvÀndare att anvÀnda tjÀnsten. Vi vill ta reda pÄ hur lÀnge anvÀndare stannar och hur mÄnga som slutar efter den första och andra mÄnaden av anvÀndning.

För att svara pÄ dessa frÄgor behöver vi bygga kohorter baserat pÄ registreringsmÄnad. Aktiviteten mÀts genom utgifter varje mÄnad. IstÀllet för utgifter kan det vara bestÀllningar, abonnemang eller nÄgon annan aktivitet kopplad till tid.

Ursprungliga data

Exemplen Àr gjorda i MySQL, men det borde inte finnas nÄgra betydande skillnader för andra databashanteringssystem.

AnvĂ€ndartabellen — users:

userId
RegistrationDate

1
2019-01-01

2
2019-02-01

3
2019-02-10

4
2019-03-01

Utgiftstabellen — billing:

userId
Datum
Summa

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

Vi vÀljer alla uttag av anvÀndare och registreringsdatum:

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

Resultatet:

userId
Datum
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

Vi bygger kohorter per mÄnad, och för detta omvandlar vi alla datum till mÄnader:

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

Nu behöver vi veta hur mĂ„nga mĂ„nader anvĂ€ndaren har varit aktiv — detta Ă€r skillnaden mellan mĂ„naden för uttaget och mĂ„naden för registreringen. MySQL har funktionen PERIOD_DIFF() — skillnaden mellan tvĂ„ mĂ„nader. Vi lĂ€gger till PERIOD_DIFF() i frĂ„gan:

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

Vi rĂ€knar aktiverade anvĂ€ndare varje mĂ„nad — grupperar poster efter BillingMonth, RegistrationMonth och 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

Resultatet:

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

I januari, februari och mars fick vi en ny anvĂ€ndare vardera — MonthsDiff = 0. En anvĂ€ndare frĂ„n januari var aktiv Ă€ven i februari — RegistrationMonth = 2019-01, BillingMonth = 2019-02, likasĂ„ var en anvĂ€ndare frĂ„n februari aktiv i mars.

Mönster Àr naturligtvis lÀttare att se pÄ en stor datamÀngd.

Hur man överför kohorter till Grafana

Vi har lÀrt oss att forma kohorter, men nÀr posterna blir mÄnga Àr det redan svÄrt att analysera dem. Poster kan exporteras till Excel och skapa vackra tabeller, men det Àr inte vÄr metod!

Kohorter kan visas i form av en interaktiv graf i Grafana.

För detta lÀgger vi till ytterligare en frÄga för att konvertera data till ett format som passar Grafana:

VÄLJ
  DATE_ADD(CONCAT(s.RegistrationMonth, '-01'), INTERVAL s.MonthsDiff MONTH) AS time_sec,
  SUM(s.Users) AS value,
  s.RegistrationMonth AS metric
FRÅN (
  ## gammal frÄga som returnerar kohorter
  VÄLJ 
    COUNT(DISTINCT(b.userId)) AS AnvÀndare, 
    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
  FRÅN billing AS b VÄNSTER JOIN users AS u PÅ b.userId = u.userId
  VAR
    u.RegistrationDate MELLAN '2018-01-01' OCH CURRENT_DATE
  GRUPPERA EFTER 
    BillingMonth, RegistrationMonth, MonthsDiff 
) AS s
GRUPPERA EFTER 
  time_sec, metric

Och vi exporterar data till Grafana.

Exempel pÄ diagram frÄn demoversioner:

Hur man samlar anvÀndargrupper som diagram i Grafana [+docker-bild med exempel]

Att kÀnna pÄ det:

GitHub-repository med exemplet — Ă€r en docker-bild med MySQL och Grafana som kan köras pĂ„ din dator. Databasen har redan demodata frĂ„n ett och ett halvt Ă„r, frĂ„n januari 2018 till juli 2019.

Om sÄ önskas kan du ladda upp dina egna data i denna bild.

P.S. Artiklar om kohortanalys i SQL:

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

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

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster