Как посчитать video QoE в SQL

Закрепи формулу video quality of experience в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать video quality of experience в Telegram

Зачем QoE композит

Startup time + rebuffer + bitrate — не одна метрика, а три. Composite QoE score объединяет в одну. Используется в alerts (drop in QoE = page on-call), в product OKR (target QoE score > 80), в A/B (player change → QoE delta).

Компоненты

Стандартный composite:

  • startup time (lower = better) → 25%
  • rebuffer ratio (lower = better) → 35%
  • avg bitrate (higher = better) → 20%
  • exit before play / error rate → 20%

Веса arbitrary, calibrate под бизнес.

QoE score в SQL

WITH normalized AS (
    SELECT
        view_id,
        -- normalize 0-100 для каждой метрики
        GREATEST(0, LEAST(100, 100 - (startup_ms - 500) / 50.0)) AS startup_score,
        GREATEST(0, LEAST(100, 100 - (rebuffer_ratio * 200))) AS rebuffer_score,
        GREATEST(0, LEAST(100, avg_bitrate_kbps / 50.0)) AS bitrate_score,
        CASE WHEN exit_before_play OR has_fatal_error THEN 0 ELSE 100 END AS reliability_score
    FROM video_view_events
    WHERE view_started_at >= CURRENT_DATE - INTERVAL '7 days'
)
SELECT
    AVG(startup_score) * 0.25
    + AVG(rebuffer_score) * 0.35
    + AVG(bitrate_score) * 0.20
    + AVG(reliability_score) * 0.20 AS qoe_score
FROM normalized;

QoE 90+ — premium experience. 70-90 — норма. < 70 — investigate.

Сегментация

SELECT
    region,
    platform,
    AVG(startup_score) * 0.25
    + AVG(rebuffer_score) * 0.35
    + AVG(bitrate_score) * 0.20
    + AVG(reliability_score) * 0.20 AS qoe_score,
    COUNT(*) AS views
FROM qoe_normalized
GROUP BY region, platform
HAVING COUNT(*) >= 1000
ORDER BY qoe_score;

Регион с low QoE — приоритет для CDN expansion / optimization.

Закрепи формулу video quality of experience в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать video quality of experience в Telegram

QoE vs engagement

SELECT
    CASE
        WHEN qoe_score >= 90 THEN '90+'
        WHEN qoe_score >= 75 THEN '75-90'
        WHEN qoe_score >= 60 THEN '60-75'
        ELSE '<60'
    END AS qoe_bucket,
    AVG(seconds_watched) AS avg_watch_time,
    SUM(CASE WHEN completed THEN 1 ELSE 0 END)::NUMERIC * 100 / COUNT(*) AS completion_pct
FROM video_views_with_qoe
GROUP BY 1
ORDER BY MIN(qoe_score);

Direct correlation: viewers с QoE 90+ имеют 50%+ больше watch time, чем <60.

Частые ошибки

Ошибка 1. Веса наугад. Calibrate weights через regression: какие компоненты больше всего predict abandonment.

Ошибка 2. Бинарная reliability. Exit-before-play и fatal error — different severity. Use partial scores.

Ошибка 3. Aggregate без segmentation. Average QoE 85 при региональной variance 60-95 = маскирует problem regions.

Ошибка 4. Не сравнивать с baseline. QoE 80 — много или мало? Compare к prior week / prior month.

Ошибка 5. Bitrate как absolute. 4K bitrate vs 720p — разные expectations. Normalize on resolution.

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

FAQ

Какой QoE хороший?

Premium streaming: 85+. Free / live: 75+. Mobile: 70+ realistic.

Composite vs separate?

Composite — для top-line metric. Components — для root cause.

Веса как калибровать?

Linear regression: components → engagement (watch time). Output = optimal weights.

Real-time alerting?

QoE drop > 10 points за час — alert. CDN или backend issue.

Per-video QoE?

Yes — некоторые видео имеют consistently lower QoE (длинные, 4K).