Vi anser att det Ă€r viktigt att förstĂ„ vad som hĂ€nder med vĂ„ra studenter under utbildningen och hur dessa hĂ€ndelser pĂ„verkar resultatet. DĂ€rför bygger vi en Customer Journey Map â en karta över kundupplevelsen. Utbildningsprocessen Ă€r inte en kontinuerlig och enhetlig process utan en kedja av sammanlĂ€nkade hĂ€ndelser och studentens handlingar, dĂ€r dessa handlingar kan variera kraftigt mellan olika elever. Han har genomfört lektionen: vad gör han hĂ€rnĂ€st? Kommer han att gĂ„ vidare till lĂ€xan? Ska han starta mobilappen? Kommer han att byta kurs, be om en ny lĂ€rare? GĂ„r han direkt till nĂ€sta lektion? Eller kommer han bara att lĂ€mna besviken? Kan vi genom att analysera denna karta identifiera mönster som leder till en framgĂ„ngsrik kursavslutning eller tvĂ€rtom, en elev som âfaller bortâ?

Vanligtvis anvĂ€nds specialiserade, ganska kostsamma verktyg med stĂ€ngd kod för att bygga CJM. Men vi ville komma pĂ„ nĂ„got enkelt, som krĂ€ver minimala anstrĂ€ngningar och som i möjligaste mĂ„n Ă€r öppen kĂ€llkod. SĂ„ föddes idĂ©n att anvĂ€nda Markovkedjor â och vi lyckades. Vi byggde en karta, tolkade data om studenternas beteende i form av en graf, sĂ„g helt ovisade svar pĂ„ globala affĂ€rsfrĂ„gor och till och med hittade djupt begravda buggar. Allt detta gjorde vi med hjĂ€lp av öppen kĂ€llkods-lösningar i Python-skript. I den hĂ€r artikeln kommer jag att berĂ€tta om tvĂ„ fall med just dessa ovisade resultat och dela skriptet med alla intresserade.
SÄ, Markovkedjor visar sannolikheterna för övergÄngar mellan hÀndelser. HÀr Àr ett enkelt exempel frÄn Wikipedia:

HÀr representerar "E" och "A" hÀndelserna, pilarna representerar övergÄngarna mellan dem (inklusive övergÄngar frÄn en hÀndelse till sig sjÀlv), och vikterna pÄ pilarna representerar sannolikheten för övergÄngen ("vikta riktade grafer").
Vad som anvÀndes
Kedjan trÀnades med standardfunktioner i Python, dÀr loggar över studenternas aktivitet matades in. Grafen pÄ den resulterande matrisen byggdes med biblioteket NetworkX.
Loggen ser ut sÄ hÀr:

