{"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\/en\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python","title":{"rendered":"How we use Markov chains in decision evaluation and bug finding. With a Python script","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>It's important for us to understand what happens to our students during their learning journey and how these events affect the outcome, which is why we build a Customer Journey Map. The learning process is not a continuous and cohesive entity; it's a chain of interconnected events and student actions, and these actions can vary greatly among different learners. After completing a lesson, what will they do next? Will they tackle their homework? Open the mobile app? Change courses or request a different teacher? Immediately jump into the next lesson? Or will they just leave feeling disillusioned? Can we analyze this map to identify patterns that lead to successful course completion or, conversely, to student drop-off?<\/p>\n<p><img decoding=\"async\" alt=\"How we use Markov chains in decision evaluation and bug finding. With a Python script\" src=\"\/wp-content\/uploads\/2019\/10\/3eaee2e858273669b4490f6ceb65d281.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTypically, specialized and quite expensive closed-source tools are used to create CJMs. However, we wanted to devise something simple that requires minimal effort and is ideally open-source. Thus, the idea to use Markov chains was born, and it worked out for us. We built a map, interpreted student behavior data as a graph, discovered completely non-obvious answers to global business questions, and even found deeply hidden bugs. We achieved all of this using open-source Python script solutions. In this article, I will discuss two cases with those very non-obvious results and share the script with anyone interested.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSo, Markov chains demonstrate the probability of transitions between events. Here\u2019s a simple example from Wikipedia:<\/p>\n<p><img decoding=\"async\" alt=\"How we use Markov chains in decision evaluation and bug finding. With a Python script\" src=\"\/wp-content\/uploads\/2019\/10\/978e18169ba4c7b2b71787536e4bb219.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn this case, 'E' and 'A' are events, the arrows represent transitions between them (including transitions from an event to itself), and the weights of the arrows signify the probability of the transition (a 'weighted directed graph').<\/p>\n<h2>What was used<\/h2>\n<p>\nThe chain was trained using standard Python functionality, which processed student activity logs. The graph based on the resulting matrix was constructed using the NetworkX library.<\/p>\n<p>The log looks like this:<\/p>\n<p><img decoding=\"async\" alt=\"How we use Markov chains in decision evaluation and bug finding. With a Python script\" src=\"\/wp-content\/uploads\/2019\/10\/bc75077802cd7eeb00ebe4a56bc61050.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThis is a CSV file containing a table with three columns: student ID, event name, and the time when it occurred. These three fields are sufficient to track client movements, build the map, and ultimately create a Markov chain.<\/p>\n<p>The library returns constructed graphs in .dot or .gexf format. To visualize the former, you can use the free Graphviz package (the gvedit tool); we worked with .gexf and Gephi, which is also free.<\/p>\n<p>Next, I want to provide two examples of using Markov chains, which allowed us to rethink our goals, learning processes, and the Skyeng ecosystem itself while also addressing some bugs.<\/p>\n<h2>First case: mobile application<\/h2>\n<p>\nTo start, we explored the student journey through our most popular product \u2014 the General course. At that time, I was working in the children's department at Skyeng and we wanted to see how effectively the mobile application works with our young audience.<\/p>\n<p>By taking logs and running them through a script, I obtained something like this:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/ws\/ru\/de\/wsrudeufw3pzwrrxtxtn1pjeqvu.png\"><img decoding=\"async\" alt=\"How we use Markov chains in decision evaluation and bug finding. With a Python script\" src=\"\/wp-content\/uploads\/2019\/10\/f2533ddfae7d5f85d0e86902b9b7005f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>The starting node is Start General, and at the bottom, there are three exit nodes: the student 'fell asleep,' changed courses, or finished the course.<\/p>\n<ul>\n<li>Fell asleep, '\u0417\u0430\u0441\u043d\u0443\u043b' \u2014 means that the student is no longer attending classes, most likely they have dropped out. We optimistically call this state 'fell asleep' because in theory, they still have the possibility to continue their studies. This is the worst outcome for us.<\/li>\n<li>Dropped general, Changed course \u2014 switched from General to something else and got lost for our Markov chain.<\/li>\n<li>Finished course, \u0417\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u043a\u0443\u0440\u0441 \u2014 an ideal state, the person completed 80% of the lessons (not all lessons are mandatory).<\/li>\n<\/ul>\n<p>\nReaching the successful class node indicates successful completion of a lesson on our platform with a teacher. It records progress in the course and movement toward the desired outcome \u2014 'Finished course.' It is important for us that students attend it as much as possible.<\/p>\n<p>To obtain more precise quantitative conclusions for the mobile application (node app session), we constructed separate chains for each of the final nodes and then compared the weights of the edges pairwise:<\/p>\n<ul>\n<li>from app session back to itself;<\/li>\n<li>from app session to successful class;<\/li>\n<li>from successful class to 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=\"How we use Markov chains in decision evaluation and bug finding. With a Python script\" src=\"\/wp-content\/uploads\/2019\/10\/fc68ca73b379f57a38b53f0c31e75cb1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<i>On the left \u2014 students who completed the course, on the right \u2014 'fell asleep.'<\/i><\/p>\n<p>These three edges show the relationship between student success and their use of the mobile application. We expected to see that students who finished the course would have a stronger connection with the app than those who 'fell asleep.' However, in practice, we obtained exactly the opposite results:<\/p>\n<ul>\n<li>we confirmed that different groups of users interact differently with the mobile application.<\/li>\n<li>successful students use the mobile app less intensively;<\/li>\n<li>sleepy students use the mobile app more actively.<\/li>\n<\/ul>\n<p>\nThis means that 'sleepy' students are starting to spend more and more time in the mobile app and eventually stay there permanently.<\/p>\n<p><img decoding=\"async\" alt=\"How we use Markov chains in decision evaluation and bug finding. With a Python script\" src=\"\/wp-content\/uploads\/2019\/10\/45c17a908e2178edd99e340f34657cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAt first, we were surprised, but after thinking, we realized that this is quite a natural effect. At one time, I learned French on my own using two tools: a mobile app and grammar lectures on YouTube. Initially, I split my time between them in a 50-50 ratio. But the app is more fun; it has gamification, everything is simple, fast, and clear, while the lectures require immersion, note-taking, and practice in a notebook. Gradually, I started spending more time on my smartphone until its share grew to 100%: if you spend three hours in it, you get a false sense of completed work, which makes you unwilling to go and listen to something.<\/p>\n<p>But how is that possible? After all, we specifically created the mobile app, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skyeng\/blog\/312126\/\">integrated Ebbinghaus's curve into it,<\/a><\/noindex>, gamified it, made it attractive so that people would spend time in it, yet it turns out that it only distracts them? The real reason is that the mobile app team did such a good job that it became a cool self-sufficient product and started to fall out of our ecosystem.<\/p>\n<p>As a result of the research, we came to understand that the mobile app needs to be modified to divert less from the main learning course. This applies to both children and adults. This work is currently underway.<\/p>\n<h2>Second case: onboarding bugs<\/h2>\n<p>\nOnboarding is an optional additional procedure during the registration of a new student that alleviates potential technical issues in the future. The basic scenario assumes that a person has registered on the landing page, gained access to their personal account, is contacted, and an introductory lesson is conducted. We note a significant percentage of technical difficulties during the introductory lesson: an incompatible browser version, malfunctioning microphone or sound, the teacher being unable to immediately suggest a solution, and all this is especially challenging when it involves children. Therefore, we developed an additional application in the personal account where users can complete four simple steps: check the browser, camera, microphone, and confirm that parents will be present during the introductory lesson (after all, they are the ones paying for their children's education).<\/p>\n<p>These few pages of onboarding showed the following funnel:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/l5\/pt\/aj\/l5ptajlgx6msydvswctke1w505w.jpeg\"><img decoding=\"async\" alt=\"How we use Markov chains in decision evaluation and bug finding. With a Python script\" src=\"\/wp-content\/uploads\/2019\/10\/5e949640d4d4f8a70dc4fd677e3c93a7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<i>1: a starting block with three slightly different (depending on the client) forms for entering the login-password.<br \/>\n2: a checkbox agreeing to the additional onboarding procedure.<br \/>\n2.1-2.3: checking for parental presence, Chrome version, and sound functionality.<br \/>\n3: the final block.<\/i><\/p>\n<p>It appears very natural: in the first two steps, most visitors drop off, realizing that they have to fill something out, check things, and that there's no time. If a client reaches the third step \u2014 they are almost certain to reach the end. There are no visible reasons in the funnel to suspect anything.<\/p>\n<p>However, we decided to analyze our onboarding not on a classic one-dimensional funnel, but through a Markov chain. We included a bit more events, ran the script, and got this:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/pi\/e6\/9p\/pie69p-4rmwaqdqqunigm3oz8am.png\"><img decoding=\"async\" alt=\"How we use Markov chains in decision evaluation and bug finding. With a Python script\" src=\"\/wp-content\/uploads\/2019\/10\/44c094cb0be013beac00c0af5a3801be.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>One can only definitively understand one thing in this chaos: something went wrong. The onboarding process is linear, which is built into the design, and there should not be such a web of connections. Here, it is immediately clear that the user is being tossed between steps, where there should not be any transitions at all.<\/p>\n<p><img decoding=\"async\" alt=\"How we use Markov chains in decision evaluation and bug finding. With a Python script\" src=\"\/wp-content\/uploads\/2019\/10\/f43fcabaa7b773c17741b4eaa927b600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThere might be two reasons for such a strange picture:<\/p>\n<ul>\n<li>issues crept into the log database;<\/li>\n<li>issues are present in the product itself \u2014 onboarding.<\/li>\n<\/ul>\n<p>\nThe first reason likely exists, but checking it is quite labor-intensive, and fixing the logs won't improve the UX. However, if a second reason exists, it needed urgent attention. So, we delved into the nodes to identify edges that shouldn't exist and searched for their causes. We noticed that some users were getting stuck in loops, others were falling from mid-process back to the beginning, and some simply couldn't get past the first two steps. We passed the data to QA, and yes, it turned out there were plenty of bugs in the onboarding process: it was a bit of a makeshift product and hadn't been tested thoroughly enough because no issues were expected. The entire recording process has since changed.<\/p>\n<p>This story showed us an unexpected application of Markov chains in QA.<\/p>\n<h3>Try it yourself!<\/h3>\n<p>\nI uploaded my <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/BartolomeuD\/markov-chain\">Python script for training Markov chains<\/a><\/noindex> to open access \u2014 feel free to use it. The documentation is on GitHub, and you can ask questions here; I'll try to answer them all.<\/p>\n<p>And here are some useful links: <noindex><a rel=\"nofollow\" href=\"https:\/\/networkx.github.io\/\">NetworkX library<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.graphviz.org\/\">Graphviz visualizer<\/a><\/noindex>. And here <noindex><a rel=\"nofollow\" href=\"http:\/\/habr.com\/ru\/post\/455762\">on Habr there is an article<\/a><\/noindex> about Markov chains. The graphs in the article were made using <noindex><a rel=\"nofollow\" href=\"https:\/\/gephi.org\/\">Gephi<\/a><\/noindex>.<br \/>\n<br \/>Source: <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.2 - 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\/en\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\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\/en\/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\udd47How we use Markov chains in decision evaluation and bug detection. With a Python script | ProHoster","description":"It's important for us to understand what happens to our students during their learning, and how these events impact the outcome, so we are building a Customer Journey Map.","canonical_url":"https:\/\/prohoster.info\/en\/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":"en_US","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\/en\/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\/en\/wp-json\/wp\/v2\/posts\/39546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=39546"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/39546\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/39547"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=39546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=39546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=39546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}