Отчёт по материалам учебной библиотеки
После проверки отправки у нас появился набор событий, но для редакционной работы нужны сведения по материалам. Какая статья чаще открывается? На какой чаще активируют исходник? Где продолжение маршрута используется реже? Построим отчёт, который отвечает на эти вопросы и сохраняет определения наблюдений рядом с числами.
Данные урока вымышленные. Файл page-summary.csv находится в учебных исходниках серии; он не выгружен из настоящей Метрики или GA4. Его строки имеют data_kind=fictional и условную платформу sample. Такой небольшой набор позволяет вручную разобрать каждое вычисление, прежде чем применять приём к собственной статистике.
Строка отчёта и документ
У каждой строки есть период и article_id. Реестр соединяет markdown с /articles/markdown-guide.html, а xml — с сохранённым XML-путём. Если название материала поменялось, его ID остаётся прежним. Если появился новый документ, он получает собственную личность, даже когда заголовки похожи. Так изменение редакционного оформления не создаёт разрыв истории.
Оба периода, W1 и W2, имеют длительность семь дней. Условия таблицы одинаковы: desktop, sample_country, одна условная платформа и две статьи. Это не универсальное правило отчёта, а явный контекст нашего вычисления. В реальном экспорте условия могут отличаться, поэтому сохранение фильтров относится к воспроизводимости, а не к украшению заголовка.
| Период | ID | Открытия | Продолжения | Исходник |
|---|---|---|---|---|
| W1 | markdown | 100 | 20 | 10 |
| W1 | xml | 80 | 8 | 16 |
| W2 | markdown | 120 | 30 | 18 |
| W2 | xml | 100 | 10 | 20 |
Здесь «продолжения» означают события lesson_next, а «исходник» — sample_download. Это активации ссылок, не доказательство прочтения назначения и не окончание скачивания. Название столбца должно позволять восстановить исходное событие. Слишком широкая подпись «успех» скроет различия действий и сделает объяснение результата неточным.
Отношение с правильным знаменателем
В W1 для Markdown отношение продолжений к открытиям равно 20/100, то есть 20%. Для XML оно равно 8/80, то есть 10%. Это сравнение событий внутри наших условий. Его нельзя автоматически назвать долей людей, которые прошли курс: один посетитель способен открыть документ несколько раз и несколько раз активировать ссылку.
Для активации исходника получаются 10% у Markdown и 20% у XML. Более высокое значение не обязательно означает лучшую статью. Возможно, исходник XML нужен чаще, а Markdown понятен без скачивания. Для интерпретации потребуется назначение материала и место ссылки. Отчёт помогает выбрать вопрос, но не заменяет содержательную работу редактора.
Если открытий нет, отношение не рассчитывается. Ноль в знаменателе не превращается в нулевой процент: данных для сравнения нет. При нуле действий и положительном числе открытий процент действительно равен нулю в наблюдаемой выборке. Эти состояния визуально похожи в простой таблице, но имеют разные значения и требуют разного следующего действия.
Суммарное отношение W1 рассчитывается из сумм: 28/180, примерно 15,56%. Среднее двух процентов, 15%, дало бы другой результат, потому что статьи имеют разное число открытий. Для общего показателя нужны веса знаменателя. Это тот же арифметический принцип, который мы использовали при CTR, но смысл числителя здесь другой.
Небольшой воспроизводимый расчёт
Скопируйте учебный CSV в analytics-lab/data/page-summary.csv. Ниже полный файл report.py; он читает только эту таблицу и не обращается к платформам. Вывод содержит рассчитанные значения по каждой строке, а итоговая группировка не пытается определить пользователей или сеансы.
import csv
from collections import defaultdict
from pathlib import Path
path = Path(__file__).parent / "data" / "page-summary.csv"
totals = defaultdict(lambda: [0, 0, 0])
seen = set()
with path.open(encoding="utf-8", newline="") as source:
for row in csv.DictReader(source):
key = (row["period"], row["article_id"])
if key in seen or row["data_kind"] != "fictional":
raise ValueError("Unexpected duplicate or data kind")
seen.add(key)
values = [int(row[name]) for name in
("lesson_open", "lesson_next", "sample_download")]
if any(value < 0 for value in values):
raise ValueError("Negative count")
opens, nexts, downloads = values
rate = f"{nexts / opens:.2%}" if opens else "unknown"
print(row["period"], row["article_id"], opens, nexts, rate)
totals[row["period"]] = [a + b for a, b in
zip(totals[row["period"]], values)]
for period, (opens, nexts, downloads) in sorted(totals.items()):
rate = f"{nexts / opens:.2%}" if opens else "unknown"
print(period, "TOTAL", opens, nexts, downloads, rate)
Ожидаемый итог W1 — 180 открытий, 28 продолжений и 26 активаций исходника. W2 — 220, 40 и 38 соответственно. Это проверка арифметики заданных строк, а не замер поведения сайта. Если реальный экспорт имеет другой состав, заменять его этими ожидаемыми числами нельзя. Исходный файл и параметры отбора сохраняются вместе с результатом.
Проверка дубликата относится к составному ключу нашего маленького CSV. В настоящем экспорте строка может дополнительно различаться по устройству, источнику или дате. Тогда ключ меняется вместе со схемой данных. Не удаляйте строки только потому, что у них один ID: это может уничтожить полезные группы и занизить общий итог.
Выбор группировок в сервисе
Платформенный отчёт может группировать данные по страницам или переданным параметрам. Если в качестве ключа используется URL со всеми метками, один документ способен попасть в несколько строк. Для вопроса о материале полезнее стабильный article_id, а параметры входа рассматриваются отдельным измерением. Не очищайте функциональные query-параметры механически без знания их назначения.
Метрика предоставляет отчёты по переданным параметрам и сегментам. При выборе нужно понимать, относятся условия к событию, визиту или посетителю: фильтр по визиту способен включить другие действия того же визита. GA4 также различает параметры событий и специальные определения для анализа. Отчёты по параметрам Метрики, специальные определения GA4.
Запишите, какой показатель стоит в столбце: число событий, пользователей или сеансов. Если интерфейс предлагает метрику автоматически, это ещё не означает, что она соответствует вашему вопросу. Для перехода между главами число событий удобно как первое наблюдение, но для последовательного маршрута понадобится связывание действий и порядок, которые разберём позже.
От числа к редакционной задаче
Возьмём XML с 80 открытиями и 16 активациями исходника. Это повод проверить, достаточно ли ясно объяснено содержимое файла и способ его применения. Возьмём Markdown с 20 продолжениями: полезно проверить название следующего шага и его предпосылки. В обоих случаях отчёт предлагает материал для исследования, а не готовую оценку автора.
Не ранжируйте все статьи библиотеки одним отношением. Справочная страница, подробный урок и демонстрация имеют разные задачи. Для отдельного рецепта отсутствие продолжения может быть нормальным результатом. Поэтому в реестре стоит сохранять назначение материала и сравнивать соответствующие группы, а не просто выбирать самый большой процент.
Наш отчёт теперь можно восстановить из конкретного файла, назвать знаменатели и объяснить каждую строку. Это основа дальнейшего анализа. В следующем уроке исследуем изменение между W1 и W2 и посмотрим, какие выводы позволяют эти числа, а какие требуют дополнительных свидетельств.