Отто · операционный директор доставки «Гонец»
Мне прислали дашборд по опозданиям, а я в нём тону. Три вопроса: насколько плохо в Уралмаше в июне, в какие часы хуже всего и кто опаздывает чаще, пешие или на машине? И скажи честно, этим графикам можно верить?
В последних уроках мы сами строили дашборд и параметры к нему. На работе чаще бывает наоборот: дашборд уже есть, его собрал кто-то другой, и тебя просят по нему ответить. Сегодня учимся читать чужие дашборды и замечать, где график врёт.
Карта метро
Схема метро это не карта города. Расстояния на ней неверные, линии прямее, чем рельсы, а станции стоят через равные промежутки. Она удобна, потому что честно говорит, что упрощает: по ней понятно, где пересадка, но не понятно, сколько идти пешком. Плохая схема была бы опаснее: если бы она рисовала одни перегоны короче, а другие длиннее по прихоти дизайнера, выводы по ней были бы неверными.
С графиками то же самое. Любой график упрощает данные. Вопрос в том, честно ли он показывает, что упростил.
Три манипуляции
Обрезанная ось. Доля опозданий в Уралмаше 47,1%, в Центре 9,1%. На честном графике столбцы отличаются в пять раз. А если ось начинается не с нуля, а, скажем, с 44%, то 47 и 45 процентов выглядят как разница втрое, хотя это два пункта. Столбцы всегда начинают с нуля: длина столбца и есть величина. В нашем мини-DataLens ось столбцов всегда включает ноль, поэтому этот приём у нас не получится даже случайно.
Двойная шкала. Две линии на одном графике, у каждой своя ось: слева «заказы», справа «опоздания». Подбирая масштабы осей, можно заставить любые две линии идти вместе или расходиться. Глаз видит «линии совпали» и делает вывод о связи, которой нет. Если нужно сравнить две меры разного масштаба, их кладут на два графика один под другим с общей осью времени.
Неравные интервалы. Зона «Академический» открылась 15 апреля, и в первый месяц у неё 8 дней без единого заказа. Если строить график заказов по дням без календаря, пустые дни исчезнут, а соседние точки встанут рядом. Линия будет выглядеть ровной, хотя 8 дней зона простаивала. Та же беда, если на одной оси перемешаны недели и месяцы. Ось времени должна идти равными шагами, а пустые дни должны быть видны как нули. Это generate_series.
Ошибка аналитика
Попробуй сам
Это дашборд «Гонца». По умолчанию выбран Уралмаш и июнь. Ответь себе на вопросы Отто, потом переключи зону на Центр и сравни. Не забудь открыть SQL карточек: время доставки там переведено в местный пояс.
Дашборд «Гонца»: опоздания по зоне
База · courier
Учебная база и графики загрузятся по кнопке, не при прокрутке урока.
Заказы по дням
SQL запроса
SELECT d::date AS day, count(o.id) AS orders FROM generate_series($period_from::date, $period_to::date, interval '1 day') AS d LEFT JOIN orders o ON o.created_at::date = d::date AND o.zone_id = (SELECT id FROM zones WHERE name = $zone) GROUP BY d ORDER BY d
Доля опоздавших доставок по дням
SQL запроса
SELECT o.created_at::date AS day,
round(avg(((o.delivered_at AT TIME ZONE 'Asia/Yekaterinburg') > o.promised_at)::int), 3) AS late_share
FROM orders o
WHERE o.status = 'delivered' AND o.delivered_at IS NOT NULL
AND o.zone_id = (SELECT id FROM zones WHERE name = $zone)
AND o.created_at >= $period_from::date AND o.created_at < $period_to::date + 1
GROUP BY day
ORDER BY dayСреднее время доставки по часу заказа, мин
SQL запроса
SELECT extract(hour FROM o.created_at)::int AS hour,
round(avg(extract(epoch FROM (o.delivered_at AT TIME ZONE 'Asia/Yekaterinburg') - o.created_at) / 60), 1) AS minutes
FROM orders o
WHERE o.status = 'delivered' AND o.delivered_at IS NOT NULL
AND o.zone_id = (SELECT id FROM zones WHERE name = $zone)
AND o.created_at >= $period_from::date AND o.created_at < $period_to::date + 1
GROUP BY hour
ORDER BY hourДоля опозданий по транспорту курьера
SQL запроса
SELECT c.transport,
round(avg(((o.delivered_at AT TIME ZONE 'Asia/Yekaterinburg') > o.promised_at)::int), 3) AS late_share
FROM orders o
JOIN couriers c ON c.id = o.courier_id
WHERE o.status = 'delivered' AND o.delivered_at IS NOT NULL
AND o.zone_id = (SELECT id FROM zones WHERE name = $zone)
AND o.created_at >= $period_from::date AND o.created_at < $period_to::date + 1
GROUP BY c.transport
ORDER BY late_share DESCурок из курса
Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.