Detta Àr en csv-fil som innehÄller en tabell med tre kolumner: studentens id, hÀndelsens namn, tidpunkten nÀr den intrÀffade. Dessa tre fÀlt Àr tillrÀckliga för att spÄra kundens rörelser, bygga en karta och slutligen skapa en Markovkedja.
Biblioteket returnerar byggda grafer i .dot eller .gexf-format. För visualisering av det första kan man anvÀnda det kostnadsfria paketet Graphviz (verktyget gvedit). Vi har arbetat med .gexf och Gephi, som ocksÄ Àr kostnadsfritt.
DÀrefter vill jag ge tvÄ exempel pÄ anvÀndningen av Markovkedjor som har gjort att vi har fÄtt en ny syn pÄ vÄra mÄl, inlÀrningsprocesser och sjÀlva ekosystemet Skyeng. Och ocksÄ rÀttat till buggar.
Första fallet: mobilapplikationen
Till att börja med undersökte vi studentens vĂ€g genom vĂ„r mest populĂ€ra produkt â kursen General. Vid den tidpunkten arbetade jag i Skyengs barnavdelning och vi ville se hur effektivt mobilapplikationen fungerar med vĂ„r barnaudience.
Jag tog loggar och körde dem genom ett skript, och fick nÄgot sÄdant:
Startknut â Start General, och lĂ€ngst ner tre utgĂ„ende noder: eleven "somnade", bytte kurs, avslutade kursen.
- Fell asleep, "Somnade" â vilket betyder att han inte lĂ€ngre deltar i lektioner, troligtvis har han försvunnit. Vi kallar optimistiskt detta tillstĂ„nd "somnade", eftersom han teoretiskt fortfarande har möjlighet att fortsĂ€tta lĂ€ra sig. Det sĂ€msta resultatet för oss.
- Dropped general, Bytte kurs â gick frĂ„n General till nĂ„got annat och gick förlorad för vĂ„r Markovkedja.
- Finished course, Avslutade kursen â det ideala tillstĂ„ndet, personen har genomfört 80% av lektionerna (inte alla lektioner Ă€r obligatoriska).
Att hamna i noden successful class innebĂ€r att lektionen har genomförts framgĂ„ngsrikt pĂ„ vĂ„r plattform tillsammans med lĂ€raren. Det registrerar framsteg i kursen och nĂ€rmar sig önskat resultat â "Avslutade kursen". Det Ă€r viktigt för oss att studenterna deltar sĂ„ mycket som möjligt.
För att fÄ mer exakta kvantitativa resultat för mobilapplikationen (noden app session) byggde vi separata kedjor för varje slutnod och jÀmförde sedan vikterna pÄ kanterna parvis:
- frÄn app session tillbaka till sig sjÀlv;
- frÄn app session till successful class;
- frÄn successful class till app session.
Till vĂ€nster â studenter som avslutat kursen, till höger â "somnat"
Dessa tre kanter visar sambandet mellan studentens framgÄng och anvÀndningen av mobilapplikationen. Vi förvÀntade oss att se att avslutande studenter skulle ha en starkare koppling till applikationen Àn de "somnat". Men verkligheten visade sig vara helt motsatt:
- vi kunde konstatera att olika grupper av anvÀndare interagerar pÄ olika sÀtt med mobilapplikationen;
- FramgÄngsrika studenter anvÀnder mobilappen mindre intensivt;
- Sovande studenter anvÀnder mobilappen mer aktivt.
Det betyder att "sovande" studenter börjar spendera mer och mer tid i mobilappen och till slut stannar de dÀr för alltid.

