{"id":39546,"date":"2019-10-31T22:35:27","date_gmt":"2019-10-31T19:35:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python\/"},"modified":"2019-10-31T22:35:27","modified_gmt":"2019-10-31T19:35:27","slug":"kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python","title":{"rendered":"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Wa\u017cne jest, aby zrozumie\u0107, co dzieje si\u0119 z naszymi studentami podczas nauki i jak te wydarzenia wp\u0142ywaj\u0105 na wyniki, dlatego tworzymy Customer Journey Map \u2014 map\u0119 do\u015bwiadcze\u0144 klient\u00f3w. Proces nauki nie jest czym\u015b ci\u0105g\u0142ym i jednolitym, jest to ci\u0105g powi\u0105zanych wydarze\u0144 i dzia\u0142a\u0144 studenta, a te dzia\u0142ania mog\u0105 si\u0119 znacznie r\u00f3\u017cni\u0107 w zale\u017cno\u015bci od ucznia. Oto przeszed\u0142 lekcj\u0119: co zrobi dalej? Przejdzie do zadania domowego? Uruchomi aplikacj\u0119 mobiln\u0105? Zmieni kierunek, poprosi o zmian\u0119 nauczyciela? Od razu wejdzie na nast\u0119pn\u0105 lekcj\u0119? A mo\u017ce po prostu odejdzie rozczarowany? Czy analizuj\u0105c t\u0119 map\u0119, mo\u017cna zidentyfikowa\u0107 wzorce prowadz\u0105ce do pomy\u015blnego uko\u0144czenia kursu lub, przeciwnie, \u201eodpadni\u0119cia\u201d studenta?<\/p>\n<p><img decoding=\"async\" alt=\"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie\" src=\"\/wp-content\/uploads\/2019\/10\/3eaee2e858273669b4490f6ceb65d281.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZazwyczaj do budowania CJM u\u017cywa si\u0119 wyspecjalizowanych, bardzo drobnych narz\u0119dzi z zamkni\u0119tym kodem. Ale chcieli\u015bmy wymy\u015bli\u0107 co\u015b prostego, wymagaj\u0105cego minimalnych wysi\u0142k\u00f3w i w miar\u0119 mo\u017cliwo\u015bci open source. Tak powsta\u0142 pomys\u0142 wykorzystania \u0142a\u0144cuch\u00f3w Markowa \u2014 i uda\u0142o nam si\u0119 to. Zbudowali\u015bmy map\u0119, zinterpretowali\u015bmy dane o zachowaniu student\u00f3w w formie grafu, dostrzegli\u015bmy zupe\u0142nie nieoczywiste odpowiedzi na globalne pytania biznesowe i nawet znale\u017ali\u015bmy g\u0142\u0119boko ukryte b\u0142\u0119dy. Wszystko to zrobili\u015bmy przy pomocy rozwi\u0105za\u0144 open source w skrypcie Pythona. W tym artykule opowiem o dw\u00f3ch przypadkach z tymi samymi nieoczywistymi wynikami i podziel\u0119 si\u0119 skryptem z wszystkimi zainteresowanymi.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nZatem, \u0142a\u0144cuchy Markowa pokazuj\u0105 prawdopodobie\u0144stwo przej\u015b\u0107 mi\u0119dzy zdarzeniami. Oto prymitywny przyk\u0142ad z Wikipedii:<\/p>\n<p><img decoding=\"async\" alt=\"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie\" src=\"\/wp-content\/uploads\/2019\/10\/978e18169ba4c7b2b71787536e4bb219.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTutaj \u00abE\u00bb i \u00abA\u00bb to zdarzenia, strza\u0142ki to przej\u015bcia mi\u0119dzy nimi (w tym przej\u015bcie z wydarzenia do tego samego wydarzenia), a wagi strza\u0142ek to prawdopodobie\u0144stwo przej\u015bcia (\u00abwa\u017cony graf skierowany\u00bb).<\/p>\n<h2>Co u\u017cyto<\/h2>\n<p>\n\u0141a\u0144cuch uczy\u0142 si\u0119 standardow\u0105 funkcjonalno\u015bci\u0105 Pythona, kt\u00f3rej dostarczano logi aktywno\u015bci student\u00f3w. Graf na otrzymanej macierzy zbudowano przy pomocy biblioteki NetworkX.<\/p>\n<p>Log wygl\u0105da tak:<\/p>\n<p><img decoding=\"async\" alt=\"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie\" src=\"\/wp-content\/uploads\/2019\/10\/bc75077802cd7eeb00ebe4a56bc61050.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJest to plik csv zawieraj\u0105cy tabel\u0119 z trzema kolumnami: id studenta, nazwa zdarzenia, czas, kiedy ono wyst\u0105pi\u0142o. Te trzy pola s\u0105 wystarczaj\u0105ce, aby \u015bledzi\u0107 ruchy klienta, zbudowa\u0107 map\u0119 i ostatecznie uzyska\u0107 \u0142a\u0144cuch Markowa.<\/p>\n<p>Biblioteka zwraca zbudowane grafy w formacie .dot lub .gexf. Do wizualizacji pierwszych mo\u017cna wykorzysta\u0107 darmowy pakiet Graphviz (narz\u0119dzie gvedit), pracowali\u015bmy z .gexf i Gephi, r\u00f3wnie\u017c darmowym.<\/p>\n<p>Nast\u0119pnie chcia\u0142bym przedstawi\u0107 dwa przyk\u0142ady zastosowania \u0142a\u0144cuch\u00f3w Markowa, kt\u00f3re pozwoli\u0142y nam spojrze\u0107 na nasze cele, procesy edukacyjne i sam\u0105 ekosystem Skyeng w nowy spos\u00f3b. No i poprawi\u0107 b\u0142\u0119dy.<\/p>\n<h2>Pierwszy przypadek: aplikacja mobilna<\/h2>\n<p>\nNa pocz\u0105tek zbadali\u015bmy \u015bcie\u017ck\u0119 studenta w naszym najpopularniejszym produkcie \u2014 kursie General. W tamtym czasie pracowa\u0142em w dzieci\u0119cym dziale Skyeng i chcieli\u015bmy zobaczy\u0107, jak efektywnie dzia\u0142a aplikacja mobilna w\u015br\u00f3d naszej dzieci\u0119cej publiczno\u015bci.<\/p>\n<p>Pobra\u0142em logi i przeszed\u0142em je przez skrypt, otrzyma\u0142em co\u015b takiego:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/ws\/ru\/de\/wsrudeufw3pzwrrxtxtn1pjeqvu.png\"><img decoding=\"async\" alt=\"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie\" src=\"\/wp-content\/uploads\/2019\/10\/f2533ddfae7d5f85d0e86902b9b7005f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>W\u0119ze\u0142 startowy \u2014 Start General, a na dole trzy w\u0119z\u0142y wyj\u015bciowe: ucze\u0144 \"zasn\u0105\u0142\", zmieni\u0142 kurs, zako\u0144czy\u0142 kurs.<\/p>\n<ul>\n<li>Fell asleep, \"Zasn\u0105\u0142\" \u2014 oznacza to, \u017ce przesta\u0142 uczestniczy\u0107 w zaj\u0119ciach, prawdopodobnie si\u0119 wycofa\u0142. Optymistycznie nazywamy ten stan \"zasn\u0105\u0142\", poniewa\u017c teoretycznie ma jeszcze szans\u0119 kontynuowa\u0107 nauk\u0119. Najgorszy wynik dla nas.<\/li>\n<li>Dropped general, Zmieni\u0142 kurs \u2014 przeszed\u0142 z General na co\u015b innego i zagin\u0105\u0142 w naszym \u0142a\u0144cuchu Markowa.<\/li>\n<li>Finished course, Zako\u0144czy\u0142 kurs \u2014 idealny stan, osoba uko\u0144czy\u0142a 80% lekcji (nie wszystkie lekcje s\u0105 obowi\u0105zkowe).<\/li>\n<\/ul>\n<p>\nDostanie si\u0119 do w\u0119z\u0142a successful class oznacza pomy\u015blne zako\u0144czenie lekcji na naszej platformie z nauczycielem. Rejestruje post\u0119p w kursie i zbli\u017cenie do po\u017c\u0105danego wyniku \u2014 \"Zako\u0144czy\u0142 kurs\". Wa\u017cne jest dla nas, aby studenci odwiedzali go jak najcz\u0119\u015bciej.<\/p>\n<p>Aby uzyska\u0107 dok\u0142adniejsze ilo\u015bciowe wnioski dotycz\u0105ce aplikacji mobilnej (w\u0119ze\u0142 app session), zbudowali\u015bmy osobne \u0142a\u0144cuchy dla ka\u017cdego z ko\u0144cowych w\u0119z\u0142\u00f3w, a nast\u0119pnie por\u00f3wnali\u015bmy parami wagi kraw\u0119dzi:<\/p>\n<ul>\n<li>z app session z powrotem do niej samej;<\/li>\n<li>z app session do successful class;<\/li>\n<li>z successful class do app session.<\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/iw\/mz\/yq\/iwmzyqmlmbkgzmjqa7qhxwd7shq.png\"><img decoding=\"async\" alt=\"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie\" src=\"\/wp-content\/uploads\/2019\/10\/fc68ca73b379f57a38b53f0c31e75cb1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<i>Po lewej \u2014 studenci, kt\u00f3rzy zako\u0144czyli kurs, po prawej \u2014 \u201ezasn\u0105wszy\u201d<\/i><\/p>\n<p>Te trzy kraw\u0119dzie pokazuj\u0105 zwi\u0105zek mi\u0119dzy sukcesem studenta a korzystaniem z aplikacji mobilnej. Spodziewali\u015bmy si\u0119 zobaczy\u0107, \u017ce u student\u00f3w, kt\u00f3rzy uko\u0144czyli kurs, zwi\u0105zek z aplikacj\u0105 b\u0119dzie silniejszy ni\u017c u \u201ezasn\u0105wszy\u201d. Jednak w rzeczywisto\u015bci uzyskali\u015bmy dok\u0142adnie odwrotne wyniki:<\/p>\n<ul>\n<li>przekonali\u015bmy si\u0119, \u017ce r\u00f3\u017cne grupy u\u017cytkownik\u00f3w r\u00f3\u017cnie oddzia\u0142uj\u0105 z aplikacj\u0105 mobiln\u0105;<\/li>\n<li>bardziej udani studenci rzadziej korzystaj\u0105 z aplikacji mobilnej;<\/li>\n<li>uczniowie przychodz\u0105cy do siebie u\u017cywaj\u0105 aplikacji mobilnej bardziej aktywnie.<\/li>\n<\/ul>\n<p>\nTo oznacza, \u017ce \u201euczniowie przychodz\u0105cy do siebie\u201d zaczynaj\u0105 coraz wi\u0119cej czasu sp\u0119dza\u0107 w aplikacji mobilnej i ostatecznie pozostaj\u0105 w niej na zawsze.<\/p>\n<p><img decoding=\"async\" alt=\"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie\" src=\"\/wp-content\/uploads\/2019\/10\/45c17a908e2178edd99e340f34657cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa pocz\u0105tku byli\u015bmy zaskoczeni, ale po namy\u015ble zrozumieli\u015bmy, \u017ce to jest w pe\u0142ni uzasadniony efekt. Kiedy\u015b samodzielnie uczy\u0142em si\u0119 francuskiego, korzystaj\u0105c z dw\u00f3ch narz\u0119dzi: aplikacji mobilnej oraz wyk\u0142ad\u00f3w z gramatyki na YouTube. Pocz\u0105tkowo dzieli\u0142em czas mi\u0119dzy nimi w proporcji 50 do 50. Ale aplikacja by\u0142a bardziej interesuj\u0105ca, mia\u0142a gamifikacj\u0119, wszystko by\u0142o proste, szybkie i jasne, a wyk\u0142ady wymaga\u0142y zaanga\u017cowania, zapisywania i \u0107wiczenia w zeszycie. Z biegiem czasu zacz\u0105\u0142em sp\u0119dza\u0107 wi\u0119cej czasu na smartfonie, a\u017c jego udzia\u0142 wzr\u00f3s\u0142 do 100%: je\u015bli sp\u0119dz\u0119 na nim trzy godziny, tworz\u0119 fa\u0142szywe poczucie wykonanej pracy, przez co nie mam \u017cadnej ch\u0119ci, aby p\u00f3j\u015b\u0107 i czego\u015b pos\u0142ucha\u0107.<\/p>\n<p>Ale jak to mo\u017cliwe? Przecie\u017c specjalnie stworzyli\u015bmy aplikacj\u0119 mobiln\u0105, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skyeng\/blog\/312126\/\">wbudowali\u015bmy w ni\u0105 krzyw\u0105 Ebbinghausa,<\/a><\/noindex>, zrobili\u015bmy j\u0105 atrakcyjn\u0105, aby ludzie sp\u0119dzali w niej czas, a to okazuje si\u0119, \u017ce jedynie ich rozprasza? W rzeczywisto\u015bci przyczyna tkwi w tym, \u017ce zesp\u00f3\u0142 aplikacji mobilnej zbyt dobrze poradzi\u0142 sobie ze swoimi zadaniami, w efekcie czego sta\u0142a si\u0119 ona \u015bwietnym, samodzielnym produktem i zacz\u0119\u0142a wypada\u0107 z naszego ekosystemu.<\/p>\n<p>W wyniku bada\u0144 doszli\u015bmy do wniosku, \u017ce aplikacj\u0119 mobiln\u0105 trzeba jako\u015b zmieni\u0107, aby mniej odci\u0105ga\u0142a od g\u0142\u00f3wnego kursu nauczania. Dotyczy to zar\u00f3wno dzieci, jak i doros\u0142ych. Aktualnie prace w tym kierunku s\u0105 prowadzone.<\/p>\n<h2>Drugi przypadek: b\u0142\u0119dy w onboarding.<\/h2>\n<p>\nOnboarding to opcjonalna dodatkowa procedura przy rejestracji nowego ucznia, kt\u00f3ra eliminuje potencjalne problemy techniczne w przysz\u0142o\u015bci. Podstawowy scenariusz zak\u0142ada, \u017ce osoba zarejestrowa\u0142a si\u0119 na stronie, uzyska\u0142a dost\u0119p do swojego konta, kontaktuje si\u0119 z ni\u0105 i przeprowadza wprowadzenie. Przy tym zauwa\u017camy wysoki procent trudno\u015bci technicznych podczas wprowadzenia: niew\u0142a\u015bciwa wersja przegl\u0105darki, nie dzia\u0142a mikrofon lub d\u017awi\u0119k, nauczyciel nie mo\u017ce od razu poda\u0107 rozwi\u0105zania, a wszystko to jest szczeg\u00f3lnie trudne, je\u015bli chodzi o dzieci. Dlatego opracowali\u015bmy dodatkow\u0105 aplikacj\u0119 w osobistym koncie, gdzie mo\u017cna wykona\u0107 cztery proste kroki: sprawdzi\u0107 przegl\u0105dark\u0119, kamer\u0119, mikrofon i potwierdzi\u0107, \u017ce rodzice b\u0119d\u0105 obok podczas lekcji wprowadzaj\u0105cej (w ko\u0144cu to oni p\u0142ac\u0105 za edukacj\u0119 dzieci).<\/p>\n<p>Te kilka stron onboardingu pokazuje tak\u0105 lejek:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/l5\/pt\/aj\/l5ptajlgx6msydvswctke1w505w.jpeg\"><img decoding=\"async\" alt=\"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie\" src=\"\/wp-content\/uploads\/2019\/10\/5e949640d4d4f8a70dc4fd677e3c93a7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<i>1: blok startowy z trzema nieco r\u00f3\u017cnymi (w zale\u017cno\u015bci od klienta) formularzami logowania.<br \/>\n2: zaznaczenie zgody na dodatkow\u0105 procedur\u0119 onboardingu.<br \/>\n2.1-2.3: sprawdzenie obecno\u015bci rodzica, wersji Chrome i d\u017awi\u0119ku.<br \/>\n3: blok ko\u0144cowy.<\/i><\/p>\n<p>Wygl\u0105da to bardzo naturalnie: na pierwszych dw\u00f3ch krokach wi\u0119ksza cz\u0119\u015b\u0107 odwiedzaj\u0105cych odpada, zdaj\u0105c sobie spraw\u0119, \u017ce musz\u0105 co\u015b wype\u0142nia\u0107, sprawdza\u0107, a nie maj\u0105 na to czasu. Je\u015bli klient dotrze do trzeciego kroku \u2014 dalej prawie na pewno dotrze do ko\u0144ca. W lejek nie wida\u0107 \u017cadnej przyczyny, aby co\u015b podejrzewa\u0107.<\/p>\n<p>Mimo to postanowili\u015bmy przeanalizowa\u0107 nasz onboarding nie na klasycznym jednoznacznym lejku, ale za pomoc\u0105 \u0142a\u0144cucha Markowa. W\u0142\u0105czyli\u015bmy troch\u0119 wi\u0119cej wydarze\u0144, uruchomili\u015bmy skrypt i uzyskali\u015bmy co\u015b takiego:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/pi\/e6\/9p\/pie69p-4rmwaqdqqunigm3oz8am.png\"><img decoding=\"async\" alt=\"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie\" src=\"\/wp-content\/uploads\/2019\/10\/44c094cb0be013beac00c0af5a3801be.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Jedno jest pewne w tym chaosie: co\u015b posz\u0142o nie tak. Proces onboardingu jest liniowy, to jest zaprojektowane, nie powinno by\u0107 takiej sieci po\u0142\u0105cze\u0144. A tutaj od razu wida\u0107, \u017ce u\u017cytkownik jest miotany pomi\u0119dzy krokami, pomi\u0119dzy kt\u00f3rymi w og\u00f3le nie powinno by\u0107 przej\u015b\u0107.<\/p>\n<p><img decoding=\"async\" alt=\"Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wyszukiwaniu b\u0142\u0119d\u00f3w. Z wykorzystaniem skryptu w Pythonie\" src=\"\/wp-content\/uploads\/2019\/10\/f43fcabaa7b773c17741b4eaa927b600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrzyczyny tak dziwnego obrazu mog\u0105 by\u0107 dwie:<\/p>\n<ul>\n<li>b\u0142\u0119dy mog\u0142y wkr\u0119ci\u0107 si\u0119 w baz\u0119 log\u00f3w;<\/li>\n<li>b\u0142\u0119dy istniej\u0105 w samym produkcie \u2014 onboardingu.<\/li>\n<\/ul>\n<p>\nPierwszy pow\u00f3d najprawdopodobniej ma miejsce, ale sprawdzenie go jest do\u015b\u0107 pracoch\u0142onne, a poprawa log\u00f3w w \u017caden spos\u00f3b nie wp\u0142ynie na popraw\u0119 UX. Natomiast w przypadku drugiego, je\u015bli rzeczywi\u015bcie istnieje, nale\u017ca\u0142o natychmiast co\u015b zrobi\u0107. Dlatego przyst\u0105pili\u015bmy do analizy w\u0119z\u0142\u00f3w, identyfikacji kraw\u0119dzi, kt\u00f3rych by\u0107 nie powinno, oraz poszukiwania przyczyn ich pojawiania si\u0119. Zauwa\u017cyli\u015bmy, \u017ce niekt\u00f3rzy u\u017cytkownicy zap\u0119tleni b\u0142\u0105dzili w k\u00f3\u0142ko, inni wypadali z \u015brodka na pocz\u0105tek, a jeszcze inni w og\u00f3le nie mogli wydosta\u0107 si\u0119 z pierwszych dw\u00f3ch krok\u00f3w. Przekazali\u015bmy dane do QA \u2014 i tak, okaza\u0142o si\u0119, \u017ce w onboardingu by\u0142o sporo b\u0142\u0119d\u00f3w: to taki uboczny, nieco prowizoryczny produkt, kt\u00f3ry nie by\u0142 wystarczaj\u0105co testowany, poniewa\u017c nie spodziewano si\u0119 \u017cadnych problem\u00f3w. Teraz ca\u0142y proces rejestracji zosta\u0142 zmieniony.<\/p>\n<p>Ta historia pokaza\u0142a nam niespodziewane zastosowanie \u0142a\u0144cuch\u00f3w Markowa w dziedzinie QA.<\/p>\n<h3>Spr\u00f3buj sam!<\/h3>\n<p>\nOpublikowa\u0142em m\u00f3j <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/BartolomeuD\/markov-chain\">skrypt Python do nauki \u0142a\u0144cuch\u00f3w Markowa<\/a><\/noindex> w otwartym dost\u0119pie \u2014 korzystaj na zdrowie. Dokumentacja na GitHubie, pytania mo\u017cna zadawa\u0107 tutaj, postaram si\u0119 na wszystkie odpowiedzie\u0107.<\/p>\n<p>No i przydatne linki: <noindex><a rel=\"nofollow\" href=\"https:\/\/networkx.github.io\/\">biblioteka NetworkX<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.graphviz.org\/\">wizualizator Graphviz<\/a><\/noindex>. A tutaj <noindex><a rel=\"nofollow\" href=\"http:\/\/habr.com\/ru\/post\/455762\">na Habra jest artyku\u0142<\/a><\/noindex> o \u0142a\u0144cuchach Markowa. Grafiki w artykule zosta\u0142y stworzone za pomoc\u0105 <noindex><a rel=\"nofollow\" href=\"https:\/\/gephi.org\/\">Gephi<\/a><\/noindex>.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skyeng\/blog\/473124\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438 \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Customer Journey Map \u2014 \u043a\u0430\u0440\u0442\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430. \u0412\u0435\u0434\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u2014 \u043d\u0435 \u043d\u0435\u0447\u0442\u043e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u0438 \u0446\u0435\u043b\u044c\u043d\u043e\u0435, \u044d\u0442\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430, \u043f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0447\u0435\u043d\u0438\u043a\u043e\u0432. \u0412\u043e\u0442 \u043e\u043d [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":39547,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-39546","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438 \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Customer Journey Map \u2014 \u043a\u0430\u0440\u0442\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0446\u0435\u043f\u0438 \u041c\u0430\u0440\u043a\u043e\u0432\u0430 \u0432 \u043e\u0446\u0435\u043d\u043a\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0431\u0430\u0433\u043e\u0432. \u0421\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u043d\u0430 Python | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438 \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Customer Journey Map \u2014 \u043a\u0430\u0440\u0442\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:35:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:35:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Jak wykorzystujemy \u0142a\u0144cuchy Markowa w ocenie decyzji i wykrywaniu b\u0142\u0119d\u00f3w. Ze skryptem na Pythonie | ProHoster","description":"Musimy zrozumie\u0107, co si\u0119 dzieje z naszymi studentami podczas nauki oraz jak te wydarzenia wp\u0142ywaj\u0105 na wyniki, dlatego tworzymy Customer Journey Map \u2014 map\u0119 do\u015bwiadcze\u0144 klient\u00f3w.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0446\u0435\u043f\u0438 \u041c\u0430\u0440\u043a\u043e\u0432\u0430 \u0432 \u043e\u0446\u0435\u043d\u043a\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0431\u0430\u0433\u043e\u0432. \u0421\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u043d\u0430 Python | ProHoster","og:description":"\u041d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438 \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Customer Journey Map \u2014 \u043a\u0430\u0440\u0442\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430.","og:url":"https:\/\/prohoster.info\/pl\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:35:27+00:00","article:modified_time":"2019-10-31T19:35:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"39546","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 02:13:24","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:16:25","updated":"2026-01-24 02:13:24","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/39546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=39546"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/39546\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/39547"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=39546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=39546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=39546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}