Pandas & NumPy Academy · Урок

Формирование сессий и последовательность событий

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

Урок 1 из 413 шагов

«Формирование сессий и последовательность событий» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Понимание данных о последовательности действий

Набор данных о последовательности действий записывает каждое действие пользователя: просмотры страниц, нажатия кнопок и покупки — каждое в отдельной строке с указанием идентификатора пользователя, идентификатора сессии, типа события и временной отметки. Прежде чем вычислять какие-либо метрики, необходимо понять структуру данных. Выполните df.dtypes и df.sample(5), чтобы увидеть примеры строк и убедиться, что столбец временных отметок распознан как дата и время, а не как строка.

import pandas as pd

df = pd.read_csv('clickstream.csv', parse_dates=['timestamp'])
print(df.dtypes)
print(df.sample(5))

Сортировка событий в хронологическом порядке

Анализ событий не имеет смысла, если строки расположены не в порядке времени. Отсортируйте данные по идентификатору пользователя, а затем по временной отметке, чтобы все события одного пользователя располагались подряд и в правильной последовательности. Используйте sort_values(['user_id', 'timestamp']), а затем сбросьте индекс, чтобы получить последовательность целых чисел, отражающую отсортированный порядок.

df = df.sort_values(['user_id', 'timestamp']).reset_index(drop=True)
print(df[['user_id', 'session_id', 'event_type', 'timestamp']].head(10))

Определение границ сессий

Если сессии не размечены заранее, их можно определить по 30-минутному периоду бездействия: новая сессия начинается, когда время с момента предыдущего события того же пользователя превышает 30 минут. Используйте groupby('user_id')['timestamp'].diff(), чтобы вычислить промежуток между последовательными событиями, а затем отметьте строки, в которых этот промежуток превышает порог, как начало сессий.

threshold = pd.Timedelta('30min')

df['time_gap'] = df.groupby('user_id')['timestamp'].diff()
df['is_new_session'] = (df['time_gap'] > threshold) | (df['time_gap'].isna())
df['session_id_inferred'] = df.groupby('user_id')['is_new_session'].cumsum()

print(df[['user_id', 'timestamp', 'time_gap', 'session_id_inferred']].head(10))

Вычисление длительности сессии

Длительность сессии — это время между первым и последним событием в сессии. Сгруппируйте данные по идентификатору пользователя и идентификатору сессии и вычислите max - min для столбца временных отметок. Преобразуйте полученный Timedelta в минуты с помощью .dt.total_seconds() / 60, чтобы получить понятную человеку метрику. Сессии с нулевой длительностью — это посещения, состоящие из одного события.

session_times = df.groupby(['user_id', 'session_id'])['timestamp'].agg(['min', 'max'])
session_times['duration_minutes'] = (session_times['max'] - session_times['min']).dt.total_seconds() / 60

print(session_times['duration_minutes'].describe())

Подсчёт событий в каждой сессии

Количество событий в сессии служит косвенным показателем вовлечённости пользователя. Сессия с 20 событиями, скорее всего, указывает на более глубокое изучение продукта, чем сессия с 2 событиями. Используйте groupby(['user_id', 'session_id']).size(), чтобы подсчитать строки в каждой группе, и назовите результат event_count. Объедините эту сводку с таблицей сессий, чтобы получить полный набор данных на уровне сессий.

event_counts = df.groupby(['user_id', 'session_id']).size().rename('event_count')
session_df = session_times.join(event_counts)

print(session_df.describe())

Определение первых и последних событий

Первое событие в сессии показывает точку входа — например, главную страницу или страницу результатов поиска, — а последнее событие показывает способ выхода: покупку или уход без дальнейших действий. Используйте groupby().first() и groupby().last() для отсортированного DataFrame. Эти столбцы входа и выхода необходимы для анализа воронки и удержания.

session_entry = df.groupby(['user_id', 'session_id'])['event_type'].first().rename('entry_event')
session_exit = df.groupby(['user_id', 'session_id'])['event_type'].last().rename('exit_event')

print(session_entry.value_counts().head())
print(session_exit.value_counts().head())

Нумерация событий внутри сессии

Присвоение последовательного номера событиям внутри каждой сессии позволяет анализировать распространённые последовательности событий. Используйте groupby(['user_id', 'session_id']).cumcount() + 1, чтобы создать столбец event_rank. Фильтрация по event_rank == 1 возвращает событие, с которого началось посещение, а фильтрация по максимальному номеру — событие выхода для каждой сессии.

df['event_rank'] = df.groupby(['user_id', 'session_id']).cumcount() + 1

# First event of each session
landings = df[df['event_rank'] == 1]
print(landings['event_type'].value_counts())

Вычисление времени между событиями

Время между событиями — промежуток между последовательными событиями внутри сессии — показывает, насколько быстро пользователи перемещаются по продукту. Вычислите его с помощью groupby(['user_id', 'session_id'])['timestamp'].diff(). Большие промежутки между определёнными типами событий указывают на колебания или непонимание на этом этапе и могут служить сигналом для улучшения пользовательского опыта.

df['inter_event_seconds'] = (
    df.groupby(['user_id', 'session_id'])['timestamp']
    .diff()
    .dt.total_seconds()
)

print(df['inter_event_seconds'].describe())

Количество сессий на пользователя

Количество сессий на пользователя показывает, как часто каждый пользователь возвращается. Активные пользователи с большим числом сессий формируют ключевые показатели удержания. Вычислите число сессий на пользователя с помощью df.groupby('user_id')['session_id'].nunique(). Разделите пользователей на разовых посетителей, нерегулярных и постоянных пользователей, применив pd.qcut() к количеству сессий.

sessions_per_user = df.groupby('user_id')['session_id'].nunique().rename('session_count')

print(sessions_per_user.describe())
print(sessions_per_user.value_counts().head(10))

Распределение сессий по дням недели

Понимание того, в какие дни недели проходит больше всего сессий, помогает планировать выпуск обновлений продукта, почтовые кампании и масштабирование серверов. Извлеките day_of_week из временной отметки начала сессии и сгруппируйте данные по этому признаку. Преобразование целых значений (0 = понедельник, 6 = воскресенье) в названия дней делает результаты более понятными в отчётах и на графиках.

session_starts = df[df['event_rank'] == 1].copy()
session_starts['day_of_week'] = session_starts['timestamp'].dt.day_name()

sessions_by_day = session_starts.groupby('day_of_week').size()
print(sessions_by_day)

Построение сводной таблицы на уровне сессий

Объедините все вычисленные метрики — длительность, количество событий, событие входа, событие выхода и день недели — в один сводный DataFrame на уровне сессий. Эта таблица служит основой для анализа воронки, моделирования удержания и создания признаков для машинного обучения. Каждая строка представляет одну сессию, а не одно исходное событие.

session_summary = session_df.join(session_entry).join(session_exit)
session_summary = session_summary.reset_index()
print(session_summary.columns.tolist())
print(session_summary.head())

Быстрая проверка

Проверьте, насколько хорошо Вы поняли концепции анализа данных из этого урока.

Итоги урока

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

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Формирование сессий и последовательность событий» бесплатный?

Да — полный текст урока «Формирование сессий и последовательность событий» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Формирование сессий и последовательность событий»?

Группируйте события по пользователю и сессии, вычисляйте длительность сессии с помощью арифметики временных меток и сортируйте события в хронологическом порядке. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Формирование сессий и последовательность событий»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Формирование сессий и последовательность событий
  2. Анализ воронки
  3. Когортная таблица удержания
  4. Визуализация пользовательских путей
← Назад к Pandas & NumPy Academy