![Hur man samlar anvÀndargrupper som diagram i Grafana [+docker-bild med exempel]](/wp-content/uploads/2019/08/293a4d703ef9e7e69ee414be16217f1d.jpeg)
Hur vi löste visualiseringen av anvÀndarkohorter i Promopult-tjÀnsten med hjÀlp av Grafana.
â 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. . 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
- Vad Àr kohortanalys och varför behövs den?
- Hur man skapar kohorter baserat pÄ registreringsmÄnaden av anvÀndare i SQL.
- Hur man för över kohorter till .
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 .
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 :
![Hur man samlar anvÀndargrupper som diagram i Grafana [+docker-bild med exempel]](/wp-content/uploads/2019/08/9aa161a1d0e8fd7790875d4f12202d56.jpeg)
Att kÀnna pÄ det:
â Ă€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:
KĂ€lla: habr.com
