Анализ поведения пользователей с помощью DQL

Материал из Документация Ключ-АСТРОМ

Анализ поведения пользователей с помощью DQL

RUM собирает обширные данные о поведении пользователей — клики, навигацию, потоки сессий и пользовательские свойства — в событиях пользователей и пользовательских сессиях. DQL предоставляет прямой доступ к этим данным, позволяя отвечать на вопросы о поведении, выходящие за рамки того, что отображается в разделе Пользователи и сессии по умолчанию, — например, определять, какие элементы пользовательского интерфейса обеспечивают наибольшее вовлечение, составлять карты потоков навигации или измерять показатели отказов.

Выполните приведенные ниже запросы в блокнотах для оперативного анализа или преобразуйте любой из них в пользовательскую метрику на основе событий или сессий пользователей.

Взаимодействие с пользователями

Взаимодействия пользователей фиксируют клики, касания и нажатия клавиш на элементах пользовательского интерфейса. Анализ этих данных помогает понять, с какими частями интерфейса пользователи взаимодействуют чаще всего и меняется ли объем взаимодействий после релизов.

Взаимодействие во времени

Отслеживание количества взаимодействий с течением времени помогает выявлять снижение вовлеченности или всплески, возникающие после изменения пользовательского интерфейса или внедрения новой функции.

fetch user.events
| filter characteristics.has_user_interaction
// | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу  
| makeTimeseries interactions = count()

Элементы, лидирующие по количеству взаимодействий

Знание того, какие элементы пользовательского интерфейса получают наибольшее количество взаимодействий, помогает выявлять области с высокой интенсивностью трафика, подтверждать правильность проектных решений и обнаруживать недоиспользуемые функции. Приведенный ниже запрос ранжирует элементы пользовательского интерфейса по количеству взаимодействий на всех интерфейсах.

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

Чтобы подсчитать, как часто пользователи взаимодействуют с определенным элементом, отфильтруйте данные по названию элемента и типу тега.

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}

Для веб-интерфейсов можно улучшить согласованность именования элементов и обогатить взаимодействие контекстом функций или компонентов, чтобы сделать анализ более удобным. См. разделы Настройка именования элементов пользовательского интерфейса для взаимодействия с пользователем и Связывание взаимодействия пользователя с функциями и компонентами пользовательского интерфейса.

Навигационные потоки

Навигация связывает последовательность просмотров, которые пользователь посещает в течение сессии. Анализ шаблонов навигации позволяет выявить наиболее посещаемый контент и то, как пользователи перемещаются по вашему интерфейсу.

Навигация во времени

Отслеживание переходов по ссылкам с течением времени помогает выявить снижение вовлеченности или подтвердить, что новая функция или изменение контента привлекают больше трафика. События навигации срабатывают при каждой загрузке страницы и переходе между представлениями SPA, поэтому их количество отражает общую активность просмотра.

fetch user.events
| filter characteristics.has_navigation
// | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу  
| makeTimeseries navigations = count()

Главные страницы и просмотры

Знание того, какие страницы или разделы привлекают наибольшее количество посетителей, помогает сосредоточить усилия на оптимизации и измерить охват ключевого контента. Приведенный ниже запрос ранжирует их по количеству уникальных сессий, посетивших их.

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

Для измерения вовлеченности пользователей в разных контекстах используйте следующий запрос.

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

Виды с посадки

Знание того, с чего начинаются сессии, помогает определить наиболее распространенные точки входа и расставить приоритеты в отношении опыта участников.

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

Входящие потоки

Понимание того, откуда пользователи попадают на определенный сайт, помогает оценить пути перехода и оптимизировать их взаимодействие с ключевым контентом.

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

Исходящие потоки

Понимание того, куда пользователи переходят после того, как покидают определенную страницу, помогает определить, следуют ли они ожидаемому пути или уходят. Используйте это для проверки воронок конверсии и выявления тупиковых ситуаций.

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

Сегментация свойств событий и сессий

Свойства событий и сессий позволяют привязывать бизнес-контекст к событиям и сессиям пользователей — например, уровень клиента, состояние флага функции или результат оформления заказа. После определения эти свойства можно использовать в качестве фильтров DQL и параметров группировки для сегментации любого поведенческого анализа по вашим собственным бизнес-критериям.

Для отслеживания перемещений по объекту недвижимости с течением времени используйте следующий пример.

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} // Замените на то же имя свойства

Для сравнения распределения свойства по всем сессиям используйте следующий пример.

fetch user.sessions
// | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу  
| filter isNotNull(session_properties.payment_provider) // Замените на имя свойства, которое вы настроили
| summarize by: {session_properties.payment_provider}, sessions = count() // Замените на то же имя свойства

Показатель отказов

Высокий показатель отказов может указывать на несоответствие контента и намерений пользователей — когда пользователи попадают на страницу, которая не соответствует их ожиданиям, — или на сложности в процессе регистрации или оформления заказа. Приведенные ниже запросы, лучше всего подходящие для исторических периодов, используют пример пользовательского определения, которое вы можете настроить в соответствии с определением вашего продукта.

fetch user.sessions
| fieldsAdd bounced = navigation_count <= 1
// | filter frontend.name == "FRONTEND-NAME" // Необязательно: фильтрация по конкретному интерфейсу  
| summarize by: {bounced}, count = count()

Для сравнения показателей отказов на разных сайтах добавьте дополнительный параметр `by`.

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

Атрибуция кампании UTM

UTM-параметры — это теги, добавляемые маркетинговыми командами к URL-адресам для определения того, какие кампании, каналы или рекламные креативы привлекают трафик на ваш сайт. Приведенный ниже запрос извлекает значения UTM из URL-адресов событий навигации и ранжирует их по количеству сессий, показывая, какие кампании обеспечивают наибольшее количество посещений. Используйте это для сопоставления эффективности кампаний с поведением пользователей на ваших веб-сайтах.

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

Связанные темы

  • Встроенные метрики RUM
  • Извлечение метрик из пользовательских сессий
  • Отслеживайте производительность веб-сайта с помощью DQL