|
|
| Строка 1: |
Строка 1: |
| = Анализ поведения пользователей с помощью DQL =
| |
|
| |
|
| '''RUM''' собирает обширные данные о поведении пользователей — клики, навигацию, потоки сессий и пользовательские свойства — в событиях пользователей и пользовательских сессиях. '''DQL''' предоставляет прямой доступ к этим данным, позволяя отвечать на вопросы о поведении, выходящие за рамки того, что отображается в разделе '''Пользователи и сессии''' по умолчанию, — например, определять, какие элементы пользовательского интерфейса обеспечивают наибольшее вовлечение, составлять карты потоков навигации или измерять показатели отказов.
| |
|
| |
| Выполните приведенные ниже запросы в блокнотах для оперативного анализа или преобразуйте любой из них в пользовательскую метрику на основе событий или сессий пользователей.
| |
|
| |
| == Взаимодействие с пользователями ==
| |
|
| |
| Взаимодействия пользователей фиксируют клики, касания и нажатия клавиш на элементах пользовательского интерфейса. Анализ этих данных помогает понять, с какими частями интерфейса пользователи взаимодействуют чаще всего и меняется ли объем взаимодействий после релизов.
| |
|
| |
| === Взаимодействие во времени ===
| |
|
| |
| Отслеживание количества взаимодействий с течением времени помогает выявлять снижение вовлеченности или всплески, возникающие после изменения пользовательского интерфейса или внедрения новой функции.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_user_interaction
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | makeTimeseries interactions = count()
| |
| </pre>
| |
|
| |
| === Элементы, лидирующие по количеству взаимодействий ===
| |
|
| |
| Знание того, какие элементы пользовательского интерфейса получают наибольшее количество взаимодействий, помогает выявлять области с высокой интенсивностью трафика, подтверждать правильность проектных решений и обнаруживать недоиспользуемые функции. Приведенный ниже запрос ранжирует элементы пользовательского интерфейса по количеству взаимодействий на всех интерфейсах.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_user_interaction
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | filter in(interaction.name, { "click", "touch", "key_press" })
| |
| | summarize {
| |
| sessions = countDistinct(dt.rum.session.id),
| |
| interactions = count()
| |
| }, by: {element = ui_element.name, type = ui_element.tag_name, frontend = frontend.name}
| |
| | sort interactions desc
| |
| </pre>
| |
|
| |
| Чтобы подсчитать, как часто пользователи взаимодействуют с определенным элементом, отфильтруйте данные по названию элемента и типу тега.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_user_interaction
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | filter in(interaction.name, { "click", "touch", "key_press" })
| |
| | filter ui_element.tag_name == "button"
| |
| | filter ui_element.name == "Close details" // Замените на имя элемента, который вы хотите проанализировать
| |
| | summarize {
| |
| sessions = countDistinct(dt.rum.session.id),
| |
| interactions = count()
| |
| }, by: {element = ui_element.name}
| |
| </pre>
| |
|
| |
| Для веб-интерфейсов можно улучшить согласованность именования элементов и обогатить взаимодействие контекстом функций или компонентов, чтобы сделать анализ более удобным. См. разделы '''Настройка именования элементов пользовательского интерфейса для взаимодействия с пользователем''' и '''Связывание взаимодействия пользователя с функциями и компонентами пользовательского интерфейса'''.
| |
|
| |
| == Навигационные потоки ==
| |
|
| |
| Навигация связывает последовательность просмотров, которые пользователь посещает в течение сессии. Анализ шаблонов навигации позволяет выявить наиболее посещаемый контент и то, как пользователи перемещаются по вашему интерфейсу.
| |
|
| |
| === Навигация во времени ===
| |
|
| |
| Отслеживание переходов по ссылкам с течением времени помогает выявить снижение вовлеченности или подтвердить, что новая функция или изменение контента привлекают больше трафика. События навигации срабатывают при каждой загрузке страницы и переходе между представлениями '''SPA''', поэтому их количество отражает общую активность просмотра.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_navigation
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | makeTimeseries navigations = count()
| |
| </pre>
| |
|
| |
| === Главные страницы и просмотры ===
| |
|
| |
| Знание того, какие страницы или разделы привлекают наибольшее количество посетителей, помогает сосредоточить усилия на оптимизации и измерить охват ключевого контента. Приведенный ниже запрос ранжирует их по количеству уникальных сессий, посетивших их.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_navigation
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | summarize sessions = countDistinct(dt.rum.session.id), by: {view = view.url.path}
| |
| | sort sessions desc
| |
| </pre>
| |
|
| |
| Для измерения вовлеченности пользователей в разных контекстах используйте следующий запрос.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_user_interaction
| |
| | filter interaction.name == "click"
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | summarize {
| |
| sessions = countDistinct(dt.rum.session.id),
| |
| clicks = count()
| |
| }, by: {view = view.url.path}
| |
| | sort clicks desc
| |
| </pre>
| |
|
| |
| === Виды с посадки ===
| |
|
| |
| Знание того, с чего начинаются сессии, помогает определить наиболее распространенные точки входа и расставить приоритеты в отношении опыта участников.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_navigation
| |
| | filter view.sequence_number == 1
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | summarize sessions = countDistinct(dt.rum.session.id), by: {landing_view = view.url.path}
| |
| | sort sessions desc
| |
| </pre>
| |
|
| |
| === Входящие потоки ===
| |
|
| |
| Понимание того, откуда пользователи попадают на определенный сайт, помогает оценить пути перехода и оптимизировать их взаимодействие с ключевым контентом.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_navigation
| |
| | filter view.url.path == "/overview" // Замените на путь к целевому URL-адресу представления
| |
| | filter view.source.url.path != "/overview" // Замените на то же значение, что и выше, чтобы исключить самостоятельную навигацию
| |
| | summarize sessions = countDistinct(dt.rum.session.id), by: {source_view = view.source.name}
| |
| | sort sessions desc
| |
| </pre>
| |
|
| |
| === Исходящие потоки ===
| |
|
| |
| Понимание того, куда пользователи переходят после того, как покидают определенную страницу, помогает определить, следуют ли они ожидаемому пути или уходят. Используйте это для проверки воронок конверсии и выявления тупиковых ситуаций.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_navigation
| |
| | filter view.source.url.path == "/login" // Замените на путь URL исходного кода представления
| |
| | filter view.url.path != "/login" // Замените на то же значение, что и выше, чтобы исключить самостоятельную навигацию
| |
| | summarize sessions = countDistinct(dt.rum.session.id), by: {next_view = view.name}
| |
| | sort sessions desc
| |
| </pre>
| |
|
| |
| == Сегментация свойств событий и сессий ==
| |
|
| |
| Свойства событий и сессий позволяют привязывать бизнес-контекст к событиям и сессиям пользователей — например, уровень клиента, состояние флага функции или результат оформления заказа. После определения эти свойства можно использовать в качестве фильтров '''DQL''' и параметров группировки для сегментации любого поведенческого анализа по вашим собственным бизнес-критериям.
| |
|
| |
| Для отслеживания перемещений по объекту недвижимости с течением времени используйте следующий пример.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_navigation
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | filter isNotNull(event_properties.customer_tier) // Замените на имя свойства, которое вы настроили
| |
| | makeTimeseries sessions = countDistinct(dt.rum.session.id), by: {event_properties.customer_tier} // Замените на то же имя свойства
| |
| </pre>
| |
|
| |
| Для сравнения распределения свойства по всем сессиям используйте следующий пример.
| |
|
| |
| <pre>
| |
| fetch user.sessions
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | filter isNotNull(session_properties.payment_provider) // Замените на имя свойства, которое вы настроили
| |
| | summarize by: {session_properties.payment_provider}, sessions = count() // Замените на то же имя свойства
| |
| </pre>
| |
|
| |
| == Показатель отказов ==
| |
|
| |
| Высокий показатель отказов может указывать на несоответствие контента и намерений пользователей — когда пользователи попадают на страницу, которая не соответствует их ожиданиям, — или на сложности в процессе регистрации или оформления заказа. Приведенные ниже запросы, лучше всего подходящие для исторических периодов, используют пример пользовательского определения, которое вы можете настроить в соответствии с определением вашего продукта.
| |
|
| |
| <pre>
| |
| fetch user.sessions
| |
| | fieldsAdd bounced = navigation_count <= 1
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | summarize by: {bounced}, count = count()
| |
| </pre>
| |
|
| |
| Для сравнения показателей отказов на разных сайтах добавьте дополнительный параметр `by`.
| |
|
| |
| <pre>
| |
| fetch user.sessions
| |
| | fieldsAdd bounced = navigation_count <= 1
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | summarize {
| |
| total = count(),
| |
| bounced = countIf(bounced == true)
| |
| }, by: {frontend.name}
| |
| | fieldsAdd bounce_rate_pct = toDouble(bounced) / total * 100
| |
| | sort bounce_rate_pct desc
| |
| </pre>
| |
|
| |
| == Атрибуция кампании UTM ==
| |
|
| |
| '''UTM'''-параметры — это теги, добавляемые маркетинговыми командами к '''URL'''-адресам для определения того, какие кампании, каналы или рекламные креативы привлекают трафик на ваш сайт. Приведенный ниже запрос извлекает значения '''UTM''' из '''URL'''-адресов событий навигации и ранжирует их по количеству сессий, показывая, какие кампании обеспечивают наибольшее количество посещений. Используйте это для сопоставления эффективности кампаний с поведением пользователей на ваших веб-сайтах.
| |
|
| |
| <pre>
| |
| fetch user.events
| |
| | filter characteristics.has_navigation
| |
| // | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу
| |
| | fields view.url.path, view.url.query, dt.rum.session.id
| |
| | filterOut isNull(view.url.query)
| |
| | parse view.url.query, "ARRAY{LD:key('&'| EOF)}*:params"
| |
| | expand params
| |
| | parse decodeUrl(params), "LD:key '=' LD:value"
| |
| | filter in(key, array("utm_campaign", "utm_content", "utm_medium", "utm_source", "utm_term"))
| |
| | summarize by: {key, value}, count = countDistinct(dt.rum.session.id)
| |
| | sort count desc
| |
| </pre>
| |
|
| |
| == Связанные темы ==
| |
|
| |
| * Встроенные метрики '''RUM'''
| |
| * Извлечение метрик из пользовательских сессий
| |
| * Отслеживайте производительность веб-сайта с помощью '''DQL'''
| |