Först blev vi förvÄnade, men efter att ha tÀnkt efter insÄg vi att det Àr en helt rimlig effekt. Jag studerade franska pÄ egen hand en gÄng i tiden, med hjÀlp av tvÄ verktyg: mobilappen och grammatikförelÀsningar pÄ YouTube. I början delade jag tiden mellan dem i en 50/50-fördelning. Men appen Àr roligare, den har gamification, allt Àr enkelt, snabbt och klart, medan förelÀsningar krÀver att man gÄr in i detaljer, skriver ner saker och övar i anteckningsblock. SÄ smÄningom började jag spendera mer tid pÄ min smartphone, tills andelen nÄdde 100%: om man sitter i den i tre timmar ger det en falsk kÀnsla av att man har utfört arbete, vilket gör att man inte har nÄgot initiativ att gÄ och lyssna pÄ nÄgot.
Men hur kan det vara sÄ? Vi skapade ju faktiskt mobilappen, , gamifierade den, gjorde den attraktiv sÄ att folk skulle spendera tid dÀr, men det verkar som att den bara distraherar dem? Egentligen Àr anledningen att teamet bakom mobilappen hanterade sina uppgifter sÄ bra, att den blev en riktigt bra sjÀlvstÀndig produkt och började falla ut ur vÄrt ekosystem.
Som ett resultat av undersökningen kom vi fram till att mobilappen mÄste förÀndras pÄ nÄgot sÀtt för att den inte ska dra för mycket frÄn de centrala utbildningskurserna. Detta gÀller bÄde barn och vuxna. Det arbetet pÄgÄr nu.
Andra fallet: onboarding-buggar
Onboarding Àr en valfri procedur vid registreringen av en ny elev, som avlÀgsnar potentiella tekniska problem i framtiden. Det grundlÀggande scenariot innebÀr att en person registrerar sig pÄ landningssidan, fÄr tillgÄng till sitt personliga konto, blir kontaktad och genomgÄr en introduktionslektion. Vi noterar dock en hög procentandel tekniska svÄrigheter under introduktionslektionen: fel version av webblÀsaren, mikrofonen fungerar inte eller ljudet Àr borta, lÀraren kan inte omedelbart ge en lösning, och allt detta Àr sÀrskilt svÄrt nÀr det handlar om barn. DÀrför har vi utvecklat en ytterligare applikation i det personliga kontot, dÀr man kan genomföra fyra enkla steg: kontrollera webblÀsaren, kameran, mikrofonen och bekrÀfta att förÀldrarna kommer att vara nÀrvarande under introduktionslektionen (eftersom det Àr de som betalar för barnens utbildning).
Dessa nÄgra sidor av onboarding visade en sÄdan tratt:
1: startblock med tre nÄgot olika (beroende pÄ klienten) inloggning-formulÀr för anvÀndarnamn-lösenord.
2: kryssruta för godkÀnnande av den ytterligare onboarding-proceduren.
2.1-2.3: kontroll av nÀrvaro av förÀlder, Chrome-version och ljud.
3: avslutande block.
Det ser mycket naturligt ut: pÄ de tvÄ första stegen faller majoriteten av besökarna bort, dÄ de inser att de behöver fylla i nÄgot, kontrollera och att de inte har tid. Om klienten har kommit till det tredje steget Àr det nÀstan sÀkert att de gÄr hela vÀgen till slutet. I tratten syns ingen anledning att misstÀnka nÄgot.
ĂndĂ„ beslutade vi att analysera vĂ„r onboarding inte pĂ„ den klassiska endimensionella tratten, utan med hjĂ€lp av en Markovkedja. Vi inkluderade lite fler hĂ€ndelser, körde skriptet och fick fram detta:
Det gÄr entydigt att förstÄ i detta kaos att nÄgot har gÄtt fel. Onboardingprocessen Àr linjÀr, det Àr inbyggt i designen, och den borde inte ha ett sÄdant nÀt av kopplingar. HÀr ser man omedelbart att anvÀndaren kastas mellan stegen som inte borde ha nÄgra övergÄngar.

Det kan finnas tvÄ orsaker till denna mÀrkliga bild:
- fel har smugit sig in i loggdatabasen;
- fel finns i sjĂ€lva produkten â onboarding.
Den första orsaken Ă€r förmodligen nĂ€rvarande, men att kontrollera den Ă€r ganska arbetskrĂ€vande, och att fixa loggarna hjĂ€lper inte alls med att förbĂ€ttra UX. Men angĂ„ende den andra, om den finns, var vi tvungna att agera snabbt. DĂ€rför gick vi igenom noder, identifierade kanter som inte skulle finnas, och sökte orsaker till deras uppkomst. Vi sĂ„g att vissa anvĂ€ndare fastnade och gick i cirklar, andra hoppade frĂ„n mitten till början, medan tredje gruppen i princip inte kunde ta sig förbi de första tvĂ„ stegen. Vi skickade data till QA â och ja, det visade sig att det fanns en hel del buggar i onboarding-processen: det Ă€r en slags biprodukt, lite av en nödlösning, den har inte testats tillrĂ€ckligt djupt, eftersom vi inte förvĂ€ntade oss nĂ„gra problem. Nu har hela inspelningsprocessen Ă€ndrats.
Denna historia visade oss en ovÀntad tillÀmpning av Markov-kedjor inom QA.
Testa sjÀlv!
Jag har publicerat min öppet för allmĂ€nheten â anvĂ€nd det gĂ€rna. Dokumentationen finns pĂ„ GitHub, frĂ„gor kan stĂ€llas hĂ€r, jag ska försöka svara pĂ„ allt.
Och nÄgra anvÀndbara lÀnkar: , . Och hÀr om Markov-kedjor. Grafikerna i artikeln Àr gjorda med hjÀlp av .
KĂ€lla: habr.com
